@xopcai/xopc 0.0.99 → 0.0.101

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 (362) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/src/account-manager.d.ts +3 -3
  3. package/dist/extensions/telegram/src/account-manager.js +8 -8
  4. package/dist/extensions/telegram/src/account-manager.js.map +1 -1
  5. package/dist/extensions/telegram/src/actions/message-actions.d.ts +4 -0
  6. package/dist/extensions/telegram/src/actions/message-actions.js +71 -0
  7. package/dist/extensions/telegram/src/actions/message-actions.js.map +1 -0
  8. package/dist/extensions/telegram/src/adapters/config-adapter.js +9 -1
  9. package/dist/extensions/telegram/src/adapters/config-adapter.js.map +1 -1
  10. package/dist/extensions/telegram/src/adapters/config-surface.js +1 -1
  11. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  12. package/dist/extensions/telegram/src/adapters/outbound-adapter.d.ts +2 -1
  13. package/dist/extensions/telegram/src/adapters/outbound-adapter.js +18 -4
  14. package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +1 -1
  15. package/dist/extensions/telegram/src/adapters/security-adapter.js +2 -1
  16. package/dist/extensions/telegram/src/adapters/security-adapter.js.map +1 -1
  17. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +90 -6
  18. package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +1 -1
  19. package/dist/extensions/telegram/src/adapters/types.d.ts +9 -1
  20. package/dist/extensions/telegram/src/api-root.d.ts +4 -0
  21. package/dist/extensions/telegram/src/api-root.js +42 -0
  22. package/dist/extensions/telegram/src/api-root.js.map +1 -0
  23. package/dist/extensions/telegram/src/approval-delivery.d.ts +9 -0
  24. package/dist/extensions/telegram/src/approval-delivery.js +36 -0
  25. package/dist/extensions/telegram/src/approval-delivery.js.map +1 -0
  26. package/dist/extensions/telegram/src/approval-store.d.ts +25 -0
  27. package/dist/extensions/telegram/src/approval-store.js +61 -0
  28. package/dist/extensions/telegram/src/approval-store.js.map +1 -0
  29. package/dist/extensions/telegram/src/config-schema.d.ts +185 -35
  30. package/dist/extensions/telegram/src/config-schema.js +67 -45
  31. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  32. package/dist/extensions/telegram/src/conversation-id.d.ts +6 -0
  33. package/dist/extensions/telegram/src/conversation-id.js +18 -0
  34. package/dist/extensions/telegram/src/conversation-id.js.map +1 -0
  35. package/dist/extensions/telegram/src/doctor.d.ts +5 -0
  36. package/dist/extensions/telegram/src/doctor.js +80 -0
  37. package/dist/extensions/telegram/src/doctor.js.map +1 -0
  38. package/dist/extensions/telegram/src/exec-approval-handler.d.ts +7 -0
  39. package/dist/extensions/telegram/src/exec-approval-handler.js +36 -0
  40. package/dist/extensions/telegram/src/exec-approval-handler.js.map +1 -0
  41. package/dist/extensions/telegram/src/exec-approvals.d.ts +8 -0
  42. package/dist/extensions/telegram/src/exec-approvals.js +20 -0
  43. package/dist/extensions/telegram/src/exec-approvals.js.map +1 -0
  44. package/dist/extensions/telegram/src/focus-handler.d.ts +12 -0
  45. package/dist/extensions/telegram/src/focus-handler.js +55 -0
  46. package/dist/extensions/telegram/src/focus-handler.js.map +1 -0
  47. package/dist/extensions/telegram/src/group-config-resolver.d.ts +12 -0
  48. package/dist/extensions/telegram/src/group-config-resolver.js +17 -0
  49. package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -0
  50. package/dist/extensions/telegram/src/inbound-coalescer.d.ts +15 -0
  51. package/dist/extensions/telegram/src/inbound-coalescer.js +107 -0
  52. package/dist/extensions/telegram/src/inbound-coalescer.js.map +1 -0
  53. package/dist/extensions/telegram/src/inbound-processor.d.ts +1 -0
  54. package/dist/extensions/telegram/src/inbound-processor.js +41 -4
  55. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  56. package/dist/extensions/telegram/src/network-errors.d.ts +2 -0
  57. package/dist/extensions/telegram/src/network-errors.js +23 -0
  58. package/dist/extensions/telegram/src/network-errors.js.map +1 -0
  59. package/dist/extensions/telegram/src/plugin.d.ts +11 -0
  60. package/dist/extensions/telegram/src/plugin.js +191 -57
  61. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  62. package/dist/extensions/telegram/src/polling-session.d.ts +17 -0
  63. package/dist/extensions/telegram/src/polling-session.js +112 -0
  64. package/dist/extensions/telegram/src/polling-session.js.map +1 -0
  65. package/dist/extensions/telegram/src/proxy-fetch.d.ts +2 -0
  66. package/dist/extensions/telegram/src/proxy-fetch.js +14 -0
  67. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -0
  68. package/dist/extensions/telegram/src/reactions.d.ts +14 -0
  69. package/dist/extensions/telegram/src/reactions.js +48 -0
  70. package/dist/extensions/telegram/src/reactions.js.map +1 -0
  71. package/dist/extensions/telegram/src/reply-params.d.ts +15 -0
  72. package/dist/extensions/telegram/src/reply-params.js +28 -0
  73. package/dist/extensions/telegram/src/reply-params.js.map +1 -0
  74. package/dist/extensions/telegram/src/startup-errors.d.ts +3 -0
  75. package/dist/extensions/telegram/src/startup-errors.js +27 -0
  76. package/dist/extensions/telegram/src/startup-errors.js.map +1 -0
  77. package/dist/extensions/telegram/src/telegram-actions.d.ts +25 -0
  78. package/dist/extensions/telegram/src/telegram-actions.js +65 -0
  79. package/dist/extensions/telegram/src/telegram-actions.js.map +1 -0
  80. package/dist/extensions/telegram/src/thread-bindings.d.ts +15 -0
  81. package/dist/extensions/telegram/src/thread-bindings.js +22 -0
  82. package/dist/extensions/telegram/src/thread-bindings.js.map +1 -0
  83. package/dist/extensions/telegram/src/token-resolver.d.ts +8 -0
  84. package/dist/extensions/telegram/src/token-resolver.js +34 -0
  85. package/dist/extensions/telegram/src/token-resolver.js.map +1 -0
  86. package/dist/extensions/telegram/src/update-offset-store.d.ts +9 -0
  87. package/dist/extensions/telegram/src/update-offset-store.js +66 -0
  88. package/dist/extensions/telegram/src/update-offset-store.js.map +1 -0
  89. package/dist/extensions/telegram/xopc.extension.json +1 -1
  90. package/dist/extensions/weixin/src/api/api.js +5 -3
  91. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  92. package/dist/gateway/static/root/assets/{agents-4KTK-Ku7.js → agents-u8cmUfGQ.js} +2 -2
  93. package/dist/gateway/static/root/assets/{apps-page-DkgInY2w.js → apps-page-DF8m9cUE.js} +1 -1
  94. package/dist/gateway/static/root/assets/{attachment-preview-renderer-DBAxQXb-.js → attachment-preview-renderer-CybMSIoS.js} +2 -2
  95. package/dist/gateway/static/root/assets/{attachment-process-heavy-Csq3TrrP.js → attachment-process-heavy-RnGYy9bC.js} +2 -2
  96. package/dist/gateway/static/root/assets/channels-settings-BM3doRvi.js +1 -0
  97. package/dist/gateway/static/root/assets/channels-status-swr-ah4zWEIP.js +8 -0
  98. package/dist/gateway/static/root/assets/{cron-api-BRDli2Mm.js → cron-api-DgMuL_2b.js} +1 -1
  99. package/dist/gateway/static/root/assets/{cron-page-BzEr5Za8.js → cron-page-COfUPKfq.js} +1 -1
  100. package/dist/gateway/static/root/assets/{dist-BsHh1vX0.js → dist-Dzy3Q0ZH.js} +1 -1
  101. package/dist/gateway/static/root/assets/{docx-preview-Dxj1EkCO.js → docx-preview-CajIk2FR.js} +1 -1
  102. package/dist/gateway/static/root/assets/{extension-debug-page-TWt5q_ef.js → extension-debug-page-kyxxefKh.js} +1 -1
  103. package/dist/gateway/static/root/assets/{extension-page-C3kV8ZvZ.js → extension-page-BVbCBHoI.js} +1 -1
  104. package/dist/gateway/static/root/assets/{extension-settings-page-Csy9LNC6.js → extension-settings-page-t1lb2A7v.js} +1 -1
  105. package/dist/gateway/static/root/assets/{fetch-BLLOP2CM.js → fetch-drJUxxKP.js} +1 -1
  106. package/dist/gateway/static/root/assets/{field-primitives-MXbM8HvY.js → field-primitives-6Vo1Yga4.js} +1 -1
  107. package/dist/gateway/static/root/assets/{heartbeat-config-api-CkoyqfRx.js → heartbeat-config-api-BF3psu4O.js} +1 -1
  108. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
  109. package/dist/gateway/static/root/assets/index-WAyKAilR.js +4840 -0
  110. package/dist/gateway/static/root/assets/{logs-page-B2vY41ph.js → logs-page-BTVPXcHV.js} +1 -1
  111. package/dist/gateway/static/root/assets/{note-detail-page-B7qE5pkO.js → note-detail-page-DqSAg_5Z.js} +1 -1
  112. package/dist/gateway/static/root/assets/{note-time-NBBReVR4.js → note-time-FSOjchic.js} +1 -1
  113. package/dist/gateway/static/root/assets/{notes-page-CsWYaqYM.js → notes-page-DkRX7BE2.js} +1 -1
  114. package/dist/gateway/static/root/assets/{sessions-page-BPGY3SCT.js → sessions-page-Khdw35Zk.js} +1 -1
  115. package/dist/gateway/static/root/assets/{settings-advanced-gate-DtA451RM.js → settings-advanced-gate-DspC8oEm.js} +2 -2
  116. package/dist/gateway/static/root/assets/{settings-form-section-DYR_SPlX.js → settings-form-section-DuxvUuur.js} +1 -1
  117. package/dist/gateway/static/root/assets/{settings-page-BJUgZQzN.js → settings-page-DN8JBZ8F.js} +2 -2
  118. package/dist/gateway/static/root/assets/{share-preview-page-3u8VFmdo.js → share-preview-page-UNAcbiMb.js} +2 -2
  119. package/dist/gateway/static/root/assets/{skills-page-DuyhcH4U.js → skills-page-ByYT0fXZ.js} +1 -1
  120. package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-B6KXPHgK.js} +1 -1
  121. package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
  122. package/dist/gateway/static/root/assets/{utils-B4Vw3fnc.js → utils-DK_1H47k.js} +1 -1
  123. package/dist/gateway/static/root/assets/{voice-api-key-field-BFY67Hhp.js → voice-api-key-field-BYN2EIMs.js} +1 -1
  124. package/dist/gateway/static/root/assets/{workflow-page.utils-yUJ5jexd.js → workflow-page.utils-Bi19YNTr.js} +1 -1
  125. package/dist/gateway/static/root/assets/{workflows-page-DIMHCpNt.js → workflows-page-DP57FEKW.js} +1 -1
  126. package/dist/gateway/static/root/index.html +5 -5
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +4 -0
  129. package/dist/src/agent/agent-manager.js +84 -4
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  132. package/dist/src/agent/child-agent-factory.js +13 -10
  133. package/dist/src/agent/child-agent-factory.js.map +1 -1
  134. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  135. package/dist/src/agent/embedded/run-for-session.js +2 -0
  136. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  137. package/dist/src/agent/embedded/run-turn.js +1 -17
  138. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  139. package/dist/src/agent/embedded/session-runner.js +3 -1
  140. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  141. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +1 -0
  142. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -0
  143. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  144. package/dist/src/agent/inbound/attachment-pipeline.d.ts +37 -0
  145. package/dist/src/agent/inbound/attachment-pipeline.js +169 -0
  146. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -0
  147. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -5
  148. package/dist/src/agent/inbound/turn-dispatcher.js +1 -2
  149. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  150. package/dist/src/agent/memory/index.d.ts +2 -0
  151. package/dist/src/agent/memory/index.js +2 -1
  152. package/dist/src/agent/memory/memory-flush.d.ts +27 -0
  153. package/dist/src/agent/memory/memory-flush.js +124 -0
  154. package/dist/src/agent/memory/memory-flush.js.map +1 -0
  155. package/dist/src/agent/messaging/outbound-coordinator.js +2 -1
  156. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -1
  157. package/dist/src/agent/messaging/stream-manager.d.ts +2 -0
  158. package/dist/src/agent/messaging/stream-manager.js +3 -0
  159. package/dist/src/agent/messaging/stream-manager.js.map +1 -1
  160. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  161. package/dist/src/agent/orchestration/agent-orchestrator.js +40 -107
  162. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  163. package/dist/src/agent/prompt/contribution.d.ts +9 -0
  164. package/dist/src/agent/prompt/contribution.js +1 -0
  165. package/dist/src/agent/prompt/safety.js +0 -10
  166. package/dist/src/agent/prompt/safety.js.map +1 -1
  167. package/dist/src/agent/prompt/sanitize-for-prompt.d.ts +6 -0
  168. package/dist/src/agent/prompt/sanitize-for-prompt.js +13 -0
  169. package/dist/src/agent/prompt/sanitize-for-prompt.js.map +1 -0
  170. package/dist/src/agent/prompt/sections/behavior.d.ts +5 -0
  171. package/dist/src/agent/prompt/sections/behavior.js +50 -0
  172. package/dist/src/agent/prompt/sections/behavior.js.map +1 -0
  173. package/dist/src/agent/prompt/sections/memory-skills.d.ts +9 -0
  174. package/dist/src/agent/prompt/sections/memory-skills.js +59 -0
  175. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -0
  176. package/dist/src/agent/prompt/sections/messaging-runtime.d.ts +16 -0
  177. package/dist/src/agent/prompt/sections/messaging-runtime.js +69 -0
  178. package/dist/src/agent/prompt/sections/messaging-runtime.js.map +1 -0
  179. package/dist/src/agent/prompt/sections/project-context.d.ts +16 -0
  180. package/dist/src/agent/prompt/sections/project-context.js +58 -0
  181. package/dist/src/agent/prompt/sections/project-context.js.map +1 -0
  182. package/dist/src/agent/prompt/sections/tooling.d.ts +5 -0
  183. package/dist/src/agent/prompt/sections/tooling.js +119 -0
  184. package/dist/src/agent/prompt/sections/tooling.js.map +1 -0
  185. package/dist/src/agent/prompt/sections/workspace-runtime.d.ts +11 -0
  186. package/dist/src/agent/prompt/sections/workspace-runtime.js +32 -0
  187. package/dist/src/agent/prompt/sections/workspace-runtime.js.map +1 -0
  188. package/dist/src/agent/prompt/service-prompt-builder.d.ts +13 -0
  189. package/dist/src/agent/prompt/service-prompt-builder.js +54 -13
  190. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  191. package/dist/src/agent/prompt/subagent-context.d.ts +15 -0
  192. package/dist/src/agent/prompt/subagent-context.js +68 -0
  193. package/dist/src/agent/prompt/subagent-context.js.map +1 -0
  194. package/dist/src/agent/prompt/system-prompt-params.d.ts +53 -0
  195. package/dist/src/agent/prompt/system-prompt-params.js +74 -0
  196. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -0
  197. package/dist/src/agent/prompt/system-prompt.d.ts +22 -11
  198. package/dist/src/agent/prompt/system-prompt.js +79 -193
  199. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  200. package/dist/src/agent/prompt/types.d.ts +3 -0
  201. package/dist/src/agent/service/build-direct-message-content.d.ts +5 -21
  202. package/dist/src/agent/service/build-direct-message-content.js +11 -64
  203. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  204. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
  205. package/dist/src/agent/service/direct-turn-helpers.js +7 -0
  206. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  207. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  208. package/dist/src/agent/service/process-direct-one-shot.js +22 -17
  209. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  210. package/dist/src/agent/service/process-direct-streaming.d.ts +6 -20
  211. package/dist/src/agent/service/process-direct-streaming.js +39 -40
  212. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  213. package/dist/src/agent/service/webchat-tts.d.ts +4 -9
  214. package/dist/src/agent/service/webchat-tts.js +9 -20
  215. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  216. package/dist/src/agent/service.d.ts +8 -19
  217. package/dist/src/agent/service.js +53 -11
  218. package/dist/src/agent/service.js.map +1 -1
  219. package/dist/src/agent/tools/factory.js +2 -0
  220. package/dist/src/agent/tools/factory.js.map +1 -1
  221. package/dist/src/agent/tools/index.d.ts +1 -0
  222. package/dist/src/agent/tools/index.js +2 -1
  223. package/dist/src/agent/tools/media-read-tool.d.ts +2 -0
  224. package/dist/src/agent/tools/media-read-tool.js +89 -0
  225. package/dist/src/agent/tools/media-read-tool.js.map +1 -0
  226. package/dist/src/auth/credentials.js +0 -1
  227. package/dist/src/auth/credentials.js.map +1 -1
  228. package/dist/src/channels/attachments/attachment-classifiers.d.ts +8 -0
  229. package/dist/src/channels/attachments/attachment-classifiers.js +11 -0
  230. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -0
  231. package/dist/src/channels/attachments/inbound-persist.d.ts +13 -34
  232. package/dist/src/channels/attachments/inbound-persist.js +34 -102
  233. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  234. package/dist/src/channels/attachments/inbound-types.d.ts +13 -0
  235. package/dist/src/channels/attachments/inbound-types.js +30 -0
  236. package/dist/src/channels/attachments/inbound-types.js.map +1 -0
  237. package/dist/src/channels/attachments/outbound-tts-persist.d.ts +3 -12
  238. package/dist/src/channels/attachments/outbound-tts-persist.js +28 -48
  239. package/dist/src/channels/attachments/outbound-tts-persist.js.map +1 -1
  240. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -3
  241. package/dist/src/channels/attachments/voice-stt-webchat.js +8 -14
  242. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  243. package/dist/src/channels/channel-domain.d.ts +30 -2
  244. package/dist/src/channels/exec-approval-runtime.d.ts +29 -0
  245. package/dist/src/channels/exec-approval-runtime.js +30 -0
  246. package/dist/src/channels/exec-approval-runtime.js.map +1 -0
  247. package/dist/src/channels/index.js +1 -1
  248. package/dist/src/channels/plugin-types.d.ts +1 -0
  249. package/dist/src/channels/transport-types.d.ts +2 -2
  250. package/dist/src/cli/bin.d.ts +1 -0
  251. package/dist/src/cli/bin.js +1 -0
  252. package/dist/src/cli/bin.js.map +1 -1
  253. package/dist/src/cli/commands/channels.js +1 -1
  254. package/dist/src/cli/commands/doctor/checks/database-schema.d.ts +2 -0
  255. package/dist/src/cli/commands/doctor/checks/database-schema.js +62 -0
  256. package/dist/src/cli/commands/doctor/checks/database-schema.js.map +1 -0
  257. package/dist/src/cli/commands/doctor/flow.js +2 -0
  258. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  259. package/dist/src/cli/commands/init.js +2 -57
  260. package/dist/src/cli/commands/init.js.map +1 -1
  261. package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
  262. package/dist/src/cli/commands/setup.js +6 -5
  263. package/dist/src/cli/commands/setup.js.map +1 -1
  264. package/dist/src/cli/utils/init-workspace-core.js +1 -2
  265. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  266. package/dist/src/config/index.js +2 -2
  267. package/dist/src/config/paths.d.ts +0 -13
  268. package/dist/src/config/paths.js +1 -20
  269. package/dist/src/config/paths.js.map +1 -1
  270. package/dist/src/config/rules.js +1 -1
  271. package/dist/src/config/schema.d.ts +24 -0
  272. package/dist/src/config/schema.js +33 -2
  273. package/dist/src/config/schema.js.map +1 -1
  274. package/dist/src/cron/executor.js +2 -2
  275. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  276. package/dist/src/gateway/hono/oauth-async.js +36 -3
  277. package/dist/src/gateway/hono/oauth-async.js.map +1 -1
  278. package/dist/src/gateway/hono/routes/config-patch/channels.js +3 -3
  279. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  280. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  281. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  282. package/dist/src/gateway/hono/routes/media.d.ts +3 -0
  283. package/dist/src/gateway/hono/routes/media.js +50 -0
  284. package/dist/src/gateway/hono/routes/media.js.map +1 -0
  285. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  286. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  287. package/dist/src/gateway/hono/routes/workspace.js +1 -87
  288. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  289. package/dist/src/gateway/service/sessions-api.js +3 -0
  290. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  291. package/dist/src/infra/http-proxy-env.d.ts +4 -0
  292. package/dist/src/infra/http-proxy-env.js +23 -0
  293. package/dist/src/infra/http-proxy-env.js.map +1 -0
  294. package/dist/src/media/index.d.ts +5 -0
  295. package/dist/src/media/index.js +5 -0
  296. package/dist/src/media/media-reference.d.ts +23 -0
  297. package/dist/src/media/media-reference.js +34 -0
  298. package/dist/src/media/media-reference.js.map +1 -0
  299. package/dist/src/media/paths.d.ts +5 -0
  300. package/dist/src/media/paths.js +20 -0
  301. package/dist/src/media/paths.js.map +1 -0
  302. package/dist/src/media/session-references.d.ts +8 -0
  303. package/dist/src/media/session-references.js +45 -0
  304. package/dist/src/media/session-references.js.map +1 -0
  305. package/dist/src/media/store.d.ts +19 -0
  306. package/dist/src/media/store.js +131 -0
  307. package/dist/src/media/store.js.map +1 -0
  308. package/dist/src/media/types.d.ts +34 -0
  309. package/dist/src/media/types.js +1 -0
  310. package/dist/src/media/uri.d.ts +15 -0
  311. package/dist/src/media/uri.js +51 -0
  312. package/dist/src/media/uri.js.map +1 -0
  313. package/dist/src/session/session-title.js +6 -3
  314. package/dist/src/session/session-title.js.map +1 -1
  315. package/dist/src/session/store.js +1 -1
  316. package/dist/src/session/store.js.map +1 -1
  317. package/dist/src/session/types.d.ts +12 -7
  318. package/dist/src/session/types.js.map +1 -1
  319. package/dist/src/storage/sqlite/index.d.ts +4 -1
  320. package/dist/src/storage/sqlite/index.js +6 -2
  321. package/dist/src/storage/sqlite/migrations/002_add_flush_columns.sql +3 -0
  322. package/dist/src/storage/sqlite/migrations/discover.d.ts +4 -0
  323. package/dist/src/storage/sqlite/migrations/discover.js +38 -0
  324. package/dist/src/storage/sqlite/migrations/discover.js.map +1 -0
  325. package/dist/src/storage/sqlite/migrations/discover.ts +52 -0
  326. package/dist/src/storage/sqlite/migrations/errors.d.ts +11 -0
  327. package/dist/src/storage/sqlite/migrations/errors.js +27 -0
  328. package/dist/src/storage/sqlite/migrations/errors.js.map +1 -0
  329. package/dist/src/storage/sqlite/migrations/errors.ts +32 -0
  330. package/dist/src/storage/sqlite/migrations/runner.d.ts +22 -0
  331. package/dist/src/storage/sqlite/migrations/runner.js +97 -0
  332. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -0
  333. package/dist/src/storage/sqlite/migrations/runner.ts +153 -0
  334. package/dist/src/storage/sqlite/migrations/types.d.ts +12 -0
  335. package/dist/src/storage/sqlite/migrations/types.js +1 -0
  336. package/dist/src/storage/sqlite/migrations/types.ts +13 -0
  337. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -0
  338. package/dist/src/storage/sqlite/row-mappers.js +4 -0
  339. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  340. package/dist/src/storage/sqlite/schema-version.d.ts +6 -0
  341. package/dist/src/storage/sqlite/schema-version.js +29 -0
  342. package/dist/src/storage/sqlite/schema-version.js.map +1 -0
  343. package/dist/src/storage/sqlite/schema.d.ts +5 -3
  344. package/dist/src/storage/sqlite/schema.js +24 -28
  345. package/dist/src/storage/sqlite/schema.js.map +1 -1
  346. package/dist/src/storage/sqlite/schema.sql +2 -0
  347. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  348. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  349. package/dist/src/storage/sqlite/session-repository.js +7 -3
  350. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  351. package/package.json +3 -3
  352. package/dist/gateway/static/root/assets/channels-settings-BxW1Xio4.js +0 -1
  353. package/dist/gateway/static/root/assets/channels-status-swr-Cxm6AvQO.js +0 -8
  354. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
  355. package/dist/gateway/static/root/assets/index-Cbg5TS5m.js +0 -4707
  356. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +0 -3
  357. package/dist/src/cli/commands/onboard/workspace.d.ts +0 -14
  358. package/dist/src/cli/commands/onboard/workspace.js +0 -33
  359. package/dist/src/cli/commands/onboard/workspace.js.map +0 -1
  360. package/dist/src/cli/utils/workspace.d.ts +0 -35
  361. package/dist/src/cli/utils/workspace.js +0 -72
  362. package/dist/src/cli/utils/workspace.js.map +0 -1
@@ -3,6 +3,7 @@ import { createLogger } from "../../../src/utils/logger/index.js";
3
3
  import { init_logger } from "../../../src/utils/logger.js";
4
4
  import { getWorkflowProgressBroker } from "../../../src/agent/workflow/progress-broker.js";
5
5
  import "../../../src/agent/workflow/index.js";
6
+ import { registerChannelExecApprovalHandler } from "../../../src/channels/exec-approval-runtime.js";
6
7
  import { transcribe } from "../../../src/voice/stt/transcribe-core.js";
7
8
  import { isSTTAvailable } from "../../../src/voice/stt/availability.js";
8
9
  import "../../../src/voice/stt/index.js";
@@ -19,9 +20,11 @@ import { TelegramAccountManager } from "./account-manager.js";
19
20
  import { createOutboundSender } from "./outbound-sender.js";
20
21
  import { createTelegramWorkflowProgressCapability } from "./workflow-progress.js";
21
22
  import { createTelegramCommandHandler } from "./command-handler.js";
23
+ import { handleTelegramFocusCommand } from "./focus-handler.js";
22
24
  import { createInboundProcessor } from "./inbound-processor.js";
23
25
  import { TELEGRAM_CHANNEL_DEFAULTS } from "./plugin-defaults.js";
24
26
  import { createTelegramSetupWizard } from "./adapters/setup-wizard.js";
27
+ import { telegramReplyTracker } from "./reply-params.js";
25
28
  import { TELEGRAM_OUTBOUND_DEFAULTS, createTelegramOutboundSendMethods, telegramTextChunker } from "./adapters/outbound-adapter.js";
26
29
  import { createTelegramInboundAccessControl } from "./adapters/inbound-access.js";
27
30
  import { telegramDebouncerKeyPolicy } from "./adapters/debounce-keys.js";
@@ -33,9 +36,20 @@ import "./channel.js";
33
36
  import { normalizeTelegramDeliveryChatId } from "./delivery-chat-id.js";
34
37
  import { telegramConfigSurface } from "./adapters/config-surface.js";
35
38
  import { telegramOnboardAdapter } from "./adapters/onboard-cli.js";
39
+ import { normalizeTelegramApiRoot } from "./api-root.js";
40
+ import { resolveTelegramBotToken } from "./token-resolver.js";
41
+ import { formatTelegramStartupError, isTelegramUnauthorizedTokenError } from "./startup-errors.js";
42
+ import { startTelegramPollingSession } from "./polling-session.js";
43
+ import { createProxyFetch } from "./proxy-fetch.js";
44
+ import { runTelegramDoctorChecks } from "./doctor.js";
45
+ import { createTelegramInboundCoalescer } from "./inbound-coalescer.js";
46
+ import { handleTelegramMessageReaction, sendTelegramAckReaction } from "./reactions.js";
47
+ import { bindTelegramMessageActionAccountManager, handleTelegramChannelAction } from "./actions/message-actions.js";
48
+ import { resolveTelegramApproval } from "./approval-store.js";
49
+ import { isTelegramExecApprovalApprover } from "./exec-approvals.js";
50
+ import { createTelegramExecApprovalHandler } from "./exec-approval-handler.js";
36
51
  import { isDeepStrictEqual } from "node:util";
37
52
  import { Bot } from "grammy";
38
- import { run } from "@grammyjs/runner";
39
53
  //#region extensions/telegram/src/plugin.ts
40
54
  /**
41
55
  * Telegram Channel Plugin - Implementation based on ChannelPlugin interface
@@ -49,11 +63,6 @@ init_config_schema();
49
63
  const TELEGRAM_GETME_TIMEOUT_MS = 2e4;
50
64
  /** grammY per-request ceiling; must exceed long-poll `getUpdates` (~30s) but avoid multi-minute hangs on bad hosts. */
51
65
  const TELEGRAM_CLIENT_TIMEOUT_SECONDS = 75;
52
- function trimOptionalRootUrl(value) {
53
- const t = value?.trim();
54
- if (!t) return void 0;
55
- return t.replace(/\/$/, "");
56
- }
57
66
  const log = createLogger("TelegramPlugin");
58
67
  const TELEGRAM_REGISTRY_META = getChatChannelMeta("telegram");
59
68
  var TelegramChannelPlugin = class {
@@ -89,6 +98,7 @@ var TelegramChannelPlugin = class {
89
98
  } };
90
99
  configSurface = telegramConfigSurface;
91
100
  onboard = telegramOnboardAdapter;
101
+ doctor = { check: (params) => runTelegramDoctorChecks(params) };
92
102
  pairing = createStandardPairingAdapter("telegram");
93
103
  bus;
94
104
  cfg;
@@ -100,6 +110,9 @@ var TelegramChannelPlugin = class {
100
110
  sessionModelHooks;
101
111
  /** Unregister fn for the workflow-progress capability registered against the global broker. */
102
112
  workflowProgressUnregister = null;
113
+ inboundCoalescer = createTelegramInboundCoalescer();
114
+ execApprovalUnregister = null;
115
+ actions = { handleAction: handleTelegramChannelAction };
103
116
  config;
104
117
  security;
105
118
  status;
@@ -114,6 +127,12 @@ var TelegramChannelPlugin = class {
114
127
  this.accountManager = new TelegramAccountManager();
115
128
  this.loadAccounts();
116
129
  this.bindOutboundComponents();
130
+ bindTelegramMessageActionAccountManager(this.accountManager);
131
+ this.execApprovalUnregister?.();
132
+ this.execApprovalUnregister = registerChannelExecApprovalHandler("telegram", createTelegramExecApprovalHandler({
133
+ accountManager: this.accountManager,
134
+ getConfig: () => this.cfg
135
+ }));
117
136
  this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(createTelegramWorkflowProgressCapability(this.accountManager));
118
137
  const debounceMs = this.defaults.queue?.debounceMs ?? TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs;
119
138
  const keyPolicy = telegramDebouncerKeyPolicy();
@@ -174,7 +193,7 @@ var TelegramChannelPlugin = class {
174
193
  },
175
194
  mediaUtils: { getMimeType }
176
195
  });
177
- const sends = createTelegramOutboundSendMethods((opts) => this.outboundSender.send(opts));
196
+ const sends = createTelegramOutboundSendMethods((opts) => this.outboundSender.send(opts), this.accountManager);
178
197
  this.outbound = {
179
198
  deliveryMode: "direct",
180
199
  chunker: telegramTextChunker,
@@ -226,18 +245,39 @@ var TelegramChannelPlugin = class {
226
245
  if (telegramCfg.enabled !== true) return;
227
246
  const accounts = telegramCfg.accounts;
228
247
  if (!accounts || Object.keys(accounts).length === 0) return;
229
- const channelApiRoot = trimOptionalRootUrl(typeof telegramCfg.apiRoot === "string" ? telegramCfg.apiRoot : void 0);
248
+ const channelApiRoot = typeof telegramCfg.apiRoot === "string" ? normalizeTelegramApiRoot(telegramCfg.apiRoot) : void 0;
230
249
  const channelProxy = typeof telegramCfg.proxy === "string" && telegramCfg.proxy.trim() ? telegramCfg.proxy.trim() : void 0;
250
+ const channelReplyToMode = telegramCfg.replyToMode;
251
+ const channelStreaming = telegramCfg.streaming;
252
+ const tokenOwners = /* @__PURE__ */ new Map();
231
253
  for (const [id, account] of Object.entries(accounts)) {
232
- const accApiRoot = trimOptionalRootUrl(typeof account.apiRoot === "string" ? account.apiRoot : void 0);
254
+ const { token, source } = resolveTelegramBotToken({
255
+ botToken: typeof account.botToken === "string" ? account.botToken : void 0,
256
+ tokenFile: typeof account.tokenFile === "string" ? account.tokenFile : void 0
257
+ });
258
+ if (token) {
259
+ const owners = tokenOwners.get(token) ?? [];
260
+ owners.push(id);
261
+ tokenOwners.set(token, owners);
262
+ }
263
+ const accApiRoot = typeof account.apiRoot === "string" ? normalizeTelegramApiRoot(account.apiRoot) : void 0;
233
264
  const accProxy = typeof account.proxy === "string" && account.proxy.trim() ? account.proxy.trim() : void 0;
234
265
  this.accountManager.registerAccount({
235
266
  ...account,
236
267
  accountId: id,
268
+ botToken: token,
269
+ tokenFile: typeof account.tokenFile === "string" ? account.tokenFile : void 0,
270
+ tokenSource: source,
237
271
  ...accApiRoot || channelApiRoot ? { apiRoot: accApiRoot || channelApiRoot } : {},
238
- ...accProxy || channelProxy ? { proxy: accProxy || channelProxy } : {}
272
+ ...accProxy || channelProxy ? { proxy: accProxy || channelProxy } : {},
273
+ replyToMode: account.replyToMode ?? channelReplyToMode,
274
+ streaming: account.streaming ?? channelStreaming
239
275
  });
240
276
  }
277
+ for (const [token, owners] of tokenOwners) if (owners.length > 1) log.error({
278
+ accountIds: owners,
279
+ tokenPreview: `${token.slice(0, 8)}…`
280
+ }, `Duplicate Telegram bot token across accounts: ${owners.join(", ")}`);
241
281
  }
242
282
  channelIsRunning(cfg) {
243
283
  return this.accountManager.getAllAccounts().some((a) => a.enabled !== false && !!a.botToken && this.accountManager.isRunning(a.accountId));
@@ -262,18 +302,45 @@ var TelegramChannelPlugin = class {
262
302
  if (!accountId) {
263
303
  this.workflowProgressUnregister?.();
264
304
  this.workflowProgressUnregister = null;
305
+ this.execApprovalUnregister?.();
306
+ this.execApprovalUnregister = null;
265
307
  }
266
308
  }
267
309
  async startAccount(account) {
268
310
  if (this.accountManager.isRunning(account.accountId)) return;
269
- if (!account.botToken) return;
311
+ const resolved = resolveTelegramBotToken({
312
+ botToken: account.botToken,
313
+ tokenFile: account.tokenFile
314
+ });
315
+ if (!resolved.token) return;
316
+ const duplicateAccounts = this.accountManager.getAllAccounts().filter((a) => {
317
+ return resolveTelegramBotToken({
318
+ botToken: a.botToken,
319
+ tokenFile: a.tokenFile
320
+ }).token === resolved.token && a.accountId !== account.accountId;
321
+ }).map((a) => a.accountId);
322
+ if (duplicateAccounts.length > 0) {
323
+ const em = `Duplicate bot token shared with account(s): ${duplicateAccounts.join(", ")}`;
324
+ log.error({
325
+ accountId: account.accountId,
326
+ duplicateAccounts
327
+ }, em);
328
+ this.accountManager.updateStatus({
329
+ accountId: account.accountId,
330
+ running: false,
331
+ mode: "stopped",
332
+ lastError: em
333
+ });
334
+ return;
335
+ }
270
336
  this.accountManager.markStarting(account.accountId);
271
337
  try {
272
338
  const client = {
273
339
  timeoutSeconds: TELEGRAM_CLIENT_TIMEOUT_SECONDS,
274
- ...account.apiRoot ? { apiRoot: account.apiRoot } : {}
340
+ ...account.apiRoot ? { apiRoot: account.apiRoot } : {},
341
+ ...account.proxy ? { fetch: createProxyFetch(account.proxy) } : {}
275
342
  };
276
- const bot = new Bot(account.botToken, { client });
343
+ const bot = new Bot(resolved.token, { client });
277
344
  const getMeSignal = createTimeoutAbortSignal(TELEGRAM_GETME_TIMEOUT_MS);
278
345
  let me;
279
346
  try {
@@ -281,33 +348,36 @@ var TelegramChannelPlugin = class {
281
348
  } finally {
282
349
  getMeSignal.dispose();
283
350
  }
284
- const runner = run(bot, { runner: {
285
- fetch: { timeout: 30 },
286
- silent: true,
287
- maxRetryTime: Number.POSITIVE_INFINITY,
288
- retryInterval: "exponential"
289
- } });
290
351
  this.accountManager.registerBot(account.accountId, bot);
291
- this.accountManager.registerRunner(account.accountId, runner);
292
- this.attachRunnerExitHandler(account.accountId, runner);
293
352
  this.accountManager.setBotUsername(account.accountId, me.username);
353
+ this.setupMessageHandler(account.accountId, bot);
354
+ const session = startTelegramPollingSession({
355
+ accountId: account.accountId,
356
+ botToken: resolved.token,
357
+ bot,
358
+ stallThresholdMs: account.pollingStallThresholdMs,
359
+ onExit: () => {
360
+ this.accountManager.stopRunner(account.accountId);
361
+ }
362
+ });
363
+ this.accountManager.registerPollingSession(account.accountId, session);
294
364
  this.accountManager.updateStatus({
295
365
  accountId: account.accountId,
296
366
  running: true,
297
367
  mode: "polling"
298
368
  });
299
- this.setupMessageHandler(account.accountId, bot);
300
369
  log.info({
301
370
  accountId: account.accountId,
302
371
  username: me.username
303
372
  }, "Telegram account started");
304
373
  } catch (err) {
305
- const em = err instanceof Error ? err.message : String(err);
306
- log.warn({
374
+ const em = formatTelegramStartupError(err);
375
+ log[isTelegramUnauthorizedTokenError(err) ? "error" : "warn"]({
307
376
  accountId: account.accountId,
308
377
  apiRootConfigured: !!account.apiRoot,
378
+ unauthorized: isTelegramUnauthorizedTokenError(err),
309
379
  errorMessage: em
310
- }, `Telegram account not started (check token, network, or apiRoot): ${em}`);
380
+ }, `Telegram account not started: ${em}`);
311
381
  this.accountManager.updateStatus({
312
382
  accountId: account.accountId,
313
383
  running: false,
@@ -318,48 +388,85 @@ var TelegramChannelPlugin = class {
318
388
  this.accountManager.markStartComplete(account.accountId);
319
389
  }
320
390
  }
321
- attachRunnerExitHandler(accountId, runner) {
322
- const task = runner.task();
323
- if (!task) return;
324
- task.catch((err) => {
325
- log.error({
326
- err,
327
- accountId
328
- }, "Telegram polling runner exited");
329
- this.accountManager.stopRunner(accountId).catch((e) => {
330
- log.error({
331
- err: e,
332
- accountId
333
- }, "Telegram runner cleanup failed");
334
- });
335
- });
336
- }
391
+ attachRunnerExitHandler(_accountId, _runner) {}
337
392
  setupMessageHandler(accountId, bot) {
393
+ const account = this.config.resolveAccount(this.cfg, accountId);
394
+ const handleInboundMessage = async (ctx) => {
395
+ const command = (ctx.message?.text ?? ctx.message?.caption ?? ctx.channelPost?.text ?? ctx.channelPost?.caption ?? "").trim().split(" ")[0].split("@")[0].toLowerCase();
396
+ if (command === "/models") {
397
+ await this.commandHandler.handleModels(ctx);
398
+ return;
399
+ }
400
+ if (command === "/start") {
401
+ await this.commandHandler.handleStart(ctx);
402
+ return;
403
+ }
404
+ if (command === "/cleanup") {
405
+ await this.commandHandler.handleCleanup(ctx);
406
+ return;
407
+ }
408
+ if (command === "/focus") {
409
+ await handleTelegramFocusCommand({
410
+ ctx,
411
+ accountId,
412
+ config: this.cfg
413
+ });
414
+ return;
415
+ }
416
+ const message = ctx.message ?? ctx.channelPost;
417
+ if (!message) return;
418
+ await this.inboundCoalescer.enqueue({
419
+ ctx,
420
+ accountId,
421
+ message,
422
+ onReady: async (batch) => {
423
+ for (const msg of batch.messages) {
424
+ const batchCtx = batch.ctx;
425
+ await this.debouncer.enqueue({
426
+ ctx: {
427
+ ...batchCtx,
428
+ message: msg
429
+ },
430
+ accountId: batch.accountId,
431
+ message: msg
432
+ });
433
+ }
434
+ }
435
+ });
436
+ };
338
437
  bot.on("message", async (ctx) => {
339
438
  try {
340
- const command = (ctx.message.text ?? ctx.message.caption ?? "").trim().split(" ")[0].split("@")[0].toLowerCase();
341
- if (command === "/models") {
342
- await this.commandHandler.handleModels(ctx);
343
- return;
344
- }
345
- if (command === "/start") {
346
- await this.commandHandler.handleStart(ctx);
347
- return;
348
- }
349
- if (command === "/cleanup") {
350
- await this.commandHandler.handleCleanup(ctx);
351
- return;
352
- }
353
- await this.debouncer.enqueue({
439
+ await handleInboundMessage(ctx);
440
+ } catch (err) {
441
+ log.error({
442
+ accountId,
443
+ err
444
+ }, "Message handler error");
445
+ }
446
+ });
447
+ bot.on("channel_post", async (ctx) => {
448
+ try {
449
+ await handleInboundMessage(ctx);
450
+ } catch (err) {
451
+ log.error({
452
+ accountId,
453
+ err
454
+ }, "Channel post handler error");
455
+ }
456
+ });
457
+ bot.on("message_reaction", async (ctx) => {
458
+ try {
459
+ await handleTelegramMessageReaction({
354
460
  ctx,
355
461
  accountId,
356
- message: ctx.message
462
+ bus: this.bus,
463
+ mode: account.reactionNotifications
357
464
  });
358
465
  } catch (err) {
359
466
  log.error({
360
467
  accountId,
361
468
  err
362
- }, "Message handler error");
469
+ }, "Message reaction handler error");
363
470
  }
364
471
  });
365
472
  bot.on("callback_query:data", async (ctx) => {
@@ -413,6 +520,22 @@ var TelegramChannelPlugin = class {
413
520
  await ctx.answerCallbackQuery("No pending question");
414
521
  return;
415
522
  }
523
+ if (data.startsWith("approval:approve:") || data.startsWith("approval:deny:")) {
524
+ const approved = data.startsWith("approval:approve:");
525
+ const approvalId = data.slice(approved ? 17 : 14);
526
+ const senderId = String(ctx.from?.id ?? "");
527
+ if (!isTelegramExecApprovalApprover({
528
+ cfg: this.cfg,
529
+ accountId: _accountId,
530
+ senderId
531
+ })) {
532
+ await ctx.answerCallbackQuery("Not authorized");
533
+ return;
534
+ }
535
+ if (resolveTelegramApproval(approvalId, approved)) await ctx.answerCallbackQuery(approved ? "Approved" : "Denied");
536
+ else await ctx.answerCallbackQuery("Approval expired or already resolved");
537
+ return;
538
+ }
416
539
  await ctx.answerCallbackQuery("Unknown action");
417
540
  }
418
541
  async processMessages(items) {
@@ -431,6 +554,7 @@ var TelegramChannelPlugin = class {
431
554
  const senderId = ctx.from?.id?.toString() ?? "";
432
555
  const senderUsername = ctx.from?.username;
433
556
  const chatId = ctx.chat?.id?.toString() ?? "";
557
+ telegramReplyTracker.reset(accountId, chatId);
434
558
  const securityCtx = {
435
559
  accountId,
436
560
  chatId,
@@ -480,6 +604,16 @@ var TelegramChannelPlugin = class {
480
604
  }, "Telegram: message dropped by channel security (check dmPolicy/groupPolicy and allowFrom)");
481
605
  return;
482
606
  }
607
+ const bot = this.accountManager.getBot(accountId);
608
+ const messageId = ctx.message?.message_id;
609
+ const reactionLevel = account.reactionLevel ?? "ack";
610
+ const ackEmoji = account.ackReaction ?? "👀";
611
+ if (bot && messageId && reactionLevel !== "off" && ctx.chat?.id != null && !ctx.channelPost) sendTelegramAckReaction({
612
+ bot,
613
+ chatId: ctx.chat.id,
614
+ messageId,
615
+ emoji: ackEmoji
616
+ });
483
617
  await this.inboundProcessor(ctx, accountId);
484
618
  }
485
619
  };
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":["sttTranscribe"],"sources":["../../../../extensions/telegram/src/plugin.ts"],"sourcesContent":["/**\n * Telegram Channel Plugin - Implementation based on ChannelPlugin interface\n *\n * This plugin integrates Telegram with the ChannelPlugin architecture.\n * It reuses components from this package's src tree where possible.\n */\n\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { Bot, type Context } from 'grammy';\nimport { run } from '@grammyjs/runner';\n\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport type {\n ChannelPlugin,\n ChannelPluginDefaults,\n ChannelPluginInitOptions,\n ChannelPluginReloadMeta,\n ChannelPluginSessionModelHooks,\n ChannelPluginStartOptions,\n ChannelOutboundAdapter,\n ChannelSecurityContext,\n ChannelGatewayAdapter,\n ChannelStreamingAdapter,\n ChannelCommandAdapter,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\nimport { submitClarifyChoiceFromChannel } from '@xopcai/xopc/gateway/clarify-runtime.js';\n\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport { issuePairingChallenge, resolveStandardPairingPath } from '@xopcai/xopc/channels/pairing/index.js';\nimport { createStandardPairingAdapter } from '@xopcai/xopc/channels/pairing/pairing-store-adapter.js';\nimport { createTimeoutAbortSignal } from './timeout-abort.js';\nimport { createInboundDebouncer } from '@xopcai/xopc/infra/debounce.js';\nimport { getChatChannelMeta } from '@xopcai/xopc/channels/registry.js';\nimport { getMimeType } from '@xopcai/xopc/channels/media.js';\nimport { transcribe as sttTranscribe, isSTTAvailable } from '@xopcai/xopc/voice/stt/index.js';\nimport type { STTConfig } from '@xopcai/xopc/voice/stt/types.js';\n\nimport { TelegramAccountManager } from './account-manager.js';\nimport { createOutboundSender } from './outbound-sender.js';\nimport { getWorkflowProgressBroker } from '@xopcai/xopc/agent/workflow/index.js';\nimport { createTelegramWorkflowProgressCapability } from './workflow-progress.js';\nimport { createTelegramCommandHandler } from './command-handler.js';\nimport { createInboundProcessor } from './inbound-processor.js';\nimport { TELEGRAM_CHANNEL_DEFAULTS } from './plugin-defaults.js';\nimport {\n createTelegramPluginAdapters,\n createTelegramSetupWizard,\n createTelegramOutboundSendMethods,\n telegramTextChunker,\n TELEGRAM_OUTBOUND_DEFAULTS,\n createTelegramInboundAccessControl,\n telegramDebouncerKeyPolicy,\n type TelegramMessageEvent,\n} from './adapters/index.js';\nimport {\n createTelegramGatewayAdapter,\n createTelegramStreamingAdapter,\n createTelegramCommandAdapter,\n} from './channel.js';\nimport type { TelegramResolvedAccount } from './adapters/index.js';\nimport type { ChannelCronDeliveryAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { normalizeTelegramDeliveryChatId } from './delivery-chat-id.js';\nimport { telegramConfigSurface } from './adapters/config-surface.js';\nimport { telegramOnboardAdapter } from './adapters/onboard-cli.js';\nimport { TelegramConfigSchema } from './config-schema.js';\n\n/** Bound initial `getMe` so a bad `apiRoot` or unreachable API cannot block gateway startup for minutes. */\nconst TELEGRAM_GETME_TIMEOUT_MS = 20_000;\n/** grammY per-request ceiling; must exceed long-poll `getUpdates` (~30s) but avoid multi-minute hangs on bad hosts. */\nconst TELEGRAM_CLIENT_TIMEOUT_SECONDS = 75;\n\nfunction trimOptionalRootUrl(value: string | undefined): string | undefined {\n const t = value?.trim();\n if (!t) return undefined;\n return t.replace(/\\/$/, '');\n}\n\nconst log = createLogger('TelegramPlugin');\n\nconst TELEGRAM_REGISTRY_META = getChatChannelMeta('telegram');\n\nexport type { TelegramResolvedAccount as TelegramAccount } from './channel.js';\n\nexport class TelegramChannelPlugin implements ChannelPlugin<TelegramResolvedAccount> {\n readonly id = 'telegram' as const;\n\n readonly reload: ChannelPluginReloadMeta = {\n configPrefixes: ['channels.telegram'],\n };\n\n readonly meta = {\n id: TELEGRAM_REGISTRY_META.id,\n label: TELEGRAM_REGISTRY_META.label,\n selectionLabel: 'Telegram Bot',\n docsPath: '/channels/telegram',\n blurb: TELEGRAM_REGISTRY_META.description,\n order: 0,\n deferConnectUntilAfterListen: true,\n } as const;\n\n readonly capabilities = TELEGRAM_REGISTRY_META.capabilities;\n\n readonly defaults: ChannelPluginDefaults = {\n queue: { debounceMs: TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs },\n outbound: { textChunkLimit: TELEGRAM_CHANNEL_DEFAULTS.outbound.textChunkLimit },\n };\n\n readonly setupWizard = createTelegramSetupWizard();\n\n readonly configSchema = {\n schema: {},\n validate: (raw: unknown) => {\n const r = TelegramConfigSchema.safeParse(raw);\n return r.success ? { ok: true as const } : { ok: false as const, errors: [r.error.message] };\n },\n };\n\n readonly cronDelivery: ChannelCronDeliveryAdapter = {\n async normalizeDeliveryTarget(to) {\n return { chatId: normalizeTelegramDeliveryChatId(to) };\n },\n };\n\n readonly configSurface = telegramConfigSurface;\n\n readonly onboard = telegramOnboardAdapter;\n\n readonly pairing = createStandardPairingAdapter('telegram');\n\n private bus!: NonNullable<ChannelPluginInitOptions['bus']>;\n private cfg!: NonNullable<ChannelPluginInitOptions['config']>;\n private debouncer!: ReturnType<typeof createInboundDebouncer<TelegramMessageEvent>>;\n\n private accountManager!: TelegramAccountManager;\n private outboundSender!: ReturnType<typeof createOutboundSender>;\n private commandHandler!: ReturnType<typeof createTelegramCommandHandler>;\n private inboundProcessor!: ReturnType<typeof createInboundProcessor>;\n private sessionModelHooks?: ChannelPluginSessionModelHooks;\n /** Unregister fn for the workflow-progress capability registered against the global broker. */\n private workflowProgressUnregister: (() => void) | null = null;\n\n config!: import('@xopcai/xopc/channels/plugin-types.js').ChannelConfigAdapter<TelegramResolvedAccount>;\n security!: import('@xopcai/xopc/channels/plugin-types.js').ChannelSecurityAdapter<TelegramResolvedAccount>;\n status!: import('@xopcai/xopc/channels/plugin-types.js').ChannelStatusAdapter<TelegramResolvedAccount>;\n\n outbound!: ChannelOutboundAdapter;\n\n gateway!: ChannelGatewayAdapter<TelegramResolvedAccount>;\n\n streaming!: ChannelStreamingAdapter;\n\n commands!: ChannelCommandAdapter;\n\n async init(options: ChannelPluginInitOptions): Promise<void> {\n this.bus = options.bus;\n this.cfg = options.config;\n this.sessionModelHooks = options.sessionModel;\n\n this.accountManager = new TelegramAccountManager();\n this.loadAccounts();\n this.bindOutboundComponents();\n\n // Workflow progress is fed from the agent-side broker (subscribes to\n // tool_execution_update for the `workflow` tool); the capability turns\n // each snapshot into an edit-in-place Telegram message. Registration is\n // idempotent — the broker replaces a prior cap with the same channelId.\n this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(\n createTelegramWorkflowProgressCapability(this.accountManager),\n );\n\n const debounceMs =\n this.defaults.queue?.debounceMs ?? TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs;\n const keyPolicy = telegramDebouncerKeyPolicy();\n this.debouncer = createInboundDebouncer<TelegramMessageEvent>({\n debounceMs,\n ...keyPolicy,\n onFlush: async (items) => {\n await this.processMessages(items);\n },\n onError: (err, items) => {\n log.error({ err, count: items.length }, 'Debounced message processing failed');\n },\n });\n\n log.debug('Telegram plugin initialized');\n }\n\n private bindOutboundComponents(): void {\n this.outboundSender = createOutboundSender({\n accountManager: this.accountManager,\n config: this.cfg,\n });\n const sm = this.sessionModelHooks;\n this.commandHandler = createTelegramCommandHandler({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n getSessionModel: (sessionKey) => sm?.getModelForSession(sessionKey),\n setSessionModel: (sessionKey, modelId) => {\n if (!sm) return;\n void sm.switchModelForSession(sessionKey, modelId);\n },\n });\n const adapters = createTelegramPluginAdapters({\n accountManager: this.accountManager,\n });\n this.config = adapters.config;\n this.security = adapters.security;\n this.status = adapters.status;\n\n const accessControl = createTelegramInboundAccessControl();\n\n this.inboundProcessor = createInboundProcessor({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n accessControl,\n sessionKeyService: {\n generateSessionKey: (opts) =>\n generateSessionKey({\n source: 'telegram',\n chatId: opts.chatId,\n senderId: opts.senderId,\n isGroup: opts.isGroup,\n threadId: opts.threadId,\n accountId: opts.accountId,\n }),\n },\n sttService: {\n transcribe: async (buffer, config, options) => {\n const result = await sttTranscribe(buffer, config as STTConfig, options);\n return { text: result.text };\n },\n isSTTAvailable: (config) => isSTTAvailable(config as STTConfig | undefined),\n },\n mediaUtils: { getMimeType },\n });\n\n const sends = createTelegramOutboundSendMethods((opts) => this.outboundSender.send(opts));\n this.outbound = {\n deliveryMode: 'direct',\n chunker: telegramTextChunker,\n chunkerMode: 'text',\n textChunkLimit: TELEGRAM_OUTBOUND_DEFAULTS.textChunkLimit,\n ...sends,\n };\n\n this.gateway = createTelegramGatewayAdapter({\n startAccount: (account) => this.startAccount(account),\n stopAccount: (accountId) => this.accountManager.stopRunner(accountId),\n });\n this.streaming = createTelegramStreamingAdapter({ accountManager: this.accountManager });\n this.commands = createTelegramCommandAdapter();\n }\n\n async onConfigUpdated(cfg: Config): Promise<void> {\n const prevTg = this.cfg.channels?.telegram as unknown;\n const nextTg = cfg.channels?.telegram as { enabled?: boolean } | undefined;\n // Match Weixin: only `enabled === true` keeps inbound (polling). Stops immediately on disable / missing section.\n const channelOff = !nextTg || nextTg.enabled !== true;\n if (channelOff) {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n this.bindOutboundComponents();\n return;\n }\n\n if (isDeepStrictEqual(prevTg, nextTg)) {\n this.cfg = cfg;\n this.bindOutboundComponents();\n // Config unchanged but runners may be stopped (e.g. disable → enable with identical JSON shape after normalize).\n if (!this.channelIsRunning(cfg)) {\n await this.reapplyFromConfig(cfg);\n }\n return;\n }\n await this.reapplyFromConfig(cfg);\n }\n\n private async reapplyFromConfig(cfg: Config): Promise<void> {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n const telegramCfg = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const channelOn = telegramCfg != null && telegramCfg.enabled === true;\n if (!channelOn) {\n this.bindOutboundComponents();\n return;\n }\n this.loadAccounts();\n this.bindOutboundComponents();\n await this.start();\n }\n\n private loadAccounts(): void {\n const telegramCfg = this.cfg.channels?.telegram as Record<string, unknown> | undefined;\n if (!telegramCfg) return;\n if (telegramCfg.enabled !== true) {\n return;\n }\n\n const accounts = telegramCfg.accounts as Record<string, any> | undefined;\n if (!accounts || Object.keys(accounts).length === 0) return;\n\n const channelApiRoot = trimOptionalRootUrl(\n typeof telegramCfg.apiRoot === 'string' ? telegramCfg.apiRoot : undefined,\n );\n const channelProxy =\n typeof telegramCfg.proxy === 'string' && telegramCfg.proxy.trim()\n ? telegramCfg.proxy.trim()\n : undefined;\n\n for (const [id, account] of Object.entries(accounts)) {\n const accApiRoot = trimOptionalRootUrl(\n typeof account.apiRoot === 'string' ? account.apiRoot : undefined,\n );\n const accProxy =\n typeof account.proxy === 'string' && account.proxy.trim() ? account.proxy.trim() : undefined;\n this.accountManager.registerAccount({\n ...account,\n accountId: id,\n ...(accApiRoot || channelApiRoot ? { apiRoot: accApiRoot || channelApiRoot } : {}),\n ...(accProxy || channelProxy ? { proxy: accProxy || channelProxy } : {}),\n });\n }\n }\n\n channelIsRunning(cfg: Config): boolean {\n return this.accountManager.getAllAccounts().some(\n (a) => a.enabled !== false && !!a.botToken && this.accountManager.isRunning(a.accountId),\n );\n }\n\n async start(options?: ChannelPluginStartOptions): Promise<void> {\n const section = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!section || section.enabled !== true) {\n return;\n }\n\n const accountIds = options?.accountId\n ? [options.accountId]\n : this.config.listAccountIds(this.cfg);\n\n for (const accountId of accountIds) {\n const account = this.config.resolveAccount(this.cfg, accountId);\n if (!account.enabled || !account.botToken) continue;\n await this.startAccount(account);\n }\n }\n\n async stop(accountId?: string): Promise<void> {\n if (!this.config) return;\n const ids = accountId ? [accountId] : this.config.listAccountIds(this.cfg);\n for (const id of ids) {\n await this.accountManager.stopRunner(id);\n log.info({ accountId: id }, 'Telegram account stopped');\n }\n // Only unregister the broker capability on a full stop (no specific\n // account). A per-account stop still leaves other accounts capable of\n // sending progress through the same registered cap.\n if (!accountId) {\n this.workflowProgressUnregister?.();\n this.workflowProgressUnregister = null;\n }\n }\n\n private async startAccount(account: TelegramResolvedAccount): Promise<void> {\n if (this.accountManager.isRunning(account.accountId)) return;\n if (!account.botToken) return;\n\n this.accountManager.markStarting(account.accountId);\n\n try {\n const client = {\n timeoutSeconds: TELEGRAM_CLIENT_TIMEOUT_SECONDS,\n ...(account.apiRoot ? { apiRoot: account.apiRoot } : {}),\n };\n const bot = new Bot(account.botToken, { client });\n const getMeSignal = createTimeoutAbortSignal(TELEGRAM_GETME_TIMEOUT_MS);\n let me;\n try {\n me = await bot.api.getMe(getMeSignal.signal);\n } finally {\n getMeSignal.dispose();\n }\n\n const runner = run(bot, {\n runner: {\n fetch: { timeout: 30 },\n silent: true,\n maxRetryTime: Number.POSITIVE_INFINITY,\n retryInterval: 'exponential',\n },\n });\n\n this.accountManager.registerBot(account.accountId, bot);\n this.accountManager.registerRunner(account.accountId, runner);\n this.attachRunnerExitHandler(account.accountId, runner);\n this.accountManager.setBotUsername(account.accountId, me.username);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: true,\n mode: 'polling',\n });\n\n this.setupMessageHandler(account.accountId, bot);\n\n log.info({ accountId: account.accountId, username: me.username }, 'Telegram account started');\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { accountId: account.accountId, apiRootConfigured: !!account.apiRoot, errorMessage: em },\n `Telegram account not started (check token, network, or apiRoot): ${em}`,\n );\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em.slice(0, 400),\n });\n } finally {\n this.accountManager.markStartComplete(account.accountId);\n }\n }\n\n private attachRunnerExitHandler(accountId: string, runner: ReturnType<typeof run>): void {\n const task = runner.task();\n if (!task) return;\n void task.catch((err) => {\n log.error({ err, accountId }, 'Telegram polling runner exited');\n void this.accountManager.stopRunner(accountId).catch((e) => {\n log.error({ err: e, accountId }, 'Telegram runner cleanup failed');\n });\n });\n }\n\n private setupMessageHandler(accountId: string, bot: Bot): void {\n bot.on('message', async (ctx) => {\n try {\n const text = ctx.message.text ?? ctx.message.caption ?? '';\n const command = text.trim().split(' ')[0].split('@')[0].toLowerCase();\n\n if (command === '/models') {\n await this.commandHandler.handleModels(ctx);\n return;\n }\n\n if (command === '/start') {\n await this.commandHandler.handleStart(ctx);\n return;\n }\n\n if (command === '/cleanup') {\n await this.commandHandler.handleCleanup(ctx);\n return;\n }\n\n await this.debouncer.enqueue({ ctx, accountId, message: ctx.message });\n } catch (err) {\n log.error({ accountId, err }, 'Message handler error');\n }\n });\n\n bot.on('callback_query:data', async (ctx) => {\n try {\n await this.handleCallbackQuery(ctx, accountId);\n } catch (err) {\n log.error({ accountId, err }, 'Callback query handler error');\n await ctx.answerCallbackQuery('An error occurred').catch(() => {});\n }\n });\n }\n\n private async handleCallbackQuery(ctx: Context, _accountId: string): Promise<void> {\n const data = ctx.callbackQuery?.data;\n if (!data) return;\n\n if (data.startsWith('provider:')) {\n const providerId = data.substring('provider:'.length);\n await this.commandHandler.handleProviderSelect(ctx, providerId);\n return;\n }\n\n if (data.startsWith('model:')) {\n const modelId = data.substring('model:'.length);\n await this.commandHandler.handleModelSelect(ctx, modelId);\n return;\n }\n\n if (data === 'cancel') {\n await this.commandHandler.handleCancel(ctx);\n return;\n }\n\n if (data === 'providers') {\n await this.commandHandler.handleShowProviders(ctx);\n return;\n }\n\n if (data === 'cleanup:confirm') {\n await this.commandHandler.handleCleanupConfirm(ctx);\n return;\n }\n\n if (data.startsWith('clarify:')) {\n const rest = data.slice('clarify:'.length);\n const lastColon = rest.lastIndexOf(':');\n if (lastColon > 0) {\n const requestId = rest.slice(0, lastColon);\n const idx = Number.parseInt(rest.slice(lastColon + 1), 10);\n if (requestId && Number.isFinite(idx) && submitClarifyChoiceFromChannel(requestId, idx)) {\n await ctx.answerCallbackQuery();\n return;\n }\n }\n await ctx.answerCallbackQuery('No pending question');\n return;\n }\n\n await ctx.answerCallbackQuery('Unknown action');\n }\n\n private async processMessages(items: TelegramMessageEvent[]): Promise<void> {\n if (items.length === 0) return;\n\n const tgSection = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!tgSection || tgSection.enabled !== true) {\n return;\n }\n\n const last = items[items.length - 1];\n const ctx = last.ctx;\n const accountId = last.accountId;\n if (!this.accountManager.getAccount(accountId)) {\n log.warn({ accountId }, 'Unknown account');\n return;\n }\n\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const isGroup = ctx.chat?.type === 'group' || ctx.chat?.type === 'supergroup';\n const senderId = ctx.from?.id?.toString() ?? '';\n const senderUsername = ctx.from?.username;\n const chatId = ctx.chat?.id?.toString() ?? '';\n\n const securityCtx: ChannelSecurityContext = {\n accountId,\n chatId,\n senderId,\n senderName: senderUsername,\n isGroup,\n };\n\n const accessResult = this.security.checkAccess?.(securityCtx, account, this.cfg);\n\n if (!accessResult?.allowed) {\n if (!isGroup && accessResult?.reason === 'pairing-required') {\n const cid = ctx.chat?.id;\n const bot = cid != null ? this.accountManager.getBot(accountId) : undefined;\n if (bot && cid != null && senderId) {\n void issuePairingChallenge({\n channel: 'telegram',\n pairingFilePath: resolveStandardPairingPath('telegram', accountId),\n accountId,\n senderId,\n senderIdLine: `Your Telegram user id: ${senderId}`,\n sendPairingReply: async (text) => {\n await bot.api.sendMessage(cid, text);\n },\n onCreated: ({ code }) => {\n log.info({ accountId, senderId, code }, 'Telegram DM pairing code issued');\n },\n onReplyError: (err) => {\n log.warn({ err, accountId, chatId: String(cid) }, 'Telegram pairing reply failed');\n },\n });\n }\n return;\n }\n log.warn(\n {\n accountId,\n chatId,\n senderId,\n isGroup,\n reason: accessResult?.reason,\n dmPolicy: account.dmPolicy,\n groupPolicy: account.groupPolicy,\n },\n 'Telegram: message dropped by channel security (check dmPolicy/groupPolicy and allowFrom)',\n );\n return;\n }\n\n await this.inboundProcessor(ctx, accountId);\n }\n}\n\nexport const telegramPlugin = new TelegramChannelPlugin();\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","names":["sttTranscribe"],"sources":["../../../../extensions/telegram/src/plugin.ts"],"sourcesContent":["/**\n * Telegram Channel Plugin - Implementation based on ChannelPlugin interface\n *\n * This plugin integrates Telegram with the ChannelPlugin architecture.\n * It reuses components from this package's src tree where possible.\n */\n\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { Bot, type Context } from 'grammy';\n\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport type {\n ChannelPlugin,\n ChannelPluginDefaults,\n ChannelPluginInitOptions,\n ChannelPluginReloadMeta,\n ChannelPluginSessionModelHooks,\n ChannelPluginStartOptions,\n ChannelOutboundAdapter,\n ChannelSecurityContext,\n ChannelGatewayAdapter,\n ChannelStreamingAdapter,\n ChannelCommandAdapter,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\nimport { submitClarifyChoiceFromChannel } from '@xopcai/xopc/gateway/clarify-runtime.js';\n\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport { issuePairingChallenge, resolveStandardPairingPath } from '@xopcai/xopc/channels/pairing/index.js';\nimport { createStandardPairingAdapter } from '@xopcai/xopc/channels/pairing/pairing-store-adapter.js';\nimport { createTimeoutAbortSignal } from './timeout-abort.js';\nimport { createInboundDebouncer } from '@xopcai/xopc/infra/debounce.js';\nimport { getChatChannelMeta } from '@xopcai/xopc/channels/registry.js';\nimport { getMimeType } from '@xopcai/xopc/channels/media.js';\nimport { transcribe as sttTranscribe, isSTTAvailable } from '@xopcai/xopc/voice/stt/index.js';\nimport type { STTConfig } from '@xopcai/xopc/voice/stt/types.js';\n\nimport { TelegramAccountManager } from './account-manager.js';\nimport { createOutboundSender } from './outbound-sender.js';\nimport { getWorkflowProgressBroker } from '@xopcai/xopc/agent/workflow/index.js';\nimport { createTelegramWorkflowProgressCapability } from './workflow-progress.js';\nimport { createTelegramCommandHandler } from './command-handler.js';\nimport { createInboundProcessor } from './inbound-processor.js';\nimport { TELEGRAM_CHANNEL_DEFAULTS } from './plugin-defaults.js';\nimport {\n createTelegramPluginAdapters,\n createTelegramSetupWizard,\n createTelegramOutboundSendMethods,\n telegramTextChunker,\n TELEGRAM_OUTBOUND_DEFAULTS,\n createTelegramInboundAccessControl,\n telegramDebouncerKeyPolicy,\n type TelegramMessageEvent,\n} from './adapters/index.js';\nimport {\n createTelegramGatewayAdapter,\n createTelegramStreamingAdapter,\n createTelegramCommandAdapter,\n} from './channel.js';\nimport type { TelegramResolvedAccount } from './adapters/index.js';\nimport type { ChannelCronDeliveryAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { normalizeTelegramDeliveryChatId } from './delivery-chat-id.js';\nimport { telegramConfigSurface } from './adapters/config-surface.js';\nimport { telegramOnboardAdapter } from './adapters/onboard-cli.js';\nimport { TelegramConfigSchema } from './config-schema.js';\nimport { normalizeTelegramApiRoot } from './api-root.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\nimport { formatTelegramStartupError, isTelegramUnauthorizedTokenError } from './startup-errors.js';\nimport { startTelegramPollingSession } from './polling-session.js';\nimport { createProxyFetch } from './proxy-fetch.js';\nimport { runTelegramDoctorChecks } from './doctor.js';\nimport { telegramReplyTracker } from './reply-params.js';\nimport { createTelegramInboundCoalescer } from './inbound-coalescer.js';\nimport { sendTelegramAckReaction, handleTelegramMessageReaction } from './reactions.js';\nimport { handleTelegramChannelAction, bindTelegramMessageActionAccountManager } from './actions/message-actions.js';\nimport { registerChannelExecApprovalHandler } from '@xopcai/xopc/channels/exec-approval-runtime.js';\nimport { createTelegramExecApprovalHandler } from './exec-approval-handler.js';\nimport { handleTelegramFocusCommand } from './focus-handler.js';\nimport { resolveTelegramApproval } from './approval-store.js';\nimport { isTelegramExecApprovalApprover } from './exec-approvals.js';\n\n/** Bound initial `getMe` so a bad `apiRoot` or unreachable API cannot block gateway startup for minutes. */\nconst TELEGRAM_GETME_TIMEOUT_MS = 20_000;\n/** grammY per-request ceiling; must exceed long-poll `getUpdates` (~30s) but avoid multi-minute hangs on bad hosts. */\nconst TELEGRAM_CLIENT_TIMEOUT_SECONDS = 75;\n\nconst log = createLogger('TelegramPlugin');\n\nconst TELEGRAM_REGISTRY_META = getChatChannelMeta('telegram');\n\nexport type { TelegramResolvedAccount as TelegramAccount } from './channel.js';\n\nexport class TelegramChannelPlugin implements ChannelPlugin<TelegramResolvedAccount> {\n readonly id = 'telegram' as const;\n\n readonly reload: ChannelPluginReloadMeta = {\n configPrefixes: ['channels.telegram'],\n };\n\n readonly meta = {\n id: TELEGRAM_REGISTRY_META.id,\n label: TELEGRAM_REGISTRY_META.label,\n selectionLabel: 'Telegram Bot',\n docsPath: '/channels/telegram',\n blurb: TELEGRAM_REGISTRY_META.description,\n order: 0,\n deferConnectUntilAfterListen: true,\n } as const;\n\n readonly capabilities = TELEGRAM_REGISTRY_META.capabilities;\n\n readonly defaults: ChannelPluginDefaults = {\n queue: { debounceMs: TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs },\n outbound: { textChunkLimit: TELEGRAM_CHANNEL_DEFAULTS.outbound.textChunkLimit },\n };\n\n readonly setupWizard = createTelegramSetupWizard();\n\n readonly configSchema = {\n schema: {},\n validate: (raw: unknown) => {\n const r = TelegramConfigSchema.safeParse(raw);\n return r.success ? { ok: true as const } : { ok: false as const, errors: [r.error.message] };\n },\n };\n\n readonly cronDelivery: ChannelCronDeliveryAdapter = {\n async normalizeDeliveryTarget(to) {\n return { chatId: normalizeTelegramDeliveryChatId(to) };\n },\n };\n\n readonly configSurface = telegramConfigSurface;\n\n readonly onboard = telegramOnboardAdapter;\n\n readonly doctor = {\n check: (params: { cfg: Config }) => runTelegramDoctorChecks(params),\n };\n\n readonly pairing = createStandardPairingAdapter('telegram');\n\n private bus!: NonNullable<ChannelPluginInitOptions['bus']>;\n private cfg!: NonNullable<ChannelPluginInitOptions['config']>;\n private debouncer!: ReturnType<typeof createInboundDebouncer<TelegramMessageEvent>>;\n\n private accountManager!: TelegramAccountManager;\n private outboundSender!: ReturnType<typeof createOutboundSender>;\n private commandHandler!: ReturnType<typeof createTelegramCommandHandler>;\n private inboundProcessor!: ReturnType<typeof createInboundProcessor>;\n private sessionModelHooks?: ChannelPluginSessionModelHooks;\n /** Unregister fn for the workflow-progress capability registered against the global broker. */\n private workflowProgressUnregister: (() => void) | null = null;\n private inboundCoalescer = createTelegramInboundCoalescer();\n private execApprovalUnregister: (() => void) | null = null;\n\n readonly actions = {\n handleAction: handleTelegramChannelAction,\n };\n\n config!: import('@xopcai/xopc/channels/plugin-types.js').ChannelConfigAdapter<TelegramResolvedAccount>;\n security!: import('@xopcai/xopc/channels/plugin-types.js').ChannelSecurityAdapter<TelegramResolvedAccount>;\n status!: import('@xopcai/xopc/channels/plugin-types.js').ChannelStatusAdapter<TelegramResolvedAccount>;\n\n outbound!: ChannelOutboundAdapter;\n\n gateway!: ChannelGatewayAdapter<TelegramResolvedAccount>;\n\n streaming!: ChannelStreamingAdapter;\n\n commands!: ChannelCommandAdapter;\n\n async init(options: ChannelPluginInitOptions): Promise<void> {\n this.bus = options.bus;\n this.cfg = options.config;\n this.sessionModelHooks = options.sessionModel;\n\n this.accountManager = new TelegramAccountManager();\n this.loadAccounts();\n this.bindOutboundComponents();\n bindTelegramMessageActionAccountManager(this.accountManager);\n this.execApprovalUnregister?.();\n this.execApprovalUnregister = registerChannelExecApprovalHandler(\n 'telegram',\n createTelegramExecApprovalHandler({\n accountManager: this.accountManager,\n getConfig: () => this.cfg,\n }),\n );\n\n // Workflow progress is fed from the agent-side broker (subscribes to\n // tool_execution_update for the `workflow` tool); the capability turns\n // each snapshot into an edit-in-place Telegram message. Registration is\n // idempotent — the broker replaces a prior cap with the same channelId.\n this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(\n createTelegramWorkflowProgressCapability(this.accountManager),\n );\n\n const debounceMs =\n this.defaults.queue?.debounceMs ?? TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs;\n const keyPolicy = telegramDebouncerKeyPolicy();\n this.debouncer = createInboundDebouncer<TelegramMessageEvent>({\n debounceMs,\n ...keyPolicy,\n onFlush: async (items) => {\n await this.processMessages(items);\n },\n onError: (err, items) => {\n log.error({ err, count: items.length }, 'Debounced message processing failed');\n },\n });\n\n log.debug('Telegram plugin initialized');\n }\n\n private bindOutboundComponents(): void {\n this.outboundSender = createOutboundSender({\n accountManager: this.accountManager,\n config: this.cfg,\n });\n const sm = this.sessionModelHooks;\n this.commandHandler = createTelegramCommandHandler({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n getSessionModel: (sessionKey) => sm?.getModelForSession(sessionKey),\n setSessionModel: (sessionKey, modelId) => {\n if (!sm) return;\n void sm.switchModelForSession(sessionKey, modelId);\n },\n });\n const adapters = createTelegramPluginAdapters({\n accountManager: this.accountManager,\n });\n this.config = adapters.config;\n this.security = adapters.security;\n this.status = adapters.status;\n\n const accessControl = createTelegramInboundAccessControl();\n\n this.inboundProcessor = createInboundProcessor({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n accessControl,\n sessionKeyService: {\n generateSessionKey: (opts) =>\n generateSessionKey({\n source: 'telegram',\n chatId: opts.chatId,\n senderId: opts.senderId,\n isGroup: opts.isGroup,\n threadId: opts.threadId,\n accountId: opts.accountId,\n }),\n },\n sttService: {\n transcribe: async (buffer, config, options) => {\n const result = await sttTranscribe(buffer, config as STTConfig, options);\n return { text: result.text };\n },\n isSTTAvailable: (config) => isSTTAvailable(config as STTConfig | undefined),\n },\n mediaUtils: { getMimeType },\n });\n\n const sends = createTelegramOutboundSendMethods(\n (opts) => this.outboundSender.send(opts),\n this.accountManager,\n );\n this.outbound = {\n deliveryMode: 'direct',\n chunker: telegramTextChunker,\n chunkerMode: 'text',\n textChunkLimit: TELEGRAM_OUTBOUND_DEFAULTS.textChunkLimit,\n ...sends,\n };\n\n this.gateway = createTelegramGatewayAdapter({\n startAccount: (account) => this.startAccount(account),\n stopAccount: (accountId) => this.accountManager.stopRunner(accountId),\n });\n this.streaming = createTelegramStreamingAdapter({ accountManager: this.accountManager });\n this.commands = createTelegramCommandAdapter();\n }\n\n async onConfigUpdated(cfg: Config): Promise<void> {\n const prevTg = this.cfg.channels?.telegram as unknown;\n const nextTg = cfg.channels?.telegram as { enabled?: boolean } | undefined;\n // Match Weixin: only `enabled === true` keeps inbound (polling). Stops immediately on disable / missing section.\n const channelOff = !nextTg || nextTg.enabled !== true;\n if (channelOff) {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n this.bindOutboundComponents();\n return;\n }\n\n if (isDeepStrictEqual(prevTg, nextTg)) {\n this.cfg = cfg;\n this.bindOutboundComponents();\n // Config unchanged but runners may be stopped (e.g. disable → enable with identical JSON shape after normalize).\n if (!this.channelIsRunning(cfg)) {\n await this.reapplyFromConfig(cfg);\n }\n return;\n }\n await this.reapplyFromConfig(cfg);\n }\n\n private async reapplyFromConfig(cfg: Config): Promise<void> {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n const telegramCfg = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const channelOn = telegramCfg != null && telegramCfg.enabled === true;\n if (!channelOn) {\n this.bindOutboundComponents();\n return;\n }\n this.loadAccounts();\n this.bindOutboundComponents();\n await this.start();\n }\n\n private loadAccounts(): void {\n const telegramCfg = this.cfg.channels?.telegram as Record<string, unknown> | undefined;\n if (!telegramCfg) return;\n if (telegramCfg.enabled !== true) {\n return;\n }\n\n const accounts = telegramCfg.accounts as Record<string, Record<string, unknown>> | undefined;\n if (!accounts || Object.keys(accounts).length === 0) return;\n\n const channelApiRoot =\n typeof telegramCfg.apiRoot === 'string'\n ? normalizeTelegramApiRoot(telegramCfg.apiRoot)\n : undefined;\n const channelProxy =\n typeof telegramCfg.proxy === 'string' && telegramCfg.proxy.trim()\n ? telegramCfg.proxy.trim()\n : undefined;\n const channelReplyToMode = telegramCfg.replyToMode as TelegramResolvedAccount['replyToMode'];\n const channelStreaming = telegramCfg.streaming as TelegramResolvedAccount['streaming'];\n\n const tokenOwners = new Map<string, string[]>();\n\n for (const [id, account] of Object.entries(accounts)) {\n const { token, source } = resolveTelegramBotToken({\n botToken: typeof account.botToken === 'string' ? account.botToken : undefined,\n tokenFile: typeof account.tokenFile === 'string' ? account.tokenFile : undefined,\n });\n if (token) {\n const owners = tokenOwners.get(token) ?? [];\n owners.push(id);\n tokenOwners.set(token, owners);\n }\n\n const accApiRoot =\n typeof account.apiRoot === 'string'\n ? normalizeTelegramApiRoot(account.apiRoot)\n : undefined;\n const accProxy =\n typeof account.proxy === 'string' && account.proxy.trim() ? account.proxy.trim() : undefined;\n\n this.accountManager.registerAccount({\n ...account,\n accountId: id,\n botToken: token,\n tokenFile: typeof account.tokenFile === 'string' ? account.tokenFile : undefined,\n tokenSource: source,\n ...(accApiRoot || channelApiRoot ? { apiRoot: accApiRoot || channelApiRoot } : {}),\n ...(accProxy || channelProxy ? { proxy: accProxy || channelProxy } : {}),\n replyToMode:\n (account.replyToMode as TelegramResolvedAccount['replyToMode']) ?? channelReplyToMode,\n streaming:\n (account.streaming as TelegramResolvedAccount['streaming']) ?? channelStreaming,\n } as import('@xopcai/xopc/channels/channel-domain.js').TelegramAccountConfig);\n }\n\n for (const [token, owners] of tokenOwners) {\n if (owners.length > 1) {\n log.error(\n { accountIds: owners, tokenPreview: `${token.slice(0, 8)}…` },\n `Duplicate Telegram bot token across accounts: ${owners.join(', ')}`,\n );\n }\n }\n }\n\n channelIsRunning(cfg: Config): boolean {\n return this.accountManager.getAllAccounts().some(\n (a) => a.enabled !== false && !!a.botToken && this.accountManager.isRunning(a.accountId),\n );\n }\n\n async start(options?: ChannelPluginStartOptions): Promise<void> {\n const section = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!section || section.enabled !== true) {\n return;\n }\n\n const accountIds = options?.accountId\n ? [options.accountId]\n : this.config.listAccountIds(this.cfg);\n\n for (const accountId of accountIds) {\n const account = this.config.resolveAccount(this.cfg, accountId);\n if (!account.enabled || !account.botToken) continue;\n await this.startAccount(account);\n }\n }\n\n async stop(accountId?: string): Promise<void> {\n if (!this.config) return;\n const ids = accountId ? [accountId] : this.config.listAccountIds(this.cfg);\n for (const id of ids) {\n await this.accountManager.stopRunner(id);\n log.info({ accountId: id }, 'Telegram account stopped');\n }\n // Only unregister the broker capability on a full stop (no specific\n // account). A per-account stop still leaves other accounts capable of\n // sending progress through the same registered cap.\n if (!accountId) {\n this.workflowProgressUnregister?.();\n this.workflowProgressUnregister = null;\n this.execApprovalUnregister?.();\n this.execApprovalUnregister = null;\n }\n }\n\n private async startAccount(account: TelegramResolvedAccount): Promise<void> {\n if (this.accountManager.isRunning(account.accountId)) return;\n\n const resolved = resolveTelegramBotToken({\n botToken: account.botToken,\n tokenFile: account.tokenFile,\n });\n if (!resolved.token) return;\n\n const duplicateAccounts = this.accountManager\n .getAllAccounts()\n .filter((a) => {\n const t = resolveTelegramBotToken({\n botToken: a.botToken,\n tokenFile: a.tokenFile,\n }).token;\n return t === resolved.token && a.accountId !== account.accountId;\n })\n .map((a) => a.accountId);\n if (duplicateAccounts.length > 0) {\n const em = `Duplicate bot token shared with account(s): ${duplicateAccounts.join(', ')}`;\n log.error({ accountId: account.accountId, duplicateAccounts }, em);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em,\n });\n return;\n }\n\n this.accountManager.markStarting(account.accountId);\n\n try {\n const client: {\n timeoutSeconds: number;\n apiRoot?: string;\n fetch?: typeof fetch;\n } = {\n timeoutSeconds: TELEGRAM_CLIENT_TIMEOUT_SECONDS,\n ...(account.apiRoot ? { apiRoot: account.apiRoot } : {}),\n ...(account.proxy ? { fetch: createProxyFetch(account.proxy) } : {}),\n };\n const bot = new Bot(resolved.token, { client });\n const getMeSignal = createTimeoutAbortSignal(TELEGRAM_GETME_TIMEOUT_MS);\n let me;\n try {\n me = await bot.api.getMe(getMeSignal.signal);\n } finally {\n getMeSignal.dispose();\n }\n\n this.accountManager.registerBot(account.accountId, bot);\n this.accountManager.setBotUsername(account.accountId, me.username);\n this.setupMessageHandler(account.accountId, bot);\n\n const session = startTelegramPollingSession({\n accountId: account.accountId,\n botToken: resolved.token,\n bot,\n stallThresholdMs: account.pollingStallThresholdMs,\n onExit: () => {\n void this.accountManager.stopRunner(account.accountId);\n },\n });\n this.accountManager.registerPollingSession(account.accountId, session);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: true,\n mode: 'polling',\n });\n\n log.info({ accountId: account.accountId, username: me.username }, 'Telegram account started');\n } catch (err) {\n const em = formatTelegramStartupError(err);\n const level = isTelegramUnauthorizedTokenError(err) ? 'error' : 'warn';\n log[level](\n {\n accountId: account.accountId,\n apiRootConfigured: !!account.apiRoot,\n unauthorized: isTelegramUnauthorizedTokenError(err),\n errorMessage: em,\n },\n `Telegram account not started: ${em}`,\n );\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em.slice(0, 400),\n });\n } finally {\n this.accountManager.markStartComplete(account.accountId);\n }\n }\n\n private attachRunnerExitHandler(_accountId: string, _runner: unknown): void {\n // Polling exit is handled by startTelegramPollingSession.onExit.\n }\n\n private setupMessageHandler(accountId: string, bot: Bot): void {\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const handleInboundMessage = async (ctx: Context) => {\n const text = ctx.message?.text ?? ctx.message?.caption ?? ctx.channelPost?.text ?? ctx.channelPost?.caption ?? '';\n const command = text.trim().split(' ')[0].split('@')[0].toLowerCase();\n\n if (command === '/models') {\n await this.commandHandler.handleModels(ctx);\n return;\n }\n if (command === '/start') {\n await this.commandHandler.handleStart(ctx);\n return;\n }\n if (command === '/cleanup') {\n await this.commandHandler.handleCleanup(ctx);\n return;\n }\n if (command === '/focus') {\n await handleTelegramFocusCommand({ ctx, accountId, config: this.cfg });\n return;\n }\n\n const message = ctx.message ?? ctx.channelPost;\n if (!message) return;\n\n await this.inboundCoalescer.enqueue({\n ctx,\n accountId,\n message,\n onReady: async (batch) => {\n for (const msg of batch.messages) {\n const batchCtx = batch.ctx;\n await this.debouncer.enqueue({\n ctx: { ...batchCtx, message: msg } as Context,\n accountId: batch.accountId,\n message: msg,\n });\n }\n },\n });\n };\n\n bot.on('message', async (ctx) => {\n try {\n await handleInboundMessage(ctx);\n } catch (err) {\n log.error({ accountId, err }, 'Message handler error');\n }\n });\n\n bot.on('channel_post', async (ctx) => {\n try {\n await handleInboundMessage(ctx);\n } catch (err) {\n log.error({ accountId, err }, 'Channel post handler error');\n }\n });\n\n bot.on('message_reaction', async (ctx) => {\n try {\n await handleTelegramMessageReaction({\n ctx,\n accountId,\n bus: this.bus,\n mode: account.reactionNotifications as 'off' | 'own' | 'all' | undefined,\n });\n } catch (err) {\n log.error({ accountId, err }, 'Message reaction handler error');\n }\n });\n\n bot.on('callback_query:data', async (ctx) => {\n try {\n await this.handleCallbackQuery(ctx, accountId);\n } catch (err) {\n log.error({ accountId, err }, 'Callback query handler error');\n await ctx.answerCallbackQuery('An error occurred').catch(() => {});\n }\n });\n }\n\n private async handleCallbackQuery(ctx: Context, _accountId: string): Promise<void> {\n const data = ctx.callbackQuery?.data;\n if (!data) return;\n\n if (data.startsWith('provider:')) {\n const providerId = data.substring('provider:'.length);\n await this.commandHandler.handleProviderSelect(ctx, providerId);\n return;\n }\n\n if (data.startsWith('model:')) {\n const modelId = data.substring('model:'.length);\n await this.commandHandler.handleModelSelect(ctx, modelId);\n return;\n }\n\n if (data === 'cancel') {\n await this.commandHandler.handleCancel(ctx);\n return;\n }\n\n if (data === 'providers') {\n await this.commandHandler.handleShowProviders(ctx);\n return;\n }\n\n if (data === 'cleanup:confirm') {\n await this.commandHandler.handleCleanupConfirm(ctx);\n return;\n }\n\n if (data.startsWith('clarify:')) {\n const rest = data.slice('clarify:'.length);\n const lastColon = rest.lastIndexOf(':');\n if (lastColon > 0) {\n const requestId = rest.slice(0, lastColon);\n const idx = Number.parseInt(rest.slice(lastColon + 1), 10);\n if (requestId && Number.isFinite(idx) && submitClarifyChoiceFromChannel(requestId, idx)) {\n await ctx.answerCallbackQuery();\n return;\n }\n }\n await ctx.answerCallbackQuery('No pending question');\n return;\n }\n\n if (data.startsWith('approval:approve:') || data.startsWith('approval:deny:')) {\n const approved = data.startsWith('approval:approve:');\n const approvalId = data.slice(approved ? 'approval:approve:'.length : 'approval:deny:'.length);\n const senderId = String(ctx.from?.id ?? '');\n if (\n !isTelegramExecApprovalApprover({\n cfg: this.cfg,\n accountId: _accountId,\n senderId,\n })\n ) {\n await ctx.answerCallbackQuery('Not authorized');\n return;\n }\n if (resolveTelegramApproval(approvalId, approved)) {\n await ctx.answerCallbackQuery(approved ? 'Approved' : 'Denied');\n } else {\n await ctx.answerCallbackQuery('Approval expired or already resolved');\n }\n return;\n }\n\n await ctx.answerCallbackQuery('Unknown action');\n }\n\n private async processMessages(items: TelegramMessageEvent[]): Promise<void> {\n if (items.length === 0) return;\n\n const tgSection = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!tgSection || tgSection.enabled !== true) {\n return;\n }\n\n const last = items[items.length - 1];\n const ctx = last.ctx;\n const accountId = last.accountId;\n if (!this.accountManager.getAccount(accountId)) {\n log.warn({ accountId }, 'Unknown account');\n return;\n }\n\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const isGroup = ctx.chat?.type === 'group' || ctx.chat?.type === 'supergroup';\n const senderId = ctx.from?.id?.toString() ?? '';\n const senderUsername = ctx.from?.username;\n const chatId = ctx.chat?.id?.toString() ?? '';\n telegramReplyTracker.reset(accountId, chatId);\n\n const securityCtx: ChannelSecurityContext = {\n accountId,\n chatId,\n senderId,\n senderName: senderUsername,\n isGroup,\n };\n\n const accessResult = this.security.checkAccess?.(securityCtx, account, this.cfg);\n\n if (!accessResult?.allowed) {\n if (!isGroup && accessResult?.reason === 'pairing-required') {\n const cid = ctx.chat?.id;\n const bot = cid != null ? this.accountManager.getBot(accountId) : undefined;\n if (bot && cid != null && senderId) {\n void issuePairingChallenge({\n channel: 'telegram',\n pairingFilePath: resolveStandardPairingPath('telegram', accountId),\n accountId,\n senderId,\n senderIdLine: `Your Telegram user id: ${senderId}`,\n sendPairingReply: async (text) => {\n await bot.api.sendMessage(cid, text);\n },\n onCreated: ({ code }) => {\n log.info({ accountId, senderId, code }, 'Telegram DM pairing code issued');\n },\n onReplyError: (err) => {\n log.warn({ err, accountId, chatId: String(cid) }, 'Telegram pairing reply failed');\n },\n });\n }\n return;\n }\n log.warn(\n {\n accountId,\n chatId,\n senderId,\n isGroup,\n reason: accessResult?.reason,\n dmPolicy: account.dmPolicy,\n groupPolicy: account.groupPolicy,\n },\n 'Telegram: message dropped by channel security (check dmPolicy/groupPolicy and allowFrom)',\n );\n return;\n }\n\n const bot = this.accountManager.getBot(accountId);\n const messageId = ctx.message?.message_id;\n const reactionLevel = (account as { reactionLevel?: string }).reactionLevel ?? 'ack';\n const ackEmoji = (account as { ackReaction?: string }).ackReaction ?? '👀';\n if (\n bot &&\n messageId &&\n reactionLevel !== 'off' &&\n ctx.chat?.id != null &&\n !ctx.channelPost\n ) {\n void sendTelegramAckReaction({\n bot,\n chatId: ctx.chat.id,\n messageId,\n emoji: ackEmoji,\n });\n }\n\n await this.inboundProcessor(ctx, accountId);\n }\n}\n\nexport const telegramPlugin = new TelegramChannelPlugin();\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Bot } from 'grammy';
2
+ export declare function resolvePollingStallThresholdMs(value?: number): number;
3
+ export interface TelegramPollingSessionOptions {
4
+ accountId: string;
5
+ botToken: string;
6
+ bot: Bot;
7
+ stallThresholdMs?: number;
8
+ onExit?: (err?: unknown) => void;
9
+ }
10
+ export interface TelegramPollingSession {
11
+ stop: () => Promise<void>;
12
+ }
13
+ export declare function wireTelegramUpdateOffsetPersistence(bot: Bot, params: {
14
+ accountId: string;
15
+ botToken: string;
16
+ }): void;
17
+ export declare function startTelegramPollingSession(options: TelegramPollingSessionOptions): TelegramPollingSession;