@rubytech/create-maxy-code 0.1.582 → 0.1.584

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 (421) 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 +86 -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 +246 -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 +268 -0
  20. package/payload/platform/lib/telegram-reach/src/index.ts +296 -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 +146 -8
  30. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +16 -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 +17 -3
  47. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +15 -0
  48. package/payload/platform/plugins/docs/references/telegram-guide.md +113 -4
  49. package/payload/platform/plugins/filesystem/PLUGIN.md +2 -2
  50. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.d.ts +2 -0
  51. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.d.ts.map +1 -0
  52. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.js +108 -0
  53. package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/account-schema.test.js.map +1 -0
  54. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.d.ts +17 -0
  55. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.d.ts.map +1 -0
  56. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.js +162 -0
  57. package/payload/platform/plugins/filesystem/mcp/dist/lib/account-schema.js.map +1 -0
  58. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.d.ts +2 -0
  59. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.d.ts.map +1 -0
  60. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.js +116 -0
  61. package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/schema-fence.test.js.map +1 -0
  62. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -1
  63. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +9 -0
  64. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -1
  65. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -1
  66. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +10 -0
  67. package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -1
  68. package/payload/platform/plugins/scheduling/PLUGIN.md +8 -2
  69. package/payload/platform/plugins/scheduling/mcp/dist/index.js +7 -2
  70. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  71. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +53 -6
  72. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -1
  73. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +38 -0
  74. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -1
  75. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +5 -3
  76. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
  77. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +18 -3
  78. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
  79. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +30 -0
  80. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  81. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +112 -39
  82. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  83. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +14 -1
  84. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  85. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +258 -8
  86. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  87. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +206 -3
  88. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  89. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +29 -21
  90. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  91. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +94 -14
  92. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  93. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  94. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +29 -1
  95. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  96. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +30 -0
  97. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  98. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +69 -6
  99. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  100. package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
  101. package/payload/platform/plugins/telegram/PLUGIN.md +46 -9
  102. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +25 -11
  103. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js.map +1 -1
  104. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js +67 -5
  105. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js.map +1 -1
  106. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-methods.test.js +9 -3
  107. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-methods.test.js.map +1 -1
  108. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +87 -3
  109. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -1
  110. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.d.ts +2 -0
  111. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.d.ts.map +1 -0
  112. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.js +326 -0
  113. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-provision-tool.test.js.map +1 -0
  114. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.d.ts +2 -0
  115. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.d.ts.map +1 -0
  116. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.js +184 -0
  117. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-business.test.js.map +1 -0
  118. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +79 -0
  119. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -1
  120. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.d.ts +2 -0
  121. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.d.ts.map +1 -0
  122. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.js +34 -0
  123. package/payload/platform/plugins/telegram/mcp/dist/__tests__/chat-send-policy.test.js.map +1 -0
  124. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.d.ts +2 -0
  125. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.d.ts.map +1 -0
  126. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.js +106 -0
  127. package/payload/platform/plugins/telegram/mcp/dist/__tests__/reach-tool.test.js.map +1 -0
  128. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js +2 -31
  129. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js.map +1 -1
  130. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +15 -1
  131. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -1
  132. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js +178 -2
  133. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js.map +1 -1
  134. package/payload/platform/plugins/telegram/mcp/dist/index.js +22 -8
  135. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  136. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.d.ts +19 -0
  137. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.d.ts.map +1 -1
  138. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.js +41 -1
  139. package/payload/platform/plugins/telegram/mcp/dist/lib/account-token.js.map +1 -1
  140. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +21 -19
  141. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  142. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +44 -36
  143. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  144. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.d.ts +13 -0
  145. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.d.ts.map +1 -1
  146. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.js +22 -1
  147. package/payload/platform/plugins/telegram/mcp/dist/lib/agent-active.js.map +1 -1
  148. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts +11 -1
  149. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
  150. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +24 -4
  151. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
  152. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts +11 -1
  153. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts.map +1 -1
  154. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js +54 -2
  155. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js.map +1 -1
  156. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.d.ts +0 -3
  157. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.d.ts.map +1 -1
  158. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.js +0 -1
  159. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.js.map +1 -1
  160. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.d.ts +58 -0
  161. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.d.ts.map +1 -0
  162. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.js +125 -0
  163. package/payload/platform/plugins/telegram/mcp/dist/lib/business-window-store.js.map +1 -0
  164. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.d.ts +55 -0
  165. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.d.ts.map +1 -0
  166. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.js +91 -0
  167. package/payload/platform/plugins/telegram/mcp/dist/lib/chat-send-policy.js.map +1 -0
  168. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts +2 -53
  169. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts.map +1 -1
  170. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js +8 -94
  171. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js.map +1 -1
  172. package/payload/platform/plugins/telegram/mcp/dist/tools/api.d.ts.map +1 -1
  173. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js +27 -0
  174. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js.map +1 -1
  175. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -1
  176. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +31 -1
  177. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -1
  178. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.d.ts +64 -0
  179. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.d.ts.map +1 -0
  180. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.js +217 -0
  181. package/payload/platform/plugins/telegram/mcp/dist/tools/bot-provision.js.map +1 -0
  182. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +7 -0
  183. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -1
  184. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +56 -0
  185. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -1
  186. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -1
  187. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +15 -0
  188. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -1
  189. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -1
  190. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +12 -0
  191. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -1
  192. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.d.ts +22 -0
  193. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.d.ts.map +1 -0
  194. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.js +72 -0
  195. package/payload/platform/plugins/telegram/mcp/dist/tools/reach.js.map +1 -0
  196. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +17 -68
  197. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -1
  198. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +30 -90
  199. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -1
  200. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -1
  201. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +12 -0
  202. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -1
  203. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts +4 -1
  204. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts.map +1 -1
  205. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js +59 -4
  206. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js.map +1 -1
  207. package/payload/platform/plugins/telegram/skills/build/SKILL.md +155 -40
  208. package/payload/platform/plugins/telegram/skills/build/references/methods.md +3 -13
  209. package/payload/platform/plugins/telegram/skills/configure/SKILL.md +87 -6
  210. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +12 -0
  211. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +36 -5
  212. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
  213. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +103 -10
  214. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
  215. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  216. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +2 -1
  217. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  218. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  219. package/payload/platform/services/claude-session-manager/dist/http-server.js +42 -4
  220. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  221. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  222. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +19 -5
  223. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  224. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +9 -0
  225. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  226. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +5 -1
  227. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  228. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  229. package/payload/platform/services/telegram-channel/dist/instructions.js +13 -0
  230. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  231. package/payload/platform/services/telegram-channel/dist/notification.d.ts +13 -0
  232. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  233. package/payload/platform/services/telegram-channel/dist/notification.js +13 -2
  234. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  235. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +52 -0
  236. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  237. package/payload/platform/services/whatsapp-channel/dist/notification.js +64 -1
  238. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  239. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  240. package/payload/platform/services/whatsapp-channel/dist/server.js +14 -2
  241. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  242. package/payload/platform/templates/account-schema/SCHEMA.md +17 -10
  243. package/payload/platform/templates/agents/admin/IDENTITY.md +5 -0
  244. package/payload/platform/templates/specialists/agents/data-manager.md +2 -2
  245. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  246. package/payload/server/{chunk-BFRB2U75.js → chunk-CV6AEMKH.js} +1 -0
  247. package/payload/server/{manager-CTVTF4YB.js → manager-FQSQSSJ3.js} +1 -1
  248. package/payload/server/public/activity.html +6 -6
  249. package/payload/server/public/agents.html +5 -5
  250. package/payload/server/public/assets/{AdminLoginScreens-AnJZfgFz.js → AdminLoginScreens-BLsDYWVi.js} +1 -1
  251. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.br +0 -0
  252. package/payload/server/public/assets/AdminLoginScreens-BLsDYWVi.js.gz +0 -0
  253. package/payload/server/public/assets/{AdminShell-CEVqyQqg.js → AdminShell-BZS8jzFA.js} +1 -1
  254. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.br +0 -0
  255. package/payload/server/public/assets/AdminShell-BZS8jzFA.js.gz +0 -0
  256. package/payload/server/public/assets/{activity-czUaUl8I.js → activity-DOjvoLdd.js} +1 -1
  257. package/payload/server/public/assets/activity-DOjvoLdd.js.br +0 -0
  258. package/payload/server/public/assets/activity-DOjvoLdd.js.gz +0 -0
  259. package/payload/server/public/assets/{admin-B0iRcfuk.js → admin-JrSNg29g.js} +1 -1
  260. package/payload/server/public/assets/admin-JrSNg29g.js.br +0 -0
  261. package/payload/server/public/assets/admin-JrSNg29g.js.gz +0 -0
  262. package/payload/server/public/assets/{agents-BocONCeQ.js → agents--9WMJVLC.js} +1 -1
  263. package/payload/server/public/assets/agents--9WMJVLC.js.br +0 -0
  264. package/payload/server/public/assets/agents--9WMJVLC.js.gz +0 -0
  265. package/payload/server/public/assets/{browser-Cy-rJm3t.js → browser-DiiMmTrM.js} +1 -1
  266. package/payload/server/public/assets/browser-DiiMmTrM.js.br +0 -0
  267. package/payload/server/public/assets/browser-DiiMmTrM.js.gz +0 -0
  268. package/payload/server/public/assets/{calendar-DUTKxWtd.js → calendar-CazmCzgO.js} +1 -1
  269. package/payload/server/public/assets/calendar-CazmCzgO.js.br +0 -0
  270. package/payload/server/public/assets/calendar-CazmCzgO.js.gz +0 -0
  271. package/payload/server/public/assets/chat-CB0TcyXX.js +1 -0
  272. package/payload/server/public/assets/chat-CB0TcyXX.js.br +0 -0
  273. package/payload/server/public/assets/chat-CB0TcyXX.js.gz +0 -0
  274. package/payload/server/public/assets/chevron-left-0tVo23Dh.js +1 -0
  275. package/payload/server/public/assets/chevron-left-0tVo23Dh.js.br +0 -0
  276. package/payload/server/public/assets/clock-D2cZ0sge.js +1 -0
  277. package/payload/server/public/assets/clock-D2cZ0sge.js.br +0 -0
  278. package/payload/server/public/assets/clock-D2cZ0sge.js.gz +0 -0
  279. package/payload/server/public/assets/{copy-DE9qmAs5.js → copy-C87QIN_o.js} +1 -1
  280. package/payload/server/public/assets/copy-C87QIN_o.js.br +0 -0
  281. package/payload/server/public/assets/copy-C87QIN_o.js.gz +0 -0
  282. package/payload/server/public/assets/data-CK7AMxPt.js +1 -0
  283. package/payload/server/public/assets/data-CK7AMxPt.js.br +0 -0
  284. package/payload/server/public/assets/data-CK7AMxPt.js.gz +0 -0
  285. package/payload/server/public/assets/{field-DE2tEfTo.js → field-C3kQgGWE.js} +1 -1
  286. package/payload/server/public/assets/field-C3kQgGWE.js.br +0 -0
  287. package/payload/server/public/assets/field-C3kQgGWE.js.gz +0 -0
  288. package/payload/server/public/assets/{file-text-BHfL2gqo.js → file-text-rWowl9RN.js} +1 -1
  289. package/payload/server/public/assets/file-text-rWowl9RN.js.br +0 -0
  290. package/payload/server/public/assets/file-text-rWowl9RN.js.gz +0 -0
  291. package/payload/server/public/assets/{graph-08S_BofN.js → graph-CVJKz1Uo.js} +1 -1
  292. package/payload/server/public/assets/graph-CVJKz1Uo.js.br +0 -0
  293. package/payload/server/public/assets/graph-CVJKz1Uo.js.gz +0 -0
  294. package/payload/server/public/assets/{graph-labels-C640Er5R.js → graph-labels-kneGnsHB.js} +1 -1
  295. package/payload/server/public/assets/graph-labels-kneGnsHB.js.br +0 -0
  296. package/payload/server/public/assets/graph-labels-kneGnsHB.js.gz +0 -0
  297. package/payload/server/public/assets/{jsx-runtime-FxjwOUbA.css → jsx-runtime-rMaiYjNu.css} +1 -1
  298. package/payload/server/public/assets/jsx-runtime-rMaiYjNu.css.br +0 -0
  299. package/payload/server/public/assets/{jsx-runtime-FxjwOUbA.css.gz → jsx-runtime-rMaiYjNu.css.gz} +0 -0
  300. package/payload/server/public/assets/{operator-DH5Kw3fL.js → operator-BGvB4hu4.js} +1 -1
  301. package/payload/server/public/assets/operator-BGvB4hu4.js.br +0 -0
  302. package/payload/server/public/assets/operator-BGvB4hu4.js.gz +0 -0
  303. package/payload/server/public/assets/{page-BDpa4HWT.js → page-DBQLOasI.js} +1 -1
  304. package/payload/server/public/assets/page-DBQLOasI.js.br +0 -0
  305. package/payload/server/public/assets/page-DBQLOasI.js.gz +0 -0
  306. package/payload/server/public/assets/{page-yn7ivq8O.js → page-DyVAu7tm.js} +1 -1
  307. package/payload/server/public/assets/page-DyVAu7tm.js.br +0 -0
  308. package/payload/server/public/assets/page-DyVAu7tm.js.gz +0 -0
  309. package/payload/server/public/assets/play-DgP7vl0r.js +1 -0
  310. package/payload/server/public/assets/play-DgP7vl0r.js.br +0 -0
  311. package/payload/server/public/assets/play-DgP7vl0r.js.gz +0 -0
  312. package/payload/server/public/assets/{public-D_qjqet7.js → public-BvUQR3hd.js} +1 -1
  313. package/payload/server/public/assets/public-BvUQR3hd.js.br +0 -0
  314. package/payload/server/public/assets/public-BvUQR3hd.js.gz +0 -0
  315. package/payload/server/public/assets/{rotate-ccw-Ixkq1iUA.js → rotate-ccw-Dnn7gbPh.js} +1 -1
  316. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.br +0 -0
  317. package/payload/server/public/assets/rotate-ccw-Dnn7gbPh.js.gz +0 -0
  318. package/payload/server/public/assets/{routines-Cxjlmcp7.js → routines-N8NmxPOZ.js} +1 -1
  319. package/payload/server/public/assets/routines-N8NmxPOZ.js.br +0 -0
  320. package/payload/server/public/assets/routines-N8NmxPOZ.js.gz +0 -0
  321. package/payload/server/public/assets/{skills-DEo9hSVX.js → skills-B2CRgO-U.js} +1 -1
  322. package/payload/server/public/assets/skills-B2CRgO-U.js.br +0 -0
  323. package/payload/server/public/assets/skills-B2CRgO-U.js.gz +0 -0
  324. package/payload/server/public/assets/{tasks-BxApOIXI.js → tasks-8QLGtlSj.js} +1 -1
  325. package/payload/server/public/assets/tasks-8QLGtlSj.js.br +0 -0
  326. package/payload/server/public/assets/tasks-8QLGtlSj.js.gz +0 -0
  327. package/payload/server/public/assets/{triangle-alert-BYzMcXv8.js → triangle-alert-el772yUQ.js} +1 -1
  328. package/payload/server/public/assets/triangle-alert-el772yUQ.js.br +0 -0
  329. package/payload/server/public/assets/triangle-alert-el772yUQ.js.gz +0 -0
  330. package/payload/server/public/assets/{useCopyFeedback-Bk2HVcjy.js → useCopyFeedback-DfNAu8hQ.js} +1 -1
  331. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.br +0 -0
  332. package/payload/server/public/assets/useCopyFeedback-DfNAu8hQ.js.gz +0 -0
  333. package/payload/server/public/assets/{useMediaQuery-DEti-vAx.js → useMediaQuery-B469O83-.js} +1 -1
  334. package/payload/server/public/assets/useMediaQuery-B469O83-.js.br +0 -0
  335. package/payload/server/public/assets/{useMediaQuery-DEti-vAx.js.gz → useMediaQuery-B469O83-.js.gz} +0 -0
  336. package/payload/server/public/assets/{useVoiceRecorder-kQ92rL-f.js → useVoiceRecorder-Bb-51cJv.js} +1 -1
  337. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.br +0 -0
  338. package/payload/server/public/assets/useVoiceRecorder-Bb-51cJv.js.gz +0 -0
  339. package/payload/server/public/assets/{wrench-BhLkHffv.js → wrench-Ck4phkdB.js} +1 -1
  340. package/payload/server/public/assets/wrench-Ck4phkdB.js.br +0 -0
  341. package/payload/server/public/assets/wrench-Ck4phkdB.js.gz +0 -0
  342. package/payload/server/public/browser.html +5 -5
  343. package/payload/server/public/calendar.html +8 -8
  344. package/payload/server/public/chat.html +14 -14
  345. package/payload/server/public/data.html +12 -12
  346. package/payload/server/public/field.html +3 -3
  347. package/payload/server/public/graph.html +10 -10
  348. package/payload/server/public/index.html +14 -14
  349. package/payload/server/public/operator.html +15 -15
  350. package/payload/server/public/public.html +14 -14
  351. package/payload/server/public/routines.html +8 -8
  352. package/payload/server/public/skills.html +6 -6
  353. package/payload/server/public/tasks.html +7 -7
  354. package/payload/server/server.js +3114 -1371
  355. package/payload/server/public/assets/AdminLoginScreens-AnJZfgFz.js.br +0 -0
  356. package/payload/server/public/assets/AdminLoginScreens-AnJZfgFz.js.gz +0 -0
  357. package/payload/server/public/assets/AdminShell-CEVqyQqg.js.br +0 -0
  358. package/payload/server/public/assets/AdminShell-CEVqyQqg.js.gz +0 -0
  359. package/payload/server/public/assets/activity-czUaUl8I.js.br +0 -0
  360. package/payload/server/public/assets/activity-czUaUl8I.js.gz +0 -0
  361. package/payload/server/public/assets/admin-B0iRcfuk.js.br +0 -0
  362. package/payload/server/public/assets/admin-B0iRcfuk.js.gz +0 -0
  363. package/payload/server/public/assets/agents-BocONCeQ.js.br +0 -0
  364. package/payload/server/public/assets/agents-BocONCeQ.js.gz +0 -0
  365. package/payload/server/public/assets/browser-Cy-rJm3t.js.br +0 -0
  366. package/payload/server/public/assets/browser-Cy-rJm3t.js.gz +0 -0
  367. package/payload/server/public/assets/calendar-DUTKxWtd.js.br +0 -0
  368. package/payload/server/public/assets/calendar-DUTKxWtd.js.gz +0 -0
  369. package/payload/server/public/assets/chat-Cis7sHsZ.js +0 -1
  370. package/payload/server/public/assets/chat-Cis7sHsZ.js.br +0 -0
  371. package/payload/server/public/assets/chat-Cis7sHsZ.js.gz +0 -0
  372. package/payload/server/public/assets/chevron-left-Bhhx8j2r.js +0 -1
  373. package/payload/server/public/assets/chevron-left-Bhhx8j2r.js.br +0 -0
  374. package/payload/server/public/assets/clock-Ca3nx7Cc.js +0 -1
  375. package/payload/server/public/assets/clock-Ca3nx7Cc.js.br +0 -0
  376. package/payload/server/public/assets/clock-Ca3nx7Cc.js.gz +0 -0
  377. package/payload/server/public/assets/copy-DE9qmAs5.js.br +0 -0
  378. package/payload/server/public/assets/copy-DE9qmAs5.js.gz +0 -0
  379. package/payload/server/public/assets/data-CkaAEeP1.js +0 -1
  380. package/payload/server/public/assets/data-CkaAEeP1.js.br +0 -0
  381. package/payload/server/public/assets/data-CkaAEeP1.js.gz +0 -0
  382. package/payload/server/public/assets/field-DE2tEfTo.js.br +0 -0
  383. package/payload/server/public/assets/field-DE2tEfTo.js.gz +0 -0
  384. package/payload/server/public/assets/file-text-BHfL2gqo.js.br +0 -0
  385. package/payload/server/public/assets/file-text-BHfL2gqo.js.gz +0 -0
  386. package/payload/server/public/assets/graph-08S_BofN.js.br +0 -0
  387. package/payload/server/public/assets/graph-08S_BofN.js.gz +0 -0
  388. package/payload/server/public/assets/graph-labels-C640Er5R.js.br +0 -0
  389. package/payload/server/public/assets/graph-labels-C640Er5R.js.gz +0 -0
  390. package/payload/server/public/assets/jsx-runtime-FxjwOUbA.css.br +0 -0
  391. package/payload/server/public/assets/operator-DH5Kw3fL.js.br +0 -0
  392. package/payload/server/public/assets/operator-DH5Kw3fL.js.gz +0 -0
  393. package/payload/server/public/assets/page-BDpa4HWT.js.br +0 -0
  394. package/payload/server/public/assets/page-BDpa4HWT.js.gz +0 -0
  395. package/payload/server/public/assets/page-yn7ivq8O.js.br +0 -0
  396. package/payload/server/public/assets/page-yn7ivq8O.js.gz +0 -0
  397. package/payload/server/public/assets/play-CMN7ht-S.js +0 -1
  398. package/payload/server/public/assets/play-CMN7ht-S.js.br +0 -0
  399. package/payload/server/public/assets/play-CMN7ht-S.js.gz +0 -0
  400. package/payload/server/public/assets/public-D_qjqet7.js.br +0 -0
  401. package/payload/server/public/assets/public-D_qjqet7.js.gz +0 -0
  402. package/payload/server/public/assets/rotate-ccw-Ixkq1iUA.js.br +0 -0
  403. package/payload/server/public/assets/rotate-ccw-Ixkq1iUA.js.gz +0 -0
  404. package/payload/server/public/assets/routines-Cxjlmcp7.js.br +0 -0
  405. package/payload/server/public/assets/routines-Cxjlmcp7.js.gz +0 -0
  406. package/payload/server/public/assets/skills-DEo9hSVX.js.br +0 -0
  407. package/payload/server/public/assets/skills-DEo9hSVX.js.gz +0 -0
  408. package/payload/server/public/assets/tasks-BxApOIXI.js.br +0 -0
  409. package/payload/server/public/assets/tasks-BxApOIXI.js.gz +0 -0
  410. package/payload/server/public/assets/triangle-alert-BYzMcXv8.js.br +0 -0
  411. package/payload/server/public/assets/triangle-alert-BYzMcXv8.js.gz +0 -0
  412. package/payload/server/public/assets/useCopyFeedback-Bk2HVcjy.js.br +0 -0
  413. package/payload/server/public/assets/useCopyFeedback-Bk2HVcjy.js.gz +0 -0
  414. package/payload/server/public/assets/useMediaQuery-DEti-vAx.js.br +0 -0
  415. package/payload/server/public/assets/useVoiceRecorder-kQ92rL-f.js.br +0 -0
  416. package/payload/server/public/assets/useVoiceRecorder-kQ92rL-f.js.gz +0 -0
  417. package/payload/server/public/assets/wrench-BhLkHffv.js.br +0 -0
  418. package/payload/server/public/assets/wrench-BhLkHffv.js.gz +0 -0
  419. /package/payload/server/public/assets/{jsx-runtime-BL3pljPe.js → jsx-runtime-BmNepPEn.js} +0 -0
  420. /package/payload/server/public/assets/{jsx-runtime-BL3pljPe.js.br → jsx-runtime-BmNepPEn.js.br} +0 -0
  421. /package/payload/server/public/assets/{jsx-runtime-BL3pljPe.js.gz → jsx-runtime-BmNepPEn.js.gz} +0 -0
@@ -0,0 +1,326 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { telegramBotProvision, PROVISION_METHOD } from "../tools/bot-provision.js";
6
+ import { BOT_PROVISION_SHAPE } from "../tools/schemas.js";
7
+ /** A live-looking token, so the credential assertions have something real to
8
+ * search for. Its shape matches the regex the device check greps logs with. */
9
+ const MANAGING_TOKEN = "111:AAEkQTaWxLmNoZXJyeXBpY2tzb21lc2VjcmV0MDA";
10
+ const NEW_TOKEN = "999:AAHrotatedTOKENvalueTHATmustNEVERleak0000";
11
+ function stubAccount(bots = [{ id: "111", token: MANAGING_TOKEN, role: "admin", adminUsers: [42] }]) {
12
+ const brand = mkdtempSync(join(tmpdir(), "prov-"));
13
+ const platformRoot = join(brand, "platform");
14
+ const accountDir = join(brand, "data", "accounts", "acct-1");
15
+ mkdirSync(platformRoot, { recursive: true });
16
+ mkdirSync(accountDir, { recursive: true });
17
+ writeFileSync(join(accountDir, "account.json"), JSON.stringify({ accountId: "acct-1", telegram: { bots } }));
18
+ return { platformRoot, accountDir };
19
+ }
20
+ function deps(platformRoot, lines = [], calls = [], responses = {}) {
21
+ const fetchImpl = (async (url, init) => {
22
+ const u = String(url);
23
+ const method = u.slice(u.lastIndexOf("/") + 1);
24
+ calls.push({ method, body: init?.body ? JSON.parse(String(init.body)) : {} });
25
+ if (method in responses)
26
+ return { json: async () => responses[method] };
27
+ if (method === "getMe") {
28
+ return { json: async () => ({ ok: true, result: { username: "adminbot", can_manage_bots: true } }) };
29
+ }
30
+ return { json: async () => ({ ok: true, result: true }) };
31
+ });
32
+ return {
33
+ platformRoot,
34
+ accountId: "acct-1",
35
+ log: (l) => lines.push(l),
36
+ fetchImpl,
37
+ requestIdGen: () => 4242,
38
+ secretPathFor: (botId) => join(platformRoot, "secrets", botId),
39
+ };
40
+ }
41
+ describe("telegram-bot-provision — authorisation", () => {
42
+ // The gate, and it runs BEFORE any Telegram call: a refusal that happens after
43
+ // a token fetch has already moved a credential.
44
+ it("refuses a public entry, naming the reason, with no Telegram call made", async () => {
45
+ const { platformRoot } = stubAccount([
46
+ { id: "222", token: "222:B", role: "public", agent: "beagle" },
47
+ ]);
48
+ const calls = [];
49
+ const lines = [];
50
+ const r = await telegramBotProvision({ botId: "222", action: "offer", chatId: 55 }, deps(platformRoot, lines, calls));
51
+ expect(r.isError).toBe(true);
52
+ expect(calls).toHaveLength(0);
53
+ expect(lines.join("\n")).toContain("reason=public-entry-no-provision");
54
+ });
55
+ it("refuses an unbound entry too", async () => {
56
+ const { platformRoot } = stubAccount([{ id: "333", token: "333:C", role: "unbound" }]);
57
+ const calls = [];
58
+ const r = await telegramBotProvision({ botId: "333", action: "rotate", managedBotId: "999" }, deps(platformRoot, [], calls));
59
+ expect(r.isError).toBe(true);
60
+ expect(calls).toHaveLength(0);
61
+ });
62
+ it("refuses a bot id this account does not hold", async () => {
63
+ const { platformRoot } = stubAccount();
64
+ const r = await telegramBotProvision({ botId: "777", action: "list" }, deps(platformRoot));
65
+ // `list` needs no bot, so it succeeds; the unknown-bot refusal is on the
66
+ // actions that act as a bot.
67
+ expect(r.isError).toBe(false);
68
+ const r2 = await telegramBotProvision({ botId: "777", action: "offer", chatId: 5 }, deps(platformRoot));
69
+ expect(r2.isError).toBe(true);
70
+ expect(r2.text).toContain("777");
71
+ });
72
+ });
73
+ describe("telegram-bot-provision — offer", () => {
74
+ it("refuses before sending when the managing bot cannot manage bots", async () => {
75
+ const { platformRoot } = stubAccount();
76
+ const calls = [];
77
+ const lines = [];
78
+ const r = await telegramBotProvision({ botId: "111", action: "offer", chatId: 55 }, deps(platformRoot, lines, calls, {
79
+ getMe: { ok: true, result: { username: "adminbot", can_manage_bots: false } },
80
+ }));
81
+ expect(r.isError).toBe(true);
82
+ expect(r.text).toContain("@BotFather");
83
+ expect(calls.map((c) => c.method)).toEqual(["getMe"]);
84
+ expect(lines.join("\n")).toContain("reason=management-not-enabled");
85
+ });
86
+ it("sends a REPLY keyboard carrying request_managed_bot with the generated id", async () => {
87
+ const { platformRoot } = stubAccount();
88
+ const calls = [];
89
+ const lines = [];
90
+ const r = await telegramBotProvision({
91
+ botId: "111",
92
+ action: "offer",
93
+ chatId: 55,
94
+ suggestedName: "Front Desk",
95
+ suggestedUsername: "frontdesk_bot",
96
+ }, deps(platformRoot, lines, calls));
97
+ expect(r.isError).toBe(false);
98
+ const send = calls.find((c) => c.method === "sendMessage");
99
+ const markup = JSON.parse(String(send?.body.reply_markup));
100
+ expect(markup).not.toHaveProperty("inline_keyboard");
101
+ expect(markup.keyboard[0][0].request_managed_bot).toEqual({
102
+ request_id: 4242,
103
+ suggested_name: "Front Desk",
104
+ suggested_username: "frontdesk_bot",
105
+ });
106
+ expect(lines.join("\n")).toContain("op=provision-offer botId=111 chatId=55 requestId=4242 suggestedUsername=frontdesk_bot");
107
+ });
108
+ it("needs a chatId, because the button works in private chats only", async () => {
109
+ const { platformRoot } = stubAccount();
110
+ const calls = [];
111
+ const r = await telegramBotProvision({ botId: "111", action: "offer" }, deps(platformRoot, [], calls));
112
+ expect(r.isError).toBe(true);
113
+ expect(calls).toHaveLength(0);
114
+ });
115
+ });
116
+ describe("telegram-bot-provision — rotate", () => {
117
+ const withManaged = () => stubAccount([
118
+ { id: "111", token: MANAGING_TOKEN, role: "admin", adminUsers: [42] },
119
+ { id: "999", token: "999:OLD", role: "unbound", managed: true },
120
+ ]);
121
+ it("reads the registered URL first, then rotates, persists and re-registers at that URL", async () => {
122
+ const { platformRoot, accountDir } = withManaged();
123
+ const calls = [];
124
+ const lines = [];
125
+ const r = await telegramBotProvision({ botId: "111", action: "rotate", managedBotId: "999" }, deps(platformRoot, lines, calls, {
126
+ getWebhookInfo: { result: { url: "https://x/api/telegram/?bot=999", pending_update_count: 0 } },
127
+ replaceManagedBotToken: { ok: true, result: NEW_TOKEN },
128
+ }));
129
+ expect(r.isError).toBe(false);
130
+ expect(calls.map((c) => c.method)).toEqual([
131
+ "getWebhookInfo",
132
+ "replaceManagedBotToken",
133
+ "setWebhook",
134
+ ]);
135
+ expect(calls[2]?.body.url).toBe("https://x/api/telegram/?bot=999");
136
+ const saved = JSON.parse(readFileSync(join(accountDir, "account.json"), "utf-8"));
137
+ const rotated = saved.telegram.bots.find((b) => b.id === "999");
138
+ expect(rotated.token).toBe(NEW_TOKEN);
139
+ // A rotation replaces a credential; it does not re-bind a bot.
140
+ expect(rotated.role).toBe("unbound");
141
+ expect(rotated.managed).toBe(true);
142
+ expect(lines.join("\n")).toContain("op=provision-register");
143
+ });
144
+ // A rotation changes ONE field. The registry row `listRegisteredBots` returns
145
+ // is `{ id, role, agent }`, and spreading that into the writer would silently
146
+ // drop adminUsers, dmPolicy, allowFrom and managed — replacing a token would
147
+ // quietly un-admit every admin on the bot, with nothing saying so.
148
+ it("carries every other field through untouched", async () => {
149
+ const { platformRoot, accountDir } = stubAccount([
150
+ { id: "111", token: MANAGING_TOKEN, role: "admin", adminUsers: [42] },
151
+ {
152
+ id: "999",
153
+ token: "999:OLD",
154
+ role: "public",
155
+ agent: "beagle",
156
+ dmPolicy: "allowlist",
157
+ allowFrom: [7, 8],
158
+ managed: true,
159
+ },
160
+ ]);
161
+ await telegramBotProvision({ botId: "111", action: "rotate", managedBotId: "999" }, deps(platformRoot, [], [], {
162
+ getWebhookInfo: { result: { url: "https://x/api/telegram/?bot=999", pending_update_count: 0 } },
163
+ replaceManagedBotToken: { ok: true, result: NEW_TOKEN },
164
+ }));
165
+ const saved = JSON.parse(readFileSync(join(accountDir, "account.json"), "utf-8"));
166
+ expect(saved.telegram.bots.find((b) => b.id === "999")).toEqual({
167
+ id: "999",
168
+ token: NEW_TOKEN,
169
+ role: "public",
170
+ agent: "beagle",
171
+ dmPolicy: "allowlist",
172
+ allowFrom: [7, 8],
173
+ managed: true,
174
+ });
175
+ // And the OTHER bot is untouched, Task 2368's invariant.
176
+ expect(saved.telegram.bots.find((b) => b.id === "111")).toEqual({
177
+ id: "111",
178
+ token: MANAGING_TOKEN,
179
+ role: "admin",
180
+ adminUsers: [42],
181
+ });
182
+ });
183
+ it("revokes nothing when the bot has no webhook to restore", async () => {
184
+ const { platformRoot } = withManaged();
185
+ const calls = [];
186
+ const r = await telegramBotProvision({ botId: "111", action: "rotate", managedBotId: "999" }, deps(platformRoot, [], calls, {
187
+ getWebhookInfo: { result: { url: "", pending_update_count: 0 } },
188
+ }));
189
+ expect(r.isError).toBe(true);
190
+ expect(calls.map((c) => c.method)).toEqual(["getWebhookInfo"]);
191
+ });
192
+ it("refuses a managedBotId this account does not hold", async () => {
193
+ const { platformRoot } = withManaged();
194
+ const calls = [];
195
+ const r = await telegramBotProvision({ botId: "111", action: "rotate", managedBotId: "555" }, deps(platformRoot, [], calls));
196
+ expect(r.isError).toBe(true);
197
+ expect(calls).toHaveLength(0);
198
+ });
199
+ });
200
+ describe("telegram-bot-provision — access", () => {
201
+ it("reads the settings when isAccessRestricted is omitted", async () => {
202
+ const { platformRoot } = stubAccount();
203
+ const calls = [];
204
+ const r = await telegramBotProvision({ botId: "111", action: "access", managedBotId: "999" }, deps(platformRoot, [], calls, {
205
+ getManagedBotAccessSettings: {
206
+ ok: true,
207
+ result: { is_access_restricted: true, added_users: [{ id: 7 }] },
208
+ },
209
+ }));
210
+ expect(calls.map((c) => c.method)).toEqual(["getManagedBotAccessSettings"]);
211
+ expect(r.text).toContain("restricted");
212
+ expect(r.text).toContain("7");
213
+ });
214
+ it("writes the settings when it is given", async () => {
215
+ const { platformRoot } = stubAccount();
216
+ const calls = [];
217
+ await telegramBotProvision({ botId: "111", action: "access", managedBotId: "999", isAccessRestricted: true, addedUserIds: [7, 8] }, deps(platformRoot, [], calls));
218
+ expect(calls[0]?.method).toBe("setManagedBotAccessSettings");
219
+ expect(calls[0]?.body).toEqual({
220
+ user_id: 999,
221
+ is_access_restricted: true,
222
+ added_user_ids: [7, 8],
223
+ });
224
+ });
225
+ it("names the ten-id cap rather than letting Telegram refuse opaquely", async () => {
226
+ const { platformRoot } = stubAccount();
227
+ const calls = [];
228
+ const r = await telegramBotProvision({
229
+ botId: "111",
230
+ action: "access",
231
+ managedBotId: "999",
232
+ isAccessRestricted: true,
233
+ addedUserIds: Array.from({ length: 11 }, (_, i) => i + 1),
234
+ }, deps(platformRoot, [], calls));
235
+ expect(r.isError).toBe(true);
236
+ expect(r.text).toContain("10");
237
+ expect(calls).toHaveLength(0);
238
+ });
239
+ it("says plainly when a bot is open to anyone", async () => {
240
+ const { platformRoot } = stubAccount();
241
+ const r = await telegramBotProvision({ botId: "111", action: "access", managedBotId: "999" }, deps(platformRoot, [], [], {
242
+ getManagedBotAccessSettings: { ok: true, result: { is_access_restricted: false } },
243
+ }));
244
+ expect(r.text).toContain("OPEN");
245
+ });
246
+ });
247
+ describe("telegram-bot-provision — list", () => {
248
+ it("reports ids and roles", async () => {
249
+ const { platformRoot } = stubAccount([
250
+ { id: "111", token: MANAGING_TOKEN, role: "admin" },
251
+ { id: "999", token: "999:C", role: "unbound", managed: true },
252
+ ]);
253
+ const r = await telegramBotProvision({ botId: "111", action: "list" }, deps(platformRoot));
254
+ expect(r.text).toContain("111 role=admin");
255
+ expect(r.text).toContain("999 role=unbound");
256
+ });
257
+ it("says so when the account holds none", async () => {
258
+ const { platformRoot } = stubAccount([]);
259
+ const r = await telegramBotProvision({ botId: "111", action: "list" }, deps(platformRoot));
260
+ expect(r.text).toContain("No Telegram bots");
261
+ });
262
+ });
263
+ /**
264
+ * THE credential mutation test.
265
+ *
266
+ * Task 2618's whole point is that a bot token reaches account.json and nothing
267
+ * else. A tool result is transcript; a log line is a file the operator greps and
268
+ * pastes. Make any return value or any log line carry a token and this fails.
269
+ *
270
+ * It sweeps every action rather than asserting on one, because the failure this
271
+ * guards against is a helpful `text:` added later to whichever action someone is
272
+ * editing at the time.
273
+ */
274
+ describe("telegram-bot-provision — no token in any return value or log line", () => {
275
+ const TOKEN_SHAPE = /\d{3,10}:[A-Za-z0-9_-]{20,}/;
276
+ it("keeps every token out of both surfaces, across every action", async () => {
277
+ const { platformRoot } = stubAccount([
278
+ { id: "111", token: MANAGING_TOKEN, role: "admin", adminUsers: [42] },
279
+ { id: "999", token: "999:OLDoldOLDoldOLDoldOLDoldOLDold00", role: "unbound", managed: true },
280
+ ]);
281
+ const lines = [];
282
+ const responses = {
283
+ getWebhookInfo: { result: { url: "https://x/api/telegram/?bot=999", pending_update_count: 0 } },
284
+ replaceManagedBotToken: { ok: true, result: NEW_TOKEN },
285
+ getManagedBotAccessSettings: { ok: true, result: { is_access_restricted: true } },
286
+ };
287
+ const results = [];
288
+ for (const params of [
289
+ { botId: "111", action: "list" },
290
+ { botId: "111", action: "offer", chatId: 55 },
291
+ { botId: "111", action: "rotate", managedBotId: "999" },
292
+ { botId: "111", action: "access", managedBotId: "999" },
293
+ { botId: "111", action: "access", managedBotId: "999", isAccessRestricted: true },
294
+ ]) {
295
+ results.push((await telegramBotProvision(params, deps(platformRoot, lines, [], responses))).text);
296
+ }
297
+ expect(results.join("\n")).not.toMatch(TOKEN_SHAPE);
298
+ expect(lines.join("\n")).not.toMatch(TOKEN_SHAPE);
299
+ // The sweep proves nothing if the actions never ran.
300
+ expect(lines.join("\n")).toContain("op=provision-offer");
301
+ expect(lines.join("\n")).toContain("op=provision-register");
302
+ });
303
+ });
304
+ describe("PROVISION_METHOD", () => {
305
+ it("names the four Bot API methods, so the census and this tool cannot disagree", () => {
306
+ expect(Object.values(PROVISION_METHOD).sort()).toEqual([
307
+ "getManagedBotAccessSettings",
308
+ "getManagedBotToken",
309
+ "replaceManagedBotToken",
310
+ "setManagedBotAccessSettings",
311
+ ]);
312
+ });
313
+ });
314
+ describe("BOT_PROVISION_SHAPE", () => {
315
+ // A schema that accepted a raw token would put one in the transcript on the
316
+ // way in, which is the same failure the api-guard refusals close on the way out.
317
+ it("has no field that takes a token", () => {
318
+ expect(Object.keys(BOT_PROVISION_SHAPE).some((k) => /token/i.test(k))).toBe(false);
319
+ });
320
+ it("names all four actions", () => {
321
+ const parsed = BOT_PROVISION_SHAPE.action.safeParse("rotate");
322
+ expect(parsed.success).toBe(true);
323
+ expect(BOT_PROVISION_SHAPE.action.safeParse("delete").success).toBe(false);
324
+ });
325
+ });
326
+ //# sourceMappingURL=bot-provision-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-provision-tool.test.js","sourceRoot":"","sources":["../../src/__tests__/bot-provision-tool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=card-business.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-business.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/card-business.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Task 2615 — `telegram-card` into a connected business account's chat.
3
+ *
4
+ * Two properties. The connection id is resolved from the store rather than
5
+ * demanded of the caller, for the reason Task 2611 gave `telegram-ask`: the
6
+ * identifier exists only inside a connection Telegram announces once, so telling
7
+ * the model a parameter is missing would name something it cannot obtain. And
8
+ * the 24-hour window is decided BEFORE the network call, because Telegram emits
9
+ * nothing when a window closes and a refusal after the fetch would be
10
+ * indistinguishable from a send that merely failed.
11
+ *
12
+ * The block at the end is the regression that matters: a card into an ORDINARY
13
+ * chat must build a byte-identical body to the one it built before this task.
14
+ */
15
+ import { describe, expect, it, beforeEach, afterEach } from "vitest";
16
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
17
+ import { tmpdir } from "node:os";
18
+ import { join } from "node:path";
19
+ import { telegramCard } from "../tools/card.js";
20
+ const ACC = "acc-1";
21
+ const BOT = "111";
22
+ const STORED = "STOREDbc0987654321";
23
+ const CUSTOMER = 12345;
24
+ let platformRoot;
25
+ let brandRoot;
26
+ let storeRoot;
27
+ let accountDir;
28
+ let lines;
29
+ beforeEach(() => {
30
+ brandRoot = mkdtempSync(join(tmpdir(), "brand-biz-window-"));
31
+ mkdirSync(join(brandRoot, "platform"), { recursive: true });
32
+ // Task 2644 — the conversation store is under the brand CONFIG dir, a
33
+ // different directory from the install root that holds `data/accounts`.
34
+ // Seeding both in one place is what hid the plugin reading a root nothing
35
+ // writes.
36
+ storeRoot = mkdtempSync(join(tmpdir(), "config-biz-window-"));
37
+ process.env.MAXY_DIR_OVERRIDE = storeRoot;
38
+ accountDir = join(brandRoot, "data", "accounts", ACC);
39
+ mkdirSync(accountDir, { recursive: true });
40
+ writeFileSync(join(accountDir, "account.json"), JSON.stringify({ telegram: { bots: [{ id: BOT, role: "admin", token: `${BOT}:SECRET` }] } }), "utf-8");
41
+ platformRoot = join(brandRoot, "platform");
42
+ lines = [];
43
+ });
44
+ afterEach(() => {
45
+ delete process.env.MAXY_DIR_OVERRIDE;
46
+ rmSync(storeRoot, { recursive: true, force: true });
47
+ });
48
+ function storeConnection(id = STORED) {
49
+ writeFileSync(join(accountDir, "telegram-business-connection.json"), JSON.stringify({
50
+ [BOT]: {
51
+ id,
52
+ userId: 1311221864,
53
+ userChatId: 1311221864,
54
+ date: 1786567400,
55
+ isEnabled: true,
56
+ rights: { can_reply: true },
57
+ at: 1786567451000,
58
+ },
59
+ }), "utf-8");
60
+ }
61
+ /** One inbound row in the business conversation, so the window has something to
62
+ * measure from. `telegramDate` is Telegram's second, which is what the window
63
+ * reads; `dateSent` is ours, and the two are deliberately different values here
64
+ * so a reader of this test cannot confuse them. */
65
+ function storeInbound(telegramDate, chatId = CUSTOMER) {
66
+ const dir = join(storeRoot, "data", "telegram-messages", ACC);
67
+ mkdirSync(dir, { recursive: true });
68
+ writeFileSync(join(dir, `${BOT}_biz_${chatId}.jsonl`), JSON.stringify({
69
+ messageId: `telegram:${ACC}:${BOT}:biz:${chatId}:in:77`,
70
+ sessionId: "s",
71
+ dateSent: "2026-08-09T09:00:00.000Z",
72
+ body: "do you deliver?",
73
+ fromMe: false,
74
+ senderId: String(chatId),
75
+ senderName: "Customer",
76
+ telegramDate,
77
+ chatId: String(chatId),
78
+ channelKey: `${BOT}:biz:${chatId}`,
79
+ scope: "public",
80
+ origin: "inbound",
81
+ createdAt: "2026-08-09T09:00:00.000Z",
82
+ }) + "\n", "utf-8");
83
+ }
84
+ function recorder(reply) {
85
+ const calls = [];
86
+ const fetchImpl = (async (url, init) => {
87
+ calls.push({
88
+ method: String(url).split("/").pop() ?? "",
89
+ body: JSON.parse(String(init.body)),
90
+ });
91
+ return new Response(JSON.stringify(reply));
92
+ });
93
+ return { calls, fetchImpl };
94
+ }
95
+ const deps = (fetchImpl) => ({
96
+ platformRoot,
97
+ accountId: ACC,
98
+ callId: "cafe",
99
+ log: (l) => lines.push(l),
100
+ fetchImpl,
101
+ });
102
+ const nowS = () => Math.floor(Date.now() / 1000);
103
+ describe("Task 2615 — telegram-card into a business chat", () => {
104
+ it("passes business_connection_id when the caller supplies one", async () => {
105
+ storeConnection();
106
+ storeInbound(nowS());
107
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
108
+ await telegramCard({
109
+ botId: BOT,
110
+ chatId: CUSTOMER,
111
+ text: "we deliver Tuesdays",
112
+ businessConnectionId: STORED,
113
+ }, deps(fetchImpl));
114
+ expect(calls[0].body.business_connection_id).toBe(STORED);
115
+ });
116
+ it("defaults it from the stored record when the caller omits it", async () => {
117
+ storeConnection();
118
+ storeInbound(nowS());
119
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
120
+ await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "hello" }, deps(fetchImpl));
121
+ expect(calls[0].body.business_connection_id).toBe(STORED);
122
+ });
123
+ it("logs the resolution naming the source, never the identifier", async () => {
124
+ storeConnection();
125
+ storeInbound(nowS());
126
+ const { fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
127
+ await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "hello" }, deps(fetchImpl));
128
+ expect(lines.some((l) => l.includes("op=business-connection-resolved") && l.includes("source=store"))).toBe(true);
129
+ expect(lines.join("\n")).not.toContain(STORED);
130
+ });
131
+ it("refuses a card past the 24-hour window before any fetch", async () => {
132
+ storeConnection();
133
+ storeInbound(nowS() - 90_000);
134
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
135
+ const res = await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "too late" }, deps(fetchImpl));
136
+ expect(res.ok).toBe(false);
137
+ expect(res.outcome).toBe("none");
138
+ expect(res.text).toContain("24 hours");
139
+ expect(calls).toHaveLength(0);
140
+ });
141
+ it("logs the window verdict on an allowed send too", async () => {
142
+ // A line only on refusal could not tell a healthy window from a check that
143
+ // stopped running.
144
+ storeConnection();
145
+ storeInbound(nowS());
146
+ const { fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
147
+ await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "hello" }, deps(fetchImpl));
148
+ expect(lines.some((l) => l.includes("op=business-window") && l.includes("allowed=yes"))).toBe(true);
149
+ });
150
+ it("passes it on editMessageText too, not only sendMessage", async () => {
151
+ // `body` is built from `common` on both branches, so this holds by
152
+ // construction rather than by a second spread that could be forgotten.
153
+ storeConnection();
154
+ storeInbound(nowS());
155
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
156
+ await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "v1", key: "k" }, deps(fetchImpl));
157
+ await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "v2", key: "k" }, deps(fetchImpl));
158
+ expect(calls[1].method).toBe("editMessageText");
159
+ expect(calls[1].body).toMatchObject({ message_id: 5, business_connection_id: STORED });
160
+ });
161
+ it("sends normally when a connection is stored but the chat is not a business chat", async () => {
162
+ // The store lookup is keyed on the business channel key, so an ordinary chat
163
+ // finds no inbound and the whole block is inert.
164
+ storeConnection();
165
+ storeInbound(nowS(), CUSTOMER);
166
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
167
+ await telegramCard({ botId: BOT, chatId: 99999, text: "hello" }, deps(fetchImpl));
168
+ expect("business_connection_id" in calls[0].body).toBe(false);
169
+ });
170
+ it("builds a byte-identical body for an ordinary card with no connection stored", async () => {
171
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
172
+ await telegramCard({ botId: BOT, chatId: 99999, text: "hello" }, deps(fetchImpl));
173
+ expect(calls[0].body).toEqual({ chat_id: 99999, text: "hello", parse_mode: "HTML" });
174
+ });
175
+ it("does not resolve a connection for a business chat when none is stored", async () => {
176
+ storeInbound(nowS());
177
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
178
+ await telegramCard({ botId: BOT, chatId: CUSTOMER, text: "hello" }, deps(fetchImpl));
179
+ expect("business_connection_id" in calls[0].body).toBe(false);
180
+ // And no window refusal either: with no connection this is an ordinary send.
181
+ expect(calls).toHaveLength(1);
182
+ });
183
+ });
184
+ //# sourceMappingURL=card-business.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-business.test.js","sourceRoot":"","sources":["../../src/__tests__/card-business.test.ts"],"names":[],"mappings":"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"}