@rubytech/create-maxy-code 0.1.579 → 0.1.581

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 (325) 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/platform-architecture/SKILL.md +13 -1
  19. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +16 -0
  20. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-schema-shape.test.ts +23 -0
  21. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visit-status-write.test.ts +175 -3
  22. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +101 -0
  23. package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +35 -1
  24. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visit-status.ts +73 -8
  25. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +59 -8
  26. package/payload/platform/plugins/docs/references/telegram-guide.md +12 -0
  27. package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
  28. package/payload/platform/plugins/telegram/PLUGIN.md +27 -3
  29. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +99 -1
  30. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js.map +1 -1
  31. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts +2 -0
  32. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts.map +1 -0
  33. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +226 -0
  34. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -0
  35. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.test.d.ts +2 -0
  36. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.test.d.ts.map +1 -0
  37. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.test.js +75 -0
  38. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.test.js.map +1 -0
  39. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts +2 -0
  40. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts.map +1 -0
  41. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js +152 -0
  42. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js.map +1 -0
  43. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts +2 -0
  44. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts.map +1 -0
  45. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +231 -0
  46. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -0
  47. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts +2 -0
  48. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts.map +1 -0
  49. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js +196 -0
  50. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js.map +1 -0
  51. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.d.ts +2 -0
  52. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.d.ts.map +1 -0
  53. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.js +93 -0
  54. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.js.map +1 -0
  55. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.d.ts +2 -0
  56. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.d.ts.map +1 -0
  57. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.js +76 -0
  58. package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.js.map +1 -0
  59. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts +2 -0
  60. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts.map +1 -0
  61. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js +95 -0
  62. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js.map +1 -0
  63. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts +2 -0
  64. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts.map +1 -0
  65. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js +293 -0
  66. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js.map +1 -0
  67. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts +2 -0
  68. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts.map +1 -0
  69. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js +130 -0
  70. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js.map +1 -0
  71. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts +2 -0
  72. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts.map +1 -0
  73. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +119 -0
  74. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -0
  75. package/payload/platform/plugins/telegram/mcp/dist/index.js +89 -66
  76. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  77. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +15 -0
  78. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  79. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +27 -10
  80. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  81. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts +38 -0
  82. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
  83. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +106 -0
  84. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
  85. package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.d.ts +15 -0
  86. package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.d.ts.map +1 -0
  87. package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.js +78 -0
  88. package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.js.map +1 -0
  89. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts +60 -0
  90. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts.map +1 -0
  91. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js +141 -0
  92. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js.map +1 -0
  93. package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.d.ts +44 -0
  94. package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.d.ts.map +1 -0
  95. package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.js +88 -0
  96. package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.js.map +1 -0
  97. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts +73 -0
  98. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -0
  99. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +270 -0
  100. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -0
  101. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +34 -0
  102. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -0
  103. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +140 -0
  104. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -0
  105. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts +70 -0
  106. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -0
  107. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +232 -0
  108. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -0
  109. package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.d.ts +23 -0
  110. package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.d.ts.map +1 -0
  111. package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.js +43 -0
  112. package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.js.map +1 -0
  113. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts +42 -0
  114. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts.map +1 -0
  115. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js +92 -0
  116. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js.map +1 -0
  117. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts +76 -0
  118. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -0
  119. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +288 -0
  120. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -0
  121. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +250 -0
  122. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -0
  123. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +400 -0
  124. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -0
  125. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts +38 -0
  126. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -0
  127. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +120 -0
  128. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -0
  129. package/payload/platform/plugins/telegram/mcp/vitest.config.ts +14 -0
  130. package/payload/platform/plugins/telegram/skills/build/SKILL.md +171 -21
  131. package/payload/platform/scripts/__tests__/hook-matcher-dispatch.test.sh +163 -0
  132. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  133. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +7 -1
  134. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  135. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  136. package/payload/platform/services/telegram-channel/dist/instructions.js +15 -1
  137. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  138. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  139. package/payload/server/{adminuser-self-heal-Y4U3UNKF.js → adminuser-self-heal-ZHFNDKJK.js} +2 -10
  140. package/payload/server/{chunk-637C2FGE.js → chunk-BFRB2U75.js} +3278 -3381
  141. package/payload/server/{chunk-6DQCFP2E.js → chunk-BTXRBXMU.js} +3785 -4090
  142. package/payload/server/{chunk-KVR2FT6O.js → chunk-HYQNUVGO.js} +1 -12
  143. package/payload/server/{chunk-PGGGWUBM.js → chunk-SKYZG6OT.js} +224 -372
  144. package/payload/server/{manager-R3XH3BNM.js → manager-CTVTF4YB.js} +3 -3
  145. package/payload/server/maxy-edge.js +4 -27
  146. package/payload/server/public/activity.html +6 -6
  147. package/payload/server/public/agents.html +5 -5
  148. package/payload/server/public/assets/{AdminLoginScreens-Bus-Y-rG.js → AdminLoginScreens-B1lu4-_F.js} +1 -1
  149. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.br +0 -0
  150. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.gz +0 -0
  151. package/payload/server/public/assets/{AdminShell-Bsm7q3CW.js → AdminShell-BMslfZxN.js} +1 -1
  152. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  153. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  154. package/payload/server/public/assets/{activity-BWqrCyYM.js → activity-kQ3w70LJ.js} +1 -1
  155. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  156. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  157. package/payload/server/public/assets/{admin-zly7Y6EZ.js → admin-CkASgYA7.js} +1 -1
  158. package/payload/server/public/assets/admin-CkASgYA7.js.br +0 -0
  159. package/payload/server/public/assets/admin-CkASgYA7.js.gz +0 -0
  160. package/payload/server/public/assets/{agents-BsxGD1V1.js → agents-Cn_bZgnD.js} +1 -1
  161. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  162. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  163. package/payload/server/public/assets/{browser-CRLxTaw2.js → browser-BE-GDk5-.js} +1 -1
  164. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  165. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  166. package/payload/server/public/assets/{calendar-Bmp6qI_P.js → calendar-Di7BEHHN.js} +1 -1
  167. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  168. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  169. package/payload/server/public/assets/chat-CKyMT5Ai.js +1 -0
  170. package/payload/server/public/assets/chat-CKyMT5Ai.js.br +1 -0
  171. package/payload/server/public/assets/chat-CKyMT5Ai.js.gz +0 -0
  172. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +1 -0
  173. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  174. package/payload/server/public/assets/clock-DKpWWJbJ.js +1 -0
  175. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  176. package/payload/server/public/assets/{copy-Bcjpxqzn.js → copy-nkxspu2J.js} +1 -1
  177. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  178. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  179. package/payload/server/public/assets/data-1c33cAHp.js +1 -0
  180. package/payload/server/public/assets/data-1c33cAHp.js.br +2 -0
  181. package/payload/server/public/assets/data-1c33cAHp.js.gz +0 -0
  182. package/payload/server/public/assets/{field-ChKB2l_d.js → field-2rIXxGMt.js} +1 -1
  183. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  184. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  185. package/payload/server/public/assets/{file-text-COZcf7mU.js → file-text-CdSqrscg.js} +1 -1
  186. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  187. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  188. package/payload/server/public/assets/{graph-nnV47iqM.js → graph-BfBHHXaC.js} +1 -1
  189. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  190. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  191. package/payload/server/public/assets/{graph-labels-x-1MT-3c.js → graph-labels-CHW2aBke.js} +1 -1
  192. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  193. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  194. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css +1 -0
  195. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  196. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.gz +0 -0
  197. package/payload/server/public/assets/{operator-BAO0-mjU.js → operator-DRn9LITC.js} +1 -1
  198. package/payload/server/public/assets/operator-DRn9LITC.js.br +0 -0
  199. package/payload/server/public/assets/operator-DRn9LITC.js.gz +0 -0
  200. package/payload/server/public/assets/page-BwqQsoU8.js +1 -0
  201. package/payload/server/public/assets/page-BwqQsoU8.js.br +0 -0
  202. package/payload/server/public/assets/page-BwqQsoU8.js.gz +0 -0
  203. package/payload/server/public/assets/{page-B-F08pod.js → page-D_9mPS6W.js} +1 -1
  204. package/payload/server/public/assets/page-D_9mPS6W.js.br +0 -0
  205. package/payload/server/public/assets/page-D_9mPS6W.js.gz +0 -0
  206. package/payload/server/public/assets/play-7LTxCuLX.js +1 -0
  207. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  208. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  209. package/payload/server/public/assets/{public-_HJsUohA.js → public-CrjZYpdW.js} +1 -1
  210. package/payload/server/public/assets/public-CrjZYpdW.js.br +0 -0
  211. package/payload/server/public/assets/public-CrjZYpdW.js.gz +0 -0
  212. package/payload/server/public/assets/{rotate-ccw-DJeAnYLQ.js → rotate-ccw-J9f-GWjm.js} +1 -1
  213. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  214. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  215. package/payload/server/public/assets/{routines-CoIVXRCB.js → routines-C1AB-3FR.js} +1 -1
  216. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  217. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  218. package/payload/server/public/assets/{skills-BjHt5lDG.js → skills-C4EfNKEx.js} +1 -1
  219. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  220. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  221. package/payload/server/public/assets/{tasks-iUFfeA9_.js → tasks-DszD3aZl.js} +1 -1
  222. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  223. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  224. package/payload/server/public/assets/{triangle-alert-Dwa986Gg.js → triangle-alert-B5WAyAkC.js} +1 -1
  225. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +4 -0
  226. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  227. package/payload/server/public/assets/{useCopyFeedback-B1Jp6CsE.js → useCopyFeedback-B2nuNNJw.js} +1 -1
  228. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  229. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  230. package/payload/server/public/assets/{useMediaQuery-CVZYjRf6.js → useMediaQuery-DUPJPHQt.js} +1 -1
  231. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  232. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  233. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js +2 -0
  234. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.br +0 -0
  235. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.gz +0 -0
  236. package/payload/server/public/assets/{wrench-BD7xwbV1.js → wrench-DZJZm17j.js} +1 -1
  237. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  238. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  239. package/payload/server/public/browser.html +5 -5
  240. package/payload/server/public/calendar.html +8 -8
  241. package/payload/server/public/chat.html +14 -14
  242. package/payload/server/public/data.html +12 -12
  243. package/payload/server/public/field.html +3 -3
  244. package/payload/server/public/graph.html +10 -10
  245. package/payload/server/public/index.html +14 -14
  246. package/payload/server/public/operator.html +15 -15
  247. package/payload/server/public/public.html +14 -14
  248. package/payload/server/public/routines.html +8 -8
  249. package/payload/server/public/skills.html +6 -6
  250. package/payload/server/public/tasks.html +7 -7
  251. package/payload/server/server.js +10561 -10491
  252. package/payload/server/{src-IJCLNFYU.js → src-MM64CYYZ.js} +1 -1
  253. package/payload/server/{userprofile-reconcile-PUA657YX.js → userprofile-reconcile-TL4JKBPG.js} +1 -8
  254. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.br +0 -0
  255. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.gz +0 -0
  256. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.br +0 -0
  257. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.gz +0 -0
  258. package/payload/server/public/assets/activity-BWqrCyYM.js.br +0 -0
  259. package/payload/server/public/assets/activity-BWqrCyYM.js.gz +0 -0
  260. package/payload/server/public/assets/admin-zly7Y6EZ.js.br +0 -0
  261. package/payload/server/public/assets/admin-zly7Y6EZ.js.gz +0 -0
  262. package/payload/server/public/assets/agents-BsxGD1V1.js.br +0 -0
  263. package/payload/server/public/assets/agents-BsxGD1V1.js.gz +0 -0
  264. package/payload/server/public/assets/browser-CRLxTaw2.js.br +0 -0
  265. package/payload/server/public/assets/browser-CRLxTaw2.js.gz +0 -0
  266. package/payload/server/public/assets/calendar-Bmp6qI_P.js.br +0 -0
  267. package/payload/server/public/assets/calendar-Bmp6qI_P.js.gz +0 -0
  268. package/payload/server/public/assets/chat-ChObDKHy.js +0 -1
  269. package/payload/server/public/assets/chat-ChObDKHy.js.br +0 -0
  270. package/payload/server/public/assets/chat-ChObDKHy.js.gz +0 -0
  271. package/payload/server/public/assets/chevron-left-D2l4jMcd.js +0 -1
  272. package/payload/server/public/assets/chevron-left-D2l4jMcd.js.br +0 -0
  273. package/payload/server/public/assets/clock-CMdfsroW.js +0 -1
  274. package/payload/server/public/assets/clock-CMdfsroW.js.br +0 -0
  275. package/payload/server/public/assets/clock-CMdfsroW.js.gz +0 -0
  276. package/payload/server/public/assets/copy-Bcjpxqzn.js.br +0 -0
  277. package/payload/server/public/assets/copy-Bcjpxqzn.js.gz +0 -0
  278. package/payload/server/public/assets/data-CFB5Lgw-.js +0 -1
  279. package/payload/server/public/assets/data-CFB5Lgw-.js.br +0 -0
  280. package/payload/server/public/assets/data-CFB5Lgw-.js.gz +0 -0
  281. package/payload/server/public/assets/field-ChKB2l_d.js.br +0 -0
  282. package/payload/server/public/assets/field-ChKB2l_d.js.gz +0 -0
  283. package/payload/server/public/assets/file-text-COZcf7mU.js.br +0 -0
  284. package/payload/server/public/assets/file-text-COZcf7mU.js.gz +0 -0
  285. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.br +0 -0
  286. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.gz +0 -0
  287. package/payload/server/public/assets/graph-nnV47iqM.js.br +0 -0
  288. package/payload/server/public/assets/graph-nnV47iqM.js.gz +0 -0
  289. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css +0 -1
  290. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.br +0 -0
  291. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.gz +0 -0
  292. package/payload/server/public/assets/operator-BAO0-mjU.js.br +0 -0
  293. package/payload/server/public/assets/operator-BAO0-mjU.js.gz +0 -0
  294. package/payload/server/public/assets/page-B-F08pod.js.br +0 -0
  295. package/payload/server/public/assets/page-B-F08pod.js.gz +0 -0
  296. package/payload/server/public/assets/page-BMOCy2aD.js +0 -1
  297. package/payload/server/public/assets/page-BMOCy2aD.js.br +0 -0
  298. package/payload/server/public/assets/page-BMOCy2aD.js.gz +0 -0
  299. package/payload/server/public/assets/play-DFtlk8Zs.js +0 -1
  300. package/payload/server/public/assets/play-DFtlk8Zs.js.br +0 -0
  301. package/payload/server/public/assets/play-DFtlk8Zs.js.gz +0 -0
  302. package/payload/server/public/assets/public-_HJsUohA.js.br +0 -0
  303. package/payload/server/public/assets/public-_HJsUohA.js.gz +0 -0
  304. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.br +0 -0
  305. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.gz +0 -0
  306. package/payload/server/public/assets/routines-CoIVXRCB.js.br +0 -0
  307. package/payload/server/public/assets/routines-CoIVXRCB.js.gz +0 -0
  308. package/payload/server/public/assets/skills-BjHt5lDG.js.br +0 -0
  309. package/payload/server/public/assets/skills-BjHt5lDG.js.gz +0 -0
  310. package/payload/server/public/assets/tasks-iUFfeA9_.js.br +0 -0
  311. package/payload/server/public/assets/tasks-iUFfeA9_.js.gz +0 -0
  312. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.br +0 -0
  313. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.gz +0 -0
  314. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.br +0 -0
  315. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.gz +0 -0
  316. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.br +0 -0
  317. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.gz +0 -0
  318. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js +0 -2
  319. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.br +0 -0
  320. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.gz +0 -0
  321. package/payload/server/public/assets/wrench-BD7xwbV1.js.br +0 -0
  322. package/payload/server/public/assets/wrench-BD7xwbV1.js.gz +0 -0
  323. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js → jsx-runtime-Cjug_Cyb.js} +0 -0
  324. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.br → jsx-runtime-Cjug_Cyb.js.br} +0 -0
  325. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.gz → jsx-runtime-Cjug_Cyb.js.gz} +0 -0
@@ -0,0 +1,270 @@
1
+ import { callBotApi } from "../lib/bot-api.js";
2
+ import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
3
+ import { buildInlineKeyboard } from "../lib/telegram.js";
4
+ const TAG = "[telegram-tools]";
5
+ const TOOL = "telegram-ask";
6
+ /** Kind to Bot API method. Verified against the live parameter tables on
7
+ * 2026-08-08. Exported so the census's owned-method map and this tool cannot
8
+ * disagree about which methods the tool owns. */
9
+ export const ASK_METHOD = Object.freeze({
10
+ poll: "sendPoll",
11
+ checklist: "sendChecklist",
12
+ location: "sendLocation",
13
+ venue: "sendVenue",
14
+ contact: "sendContact",
15
+ dice: "sendDice",
16
+ stopPoll: "stopPoll",
17
+ editChecklist: "editMessageChecklist",
18
+ editLiveLocation: "editMessageLiveLocation",
19
+ stopLiveLocation: "stopMessageLiveLocation",
20
+ });
21
+ /** The per-kind required fields Zod cannot express in one flat shape, refused
22
+ * BEFORE any network call. Ten discriminated unions would make every optional
23
+ * field conditional in the tool schema, which is harder for the model to read
24
+ * than one flat shape plus this check. */
25
+ function missingField(p) {
26
+ switch (p.kind) {
27
+ case "poll":
28
+ if (!p.question)
29
+ return "poll needs `question` (the poll question, 1-300 characters).";
30
+ if (!p.options?.length)
31
+ return "poll needs `options` (1-12 answers, as plain strings).";
32
+ if (p.options.length > 12)
33
+ return "poll takes at most 12 `options`; Telegram refuses more.";
34
+ return null;
35
+ case "checklist":
36
+ case "editChecklist": {
37
+ if (!p.businessConnectionId) {
38
+ return `${p.kind} needs \`businessConnectionId\`: Telegram sends a checklist only on behalf of a connected business account.`;
39
+ }
40
+ if (!p.checklist)
41
+ return `${p.kind} needs \`checklist\` (its title and 1-30 tasks).`;
42
+ if (p.kind === "editChecklist" && p.messageId === undefined) {
43
+ return "editChecklist needs `messageId` (the checklist message to replace).";
44
+ }
45
+ return null;
46
+ }
47
+ case "location":
48
+ if (p.latitude === undefined || p.longitude === undefined) {
49
+ return "location needs `latitude` and `longitude`.";
50
+ }
51
+ return null;
52
+ case "venue":
53
+ if (p.latitude === undefined || p.longitude === undefined) {
54
+ return "venue needs `latitude` and `longitude`.";
55
+ }
56
+ if (!p.title)
57
+ return "venue needs `title` (the venue's name).";
58
+ if (!p.address)
59
+ return "venue needs `address` (the venue's street address).";
60
+ return null;
61
+ case "contact":
62
+ if (!p.phoneNumber)
63
+ return "contact needs `phoneNumber`.";
64
+ if (!p.firstName)
65
+ return "contact needs `firstName`.";
66
+ return null;
67
+ case "dice":
68
+ return null;
69
+ case "editLiveLocation":
70
+ if (p.messageId === undefined) {
71
+ return "editLiveLocation needs `messageId` (the live location message to move).";
72
+ }
73
+ if (p.latitude === undefined || p.longitude === undefined) {
74
+ return "editLiveLocation needs `latitude` and `longitude` (the new position).";
75
+ }
76
+ return null;
77
+ case "stopPoll":
78
+ case "stopLiveLocation":
79
+ if (p.messageId === undefined) {
80
+ return `${p.kind} needs \`messageId\` (the message to stop).`;
81
+ }
82
+ return null;
83
+ }
84
+ }
85
+ /** The checklist in Telegram's own snake_case. Kept out of bodyFor so the two
86
+ * checklist kinds cannot drift apart. */
87
+ function checklistBody(c) {
88
+ return {
89
+ title: c.title,
90
+ tasks: c.tasks,
91
+ ...(c.othersCanAddTasks !== undefined ? { others_can_add_tasks: c.othersCanAddTasks } : {}),
92
+ ...(c.othersCanMarkTasksAsDone !== undefined
93
+ ? { others_can_mark_tasks_as_done: c.othersCanMarkTasksAsDone }
94
+ : {}),
95
+ };
96
+ }
97
+ function kindBody(p) {
98
+ switch (p.kind) {
99
+ case "poll":
100
+ return {
101
+ question: p.question,
102
+ // Telegram takes InputPollOption objects; the tool takes plain strings,
103
+ // because an option is a string in every case this install has.
104
+ options: (p.options ?? []).map((text) => ({ text })),
105
+ ...(p.pollType !== undefined ? { type: p.pollType } : {}),
106
+ ...(p.isAnonymous !== undefined ? { is_anonymous: p.isAnonymous } : {}),
107
+ ...(p.allowsMultipleAnswers !== undefined
108
+ ? { allows_multiple_answers: p.allowsMultipleAnswers }
109
+ : {}),
110
+ ...(p.correctOptionIds !== undefined ? { correct_option_ids: p.correctOptionIds } : {}),
111
+ ...(p.explanation !== undefined ? { explanation: p.explanation } : {}),
112
+ ...(p.openPeriod !== undefined ? { open_period: p.openPeriod } : {}),
113
+ };
114
+ case "checklist":
115
+ return {
116
+ business_connection_id: p.businessConnectionId,
117
+ checklist: checklistBody(p.checklist),
118
+ };
119
+ case "editChecklist":
120
+ return {
121
+ business_connection_id: p.businessConnectionId,
122
+ message_id: p.messageId,
123
+ checklist: checklistBody(p.checklist),
124
+ };
125
+ case "location":
126
+ return {
127
+ latitude: p.latitude,
128
+ longitude: p.longitude,
129
+ ...(p.horizontalAccuracy !== undefined
130
+ ? { horizontal_accuracy: p.horizontalAccuracy }
131
+ : {}),
132
+ ...(p.livePeriod !== undefined ? { live_period: p.livePeriod } : {}),
133
+ ...(p.heading !== undefined ? { heading: p.heading } : {}),
134
+ ...(p.proximityAlertRadius !== undefined
135
+ ? { proximity_alert_radius: p.proximityAlertRadius }
136
+ : {}),
137
+ };
138
+ case "venue":
139
+ return {
140
+ latitude: p.latitude,
141
+ longitude: p.longitude,
142
+ title: p.title,
143
+ address: p.address,
144
+ };
145
+ case "contact":
146
+ return {
147
+ phone_number: p.phoneNumber,
148
+ first_name: p.firstName,
149
+ ...(p.lastName !== undefined ? { last_name: p.lastName } : {}),
150
+ };
151
+ case "dice":
152
+ return { ...(p.emoji !== undefined ? { emoji: p.emoji } : {}) };
153
+ case "editLiveLocation":
154
+ return {
155
+ message_id: p.messageId,
156
+ latitude: p.latitude,
157
+ longitude: p.longitude,
158
+ ...(p.livePeriod !== undefined ? { live_period: p.livePeriod } : {}),
159
+ ...(p.horizontalAccuracy !== undefined
160
+ ? { horizontal_accuracy: p.horizontalAccuracy }
161
+ : {}),
162
+ ...(p.heading !== undefined ? { heading: p.heading } : {}),
163
+ ...(p.proximityAlertRadius !== undefined
164
+ ? { proximity_alert_radius: p.proximityAlertRadius }
165
+ : {}),
166
+ };
167
+ case "stopPoll":
168
+ case "stopLiveLocation":
169
+ return { message_id: p.messageId };
170
+ }
171
+ }
172
+ /** The four kinds that edit or stop an existing message. Telegram documents
173
+ * reply_markup on all of them and none of the send-envelope options, so those
174
+ * are withheld here rather than sent to a method that has no field for them. */
175
+ const EDIT_KINDS = new Set([
176
+ "stopPoll",
177
+ "editChecklist",
178
+ "editLiveLocation",
179
+ "stopLiveLocation",
180
+ ]);
181
+ function bodyFor(p) {
182
+ const markup = p.buttons ? buildInlineKeyboard(p.buttons) : undefined;
183
+ const envelope = EDIT_KINDS.has(p.kind)
184
+ ? {}
185
+ : {
186
+ // sendChecklist is the one send method with no message_thread_id in its
187
+ // table, so it is excluded here too.
188
+ ...(p.messageThreadId !== undefined && p.kind !== "checklist"
189
+ ? { message_thread_id: p.messageThreadId }
190
+ : {}),
191
+ ...(p.disableNotification !== undefined
192
+ ? { disable_notification: p.disableNotification }
193
+ : {}),
194
+ ...(p.protectContent !== undefined ? { protect_content: p.protectContent } : {}),
195
+ ...(p.replyToMessageId !== undefined
196
+ ? { reply_parameters: { message_id: p.replyToMessageId } }
197
+ : {}),
198
+ };
199
+ return {
200
+ chat_id: p.chatId,
201
+ ...kindBody(p),
202
+ ...(markup ? { reply_markup: markup } : {}),
203
+ ...envelope,
204
+ };
205
+ }
206
+ /** Polls, checklists, locations, venues, contacts and dice, plus stopping a
207
+ * poll and editing or stopping a live location.
208
+ *
209
+ * Task 2594: these ten methods were reachable only through telegram-api, whose
210
+ * untyped params object gave the model no field names for any of them, so a
211
+ * malformed call was caught by Telegram's 400 and nothing earlier.
212
+ *
213
+ * Inline messages are not addressed. Telegram lets editMessageLiveLocation and
214
+ * stopMessageLiveLocation target an inline_message_id instead of a chat, but
215
+ * nothing on this install sends inline messages, so chatId stays required. */
216
+ export async function telegramAsk(p, deps) {
217
+ const { callId, log } = deps;
218
+ if (!deps.accountId) {
219
+ log(`${TAG} op=no-account callId=${callId} tool=${TOOL}`);
220
+ return {
221
+ ok: false,
222
+ isError: true,
223
+ text: "telegram-ask cannot execute: this MCP instance was launched without ACCOUNT_ID " +
224
+ "(plugin-system metadata-only mode).",
225
+ };
226
+ }
227
+ const missing = missingField(p);
228
+ if (missing) {
229
+ log(`${TAG} op=refused callId=${callId} tool=${TOOL} kind=${p.kind} reason=missing-field`);
230
+ return { ok: false, isError: true, text: missing };
231
+ }
232
+ const token = resolveBotToken(deps.platformRoot, deps.accountId, p.botId);
233
+ if (!token) {
234
+ const known = listRegisteredBots(deps.platformRoot, deps.accountId);
235
+ log(`${TAG} op=no-bot callId=${callId} tool=${TOOL} account=${deps.accountId} botId=${p.botId} registered=${known.length}`);
236
+ return {
237
+ ok: false,
238
+ isError: true,
239
+ text: known.length
240
+ ? `No bot "${p.botId}" is registered on this account. Registered: ${known
241
+ .map((b) => `${b.id} (${b.role})`)
242
+ .join(", ")}.`
243
+ : "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
244
+ };
245
+ }
246
+ const method = ASK_METHOD[p.kind];
247
+ log(`${TAG} op=call tool=${TOOL} method=${method} callId=${callId} botId=${p.botId}`);
248
+ let envelope;
249
+ try {
250
+ envelope = await callBotApi(token, method, bodyFor(p), {
251
+ ...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
252
+ });
253
+ }
254
+ catch (err) {
255
+ const reason = err instanceof Error ? err.message : String(err);
256
+ log(`${TAG} op=error callId=${callId} tool=${TOOL} method=${method} reason="${reason}"`);
257
+ return { ok: false, isError: true, text: `telegram-ask could not reach Telegram: ${reason}` };
258
+ }
259
+ log(`${TAG} op=result callId=${callId} tool=${TOOL} method=${method} ok=${envelope.ok} ` +
260
+ `errorCode=${envelope.error_code ?? "-"} description="${envelope.description ?? ""}"`);
261
+ if (!envelope.ok) {
262
+ return {
263
+ ok: false,
264
+ isError: true,
265
+ text: `Telegram refused ${method} (${envelope.error_code ?? "no code"}): ${envelope.description ?? "no description"}`,
266
+ };
267
+ }
268
+ return { ok: true, isError: false, text: JSON.stringify(envelope.result ?? true, null, 2) };
269
+ }
270
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/tools/ask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type InlineKeyboardButtonInput } from "../lib/telegram.js";
2
+ export interface CardParams {
3
+ botId: string;
4
+ chatId: string | number;
5
+ text: string;
6
+ key?: string;
7
+ parseMode?: "HTML" | "Markdown" | "MarkdownV2";
8
+ buttons?: InlineKeyboardButtonInput[][];
9
+ disablePreview?: boolean;
10
+ callbackQueryId?: string;
11
+ alert?: boolean;
12
+ }
13
+ export interface CardDeps {
14
+ platformRoot: string;
15
+ accountId: string | undefined;
16
+ /** Per-invocation id threading one call's lines together. */
17
+ callId: string;
18
+ log: (line: string) => void;
19
+ fetchImpl?: typeof fetch;
20
+ }
21
+ export interface CardResult {
22
+ ok: boolean;
23
+ text: string;
24
+ isError: boolean;
25
+ outcome: "sent" | "edited" | "unchanged" | "none";
26
+ }
27
+ /** Post a card, or edit the one this key already names.
28
+ *
29
+ * Absorbs sendMessage, editMessageText, editMessageReplyMarkup and
30
+ * answerCallbackQuery behind one typed schema. Task 2588: the passthrough gave
31
+ * the model no field names for any of them, so a malformed call was only
32
+ * caught by Telegram's 400. */
33
+ export declare function telegramCard(p: CardParams, deps: CardDeps): Promise<CardResult>;
34
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/tools/card.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAMzF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,OAAO,CAAC,EAAE,yBAAyB,EAAE,EAAE,CAAC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;CACnD;AAQD;;;;;gCAKgC;AAChC,wBAAsB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA4IrF"}
@@ -0,0 +1,140 @@
1
+ import { callBotApi } from "../lib/bot-api.js";
2
+ import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
3
+ import { buildInlineKeyboard } from "../lib/telegram.js";
4
+ import { cardKey, readCardId, writeCardId } from "../lib/card-store.js";
5
+ const TAG = "[telegram-tools]";
6
+ const TOOL = "telegram-card";
7
+ /** Telegram's answer when the new text and markup match the old. It is a no-op,
8
+ * not a failure to retry, and an idempotent card re-post is the normal case
9
+ * rather than an error. This is the ONE place this plugin does not relay
10
+ * Telegram's verdict as an error. */
11
+ const NOT_MODIFIED = "message is not modified";
12
+ /** Post a card, or edit the one this key already names.
13
+ *
14
+ * Absorbs sendMessage, editMessageText, editMessageReplyMarkup and
15
+ * answerCallbackQuery behind one typed schema. Task 2588: the passthrough gave
16
+ * the model no field names for any of them, so a malformed call was only
17
+ * caught by Telegram's 400. */
18
+ export async function telegramCard(p, deps) {
19
+ const { callId, log } = deps;
20
+ if (!deps.accountId) {
21
+ log(`${TAG} op=no-account callId=${callId} tool=${TOOL}`);
22
+ return {
23
+ ok: false,
24
+ isError: true,
25
+ outcome: "none",
26
+ text: "telegram-card cannot execute: this MCP instance was launched without ACCOUNT_ID " +
27
+ "(plugin-system metadata-only mode). Per-account bot tokens require ACCOUNT_ID at spawn.",
28
+ };
29
+ }
30
+ const token = resolveBotToken(deps.platformRoot, deps.accountId, p.botId);
31
+ if (!token) {
32
+ const known = listRegisteredBots(deps.platformRoot, deps.accountId);
33
+ log(`${TAG} op=no-bot callId=${callId} tool=${TOOL} account=${deps.accountId} botId=${p.botId} registered=${known.length}`);
34
+ return {
35
+ ok: false,
36
+ isError: true,
37
+ outcome: "none",
38
+ text: known.length
39
+ ? `No bot "${p.botId}" is registered on this account. Registered: ${known
40
+ .map((b) => `${b.id} (${b.role})`)
41
+ .join(", ")}.`
42
+ : "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
43
+ };
44
+ }
45
+ const markup = p.buttons ? buildInlineKeyboard(p.buttons) : undefined;
46
+ const stored = p.key
47
+ ? readCardId(deps.platformRoot, deps.accountId, cardKey(p.botId, p.chatId, p.key))
48
+ : null;
49
+ const common = {
50
+ chat_id: p.chatId,
51
+ text: p.text,
52
+ parse_mode: p.parseMode ?? "HTML",
53
+ ...(markup ? { reply_markup: markup } : {}),
54
+ ...(p.disablePreview ? { link_preview_options: { is_disabled: true } } : {}),
55
+ };
56
+ const method = stored === null ? "sendMessage" : "editMessageText";
57
+ const body = stored === null ? common : { ...common, message_id: stored };
58
+ log(`${TAG} op=call tool=${TOOL} method=${method} callId=${callId} botId=${p.botId}`);
59
+ let envelope;
60
+ try {
61
+ envelope = await callBotApi(token, method, body, {
62
+ ...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
63
+ });
64
+ }
65
+ catch (err) {
66
+ const reason = err instanceof Error ? err.message : String(err);
67
+ log(`${TAG} op=error callId=${callId} tool=${TOOL} method=${method} reason="${reason}"`);
68
+ return {
69
+ ok: false,
70
+ isError: true,
71
+ outcome: "none",
72
+ text: `telegram-card could not reach Telegram: ${reason}`,
73
+ };
74
+ }
75
+ let outcome;
76
+ let sendError = null;
77
+ if (envelope.ok) {
78
+ outcome = stored === null ? "sent" : "edited";
79
+ const id = envelope.result?.message_id;
80
+ // An edit refreshes the entry's timestamp as well as a first post writing
81
+ // it. The store ages a key out after CARD_TTL_MS UNTOUCHED (card-store.ts);
82
+ // without this a card edited every day would still expire seven days after
83
+ // it was created, mid-life.
84
+ if (p.key) {
85
+ const toStore = stored === null ? (typeof id === "number" ? id : null) : stored;
86
+ if (toStore !== null) {
87
+ writeCardId(deps.platformRoot, deps.accountId, cardKey(p.botId, p.chatId, p.key), toStore);
88
+ }
89
+ }
90
+ }
91
+ else if ((envelope.description ?? "").includes(NOT_MODIFIED)) {
92
+ outcome = "unchanged";
93
+ }
94
+ else {
95
+ outcome = "none";
96
+ sendError = `Telegram refused ${method} (${envelope.error_code ?? "no code"}): ${envelope.description ?? "no description"}`;
97
+ }
98
+ log(`${TAG} op=result callId=${callId} tool=${TOOL} method=${method} ok=${envelope.ok || outcome === "unchanged"} ` +
99
+ `errorCode=${envelope.error_code ?? "-"} description="${envelope.description ?? ""}"`);
100
+ // Task 2604 — flattened across rows: two buttons in one row and two across two
101
+ // rows are the same two choices, and the census asks whether the person was
102
+ // given choices at all. This is the numerator of
103
+ // `[telegram-card-census] cardsWithButtons=`; without it the clause telling the
104
+ // agent to prefer buttons has no signal and not offering one is a non-event.
105
+ const buttonCount = (p.buttons ?? []).reduce((n, row) => n + row.length, 0);
106
+ log(`${TAG} op=card callId=${callId} outcome=${outcome} buttons=${buttonCount}`);
107
+ // AFTER the send, deliberately. Telegram refuses a callback id older than its
108
+ // window, and answering first would let a stale id block the card update,
109
+ // which is the caller's actual work. A failure here is reported, never
110
+ // swallowed and never retried.
111
+ let answerError = null;
112
+ if (p.callbackQueryId) {
113
+ log(`${TAG} op=call tool=${TOOL} method=answerCallbackQuery callId=${callId} botId=${p.botId}`);
114
+ try {
115
+ const ack = await callBotApi(token, "answerCallbackQuery", { callback_query_id: p.callbackQueryId, ...(p.alert ? { show_alert: true } : {}) }, { ...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}) });
116
+ log(`${TAG} op=result callId=${callId} tool=${TOOL} method=answerCallbackQuery ok=${ack.ok}`);
117
+ if (!ack.ok) {
118
+ answerError = `Telegram refused answerCallbackQuery (${ack.error_code ?? "no code"}): ${ack.description ?? "no description"}`;
119
+ }
120
+ }
121
+ catch (err) {
122
+ answerError = `answerCallbackQuery could not reach Telegram: ${err instanceof Error ? err.message : String(err)}`;
123
+ }
124
+ }
125
+ if (sendError || answerError) {
126
+ return {
127
+ ok: false,
128
+ isError: true,
129
+ outcome,
130
+ text: [sendError, answerError].filter(Boolean).join(" "),
131
+ };
132
+ }
133
+ const said = outcome === "unchanged"
134
+ ? "Card unchanged: the new text and markup match what is already there."
135
+ : outcome === "edited"
136
+ ? `Card edited in place (message ${stored}).`
137
+ : `Card sent to ${p.chatId}.`;
138
+ return { ok: true, isError: false, outcome, text: said };
139
+ }
140
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/tools/card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export type InvoiceAction = "send" | "link" | "answerShipping" | "answerPreCheckout" | "balance" | "transactions" | "refund" | "editSubscription";
2
+ /** Action to Bot API method. Verified against the live parameter tables on
3
+ * 2026-08-08. Exported so the census's owned-method map and this tool cannot
4
+ * disagree about which methods the tool owns. */
5
+ export declare const INVOICE_METHOD: Readonly<Record<InvoiceAction, string>>;
6
+ export interface LabeledPrice {
7
+ label: string;
8
+ amount: number;
9
+ }
10
+ export interface ShippingOptionInput {
11
+ id: string;
12
+ title: string;
13
+ prices: LabeledPrice[];
14
+ }
15
+ export interface InvoiceParams {
16
+ botId: string;
17
+ action: InvoiceAction;
18
+ chatId?: string | number;
19
+ title?: string;
20
+ description?: string;
21
+ payload?: string;
22
+ providerToken?: string;
23
+ currency?: string;
24
+ prices?: LabeledPrice[];
25
+ subscriptionPeriod?: number;
26
+ maxTipAmount?: number;
27
+ suggestedTipAmounts?: number[];
28
+ photoUrl?: string;
29
+ needName?: boolean;
30
+ needPhoneNumber?: boolean;
31
+ needEmail?: boolean;
32
+ needShippingAddress?: boolean;
33
+ isFlexible?: boolean;
34
+ shippingQueryId?: string;
35
+ preCheckoutQueryId?: string;
36
+ ok?: boolean;
37
+ shippingOptions?: ShippingOptionInput[];
38
+ errorMessage?: string;
39
+ offset?: number;
40
+ limit?: number;
41
+ userId?: number;
42
+ telegramPaymentChargeId?: string;
43
+ isCanceled?: boolean;
44
+ }
45
+ export interface InvoiceDeps {
46
+ platformRoot: string;
47
+ accountId: string | undefined;
48
+ /** Per-invocation id threading one call's lines together. */
49
+ callId: string;
50
+ log: (line: string) => void;
51
+ fetchImpl?: typeof fetch;
52
+ }
53
+ export interface InvoiceResult {
54
+ ok: boolean;
55
+ text: string;
56
+ isError: boolean;
57
+ /** What was created, for the op=invoice line. `none` covers the six actions
58
+ * that create nothing, and any action Telegram refused. */
59
+ outcome: "sent" | "link" | "none";
60
+ }
61
+ /** Invoices and invoice links, the two checkout answers, and the Telegram Stars
62
+ * balance, transaction list, refund and subscription controls.
63
+ *
64
+ * Task 2594: these eight methods were reachable only through telegram-api,
65
+ * whose untyped params object gave the model no field names for any of them.
66
+ *
67
+ * An invoice created and never paid is a business outcome, not a defect, so
68
+ * op=invoice is one line and no alert. */
69
+ export declare function telegramInvoice(p: InvoiceParams, deps: InvoiceDeps): Promise<InvoiceResult>;
70
+ //# sourceMappingURL=invoice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice.d.ts","sourceRoot":"","sources":["../../src/tools/invoice.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,cAAc,GACd,QAAQ,GACR,kBAAkB,CAAC;AAEvB;;kDAEkD;AAClD,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CASjE,CAAC;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB;gEAC4D;IAC5D,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACnC;AAwID;;;;;;;2CAO2C;AAC3C,wBAAsB,eAAe,CACnC,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CAoFxB"}