@xopcai/xopc 0.0.99 → 0.0.100

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 (349) 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/gateway/static/root/assets/{agents-4KTK-Ku7.js → agents-C5jtBK-H.js} +1 -1
  91. package/dist/gateway/static/root/assets/{apps-page-DkgInY2w.js → apps-page-smJl-qf_.js} +1 -1
  92. package/dist/gateway/static/root/assets/channels-settings-CH6KgFK6.js +1 -0
  93. package/dist/gateway/static/root/assets/channels-status-swr-CV70xvY7.js +8 -0
  94. package/dist/gateway/static/root/assets/{cron-api-BRDli2Mm.js → cron-api-CgBO8B7I.js} +1 -1
  95. package/dist/gateway/static/root/assets/{cron-page-BzEr5Za8.js → cron-page-Be0cW1cR.js} +1 -1
  96. package/dist/gateway/static/root/assets/{dist-BsHh1vX0.js → dist-P8HRGUuh.js} +1 -1
  97. package/dist/gateway/static/root/assets/{extension-debug-page-TWt5q_ef.js → extension-debug-page-BowuycYu.js} +1 -1
  98. package/dist/gateway/static/root/assets/{extension-page-C3kV8ZvZ.js → extension-page-27-Zpv8O.js} +1 -1
  99. package/dist/gateway/static/root/assets/{extension-settings-page-Csy9LNC6.js → extension-settings-page-DDFa_rIq.js} +1 -1
  100. package/dist/gateway/static/root/assets/{fetch-BLLOP2CM.js → fetch-drJUxxKP.js} +1 -1
  101. package/dist/gateway/static/root/assets/{field-primitives-MXbM8HvY.js → field-primitives-BWLssxEb.js} +1 -1
  102. package/dist/gateway/static/root/assets/{heartbeat-config-api-CkoyqfRx.js → heartbeat-config-api-BVuYNYT_.js} +1 -1
  103. package/dist/gateway/static/root/assets/index-CRDAmr3W.js +4840 -0
  104. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
  105. package/dist/gateway/static/root/assets/{logs-page-B2vY41ph.js → logs-page-BDX8IrDQ.js} +1 -1
  106. package/dist/gateway/static/root/assets/{note-detail-page-B7qE5pkO.js → note-detail-page-BmQ9KeiA.js} +1 -1
  107. package/dist/gateway/static/root/assets/{note-time-NBBReVR4.js → note-time-14I9Sgqh.js} +1 -1
  108. package/dist/gateway/static/root/assets/{notes-page-CsWYaqYM.js → notes-page-BMfP0FFf.js} +1 -1
  109. package/dist/gateway/static/root/assets/{sessions-page-BPGY3SCT.js → sessions-page-C3scyChq.js} +1 -1
  110. package/dist/gateway/static/root/assets/{settings-advanced-gate-DtA451RM.js → settings-advanced-gate-2ODuCjHP.js} +1 -1
  111. package/dist/gateway/static/root/assets/{settings-form-section-DYR_SPlX.js → settings-form-section-DUoGKAiW.js} +1 -1
  112. package/dist/gateway/static/root/assets/{settings-page-BJUgZQzN.js → settings-page-CttAfOWV.js} +1 -1
  113. package/dist/gateway/static/root/assets/{share-preview-page-3u8VFmdo.js → share-preview-page-B77xqiiI.js} +1 -1
  114. package/dist/gateway/static/root/assets/{skills-page-DuyhcH4U.js → skills-page-B_bAZGzB.js} +1 -1
  115. package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-BgCPrmxU.js} +1 -1
  116. package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
  117. package/dist/gateway/static/root/assets/{utils-B4Vw3fnc.js → utils-CCGejlcX.js} +1 -1
  118. package/dist/gateway/static/root/assets/{voice-api-key-field-BFY67Hhp.js → voice-api-key-field-DZzzihcY.js} +1 -1
  119. package/dist/gateway/static/root/assets/{workflow-page.utils-yUJ5jexd.js → workflow-page.utils-D5RMAmT4.js} +1 -1
  120. package/dist/gateway/static/root/assets/{workflows-page-DIMHCpNt.js → workflows-page-DEYpC6Bv.js} +1 -1
  121. package/dist/gateway/static/root/index.html +5 -5
  122. package/dist/package.js +1 -1
  123. package/dist/src/agent/agent-manager.d.ts +4 -0
  124. package/dist/src/agent/agent-manager.js +68 -4
  125. package/dist/src/agent/agent-manager.js.map +1 -1
  126. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  127. package/dist/src/agent/child-agent-factory.js +13 -10
  128. package/dist/src/agent/child-agent-factory.js.map +1 -1
  129. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  130. package/dist/src/agent/embedded/run-for-session.js +1 -0
  131. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  132. package/dist/src/agent/embedded/run-turn.js +1 -17
  133. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  134. package/dist/src/agent/embedded/session-runner.js +3 -1
  135. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  136. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +1 -0
  137. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -0
  138. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  139. package/dist/src/agent/inbound/attachment-pipeline.d.ts +37 -0
  140. package/dist/src/agent/inbound/attachment-pipeline.js +169 -0
  141. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -0
  142. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -5
  143. package/dist/src/agent/inbound/turn-dispatcher.js +1 -2
  144. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  145. package/dist/src/agent/memory/index.d.ts +2 -0
  146. package/dist/src/agent/memory/index.js +2 -1
  147. package/dist/src/agent/memory/memory-flush.d.ts +27 -0
  148. package/dist/src/agent/memory/memory-flush.js +124 -0
  149. package/dist/src/agent/memory/memory-flush.js.map +1 -0
  150. package/dist/src/agent/messaging/outbound-coordinator.js +2 -1
  151. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -1
  152. package/dist/src/agent/messaging/stream-manager.d.ts +2 -0
  153. package/dist/src/agent/messaging/stream-manager.js +3 -0
  154. package/dist/src/agent/messaging/stream-manager.js.map +1 -1
  155. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  156. package/dist/src/agent/orchestration/agent-orchestrator.js +40 -107
  157. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  158. package/dist/src/agent/prompt/contribution.d.ts +9 -0
  159. package/dist/src/agent/prompt/contribution.js +1 -0
  160. package/dist/src/agent/prompt/safety.js +0 -10
  161. package/dist/src/agent/prompt/safety.js.map +1 -1
  162. package/dist/src/agent/prompt/sanitize-for-prompt.d.ts +6 -0
  163. package/dist/src/agent/prompt/sanitize-for-prompt.js +13 -0
  164. package/dist/src/agent/prompt/sanitize-for-prompt.js.map +1 -0
  165. package/dist/src/agent/prompt/sections/behavior.d.ts +5 -0
  166. package/dist/src/agent/prompt/sections/behavior.js +50 -0
  167. package/dist/src/agent/prompt/sections/behavior.js.map +1 -0
  168. package/dist/src/agent/prompt/sections/memory-skills.d.ts +9 -0
  169. package/dist/src/agent/prompt/sections/memory-skills.js +59 -0
  170. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -0
  171. package/dist/src/agent/prompt/sections/messaging-runtime.d.ts +16 -0
  172. package/dist/src/agent/prompt/sections/messaging-runtime.js +69 -0
  173. package/dist/src/agent/prompt/sections/messaging-runtime.js.map +1 -0
  174. package/dist/src/agent/prompt/sections/project-context.d.ts +16 -0
  175. package/dist/src/agent/prompt/sections/project-context.js +58 -0
  176. package/dist/src/agent/prompt/sections/project-context.js.map +1 -0
  177. package/dist/src/agent/prompt/sections/tooling.d.ts +5 -0
  178. package/dist/src/agent/prompt/sections/tooling.js +119 -0
  179. package/dist/src/agent/prompt/sections/tooling.js.map +1 -0
  180. package/dist/src/agent/prompt/sections/workspace-runtime.d.ts +11 -0
  181. package/dist/src/agent/prompt/sections/workspace-runtime.js +32 -0
  182. package/dist/src/agent/prompt/sections/workspace-runtime.js.map +1 -0
  183. package/dist/src/agent/prompt/service-prompt-builder.d.ts +13 -0
  184. package/dist/src/agent/prompt/service-prompt-builder.js +54 -13
  185. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  186. package/dist/src/agent/prompt/subagent-context.d.ts +15 -0
  187. package/dist/src/agent/prompt/subagent-context.js +68 -0
  188. package/dist/src/agent/prompt/subagent-context.js.map +1 -0
  189. package/dist/src/agent/prompt/system-prompt-params.d.ts +53 -0
  190. package/dist/src/agent/prompt/system-prompt-params.js +74 -0
  191. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -0
  192. package/dist/src/agent/prompt/system-prompt.d.ts +22 -11
  193. package/dist/src/agent/prompt/system-prompt.js +79 -193
  194. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  195. package/dist/src/agent/prompt/types.d.ts +3 -0
  196. package/dist/src/agent/service/build-direct-message-content.d.ts +5 -21
  197. package/dist/src/agent/service/build-direct-message-content.js +11 -64
  198. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  199. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
  200. package/dist/src/agent/service/direct-turn-helpers.js +7 -0
  201. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  202. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  203. package/dist/src/agent/service/process-direct-one-shot.js +22 -17
  204. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  205. package/dist/src/agent/service/process-direct-streaming.d.ts +6 -20
  206. package/dist/src/agent/service/process-direct-streaming.js +39 -40
  207. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  208. package/dist/src/agent/service/webchat-tts.d.ts +4 -9
  209. package/dist/src/agent/service/webchat-tts.js +9 -20
  210. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  211. package/dist/src/agent/service.d.ts +8 -19
  212. package/dist/src/agent/service.js +53 -11
  213. package/dist/src/agent/service.js.map +1 -1
  214. package/dist/src/agent/tools/factory.js +2 -0
  215. package/dist/src/agent/tools/factory.js.map +1 -1
  216. package/dist/src/agent/tools/index.d.ts +1 -0
  217. package/dist/src/agent/tools/index.js +2 -1
  218. package/dist/src/agent/tools/media-read-tool.d.ts +2 -0
  219. package/dist/src/agent/tools/media-read-tool.js +89 -0
  220. package/dist/src/agent/tools/media-read-tool.js.map +1 -0
  221. package/dist/src/channels/attachments/attachment-classifiers.d.ts +8 -0
  222. package/dist/src/channels/attachments/attachment-classifiers.js +11 -0
  223. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -0
  224. package/dist/src/channels/attachments/inbound-persist.d.ts +13 -34
  225. package/dist/src/channels/attachments/inbound-persist.js +34 -102
  226. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  227. package/dist/src/channels/attachments/inbound-types.d.ts +13 -0
  228. package/dist/src/channels/attachments/inbound-types.js +30 -0
  229. package/dist/src/channels/attachments/inbound-types.js.map +1 -0
  230. package/dist/src/channels/attachments/outbound-tts-persist.d.ts +3 -12
  231. package/dist/src/channels/attachments/outbound-tts-persist.js +28 -48
  232. package/dist/src/channels/attachments/outbound-tts-persist.js.map +1 -1
  233. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -3
  234. package/dist/src/channels/attachments/voice-stt-webchat.js +8 -14
  235. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +30 -2
  237. package/dist/src/channels/exec-approval-runtime.d.ts +29 -0
  238. package/dist/src/channels/exec-approval-runtime.js +30 -0
  239. package/dist/src/channels/exec-approval-runtime.js.map +1 -0
  240. package/dist/src/channels/index.js +1 -1
  241. package/dist/src/channels/plugin-types.d.ts +1 -0
  242. package/dist/src/channels/transport-types.d.ts +2 -2
  243. package/dist/src/cli/commands/channels.js +1 -1
  244. package/dist/src/cli/commands/doctor/checks/database-schema.d.ts +2 -0
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +62 -0
  246. package/dist/src/cli/commands/doctor/checks/database-schema.js.map +1 -0
  247. package/dist/src/cli/commands/doctor/flow.js +2 -0
  248. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  249. package/dist/src/cli/commands/init.js +2 -57
  250. package/dist/src/cli/commands/init.js.map +1 -1
  251. package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
  252. package/dist/src/cli/commands/setup.js +6 -5
  253. package/dist/src/cli/commands/setup.js.map +1 -1
  254. package/dist/src/cli/utils/init-workspace-core.js +1 -2
  255. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  256. package/dist/src/config/index.js +2 -2
  257. package/dist/src/config/paths.d.ts +0 -13
  258. package/dist/src/config/paths.js +1 -20
  259. package/dist/src/config/paths.js.map +1 -1
  260. package/dist/src/config/rules.js +1 -1
  261. package/dist/src/config/schema.d.ts +24 -0
  262. package/dist/src/config/schema.js +33 -2
  263. package/dist/src/config/schema.js.map +1 -1
  264. package/dist/src/cron/executor.js +2 -2
  265. package/dist/src/gateway/heartbeat/service.js +1 -1
  266. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  267. package/dist/src/gateway/hono/routes/config-patch/channels.js +3 -3
  268. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  269. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  270. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  271. package/dist/src/gateway/hono/routes/media.d.ts +3 -0
  272. package/dist/src/gateway/hono/routes/media.js +50 -0
  273. package/dist/src/gateway/hono/routes/media.js.map +1 -0
  274. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  275. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/workspace.js +1 -87
  277. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  278. package/dist/src/gateway/service/sessions-api.js +3 -0
  279. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  280. package/dist/src/heartbeat/index.js +1 -1
  281. package/dist/src/media/index.d.ts +5 -0
  282. package/dist/src/media/index.js +5 -0
  283. package/dist/src/media/media-reference.d.ts +23 -0
  284. package/dist/src/media/media-reference.js +34 -0
  285. package/dist/src/media/media-reference.js.map +1 -0
  286. package/dist/src/media/paths.d.ts +5 -0
  287. package/dist/src/media/paths.js +20 -0
  288. package/dist/src/media/paths.js.map +1 -0
  289. package/dist/src/media/session-references.d.ts +8 -0
  290. package/dist/src/media/session-references.js +45 -0
  291. package/dist/src/media/session-references.js.map +1 -0
  292. package/dist/src/media/store.d.ts +19 -0
  293. package/dist/src/media/store.js +131 -0
  294. package/dist/src/media/store.js.map +1 -0
  295. package/dist/src/media/types.d.ts +34 -0
  296. package/dist/src/media/types.js +1 -0
  297. package/dist/src/media/uri.d.ts +15 -0
  298. package/dist/src/media/uri.js +51 -0
  299. package/dist/src/media/uri.js.map +1 -0
  300. package/dist/src/session/session-title.js +6 -3
  301. package/dist/src/session/session-title.js.map +1 -1
  302. package/dist/src/session/store.js +1 -1
  303. package/dist/src/session/store.js.map +1 -1
  304. package/dist/src/session/types.d.ts +12 -7
  305. package/dist/src/session/types.js.map +1 -1
  306. package/dist/src/storage/sqlite/index.d.ts +4 -1
  307. package/dist/src/storage/sqlite/index.js +6 -2
  308. package/dist/src/storage/sqlite/migrations/002_add_flush_columns.sql +3 -0
  309. package/dist/src/storage/sqlite/migrations/discover.d.ts +4 -0
  310. package/dist/src/storage/sqlite/migrations/discover.js +38 -0
  311. package/dist/src/storage/sqlite/migrations/discover.js.map +1 -0
  312. package/dist/src/storage/sqlite/migrations/discover.ts +52 -0
  313. package/dist/src/storage/sqlite/migrations/errors.d.ts +11 -0
  314. package/dist/src/storage/sqlite/migrations/errors.js +27 -0
  315. package/dist/src/storage/sqlite/migrations/errors.js.map +1 -0
  316. package/dist/src/storage/sqlite/migrations/errors.ts +32 -0
  317. package/dist/src/storage/sqlite/migrations/runner.d.ts +22 -0
  318. package/dist/src/storage/sqlite/migrations/runner.js +97 -0
  319. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -0
  320. package/dist/src/storage/sqlite/migrations/runner.ts +153 -0
  321. package/dist/src/storage/sqlite/migrations/types.d.ts +12 -0
  322. package/dist/src/storage/sqlite/migrations/types.js +1 -0
  323. package/dist/src/storage/sqlite/migrations/types.ts +13 -0
  324. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -0
  325. package/dist/src/storage/sqlite/row-mappers.js +4 -0
  326. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  327. package/dist/src/storage/sqlite/schema-version.d.ts +6 -0
  328. package/dist/src/storage/sqlite/schema-version.js +29 -0
  329. package/dist/src/storage/sqlite/schema-version.js.map +1 -0
  330. package/dist/src/storage/sqlite/schema.d.ts +5 -3
  331. package/dist/src/storage/sqlite/schema.js +24 -28
  332. package/dist/src/storage/sqlite/schema.js.map +1 -1
  333. package/dist/src/storage/sqlite/schema.sql +2 -0
  334. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  335. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  336. package/dist/src/storage/sqlite/session-repository.js +7 -3
  337. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  338. package/package.json +1 -1
  339. package/dist/gateway/static/root/assets/channels-settings-BxW1Xio4.js +0 -1
  340. package/dist/gateway/static/root/assets/channels-status-swr-Cxm6AvQO.js +0 -8
  341. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
  342. package/dist/gateway/static/root/assets/index-Cbg5TS5m.js +0 -4707
  343. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +0 -3
  344. package/dist/src/cli/commands/onboard/workspace.d.ts +0 -14
  345. package/dist/src/cli/commands/onboard/workspace.js +0 -33
  346. package/dist/src/cli/commands/onboard/workspace.js.map +0 -1
  347. package/dist/src/cli/utils/workspace.d.ts +0 -35
  348. package/dist/src/cli/utils/workspace.js +0 -72
  349. package/dist/src/cli/utils/workspace.js.map +0 -1
@@ -0,0 +1,112 @@
1
+ import { createLogger } from "../../../src/utils/logger/index.js";
2
+ import { init_logger } from "../../../src/utils/logger.js";
3
+ import { isRecoverableTelegramNetworkError } from "./network-errors.js";
4
+ import { readTelegramUpdateOffset, writeTelegramUpdateOffset } from "./update-offset-store.js";
5
+ import { run } from "@grammyjs/runner";
6
+ //#region extensions/telegram/src/polling-session.ts
7
+ init_logger();
8
+ const log = createLogger("TelegramPolling");
9
+ const DEFAULT_STALL_THRESHOLD_MS = 12e4;
10
+ const MIN_STALL_THRESHOLD_MS = 3e4;
11
+ const MAX_STALL_THRESHOLD_MS = 6e5;
12
+ const WATCHDOG_INTERVAL_MS = 3e4;
13
+ function resolvePollingStallThresholdMs(value) {
14
+ if (value == null || !Number.isFinite(value)) return DEFAULT_STALL_THRESHOLD_MS;
15
+ return Math.min(MAX_STALL_THRESHOLD_MS, Math.max(MIN_STALL_THRESHOLD_MS, Math.floor(value)));
16
+ }
17
+ function wireTelegramUpdateOffsetPersistence(bot, params) {
18
+ const savedOffset = readTelegramUpdateOffset(params);
19
+ if (savedOffset != null) {
20
+ let restored = false;
21
+ bot.api.config.use(async (prev, method, payload, signal) => {
22
+ if (method === "getUpdates" && !restored) {
23
+ restored = true;
24
+ return prev(method, {
25
+ ...payload,
26
+ offset: savedOffset + 1
27
+ }, signal);
28
+ }
29
+ return prev(method, payload, signal);
30
+ });
31
+ }
32
+ bot.use(async (ctx, next) => {
33
+ const updateId = ctx.update.update_id;
34
+ if (Number.isSafeInteger(updateId)) writeTelegramUpdateOffset({
35
+ ...params,
36
+ lastUpdateId: updateId
37
+ });
38
+ await next();
39
+ });
40
+ }
41
+ function startTelegramPollingSession(options) {
42
+ const { accountId, botToken, bot } = options;
43
+ const stallThresholdMs = resolvePollingStallThresholdMs(options.stallThresholdMs);
44
+ wireTelegramUpdateOffsetPersistence(bot, {
45
+ accountId,
46
+ botToken
47
+ });
48
+ let lastUpdateAt = Date.now();
49
+ bot.use(async (_ctx, next) => {
50
+ lastUpdateAt = Date.now();
51
+ await next();
52
+ });
53
+ const runner = run(bot, { runner: {
54
+ fetch: { timeout: 30 },
55
+ silent: true,
56
+ maxRetryTime: Number.POSITIVE_INFINITY,
57
+ retryInterval: "exponential"
58
+ } });
59
+ const watchdog = setInterval(() => {
60
+ const idleMs = Date.now() - lastUpdateAt;
61
+ if (idleMs < stallThresholdMs) return;
62
+ log.warn({
63
+ accountId,
64
+ idleMs,
65
+ stallThresholdMs
66
+ }, "Telegram polling stall detected; restarting runner");
67
+ lastUpdateAt = Date.now();
68
+ restartRunner(runner, accountId).catch((err) => {
69
+ log.error({
70
+ err,
71
+ accountId
72
+ }, "Telegram polling restart failed");
73
+ });
74
+ }, WATCHDOG_INTERVAL_MS);
75
+ watchdog.unref?.();
76
+ attachRunnerExit(runner, accountId, options.onExit);
77
+ return { stop: async () => {
78
+ clearInterval(watchdog);
79
+ await runner.stop();
80
+ } };
81
+ }
82
+ async function restartRunner(runner, accountId) {
83
+ try {
84
+ await runner.stop();
85
+ runner.start();
86
+ log.info({ accountId }, "Telegram polling runner restarted");
87
+ } catch (err) {
88
+ if (isRecoverableTelegramNetworkError(err)) {
89
+ log.warn({
90
+ err,
91
+ accountId
92
+ }, "Telegram polling restart hit network error");
93
+ return;
94
+ }
95
+ throw err;
96
+ }
97
+ }
98
+ async function attachRunnerExit(runner, accountId, onExit) {
99
+ const task = runner.task();
100
+ if (!task) return;
101
+ task.catch((err) => {
102
+ log.error({
103
+ err,
104
+ accountId
105
+ }, "Telegram polling runner exited");
106
+ onExit?.(err);
107
+ });
108
+ }
109
+ //#endregion
110
+ export { resolvePollingStallThresholdMs, startTelegramPollingSession, wireTelegramUpdateOffsetPersistence };
111
+
112
+ //# sourceMappingURL=polling-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling-session.js","names":[],"sources":["../../../../extensions/telegram/src/polling-session.ts"],"sourcesContent":["import type { Bot } from 'grammy';\nimport { run, type RunnerHandle } from '@grammyjs/runner';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport { isRecoverableTelegramNetworkError } from './network-errors.js';\nimport { readTelegramUpdateOffset, writeTelegramUpdateOffset } from './update-offset-store.js';\n\nconst log = createLogger('TelegramPolling');\n\nconst DEFAULT_STALL_THRESHOLD_MS = 120_000;\nconst MIN_STALL_THRESHOLD_MS = 30_000;\nconst MAX_STALL_THRESHOLD_MS = 600_000;\nconst WATCHDOG_INTERVAL_MS = 30_000;\n\nexport function resolvePollingStallThresholdMs(value?: number): number {\n if (value == null || !Number.isFinite(value)) return DEFAULT_STALL_THRESHOLD_MS;\n return Math.min(MAX_STALL_THRESHOLD_MS, Math.max(MIN_STALL_THRESHOLD_MS, Math.floor(value)));\n}\n\nexport interface TelegramPollingSessionOptions {\n accountId: string;\n botToken: string;\n bot: Bot;\n stallThresholdMs?: number;\n onExit?: (err?: unknown) => void;\n}\n\nexport interface TelegramPollingSession {\n stop: () => Promise<void>;\n}\n\nexport function wireTelegramUpdateOffsetPersistence(\n bot: Bot,\n params: { accountId: string; botToken: string },\n): void {\n const savedOffset = readTelegramUpdateOffset(params);\n if (savedOffset != null) {\n let restored = false;\n bot.api.config.use(async (prev, method, payload, signal) => {\n if (method === 'getUpdates' && !restored) {\n restored = true;\n const nextPayload = { ...(payload as object), offset: savedOffset + 1 } as typeof payload;\n return prev(method, nextPayload, signal);\n }\n return prev(method, payload, signal);\n });\n }\n\n bot.use(async (ctx, next) => {\n const updateId = ctx.update.update_id;\n if (Number.isSafeInteger(updateId)) {\n writeTelegramUpdateOffset({ ...params, lastUpdateId: updateId });\n }\n await next();\n });\n}\n\nexport function startTelegramPollingSession(\n options: TelegramPollingSessionOptions,\n): TelegramPollingSession {\n const { accountId, botToken, bot } = options;\n const stallThresholdMs = resolvePollingStallThresholdMs(options.stallThresholdMs);\n\n wireTelegramUpdateOffsetPersistence(bot, { accountId, botToken });\n\n let lastUpdateAt = Date.now();\n bot.use(async (_ctx, next) => {\n lastUpdateAt = Date.now();\n await next();\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 const watchdog = setInterval(() => {\n const idleMs = Date.now() - lastUpdateAt;\n if (idleMs < stallThresholdMs) return;\n log.warn({ accountId, idleMs, stallThresholdMs }, 'Telegram polling stall detected; restarting runner');\n lastUpdateAt = Date.now();\n void restartRunner(runner, accountId).catch((err) => {\n log.error({ err, accountId }, 'Telegram polling restart failed');\n });\n }, WATCHDOG_INTERVAL_MS);\n watchdog.unref?.();\n\n void attachRunnerExit(runner, accountId, options.onExit);\n\n return {\n stop: async () => {\n clearInterval(watchdog);\n await runner.stop();\n },\n };\n}\n\nasync function restartRunner(runner: RunnerHandle, accountId: string): Promise<void> {\n try {\n await runner.stop();\n runner.start();\n log.info({ accountId }, 'Telegram polling runner restarted');\n } catch (err) {\n if (isRecoverableTelegramNetworkError(err)) {\n log.warn({ err, accountId }, 'Telegram polling restart hit network error');\n return;\n }\n throw err;\n }\n}\n\nasync function attachRunnerExit(\n runner: RunnerHandle,\n accountId: string,\n onExit?: (err?: unknown) => void,\n): Promise<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 onExit?.(err);\n });\n}\n"],"mappings":";;;;;;aAE4D;AAI5D,MAAM,MAAM,aAAa,kBAAkB;AAE3C,MAAM,6BAA6B;AACnC,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAE7B,SAAgB,+BAA+B,OAAwB;AACrE,KAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,MAAM,CAAE,QAAO;AACrD,QAAO,KAAK,IAAI,wBAAwB,KAAK,IAAI,wBAAwB,KAAK,MAAM,MAAM,CAAC,CAAC;;AAe9F,SAAgB,oCACd,KACA,QACM;CACN,MAAM,cAAc,yBAAyB,OAAO;AACpD,KAAI,eAAe,MAAM;EACvB,IAAI,WAAW;AACf,MAAI,IAAI,OAAO,IAAI,OAAO,MAAM,QAAQ,SAAS,WAAW;AAC1D,OAAI,WAAW,gBAAgB,CAAC,UAAU;AACxC,eAAW;AAEX,WAAO,KAAK,QAAQ;KADE,GAAI;KAAoB,QAAQ,cAAc;KACrC,EAAE,OAAO;;AAE1C,UAAO,KAAK,QAAQ,SAAS,OAAO;IACpC;;AAGJ,KAAI,IAAI,OAAO,KAAK,SAAS;EAC3B,MAAM,WAAW,IAAI,OAAO;AAC5B,MAAI,OAAO,cAAc,SAAS,CAChC,2BAA0B;GAAE,GAAG;GAAQ,cAAc;GAAU,CAAC;AAElE,QAAM,MAAM;GACZ;;AAGJ,SAAgB,4BACd,SACwB;CACxB,MAAM,EAAE,WAAW,UAAU,QAAQ;CACrC,MAAM,mBAAmB,+BAA+B,QAAQ,iBAAiB;AAEjF,qCAAoC,KAAK;EAAE;EAAW;EAAU,CAAC;CAEjE,IAAI,eAAe,KAAK,KAAK;AAC7B,KAAI,IAAI,OAAO,MAAM,SAAS;AAC5B,iBAAe,KAAK,KAAK;AACzB,QAAM,MAAM;GACZ;CAEF,MAAM,SAAS,IAAI,KAAK,EACtB,QAAQ;EACN,OAAO,EAAE,SAAS,IAAI;EACtB,QAAQ;EACR,cAAc,OAAO;EACrB,eAAe;EAChB,EACF,CAAC;CAEF,MAAM,WAAW,kBAAkB;EACjC,MAAM,SAAS,KAAK,KAAK,GAAG;AAC5B,MAAI,SAAS,iBAAkB;AAC/B,MAAI,KAAK;GAAE;GAAW;GAAQ;GAAkB,EAAE,qDAAqD;AACvG,iBAAe,KAAK,KAAK;AACpB,gBAAc,QAAQ,UAAU,CAAC,OAAO,QAAQ;AACnD,OAAI,MAAM;IAAE;IAAK;IAAW,EAAE,kCAAkC;IAChE;IACD,qBAAqB;AACxB,UAAS,SAAS;AAEb,kBAAiB,QAAQ,WAAW,QAAQ,OAAO;AAExD,QAAO,EACL,MAAM,YAAY;AAChB,gBAAc,SAAS;AACvB,QAAM,OAAO,MAAM;IAEtB;;AAGH,eAAe,cAAc,QAAsB,WAAkC;AACnF,KAAI;AACF,QAAM,OAAO,MAAM;AACnB,SAAO,OAAO;AACd,MAAI,KAAK,EAAE,WAAW,EAAE,oCAAoC;UACrD,KAAK;AACZ,MAAI,kCAAkC,IAAI,EAAE;AAC1C,OAAI,KAAK;IAAE;IAAK;IAAW,EAAE,6CAA6C;AAC1E;;AAEF,QAAM;;;AAIV,eAAe,iBACb,QACA,WACA,QACe;CACf,MAAM,OAAO,OAAO,MAAM;AAC1B,KAAI,CAAC,KAAM;AACN,MAAK,OAAO,QAAQ;AACvB,MAAI,MAAM;GAAE;GAAK;GAAW,EAAE,iCAAiC;AAC/D,WAAS,IAAI;GACb"}
@@ -0,0 +1,2 @@
1
+ /** Build a fetch compatible with grammY client when an HTTP proxy is configured. */
2
+ export declare function createProxyFetch(proxyUrl: string): typeof fetch;
@@ -0,0 +1,14 @@
1
+ import { ProxyAgent, fetch } from "undici";
2
+ //#region extensions/telegram/src/proxy-fetch.ts
3
+ /** Build a fetch compatible with grammY client when an HTTP proxy is configured. */
4
+ function createProxyFetch(proxyUrl) {
5
+ const agent = new ProxyAgent(proxyUrl);
6
+ return ((input, init) => fetch(input, {
7
+ ...init,
8
+ dispatcher: agent
9
+ }));
10
+ }
11
+ //#endregion
12
+ export { createProxyFetch };
13
+
14
+ //# sourceMappingURL=proxy-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-fetch.js","names":["undiciFetch"],"sources":["../../../../extensions/telegram/src/proxy-fetch.ts"],"sourcesContent":["import { ProxyAgent, fetch as undiciFetch } from 'undici';\n\n/** Build a fetch compatible with grammY client when an HTTP proxy is configured. */\nexport function createProxyFetch(proxyUrl: string): typeof fetch {\n const agent = new ProxyAgent(proxyUrl);\n return ((input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) =>\n undiciFetch(input as string, {\n ...(init as Record<string, unknown>),\n dispatcher: agent,\n }) as unknown as Promise<Response>) as typeof fetch;\n}\n"],"mappings":";;;AAGA,SAAgB,iBAAiB,UAAgC;CAC/D,MAAM,QAAQ,IAAI,WAAW,SAAS;AACtC,UAAS,OAAoC,SAC3CA,MAAY,OAAiB;EAC3B,GAAI;EACJ,YAAY;EACb,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Bot, Context } from 'grammy';
2
+ import type { MessageBus } from '@xopcai/xopc/infra/bus/index.js';
3
+ export declare function sendTelegramAckReaction(params: {
4
+ bot: Bot;
5
+ chatId: number | string;
6
+ messageId: number;
7
+ emoji: string;
8
+ }): Promise<void>;
9
+ export declare function handleTelegramMessageReaction(params: {
10
+ ctx: Context;
11
+ accountId: string;
12
+ bus: MessageBus;
13
+ mode?: 'off' | 'own' | 'all';
14
+ }): Promise<void>;
@@ -0,0 +1,48 @@
1
+ import { createLogger } from "../../../src/utils/logger/index.js";
2
+ import { init_logger } from "../../../src/utils/logger.js";
3
+ import { sentMessageCache } from "./sent-cache.js";
4
+ //#region extensions/telegram/src/reactions.ts
5
+ init_logger();
6
+ const log = createLogger("TelegramReactions");
7
+ async function sendTelegramAckReaction(params) {
8
+ try {
9
+ await params.bot.api.setMessageReaction(params.chatId, params.messageId, [{
10
+ type: "emoji",
11
+ emoji: params.emoji
12
+ }]);
13
+ } catch (err) {
14
+ log.debug({
15
+ err,
16
+ chatId: params.chatId,
17
+ messageId: params.messageId
18
+ }, "Ack reaction failed");
19
+ }
20
+ }
21
+ async function handleTelegramMessageReaction(params) {
22
+ const { ctx, accountId, bus } = params;
23
+ const mode = params.mode ?? "own";
24
+ if (mode === "off") return;
25
+ const update = ctx.messageReaction ?? ctx.update.message_reaction;
26
+ if (!update) return;
27
+ const chatId = update.chat.id;
28
+ const messageId = update.message_id;
29
+ if (mode === "own" && !sentMessageCache.wasSentByBot(String(chatId), messageId)) return;
30
+ const added = update.new_reaction?.map((r) => "emoji" in r ? r.emoji : r.type).join(", ");
31
+ if (!added) return;
32
+ await bus.publishInbound({
33
+ channel: "telegram",
34
+ chat_id: String(chatId),
35
+ sender_id: String(update.user?.id ?? update.actor_chat?.id ?? ""),
36
+ content: `[Reaction] ${added} on message ${messageId}`,
37
+ metadata: {
38
+ accountId,
39
+ messageId: String(messageId),
40
+ isReaction: true,
41
+ reaction: added
42
+ }
43
+ });
44
+ }
45
+ //#endregion
46
+ export { handleTelegramMessageReaction, sendTelegramAckReaction };
47
+
48
+ //# sourceMappingURL=reactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.js","names":[],"sources":["../../../../extensions/telegram/src/reactions.ts"],"sourcesContent":["import type { Bot, Context } from 'grammy';\nimport type { MessageBus } from '@xopcai/xopc/infra/bus/index.js';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport { sentMessageCache } from './sent-cache.js';\n\nconst log = createLogger('TelegramReactions');\n\nexport async function sendTelegramAckReaction(params: {\n bot: Bot;\n chatId: number | string;\n messageId: number;\n emoji: string;\n}): Promise<void> {\n try {\n await params.bot.api.setMessageReaction(params.chatId, params.messageId, [\n { type: 'emoji', emoji: params.emoji as '👀' },\n ]);\n } catch (err) {\n log.debug({ err, chatId: params.chatId, messageId: params.messageId }, 'Ack reaction failed');\n }\n}\n\nexport async function handleTelegramMessageReaction(params: {\n ctx: Context;\n accountId: string;\n bus: MessageBus;\n mode?: 'off' | 'own' | 'all';\n}): Promise<void> {\n const { ctx, accountId, bus } = params;\n const mode = params.mode ?? 'own';\n if (mode === 'off') return;\n\n const update = ctx.messageReaction ?? (ctx.update as { message_reaction?: typeof ctx.messageReaction }).message_reaction;\n if (!update) return;\n\n const chatId = update.chat.id;\n const messageId = update.message_id;\n if (mode === 'own' && !sentMessageCache.wasSentByBot(String(chatId), messageId)) {\n return;\n }\n\n const added = update.new_reaction?.map((r) => ('emoji' in r ? r.emoji : r.type)).join(', ');\n if (!added) return;\n\n await bus.publishInbound({\n channel: 'telegram',\n chat_id: String(chatId),\n sender_id: String(update.user?.id ?? update.actor_chat?.id ?? ''),\n content: `[Reaction] ${added} on message ${messageId}`,\n metadata: {\n accountId,\n messageId: String(messageId),\n isReaction: true,\n reaction: added,\n },\n });\n}\n"],"mappings":";;;;aAE4D;AAG5D,MAAM,MAAM,aAAa,oBAAoB;AAE7C,eAAsB,wBAAwB,QAK5B;AAChB,KAAI;AACF,QAAM,OAAO,IAAI,IAAI,mBAAmB,OAAO,QAAQ,OAAO,WAAW,CACvE;GAAE,MAAM;GAAS,OAAO,OAAO;GAAe,CAC/C,CAAC;UACK,KAAK;AACZ,MAAI,MAAM;GAAE;GAAK,QAAQ,OAAO;GAAQ,WAAW,OAAO;GAAW,EAAE,sBAAsB;;;AAIjG,eAAsB,8BAA8B,QAKlC;CAChB,MAAM,EAAE,KAAK,WAAW,QAAQ;CAChC,MAAM,OAAO,OAAO,QAAQ;AAC5B,KAAI,SAAS,MAAO;CAEpB,MAAM,SAAS,IAAI,mBAAoB,IAAI,OAA6D;AACxG,KAAI,CAAC,OAAQ;CAEb,MAAM,SAAS,OAAO,KAAK;CAC3B,MAAM,YAAY,OAAO;AACzB,KAAI,SAAS,SAAS,CAAC,iBAAiB,aAAa,OAAO,OAAO,EAAE,UAAU,CAC7E;CAGF,MAAM,QAAQ,OAAO,cAAc,KAAK,MAAO,WAAW,IAAI,EAAE,QAAQ,EAAE,KAAM,CAAC,KAAK,KAAK;AAC3F,KAAI,CAAC,MAAO;AAEZ,OAAM,IAAI,eAAe;EACvB,SAAS;EACT,SAAS,OAAO,OAAO;EACvB,WAAW,OAAO,OAAO,MAAM,MAAM,OAAO,YAAY,MAAM,GAAG;EACjE,SAAS,cAAc,MAAM,cAAc;EAC3C,UAAU;GACR;GACA,WAAW,OAAO,UAAU;GAC5B,YAAY;GACZ,UAAU;GACX;EACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReplyToMode } from '@xopcai/xopc/channels/channel-domain.js';
2
+ /** Per-chat tracker so `replyToMode: first` only applies reply once per inbound turn. */
3
+ export declare class TelegramReplyTracker {
4
+ private firstUsed;
5
+ private key;
6
+ reset(accountId: string, chatId: string): void;
7
+ resolveReplyToMessageId(params: {
8
+ mode?: ReplyToMode;
9
+ explicitReplyTo?: string;
10
+ inboundMessageId?: string;
11
+ accountId: string;
12
+ chatId: string;
13
+ }): string | undefined;
14
+ }
15
+ export declare const telegramReplyTracker: TelegramReplyTracker;
@@ -0,0 +1,28 @@
1
+ //#region extensions/telegram/src/reply-params.ts
2
+ /** Per-chat tracker so `replyToMode: first` only applies reply once per inbound turn. */
3
+ var TelegramReplyTracker = class {
4
+ firstUsed = /* @__PURE__ */ new Set();
5
+ key(accountId, chatId) {
6
+ return `${accountId}:${chatId}`;
7
+ }
8
+ reset(accountId, chatId) {
9
+ this.firstUsed.delete(this.key(accountId, chatId));
10
+ }
11
+ resolveReplyToMessageId(params) {
12
+ const mode = params.mode ?? "off";
13
+ if (params.explicitReplyTo?.trim()) return params.explicitReplyTo.trim();
14
+ const inbound = params.inboundMessageId?.trim();
15
+ if (!inbound) return void 0;
16
+ if (mode === "off") return void 0;
17
+ if (mode === "all") return inbound;
18
+ const k = this.key(params.accountId, params.chatId);
19
+ if (this.firstUsed.has(k)) return void 0;
20
+ this.firstUsed.add(k);
21
+ return inbound;
22
+ }
23
+ };
24
+ const telegramReplyTracker = new TelegramReplyTracker();
25
+ //#endregion
26
+ export { TelegramReplyTracker, telegramReplyTracker };
27
+
28
+ //# sourceMappingURL=reply-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-params.js","names":[],"sources":["../../../../extensions/telegram/src/reply-params.ts"],"sourcesContent":["import type { ReplyToMode } from '@xopcai/xopc/channels/channel-domain.js';\n\n/** Per-chat tracker so `replyToMode: first` only applies reply once per inbound turn. */\nexport class TelegramReplyTracker {\n private firstUsed = new Set<string>();\n\n private key(accountId: string, chatId: string): string {\n return `${accountId}:${chatId}`;\n }\n\n reset(accountId: string, chatId: string): void {\n this.firstUsed.delete(this.key(accountId, chatId));\n }\n\n resolveReplyToMessageId(params: {\n mode?: ReplyToMode;\n explicitReplyTo?: string;\n inboundMessageId?: string;\n accountId: string;\n chatId: string;\n }): string | undefined {\n const mode = params.mode ?? 'off';\n if (params.explicitReplyTo?.trim()) {\n return params.explicitReplyTo.trim();\n }\n const inbound = params.inboundMessageId?.trim();\n if (!inbound) return undefined;\n\n if (mode === 'off') return undefined;\n if (mode === 'all') return inbound;\n\n const k = this.key(params.accountId, params.chatId);\n if (this.firstUsed.has(k)) return undefined;\n this.firstUsed.add(k);\n return inbound;\n }\n}\n\nexport const telegramReplyTracker = new TelegramReplyTracker();\n"],"mappings":";;AAGA,IAAa,uBAAb,MAAkC;CAChC,4BAAoB,IAAI,KAAa;CAErC,IAAY,WAAmB,QAAwB;AACrD,SAAO,GAAG,UAAU,GAAG;;CAGzB,MAAM,WAAmB,QAAsB;AAC7C,OAAK,UAAU,OAAO,KAAK,IAAI,WAAW,OAAO,CAAC;;CAGpD,wBAAwB,QAMD;EACrB,MAAM,OAAO,OAAO,QAAQ;AAC5B,MAAI,OAAO,iBAAiB,MAAM,CAChC,QAAO,OAAO,gBAAgB,MAAM;EAEtC,MAAM,UAAU,OAAO,kBAAkB,MAAM;AAC/C,MAAI,CAAC,QAAS,QAAO,KAAA;AAErB,MAAI,SAAS,MAAO,QAAO,KAAA;AAC3B,MAAI,SAAS,MAAO,QAAO;EAE3B,MAAM,IAAI,KAAK,IAAI,OAAO,WAAW,OAAO,OAAO;AACnD,MAAI,KAAK,UAAU,IAAI,EAAE,CAAE,QAAO,KAAA;AAClC,OAAK,UAAU,IAAI,EAAE;AACrB,SAAO;;;AAIX,MAAa,uBAAuB,IAAI,sBAAsB"}
@@ -0,0 +1,3 @@
1
+ /** Detect Telegram Bot API 401 Unauthorized (invalid/revoked token). */
2
+ export declare function isTelegramUnauthorizedTokenError(err: unknown): boolean;
3
+ export declare function formatTelegramStartupError(err: unknown): string;
@@ -0,0 +1,27 @@
1
+ //#region extensions/telegram/src/startup-errors.ts
2
+ /** Detect Telegram Bot API 401 Unauthorized (invalid/revoked token). */
3
+ function isTelegramUnauthorizedTokenError(err) {
4
+ const text = extractErrorText(err);
5
+ if (!text) return false;
6
+ if (/401/.test(text) && /unauthorized/i.test(text)) return true;
7
+ if (/401:\s*Unauthorized/i.test(text)) return true;
8
+ return false;
9
+ }
10
+ function formatTelegramStartupError(err) {
11
+ const text = extractErrorText(err);
12
+ if (isTelegramUnauthorizedTokenError(err)) return "Telegram bot token rejected (401 Unauthorized). Check the token with BotFather or update tokenFile.";
13
+ return text || "Unknown startup error";
14
+ }
15
+ function extractErrorText(err) {
16
+ if (typeof err === "string") return err;
17
+ if (err instanceof Error) return err.message;
18
+ if (err && typeof err === "object" && "description" in err) {
19
+ const d = err.description;
20
+ return typeof d === "string" ? d : "";
21
+ }
22
+ return String(err);
23
+ }
24
+ //#endregion
25
+ export { formatTelegramStartupError, isTelegramUnauthorizedTokenError };
26
+
27
+ //# sourceMappingURL=startup-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-errors.js","names":[],"sources":["../../../../extensions/telegram/src/startup-errors.ts"],"sourcesContent":["/** Detect Telegram Bot API 401 Unauthorized (invalid/revoked token). */\nexport function isTelegramUnauthorizedTokenError(err: unknown): boolean {\n const text = extractErrorText(err);\n if (!text) return false;\n if (/401/.test(text) && /unauthorized/i.test(text)) return true;\n if (/401:\\s*Unauthorized/i.test(text)) return true;\n return false;\n}\n\nexport function formatTelegramStartupError(err: unknown): string {\n const text = extractErrorText(err);\n if (isTelegramUnauthorizedTokenError(err)) {\n return 'Telegram bot token rejected (401 Unauthorized). Check the token with BotFather or update tokenFile.';\n }\n return text || 'Unknown startup error';\n}\n\nfunction extractErrorText(err: unknown): string {\n if (typeof err === 'string') return err;\n if (err instanceof Error) return err.message;\n if (err && typeof err === 'object' && 'description' in err) {\n const d = (err as { description?: unknown }).description;\n return typeof d === 'string' ? d : '';\n }\n return String(err);\n}\n"],"mappings":";;AACA,SAAgB,iCAAiC,KAAuB;CACtE,MAAM,OAAO,iBAAiB,IAAI;AAClC,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,MAAM,KAAK,KAAK,IAAI,gBAAgB,KAAK,KAAK,CAAE,QAAO;AAC3D,KAAI,uBAAuB,KAAK,KAAK,CAAE,QAAO;AAC9C,QAAO;;AAGT,SAAgB,2BAA2B,KAAsB;CAC/D,MAAM,OAAO,iBAAiB,IAAI;AAClC,KAAI,iCAAiC,IAAI,CACvC,QAAO;AAET,QAAO,QAAQ;;AAGjB,SAAS,iBAAiB,KAAsB;AAC9C,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,eAAe,MAAO,QAAO,IAAI;AACrC,KAAI,OAAO,OAAO,QAAQ,YAAY,iBAAiB,KAAK;EAC1D,MAAM,IAAK,IAAkC;AAC7C,SAAO,OAAO,MAAM,WAAW,IAAI;;AAErC,QAAO,OAAO,IAAI"}
@@ -0,0 +1,25 @@
1
+ import type { Bot } from 'grammy';
2
+ export declare function telegramSetReaction(params: {
3
+ bot: Bot;
4
+ chatId: string;
5
+ messageId: number;
6
+ emoji: string;
7
+ }): Promise<boolean>;
8
+ export declare function telegramEditMessage(params: {
9
+ bot: Bot;
10
+ chatId: string;
11
+ messageId: number;
12
+ text: string;
13
+ }): Promise<boolean>;
14
+ export declare function telegramDeleteMessage(params: {
15
+ bot: Bot;
16
+ chatId: string;
17
+ messageId: number;
18
+ }): Promise<boolean>;
19
+ export declare function telegramSendPoll(params: {
20
+ bot: Bot;
21
+ chatId: string;
22
+ question: string;
23
+ options: string[];
24
+ threadId?: number;
25
+ }): Promise<number | undefined>;
@@ -0,0 +1,65 @@
1
+ import { createLogger } from "../../../src/utils/logger/index.js";
2
+ import { init_logger } from "../../../src/utils/logger.js";
3
+ //#region extensions/telegram/src/telegram-actions.ts
4
+ init_logger();
5
+ const log = createLogger("TelegramActions");
6
+ async function telegramSetReaction(params) {
7
+ try {
8
+ await params.bot.api.setMessageReaction(params.chatId, params.messageId, [{
9
+ type: "emoji",
10
+ emoji: params.emoji
11
+ }]);
12
+ return true;
13
+ } catch (err) {
14
+ log.warn({
15
+ err,
16
+ chatId: params.chatId,
17
+ messageId: params.messageId
18
+ }, "setMessageReaction failed");
19
+ return false;
20
+ }
21
+ }
22
+ async function telegramEditMessage(params) {
23
+ try {
24
+ await params.bot.api.editMessageText(params.chatId, params.messageId, params.text);
25
+ return true;
26
+ } catch (err) {
27
+ log.warn({
28
+ err,
29
+ chatId: params.chatId,
30
+ messageId: params.messageId
31
+ }, "editMessageText failed");
32
+ return false;
33
+ }
34
+ }
35
+ async function telegramDeleteMessage(params) {
36
+ try {
37
+ await params.bot.api.deleteMessage(params.chatId, params.messageId);
38
+ return true;
39
+ } catch (err) {
40
+ log.warn({
41
+ err,
42
+ chatId: params.chatId,
43
+ messageId: params.messageId
44
+ }, "deleteMessage failed");
45
+ return false;
46
+ }
47
+ }
48
+ async function telegramSendPoll(params) {
49
+ try {
50
+ return (await params.bot.api.sendPoll(params.chatId, params.question, params.options, {
51
+ ...params.threadId ? { message_thread_id: params.threadId } : {},
52
+ is_anonymous: true
53
+ })).message_id;
54
+ } catch (err) {
55
+ log.warn({
56
+ err,
57
+ chatId: params.chatId
58
+ }, "sendPoll failed");
59
+ return;
60
+ }
61
+ }
62
+ //#endregion
63
+ export { telegramDeleteMessage, telegramEditMessage, telegramSendPoll, telegramSetReaction };
64
+
65
+ //# sourceMappingURL=telegram-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-actions.js","names":[],"sources":["../../../../extensions/telegram/src/telegram-actions.ts"],"sourcesContent":["import type { Bot } from 'grammy';\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\n\nconst log = createLogger('TelegramActions');\n\nexport async function telegramSetReaction(params: {\n bot: Bot;\n chatId: string;\n messageId: number;\n emoji: string;\n}): Promise<boolean> {\n try {\n await params.bot.api.setMessageReaction(params.chatId, params.messageId, [\n { type: 'emoji', emoji: params.emoji as '👍' },\n ]);\n return true;\n } catch (err) {\n log.warn({ err, chatId: params.chatId, messageId: params.messageId }, 'setMessageReaction failed');\n return false;\n }\n}\n\nexport async function telegramEditMessage(params: {\n bot: Bot;\n chatId: string;\n messageId: number;\n text: string;\n}): Promise<boolean> {\n try {\n await params.bot.api.editMessageText(params.chatId, params.messageId, params.text);\n return true;\n } catch (err) {\n log.warn({ err, chatId: params.chatId, messageId: params.messageId }, 'editMessageText failed');\n return false;\n }\n}\n\nexport async function telegramDeleteMessage(params: {\n bot: Bot;\n chatId: string;\n messageId: number;\n}): Promise<boolean> {\n try {\n await params.bot.api.deleteMessage(params.chatId, params.messageId);\n return true;\n } catch (err) {\n log.warn({ err, chatId: params.chatId, messageId: params.messageId }, 'deleteMessage failed');\n return false;\n }\n}\n\nexport async function telegramSendPoll(params: {\n bot: Bot;\n chatId: string;\n question: string;\n options: string[];\n threadId?: number;\n}): Promise<number | undefined> {\n try {\n const result = await params.bot.api.sendPoll(params.chatId, params.question, params.options, {\n ...(params.threadId ? { message_thread_id: params.threadId } : {}),\n is_anonymous: true,\n });\n return result.message_id;\n } catch (err) {\n log.warn({ err, chatId: params.chatId }, 'sendPoll failed');\n return undefined;\n }\n}\n"],"mappings":";;;aAC4D;AAE5D,MAAM,MAAM,aAAa,kBAAkB;AAE3C,eAAsB,oBAAoB,QAKrB;AACnB,KAAI;AACF,QAAM,OAAO,IAAI,IAAI,mBAAmB,OAAO,QAAQ,OAAO,WAAW,CACvE;GAAE,MAAM;GAAS,OAAO,OAAO;GAAe,CAC/C,CAAC;AACF,SAAO;UACA,KAAK;AACZ,MAAI,KAAK;GAAE;GAAK,QAAQ,OAAO;GAAQ,WAAW,OAAO;GAAW,EAAE,4BAA4B;AAClG,SAAO;;;AAIX,eAAsB,oBAAoB,QAKrB;AACnB,KAAI;AACF,QAAM,OAAO,IAAI,IAAI,gBAAgB,OAAO,QAAQ,OAAO,WAAW,OAAO,KAAK;AAClF,SAAO;UACA,KAAK;AACZ,MAAI,KAAK;GAAE;GAAK,QAAQ,OAAO;GAAQ,WAAW,OAAO;GAAW,EAAE,yBAAyB;AAC/F,SAAO;;;AAIX,eAAsB,sBAAsB,QAIvB;AACnB,KAAI;AACF,QAAM,OAAO,IAAI,IAAI,cAAc,OAAO,QAAQ,OAAO,UAAU;AACnE,SAAO;UACA,KAAK;AACZ,MAAI,KAAK;GAAE;GAAK,QAAQ,OAAO;GAAQ,WAAW,OAAO;GAAW,EAAE,uBAAuB;AAC7F,SAAO;;;AAIX,eAAsB,iBAAiB,QAMP;AAC9B,KAAI;AAKF,UAAO,MAJc,OAAO,IAAI,IAAI,SAAS,OAAO,QAAQ,OAAO,UAAU,OAAO,SAAS;GAC3F,GAAI,OAAO,WAAW,EAAE,mBAAmB,OAAO,UAAU,GAAG,EAAE;GACjE,cAAc;GACf,CAAC,EACY;UACP,KAAK;AACZ,MAAI,KAAK;GAAE;GAAK,QAAQ,OAAO;GAAQ,EAAE,kBAAkB;AAC3D"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Thread bindings (/focus) — scaffold for OpenClaw parity (Phase 4).
3
+ * Full implementation requires subagent spawn + session focus routing.
4
+ */
5
+ export interface TelegramThreadBinding {
6
+ sessionKey: string;
7
+ chatId: string;
8
+ threadId?: string;
9
+ createdAtMs: number;
10
+ lastActivityMs: number;
11
+ }
12
+ export declare function setTelegramThreadBinding(binding: TelegramThreadBinding): void;
13
+ export declare function getTelegramThreadBinding(chatId: string, threadId?: string): TelegramThreadBinding | undefined;
14
+ export declare function clearTelegramThreadBinding(chatId: string, threadId?: string): void;
15
+ export declare function sweepIdleTelegramThreadBindings(idleTimeoutMs: number): void;
@@ -0,0 +1,22 @@
1
+ //#region extensions/telegram/src/thread-bindings.ts
2
+ const bindings = /* @__PURE__ */ new Map();
3
+ function bindingKey(chatId, threadId) {
4
+ return threadId ? `${chatId}:topic:${threadId}` : chatId;
5
+ }
6
+ function setTelegramThreadBinding(binding) {
7
+ bindings.set(bindingKey(binding.chatId, binding.threadId), binding);
8
+ }
9
+ function getTelegramThreadBinding(chatId, threadId) {
10
+ return bindings.get(bindingKey(chatId, threadId));
11
+ }
12
+ function clearTelegramThreadBinding(chatId, threadId) {
13
+ bindings.delete(bindingKey(chatId, threadId));
14
+ }
15
+ function sweepIdleTelegramThreadBindings(idleTimeoutMs) {
16
+ const now = Date.now();
17
+ for (const [key, binding] of bindings) if (now - binding.lastActivityMs > idleTimeoutMs) bindings.delete(key);
18
+ }
19
+ //#endregion
20
+ export { clearTelegramThreadBinding, getTelegramThreadBinding, setTelegramThreadBinding, sweepIdleTelegramThreadBindings };
21
+
22
+ //# sourceMappingURL=thread-bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-bindings.js","names":[],"sources":["../../../../extensions/telegram/src/thread-bindings.ts"],"sourcesContent":["/**\n * Thread bindings (/focus) — scaffold for OpenClaw parity (Phase 4).\n * Full implementation requires subagent spawn + session focus routing.\n */\n\nexport interface TelegramThreadBinding {\n sessionKey: string;\n chatId: string;\n threadId?: string;\n createdAtMs: number;\n lastActivityMs: number;\n}\n\nconst bindings = new Map<string, TelegramThreadBinding>();\n\nfunction bindingKey(chatId: string, threadId?: string): string {\n return threadId ? `${chatId}:topic:${threadId}` : chatId;\n}\n\nexport function setTelegramThreadBinding(binding: TelegramThreadBinding): void {\n bindings.set(bindingKey(binding.chatId, binding.threadId), binding);\n}\n\nexport function getTelegramThreadBinding(chatId: string, threadId?: string): TelegramThreadBinding | undefined {\n return bindings.get(bindingKey(chatId, threadId));\n}\n\nexport function clearTelegramThreadBinding(chatId: string, threadId?: string): void {\n bindings.delete(bindingKey(chatId, threadId));\n}\n\nexport function sweepIdleTelegramThreadBindings(idleTimeoutMs: number): void {\n const now = Date.now();\n for (const [key, binding] of bindings) {\n if (now - binding.lastActivityMs > idleTimeoutMs) {\n bindings.delete(key);\n }\n }\n}\n"],"mappings":";AAaA,MAAM,2BAAW,IAAI,KAAoC;AAEzD,SAAS,WAAW,QAAgB,UAA2B;AAC7D,QAAO,WAAW,GAAG,OAAO,SAAS,aAAa;;AAGpD,SAAgB,yBAAyB,SAAsC;AAC7E,UAAS,IAAI,WAAW,QAAQ,QAAQ,QAAQ,SAAS,EAAE,QAAQ;;AAGrE,SAAgB,yBAAyB,QAAgB,UAAsD;AAC7G,QAAO,SAAS,IAAI,WAAW,QAAQ,SAAS,CAAC;;AAGnD,SAAgB,2BAA2B,QAAgB,UAAyB;AAClF,UAAS,OAAO,WAAW,QAAQ,SAAS,CAAC;;AAG/C,SAAgB,gCAAgC,eAA6B;CAC3E,MAAM,MAAM,KAAK,KAAK;AACtB,MAAK,MAAM,CAAC,KAAK,YAAY,SAC3B,KAAI,MAAM,QAAQ,iBAAiB,cACjC,UAAS,OAAO,IAAI"}
@@ -0,0 +1,8 @@
1
+ /** Resolve bot token from inline value or tokenFile path. */
2
+ export declare function resolveTelegramBotToken(params: {
3
+ botToken?: string;
4
+ tokenFile?: string;
5
+ }): {
6
+ token: string;
7
+ source: 'inline' | 'file' | 'none';
8
+ };
@@ -0,0 +1,34 @@
1
+ import { readFileSync } from "node:fs";
2
+ //#region extensions/telegram/src/token-resolver.ts
3
+ /** Resolve bot token from inline value or tokenFile path. */
4
+ function resolveTelegramBotToken(params) {
5
+ const inline = params.botToken?.trim() ?? "";
6
+ if (inline) return {
7
+ token: inline,
8
+ source: "inline"
9
+ };
10
+ const filePath = params.tokenFile?.trim();
11
+ if (!filePath) return {
12
+ token: "",
13
+ source: "none"
14
+ };
15
+ try {
16
+ const raw = readFileSync(filePath, "utf8").trim();
17
+ return raw ? {
18
+ token: raw,
19
+ source: "file"
20
+ } : {
21
+ token: "",
22
+ source: "none"
23
+ };
24
+ } catch {
25
+ return {
26
+ token: "",
27
+ source: "none"
28
+ };
29
+ }
30
+ }
31
+ //#endregion
32
+ export { resolveTelegramBotToken };
33
+
34
+ //# sourceMappingURL=token-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-resolver.js","names":[],"sources":["../../../../extensions/telegram/src/token-resolver.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\n/** Resolve bot token from inline value or tokenFile path. */\nexport function resolveTelegramBotToken(params: {\n botToken?: string;\n tokenFile?: string;\n}): { token: string; source: 'inline' | 'file' | 'none' } {\n const inline = params.botToken?.trim() ?? '';\n if (inline) {\n return { token: inline, source: 'inline' };\n }\n const filePath = params.tokenFile?.trim();\n if (!filePath) {\n return { token: '', source: 'none' };\n }\n try {\n const raw = readFileSync(filePath, 'utf8').trim();\n return raw ? { token: raw, source: 'file' } : { token: '', source: 'none' };\n } catch {\n return { token: '', source: 'none' };\n }\n}\n"],"mappings":";;;AAGA,SAAgB,wBAAwB,QAGkB;CACxD,MAAM,SAAS,OAAO,UAAU,MAAM,IAAI;AAC1C,KAAI,OACF,QAAO;EAAE,OAAO;EAAQ,QAAQ;EAAU;CAE5C,MAAM,WAAW,OAAO,WAAW,MAAM;AACzC,KAAI,CAAC,SACH,QAAO;EAAE,OAAO;EAAI,QAAQ;EAAQ;AAEtC,KAAI;EACF,MAAM,MAAM,aAAa,UAAU,OAAO,CAAC,MAAM;AACjD,SAAO,MAAM;GAAE,OAAO;GAAK,QAAQ;GAAQ,GAAG;GAAE,OAAO;GAAI,QAAQ;GAAQ;SACrE;AACN,SAAO;GAAE,OAAO;GAAI,QAAQ;GAAQ"}
@@ -0,0 +1,9 @@
1
+ export declare function readTelegramUpdateOffset(params: {
2
+ accountId?: string;
3
+ botToken?: string;
4
+ }): number | undefined;
5
+ export declare function writeTelegramUpdateOffset(params: {
6
+ accountId?: string;
7
+ botToken?: string;
8
+ lastUpdateId: number;
9
+ }): void;
@@ -0,0 +1,66 @@
1
+ import { resolveStateDir } from "../../../src/config/paths-state.js";
2
+ import { init_paths } from "../../../src/config/paths.js";
3
+ import { join } from "node:path";
4
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
5
+ //#region extensions/telegram/src/update-offset-store.ts
6
+ init_paths();
7
+ const STORE_VERSION = 2;
8
+ function normalizeAccountId(accountId) {
9
+ const trimmed = accountId?.trim();
10
+ if (!trimmed) return "default";
11
+ return trimmed.replace(/[^a-z0-9._-]+/gi, "_");
12
+ }
13
+ function resolveOffsetPath(accountId) {
14
+ const dir = join(resolveStateDir(), "telegram");
15
+ mkdirSync(dir, { recursive: true });
16
+ return join(dir, `update-offset-${normalizeAccountId(accountId)}.json`);
17
+ }
18
+ function extractBotIdFromToken(token) {
19
+ const trimmed = token?.trim();
20
+ if (!trimmed) return null;
21
+ const [rawBotId] = trimmed.split(":", 1);
22
+ if (!rawBotId || !/^\d+$/.test(rawBotId)) return null;
23
+ return rawBotId;
24
+ }
25
+ function safeParseState(raw) {
26
+ try {
27
+ const parsed = JSON.parse(raw);
28
+ if (parsed?.version !== STORE_VERSION && parsed?.version !== 1) return null;
29
+ if (parsed.lastUpdateId != null && (!Number.isSafeInteger(parsed.lastUpdateId) || parsed.lastUpdateId < 0)) return null;
30
+ return {
31
+ version: STORE_VERSION,
32
+ lastUpdateId: parsed.lastUpdateId ?? null,
33
+ botId: parsed.version === STORE_VERSION ? parsed.botId ?? null : null
34
+ };
35
+ } catch {
36
+ return null;
37
+ }
38
+ }
39
+ function readTelegramUpdateOffset(params) {
40
+ const path = resolveOffsetPath(params.accountId);
41
+ try {
42
+ const state = safeParseState(readFileSync(path, "utf8"));
43
+ if (!state || state.lastUpdateId == null) return void 0;
44
+ const botId = extractBotIdFromToken(params.botToken);
45
+ if (state.botId && botId && state.botId !== botId) return void 0;
46
+ return state.lastUpdateId;
47
+ } catch {
48
+ return;
49
+ }
50
+ }
51
+ function writeTelegramUpdateOffset(params) {
52
+ if (!Number.isSafeInteger(params.lastUpdateId) || params.lastUpdateId < 0) return;
53
+ const path = resolveOffsetPath(params.accountId);
54
+ const tmp = `${path}.tmp`;
55
+ const state = {
56
+ version: STORE_VERSION,
57
+ lastUpdateId: params.lastUpdateId,
58
+ botId: extractBotIdFromToken(params.botToken)
59
+ };
60
+ writeFileSync(tmp, JSON.stringify(state, null, 2), "utf8");
61
+ renameSync(tmp, path);
62
+ }
63
+ //#endregion
64
+ export { readTelegramUpdateOffset, writeTelegramUpdateOffset };
65
+
66
+ //# sourceMappingURL=update-offset-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-offset-store.js","names":[],"sources":["../../../../extensions/telegram/src/update-offset-store.ts"],"sourcesContent":["import { mkdirSync, readFileSync, writeFileSync, renameSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { resolveStateDir } from '@xopcai/xopc/config/paths.js';\n\nconst STORE_VERSION = 2;\n\ntype TelegramUpdateOffsetState = {\n version: number;\n lastUpdateId: number | null;\n botId: string | null;\n};\n\nfunction normalizeAccountId(accountId?: string): string {\n const trimmed = accountId?.trim();\n if (!trimmed) return 'default';\n return trimmed.replace(/[^a-z0-9._-]+/gi, '_');\n}\n\nfunction resolveOffsetPath(accountId?: string): string {\n const stateDir = resolveStateDir();\n const dir = join(stateDir, 'telegram');\n mkdirSync(dir, { recursive: true });\n return join(dir, `update-offset-${normalizeAccountId(accountId)}.json`);\n}\n\nfunction extractBotIdFromToken(token?: string): string | null {\n const trimmed = token?.trim();\n if (!trimmed) return null;\n const [rawBotId] = trimmed.split(':', 1);\n if (!rawBotId || !/^\\d+$/.test(rawBotId)) return null;\n return rawBotId;\n}\n\nfunction safeParseState(raw: string): TelegramUpdateOffsetState | null {\n try {\n const parsed = JSON.parse(raw) as {\n version?: number;\n lastUpdateId?: number | null;\n botId?: string | null;\n };\n if (parsed?.version !== STORE_VERSION && parsed?.version !== 1) return null;\n if (parsed.lastUpdateId != null && (!Number.isSafeInteger(parsed.lastUpdateId) || parsed.lastUpdateId < 0)) {\n return null;\n }\n return {\n version: STORE_VERSION,\n lastUpdateId: parsed.lastUpdateId ?? null,\n botId: parsed.version === STORE_VERSION ? (parsed.botId ?? null) : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function readTelegramUpdateOffset(params: {\n accountId?: string;\n botToken?: string;\n}): number | undefined {\n const path = resolveOffsetPath(params.accountId);\n try {\n const raw = readFileSync(path, 'utf8');\n const state = safeParseState(raw);\n if (!state || state.lastUpdateId == null) return undefined;\n const botId = extractBotIdFromToken(params.botToken);\n if (state.botId && botId && state.botId !== botId) return undefined;\n return state.lastUpdateId;\n } catch {\n return undefined;\n }\n}\n\nexport function writeTelegramUpdateOffset(params: {\n accountId?: string;\n botToken?: string;\n lastUpdateId: number;\n}): void {\n if (!Number.isSafeInteger(params.lastUpdateId) || params.lastUpdateId < 0) return;\n const path = resolveOffsetPath(params.accountId);\n const tmp = `${path}.tmp`;\n const state: TelegramUpdateOffsetState = {\n version: STORE_VERSION,\n lastUpdateId: params.lastUpdateId,\n botId: extractBotIdFromToken(params.botToken),\n };\n writeFileSync(tmp, JSON.stringify(state, null, 2), 'utf8');\n renameSync(tmp, path);\n}\n"],"mappings":";;;;;YAE+D;AAE/D,MAAM,gBAAgB;AAQtB,SAAS,mBAAmB,WAA4B;CACtD,MAAM,UAAU,WAAW,MAAM;AACjC,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,QAAQ,QAAQ,mBAAmB,IAAI;;AAGhD,SAAS,kBAAkB,WAA4B;CAErD,MAAM,MAAM,KADK,iBACQ,EAAE,WAAW;AACtC,WAAU,KAAK,EAAE,WAAW,MAAM,CAAC;AACnC,QAAO,KAAK,KAAK,iBAAiB,mBAAmB,UAAU,CAAC,OAAO;;AAGzE,SAAS,sBAAsB,OAA+B;CAC5D,MAAM,UAAU,OAAO,MAAM;AAC7B,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,CAAC,YAAY,QAAQ,MAAM,KAAK,EAAE;AACxC,KAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAE,QAAO;AACjD,QAAO;;AAGT,SAAS,eAAe,KAA+C;AACrE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAK9B,MAAI,QAAQ,YAAY,iBAAiB,QAAQ,YAAY,EAAG,QAAO;AACvE,MAAI,OAAO,gBAAgB,SAAS,CAAC,OAAO,cAAc,OAAO,aAAa,IAAI,OAAO,eAAe,GACtG,QAAO;AAET,SAAO;GACL,SAAS;GACT,cAAc,OAAO,gBAAgB;GACrC,OAAO,OAAO,YAAY,gBAAiB,OAAO,SAAS,OAAQ;GACpE;SACK;AACN,SAAO;;;AAIX,SAAgB,yBAAyB,QAGlB;CACrB,MAAM,OAAO,kBAAkB,OAAO,UAAU;AAChD,KAAI;EAEF,MAAM,QAAQ,eADF,aAAa,MAAM,OACC,CAAC;AACjC,MAAI,CAAC,SAAS,MAAM,gBAAgB,KAAM,QAAO,KAAA;EACjD,MAAM,QAAQ,sBAAsB,OAAO,SAAS;AACpD,MAAI,MAAM,SAAS,SAAS,MAAM,UAAU,MAAO,QAAO,KAAA;AAC1D,SAAO,MAAM;SACP;AACN;;;AAIJ,SAAgB,0BAA0B,QAIjC;AACP,KAAI,CAAC,OAAO,cAAc,OAAO,aAAa,IAAI,OAAO,eAAe,EAAG;CAC3E,MAAM,OAAO,kBAAkB,OAAO,UAAU;CAChD,MAAM,MAAM,GAAG,KAAK;CACpB,MAAM,QAAmC;EACvC,SAAS;EACT,cAAc,OAAO;EACrB,OAAO,sBAAsB,OAAO,SAAS;EAC9C;AACD,eAAc,KAAK,KAAK,UAAU,OAAO,MAAM,EAAE,EAAE,OAAO;AAC1D,YAAW,KAAK,KAAK"}
@@ -2,7 +2,7 @@
2
2
  "id": "telegram",
3
3
  "name": "Telegram Channel",
4
4
  "description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
5
- "version": "0.0.99",
5
+ "version": "0.0.100",
6
6
  "kind": "channel",
7
7
  "main": "src/index.ts",
8
8
  "channels": ["telegram"],