@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
@@ -1 +1 @@
1
- {"version":3,"file":"api-census.js","sourceRoot":"","sources":["../../src/lib/api-census.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAElD;;;;;;;;;2EAS2E;AAC3E,MAAM,UAAU,cAAc,CAAC,YAAoB,EAAE,SAA6B;IAChF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,kBAAkB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC/D,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;YACzB,SAAS,GAAG,UAAU,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAC/D,CAAC,MAAM,CAAC;QACX,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IACD,OAAO,GAAG,UAAU,YAAY,eAAe,CAAC,MAAM,YAAY,aAAa,SAAS,IAAI,cAAc,SAAS,EAAE,CAAC;AACxH,CAAC;AAED;;;;;;;;;;8BAU8B;AAC9B,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oDAAoD,CAAC,EAAE,CAAC;QACpF,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;0EAE0E;AAC1E,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5C,OAAO;QACL,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAC9D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;KACrD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"api-census.js","sourceRoot":"","sources":["../../src/lib/api-census.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /** Scoped by bot AND chat, not by the caller's key alone: the same "job-4102"
2
+ * key in two chats is two cards, and collapsing them would edit a stranger's
3
+ * message. */
4
+ export declare function cardKey(botId: string, chatId: string | number, key: string): string;
5
+ /** A card untouched for this long stops being edited in place: the next keyed
6
+ * call posts fresh. Operator decision 2026-08-08 (Task 2595). No Telegram-imposed
7
+ * edit window is claimed here — none was confirmed. This is our own ceiling, and
8
+ * it is what bounds the file: without it every key ever used is kept for ever. */
9
+ export declare const CARD_TTL_MS: number;
10
+ /** The stored message id for this key, or null. Null once the entry has gone
11
+ * CARD_TTL_MS untouched: the caller then posts fresh, which is how a key whose
12
+ * message is gone recovers without matching on Telegram's error prose. */
13
+ export declare function readCardId(platformRoot: string, accountId: string, k: string, now?: number): number | null;
14
+ /** Record the message id this key now names, and drop every entry that has gone
15
+ * CARD_TTL_MS untouched. Compaction rides the write because the write already
16
+ * rewrites the whole file; a separate prune pass would be a second thing to
17
+ * schedule. Every surviving key keeps its own id and timestamp, the same promise
18
+ * persistTelegramBot makes for bot entries. */
19
+ export declare function writeCardId(platformRoot: string, accountId: string, k: string, messageId: number, now?: number): void;
20
+ export declare const CARD_CENSUS_TAG = "[telegram-card-census]";
21
+ /** The standing check for this store, emitted once at MCP boot.
22
+ *
23
+ * It answers what nothing else can: is telegram-cards.json growing? Every entry
24
+ * is one key that was used and kept, and until this line existed that growth was
25
+ * invisible — Task 2588 gave the media store a census and gave this one none.
26
+ *
27
+ * It reports the count it read back from disk, never that a prune ran. A prune
28
+ * that pruned nothing and a prune that worked print the same thing if the line
29
+ * reports the prune rather than the state.
30
+ *
31
+ * `keys` is every entry ON DISK, expired ones included. Compaction only rides a
32
+ * write, so an account that stops posting cards keeps its file at whatever size
33
+ * it reached while every entry in it reads as absent through readCardId. That is
34
+ * the right number for the question this line asks — is the file growing — but
35
+ * it is not a count of live cards. `keys=0` with `bytes>0` is the third state: a
36
+ * file that exists and parsed to nothing.
37
+ *
38
+ * `keys` rising across boots while jobs close is the leak. Never throws: a boot
39
+ * throw empties the plugin registry (CLAUDE.md), so any failure reports zeros. */
40
+ export declare function cardCensusLine(platformRoot: string, accountId: string | undefined): string;
41
+ //# sourceMappingURL=card-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-store.d.ts","sourceRoot":"","sources":["../../src/lib/card-store.ts"],"names":[],"mappings":"AAQA;;eAEe;AACf,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnF;AAOD;;;mFAGmF;AACnF,eAAO,MAAM,WAAW,QAA0B,CAAC;AAwCnD;;2EAE2E;AAC3E,wBAAgB,UAAU,CACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,CAAC,EAAE,MAAM,EACT,GAAG,GAAE,MAAmB,GACvB,MAAM,GAAG,IAAI,CAMf;AAED;;;;gDAIgD;AAChD,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAmB,GACvB,IAAI,CASN;AAED,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD;;;;;;;;;;;;;;;;;;mFAkBmF;AACnF,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAe1F"}
@@ -0,0 +1,120 @@
1
+ import { join } from "node:path";
2
+ import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs";
3
+ import { resolveAccountDir } from "./account-write.js";
4
+ /** Runtime state, so a file of its own rather than a key inside account.json,
5
+ * which holds configuration. Same directory, same brand containment. */
6
+ const FILE = "telegram-cards.json";
7
+ /** Scoped by bot AND chat, not by the caller's key alone: the same "job-4102"
8
+ * key in two chats is two cards, and collapsing them would edit a stranger's
9
+ * message. */
10
+ export function cardKey(botId, chatId, key) {
11
+ return `${botId}:${chatId}:${key}`;
12
+ }
13
+ function storePath(platformRoot, accountId) {
14
+ const resolved = resolveAccountDir(platformRoot, accountId);
15
+ return resolved.ok ? join(resolved.dir, FILE) : null;
16
+ }
17
+ /** A card untouched for this long stops being edited in place: the next keyed
18
+ * call posts fresh. Operator decision 2026-08-08 (Task 2595). No Telegram-imposed
19
+ * edit window is claimed here — none was confirmed. This is our own ceiling, and
20
+ * it is what bounds the file: without it every key ever used is kept for ever. */
21
+ export const CARD_TTL_MS = 7 * 24 * 60 * 60 * 1000;
22
+ function isEntry(v) {
23
+ if (!v || typeof v !== "object" || Array.isArray(v))
24
+ return false;
25
+ const e = v;
26
+ return (typeof e.id === "number" &&
27
+ Number.isFinite(e.id) &&
28
+ typeof e.at === "number" &&
29
+ Number.isFinite(e.at));
30
+ }
31
+ function readAll(path) {
32
+ if (!existsSync(path))
33
+ return {};
34
+ try {
35
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
36
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
37
+ return {};
38
+ const out = {};
39
+ for (const [k, v] of Object.entries(parsed)) {
40
+ if (isEntry(v))
41
+ out[k] = v;
42
+ }
43
+ return out;
44
+ }
45
+ catch {
46
+ // Unparseable state reads as "no card stored", which makes the next call
47
+ // post a fresh one. Throwing here would take the tool down over a file the
48
+ // caller never sees. A pre-2588-shape bare number fails isEntry and reads as
49
+ // absent for the same reason: it carries no timestamp, so its age is
50
+ // unknowable and it can never be aged out.
51
+ return {};
52
+ }
53
+ }
54
+ /** The stored message id for this key, or null. Null once the entry has gone
55
+ * CARD_TTL_MS untouched: the caller then posts fresh, which is how a key whose
56
+ * message is gone recovers without matching on Telegram's error prose. */
57
+ export function readCardId(platformRoot, accountId, k, now = Date.now()) {
58
+ const path = storePath(platformRoot, accountId);
59
+ if (!path)
60
+ return null;
61
+ const entry = readAll(path)[k];
62
+ if (!entry)
63
+ return null;
64
+ return now - entry.at >= CARD_TTL_MS ? null : entry.id;
65
+ }
66
+ /** Record the message id this key now names, and drop every entry that has gone
67
+ * CARD_TTL_MS untouched. Compaction rides the write because the write already
68
+ * rewrites the whole file; a separate prune pass would be a second thing to
69
+ * schedule. Every surviving key keeps its own id and timestamp, the same promise
70
+ * persistTelegramBot makes for bot entries. */
71
+ export function writeCardId(platformRoot, accountId, k, messageId, now = Date.now()) {
72
+ const path = storePath(platformRoot, accountId);
73
+ if (!path)
74
+ return;
75
+ const kept = {};
76
+ for (const [key, entry] of Object.entries(readAll(path))) {
77
+ if (now - entry.at < CARD_TTL_MS)
78
+ kept[key] = entry;
79
+ }
80
+ kept[k] = { id: messageId, at: now };
81
+ writeFileSync(path, JSON.stringify(kept, null, 2) + "\n", "utf-8");
82
+ }
83
+ export const CARD_CENSUS_TAG = "[telegram-card-census]";
84
+ /** The standing check for this store, emitted once at MCP boot.
85
+ *
86
+ * It answers what nothing else can: is telegram-cards.json growing? Every entry
87
+ * is one key that was used and kept, and until this line existed that growth was
88
+ * invisible — Task 2588 gave the media store a census and gave this one none.
89
+ *
90
+ * It reports the count it read back from disk, never that a prune ran. A prune
91
+ * that pruned nothing and a prune that worked print the same thing if the line
92
+ * reports the prune rather than the state.
93
+ *
94
+ * `keys` is every entry ON DISK, expired ones included. Compaction only rides a
95
+ * write, so an account that stops posting cards keeps its file at whatever size
96
+ * it reached while every entry in it reads as absent through readCardId. That is
97
+ * the right number for the question this line asks — is the file growing — but
98
+ * it is not a count of live cards. `keys=0` with `bytes>0` is the third state: a
99
+ * file that exists and parsed to nothing.
100
+ *
101
+ * `keys` rising across boots while jobs close is the leak. Never throws: a boot
102
+ * throw empties the plugin registry (CLAUDE.md), so any failure reports zeros. */
103
+ export function cardCensusLine(platformRoot, accountId) {
104
+ let keys = 0;
105
+ let bytes = 0;
106
+ try {
107
+ if (accountId) {
108
+ const path = storePath(platformRoot, accountId);
109
+ if (path && existsSync(path)) {
110
+ keys = Object.keys(readAll(path)).length;
111
+ bytes = statSync(path).size;
112
+ }
113
+ }
114
+ }
115
+ catch {
116
+ // Zeros, deliberately. See the doc comment.
117
+ }
118
+ return `${CARD_CENSUS_TAG} keys=${keys} bytes=${bytes}`;
119
+ }
120
+ //# sourceMappingURL=card-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-store.js","sourceRoot":"","sources":["../../src/lib/card-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type InlineKeyboardButtonInput } from "../lib/telegram.js";
2
+ export type AskKind = "poll" | "checklist" | "location" | "venue" | "contact" | "dice" | "stopPoll" | "editChecklist" | "editLiveLocation" | "stopLiveLocation";
3
+ /** Kind to Bot API method. Verified against the live parameter tables on
4
+ * 2026-08-08. Exported so the census's owned-method map and this tool cannot
5
+ * disagree about which methods the tool owns. */
6
+ export declare const ASK_METHOD: Readonly<Record<AskKind, string>>;
7
+ export interface ChecklistInput {
8
+ title: string;
9
+ tasks: Array<{
10
+ id: number;
11
+ text: string;
12
+ }>;
13
+ othersCanAddTasks?: boolean;
14
+ othersCanMarkTasksAsDone?: boolean;
15
+ }
16
+ export interface AskParams {
17
+ botId: string;
18
+ chatId: string | number;
19
+ kind: AskKind;
20
+ question?: string;
21
+ options?: string[];
22
+ pollType?: "regular" | "quiz";
23
+ isAnonymous?: boolean;
24
+ allowsMultipleAnswers?: boolean;
25
+ correctOptionIds?: number[];
26
+ explanation?: string;
27
+ openPeriod?: number;
28
+ businessConnectionId?: string;
29
+ checklist?: ChecklistInput;
30
+ latitude?: number;
31
+ longitude?: number;
32
+ horizontalAccuracy?: number;
33
+ livePeriod?: number;
34
+ heading?: number;
35
+ proximityAlertRadius?: number;
36
+ title?: string;
37
+ address?: string;
38
+ phoneNumber?: string;
39
+ firstName?: string;
40
+ lastName?: string;
41
+ emoji?: string;
42
+ messageId?: number;
43
+ buttons?: InlineKeyboardButtonInput[][];
44
+ replyToMessageId?: number;
45
+ messageThreadId?: number;
46
+ disableNotification?: boolean;
47
+ protectContent?: boolean;
48
+ }
49
+ export interface AskDeps {
50
+ platformRoot: string;
51
+ accountId: string | undefined;
52
+ /** Per-invocation id threading one call's lines together. */
53
+ callId: string;
54
+ log: (line: string) => void;
55
+ fetchImpl?: typeof fetch;
56
+ }
57
+ export interface AskResult {
58
+ ok: boolean;
59
+ text: string;
60
+ isError: boolean;
61
+ }
62
+ /** Polls, checklists, locations, venues, contacts and dice, plus stopping a
63
+ * poll and editing or stopping a live location.
64
+ *
65
+ * Task 2594: these ten methods were reachable only through telegram-api, whose
66
+ * untyped params object gave the model no field names for any of them, so a
67
+ * malformed call was caught by Telegram's 400 and nothing earlier.
68
+ *
69
+ * Inline messages are not addressed. Telegram lets editMessageLiveLocation and
70
+ * stopMessageLiveLocation target an inline_message_id instead of a chat, but
71
+ * nothing on this install sends inline messages, so chatId stays required. */
72
+ export declare function telegramAsk(p: AskParams, deps: AskDeps): Promise<AskResult>;
73
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/tools/ask.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAKzF,MAAM,MAAM,OAAO,GACf,MAAM,GACN,WAAW,GACX,UAAU,GACV,OAAO,GACP,SAAS,GACT,MAAM,GACN,UAAU,GACV,eAAe,GACf,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB;;kDAEkD;AAClD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAWvD,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,yBAAyB,EAAE,EAAE,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,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,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAwLD;;;;;;;;;+EAS+E;AAC/E,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAiEjF"}
@@ -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,CAsIrF"}