@5ss/ai-tools 2.11.1

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 (342) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +221 -0
  4. package/dist/ai-sdk/index.d.ts +15 -0
  5. package/dist/ai-sdk/index.d.ts.map +1 -0
  6. package/dist/ai-sdk/index.js +24 -0
  7. package/dist/ai-sdk/index.js.map +1 -0
  8. package/dist/artifact-D064mHfK.js +44 -0
  9. package/dist/artifact-D064mHfK.js.map +1 -0
  10. package/dist/artifacts-O8g-40Pw.js +404 -0
  11. package/dist/artifacts-O8g-40Pw.js.map +1 -0
  12. package/dist/aws-json-CecFqzqX.js +23 -0
  13. package/dist/aws-json-CecFqzqX.js.map +1 -0
  14. package/dist/aws-service-msttbPrz.js +58 -0
  15. package/dist/aws-service-msttbPrz.js.map +1 -0
  16. package/dist/batch-BMM5dXqL.d.ts +22 -0
  17. package/dist/batch-BMM5dXqL.d.ts.map +1 -0
  18. package/dist/batch-Co1ujeAW.js +67 -0
  19. package/dist/batch-Co1ujeAW.js.map +1 -0
  20. package/dist/bedrock-agentcore-browser-a_qOs-NR.js +182 -0
  21. package/dist/bedrock-agentcore-browser-a_qOs-NR.js.map +1 -0
  22. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js +357 -0
  23. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js.map +1 -0
  24. package/dist/bytes-BxpimpQx.js +45 -0
  25. package/dist/bytes-BxpimpQx.js.map +1 -0
  26. package/dist/client-CCKGsTeI.js +743 -0
  27. package/dist/client-CCKGsTeI.js.map +1 -0
  28. package/dist/cloudflare/index.d.ts +37 -0
  29. package/dist/cloudflare/index.d.ts.map +1 -0
  30. package/dist/cloudflare/index.js +41 -0
  31. package/dist/cloudflare/index.js.map +1 -0
  32. package/dist/cloudflare-browser-B6Yolpin.js +428 -0
  33. package/dist/cloudflare-browser-B6Yolpin.js.map +1 -0
  34. package/dist/cloudflare-email-Dy0KHeDf.js +197 -0
  35. package/dist/cloudflare-email-Dy0KHeDf.js.map +1 -0
  36. package/dist/cloudflare-sandbox-Dp_uNaqW.js +982 -0
  37. package/dist/cloudflare-sandbox-Dp_uNaqW.js.map +1 -0
  38. package/dist/content-type-CORxaxcv.js +49 -0
  39. package/dist/content-type-CORxaxcv.js.map +1 -0
  40. package/dist/core/index.d.ts +4 -0
  41. package/dist/core/index.js +204 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/define-CvpJ_pNP.js +115 -0
  44. package/dist/define-CvpJ_pNP.js.map +1 -0
  45. package/dist/errors-DoSpNHvs.js +20 -0
  46. package/dist/errors-DoSpNHvs.js.map +1 -0
  47. package/dist/errors-aKhko9T1.d.ts +18 -0
  48. package/dist/errors-aKhko9T1.d.ts.map +1 -0
  49. package/dist/eventbridge-scheduler-Bh6GqZY2.js +349 -0
  50. package/dist/eventbridge-scheduler-Bh6GqZY2.js.map +1 -0
  51. package/dist/framework-context-DVIIY8ZO.js +24 -0
  52. package/dist/framework-context-DVIIY8ZO.js.map +1 -0
  53. package/dist/gotenberg-NuJjxyln.js +291 -0
  54. package/dist/gotenberg-NuJjxyln.js.map +1 -0
  55. package/dist/http/index.d.ts +47 -0
  56. package/dist/http/index.d.ts.map +1 -0
  57. package/dist/http/index.js +3 -0
  58. package/dist/http-service-DDNCO1s4.js +254 -0
  59. package/dist/http-service-DDNCO1s4.js.map +1 -0
  60. package/dist/http-service-T7E5UjP8.d.ts +80 -0
  61. package/dist/http-service-T7E5UjP8.d.ts.map +1 -0
  62. package/dist/imessage-BSAFOI8Z.js +154 -0
  63. package/dist/imessage-BSAFOI8Z.js.map +1 -0
  64. package/dist/index-BU4gmYO8.d.ts +254 -0
  65. package/dist/index-BU4gmYO8.d.ts.map +1 -0
  66. package/dist/index-CCivzmxO.d.ts +188 -0
  67. package/dist/index-CCivzmxO.d.ts.map +1 -0
  68. package/dist/index-CLmTrcu5.d.ts +22 -0
  69. package/dist/index-CLmTrcu5.d.ts.map +1 -0
  70. package/dist/index-CZX5OeOF.d.ts +235 -0
  71. package/dist/index-CZX5OeOF.d.ts.map +1 -0
  72. package/dist/index-CdFmEfZO.d.ts +359 -0
  73. package/dist/index-CdFmEfZO.d.ts.map +1 -0
  74. package/dist/index-Cuh6eMWc.d.ts +285 -0
  75. package/dist/index-Cuh6eMWc.d.ts.map +1 -0
  76. package/dist/index-DuOGj7vc.d.ts +107 -0
  77. package/dist/index-DuOGj7vc.d.ts.map +1 -0
  78. package/dist/index-ccZ1XOHw.d.ts +69 -0
  79. package/dist/index-ccZ1XOHw.d.ts.map +1 -0
  80. package/dist/index-n8JTpNf1.d.ts +247 -0
  81. package/dist/index-n8JTpNf1.d.ts.map +1 -0
  82. package/dist/index-pwW1OsOx.d.ts +134 -0
  83. package/dist/index-pwW1OsOx.d.ts.map +1 -0
  84. package/dist/index-zK1ZwS4m.d.ts +347 -0
  85. package/dist/index-zK1ZwS4m.d.ts.map +1 -0
  86. package/dist/limits-hjrO8zUG.js +80 -0
  87. package/dist/limits-hjrO8zUG.js.map +1 -0
  88. package/dist/mastra/index.d.ts +14 -0
  89. package/dist/mastra/index.d.ts.map +1 -0
  90. package/dist/mastra/index.js +26 -0
  91. package/dist/mastra/index.js.map +1 -0
  92. package/dist/mastra-vector-Dhc6XZ8l.js +234 -0
  93. package/dist/mastra-vector-Dhc6XZ8l.js.map +1 -0
  94. package/dist/mcp/index.d.ts +80 -0
  95. package/dist/mcp/index.d.ts.map +1 -0
  96. package/dist/mcp/index.js +97 -0
  97. package/dist/mcp/index.js.map +1 -0
  98. package/dist/modules/artifacts/index.d.ts +337 -0
  99. package/dist/modules/artifacts/index.d.ts.map +1 -0
  100. package/dist/modules/artifacts/index.js +348 -0
  101. package/dist/modules/artifacts/index.js.map +1 -0
  102. package/dist/modules/browser/index.d.ts +516 -0
  103. package/dist/modules/browser/index.d.ts.map +1 -0
  104. package/dist/modules/browser/index.js +475 -0
  105. package/dist/modules/browser/index.js.map +1 -0
  106. package/dist/modules/calendar/index.d.ts +93 -0
  107. package/dist/modules/calendar/index.d.ts.map +1 -0
  108. package/dist/modules/calendar/index.js +131 -0
  109. package/dist/modules/calendar/index.js.map +1 -0
  110. package/dist/modules/code-sandbox/index.d.ts +317 -0
  111. package/dist/modules/code-sandbox/index.d.ts.map +1 -0
  112. package/dist/modules/code-sandbox/index.js +537 -0
  113. package/dist/modules/code-sandbox/index.js.map +1 -0
  114. package/dist/modules/content-type/index.d.ts +22 -0
  115. package/dist/modules/content-type/index.d.ts.map +1 -0
  116. package/dist/modules/content-type/index.js +66 -0
  117. package/dist/modules/content-type/index.js.map +1 -0
  118. package/dist/modules/crypto/index.d.ts +115 -0
  119. package/dist/modules/crypto/index.d.ts.map +1 -0
  120. package/dist/modules/crypto/index.js +139 -0
  121. package/dist/modules/crypto/index.js.map +1 -0
  122. package/dist/modules/document/index.d.ts +575 -0
  123. package/dist/modules/document/index.d.ts.map +1 -0
  124. package/dist/modules/document/index.js +444 -0
  125. package/dist/modules/document/index.js.map +1 -0
  126. package/dist/modules/document-extract/index.d.ts +438 -0
  127. package/dist/modules/document-extract/index.d.ts.map +1 -0
  128. package/dist/modules/document-extract/index.js +127 -0
  129. package/dist/modules/document-extract/index.js.map +1 -0
  130. package/dist/modules/document-render/index.d.ts +336 -0
  131. package/dist/modules/document-render/index.d.ts.map +1 -0
  132. package/dist/modules/document-render/index.js +155 -0
  133. package/dist/modules/document-render/index.js.map +1 -0
  134. package/dist/modules/email/index.d.ts +311 -0
  135. package/dist/modules/email/index.d.ts.map +1 -0
  136. package/dist/modules/email/index.js +167 -0
  137. package/dist/modules/email/index.js.map +1 -0
  138. package/dist/modules/email-message/index.d.ts +95 -0
  139. package/dist/modules/email-message/index.d.ts.map +1 -0
  140. package/dist/modules/email-message/index.js +264 -0
  141. package/dist/modules/email-message/index.js.map +1 -0
  142. package/dist/modules/file-convert/index.d.ts +273 -0
  143. package/dist/modules/file-convert/index.d.ts.map +1 -0
  144. package/dist/modules/file-convert/index.js +103 -0
  145. package/dist/modules/file-convert/index.js.map +1 -0
  146. package/dist/modules/files/index.d.ts +452 -0
  147. package/dist/modules/files/index.d.ts.map +1 -0
  148. package/dist/modules/files/index.js +733 -0
  149. package/dist/modules/files/index.js.map +1 -0
  150. package/dist/modules/image/index.d.ts +342 -0
  151. package/dist/modules/image/index.d.ts.map +1 -0
  152. package/dist/modules/image/index.js +281 -0
  153. package/dist/modules/image/index.js.map +1 -0
  154. package/dist/modules/messaging/index.d.ts +608 -0
  155. package/dist/modules/messaging/index.d.ts.map +1 -0
  156. package/dist/modules/messaging/index.js +1067 -0
  157. package/dist/modules/messaging/index.js.map +1 -0
  158. package/dist/modules/pdf/index.d.ts +287 -0
  159. package/dist/modules/pdf/index.d.ts.map +1 -0
  160. package/dist/modules/pdf/index.js +259 -0
  161. package/dist/modules/pdf/index.js.map +1 -0
  162. package/dist/modules/presentation/index.d.ts +247 -0
  163. package/dist/modules/presentation/index.d.ts.map +1 -0
  164. package/dist/modules/presentation/index.js +12657 -0
  165. package/dist/modules/presentation/index.js.map +1 -0
  166. package/dist/modules/queue/index.d.ts +129 -0
  167. package/dist/modules/queue/index.d.ts.map +1 -0
  168. package/dist/modules/queue/index.js +131 -0
  169. package/dist/modules/queue/index.js.map +1 -0
  170. package/dist/modules/rag/index.d.ts +250 -0
  171. package/dist/modules/rag/index.d.ts.map +1 -0
  172. package/dist/modules/rag/index.js +366 -0
  173. package/dist/modules/rag/index.js.map +1 -0
  174. package/dist/modules/scheduler/index.d.ts +216 -0
  175. package/dist/modules/scheduler/index.d.ts.map +1 -0
  176. package/dist/modules/scheduler/index.js +153 -0
  177. package/dist/modules/scheduler/index.js.map +1 -0
  178. package/dist/modules/skills/index.d.ts +205 -0
  179. package/dist/modules/skills/index.d.ts.map +1 -0
  180. package/dist/modules/skills/index.js +203 -0
  181. package/dist/modules/skills/index.js.map +1 -0
  182. package/dist/modules/tasks/index.d.ts +287 -0
  183. package/dist/modules/tasks/index.d.ts.map +1 -0
  184. package/dist/modules/tasks/index.js +207 -0
  185. package/dist/modules/tasks/index.js.map +1 -0
  186. package/dist/modules/vector-store/index.d.ts +3 -0
  187. package/dist/modules/vector-store/index.js +3 -0
  188. package/dist/modules/web-fetch/index.d.ts +99 -0
  189. package/dist/modules/web-fetch/index.d.ts.map +1 -0
  190. package/dist/modules/web-fetch/index.js +242 -0
  191. package/dist/modules/web-fetch/index.js.map +1 -0
  192. package/dist/object-artifact-store-CMTzCm_G.d.ts +7 -0
  193. package/dist/object-artifact-store-CMTzCm_G.d.ts.map +1 -0
  194. package/dist/object-artifact-store-wZ2j9cto.js +28 -0
  195. package/dist/object-artifact-store-wZ2j9cto.js.map +1 -0
  196. package/dist/pinecone-umY4t6OF.js +190 -0
  197. package/dist/pinecone-umY4t6OF.js.map +1 -0
  198. package/dist/provider-CgDAlg6K.js +34 -0
  199. package/dist/provider-CgDAlg6K.js.map +1 -0
  200. package/dist/qdrant-DMp4NhKR.js +253 -0
  201. package/dist/qdrant-DMp4NhKR.js.map +1 -0
  202. package/dist/resend-BAC38_dA.js +155 -0
  203. package/dist/resend-BAC38_dA.js.map +1 -0
  204. package/dist/s3-CsOaPWMP.js +955 -0
  205. package/dist/s3-CsOaPWMP.js.map +1 -0
  206. package/dist/schemas-ChOAhdo9.js +192 -0
  207. package/dist/schemas-ChOAhdo9.js.map +1 -0
  208. package/dist/slack-Di5BBNpt.js +1455 -0
  209. package/dist/slack-Di5BBNpt.js.map +1 -0
  210. package/dist/sqs-DCwS1i2N.js +225 -0
  211. package/dist/sqs-DCwS1i2N.js.map +1 -0
  212. package/dist/supabase-vector-Dpp9mmJR.js +218 -0
  213. package/dist/supabase-vector-Dpp9mmJR.js.map +1 -0
  214. package/dist/tanstack/index.d.ts +15 -0
  215. package/dist/tanstack/index.d.ts.map +1 -0
  216. package/dist/tanstack/index.js +28 -0
  217. package/dist/tanstack/index.js.map +1 -0
  218. package/dist/teams-DYAHNb39.js +835 -0
  219. package/dist/teams-DYAHNb39.js.map +1 -0
  220. package/dist/telegram-DDXWzkfL.js +734 -0
  221. package/dist/telegram-DDXWzkfL.js.map +1 -0
  222. package/dist/textract-CPLiB22H.js +554 -0
  223. package/dist/textract-CPLiB22H.js.map +1 -0
  224. package/dist/transport-B4vn-XiQ.js +157 -0
  225. package/dist/transport-B4vn-XiQ.js.map +1 -0
  226. package/dist/transport-i96ACAI_.d.ts +46 -0
  227. package/dist/transport-i96ACAI_.d.ts.map +1 -0
  228. package/dist/types-Ccb0DXY9.d.ts +150 -0
  229. package/dist/types-Ccb0DXY9.d.ts.map +1 -0
  230. package/dist/unique-EwBH1JPB.js +19 -0
  231. package/dist/unique-EwBH1JPB.js.map +1 -0
  232. package/dist/vector-store-C3nEO80e.js +193 -0
  233. package/dist/vector-store-C3nEO80e.js.map +1 -0
  234. package/dist/vendors/amazon-sp-api/index.d.ts +526 -0
  235. package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -0
  236. package/dist/vendors/amazon-sp-api/index.js +975 -0
  237. package/dist/vendors/amazon-sp-api/index.js.map +1 -0
  238. package/dist/vendors/bedrock-agentcore-browser/index.d.ts +2 -0
  239. package/dist/vendors/bedrock-agentcore-browser/index.js +2 -0
  240. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +228 -0
  241. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts.map +1 -0
  242. package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +2 -0
  243. package/dist/vendors/cloudflare-browser/index.d.ts +2 -0
  244. package/dist/vendors/cloudflare-browser/index.js +2 -0
  245. package/dist/vendors/cloudflare-email/index.d.ts +260 -0
  246. package/dist/vendors/cloudflare-email/index.d.ts.map +1 -0
  247. package/dist/vendors/cloudflare-email/index.js +3 -0
  248. package/dist/vendors/cloudflare-sandbox/index.d.ts +565 -0
  249. package/dist/vendors/cloudflare-sandbox/index.d.ts.map +1 -0
  250. package/dist/vendors/cloudflare-sandbox/index.js +2 -0
  251. package/dist/vendors/eventbridge-scheduler/index.d.ts +2 -0
  252. package/dist/vendors/eventbridge-scheduler/index.js +2 -0
  253. package/dist/vendors/gotenberg/index.d.ts +306 -0
  254. package/dist/vendors/gotenberg/index.d.ts.map +1 -0
  255. package/dist/vendors/gotenberg/index.js +2 -0
  256. package/dist/vendors/imessage/index.d.ts +420 -0
  257. package/dist/vendors/imessage/index.d.ts.map +1 -0
  258. package/dist/vendors/imessage/index.js +4 -0
  259. package/dist/vendors/katana/index.d.ts +1570 -0
  260. package/dist/vendors/katana/index.d.ts.map +1 -0
  261. package/dist/vendors/katana/index.js +1639 -0
  262. package/dist/vendors/katana/index.js.map +1 -0
  263. package/dist/vendors/mastra-vector/index.d.ts +120 -0
  264. package/dist/vendors/mastra-vector/index.d.ts.map +1 -0
  265. package/dist/vendors/mastra-vector/index.js +3 -0
  266. package/dist/vendors/pinecone/index.d.ts +75 -0
  267. package/dist/vendors/pinecone/index.d.ts.map +1 -0
  268. package/dist/vendors/pinecone/index.js +3 -0
  269. package/dist/vendors/qdrant/index.d.ts +75 -0
  270. package/dist/vendors/qdrant/index.d.ts.map +1 -0
  271. package/dist/vendors/qdrant/index.js +3 -0
  272. package/dist/vendors/resend/index.d.ts +3 -0
  273. package/dist/vendors/resend/index.js +3 -0
  274. package/dist/vendors/s3/index.d.ts +2 -0
  275. package/dist/vendors/s3/index.js +2 -0
  276. package/dist/vendors/slack/index.d.ts +576 -0
  277. package/dist/vendors/slack/index.d.ts.map +1 -0
  278. package/dist/vendors/slack/index.js +3 -0
  279. package/dist/vendors/sqs/index.d.ts +2 -0
  280. package/dist/vendors/sqs/index.js +2 -0
  281. package/dist/vendors/supabase-vector/index.d.ts +89 -0
  282. package/dist/vendors/supabase-vector/index.d.ts.map +1 -0
  283. package/dist/vendors/supabase-vector/index.js +3 -0
  284. package/dist/vendors/teams/index.d.ts +303 -0
  285. package/dist/vendors/teams/index.d.ts.map +1 -0
  286. package/dist/vendors/teams/index.js +3 -0
  287. package/dist/vendors/telegram/index.d.ts +319 -0
  288. package/dist/vendors/telegram/index.d.ts.map +1 -0
  289. package/dist/vendors/telegram/index.js +3 -0
  290. package/dist/vendors/textract/index.d.ts +2 -0
  291. package/dist/vendors/textract/index.js +2 -0
  292. package/dist/vendors/woocommerce/index.d.ts +1700 -0
  293. package/dist/vendors/woocommerce/index.d.ts.map +1 -0
  294. package/dist/vendors/woocommerce/index.js +1427 -0
  295. package/dist/vendors/woocommerce/index.js.map +1 -0
  296. package/dist/with-auth-CpKqTrGK.js +240 -0
  297. package/dist/with-auth-CpKqTrGK.js.map +1 -0
  298. package/logos/LUCIDE-ATTRIBUTION.txt +4 -0
  299. package/logos/README.md +89 -0
  300. package/logos/amazon.svg +6 -0
  301. package/logos/artifacts.svg +9 -0
  302. package/logos/browser.svg +9 -0
  303. package/logos/calendar.svg +15 -0
  304. package/logos/cloudflare-browser.svg +5 -0
  305. package/logos/cloudflare-email.svg +5 -0
  306. package/logos/cloudflare.svg +4 -0
  307. package/logos/code-sandbox.svg +8 -0
  308. package/logos/content-type.svg +10 -0
  309. package/logos/crypto.svg +7 -0
  310. package/logos/document-extract.svg +12 -0
  311. package/logos/document-render.svg +8 -0
  312. package/logos/document.svg +10 -0
  313. package/logos/email-message.svg +8 -0
  314. package/logos/email.svg +7 -0
  315. package/logos/file-convert.svg +9 -0
  316. package/logos/files.svg +6 -0
  317. package/logos/gotenberg.svg +340 -0
  318. package/logos/image.svg +8 -0
  319. package/logos/imessage.svg +7 -0
  320. package/logos/katana.svg +13 -0
  321. package/logos/mastra.svg +7 -0
  322. package/logos/messaging.svg +7 -0
  323. package/logos/pack-logos.json +48 -0
  324. package/logos/pdf.svg +10 -0
  325. package/logos/pinecone.svg +25 -0
  326. package/logos/presentation.svg +8 -0
  327. package/logos/qdrant.svg +4 -0
  328. package/logos/queue.svg +11 -0
  329. package/logos/rag.svg +18 -0
  330. package/logos/resend.svg +5 -0
  331. package/logos/scheduler.svg +7 -0
  332. package/logos/skills.svg +10 -0
  333. package/logos/slack.svg +14 -0
  334. package/logos/supabase.svg +4 -0
  335. package/logos/tasks.svg +10 -0
  336. package/logos/teams.svg +6 -0
  337. package/logos/telegram.svg +10 -0
  338. package/logos/textract.svg +5 -0
  339. package/logos/vector-store.svg +8 -0
  340. package/logos/web-fetch.svg +8 -0
  341. package/logos/woocommerce.svg +4 -0
  342. package/package.json +373 -0
@@ -0,0 +1,734 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ import { n as defineModule, r as defineTool } from "./define-CvpJ_pNP.js";
3
+ import { n as requireAuth } from "./provider-CgDAlg6K.js";
4
+ import { t as HttpService } from "./http-service-DDNCO1s4.js";
5
+ import { a as toArrayBuffer, n as bytesToBase64, t as base64ToBytes } from "./bytes-BxpimpQx.js";
6
+ import { isPlainObject, isString } from "es-toolkit";
7
+ import { z } from "zod";
8
+ //#region src/vendors/telegram/contracts.ts
9
+ const MAX_MEDIA_BYTES = 20 * 1024 * 1024;
10
+ const telegramChatActionSchema = z.enum([
11
+ "typing",
12
+ "upload_photo",
13
+ "record_video",
14
+ "upload_video",
15
+ "record_voice",
16
+ "upload_voice",
17
+ "upload_document",
18
+ "choose_sticker",
19
+ "find_location",
20
+ "record_video_note",
21
+ "upload_video_note"
22
+ ]);
23
+ const telegramAuthSchema = z.object({ bot_token: z.string().min(1).describe("Telegram bot token from BotFather") });
24
+ const telegramSendTextInputSchema = z.object({
25
+ chat_id: z.string().min(1).describe("Telegram chat id (string form of the numeric id)"),
26
+ text: z.string().min(1).max(4096).describe("Message text (max 4096 characters)"),
27
+ reply_to_message_id: z.string().min(1).optional().describe("Optional message id to reply to"),
28
+ reply_markup: z.unknown().optional().describe("Optional Telegram reply markup object")
29
+ });
30
+ const telegramMessageOutputSchema = z.object({
31
+ message_id: z.string().describe("Telegram message id as string"),
32
+ file_id: z.string().optional().describe("Telegram file_id when the message carries a document/photo/audio/video attachment")
33
+ });
34
+ const telegramEditTextInputSchema = z.object({
35
+ chat_id: z.string().min(1).describe("Telegram chat id"),
36
+ message_id: z.string().min(1).describe("Message id to edit"),
37
+ text: z.string().min(1).max(4096).describe("Replacement text (max 4096 characters)"),
38
+ reply_markup: z.unknown().optional().describe("Optional Telegram reply markup object")
39
+ });
40
+ const telegramSendChatActionInputSchema = z.object({
41
+ chat_id: z.string().min(1).describe("Telegram chat id"),
42
+ action: telegramChatActionSchema.describe("Chat action shown to the user (typing, upload_photo, …)")
43
+ });
44
+ const telegramSetReactionInputSchema = z.object({
45
+ chat_id: z.string().min(1).describe("Telegram chat id"),
46
+ message_id: z.string().min(1).describe("Message id to react to"),
47
+ emoji: z.string().min(1).max(32).describe("Any emoji reaction Telegram accepts for this bot/chat")
48
+ });
49
+ const telegramClearReactionInputSchema = z.object({
50
+ chat_id: z.string().min(1).describe("Telegram chat id"),
51
+ message_id: z.string().min(1).describe("Message id to clear reactions on")
52
+ });
53
+ const telegramSendMediaInputSchema = z.object({
54
+ chat_id: z.string().min(1).describe("Telegram chat id"),
55
+ kind: z.enum(["photo", "document"]).describe("Media kind"),
56
+ body_base64: z.string().min(1).describe("File body as base64"),
57
+ file_name: z.string().min(1).describe("File name including extension"),
58
+ caption: z.string().max(1024).optional().describe("Optional caption (max 1024 characters)"),
59
+ reply_to_message_id: z.string().min(1).optional().describe("Optional message id to reply to"),
60
+ content_type: z.string().optional().describe("Optional content type for the upload")
61
+ });
62
+ const telegramDownloadFileInputSchema = z.object({
63
+ file_id: z.string().min(1).describe("Telegram file_id from an inbound attachment"),
64
+ file_name: z.string().min(1).optional().describe("Preferred file name for the download result")
65
+ });
66
+ const telegramDownloadFileOutputSchema = z.object({
67
+ file_name: z.string(),
68
+ file_size: z.number().optional(),
69
+ body_base64: z.string().describe("Downloaded file body as base64")
70
+ });
71
+ const telegramAnswerCallbackInputSchema = z.object({
72
+ callback_query_id: z.string().min(1).describe("callback_query.id from an inbound update"),
73
+ text: z.string().max(200).optional().describe("Optional notification text shown to the user"),
74
+ show_alert: z.boolean().optional().describe("When true, show an alert instead of a toast")
75
+ });
76
+ const telegramSendMediaGroupItemSchema = z.object({
77
+ kind: z.enum(["photo", "document"]).describe("Media kind; all items must be photo or all document"),
78
+ body_base64: z.string().min(1).describe("File body as base64"),
79
+ file_name: z.string().min(1).describe("File name including extension"),
80
+ caption: z.string().max(1024).optional().describe("Optional caption on this item"),
81
+ content_type: z.string().optional().describe("Optional content type")
82
+ });
83
+ const telegramSendMediaGroupInputSchema = z.object({
84
+ chat_id: z.string().min(1).describe("Telegram chat id"),
85
+ items: z.array(telegramSendMediaGroupItemSchema).min(2).max(10).describe("2-10 media items; cannot mix photo and document"),
86
+ reply_to_message_id: z.string().min(1).optional().describe("Optional message id to reply to")
87
+ });
88
+ const telegramSendMediaGroupOutputSchema = z.object({ message_ids: z.array(z.string()).describe("Message ids for each media item") });
89
+ const telegramGetBotOutputSchema = z.object({
90
+ bot_id: z.string(),
91
+ username: z.string(),
92
+ display_name: z.string()
93
+ });
94
+ const telegramOkOutputSchema = z.object({ ok: z.boolean() });
95
+ //#endregion
96
+ //#region src/vendors/telegram/domain.ts
97
+ /**
98
+ * Telegram payload shaping + envelope/result parse.
99
+ * No HTTP — client owns transport.
100
+ */
101
+ var TelegramClientError = class extends ToolError {
102
+ failureKind;
103
+ constructor(input) {
104
+ super(input.message, {
105
+ code: "upstream",
106
+ retryable: input.failureKind === "outcome_unknown",
107
+ cause: input.cause,
108
+ details: {
109
+ method: input.method,
110
+ failure_kind: input.failureKind,
111
+ status: input.status,
112
+ retry_after_seconds: input.retryAfterSeconds
113
+ }
114
+ });
115
+ this.name = "TelegramClientError";
116
+ this.failureKind = input.failureKind;
117
+ }
118
+ };
119
+ function isTelegramDefiniteRejection(error) {
120
+ return error instanceof TelegramClientError && error.failureKind === "definite_rejection";
121
+ }
122
+ function isTelegramOutcomeUnknown(error) {
123
+ return error instanceof TelegramClientError && error.failureKind === "outcome_unknown";
124
+ }
125
+ /** Network / abort / transport failures before a parseable Telegram envelope. */
126
+ function throwTelegramTransportError(method, error) {
127
+ if (error instanceof TelegramClientError) throw error;
128
+ throw new TelegramClientError({
129
+ message: error instanceof Error ? error.message : `${method} request failed`,
130
+ failureKind: "outcome_unknown",
131
+ method,
132
+ cause: error
133
+ });
134
+ }
135
+ function isDefiniteStatus(status) {
136
+ return status === 400 || status === 401 || status === 403 || status === 404;
137
+ }
138
+ /** Map Telegram `{ ok, result | description }` (HTTP may be non-2xx). */
139
+ function parseResult(label, status, data) {
140
+ if (!isPlainObject(data) || typeof data["ok"] !== "boolean") throw new TelegramClientError({
141
+ message: `${label} returned an invalid envelope`,
142
+ failureKind: "outcome_unknown",
143
+ method: label
144
+ });
145
+ if (status >= 200 && status < 300 && data["ok"] === true && data["result"] !== void 0) return data["result"];
146
+ const parameters = data["parameters"];
147
+ const retryAfter = isPlainObject(parameters) && typeof parameters["retry_after"] === "number" ? parameters["retry_after"] : void 0;
148
+ throw new TelegramClientError({
149
+ message: isString(data["description"]) ? data["description"] : `${label} failed`,
150
+ failureKind: isDefiniteStatus(status) ? "definite_rejection" : "outcome_unknown",
151
+ method: label,
152
+ status,
153
+ ...retryAfter !== void 0 && { retryAfterSeconds: retryAfter }
154
+ });
155
+ }
156
+ /** Prefer largest photo size; else first of document/audio/video/voice/… with a file_id. */
157
+ function extractTelegramFileId(message) {
158
+ const photo = message["photo"];
159
+ if (Array.isArray(photo) && photo.length > 0) {
160
+ let best;
161
+ let bestSize = -1;
162
+ for (const row of photo) {
163
+ if (!isPlainObject(row) || !isString(row["file_id"])) continue;
164
+ const size = typeof row["file_size"] === "number" ? row["file_size"] : 0;
165
+ if (size >= bestSize) {
166
+ bestSize = size;
167
+ best = row["file_id"];
168
+ }
169
+ }
170
+ if (best) return best;
171
+ }
172
+ for (const key of [
173
+ "document",
174
+ "audio",
175
+ "video",
176
+ "voice",
177
+ "video_note",
178
+ "animation",
179
+ "sticker"
180
+ ]) {
181
+ const item = message[key];
182
+ if (isPlainObject(item) && isString(item["file_id"]) && item["file_id"].length > 0) return item["file_id"];
183
+ }
184
+ }
185
+ function parseMessage(value) {
186
+ if (!isPlainObject(value) || typeof value["message_id"] !== "number") throw new ToolError("Telegram returned an invalid message", { code: "upstream" });
187
+ const fileId = extractTelegramFileId(value);
188
+ return {
189
+ message_id: String(value["message_id"]),
190
+ ...fileId && { file_id: fileId }
191
+ };
192
+ }
193
+ function parseMessages(value) {
194
+ if (!Array.isArray(value)) throw new ToolError("Telegram returned an invalid message list", { code: "upstream" });
195
+ return { message_ids: value.map((row) => parseMessage(row).message_id) };
196
+ }
197
+ function parseOk(value) {
198
+ if (value !== true) throw new ToolError("Telegram returned unexpected result", { code: "upstream" });
199
+ }
200
+ function parseBot(value) {
201
+ if (!isPlainObject(value) || typeof value["id"] !== "number" || !isString(value["username"]) || !isString(value["first_name"])) throw new ToolError("Telegram getMe returned invalid bot identity", { code: "upstream" });
202
+ return {
203
+ bot_id: String(value["id"]),
204
+ username: value["username"],
205
+ display_name: value["first_name"]
206
+ };
207
+ }
208
+ function parseFile(value) {
209
+ if (!isPlainObject(value) || !isString(value["file_path"])) throw new ToolError("Telegram getFile returned invalid payload", { code: "upstream" });
210
+ return {
211
+ file_path: value["file_path"],
212
+ ...typeof value["file_size"] === "number" && { file_size: value["file_size"] }
213
+ };
214
+ }
215
+ function parseDownload(input, file, bytes) {
216
+ return {
217
+ file_name: input.file_name ?? file.file_path.split("/").pop() ?? input.file_id,
218
+ ...file.file_size !== void 0 && { file_size: file.file_size },
219
+ body_base64: bytesToBase64(bytes)
220
+ };
221
+ }
222
+ function decodeMedia(bodyBase64) {
223
+ let bytes;
224
+ try {
225
+ bytes = base64ToBytes(bodyBase64);
226
+ } catch (error) {
227
+ throw new ToolError("Invalid base64 body", {
228
+ code: "bad_input",
229
+ cause: error
230
+ });
231
+ }
232
+ if (bytes.byteLength === 0) throw new ToolError("Media body must not be empty", { code: "bad_input" });
233
+ if (bytes.byteLength > 20971520) throw new ToolError("Media exceeds 20 MiB limit", {
234
+ code: "too_large",
235
+ details: {
236
+ max_bytes: MAX_MEDIA_BYTES,
237
+ content_length: bytes.byteLength
238
+ }
239
+ });
240
+ return bytes;
241
+ }
242
+ function blob(bytes, contentType) {
243
+ return contentType ? new Blob([toArrayBuffer(bytes)], { type: contentType }) : new Blob([toArrayBuffer(bytes)]);
244
+ }
245
+ /** Multipart body for sendPhoto / sendDocument. */
246
+ function buildMediaForm(input) {
247
+ const bytes = decodeMedia(input.body_base64);
248
+ const form = new FormData();
249
+ form.set("chat_id", input.chat_id);
250
+ form.set(input.kind === "photo" ? "photo" : "document", blob(bytes, input.content_type), input.file_name);
251
+ if (input.caption) form.set("caption", input.caption);
252
+ if (input.reply_to_message_id) form.set("reply_parameters", JSON.stringify({ message_id: Number.parseInt(input.reply_to_message_id, 10) }));
253
+ return form;
254
+ }
255
+ /** Multipart body for sendMediaGroup. */
256
+ function buildMediaGroupForm(input) {
257
+ if (input.items.length < 2 || input.items.length > 10) throw new ToolError("Media groups require between 2 and 10 items", { code: "bad_input" });
258
+ const hasDoc = input.items.some((item) => item.kind === "document");
259
+ const hasPhoto = input.items.some((item) => item.kind === "photo");
260
+ if (hasDoc && hasPhoto) throw new ToolError("Media groups cannot mix photo and document items", { code: "bad_input" });
261
+ const form = new FormData();
262
+ form.set("chat_id", input.chat_id);
263
+ if (input.reply_to_message_id) form.set("reply_parameters", JSON.stringify({ message_id: Number.parseInt(input.reply_to_message_id, 10) }));
264
+ const media = input.items.map((item, index) => {
265
+ const bytes = decodeMedia(item.body_base64);
266
+ form.set(`file${index}`, blob(bytes, item.content_type), item.file_name);
267
+ return {
268
+ type: item.kind,
269
+ media: `attach://file${index}`,
270
+ ...item.caption && { caption: item.caption }
271
+ };
272
+ });
273
+ form.set("media", JSON.stringify(media));
274
+ return form;
275
+ }
276
+ //#endregion
277
+ //#region src/vendors/telegram/client.ts
278
+ /**
279
+ * Telegram Bot API vendor client.
280
+ * Host: `new TelegramClient(auth)`. Agent tools: `fromContext(ctx)`.
281
+ */
282
+ var TelegramClient = class TelegramClient {
283
+ #token;
284
+ #http;
285
+ constructor(auth, options = {}) {
286
+ const parsed = telegramAuthSchema.safeParse(auth);
287
+ if (!parsed.success) throw new ToolError("Invalid Telegram auth credentials", {
288
+ code: "bad_auth",
289
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
290
+ });
291
+ this.#token = parsed.data.bot_token;
292
+ this.#http = new HttpService({
293
+ ...options,
294
+ baseURL: "https://api.telegram.org",
295
+ label: "Telegram"
296
+ });
297
+ }
298
+ static fromContext(ctx) {
299
+ const auth = requireAuth(ctx, telegramAuthSchema);
300
+ return new TelegramClient(auth, {
301
+ ...ctx.fetch && { fetch: ctx.fetch },
302
+ ...ctx.signal && { signal: ctx.signal }
303
+ });
304
+ }
305
+ async #post(path, body, label) {
306
+ try {
307
+ const res = await this.#http.post(path, body, {
308
+ label,
309
+ noThrow: true
310
+ });
311
+ return parseResult(label, res.status, res.data);
312
+ } catch (error) {
313
+ throwTelegramTransportError(label, error);
314
+ }
315
+ }
316
+ /** POST /bot{token}/sendMessage */
317
+ async sendText(input) {
318
+ const body = {
319
+ chat_id: input.chat_id,
320
+ text: input.text,
321
+ ...input.reply_markup !== void 0 && { reply_markup: input.reply_markup },
322
+ ...input.reply_to_message_id && { reply_parameters: { message_id: Number.parseInt(input.reply_to_message_id, 10) } }
323
+ };
324
+ return parseMessage(await this.#post(`/bot${this.#token}/sendMessage`, body, "Telegram sendMessage"));
325
+ }
326
+ /** POST /bot{token}/editMessageText */
327
+ async editText(input) {
328
+ const body = {
329
+ chat_id: input.chat_id,
330
+ message_id: Number.parseInt(input.message_id, 10),
331
+ text: input.text,
332
+ ...input.reply_markup !== void 0 && { reply_markup: input.reply_markup }
333
+ };
334
+ return parseMessage(await this.#post(`/bot${this.#token}/editMessageText`, body, "Telegram editMessageText"));
335
+ }
336
+ /** POST /bot{token}/sendChatAction */
337
+ async sendChatAction(input) {
338
+ parseOk(await this.#post(`/bot${this.#token}/sendChatAction`, {
339
+ chat_id: input.chat_id,
340
+ action: input.action
341
+ }, "Telegram sendChatAction"));
342
+ }
343
+ /** POST /bot{token}/setMessageReaction */
344
+ async setReaction(input) {
345
+ parseOk(await this.#post(`/bot${this.#token}/setMessageReaction`, {
346
+ chat_id: input.chat_id,
347
+ message_id: Number.parseInt(input.message_id, 10),
348
+ reaction: [{
349
+ type: "emoji",
350
+ emoji: input.emoji
351
+ }]
352
+ }, "Telegram setMessageReaction"));
353
+ }
354
+ /** POST /bot{token}/setMessageReaction (empty reaction) */
355
+ async clearReaction(input) {
356
+ parseOk(await this.#post(`/bot${this.#token}/setMessageReaction`, {
357
+ chat_id: input.chat_id,
358
+ message_id: Number.parseInt(input.message_id, 10),
359
+ reaction: []
360
+ }, "Telegram setMessageReaction"));
361
+ }
362
+ /** POST /bot{token}/sendPhoto | sendDocument */
363
+ async sendMedia(input) {
364
+ const path = input.kind === "photo" ? `/bot${this.#token}/sendPhoto` : `/bot${this.#token}/sendDocument`;
365
+ const label = input.kind === "photo" ? "Telegram sendPhoto" : "Telegram sendDocument";
366
+ return parseMessage(await this.#post(path, buildMediaForm(input), label));
367
+ }
368
+ /** POST /bot{token}/sendMediaGroup */
369
+ async sendMediaGroup(input) {
370
+ return parseMessages(await this.#post(`/bot${this.#token}/sendMediaGroup`, buildMediaGroupForm(input), "Telegram sendMediaGroup"));
371
+ }
372
+ /** POST getFile + GET /file/bot{token}/{file_path} */
373
+ async downloadFile(input) {
374
+ const file = parseFile(await this.#post(`/bot${this.#token}/getFile`, { file_id: input.file_id }, "Telegram getFile"));
375
+ const filePath = file.file_path.replace(/^\/+/, "");
376
+ let res;
377
+ try {
378
+ res = await this.#http.bytes("GET", `/file/bot${this.#token}/${filePath}`, {
379
+ label: "Telegram downloadFile",
380
+ noThrow: true
381
+ });
382
+ } catch (error) {
383
+ throwTelegramTransportError("Telegram downloadFile", error);
384
+ }
385
+ if (!res.ok) throw new TelegramClientError({
386
+ message: `Telegram downloadFile failed with HTTP ${res.status}`,
387
+ failureKind: res.status === 400 || res.status === 401 || res.status === 403 || res.status === 404 ? "definite_rejection" : "outcome_unknown",
388
+ method: "Telegram downloadFile",
389
+ status: res.status
390
+ });
391
+ return parseDownload(input, file, res.bytes);
392
+ }
393
+ /** POST /bot{token}/answerCallbackQuery */
394
+ async answerCallback(input) {
395
+ const body = {
396
+ callback_query_id: input.callback_query_id,
397
+ ...input.text && { text: input.text },
398
+ ...input.show_alert !== void 0 && { show_alert: input.show_alert }
399
+ };
400
+ parseOk(await this.#post(`/bot${this.#token}/answerCallbackQuery`, body, "Telegram answerCallbackQuery"));
401
+ }
402
+ /** POST /bot{token}/getMe */
403
+ async getBot() {
404
+ return parseBot(await this.#post(`/bot${this.#token}/getMe`, {}, "Telegram getMe"));
405
+ }
406
+ /** POST /bot{token}/getWebhookInfo */
407
+ async getWebhookInfo() {
408
+ const value = await this.#post(`/bot${this.#token}/getWebhookInfo`, {}, "Telegram getWebhookInfo");
409
+ if (!isPlainObject(value) || !isString(value["url"]) || typeof value["pending_update_count"] !== "number") throw new ToolError("Telegram getWebhookInfo returned invalid payload", { code: "upstream" });
410
+ return {
411
+ url: value["url"],
412
+ pending_update_count: value["pending_update_count"],
413
+ ...typeof value["last_error_date"] === "number" && { last_error_at_unix: value["last_error_date"] },
414
+ ...isString(value["last_error_message"]) && { last_error_message: value["last_error_message"] }
415
+ };
416
+ }
417
+ /** POST /bot{token}/setWebhook */
418
+ async setWebhook(input) {
419
+ parseOk(await this.#post(`/bot${this.#token}/setWebhook`, {
420
+ url: input.url,
421
+ secret_token: input.secret_token,
422
+ allowed_updates: input.allowed_updates ?? ["message", "callback_query"]
423
+ }, "Telegram setWebhook"));
424
+ }
425
+ /** POST /bot{token}/deleteWebhook */
426
+ async deleteWebhook(input) {
427
+ parseOk(await this.#post(`/bot${this.#token}/deleteWebhook`, { drop_pending_updates: input?.drop_pending_updates ?? false }, "Telegram deleteWebhook"));
428
+ }
429
+ };
430
+ //#endregion
431
+ //#region src/vendors/telegram/module.ts
432
+ const emptyInputSchema = z.object({}).describe("No input fields");
433
+ const telegramSendTextTool = defineTool({
434
+ id: "telegram-send-text",
435
+ name: "telegramSendText",
436
+ description: "Send a text message to a Telegram chat. Optional reply_to_message_id anchors a native reply. Returns the new message_id.",
437
+ inputSchema: telegramSendTextInputSchema,
438
+ outputSchema: telegramMessageOutputSchema,
439
+ sideEffect: "send",
440
+ runtime: "both",
441
+ execute: async (input, ctx) => TelegramClient.fromContext(ctx).sendText(input)
442
+ });
443
+ const telegramEditTextTool = defineTool({
444
+ id: "telegram-edit-text",
445
+ name: "telegramEditText",
446
+ description: "Edit the text of an existing Telegram message. Used for progressive live updates and corrections.",
447
+ inputSchema: telegramEditTextInputSchema,
448
+ outputSchema: telegramMessageOutputSchema,
449
+ sideEffect: "write",
450
+ runtime: "both",
451
+ execute: async (input, ctx) => TelegramClient.fromContext(ctx).editText(input)
452
+ });
453
+ const telegramSendChatActionTool = defineTool({
454
+ id: "telegram-send-chat-action",
455
+ name: "telegramSendChatAction",
456
+ description: "Show a chat action to the user (typing, upload_photo, upload_document, and other Telegram actions). Renew while work is in progress.",
457
+ inputSchema: telegramSendChatActionInputSchema,
458
+ outputSchema: telegramOkOutputSchema,
459
+ sideEffect: "none",
460
+ runtime: "both",
461
+ execute: async (input, ctx) => {
462
+ await TelegramClient.fromContext(ctx).sendChatAction(input);
463
+ return { ok: true };
464
+ }
465
+ });
466
+ const telegramSetReactionTool = defineTool({
467
+ id: "telegram-set-reaction",
468
+ name: "telegramSetReaction",
469
+ description: "Set an emoji reaction on a Telegram message. Any emoji Telegram accepts for the bot and chat is allowed.",
470
+ inputSchema: telegramSetReactionInputSchema,
471
+ outputSchema: telegramOkOutputSchema,
472
+ sideEffect: "write",
473
+ runtime: "both",
474
+ execute: async (input, ctx) => {
475
+ await TelegramClient.fromContext(ctx).setReaction(input);
476
+ return { ok: true };
477
+ }
478
+ });
479
+ const telegramClearReactionTool = defineTool({
480
+ id: "telegram-clear-reaction",
481
+ name: "telegramClearReaction",
482
+ description: "Clear all bot reactions on a Telegram message.",
483
+ inputSchema: telegramClearReactionInputSchema,
484
+ outputSchema: telegramOkOutputSchema,
485
+ sideEffect: "write",
486
+ runtime: "both",
487
+ execute: async (input, ctx) => {
488
+ await TelegramClient.fromContext(ctx).clearReaction(input);
489
+ return { ok: true };
490
+ }
491
+ });
492
+ const telegramSendMediaTool = defineTool({
493
+ id: "telegram-send-media",
494
+ name: "telegramSendMedia",
495
+ description: "Send one photo or document to a Telegram chat from a base64 body. For multiple related files use telegram-send-media-group.",
496
+ inputSchema: telegramSendMediaInputSchema,
497
+ outputSchema: telegramMessageOutputSchema,
498
+ sideEffect: "send",
499
+ runtime: "both",
500
+ execute: async (input, ctx) => TelegramClient.fromContext(ctx).sendMedia(input)
501
+ });
502
+ const telegramSendMediaGroupTool = defineTool({
503
+ id: "telegram-send-media-group",
504
+ name: "telegramSendMediaGroup",
505
+ description: "Send 2-10 photos or 2-10 documents as one Telegram media group. Cannot mix photo and document items.",
506
+ inputSchema: telegramSendMediaGroupInputSchema,
507
+ outputSchema: telegramSendMediaGroupOutputSchema,
508
+ sideEffect: "send",
509
+ runtime: "both",
510
+ execute: async (input, ctx) => TelegramClient.fromContext(ctx).sendMediaGroup(input)
511
+ });
512
+ const telegramDownloadFileTool = defineTool({
513
+ id: "telegram-download-file",
514
+ name: "telegramDownloadFile",
515
+ description: "Download a Telegram file by file_id and return the body as base64 with optional size and name.",
516
+ inputSchema: telegramDownloadFileInputSchema,
517
+ outputSchema: telegramDownloadFileOutputSchema,
518
+ sideEffect: "read",
519
+ runtime: "both",
520
+ execute: async (input, ctx) => TelegramClient.fromContext(ctx).downloadFile(input)
521
+ });
522
+ const telegramAnswerCallbackTool = defineTool({
523
+ id: "telegram-answer-callback",
524
+ name: "telegramAnswerCallback",
525
+ description: "Acknowledge a Telegram callback query. Optional text shows a toast or alert to the user.",
526
+ inputSchema: telegramAnswerCallbackInputSchema,
527
+ outputSchema: telegramOkOutputSchema,
528
+ sideEffect: "write",
529
+ runtime: "both",
530
+ execute: async (input, ctx) => {
531
+ await TelegramClient.fromContext(ctx).answerCallback(input);
532
+ return { ok: true };
533
+ }
534
+ });
535
+ const telegramGetBotTool = defineTool({
536
+ id: "telegram-get-bot",
537
+ name: "telegramGetBot",
538
+ description: "Return the active Telegram bot identity, including bot_id, username, and display_name.",
539
+ inputSchema: emptyInputSchema,
540
+ outputSchema: telegramGetBotOutputSchema,
541
+ sideEffect: "read",
542
+ runtime: "both",
543
+ execute: async (_input, ctx) => TelegramClient.fromContext(ctx).getBot()
544
+ });
545
+ const telegramModule = defineModule({
546
+ id: "telegram",
547
+ title: "Telegram",
548
+ description: "Telegram Bot API tools for text, media, media groups, chat actions, reactions, file download, callbacks, and bot identity.",
549
+ runtime: "both",
550
+ auth: {
551
+ type: "custom",
552
+ schema: telegramAuthSchema
553
+ },
554
+ categories: ["messaging", "chat"],
555
+ classification: "pii",
556
+ tags: ["telegram"],
557
+ tools: [
558
+ telegramSendTextTool,
559
+ telegramEditTextTool,
560
+ telegramSendChatActionTool,
561
+ telegramSetReactionTool,
562
+ telegramClearReactionTool,
563
+ telegramSendMediaTool,
564
+ telegramSendMediaGroupTool,
565
+ telegramDownloadFileTool,
566
+ telegramAnswerCallbackTool,
567
+ telegramGetBotTool
568
+ ]
569
+ });
570
+ //#endregion
571
+ //#region src/vendors/telegram/webhook.ts
572
+ /**
573
+ * Verify Telegram webhook secret header (x-telegram-bot-api-secret-token).
574
+ * Exact string match; constant-time comparison when lengths match.
575
+ */
576
+ function verifyTelegramWebhookSecret(headerValue, expectedSecret) {
577
+ if (!headerValue) return false;
578
+ if (expectedSecret.length === 0) return false;
579
+ if (headerValue.length !== expectedSecret.length) return false;
580
+ let mismatch = 0;
581
+ for (let i = 0; i < headerValue.length; i += 1) mismatch |= headerValue.charCodeAt(i) ^ expectedSecret.charCodeAt(i);
582
+ return mismatch === 0;
583
+ }
584
+ /**
585
+ * Parse one raw Bot API Update into a normalized inbound event.
586
+ * Returns ok:false for updates the pack does not surface (unsupported chat types, empty noise).
587
+ */
588
+ function parseTelegramUpdate(update, options) {
589
+ if (!isPlainObject(update)) return {
590
+ ok: false,
591
+ reason: "update_not_object"
592
+ };
593
+ const updateId = update["update_id"];
594
+ if (typeof updateId !== "number") return {
595
+ ok: false,
596
+ reason: "missing_update_id"
597
+ };
598
+ const receivedAt = options?.received_at ?? (/* @__PURE__ */ new Date()).toISOString();
599
+ const allowGroups = options?.allow_group_chats ?? false;
600
+ const message = asMessage(update["message"]) ?? asMessage(update["edited_message"]);
601
+ if (message) return parseMessageUpdate(updateId, message, receivedAt, allowGroups, Boolean(update["edited_message"]));
602
+ const callback = update["callback_query"];
603
+ if (isPlainObject(callback)) return parseCallbackUpdate(updateId, callback, receivedAt, allowGroups);
604
+ return {
605
+ ok: false,
606
+ reason: "unsupported_update_type"
607
+ };
608
+ }
609
+ function parseMessageUpdate(updateId, message, receivedAt, allowGroups, edited) {
610
+ const chat = message["chat"];
611
+ if (!isPlainObject(chat) || typeof chat["id"] !== "number") return {
612
+ ok: false,
613
+ reason: "missing_chat"
614
+ };
615
+ const chatType = isString(chat["type"]) ? chat["type"] : void 0;
616
+ if (!allowGroups && chatType && chatType !== "private") return {
617
+ ok: false,
618
+ reason: "non_private_chat"
619
+ };
620
+ const from = message["from"];
621
+ const userId = isPlainObject(from) && typeof from["id"] === "number" ? String(from["id"]) : void 0;
622
+ const username = isPlainObject(from) && isString(from["username"]) ? from["username"] : void 0;
623
+ const messageId = typeof message["message_id"] === "number" ? String(message["message_id"]) : void 0;
624
+ const text = firstString(message["text"], message["caption"]);
625
+ const media = collectMedia(message);
626
+ const replyTo = isPlainObject(message["reply_to_message"]) && typeof message["reply_to_message"]["message_id"] === "number" ? String(message["reply_to_message"]["message_id"]) : void 0;
627
+ const mediaGroupId = isString(message["media_group_id"]) ? message["media_group_id"] : void 0;
628
+ if (!text && media.length === 0) return {
629
+ ok: false,
630
+ reason: "empty_message"
631
+ };
632
+ return {
633
+ ok: true,
634
+ event: {
635
+ channel: "telegram",
636
+ event_id: String(updateId),
637
+ chat_id: String(chat["id"]),
638
+ raw_type: edited ? "edited_message" : "message",
639
+ received_at: receivedAt,
640
+ ...userId && { user_id: userId },
641
+ ...username && { username },
642
+ ...messageId && { message_id: messageId },
643
+ ...text && { text },
644
+ ...media.length > 0 && { media },
645
+ ...replyTo && { reply_to: replyTo },
646
+ ...mediaGroupId && { media_group_id: mediaGroupId },
647
+ ...chatType && { chat_type: chatType }
648
+ }
649
+ };
650
+ }
651
+ function parseCallbackUpdate(updateId, callback, receivedAt, allowGroups) {
652
+ const message = asMessage(callback["message"]);
653
+ const chat = message ? message["chat"] : void 0;
654
+ if (!isPlainObject(chat) || typeof chat["id"] !== "number") return {
655
+ ok: false,
656
+ reason: "callback_missing_chat"
657
+ };
658
+ const chatType = isString(chat["type"]) ? chat["type"] : void 0;
659
+ if (!allowGroups && chatType && chatType !== "private") return {
660
+ ok: false,
661
+ reason: "non_private_chat"
662
+ };
663
+ const from = callback["from"];
664
+ const userId = isPlainObject(from) && typeof from["id"] === "number" ? String(from["id"]) : void 0;
665
+ const username = isPlainObject(from) && isString(from["username"]) ? from["username"] : void 0;
666
+ const callbackQueryId = isString(callback["id"]) ? callback["id"] : void 0;
667
+ if (!callbackQueryId) return {
668
+ ok: false,
669
+ reason: "callback_missing_id"
670
+ };
671
+ const callbackData = isString(callback["data"]) ? callback["data"] : void 0;
672
+ const messageId = message && typeof message["message_id"] === "number" ? String(message["message_id"]) : void 0;
673
+ return {
674
+ ok: true,
675
+ event: {
676
+ channel: "telegram",
677
+ event_id: String(updateId),
678
+ chat_id: String(chat["id"]),
679
+ raw_type: "callback_query",
680
+ received_at: receivedAt,
681
+ callback_query_id: callbackQueryId,
682
+ ...userId && { user_id: userId },
683
+ ...username && { username },
684
+ ...messageId && { message_id: messageId },
685
+ ...callbackData && { callback_data: callbackData },
686
+ ...chatType && { chat_type: chatType }
687
+ }
688
+ };
689
+ }
690
+ function asMessage(value) {
691
+ return isPlainObject(value) ? value : void 0;
692
+ }
693
+ function firstString(...values) {
694
+ for (const value of values) if (isString(value) && value.length > 0) return value;
695
+ }
696
+ function collectMedia(message) {
697
+ const out = [];
698
+ const photo = message["photo"];
699
+ if (Array.isArray(photo) && photo.length > 0) {
700
+ const largest = photo[photo.length - 1];
701
+ if (isPlainObject(largest) && isString(largest["file_id"])) out.push({
702
+ kind: "photo",
703
+ ref: largest["file_id"],
704
+ ...isString(largest["file_unique_id"]) ? { unique_ref: largest["file_unique_id"] } : {},
705
+ ...typeof largest["file_size"] === "number" ? { file_size: largest["file_size"] } : {},
706
+ media_type: "image/jpeg"
707
+ });
708
+ }
709
+ for (const key of [
710
+ "document",
711
+ "audio",
712
+ "video",
713
+ "voice",
714
+ "video_note",
715
+ "animation",
716
+ "sticker"
717
+ ]) {
718
+ const item = message[key];
719
+ if (!isPlainObject(item) || !isString(item["file_id"])) continue;
720
+ out.push({
721
+ kind: key,
722
+ ref: item["file_id"],
723
+ ...isString(item["file_unique_id"]) ? { unique_ref: item["file_unique_id"] } : {},
724
+ ...typeof item["file_size"] === "number" ? { file_size: item["file_size"] } : {},
725
+ ...isString(item["file_name"]) ? { file_name: item["file_name"] } : {},
726
+ ...isString(item["mime_type"]) ? { media_type: item["mime_type"] } : {}
727
+ });
728
+ }
729
+ return out;
730
+ }
731
+ //#endregion
732
+ export { telegramSendMediaGroupOutputSchema as A, telegramDownloadFileOutputSchema as C, telegramOkOutputSchema as D, telegramMessageOutputSchema as E, telegramSendTextInputSchema as M, telegramSetReactionInputSchema as N, telegramSendChatActionInputSchema as O, telegramDownloadFileInputSchema as S, telegramGetBotOutputSchema as T, isTelegramOutcomeUnknown as _, telegramDownloadFileTool as a, telegramAuthSchema as b, telegramModule as c, telegramSendMediaTool as d, telegramSendTextTool as f, isTelegramDefiniteRejection as g, TelegramClientError as h, telegramClearReactionTool as i, telegramSendMediaInputSchema as j, telegramSendMediaGroupInputSchema as k, telegramSendChatActionTool as l, TelegramClient as m, verifyTelegramWebhookSecret as n, telegramEditTextTool as o, telegramSetReactionTool as p, telegramAnswerCallbackTool as r, telegramGetBotTool as s, parseTelegramUpdate as t, telegramSendMediaGroupTool as u, MAX_MEDIA_BYTES as v, telegramEditTextInputSchema as w, telegramClearReactionInputSchema as x, telegramAnswerCallbackInputSchema as y };
733
+
734
+ //# sourceMappingURL=telegram-DDXWzkfL.js.map