@rubytech/create-maxy-code 0.1.579 → 0.1.580

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 (286) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/telegram-media/dist/index.d.ts +45 -0
  3. package/payload/platform/lib/telegram-media/dist/index.d.ts.map +1 -0
  4. package/payload/platform/lib/telegram-media/dist/index.js +89 -0
  5. package/payload/platform/lib/telegram-media/dist/index.js.map +1 -0
  6. package/payload/platform/lib/telegram-media/src/__tests__/telegram-media.test.ts +104 -0
  7. package/payload/platform/lib/telegram-media/src/index.ts +102 -0
  8. package/payload/platform/lib/telegram-media/tsconfig.json +9 -0
  9. package/payload/platform/lib/telegram-media/vitest.config.ts +9 -0
  10. package/payload/platform/package.json +2 -2
  11. package/payload/platform/plugins/admin/PLUGIN.md +2 -2
  12. package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +22 -0
  13. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +34 -0
  14. package/payload/platform/plugins/admin/hooks/__tests__/quote-path-write-gate.test.sh +25 -0
  15. package/payload/platform/plugins/admin/hooks/archive-ingest-surface-gate.sh +11 -4
  16. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +2 -2
  17. package/payload/platform/plugins/admin/hooks/quote-path-write-gate.sh +6 -3
  18. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
  19. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-schema-shape.test.ts +23 -0
  20. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visit-status-write.test.ts +175 -3
  21. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +101 -0
  22. package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +35 -1
  23. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visit-status.ts +73 -8
  24. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +59 -8
  25. package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
  26. package/payload/platform/plugins/telegram/PLUGIN.md +23 -3
  27. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +99 -1
  28. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js.map +1 -1
  29. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts +2 -0
  30. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts.map +1 -0
  31. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +226 -0
  32. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -0
  33. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts +2 -0
  34. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts.map +1 -0
  35. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js +143 -0
  36. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js.map +1 -0
  37. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts +2 -0
  38. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts.map +1 -0
  39. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +197 -0
  40. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -0
  41. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts +2 -0
  42. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts.map +1 -0
  43. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js +196 -0
  44. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js.map +1 -0
  45. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts +2 -0
  46. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts.map +1 -0
  47. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js +95 -0
  48. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js.map +1 -0
  49. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts +2 -0
  50. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts.map +1 -0
  51. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js +293 -0
  52. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js.map +1 -0
  53. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts +2 -0
  54. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts.map +1 -0
  55. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js +130 -0
  56. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js.map +1 -0
  57. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts +2 -0
  58. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts.map +1 -0
  59. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +119 -0
  60. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -0
  61. package/payload/platform/plugins/telegram/mcp/dist/index.js +71 -66
  62. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  63. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +15 -0
  64. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  65. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +27 -10
  66. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  67. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts +34 -0
  68. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
  69. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +106 -0
  70. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
  71. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts +41 -0
  72. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts.map +1 -0
  73. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js +120 -0
  74. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js.map +1 -0
  75. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts +73 -0
  76. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -0
  77. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +270 -0
  78. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -0
  79. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +34 -0
  80. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -0
  81. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +134 -0
  82. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -0
  83. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts +70 -0
  84. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -0
  85. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +232 -0
  86. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -0
  87. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts +42 -0
  88. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts.map +1 -0
  89. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js +92 -0
  90. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js.map +1 -0
  91. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts +76 -0
  92. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -0
  93. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +288 -0
  94. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -0
  95. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +250 -0
  96. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -0
  97. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +400 -0
  98. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -0
  99. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts +38 -0
  100. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -0
  101. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +120 -0
  102. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -0
  103. package/payload/platform/plugins/telegram/mcp/vitest.config.ts +14 -0
  104. package/payload/platform/plugins/telegram/skills/build/SKILL.md +161 -21
  105. package/payload/platform/scripts/__tests__/hook-matcher-dispatch.test.sh +163 -0
  106. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  107. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +6 -1
  108. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  109. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  110. package/payload/server/public/activity.html +6 -6
  111. package/payload/server/public/agents.html +5 -5
  112. package/payload/server/public/assets/{AdminLoginScreens-Bus-Y-rG.js → AdminLoginScreens-Dxv5t1YY.js} +1 -1
  113. package/payload/server/public/assets/AdminLoginScreens-Dxv5t1YY.js.br +0 -0
  114. package/payload/server/public/assets/AdminLoginScreens-Dxv5t1YY.js.gz +0 -0
  115. package/payload/server/public/assets/{AdminShell-Bsm7q3CW.js → AdminShell-BMslfZxN.js} +1 -1
  116. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  117. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  118. package/payload/server/public/assets/{activity-BWqrCyYM.js → activity-kQ3w70LJ.js} +1 -1
  119. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  120. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  121. package/payload/server/public/assets/{admin-zly7Y6EZ.js → admin-DapcMKCG.js} +1 -1
  122. package/payload/server/public/assets/admin-DapcMKCG.js.br +0 -0
  123. package/payload/server/public/assets/admin-DapcMKCG.js.gz +0 -0
  124. package/payload/server/public/assets/{agents-BsxGD1V1.js → agents-Cn_bZgnD.js} +1 -1
  125. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  126. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  127. package/payload/server/public/assets/{browser-CRLxTaw2.js → browser-BE-GDk5-.js} +1 -1
  128. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  129. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  130. package/payload/server/public/assets/{calendar-Bmp6qI_P.js → calendar-Di7BEHHN.js} +1 -1
  131. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  132. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  133. package/payload/server/public/assets/chat-DLmikhie.js +1 -0
  134. package/payload/server/public/assets/chat-DLmikhie.js.br +1 -0
  135. package/payload/server/public/assets/chat-DLmikhie.js.gz +0 -0
  136. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +1 -0
  137. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  138. package/payload/server/public/assets/clock-DKpWWJbJ.js +1 -0
  139. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  140. package/payload/server/public/assets/{copy-Bcjpxqzn.js → copy-nkxspu2J.js} +1 -1
  141. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  142. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  143. package/payload/server/public/assets/data-C1_m9Xyf.js +1 -0
  144. package/payload/server/public/assets/data-C1_m9Xyf.js.br +0 -0
  145. package/payload/server/public/assets/data-C1_m9Xyf.js.gz +0 -0
  146. package/payload/server/public/assets/{field-ChKB2l_d.js → field-2rIXxGMt.js} +1 -1
  147. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  148. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  149. package/payload/server/public/assets/{file-text-COZcf7mU.js → file-text-CdSqrscg.js} +1 -1
  150. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  151. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  152. package/payload/server/public/assets/{graph-nnV47iqM.js → graph-BfBHHXaC.js} +1 -1
  153. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  154. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  155. package/payload/server/public/assets/{graph-labels-x-1MT-3c.js → graph-labels-CHW2aBke.js} +1 -1
  156. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  157. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  158. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css +1 -0
  159. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  160. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.gz +0 -0
  161. package/payload/server/public/assets/{operator-BAO0-mjU.js → operator-BOiL8sxx.js} +1 -1
  162. package/payload/server/public/assets/operator-BOiL8sxx.js.br +0 -0
  163. package/payload/server/public/assets/operator-BOiL8sxx.js.gz +0 -0
  164. package/payload/server/public/assets/page-CZ6tyH8t.js +1 -0
  165. package/payload/server/public/assets/page-CZ6tyH8t.js.br +0 -0
  166. package/payload/server/public/assets/page-CZ6tyH8t.js.gz +0 -0
  167. package/payload/server/public/assets/{page-B-F08pod.js → page-Cd36Y0h6.js} +1 -1
  168. package/payload/server/public/assets/page-Cd36Y0h6.js.br +0 -0
  169. package/payload/server/public/assets/page-Cd36Y0h6.js.gz +0 -0
  170. package/payload/server/public/assets/play-7LTxCuLX.js +1 -0
  171. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  172. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  173. package/payload/server/public/assets/{public-_HJsUohA.js → public-CVBav4FQ.js} +1 -1
  174. package/payload/server/public/assets/public-CVBav4FQ.js.br +0 -0
  175. package/payload/server/public/assets/public-CVBav4FQ.js.gz +0 -0
  176. package/payload/server/public/assets/{rotate-ccw-DJeAnYLQ.js → rotate-ccw-J9f-GWjm.js} +1 -1
  177. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  178. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  179. package/payload/server/public/assets/{routines-CoIVXRCB.js → routines-C1AB-3FR.js} +1 -1
  180. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  181. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  182. package/payload/server/public/assets/{skills-BjHt5lDG.js → skills-C4EfNKEx.js} +1 -1
  183. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  184. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  185. package/payload/server/public/assets/{tasks-iUFfeA9_.js → tasks-DszD3aZl.js} +1 -1
  186. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  187. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  188. package/payload/server/public/assets/{triangle-alert-Dwa986Gg.js → triangle-alert-B5WAyAkC.js} +1 -1
  189. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +4 -0
  190. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  191. package/payload/server/public/assets/{useCopyFeedback-B1Jp6CsE.js → useCopyFeedback-B2nuNNJw.js} +1 -1
  192. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  193. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  194. package/payload/server/public/assets/{useMediaQuery-CVZYjRf6.js → useMediaQuery-DUPJPHQt.js} +1 -1
  195. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  196. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  197. package/payload/server/public/assets/{useVoiceRecorder-D5b4r4z0.js → useVoiceRecorder-BEgr0nHN.js} +1 -1
  198. package/payload/server/public/assets/useVoiceRecorder-BEgr0nHN.js.br +0 -0
  199. package/payload/server/public/assets/useVoiceRecorder-BEgr0nHN.js.gz +0 -0
  200. package/payload/server/public/assets/{wrench-BD7xwbV1.js → wrench-DZJZm17j.js} +1 -1
  201. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  202. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  203. package/payload/server/public/browser.html +5 -5
  204. package/payload/server/public/calendar.html +8 -8
  205. package/payload/server/public/chat.html +14 -14
  206. package/payload/server/public/data.html +12 -12
  207. package/payload/server/public/field.html +3 -3
  208. package/payload/server/public/graph.html +10 -10
  209. package/payload/server/public/index.html +14 -14
  210. package/payload/server/public/operator.html +15 -15
  211. package/payload/server/public/public.html +14 -14
  212. package/payload/server/public/routines.html +8 -8
  213. package/payload/server/public/skills.html +6 -6
  214. package/payload/server/public/tasks.html +7 -7
  215. package/payload/server/server.js +965 -687
  216. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.br +0 -0
  217. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.gz +0 -0
  218. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.br +0 -0
  219. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.gz +0 -0
  220. package/payload/server/public/assets/activity-BWqrCyYM.js.br +0 -0
  221. package/payload/server/public/assets/activity-BWqrCyYM.js.gz +0 -0
  222. package/payload/server/public/assets/admin-zly7Y6EZ.js.br +0 -0
  223. package/payload/server/public/assets/admin-zly7Y6EZ.js.gz +0 -0
  224. package/payload/server/public/assets/agents-BsxGD1V1.js.br +0 -0
  225. package/payload/server/public/assets/agents-BsxGD1V1.js.gz +0 -0
  226. package/payload/server/public/assets/browser-CRLxTaw2.js.br +0 -0
  227. package/payload/server/public/assets/browser-CRLxTaw2.js.gz +0 -0
  228. package/payload/server/public/assets/calendar-Bmp6qI_P.js.br +0 -0
  229. package/payload/server/public/assets/calendar-Bmp6qI_P.js.gz +0 -0
  230. package/payload/server/public/assets/chat-ChObDKHy.js +0 -1
  231. package/payload/server/public/assets/chat-ChObDKHy.js.br +0 -0
  232. package/payload/server/public/assets/chat-ChObDKHy.js.gz +0 -0
  233. package/payload/server/public/assets/chevron-left-D2l4jMcd.js +0 -1
  234. package/payload/server/public/assets/chevron-left-D2l4jMcd.js.br +0 -0
  235. package/payload/server/public/assets/clock-CMdfsroW.js +0 -1
  236. package/payload/server/public/assets/clock-CMdfsroW.js.br +0 -0
  237. package/payload/server/public/assets/clock-CMdfsroW.js.gz +0 -0
  238. package/payload/server/public/assets/copy-Bcjpxqzn.js.br +0 -0
  239. package/payload/server/public/assets/copy-Bcjpxqzn.js.gz +0 -0
  240. package/payload/server/public/assets/data-CFB5Lgw-.js +0 -1
  241. package/payload/server/public/assets/data-CFB5Lgw-.js.br +0 -0
  242. package/payload/server/public/assets/data-CFB5Lgw-.js.gz +0 -0
  243. package/payload/server/public/assets/field-ChKB2l_d.js.br +0 -0
  244. package/payload/server/public/assets/field-ChKB2l_d.js.gz +0 -0
  245. package/payload/server/public/assets/file-text-COZcf7mU.js.br +0 -0
  246. package/payload/server/public/assets/file-text-COZcf7mU.js.gz +0 -0
  247. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.br +0 -0
  248. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.gz +0 -0
  249. package/payload/server/public/assets/graph-nnV47iqM.js.br +0 -0
  250. package/payload/server/public/assets/graph-nnV47iqM.js.gz +0 -0
  251. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css +0 -1
  252. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.br +0 -0
  253. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.gz +0 -0
  254. package/payload/server/public/assets/operator-BAO0-mjU.js.br +0 -0
  255. package/payload/server/public/assets/operator-BAO0-mjU.js.gz +0 -0
  256. package/payload/server/public/assets/page-B-F08pod.js.br +0 -0
  257. package/payload/server/public/assets/page-B-F08pod.js.gz +0 -0
  258. package/payload/server/public/assets/page-BMOCy2aD.js +0 -1
  259. package/payload/server/public/assets/page-BMOCy2aD.js.br +0 -0
  260. package/payload/server/public/assets/page-BMOCy2aD.js.gz +0 -0
  261. package/payload/server/public/assets/play-DFtlk8Zs.js +0 -1
  262. package/payload/server/public/assets/play-DFtlk8Zs.js.br +0 -0
  263. package/payload/server/public/assets/play-DFtlk8Zs.js.gz +0 -0
  264. package/payload/server/public/assets/public-_HJsUohA.js.br +0 -0
  265. package/payload/server/public/assets/public-_HJsUohA.js.gz +0 -0
  266. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.br +0 -0
  267. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.gz +0 -0
  268. package/payload/server/public/assets/routines-CoIVXRCB.js.br +0 -0
  269. package/payload/server/public/assets/routines-CoIVXRCB.js.gz +0 -0
  270. package/payload/server/public/assets/skills-BjHt5lDG.js.br +0 -0
  271. package/payload/server/public/assets/skills-BjHt5lDG.js.gz +0 -0
  272. package/payload/server/public/assets/tasks-iUFfeA9_.js.br +0 -0
  273. package/payload/server/public/assets/tasks-iUFfeA9_.js.gz +0 -0
  274. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.br +0 -0
  275. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.gz +0 -0
  276. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.br +0 -0
  277. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.gz +0 -0
  278. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.br +0 -0
  279. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.gz +0 -0
  280. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.br +0 -0
  281. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.gz +0 -0
  282. package/payload/server/public/assets/wrench-BD7xwbV1.js.br +0 -0
  283. package/payload/server/public/assets/wrench-BD7xwbV1.js.gz +0 -0
  284. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js → jsx-runtime-Cjug_Cyb.js} +0 -0
  285. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.br → jsx-runtime-Cjug_Cyb.js.br} +0 -0
  286. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.gz → jsx-runtime-Cjug_Cyb.js.gz} +0 -0
@@ -0,0 +1,95 @@
1
+ import { describe, expect, it, beforeEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { telegramMediaFetch } from "../tools/media-fetch.js";
6
+ const ACC = "acc-1";
7
+ const BOT = "111";
8
+ let platformRoot;
9
+ let destDir;
10
+ let lines;
11
+ beforeEach(() => {
12
+ const root = mkdtempSync(join(tmpdir(), "brand-"));
13
+ mkdirSync(join(root, "platform"), { recursive: true });
14
+ const dir = join(root, "data", "accounts", ACC);
15
+ mkdirSync(dir, { recursive: true });
16
+ writeFileSync(join(dir, "account.json"), JSON.stringify({ telegram: { bots: [{ id: BOT, role: "admin", token: `${BOT}:SECRET` }] } }), "utf-8");
17
+ platformRoot = join(root, "platform");
18
+ destDir = mkdtempSync(join(tmpdir(), "media-"));
19
+ lines = [];
20
+ });
21
+ function deps(fetchImpl) {
22
+ return {
23
+ platformRoot,
24
+ accountId: ACC,
25
+ callId: "beef",
26
+ log: (l) => lines.push(l),
27
+ fetchImpl,
28
+ };
29
+ }
30
+ /** getFile then the file host, in that order. */
31
+ function twoHop(filePath, bytes) {
32
+ let n = 0;
33
+ return (async () => {
34
+ n += 1;
35
+ return n === 1
36
+ ? new Response(JSON.stringify({ ok: true, result: { file_path: filePath } }))
37
+ : new Response(bytes);
38
+ });
39
+ }
40
+ describe("telegramMediaFetch", () => {
41
+ it("writes the bytes and returns the path and count", async () => {
42
+ const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1, 2, 3]))));
43
+ expect(out.isError).toBe(false);
44
+ expect(out.bytes).toBe(3);
45
+ expect(out.path).toBe(join(destDir, "tg-111-F1.jpg"));
46
+ expect(readFileSync(out.path).length).toBe(3);
47
+ });
48
+ it("takes the extension from Telegram's own file_path", async () => {
49
+ const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("voice/a.oga", new Uint8Array([9]))));
50
+ expect(out.path?.endsWith(".oga")).toBe(true);
51
+ });
52
+ it("escapes a file_id that would traverse out of the destination", async () => {
53
+ const out = await telegramMediaFetch({ botId: BOT, fileId: "../../etc/passwd", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1]))));
54
+ expect(out.path).toBe(join(destDir, "tg-111-______etc_passwd.jpg"));
55
+ });
56
+ it("reports Telegram's own reason when getFile refuses", async () => {
57
+ const fetchImpl = (async () => new Response(JSON.stringify({ ok: false, description: "file is too big" }), {
58
+ status: 400,
59
+ }));
60
+ const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(fetchImpl));
61
+ expect(out.isError).toBe(true);
62
+ expect(out.text).toContain("file is too big");
63
+ });
64
+ it("emits the media census line carrying the byte count", async () => {
65
+ await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1, 2, 3, 4, 5]))));
66
+ expect(lines.join("\n")).toContain("[telegram-media-census] files=1 bytes=5");
67
+ });
68
+ it("refuses an unknown botId and makes no network call", async () => {
69
+ let called = 0;
70
+ const fetchImpl = (async () => {
71
+ called += 1;
72
+ return new Response("{}");
73
+ });
74
+ const out = await telegramMediaFetch({ botId: "999", fileId: "F1", destDir }, deps(fetchImpl));
75
+ expect(out.isError).toBe(true);
76
+ expect(called).toBe(0);
77
+ });
78
+ it("bounds the fetch, so a hung Telegram cannot hang the tool for ever", async () => {
79
+ // Without a signal this call never returns. Every other Telegram call in
80
+ // this plugin is bounded by callBotApi's 30s default (bot-api.ts:41); the
81
+ // primitives take a signal but default to none, so the bound has to be
82
+ // supplied here and a test is the only thing that proves it was.
83
+ const hangs = ((_url, init) => new Promise((_resolve, reject) => {
84
+ init.signal?.addEventListener("abort", () => reject(new Error("aborted")));
85
+ }));
86
+ const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, { ...deps(hangs), timeoutMs: 40 });
87
+ expect(out.isError).toBe(true);
88
+ expect(out.text).toContain("aborted");
89
+ });
90
+ it("never puts the token in a log line", async () => {
91
+ await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1]))));
92
+ expect(lines.join("\n")).not.toContain("SECRET");
93
+ });
94
+ });
95
+ //# sourceMappingURL=media-fetch-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-fetch-tool.test.js","sourceRoot":"","sources":["../../src/__tests__/media-fetch-tool.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,GAAG,GAAG,OAAO,CAAC;AACpB,MAAM,GAAG,GAAG,KAAK,CAAC;AAClB,IAAI,YAAoB,CAAC;AACzB,IAAI,OAAe,CAAC;AACpB,IAAI,KAAe,CAAC;AAEpB,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,EAC5F,OAAO,CACR,CAAC;IACF,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtC,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChD,KAAK,GAAG,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,SAAS,IAAI,CAAC,SAAuB;IACnC,OAAO;QACL,YAAY;QACZ,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,SAAS;KACV,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,SAAS,MAAM,CAAC,QAAgB,EAAE,KAAiB;IACjD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,KAAK,IAAI,EAAE;QACjB,CAAC,IAAI,CAAC,CAAC;QACP,OAAO,CAAC,KAAK,CAAC;YACZ,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7E,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAA4B,CAAC;AAChC,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EACrC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EACrC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,EACnD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAClD,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE,CAC5B,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,EAAE;YAC1E,MAAM,EAAE,GAAG;SACZ,CAAC,CAA4B,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,kBAAkB,CACtB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EACrC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAA4B,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/F,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,KAAK,GAAG,CAAC,CAAC,IAAY,EAAE,IAAiB,EAAE,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC/B,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAA4B,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EACrC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAClC,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,kBAAkB,CACtB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EACrC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAClD,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=media-send-tool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-send-tool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/media-send-tool.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,293 @@
1
+ import { describe, expect, it, beforeEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { telegramMediaSend, MEDIA_SEND_METHOD } from "../tools/media-send.js";
6
+ const ACC = "acc-1";
7
+ const BOT = "111";
8
+ let platformRoot;
9
+ let lines;
10
+ beforeEach(() => {
11
+ const root = mkdtempSync(join(tmpdir(), "brand-"));
12
+ mkdirSync(join(root, "platform"), { recursive: true });
13
+ const dir = join(root, "data", "accounts", ACC);
14
+ mkdirSync(dir, { recursive: true });
15
+ writeFileSync(join(dir, "account.json"), JSON.stringify({ telegram: { bots: [{ id: BOT, role: "admin", token: `${BOT}:SECRET` }] } }), "utf-8");
16
+ platformRoot = join(root, "platform");
17
+ lines = [];
18
+ });
19
+ /** Unlike the other tool recorders this one must see BOTH body shapes: the
20
+ * whole point of the tool is that a file_id goes as JSON and a local path goes
21
+ * as multipart, and a recorder that JSON.parses blindly cannot tell them
22
+ * apart. */
23
+ function recorder(reply) {
24
+ const calls = [];
25
+ const fetchImpl = (async (url, init) => {
26
+ const isForm = init.body instanceof FormData;
27
+ calls.push({
28
+ method: String(url).split("/").pop() ?? "",
29
+ body: isForm ? null : JSON.parse(String(init.body)),
30
+ form: isForm ? init.body : null,
31
+ });
32
+ return new Response(JSON.stringify(reply));
33
+ });
34
+ return { calls, fetchImpl };
35
+ }
36
+ function deps(fetchImpl) {
37
+ return {
38
+ platformRoot,
39
+ accountId: ACC,
40
+ callId: "cafe",
41
+ log: (l) => lines.push(l),
42
+ fetchImpl,
43
+ };
44
+ }
45
+ function tempFile(name) {
46
+ const path = join(mkdtempSync(join(tmpdir(), "media-")), name);
47
+ writeFileSync(path, "BYTES");
48
+ return path;
49
+ }
50
+ describe("MEDIA_SEND_METHOD", () => {
51
+ it("maps every kind to its Bot API method name", () => {
52
+ expect(MEDIA_SEND_METHOD).toEqual({
53
+ photo: "sendPhoto",
54
+ document: "sendDocument",
55
+ video: "sendVideo",
56
+ audio: "sendAudio",
57
+ voice: "sendVoice",
58
+ animation: "sendAnimation",
59
+ videoNote: "sendVideoNote",
60
+ group: "sendMediaGroup",
61
+ editMedia: "editMessageMedia",
62
+ editCaption: "editMessageCaption",
63
+ });
64
+ });
65
+ });
66
+ describe("telegramMediaSend routes", () => {
67
+ it("sends a file_id as a plain string in a JSON body", async () => {
68
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
69
+ const out = await telegramMediaSend({ botId: BOT, chatId: 9, kind: "photo", fileId: "AgACAgQ" }, deps(fetchImpl));
70
+ expect(out.route).toBe("file-id");
71
+ expect(calls[0]?.form).toBeNull();
72
+ expect(calls[0]?.body).toEqual({ chat_id: 9, photo: "AgACAgQ" });
73
+ });
74
+ it("sends an https URL as a plain string in a JSON body", async () => {
75
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
76
+ const out = await telegramMediaSend({ botId: BOT, chatId: 9, kind: "document", url: "https://example.com/spec.pdf" }, deps(fetchImpl));
77
+ expect(out.route).toBe("url");
78
+ expect(calls[0]?.form).toBeNull();
79
+ expect(calls[0]?.body).toEqual({ chat_id: 9, document: "https://example.com/spec.pdf" });
80
+ });
81
+ it("sends a local path as a multipart file part", async () => {
82
+ const path = tempFile("before.jpg");
83
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
84
+ const out = await telegramMediaSend({ botId: BOT, chatId: 9, kind: "photo", filePath: path, caption: "Before" }, deps(fetchImpl));
85
+ expect(out.route).toBe("multipart");
86
+ const form = calls[0]?.form;
87
+ expect(form).toBeInstanceOf(FormData);
88
+ expect(form?.get("chat_id")).toBe("9");
89
+ expect(form?.get("caption")).toBe("Before");
90
+ expect(form?.get("photo")).toBeInstanceOf(Blob);
91
+ });
92
+ it("uses the method's own field name for the file", async () => {
93
+ for (const [kind, field] of [
94
+ ["video", "video"],
95
+ ["audio", "audio"],
96
+ ["voice", "voice"],
97
+ ["animation", "animation"],
98
+ ["videoNote", "video_note"],
99
+ ]) {
100
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
101
+ await telegramMediaSend({ botId: BOT, chatId: 1, kind, fileId: "F" }, deps(fetchImpl));
102
+ expect(calls[0]?.body).toEqual({ chat_id: 1, [field]: "F" });
103
+ }
104
+ });
105
+ });
106
+ describe("telegramMediaSend refusals", () => {
107
+ it("refuses a send with no source, before any network call", async () => {
108
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
109
+ const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo" }, deps(fetchImpl));
110
+ expect(out.isError).toBe(true);
111
+ expect(out.text).toContain("fileId");
112
+ expect(calls.length).toBe(0);
113
+ });
114
+ it("refuses two sources at once, before any network call", async () => {
115
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
116
+ const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo", fileId: "A", url: "https://x/y.jpg" }, deps(fetchImpl));
117
+ expect(out.isError).toBe(true);
118
+ expect(calls.length).toBe(0);
119
+ });
120
+ it("refuses a video note by URL, which Telegram does not support", async () => {
121
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
122
+ const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "videoNote", url: "https://x/y.mp4" }, deps(fetchImpl));
123
+ expect(out.isError).toBe(true);
124
+ expect(out.text).toContain("video note");
125
+ expect(calls.length).toBe(0);
126
+ });
127
+ it("refuses a batch of one, which Telegram documents as 2-10 items", async () => {
128
+ const { calls, fetchImpl } = recorder({ ok: true, result: [] });
129
+ const out = await telegramMediaSend({ botId: BOT, chatId: 4, kind: "group", items: [{ type: "photo", fileId: "A" }] }, deps(fetchImpl));
130
+ expect(out.isError).toBe(true);
131
+ expect(calls.length).toBe(0);
132
+ });
133
+ it("refuses editMedia with no mediaType, before any network call", async () => {
134
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
135
+ const out = await telegramMediaSend({ botId: BOT, chatId: 4, kind: "editMedia", messageId: 7, fileId: "A" }, deps(fetchImpl));
136
+ expect(out.isError).toBe(true);
137
+ expect(out.text).toContain("mediaType");
138
+ expect(calls.length).toBe(0);
139
+ });
140
+ });
141
+ describe("telegramMediaSend batches and edits", () => {
142
+ it("wires a mixed batch: file_id inline, local paths as attach:// parts", async () => {
143
+ const path = tempFile("two.jpg");
144
+ const { calls, fetchImpl } = recorder({
145
+ ok: true,
146
+ result: [{ message_id: 1 }, { message_id: 2 }],
147
+ });
148
+ await telegramMediaSend({
149
+ botId: BOT,
150
+ chatId: 4,
151
+ kind: "group",
152
+ items: [
153
+ { type: "photo", fileId: "AgACAgQ", caption: "one" },
154
+ { type: "photo", filePath: path },
155
+ ],
156
+ }, deps(fetchImpl));
157
+ const form = calls[0]?.form;
158
+ expect(JSON.parse(String(form?.get("media")))).toEqual([
159
+ { type: "photo", media: "AgACAgQ", caption: "one" },
160
+ { type: "photo", media: "attach://item1" },
161
+ ]);
162
+ expect(form?.get("item1")).toBeInstanceOf(Blob);
163
+ });
164
+ it("sends a batch of already-uploaded files as JSON, with no form at all", async () => {
165
+ const { calls, fetchImpl } = recorder({
166
+ ok: true,
167
+ result: [{ message_id: 1 }, { message_id: 2 }],
168
+ });
169
+ await telegramMediaSend({
170
+ botId: BOT,
171
+ chatId: 4,
172
+ kind: "group",
173
+ items: [
174
+ { type: "photo", fileId: "A" },
175
+ { type: "photo", url: "https://x/y.jpg" },
176
+ ],
177
+ }, deps(fetchImpl));
178
+ expect(calls[0]?.form).toBeNull();
179
+ expect(calls[0]?.body).toEqual({
180
+ chat_id: 4,
181
+ media: [
182
+ { type: "photo", media: "A" },
183
+ { type: "photo", media: "https://x/y.jpg" },
184
+ ],
185
+ });
186
+ });
187
+ it("reports the batch route only when every item agrees, and mixed when they do not", async () => {
188
+ // A single label is a lie for an album whose items chose different ways,
189
+ // and the route field exists to stop a reader looking down the wrong
190
+ // branch. Any local file still makes the whole request multipart.
191
+ const allUrls = recorder({ ok: true, result: [] });
192
+ const a = await telegramMediaSend({
193
+ botId: BOT,
194
+ chatId: 4,
195
+ kind: "group",
196
+ items: [
197
+ { type: "photo", url: "https://x/1.jpg" },
198
+ { type: "photo", url: "https://x/2.jpg" },
199
+ ],
200
+ }, deps(allUrls.fetchImpl));
201
+ expect(a.route).toBe("url");
202
+ const mixed = recorder({ ok: true, result: [] });
203
+ const b = await telegramMediaSend({
204
+ botId: BOT,
205
+ chatId: 4,
206
+ kind: "group",
207
+ items: [
208
+ { type: "photo", fileId: "A" },
209
+ { type: "photo", url: "https://x/2.jpg" },
210
+ ],
211
+ }, deps(mixed.fetchImpl));
212
+ expect(b.route).toBe("mixed");
213
+ const withLocal = recorder({ ok: true, result: [] });
214
+ const c = await telegramMediaSend({
215
+ botId: BOT,
216
+ chatId: 4,
217
+ kind: "group",
218
+ items: [
219
+ { type: "photo", url: "https://x/1.jpg" },
220
+ { type: "photo", filePath: tempFile("three.jpg") },
221
+ ],
222
+ }, deps(withLocal.fetchImpl));
223
+ expect(c.route).toBe("multipart");
224
+ });
225
+ it("withholds the send-envelope options from the two edit kinds", async () => {
226
+ // Telegram's tables carry reply_markup on editMessageMedia and
227
+ // editMessageCaption and none of the send-envelope options, so a caller
228
+ // setting them on an edit must not have them reach the wire.
229
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 7 } });
230
+ await telegramMediaSend({
231
+ botId: BOT,
232
+ chatId: 4,
233
+ kind: "editCaption",
234
+ messageId: 7,
235
+ caption: "After",
236
+ disableNotification: true,
237
+ protectContent: true,
238
+ replyToMessageId: 3,
239
+ messageThreadId: 8,
240
+ buttons: [[{ text: "Ok", callbackData: "ok" }]],
241
+ }, deps(fetchImpl));
242
+ expect(calls[0]?.body).toEqual({
243
+ chat_id: 4,
244
+ message_id: 7,
245
+ caption: "After",
246
+ reply_markup: { inline_keyboard: [[{ text: "Ok", callback_data: "ok" }]] },
247
+ });
248
+ });
249
+ it("edits a message's media, naming the type Telegram's InputMedia needs", async () => {
250
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 7 } });
251
+ await telegramMediaSend({
252
+ botId: BOT,
253
+ chatId: 4,
254
+ kind: "editMedia",
255
+ messageId: 7,
256
+ mediaType: "photo",
257
+ fileId: "AgACAgQ",
258
+ caption: "Replaced",
259
+ }, deps(fetchImpl));
260
+ expect(calls[0]?.method).toBe("editMessageMedia");
261
+ expect(calls[0]?.body).toEqual({
262
+ chat_id: 4,
263
+ message_id: 7,
264
+ media: { type: "photo", media: "AgACAgQ", caption: "Replaced" },
265
+ });
266
+ });
267
+ it("edits a caption with no media route at all", async () => {
268
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 7 } });
269
+ const out = await telegramMediaSend({ botId: BOT, chatId: 4, kind: "editCaption", messageId: 7, caption: "After" }, deps(fetchImpl));
270
+ expect(out.route).toBe("none");
271
+ expect(calls[0]?.body).toEqual({ chat_id: 4, message_id: 7, caption: "After" });
272
+ });
273
+ });
274
+ describe("telegramMediaSend observability", () => {
275
+ it("puts the route on the op=call line", async () => {
276
+ const { fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
277
+ await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo", fileId: "A" }, deps(fetchImpl));
278
+ expect(lines.join("\n")).toContain("op=call tool=telegram-media-send method=sendPhoto callId=cafe");
279
+ expect(lines.join("\n")).toContain("route=file-id");
280
+ expect(lines.join("\n")).toContain("op=result callId=cafe");
281
+ });
282
+ it("relays Telegram's refusal unaltered", async () => {
283
+ const { fetchImpl } = recorder({
284
+ ok: false,
285
+ error_code: 400,
286
+ description: "Bad Request: wrong file identifier/HTTP URL specified",
287
+ });
288
+ const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo", fileId: "nope" }, deps(fetchImpl));
289
+ expect(out.isError).toBe(true);
290
+ expect(out.text).toContain("wrong file identifier");
291
+ });
292
+ });
293
+ //# sourceMappingURL=media-send-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-send-tool.test.js","sourceRoot":"","sources":["../../src/__tests__/media-send-tool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schemas.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schemas.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { z } from "zod";
3
+ import { ASK_SHAPE, CARD_SHAPE, INVOICE_SHAPE, MEDIA_FETCH_SHAPE, MEDIA_SEND_SHAPE, THREAD_SHAPE, } from "../tools/schemas.js";
4
+ const card = z.object(CARD_SHAPE);
5
+ const mediaFetch = z.object(MEDIA_FETCH_SHAPE);
6
+ const thread = z.object(THREAD_SHAPE);
7
+ const ask = z.object(ASK_SHAPE);
8
+ const mediaSend = z.object(MEDIA_SEND_SHAPE);
9
+ const invoice = z.object(INVOICE_SHAPE);
10
+ describe("CARD_SHAPE", () => {
11
+ it("accepts a minimal valid card", () => {
12
+ expect(card.safeParse({ botId: "111", chatId: 222, text: "hi" }).success).toBe(true);
13
+ });
14
+ it("rejects a card with no text, naming the field", () => {
15
+ const out = card.safeParse({ botId: "111", chatId: 222 });
16
+ expect(out.success).toBe(false);
17
+ expect(JSON.stringify(out.error?.issues)).toContain("text");
18
+ });
19
+ it("rejects a card with no botId", () => {
20
+ expect(card.safeParse({ chatId: 222, text: "hi" }).success).toBe(false);
21
+ });
22
+ it("rejects a parseMode outside the three Telegram documents", () => {
23
+ expect(card.safeParse({ botId: "1", chatId: 2, text: "t", parseMode: "rtf" }).success).toBe(false);
24
+ });
25
+ it("rejects a button row that is not an array of rows", () => {
26
+ expect(card.safeParse({ botId: "1", chatId: 2, text: "t", buttons: [{ text: "flat" }] }).success).toBe(false);
27
+ });
28
+ it("rejects a button with no label", () => {
29
+ expect(card.safeParse({ botId: "1", chatId: 2, text: "t", buttons: [[{ callbackData: "x" }]] })
30
+ .success).toBe(false);
31
+ });
32
+ it("accepts either a string or a number chatId, which Telegram documents as both", () => {
33
+ expect(card.safeParse({ botId: "1", chatId: "@chan", text: "t" }).success).toBe(true);
34
+ expect(card.safeParse({ botId: "1", chatId: -100123, text: "t" }).success).toBe(true);
35
+ });
36
+ });
37
+ describe("MEDIA_FETCH_SHAPE", () => {
38
+ it("accepts botId plus fileId", () => {
39
+ expect(mediaFetch.safeParse({ botId: "111", fileId: "F" }).success).toBe(true);
40
+ });
41
+ it("rejects a fetch with no fileId", () => {
42
+ const out = mediaFetch.safeParse({ botId: "111" });
43
+ expect(out.success).toBe(false);
44
+ expect(JSON.stringify(out.error?.issues)).toContain("fileId");
45
+ });
46
+ });
47
+ describe("THREAD_SHAPE", () => {
48
+ it("accepts a create with a name", () => {
49
+ expect(thread.safeParse({ botId: "1", chatId: 2, action: "create", name: "Job" }).success).toBe(true);
50
+ });
51
+ it("rejects an action Telegram has no method for", () => {
52
+ expect(thread.safeParse({ botId: "1", chatId: 2, action: "archive" }).success).toBe(false);
53
+ });
54
+ it("rejects a messageThreadId that is not a number", () => {
55
+ expect(thread.safeParse({ botId: "1", chatId: 2, action: "close", messageThreadId: "9" }).success).toBe(false);
56
+ });
57
+ });
58
+ describe("ASK_SHAPE", () => {
59
+ it("accepts a minimal poll", () => {
60
+ expect(ask.safeParse({ botId: "1", chatId: 2, kind: "poll", question: "q", options: ["a"] }).success).toBe(true);
61
+ });
62
+ it("rejects a kind Telegram has no method for", () => {
63
+ expect(ask.safeParse({ botId: "1", chatId: 2, kind: "survey" }).success).toBe(false);
64
+ });
65
+ it("rejects a checklist task with no text", () => {
66
+ expect(ask.safeParse({
67
+ botId: "1",
68
+ chatId: 2,
69
+ kind: "checklist",
70
+ businessConnectionId: "b",
71
+ checklist: { title: "t", tasks: [{ id: 1 }] },
72
+ }).success).toBe(false);
73
+ });
74
+ it("rejects a latitude that is not a number", () => {
75
+ expect(ask.safeParse({ botId: "1", chatId: 2, kind: "location", latitude: "51.5", longitude: -0.1 })
76
+ .success).toBe(false);
77
+ });
78
+ });
79
+ describe("MEDIA_SEND_SHAPE", () => {
80
+ it("accepts a photo by file_id", () => {
81
+ expect(mediaSend.safeParse({ botId: "1", chatId: 2, kind: "photo", fileId: "A" }).success).toBe(true);
82
+ });
83
+ it("rejects a kind Telegram has no method for", () => {
84
+ expect(mediaSend.safeParse({ botId: "1", chatId: 2, kind: "sticker", fileId: "A" }).success).toBe(false);
85
+ });
86
+ it("rejects a batch item with no type", () => {
87
+ expect(mediaSend.safeParse({ botId: "1", chatId: 2, kind: "group", items: [{ fileId: "A" }] })
88
+ .success).toBe(false);
89
+ });
90
+ });
91
+ describe("INVOICE_SHAPE", () => {
92
+ it("accepts a Stars invoice", () => {
93
+ expect(invoice.safeParse({
94
+ botId: "1",
95
+ action: "send",
96
+ chatId: 2,
97
+ title: "t",
98
+ description: "d",
99
+ payload: "p",
100
+ currency: "XTR",
101
+ prices: [{ label: "l", amount: 1 }],
102
+ }).success).toBe(true);
103
+ });
104
+ it("rejects an action Telegram has no method for", () => {
105
+ expect(invoice.safeParse({ botId: "1", action: "chargeback" }).success).toBe(false);
106
+ });
107
+ it("rejects a price with no amount", () => {
108
+ expect(invoice.safeParse({
109
+ botId: "1",
110
+ action: "link",
111
+ title: "t",
112
+ description: "d",
113
+ payload: "p",
114
+ currency: "XTR",
115
+ prices: [{ label: "l" }],
116
+ }).success).toBe(false);
117
+ });
118
+ });
119
+ describe("the shapes and telegram-api's own params field", () => {
120
+ it("names every field, unlike the passthrough's z.record(z.unknown())", () => {
121
+ // The defect Task 2588 exists to fix: a passthrough params object accepts
122
+ // anything at all, so a typo reaches the wire. Each typed shape must reject
123
+ // a body that carries only an unknown key.
124
+ for (const shape of [card, mediaFetch, thread, ask, mediaSend, invoice]) {
125
+ expect(shape.safeParse({ nonsense: true }).success).toBe(false);
126
+ }
127
+ expect(z.record(z.unknown()).safeParse({ nonsense: true }).success).toBe(true);
128
+ });
129
+ });
130
+ //# sourceMappingURL=schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../src/__tests__/schemas.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=thread-tool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-tool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-tool.test.ts"],"names":[],"mappings":""}