@rubytech/create-maxy-code 0.1.581 → 0.1.583

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 (453) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/routine-templates/dist/index.d.ts +1 -1
  3. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/routine-templates/dist/index.js +5 -1
  5. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  6. package/payload/platform/lib/routine-templates/src/index.ts +4 -0
  7. package/payload/platform/lib/telegram-managed-bot/dist/index.d.ts +269 -0
  8. package/payload/platform/lib/telegram-managed-bot/dist/index.d.ts.map +1 -0
  9. package/payload/platform/lib/telegram-managed-bot/dist/index.js +351 -0
  10. package/payload/platform/lib/telegram-managed-bot/dist/index.js.map +1 -0
  11. package/payload/platform/lib/telegram-managed-bot/src/__tests__/managed-bot.test.ts +251 -0
  12. package/payload/platform/lib/telegram-managed-bot/src/index.ts +529 -0
  13. package/payload/platform/lib/telegram-managed-bot/tsconfig.json +9 -0
  14. package/payload/platform/lib/telegram-managed-bot/vitest.config.ts +9 -0
  15. package/payload/platform/lib/telegram-reach/dist/index.d.ts +80 -0
  16. package/payload/platform/lib/telegram-reach/dist/index.d.ts.map +1 -0
  17. package/payload/platform/lib/telegram-reach/dist/index.js +211 -0
  18. package/payload/platform/lib/telegram-reach/dist/index.js.map +1 -0
  19. package/payload/platform/lib/telegram-reach/src/__tests__/telegram-reach.test.ts +216 -0
  20. package/payload/platform/lib/telegram-reach/src/index.ts +262 -0
  21. package/payload/platform/lib/telegram-reach/tsconfig.json +9 -0
  22. package/payload/platform/lib/telegram-reach/vitest.config.ts +9 -0
  23. package/payload/platform/package.json +2 -2
  24. package/payload/platform/plugins/admin/PLUGIN.md +1 -1
  25. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +9 -0
  26. package/payload/platform/plugins/admin/hooks/__tests__/preference-consult-directive.test.sh +26 -0
  27. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +20 -3
  28. package/payload/platform/plugins/admin/hooks/preference-consult-directive.sh +50 -5
  29. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +181 -9
  30. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +17 -0
  31. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.d.ts +2 -0
  32. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.d.ts.map +1 -0
  33. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.js +100 -0
  34. package/payload/platform/plugins/contacts/mcp/dist/__tests__/telegram-user-id.test.js.map +1 -0
  35. package/payload/platform/plugins/contacts/mcp/dist/index.js +11 -5
  36. package/payload/platform/plugins/contacts/mcp/dist/index.js.map +1 -1
  37. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts +5 -0
  38. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts.map +1 -1
  39. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +21 -4
  40. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -1
  41. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.d.ts +5 -0
  42. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.d.ts.map +1 -1
  43. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.js +29 -1
  44. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.js.map +1 -1
  45. package/payload/platform/plugins/contacts/mcp/vitest.config.ts +14 -0
  46. package/payload/platform/plugins/docs/references/admin-ui.md +20 -4
  47. package/payload/platform/plugins/docs/references/calendar-booking.md +2 -0
  48. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +15 -0
  49. package/payload/platform/plugins/docs/references/telegram-guide.md +143 -4
  50. package/payload/platform/plugins/filesystem/PLUGIN.md +2 -2
  51. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.d.ts +2 -0
  52. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.d.ts.map +1 -0
  53. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.js +108 -0
  54. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.js.map +1 -0
  55. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.d.ts +17 -0
  56. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.d.ts.map +1 -0
  57. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.js +162 -0
  58. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.js.map +1 -0
  59. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.d.ts +2 -0
  60. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.d.ts.map +1 -0
  61. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.js +116 -0
  62. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.js.map +1 -0
  63. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -1
  64. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +9 -0
  65. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -1
  66. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -1
  67. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +10 -0
  68. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-origin-gate.test.js +64 -1
  70. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-origin-gate.test.js.map +1 -1
  71. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.d.ts +5 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.d.ts.map +1 -1
  73. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.js +28 -6
  74. package/payload/platform/plugins/memory/mcp/dist/lib/label-origin-gate.js.map +1 -1
  75. package/payload/platform/plugins/memory/references/schema-knowledge-work.md +1 -1
  76. package/payload/platform/plugins/scheduling/PLUGIN.md +19 -3
  77. package/payload/platform/plugins/scheduling/mcp/dist/index.js +7 -2
  78. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  79. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +53 -6
  80. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -1
  81. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +38 -0
  82. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -1
  83. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.d.ts +2 -0
  84. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.d.ts.map +1 -0
  85. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.js +102 -0
  86. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-uid-stamp.test.js.map +1 -0
  87. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +43 -9
  88. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
  89. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts +50 -0
  90. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts.map +1 -1
  91. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js +47 -1
  92. package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js.map +1 -1
  93. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +5 -3
  94. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
  95. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +18 -3
  96. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
  97. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +40 -0
  98. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  99. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +132 -41
  100. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  101. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +14 -1
  102. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  103. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +61 -1
  104. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
  105. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +258 -8
  106. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  107. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.d.ts +2 -0
  108. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.d.ts.map +1 -0
  109. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.js +67 -0
  110. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-trash-filter.test.js.map +1 -0
  111. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +206 -3
  112. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  113. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.d.ts.map +1 -1
  114. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js +8 -1
  115. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js.map +1 -1
  116. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +29 -21
  117. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  118. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +94 -14
  119. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  120. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts.map +1 -1
  121. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js +6 -1
  122. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js.map +1 -1
  123. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.d.ts.map +1 -1
  124. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js +7 -2
  125. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js.map +1 -1
  126. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  127. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +46 -3
  128. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  129. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +30 -0
  130. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  131. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +69 -6
  132. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  133. package/payload/platform/plugins/telegram/PLUGIN.md +49 -1
  134. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +3 -3
  135. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js +28 -2
  136. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js.map +1 -1
  137. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.d.ts +2 -0
  138. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.d.ts.map +1 -0
  139. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.js +140 -0
  140. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-business-connection.test.js.map +1 -0
  141. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +93 -5
  142. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -1
  143. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.d.ts +2 -0
  144. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.d.ts.map +1 -0
  145. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.js +326 -0
  146. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.js.map +1 -0
  147. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.d.ts +2 -0
  148. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.d.ts.map +1 -0
  149. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.js +173 -0
  150. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.js.map +1 -0
  151. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +79 -0
  152. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -1
  153. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.d.ts +2 -0
  154. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.d.ts.map +1 -0
  155. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.js +34 -0
  156. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.js.map +1 -0
  157. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.d.ts +2 -0
  158. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.d.ts.map +1 -0
  159. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.js +93 -0
  160. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.js.map +1 -0
  161. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +15 -1
  162. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -1
  163. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js +245 -0
  164. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js.map +1 -1
  165. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.js +10 -1
  166. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.js.map +1 -1
  167. package/payload/platform/plugins/telegram/mcp/dist/index.js +26 -4
  168. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  169. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.d.ts +19 -0
  170. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.d.ts.map +1 -1
  171. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.js +41 -1
  172. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.js.map +1 -1
  173. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +15 -20
  174. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  175. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +27 -32
  176. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  177. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.d.ts +13 -0
  178. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.d.ts.map +1 -1
  179. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.js +22 -1
  180. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.js.map +1 -1
  181. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
  182. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +6 -0
  183. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
  184. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts +1 -1
  185. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts.map +1 -1
  186. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js +22 -2
  187. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js.map +1 -1
  188. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.d.ts +38 -0
  189. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.d.ts.map +1 -0
  190. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.js +56 -0
  191. package/payload/platform/plugins/telegram/mcp/dist/lib/business-connection-store.js.map +1 -0
  192. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.d.ts +55 -0
  193. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.d.ts.map +1 -0
  194. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.js +116 -0
  195. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.js.map +1 -0
  196. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.d.ts +54 -0
  197. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.d.ts.map +1 -0
  198. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.js +90 -0
  199. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.js.map +1 -0
  200. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts +2 -28
  201. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts.map +1 -1
  202. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js +8 -53
  203. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js.map +1 -1
  204. package/payload/platform/plugins/telegram/mcp/dist/tools/api.d.ts.map +1 -1
  205. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js +19 -0
  206. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js.map +1 -1
  207. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -1
  208. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +79 -10
  209. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -1
  210. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.d.ts +64 -0
  211. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.d.ts.map +1 -0
  212. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.js +217 -0
  213. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.js.map +1 -0
  214. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +7 -0
  215. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -1
  216. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +56 -0
  217. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -1
  218. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -1
  219. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +15 -0
  220. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -1
  221. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -1
  222. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +12 -0
  223. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -1
  224. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.d.ts +22 -0
  225. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.d.ts.map +1 -0
  226. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.js +67 -0
  227. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.js.map +1 -0
  228. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +21 -2
  229. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -1
  230. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +47 -2
  231. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -1
  232. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -1
  233. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +12 -0
  234. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -1
  235. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts +4 -1
  236. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts.map +1 -1
  237. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js +73 -6
  238. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js.map +1 -1
  239. package/payload/platform/plugins/telegram/skills/build/SKILL.md +217 -11
  240. package/payload/platform/plugins/telegram/skills/configure/SKILL.md +87 -6
  241. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +12 -0
  242. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +36 -5
  243. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
  244. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +103 -10
  245. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
  246. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  247. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +2 -0
  248. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  249. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  250. package/payload/platform/services/claude-session-manager/dist/http-server.js +42 -4
  251. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  252. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  253. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +19 -5
  254. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  255. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +9 -0
  256. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  257. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +5 -1
  258. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  259. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  260. package/payload/platform/services/telegram-channel/dist/instructions.js +13 -0
  261. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  262. package/payload/platform/services/telegram-channel/dist/notification.d.ts +40 -0
  263. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  264. package/payload/platform/services/telegram-channel/dist/notification.js +41 -4
  265. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  266. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +52 -0
  267. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  268. package/payload/platform/services/whatsapp-channel/dist/notification.js +64 -1
  269. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  270. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  271. package/payload/platform/services/whatsapp-channel/dist/server.js +14 -2
  272. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  273. package/payload/platform/templates/account-schema/SCHEMA.md +17 -10
  274. package/payload/platform/templates/agents/admin/IDENTITY.md +5 -0
  275. package/payload/platform/templates/specialists/agents/data-manager.md +2 -2
  276. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  277. package/payload/server/{chunk-BFRB2U75.js → chunk-CV6AEMKH.js} +1 -0
  278. package/payload/server/{manager-CTVTF4YB.js → manager-FQSQSSJ3.js} +1 -1
  279. package/payload/server/public/activity.html +6 -6
  280. package/payload/server/public/agents.html +5 -5
  281. package/payload/server/public/assets/{AdminLoginScreens-B1lu4-_F.js → AdminLoginScreens-BLsDYWVi.js} +1 -1
  282. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.br +0 -0
  283. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.gz +0 -0
  284. package/payload/server/public/assets/{AdminShell-BMslfZxN.js → AdminShell-BZS8jzFA.js} +1 -1
  285. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.br +0 -0
  286. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.gz +0 -0
  287. package/payload/server/public/assets/{activity-kQ3w70LJ.js → activity-DOjvoLdd.js} +1 -1
  288. package/payload/server/public/assets/activity-DOjvoLdd.js.br +0 -0
  289. package/payload/server/public/assets/activity-DOjvoLdd.js.gz +0 -0
  290. package/payload/server/public/assets/{admin-CkASgYA7.js → admin-JrSNg29g.js} +1 -1
  291. package/payload/server/public/assets/admin-JrSNg29g.js.br +0 -0
  292. package/payload/server/public/assets/admin-JrSNg29g.js.gz +0 -0
  293. package/payload/server/public/assets/{agents-Cn_bZgnD.js → agents--9WMJVLC.js} +1 -1
  294. package/payload/server/public/assets/agents--9WMJVLC.js.br +0 -0
  295. package/payload/server/public/assets/agents--9WMJVLC.js.gz +0 -0
  296. package/payload/server/public/assets/{browser-BE-GDk5-.js → browser-DiiMmTrM.js} +1 -1
  297. package/payload/server/public/assets/browser-DiiMmTrM.js.br +0 -0
  298. package/payload/server/public/assets/browser-DiiMmTrM.js.gz +0 -0
  299. package/payload/server/public/assets/{calendar-Di7BEHHN.js → calendar-CazmCzgO.js} +1 -1
  300. package/payload/server/public/assets/calendar-CazmCzgO.js.br +0 -0
  301. package/payload/server/public/assets/calendar-CazmCzgO.js.gz +0 -0
  302. package/payload/server/public/assets/chat-CB0TcyXX.js +1 -0
  303. package/payload/server/public/assets/chat-CB0TcyXX.js.br +0 -0
  304. package/payload/server/public/assets/chat-CB0TcyXX.js.gz +0 -0
  305. package/payload/server/public/assets/chevron-left-0tVo23Dh.js +1 -0
  306. package/payload/server/public/assets/chevron-left-0tVo23Dh.js.br +0 -0
  307. package/payload/server/public/assets/clock-D2cZ0sge.js +1 -0
  308. package/payload/server/public/assets/clock-D2cZ0sge.js.br +0 -0
  309. package/payload/server/public/assets/clock-D2cZ0sge.js.gz +0 -0
  310. package/payload/server/public/assets/{copy-nkxspu2J.js → copy-C87QIN_o.js} +1 -1
  311. package/payload/server/public/assets/copy-C87QIN_o.js.br +0 -0
  312. package/payload/server/public/assets/copy-C87QIN_o.js.gz +0 -0
  313. package/payload/server/public/assets/data-CK7AMxPt.js +1 -0
  314. package/payload/server/public/assets/data-CK7AMxPt.js.br +0 -0
  315. package/payload/server/public/assets/data-CK7AMxPt.js.gz +0 -0
  316. package/payload/server/public/assets/{field-2rIXxGMt.js → field-C3kQgGWE.js} +1 -1
  317. package/payload/server/public/assets/field-C3kQgGWE.js.br +0 -0
  318. package/payload/server/public/assets/field-C3kQgGWE.js.gz +0 -0
  319. package/payload/server/public/assets/{file-text-CdSqrscg.js → file-text-rWowl9RN.js} +1 -1
  320. package/payload/server/public/assets/file-text-rWowl9RN.js.br +0 -0
  321. package/payload/server/public/assets/file-text-rWowl9RN.js.gz +0 -0
  322. package/payload/server/public/assets/{graph-BfBHHXaC.js → graph-CVJKz1Uo.js} +1 -1
  323. package/payload/server/public/assets/graph-CVJKz1Uo.js.br +0 -0
  324. package/payload/server/public/assets/graph-CVJKz1Uo.js.gz +0 -0
  325. package/payload/server/public/assets/{graph-labels-CHW2aBke.js → graph-labels-kneGnsHB.js} +1 -1
  326. package/payload/server/public/assets/graph-labels-kneGnsHB.js.br +0 -0
  327. package/payload/server/public/assets/graph-labels-kneGnsHB.js.gz +0 -0
  328. package/payload/server/public/assets/{jsx-runtime-D43jgaWP.css → jsx-runtime-rMaiYjNu.css} +1 -1
  329. package/payload/server/public/assets/jsx-runtime-rMaiYjNu.css.br +0 -0
  330. package/payload/server/public/assets/{jsx-runtime-D43jgaWP.css.gz → jsx-runtime-rMaiYjNu.css.gz} +0 -0
  331. package/payload/server/public/assets/{operator-DRn9LITC.js → operator-BGvB4hu4.js} +1 -1
  332. package/payload/server/public/assets/operator-BGvB4hu4.js.br +0 -0
  333. package/payload/server/public/assets/operator-BGvB4hu4.js.gz +0 -0
  334. package/payload/server/public/assets/{page-D_9mPS6W.js → page-DBQLOasI.js} +1 -1
  335. package/payload/server/public/assets/page-DBQLOasI.js.br +0 -0
  336. package/payload/server/public/assets/page-DBQLOasI.js.gz +0 -0
  337. package/payload/server/public/assets/{page-BwqQsoU8.js → page-DyVAu7tm.js} +1 -1
  338. package/payload/server/public/assets/page-DyVAu7tm.js.br +0 -0
  339. package/payload/server/public/assets/page-DyVAu7tm.js.gz +0 -0
  340. package/payload/server/public/assets/play-DgP7vl0r.js +1 -0
  341. package/payload/server/public/assets/play-DgP7vl0r.js.br +0 -0
  342. package/payload/server/public/assets/play-DgP7vl0r.js.gz +0 -0
  343. package/payload/server/public/assets/{public-CrjZYpdW.js → public-BvUQR3hd.js} +1 -1
  344. package/payload/server/public/assets/public-BvUQR3hd.js.br +0 -0
  345. package/payload/server/public/assets/public-BvUQR3hd.js.gz +0 -0
  346. package/payload/server/public/assets/{rotate-ccw-J9f-GWjm.js → rotate-ccw-Dnn7gbPh.js} +1 -1
  347. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.br +0 -0
  348. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.gz +0 -0
  349. package/payload/server/public/assets/{routines-C1AB-3FR.js → routines-N8NmxPOZ.js} +1 -1
  350. package/payload/server/public/assets/routines-N8NmxPOZ.js.br +0 -0
  351. package/payload/server/public/assets/routines-N8NmxPOZ.js.gz +0 -0
  352. package/payload/server/public/assets/{skills-C4EfNKEx.js → skills-B2CRgO-U.js} +1 -1
  353. package/payload/server/public/assets/skills-B2CRgO-U.js.br +0 -0
  354. package/payload/server/public/assets/skills-B2CRgO-U.js.gz +0 -0
  355. package/payload/server/public/assets/{tasks-DszD3aZl.js → tasks-8QLGtlSj.js} +1 -1
  356. package/payload/server/public/assets/tasks-8QLGtlSj.js.br +0 -0
  357. package/payload/server/public/assets/tasks-8QLGtlSj.js.gz +0 -0
  358. package/payload/server/public/assets/{triangle-alert-B5WAyAkC.js → triangle-alert-el772yUQ.js} +1 -1
  359. package/payload/server/public/assets/triangle-alert-el772yUQ.js.br +0 -0
  360. package/payload/server/public/assets/triangle-alert-el772yUQ.js.gz +0 -0
  361. package/payload/server/public/assets/{useCopyFeedback-B2nuNNJw.js → useCopyFeedback-DfNAu8hQ.js} +1 -1
  362. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.br +0 -0
  363. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.gz +0 -0
  364. package/payload/server/public/assets/{useMediaQuery-DUPJPHQt.js → useMediaQuery-B469O83-.js} +1 -1
  365. package/payload/server/public/assets/useMediaQuery-B469O83-.js.br +0 -0
  366. package/payload/server/public/assets/useMediaQuery-B469O83-.js.gz +0 -0
  367. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js +2 -0
  368. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.br +0 -0
  369. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.gz +0 -0
  370. package/payload/server/public/assets/{wrench-DZJZm17j.js → wrench-Ck4phkdB.js} +1 -1
  371. package/payload/server/public/assets/wrench-Ck4phkdB.js.br +0 -0
  372. package/payload/server/public/assets/wrench-Ck4phkdB.js.gz +0 -0
  373. package/payload/server/public/browser.html +5 -5
  374. package/payload/server/public/calendar.html +8 -8
  375. package/payload/server/public/chat.html +14 -14
  376. package/payload/server/public/data.html +12 -12
  377. package/payload/server/public/field.html +3 -3
  378. package/payload/server/public/graph.html +10 -10
  379. package/payload/server/public/index.html +14 -14
  380. package/payload/server/public/operator.html +16 -16
  381. package/payload/server/public/public.html +14 -14
  382. package/payload/server/public/routines.html +8 -8
  383. package/payload/server/public/skills.html +6 -6
  384. package/payload/server/public/tasks.html +7 -7
  385. package/payload/server/server.js +3777 -1258
  386. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.br +0 -0
  387. package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.gz +0 -0
  388. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  389. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  390. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  391. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  392. package/payload/server/public/assets/admin-CkASgYA7.js.br +0 -0
  393. package/payload/server/public/assets/admin-CkASgYA7.js.gz +0 -0
  394. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  395. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  396. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  397. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  398. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  399. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  400. package/payload/server/public/assets/chat-CKyMT5Ai.js +0 -1
  401. package/payload/server/public/assets/chat-CKyMT5Ai.js.br +0 -1
  402. package/payload/server/public/assets/chat-CKyMT5Ai.js.gz +0 -0
  403. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +0 -1
  404. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  405. package/payload/server/public/assets/clock-DKpWWJbJ.js +0 -1
  406. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  407. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  408. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  409. package/payload/server/public/assets/data-1c33cAHp.js +0 -1
  410. package/payload/server/public/assets/data-1c33cAHp.js.br +0 -2
  411. package/payload/server/public/assets/data-1c33cAHp.js.gz +0 -0
  412. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  413. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  414. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  415. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  416. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  417. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  418. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  419. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  420. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  421. package/payload/server/public/assets/operator-DRn9LITC.js.br +0 -0
  422. package/payload/server/public/assets/operator-DRn9LITC.js.gz +0 -0
  423. package/payload/server/public/assets/page-BwqQsoU8.js.br +0 -0
  424. package/payload/server/public/assets/page-BwqQsoU8.js.gz +0 -0
  425. package/payload/server/public/assets/page-D_9mPS6W.js.br +0 -0
  426. package/payload/server/public/assets/page-D_9mPS6W.js.gz +0 -0
  427. package/payload/server/public/assets/play-7LTxCuLX.js +0 -1
  428. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  429. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  430. package/payload/server/public/assets/public-CrjZYpdW.js.br +0 -0
  431. package/payload/server/public/assets/public-CrjZYpdW.js.gz +0 -0
  432. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  433. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  434. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  435. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  436. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  437. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  438. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  439. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  440. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +0 -4
  441. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  442. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  443. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  444. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  445. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  446. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js +0 -2
  447. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.br +0 -0
  448. package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.gz +0 -0
  449. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  450. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  451. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js → jsx-runtime-BmNepPEn.js} +0 -0
  452. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js.br → jsx-runtime-BmNepPEn.js.br} +0 -0
  453. /package/payload/server/public/assets/{jsx-runtime-Cjug_Cyb.js.gz → jsx-runtime-BmNepPEn.js.gz} +0 -0
@@ -0,0 +1,116 @@
1
+ import { join, resolve } from "node:path";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { resolveAccountDir } from "./account-write.js";
4
+ /** Task 2615 — the read side of Telegram's 24-hour business reply window.
5
+ *
6
+ * `BusinessBotRights.can_reply` grants the right to "send and edit messages in
7
+ * the private chats that had incoming messages in the last 24 hours". Outside
8
+ * that window Telegram refuses the send, and nothing is emitted when the window
9
+ * closes, so a customer simply becomes unanswerable with no event anywhere.
10
+ * Deciding before the call is what turns that silence into a refusal the agent
11
+ * can act on.
12
+ *
13
+ * The platform writes the conversation (`platform/ui/app/lib/telegram/
14
+ * message-store.ts`); this reads it back. The window constant, the row shape and
15
+ * the path derivation are duplicated across the boundary on purpose — the plugin
16
+ * cannot import from `platform/ui/app`, the same boundary that already
17
+ * duplicates the webhook secret path, the card store, the live-location store
18
+ * and the business connection — and
19
+ * `ui/app/lib/telegram/__tests__/business-window-boundary.test.ts` asserts the
20
+ * two derivations agree.
21
+ *
22
+ * TWO ROOTS, and they are not the same one. The connection record sits in the
23
+ * ACCOUNT dir (`data/accounts/<accountId>`); the conversation store is its
24
+ * SIBLING, `data/telegram-messages/<accountId>`. `resolveAccountDir` is still
25
+ * the containment authority: its refusal is what stops a traversal in the
26
+ * account id from reaching outside the install.
27
+ */
28
+ /** Telegram's window, in seconds. Restated rather than imported, for the reason
29
+ * the header gives; the boundary test is what keeps it equal to the platform's
30
+ * `BUSINESS_REPLY_WINDOW_S`. */
31
+ export const BUSINESS_REPLY_WINDOW_S = 86_400;
32
+ /** The business conversation's key. Mirrors `telegramBusinessChannelKey`. */
33
+ export function businessChannelKey(botId, chatId) {
34
+ return `${botId}:biz:${chatId}`;
35
+ }
36
+ function conversationFile(platformRoot, accountId, channelKey) {
37
+ // The guard, not the path: a traversal in the account id must read as no
38
+ // conversation rather than reach outside the install.
39
+ if (!resolveAccountDir(platformRoot, accountId).ok)
40
+ return null;
41
+ // Both halves are Telegram numeric ids around the literal `biz`, so nothing
42
+ // here can carry a separator. Mirrors `isStorableChannelKey`.
43
+ if (!/^-?\d+:biz:-?\d+$/.test(channelKey))
44
+ return null;
45
+ return join(resolve(platformRoot, "..", "data", "telegram-messages", accountId), `${channelKey.replaceAll(":", "_")}.jsonl`);
46
+ }
47
+ /** The newest Telegram-clock second among INBOUND rows in one business chat, or
48
+ * null when the chat holds none carrying that field.
49
+ *
50
+ * Inbound only: the window runs from what the CUSTOMER last sent, and counting
51
+ * an agent reply would extend it on every send so the refusal could never fire.
52
+ *
53
+ * Null rather than 0 for "nothing to measure from". Zero is a real Unix second
54
+ * and would read as 1970, refusing every reply in a conversation whose rows
55
+ * predate the field. */
56
+ export function newestInboundTelegramDate(platformRoot, accountId, channelKey) {
57
+ const path = conversationFile(platformRoot, accountId, channelKey);
58
+ if (path === null || !existsSync(path))
59
+ return null;
60
+ let newest = null;
61
+ try {
62
+ for (const line of readFileSync(path, "utf-8").split("\n")) {
63
+ if (!line.trim())
64
+ continue;
65
+ let row;
66
+ try {
67
+ row = JSON.parse(line);
68
+ }
69
+ catch {
70
+ // A partial write from a crash mid-append is skipped, never fatal.
71
+ continue;
72
+ }
73
+ if (row.kind === "update")
74
+ continue;
75
+ if (row.fromMe === true)
76
+ continue;
77
+ const d = row.telegramDate;
78
+ if (typeof d !== "number" || !Number.isFinite(d))
79
+ continue;
80
+ if (newest === null || d > newest)
81
+ newest = d;
82
+ }
83
+ }
84
+ catch {
85
+ // An unreadable store reads as no inbound, so the tool refuses by name
86
+ // rather than taking the call down over a file the caller never sees.
87
+ return null;
88
+ }
89
+ return newest;
90
+ }
91
+ export function businessWindowVerdict(input) {
92
+ if (input.newestInboundDate === null) {
93
+ return { allowed: false, ageS: null, reason: "no-inbound" };
94
+ }
95
+ const ageS = Math.floor(input.nowMs / 1000) - input.newestInboundDate;
96
+ // Inclusive at the boundary: Telegram's wording is "in the last 24 hours".
97
+ if (ageS > BUSINESS_REPLY_WINDOW_S)
98
+ return { allowed: false, ageS, reason: "lapsed" };
99
+ return { allowed: true, ageS, reason: "ok" };
100
+ }
101
+ /** The refusal the agent reads. It names the WINDOW and the chat, never a
102
+ * parameter: there is no argument the caller could add to make this send work,
103
+ * which is the shape Task 2611 gave `ask.ts` for a checklist with no
104
+ * connection. */
105
+ export function businessWindowRefusal(chatId, ageS) {
106
+ if (ageS === null) {
107
+ return (`Cannot send to business chat ${chatId}: no message has ever been received from it. ` +
108
+ "Telegram allows a business account reply only in a chat that sent an incoming " +
109
+ "message in the last 24 hours.");
110
+ }
111
+ const hours = Math.floor(ageS / 3600);
112
+ return (`Cannot send to business chat ${chatId}: the last message from it arrived ${hours} hours ago. ` +
113
+ "Telegram allows a business account reply only within 24 hours of an incoming message, " +
114
+ "and that window has closed.");
115
+ }
116
+ //# sourceMappingURL=business-window-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-window-store.js","sourceRoot":"","sources":["../../src/lib/business-window-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Task 2617 — may this bot send to this chat id?
3
+ *
4
+ * THE TWIN of platform/ui/app/lib/telegram/chat-send-policy.ts. The plugin cannot
5
+ * import from platform/ui/app, so the rule lives twice; the two are held in step
6
+ * by one shared table of cases asserted in both test files. A divergence means the
7
+ * agent's tools and the platform's scheduled send disagree about what may be
8
+ * posted to, which is the failure that table exists to catch.
9
+ *
10
+ * THE PROBLEM. A Telegram chat id cannot tell a channel from a supergroup: both
11
+ * are `-100`-prefixed, and no local check separates them. So the gate is keyed on
12
+ * the prefix and closed by BOTH allowlists — a `-100` id the operator named in
13
+ * `allowChannels` (Task 2617) or in `allowGroups` (Task 2616) is a broadcast
14
+ * surface somebody sanctioned; one in neither is a broadcast surface nobody did.
15
+ *
16
+ * WHY BEFORE THE NETWORK CALL. A channel post reaches every subscriber and cannot
17
+ * be unsent. A gate that fired on Telegram's verdict would be a record of damage
18
+ * rather than a refusal, so `checkTelegramChatSend` is pure and every caller
19
+ * applies it before building a request.
20
+ */
21
+ export type ChatSendVerdict = {
22
+ allowed: true;
23
+ reason: "not-broadcast" | "allowlist-match";
24
+ } | {
25
+ allowed: false;
26
+ reason: "not-in-allowChannels";
27
+ };
28
+ export declare function checkTelegramChatSend(params: {
29
+ chatId: number;
30
+ allowChannels: readonly number[];
31
+ allowGroups: readonly number[];
32
+ }): ChatSendVerdict;
33
+ /**
34
+ * The gate as each tool applies it: read the allowlists, decide, print the line,
35
+ * and hand back the refusal text when refused.
36
+ *
37
+ * One home, because six tools applying one rule six ways is the drift this task
38
+ * exists to prevent. The line is printed on BOTH outcomes so an allowed send and a
39
+ * refused one are the same grep, and `messageId=none` is always present because a
40
+ * field that appears only on some outcomes cannot be aggregated on.
41
+ */
42
+ export declare function gateChatSend(input: {
43
+ platformRoot: string;
44
+ accountId: string;
45
+ botId: string;
46
+ chatId: string | number;
47
+ log: (line: string) => void;
48
+ }): {
49
+ allowed: true;
50
+ } | {
51
+ allowed: false;
52
+ text: string;
53
+ };
54
+ //# sourceMappingURL=chat-send-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-send-policy.d.ts","sourceRoot":"","sources":["../../src/lib/chat-send-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAYH,MAAM,MAAM,eAAe,GACvB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAAE,GAC9D;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAEvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GAAG,eAAe,CAQlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiDvD"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Task 2617 — may this bot send to this chat id?
3
+ *
4
+ * THE TWIN of platform/ui/app/lib/telegram/chat-send-policy.ts. The plugin cannot
5
+ * import from platform/ui/app, so the rule lives twice; the two are held in step
6
+ * by one shared table of cases asserted in both test files. A divergence means the
7
+ * agent's tools and the platform's scheduled send disagree about what may be
8
+ * posted to, which is the failure that table exists to catch.
9
+ *
10
+ * THE PROBLEM. A Telegram chat id cannot tell a channel from a supergroup: both
11
+ * are `-100`-prefixed, and no local check separates them. So the gate is keyed on
12
+ * the prefix and closed by BOTH allowlists — a `-100` id the operator named in
13
+ * `allowChannels` (Task 2617) or in `allowGroups` (Task 2616) is a broadcast
14
+ * surface somebody sanctioned; one in neither is a broadcast surface nobody did.
15
+ *
16
+ * WHY BEFORE THE NETWORK CALL. A channel post reaches every subscriber and cannot
17
+ * be unsent. A gate that fired on Telegram's verdict would be a record of damage
18
+ * rather than a refusal, so `checkTelegramChatSend` is pure and every caller
19
+ * applies it before building a request.
20
+ */
21
+ import { readBotChatAllowlists } from "./account-token.js";
22
+ const TAG = "[telegram-outbound]";
23
+ /** Telegram's own prefix for a supergroup or a channel. A private chat id is
24
+ * positive and a basic group id is negative without it, so this is the exact set
25
+ * of ids that COULD be a channel. Compared as digits rather than by magnitude:
26
+ * the question is what Telegram's id scheme says, not how large the number is. */
27
+ const BROADCAST_PREFIX = "-100";
28
+ export function checkTelegramChatSend(params) {
29
+ if (!String(params.chatId).startsWith(BROADCAST_PREFIX)) {
30
+ return { allowed: true, reason: "not-broadcast" };
31
+ }
32
+ if (params.allowChannels.includes(params.chatId) || params.allowGroups.includes(params.chatId)) {
33
+ return { allowed: true, reason: "allowlist-match" };
34
+ }
35
+ return { allowed: false, reason: "not-in-allowChannels" };
36
+ }
37
+ /**
38
+ * The gate as each tool applies it: read the allowlists, decide, print the line,
39
+ * and hand back the refusal text when refused.
40
+ *
41
+ * One home, because six tools applying one rule six ways is the drift this task
42
+ * exists to prevent. The line is printed on BOTH outcomes so an allowed send and a
43
+ * refused one are the same grep, and `messageId=none` is always present because a
44
+ * field that appears only on some outcomes cannot be aggregated on.
45
+ */
46
+ export function gateChatSend(input) {
47
+ // An @username addresses a CHANNEL or a supergroup and nothing else — Telegram
48
+ // documents `chat_id` as "the target chat or username of the target channel (in
49
+ // the format @channelusername)", and the tool schema offers both forms to the
50
+ // model. It cannot be resolved to a numeric id without asking Telegram, and the
51
+ // allowlists hold numeric ids, so there is nothing local to check it against.
52
+ //
53
+ // Refused rather than passed through. Passing it through would leave every
54
+ // allowlist in this file bypassable by naming the same channel a different way,
55
+ // which is the whole gate defeated by a string. A private chat cannot be
56
+ // addressed this way at all, so nothing else is lost.
57
+ const named = typeof input.chatId === "string" ? input.chatId.trim() : "";
58
+ if (named.startsWith("@")) {
59
+ input.log(`${TAG} op=channel-send botId=${input.botId} chatId=${named} ` +
60
+ `allowed=no reason=username-not-allowlistable messageId=none`);
61
+ return {
62
+ allowed: false,
63
+ text: `Refused: "${named}" names a channel or supergroup by @username, and this bot's ` +
64
+ `allowlist holds numeric chat ids, so there is nothing to check it against. ` +
65
+ `Nothing was sent. Use the numeric chat id, and make sure it is in allowChannels ` +
66
+ `(for a channel) or allowGroups (for a group) on bot ${input.botId}.`,
67
+ };
68
+ }
69
+ const chatId = Number(input.chatId);
70
+ // A chat id Telegram will reject anyway, and NOT an @username — that is refused
71
+ // above. Passed through so Telegram's own 400 is the verdict on a malformed id,
72
+ // rather than this gate inventing a refusal for a question it was not given.
73
+ if (!Number.isFinite(chatId))
74
+ return { allowed: true };
75
+ const lists = readBotChatAllowlists(input.platformRoot, input.accountId, input.botId);
76
+ const verdict = checkTelegramChatSend({ chatId, ...lists });
77
+ input.log(`${TAG} op=channel-send botId=${input.botId} chatId=${chatId} ` +
78
+ `allowed=${verdict.allowed ? "yes" : "no"} reason=${verdict.reason} messageId=none`);
79
+ if (verdict.allowed)
80
+ return { allowed: true };
81
+ return {
82
+ allowed: false,
83
+ text: `Refused: ${chatId} is a Telegram channel or supergroup that is not on this bot's ` +
84
+ `allowlist, so nothing was sent. A channel post reaches every subscriber and cannot ` +
85
+ `be unsent, which is why this is refused rather than attempted. To allow it, add ` +
86
+ `${chatId} to allowChannels (if it is a channel) or allowGroups (if it is a group) ` +
87
+ `on bot ${input.botId}.`,
88
+ };
89
+ }
90
+ //# sourceMappingURL=chat-send-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-send-policy.js","sourceRoot":"","sources":["../../src/lib/chat-send-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,GAAG,GAAG,qBAAqB,CAAC;AAElC;;;mFAGmF;AACnF,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAMhC,MAAM,UAAU,qBAAqB,CAAC,MAIrC;IACC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAM5B;IACC,+EAA+E;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,gFAAgF;IAChF,8EAA8E;IAC9E,EAAE;IACF,2EAA2E;IAC3E,gFAAgF;IAChF,yEAAyE;IACzE,sDAAsD;IACtD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,CACP,GAAG,GAAG,0BAA0B,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;YAC5D,6DAA6D,CAChE,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EACF,aAAa,KAAK,+DAA+D;gBACjF,6EAA6E;gBAC7E,kFAAkF;gBAClF,uDAAuD,KAAK,CAAC,KAAK,GAAG;SACxE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,gFAAgF;IAChF,gFAAgF;IAChF,6EAA6E;IAC7E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEvD,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,GAAG,CACP,GAAG,GAAG,0BAA0B,KAAK,CAAC,KAAK,WAAW,MAAM,GAAG;QAC7D,WAAW,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,WAAW,OAAO,CAAC,MAAM,iBAAiB,CACtF,CAAC;IACF,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EACF,YAAY,MAAM,iEAAiE;YACnF,qFAAqF;YACrF,kFAAkF;YAClF,GAAG,MAAM,2EAA2E;YACpF,UAAU,KAAK,CAAC,KAAK,GAAG;KAC3B,CAAC;AACJ,CAAC"}
@@ -1,3 +1,5 @@
1
+ export { TELEGRAM_ALLOWED_UPDATES, setTelegramWebhook as setWebhook, getTelegramWebhookInfo as getWebhookInfo, type WebhookInfo, } from "../../../../../lib/telegram-managed-bot/dist/index.js";
2
+ import type { WebhookInfo } from "../../../../../lib/telegram-managed-bot/dist/index.js";
1
3
  export interface TelegramSendOptions {
2
4
  chatId: string | number;
3
5
  text: string;
@@ -42,34 +44,6 @@ export declare function sendMessage(botToken: string, options: TelegramSendOptio
42
44
  messageId?: number;
43
45
  error?: string;
44
46
  }>;
45
- /**
46
- * Register a webhook URL with Telegram and generate a cryptographic secret.
47
- *
48
- * The secret is:
49
- * 1. Generated via crypto.randomBytes (64 hex chars)
50
- * 2. Passed to the Telegram Bot API as secret_token
51
- * 3. Written to secretFilePath on disk ONLY after the API confirms success
52
- *
53
- * Telegram sends this secret in the X-Telegram-Bot-Api-Secret-Token header
54
- * on every webhook delivery. The webhook route validates it before processing.
55
- *
56
- * If secretFilePath is omitted, no secret is generated (backward compat for tests).
57
- */
58
- export declare function setWebhook(botToken: string, webhookUrl: string, secretFilePath?: string, fetchImpl?: typeof fetch): Promise<{
59
- ok: boolean;
60
- secret?: string;
61
- error?: string;
62
- }>;
63
- export interface WebhookInfo {
64
- url: string;
65
- pendingUpdateCount: number;
66
- /** Unix seconds of the most recent delivery error Telegram saw, 0 when it
67
- * reports none. Telegram KEEPS this across a re-registration, which is why
68
- * the verdict compares it against the moment we registered. */
69
- lastErrorDate: number;
70
- lastErrorMessage?: string;
71
- }
72
- export declare function getWebhookInfo(botToken: string, fetchImpl?: typeof fetch): Promise<WebhookInfo>;
73
47
  export interface WebhookVerdict {
74
48
  reachable: boolean;
75
49
  /** Telegram's own error text, empty when reachable. */
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,KAAK,CACpB,KAAK,CAAC;QACJ,IAAI,EAAE,MAAM,CAAC;QACb;;mFAE2E;QAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kDAAkD;QAClD,GAAG,CAAC,EAAE,MAAM,CAAC;QACb;;qFAE6E;QAC7E,OAAO,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3B,CAAC,CACH,CAAC;CACH;AAED;;0BAE0B;AAC1B,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;oDAKoD;AACpD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,yBAAyB,EAAE,EAAE,GAClC,sBAAsB,CAWxB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,EACvB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC3D;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;oEAEgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;6CAc6C;AAC7C,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,CAKzF"}
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,wBAAwB,EACxB,kBAAkB,IAAI,UAAU,EAChC,sBAAsB,IAAI,cAAc,EACxC,KAAK,WAAW,GACjB,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uDAAuD,CAAC;AAIzF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,KAAK,CACpB,KAAK,CAAC;QACJ,IAAI,EAAE,MAAM,CAAC;QACb;;mFAE2E;QAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kDAAkD;QAClD,GAAG,CAAC,EAAE,MAAM,CAAC;QACb;;qFAE6E;QAC7E,OAAO,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3B,CAAC,CACH,CAAC;CACH;AAED;;0BAE0B;AAC1B,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;oDAKoD;AACpD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,yBAAyB,EAAE,EAAE,GAClC,sBAAsB,CAWxB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB9D;AAGD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;6CAc6C;AAC7C,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,CAKzF"}
@@ -1,6 +1,11 @@
1
- import { randomBytes } from "node:crypto";
2
- import { writeFileSync, mkdirSync } from "node:fs";
3
- import { dirname } from "node:path";
1
+ // Task 2618 `TELEGRAM_ALLOWED_UPDATES` and `setWebhook` MOVED to
2
+ // platform/lib/telegram-managed-bot and are re-exported here, so every existing
3
+ // import of this module keeps its path. The move exists because the UI webhook
4
+ // route needs both to register a newly provisioned bot, and UI production code
5
+ // does not import plugin source: the alternative was a second copy of the
6
+ // allowed-updates list, and two lists that must agree is the drift Task 2612
7
+ // spent a task removing.
8
+ export { TELEGRAM_ALLOWED_UPDATES, setTelegramWebhook as setWebhook, getTelegramWebhookInfo as getWebhookInfo, } from "../../../../../lib/telegram-managed-bot/dist/index.js";
4
9
  const TELEGRAM_API = "https://api.telegram.org";
5
10
  /** Task 2501 — the agent-facing shape mapped to the Bot API's. Extracted from the
6
11
  * telegram-message tool so the mapping is testable without an account
@@ -37,56 +42,6 @@ export async function sendMessage(botToken, options) {
37
42
  }
38
43
  return { ok: true, messageId: data.result?.message_id };
39
44
  }
40
- /**
41
- * Register a webhook URL with Telegram and generate a cryptographic secret.
42
- *
43
- * The secret is:
44
- * 1. Generated via crypto.randomBytes (64 hex chars)
45
- * 2. Passed to the Telegram Bot API as secret_token
46
- * 3. Written to secretFilePath on disk ONLY after the API confirms success
47
- *
48
- * Telegram sends this secret in the X-Telegram-Bot-Api-Secret-Token header
49
- * on every webhook delivery. The webhook route validates it before processing.
50
- *
51
- * If secretFilePath is omitted, no secret is generated (backward compat for tests).
52
- */
53
- export async function setWebhook(botToken, webhookUrl, secretFilePath, fetchImpl = fetch) {
54
- const secret = secretFilePath ? randomBytes(32).toString("hex") : undefined;
55
- const body = { url: webhookUrl };
56
- if (secret) {
57
- body.secret_token = secret;
58
- }
59
- const res = await fetchImpl(`${TELEGRAM_API}/bot${botToken}/setWebhook`, {
60
- method: "POST",
61
- headers: { "Content-Type": "application/json" },
62
- body: JSON.stringify(body),
63
- });
64
- const data = (await res.json());
65
- if (!data.ok) {
66
- return { ok: false, error: data.description ?? "Failed to set webhook" };
67
- }
68
- // Write secret to disk only after Telegram confirms the webhook registration.
69
- // This prevents orphaned secret files when the API call fails, and avoids
70
- // overwriting a working secret during a failed re-registration attempt.
71
- if (secret && secretFilePath) {
72
- mkdirSync(dirname(secretFilePath), { recursive: true });
73
- writeFileSync(secretFilePath, secret, { mode: 0o600 });
74
- console.error(`[telegram] webhook secret written to ${secretFilePath} (${secret.length} chars)`);
75
- }
76
- return { ok: true, secret };
77
- }
78
- export async function getWebhookInfo(botToken, fetchImpl = fetch) {
79
- const res = await fetchImpl(`${TELEGRAM_API}/bot${botToken}/getWebhookInfo`);
80
- const data = (await res.json());
81
- return {
82
- url: data.result.url,
83
- pendingUpdateCount: data.result.pending_update_count,
84
- lastErrorDate: data.result.last_error_date ?? 0,
85
- ...(data.result.last_error_message !== undefined
86
- ? { lastErrorMessage: data.result.last_error_message }
87
- : {}),
88
- };
89
- }
90
45
  /** Task 2560 — a registration is unreachable when Telegram reports a delivery
91
46
  * error it saw AT OR AFTER the moment we registered. An error dated before the
92
47
  * stamp belongs to the previous URL: Telegram keeps `last_error_date` and
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,6EAA6E;AAC7E,yBAAyB;AACzB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,IAAI,UAAU,EAChC,sBAAsB,IAAI,cAAc,GAEzC,MAAM,uDAAuD,CAAC;AAG/D,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAqChD;;;;;oDAKoD;AACpD,MAAM,UAAU,mBAAmB,CACjC,IAAmC;IAEnC,OAAO;QACL,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAChC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC,CACJ;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAA4B;IAE5B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,OAAO,QAAQ,cAAc,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM;YACvC,YAAY,EAAE,OAAO,CAAC,WAAW;gBAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;gBACrC,CAAC,CAAC,SAAS;SACd,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,IAAI,wBAAwB,EAAE,CAAC;IAC5E,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AAC1D,CAAC;AASD;;;;;;;;;;;;;;6CAc6C;AAC7C,MAAM,UAAU,cAAc,CAAC,IAAiB,EAAE,eAAuB;IACvE,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC;QACnE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/tools/api.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;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;AAED;;;sBAGsB;AACtB,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA0EjF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/tools/api.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;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;AAED;;;sBAGsB;AACtB,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA4FjF"}
@@ -1,6 +1,7 @@
1
1
  import { checkMethod } from "../lib/api-guard.js";
2
2
  import { callBotApi } from "../lib/bot-api.js";
3
3
  import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
4
+ import { gateChatSend } from "../lib/chat-send-policy.js";
4
5
  const TAG = "[telegram-api]";
5
6
  /** One tool for all 185 Bot API methods. Resolution order is: no account, then
6
7
  * the refusal list, then the bot's token, then the call itself. Each stop
@@ -41,6 +42,24 @@ export async function telegramApi(p, deps) {
41
42
  : "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
42
43
  };
43
44
  }
45
+ // Task 2617 — keyed on the PRESENCE of `chat_id`, never on the method name. A
46
+ // method allowlist would need extending every time Telegram adds a send-shaped
47
+ // method, and the gap between an unlisted method and a real send is exactly the
48
+ // hole this gate exists to close. A `chat_id` that is neither string nor number
49
+ // is passed through: Telegram's own 400 is the right verdict on a malformed id,
50
+ // and inventing a refusal for it would decide a question this task was not given.
51
+ const rawChatId = p.params?.chat_id;
52
+ if (typeof rawChatId === "string" || typeof rawChatId === "number") {
53
+ const gate = gateChatSend({
54
+ platformRoot: deps.platformRoot,
55
+ accountId: deps.accountId,
56
+ botId: p.botId,
57
+ chatId: rawChatId,
58
+ log,
59
+ });
60
+ if (!gate.allowed)
61
+ return { ok: false, isError: true, text: gate.text };
62
+ }
44
63
  const fileCount = p.files ? Object.keys(p.files).length : 0;
45
64
  log(`${TAG} op=call callId=${callId} method=${p.method} listed=${verdict.listed} files=${fileCount}`);
46
65
  let envelope;
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/tools/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/tools/api.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/tools/ask.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAMzF,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;AAoOD;;;;;;;;;+EAS+E;AAC/E,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAqGjF"}
@@ -1,6 +1,8 @@
1
1
  import { callBotApi } from "../lib/bot-api.js";
2
2
  import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
3
+ import { readBusinessConnection } from "../lib/business-connection-store.js";
3
4
  import { buildInlineKeyboard } from "../lib/telegram.js";
5
+ import { gateChatSend } from "../lib/chat-send-policy.js";
4
6
  const TAG = "[telegram-tools]";
5
7
  const TOOL = "telegram-ask";
6
8
  /** Kind to Bot API method. Verified against the live parameter tables on
@@ -35,7 +37,15 @@ function missingField(p) {
35
37
  case "checklist":
36
38
  case "editChecklist": {
37
39
  if (!p.businessConnectionId) {
38
- return `${p.kind} needs \`businessConnectionId\`: Telegram sends a checklist only on behalf of a connected business account.`;
40
+ // Task 2611 the refusal names the OPERATOR STEP, not the parameter. By
41
+ // this point the store has already been consulted and had nothing, so
42
+ // telling the model a parameter is missing would name something it has no
43
+ // way to obtain: the identifier exists only inside a connection Telegram
44
+ // announces once, to this bot, when a human makes it.
45
+ return (`${p.kind} needs a business connection, and none is stored for bot ${p.botId}. ` +
46
+ "Telegram sends a checklist only on behalf of a connected business account. " +
47
+ "Ask the operator to connect this bot in Telegram under Settings, Business, Chatbots; " +
48
+ "the connection is captured automatically the moment it is made.");
39
49
  }
40
50
  if (!p.checklist)
41
51
  return `${p.kind} needs \`checklist\` (its title and 1-30 tasks).`;
@@ -184,7 +194,9 @@ function bodyFor(p) {
184
194
  ? {}
185
195
  : {
186
196
  // sendChecklist is the one send method with no message_thread_id in its
187
- // table, so it is excluded here too.
197
+ // table. Task 2616 refuses that pair in `telegramAsk` before this builder
198
+ // runs, so the `kind` test here is unreachable in practice and kept as
199
+ // the shape guard for any caller that reaches `bodyFor` directly.
188
200
  ...(p.messageThreadId !== undefined && p.kind !== "checklist"
189
201
  ? { message_thread_id: p.messageThreadId }
190
202
  : {}),
@@ -203,6 +215,32 @@ function bodyFor(p) {
203
215
  ...envelope,
204
216
  };
205
217
  }
218
+ /** The two checklist kinds, resolved against the stored connection.
219
+ *
220
+ * Task 2611 — `business_connection_id` is required on both and there is no
221
+ * variant without it, so before this the tool could only ever refuse: nothing on
222
+ * the install could produce an identifier for the model to pass. The platform now
223
+ * captures the one Telegram announces, and this spends it.
224
+ *
225
+ * An explicit value WINS. The store holds one connection per bot and a caller who
226
+ * names a different one has a reason the store cannot know about; silently
227
+ * overriding them would make the parameter a lie. Returns the params unchanged
228
+ * for every other kind, so no other call path grows a filesystem read.
229
+ *
230
+ * The line names the SOURCE and never the identifier: it is a capability handle,
231
+ * and the platform side truncates it for the same reason. */
232
+ function resolveBusinessConnection(p, platformRoot, accountId, callId, log) {
233
+ if (p.kind !== "checklist" && p.kind !== "editChecklist")
234
+ return p;
235
+ if (p.businessConnectionId)
236
+ return p;
237
+ const rec = readBusinessConnection(platformRoot, accountId, p.botId);
238
+ if (!rec)
239
+ return p;
240
+ log(`${TAG} op=business-connection-resolved callId=${callId} tool=${TOOL} ` +
241
+ `botId=${p.botId} kind=${p.kind} source=store`);
242
+ return { ...p, businessConnectionId: rec.id };
243
+ }
206
244
  /** Polls, checklists, locations, venues, contacts and dice, plus stopping a
207
245
  * poll and editing or stopping a live location.
208
246
  *
@@ -224,30 +262,61 @@ export async function telegramAsk(p, deps) {
224
262
  "(plugin-system metadata-only mode).",
225
263
  };
226
264
  }
227
- const missing = missingField(p);
265
+ // Task 2611 — resolved BEFORE the pre-flight, so the pre-flight decides against
266
+ // the identifier that will actually be sent and its refusal is never raised
267
+ // against a connection the install already holds.
268
+ const params = resolveBusinessConnection(p, deps.platformRoot, deps.accountId, callId, log);
269
+ const missing = missingField(params);
228
270
  if (missing) {
229
- log(`${TAG} op=refused callId=${callId} tool=${TOOL} kind=${p.kind} reason=missing-field`);
271
+ log(`${TAG} op=refused callId=${callId} tool=${TOOL} kind=${params.kind} reason=missing-field`);
230
272
  return { ok: false, isError: true, text: missing };
231
273
  }
232
- const token = resolveBotToken(deps.platformRoot, deps.accountId, p.botId);
274
+ // Task 2616 `sendChecklist` is the one send method with no
275
+ // `message_thread_id` in its table. The envelope builder below excluded the
276
+ // field for that reason and said nothing, so a checklist addressed to a forum
277
+ // topic landed in the group's General thread and the call reported success:
278
+ // the caller was told the checklist went where it asked, and it had not. A
279
+ // refusal before the network call is the honest answer.
280
+ if (params.kind === "checklist" && params.messageThreadId !== undefined) {
281
+ log(`${TAG} op=refused callId=${callId} tool=${TOOL} kind=${params.kind} reason=checklist-no-thread`);
282
+ return {
283
+ ok: false,
284
+ isError: true,
285
+ text: `sendChecklist has no message_thread_id, so a checklist cannot be sent into a forum topic. ` +
286
+ `Send it without messageThreadId and it lands in the group's General thread, or use a poll ` +
287
+ `or a plain message for the topic itself.`,
288
+ };
289
+ }
290
+ const token = resolveBotToken(deps.platformRoot, deps.accountId, params.botId);
233
291
  if (!token) {
234
292
  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}`);
293
+ log(`${TAG} op=no-bot callId=${callId} tool=${TOOL} account=${deps.accountId} botId=${params.botId} registered=${known.length}`);
236
294
  return {
237
295
  ok: false,
238
296
  isError: true,
239
297
  text: known.length
240
- ? `No bot "${p.botId}" is registered on this account. Registered: ${known
298
+ ? `No bot "${params.botId}" is registered on this account. Registered: ${known
241
299
  .map((b) => `${b.id} (${b.role})`)
242
300
  .join(", ")}.`
243
301
  : "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
244
302
  };
245
303
  }
246
- const method = ASK_METHOD[p.kind];
247
- log(`${TAG} op=call tool=${TOOL} method=${method} callId=${callId} botId=${p.botId}`);
304
+ // Task 2617 — before the method is chosen and before any body is built, so a
305
+ // refused send touches nothing.
306
+ const gate = gateChatSend({
307
+ platformRoot: deps.platformRoot,
308
+ accountId: deps.accountId,
309
+ botId: params.botId,
310
+ chatId: params.chatId,
311
+ log,
312
+ });
313
+ if (!gate.allowed)
314
+ return { ok: false, isError: true, text: gate.text };
315
+ const method = ASK_METHOD[params.kind];
316
+ log(`${TAG} op=call tool=${TOOL} method=${method} callId=${callId} botId=${params.botId}`);
248
317
  let envelope;
249
318
  try {
250
- envelope = await callBotApi(token, method, bodyFor(p), {
319
+ envelope = await callBotApi(token, method, bodyFor(params), {
251
320
  ...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
252
321
  });
253
322
  }