@rubytech/create-maxy-code 0.1.579 → 0.1.580

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/telegram-media/dist/index.d.ts +45 -0
  3. package/payload/platform/lib/telegram-media/dist/index.d.ts.map +1 -0
  4. package/payload/platform/lib/telegram-media/dist/index.js +89 -0
  5. package/payload/platform/lib/telegram-media/dist/index.js.map +1 -0
  6. package/payload/platform/lib/telegram-media/src/__tests__/telegram-media.test.ts +104 -0
  7. package/payload/platform/lib/telegram-media/src/index.ts +102 -0
  8. package/payload/platform/lib/telegram-media/tsconfig.json +9 -0
  9. package/payload/platform/lib/telegram-media/vitest.config.ts +9 -0
  10. package/payload/platform/package.json +2 -2
  11. package/payload/platform/plugins/admin/PLUGIN.md +2 -2
  12. package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +22 -0
  13. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +34 -0
  14. package/payload/platform/plugins/admin/hooks/__tests__/quote-path-write-gate.test.sh +25 -0
  15. package/payload/platform/plugins/admin/hooks/archive-ingest-surface-gate.sh +11 -4
  16. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +2 -2
  17. package/payload/platform/plugins/admin/hooks/quote-path-write-gate.sh +6 -3
  18. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
  19. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-schema-shape.test.ts +23 -0
  20. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visit-status-write.test.ts +175 -3
  21. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +101 -0
  22. package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +35 -1
  23. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visit-status.ts +73 -8
  24. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +59 -8
  25. package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
  26. package/payload/platform/plugins/telegram/PLUGIN.md +23 -3
  27. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +99 -1
  28. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js.map +1 -1
  29. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts +2 -0
  30. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts.map +1 -0
  31. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +226 -0
  32. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -0
  33. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts +2 -0
  34. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts.map +1 -0
  35. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js +143 -0
  36. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js.map +1 -0
  37. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts +2 -0
  38. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts.map +1 -0
  39. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +197 -0
  40. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -0
  41. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts +2 -0
  42. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts.map +1 -0
  43. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js +196 -0
  44. package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js.map +1 -0
  45. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts +2 -0
  46. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts.map +1 -0
  47. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js +95 -0
  48. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js.map +1 -0
  49. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts +2 -0
  50. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts.map +1 -0
  51. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js +293 -0
  52. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js.map +1 -0
  53. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts +2 -0
  54. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts.map +1 -0
  55. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js +130 -0
  56. package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js.map +1 -0
  57. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts +2 -0
  58. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts.map +1 -0
  59. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +119 -0
  60. package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -0
  61. package/payload/platform/plugins/telegram/mcp/dist/index.js +71 -66
  62. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  63. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +15 -0
  64. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  65. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +27 -10
  66. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  67. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts +34 -0
  68. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
  69. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +106 -0
  70. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
  71. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts +41 -0
  72. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts.map +1 -0
  73. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js +120 -0
  74. package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js.map +1 -0
  75. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts +73 -0
  76. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -0
  77. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +270 -0
  78. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -0
  79. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +34 -0
  80. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -0
  81. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +134 -0
  82. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -0
  83. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts +70 -0
  84. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -0
  85. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +232 -0
  86. package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -0
  87. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts +42 -0
  88. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts.map +1 -0
  89. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js +92 -0
  90. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js.map +1 -0
  91. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts +76 -0
  92. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -0
  93. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +288 -0
  94. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -0
  95. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +250 -0
  96. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -0
  97. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +400 -0
  98. package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -0
  99. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts +38 -0
  100. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -0
  101. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +120 -0
  102. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -0
  103. package/payload/platform/plugins/telegram/mcp/vitest.config.ts +14 -0
  104. package/payload/platform/plugins/telegram/skills/build/SKILL.md +161 -21
  105. package/payload/platform/scripts/__tests__/hook-matcher-dispatch.test.sh +163 -0
  106. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  107. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +6 -1
  108. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  109. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  110. package/payload/server/public/activity.html +6 -6
  111. package/payload/server/public/agents.html +5 -5
  112. package/payload/server/public/assets/{AdminLoginScreens-Bus-Y-rG.js → AdminLoginScreens-Dxv5t1YY.js} +1 -1
  113. package/payload/server/public/assets/AdminLoginScreens-Dxv5t1YY.js.br +0 -0
  114. package/payload/server/public/assets/AdminLoginScreens-Dxv5t1YY.js.gz +0 -0
  115. package/payload/server/public/assets/{AdminShell-Bsm7q3CW.js → AdminShell-BMslfZxN.js} +1 -1
  116. package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
  117. package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
  118. package/payload/server/public/assets/{activity-BWqrCyYM.js → activity-kQ3w70LJ.js} +1 -1
  119. package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
  120. package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
  121. package/payload/server/public/assets/{admin-zly7Y6EZ.js → admin-DapcMKCG.js} +1 -1
  122. package/payload/server/public/assets/admin-DapcMKCG.js.br +0 -0
  123. package/payload/server/public/assets/admin-DapcMKCG.js.gz +0 -0
  124. package/payload/server/public/assets/{agents-BsxGD1V1.js → agents-Cn_bZgnD.js} +1 -1
  125. package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
  126. package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
  127. package/payload/server/public/assets/{browser-CRLxTaw2.js → browser-BE-GDk5-.js} +1 -1
  128. package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
  129. package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
  130. package/payload/server/public/assets/{calendar-Bmp6qI_P.js → calendar-Di7BEHHN.js} +1 -1
  131. package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
  132. package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
  133. package/payload/server/public/assets/chat-DLmikhie.js +1 -0
  134. package/payload/server/public/assets/chat-DLmikhie.js.br +1 -0
  135. package/payload/server/public/assets/chat-DLmikhie.js.gz +0 -0
  136. package/payload/server/public/assets/chevron-left-Id9VAZAz.js +1 -0
  137. package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
  138. package/payload/server/public/assets/clock-DKpWWJbJ.js +1 -0
  139. package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
  140. package/payload/server/public/assets/{copy-Bcjpxqzn.js → copy-nkxspu2J.js} +1 -1
  141. package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
  142. package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
  143. package/payload/server/public/assets/data-C1_m9Xyf.js +1 -0
  144. package/payload/server/public/assets/data-C1_m9Xyf.js.br +0 -0
  145. package/payload/server/public/assets/data-C1_m9Xyf.js.gz +0 -0
  146. package/payload/server/public/assets/{field-ChKB2l_d.js → field-2rIXxGMt.js} +1 -1
  147. package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
  148. package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
  149. package/payload/server/public/assets/{file-text-COZcf7mU.js → file-text-CdSqrscg.js} +1 -1
  150. package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
  151. package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
  152. package/payload/server/public/assets/{graph-nnV47iqM.js → graph-BfBHHXaC.js} +1 -1
  153. package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
  154. package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
  155. package/payload/server/public/assets/{graph-labels-x-1MT-3c.js → graph-labels-CHW2aBke.js} +1 -1
  156. package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
  157. package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
  158. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css +1 -0
  159. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
  160. package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.gz +0 -0
  161. package/payload/server/public/assets/{operator-BAO0-mjU.js → operator-BOiL8sxx.js} +1 -1
  162. package/payload/server/public/assets/operator-BOiL8sxx.js.br +0 -0
  163. package/payload/server/public/assets/operator-BOiL8sxx.js.gz +0 -0
  164. package/payload/server/public/assets/page-CZ6tyH8t.js +1 -0
  165. package/payload/server/public/assets/page-CZ6tyH8t.js.br +0 -0
  166. package/payload/server/public/assets/page-CZ6tyH8t.js.gz +0 -0
  167. package/payload/server/public/assets/{page-B-F08pod.js → page-Cd36Y0h6.js} +1 -1
  168. package/payload/server/public/assets/page-Cd36Y0h6.js.br +0 -0
  169. package/payload/server/public/assets/page-Cd36Y0h6.js.gz +0 -0
  170. package/payload/server/public/assets/play-7LTxCuLX.js +1 -0
  171. package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
  172. package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
  173. package/payload/server/public/assets/{public-_HJsUohA.js → public-CVBav4FQ.js} +1 -1
  174. package/payload/server/public/assets/public-CVBav4FQ.js.br +0 -0
  175. package/payload/server/public/assets/public-CVBav4FQ.js.gz +0 -0
  176. package/payload/server/public/assets/{rotate-ccw-DJeAnYLQ.js → rotate-ccw-J9f-GWjm.js} +1 -1
  177. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
  178. package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
  179. package/payload/server/public/assets/{routines-CoIVXRCB.js → routines-C1AB-3FR.js} +1 -1
  180. package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
  181. package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
  182. package/payload/server/public/assets/{skills-BjHt5lDG.js → skills-C4EfNKEx.js} +1 -1
  183. package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
  184. package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
  185. package/payload/server/public/assets/{tasks-iUFfeA9_.js → tasks-DszD3aZl.js} +1 -1
  186. package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
  187. package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
  188. package/payload/server/public/assets/{triangle-alert-Dwa986Gg.js → triangle-alert-B5WAyAkC.js} +1 -1
  189. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +4 -0
  190. package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
  191. package/payload/server/public/assets/{useCopyFeedback-B1Jp6CsE.js → useCopyFeedback-B2nuNNJw.js} +1 -1
  192. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
  193. package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
  194. package/payload/server/public/assets/{useMediaQuery-CVZYjRf6.js → useMediaQuery-DUPJPHQt.js} +1 -1
  195. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
  196. package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
  197. package/payload/server/public/assets/{useVoiceRecorder-D5b4r4z0.js → useVoiceRecorder-BEgr0nHN.js} +1 -1
  198. package/payload/server/public/assets/useVoiceRecorder-BEgr0nHN.js.br +0 -0
  199. package/payload/server/public/assets/useVoiceRecorder-BEgr0nHN.js.gz +0 -0
  200. package/payload/server/public/assets/{wrench-BD7xwbV1.js → wrench-DZJZm17j.js} +1 -1
  201. package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
  202. package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
  203. package/payload/server/public/browser.html +5 -5
  204. package/payload/server/public/calendar.html +8 -8
  205. package/payload/server/public/chat.html +14 -14
  206. package/payload/server/public/data.html +12 -12
  207. package/payload/server/public/field.html +3 -3
  208. package/payload/server/public/graph.html +10 -10
  209. package/payload/server/public/index.html +14 -14
  210. package/payload/server/public/operator.html +15 -15
  211. package/payload/server/public/public.html +14 -14
  212. package/payload/server/public/routines.html +8 -8
  213. package/payload/server/public/skills.html +6 -6
  214. package/payload/server/public/tasks.html +7 -7
  215. package/payload/server/server.js +965 -687
  216. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.br +0 -0
  217. package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.gz +0 -0
  218. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.br +0 -0
  219. package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.gz +0 -0
  220. package/payload/server/public/assets/activity-BWqrCyYM.js.br +0 -0
  221. package/payload/server/public/assets/activity-BWqrCyYM.js.gz +0 -0
  222. package/payload/server/public/assets/admin-zly7Y6EZ.js.br +0 -0
  223. package/payload/server/public/assets/admin-zly7Y6EZ.js.gz +0 -0
  224. package/payload/server/public/assets/agents-BsxGD1V1.js.br +0 -0
  225. package/payload/server/public/assets/agents-BsxGD1V1.js.gz +0 -0
  226. package/payload/server/public/assets/browser-CRLxTaw2.js.br +0 -0
  227. package/payload/server/public/assets/browser-CRLxTaw2.js.gz +0 -0
  228. package/payload/server/public/assets/calendar-Bmp6qI_P.js.br +0 -0
  229. package/payload/server/public/assets/calendar-Bmp6qI_P.js.gz +0 -0
  230. package/payload/server/public/assets/chat-ChObDKHy.js +0 -1
  231. package/payload/server/public/assets/chat-ChObDKHy.js.br +0 -0
  232. package/payload/server/public/assets/chat-ChObDKHy.js.gz +0 -0
  233. package/payload/server/public/assets/chevron-left-D2l4jMcd.js +0 -1
  234. package/payload/server/public/assets/chevron-left-D2l4jMcd.js.br +0 -0
  235. package/payload/server/public/assets/clock-CMdfsroW.js +0 -1
  236. package/payload/server/public/assets/clock-CMdfsroW.js.br +0 -0
  237. package/payload/server/public/assets/clock-CMdfsroW.js.gz +0 -0
  238. package/payload/server/public/assets/copy-Bcjpxqzn.js.br +0 -0
  239. package/payload/server/public/assets/copy-Bcjpxqzn.js.gz +0 -0
  240. package/payload/server/public/assets/data-CFB5Lgw-.js +0 -1
  241. package/payload/server/public/assets/data-CFB5Lgw-.js.br +0 -0
  242. package/payload/server/public/assets/data-CFB5Lgw-.js.gz +0 -0
  243. package/payload/server/public/assets/field-ChKB2l_d.js.br +0 -0
  244. package/payload/server/public/assets/field-ChKB2l_d.js.gz +0 -0
  245. package/payload/server/public/assets/file-text-COZcf7mU.js.br +0 -0
  246. package/payload/server/public/assets/file-text-COZcf7mU.js.gz +0 -0
  247. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.br +0 -0
  248. package/payload/server/public/assets/graph-labels-x-1MT-3c.js.gz +0 -0
  249. package/payload/server/public/assets/graph-nnV47iqM.js.br +0 -0
  250. package/payload/server/public/assets/graph-nnV47iqM.js.gz +0 -0
  251. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css +0 -1
  252. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.br +0 -0
  253. package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.gz +0 -0
  254. package/payload/server/public/assets/operator-BAO0-mjU.js.br +0 -0
  255. package/payload/server/public/assets/operator-BAO0-mjU.js.gz +0 -0
  256. package/payload/server/public/assets/page-B-F08pod.js.br +0 -0
  257. package/payload/server/public/assets/page-B-F08pod.js.gz +0 -0
  258. package/payload/server/public/assets/page-BMOCy2aD.js +0 -1
  259. package/payload/server/public/assets/page-BMOCy2aD.js.br +0 -0
  260. package/payload/server/public/assets/page-BMOCy2aD.js.gz +0 -0
  261. package/payload/server/public/assets/play-DFtlk8Zs.js +0 -1
  262. package/payload/server/public/assets/play-DFtlk8Zs.js.br +0 -0
  263. package/payload/server/public/assets/play-DFtlk8Zs.js.gz +0 -0
  264. package/payload/server/public/assets/public-_HJsUohA.js.br +0 -0
  265. package/payload/server/public/assets/public-_HJsUohA.js.gz +0 -0
  266. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.br +0 -0
  267. package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.gz +0 -0
  268. package/payload/server/public/assets/routines-CoIVXRCB.js.br +0 -0
  269. package/payload/server/public/assets/routines-CoIVXRCB.js.gz +0 -0
  270. package/payload/server/public/assets/skills-BjHt5lDG.js.br +0 -0
  271. package/payload/server/public/assets/skills-BjHt5lDG.js.gz +0 -0
  272. package/payload/server/public/assets/tasks-iUFfeA9_.js.br +0 -0
  273. package/payload/server/public/assets/tasks-iUFfeA9_.js.gz +0 -0
  274. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.br +0 -0
  275. package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.gz +0 -0
  276. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.br +0 -0
  277. package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.gz +0 -0
  278. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.br +0 -0
  279. package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.gz +0 -0
  280. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.br +0 -0
  281. package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.gz +0 -0
  282. package/payload/server/public/assets/wrench-BD7xwbV1.js.br +0 -0
  283. package/payload/server/public/assets/wrench-BD7xwbV1.js.gz +0 -0
  284. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js → jsx-runtime-Cjug_Cyb.js} +0 -0
  285. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.br → jsx-runtime-Cjug_Cyb.js.br} +0 -0
  286. /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.gz → jsx-runtime-Cjug_Cyb.js.gz} +0 -0
@@ -3,14 +3,18 @@ import { readSessionCookie, resolveSession } from './_lib/session'
3
3
  import { q } from './_lib/log'
4
4
 
5
5
  /**
6
- * One published visit, as an account's own page renders it.
6
+ * One published row: ONE VISIT, ONE ATTENDING WORKER (Task 2551).
7
+ *
8
+ * The `visits` table is keyed on the attendance, so a visit two workers share is
9
+ * two rows here. `processVisits` folds them into the `VisitRow` below; nothing
10
+ * outside this file sees this shape.
7
11
  *
8
12
  * The ontology's own fields (`schema-construction.md`) and the portal person the
9
- * visit is assigned to, and nothing else. A job sheet's contents are the
10
- * account's to design, and they are files, which the Task 1910 exchange already
11
- * carries — so nothing of theirs belongs in this shape.
13
+ * row is assigned to, and nothing else. A job sheet's contents are the account's
14
+ * to design, and they are files, which the Task 1910 exchange already carries —
15
+ * so nothing of theirs belongs in this shape.
12
16
  */
13
- export interface VisitRow {
17
+ export interface VisitReadRow {
14
18
  visitId: string
15
19
  ownerId: string
16
20
  jobId: string
@@ -38,6 +42,23 @@ export interface VisitRow {
38
42
  signatures: number
39
43
  }
40
44
 
45
+ /**
46
+ * One visit, as an account's own page renders it: one card naming every worker
47
+ * on it (Task 2551).
48
+ *
49
+ * `owners` is who is attending. It holds one id for an ordinary visit, two for a
50
+ * visit two workers share, and one empty string for a visit whose engineer
51
+ * carries no `portalOwnerId` — the unbound sentinel `visits.ownerId` has always
52
+ * used.
53
+ *
54
+ * `ownerId` is `owners[0]` and is DERIVED, not authoritative. It stays because
55
+ * the planner groups cards onto worker rows by it and that page is not this
56
+ * task's to change; `owners` is what says who is actually on the job.
57
+ */
58
+ export interface VisitRow extends VisitReadRow {
59
+ owners: string[]
60
+ }
61
+
41
62
  /**
42
63
  * One candidate for one unallocated visit (Task 2511).
43
64
  *
@@ -117,6 +138,33 @@ function parseJson<T>(raw: string, fallback: T): T {
117
138
  }
118
139
  }
119
140
 
141
+ /**
142
+ * The attendance rows for one visit, as one card (Task 2551).
143
+ *
144
+ * CALLED AFTER THE SQL FILTER, NEVER BEFORE. An own-scoped person's read already
145
+ * returned only their own attendance, so their card names them and nobody else.
146
+ * Folding first would hand them the colleague names the file drop deliberately
147
+ * withholds, which is the rule `processVisits` states below.
148
+ *
149
+ * The order of `owners` is the read's `ORDER BY`, so the same set always renders
150
+ * the same way rather than in whatever order D1 happened to answer in.
151
+ */
152
+ export function foldOwners(rows: readonly VisitReadRow[]): VisitRow[] {
153
+ const out: VisitRow[] = []
154
+ const at = new Map<string, VisitRow>()
155
+ for (const r of rows) {
156
+ const held = at.get(r.visitId)
157
+ if (held) {
158
+ if (!held.owners.includes(r.ownerId)) held.owners.push(r.ownerId)
159
+ continue
160
+ }
161
+ const card: VisitRow = { ...r, owners: [r.ownerId] }
162
+ at.set(r.visitId, card)
163
+ out.push(card)
164
+ }
165
+ return out
166
+ }
167
+
120
168
  /**
121
169
  * The visits a signed-in person may read.
122
170
  *
@@ -160,13 +208,16 @@ export async function processVisits(
160
208
  ON s.accountId = v.accountId AND s.currentGeneration = v.generation
161
209
  WHERE v.accountId = ?` +
162
210
  (scoped ? ' AND v.ownerId = ?' : '') +
163
- ' ORDER BY v.startDate ASC, v.visitId ASC'
211
+ // ownerId joins the ORDER BY because the table is keyed on the attendance
212
+ // (Task 2551): the rows for one visit arrive together and in a fixed order,
213
+ // so the worker list on a shared card does not vary between reads.
214
+ ' ORDER BY v.startDate ASC, v.visitId ASC, v.ownerId ASC'
164
215
  const stmt = env.DB.prepare(sql)
165
216
  const bound = scoped
166
217
  ? stmt.bind(env.PORTAL_ACCOUNT_ID, session.ownerId)
167
218
  : stmt.bind(env.PORTAL_ACCOUNT_ID)
168
- const rows = await bound.all<VisitRow>()
169
- const visits = rows.results ?? []
219
+ const rows = await bound.all<VisitReadRow>()
220
+ const visits = foldOwners(rows.results ?? [])
170
221
 
171
222
  // THE SAME TWO FILTERS, and the owner one for the same reason: an own-scoped
172
223
  // person may see their own row and no other, or this page becomes a way to
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "telegram",
3
- "description": "Guide users through connecting Telegram bots — creating a bot via BotFather, finding user IDs, and registering any number of bots, each with its own role, access policy and agent. Reaches every Bot API method through telegram-api, and ships a build skill for authoring cards, in-place edits and Mini App surfaces.",
3
+ "description": "Guide users through connecting Telegram bots — creating a bot via BotFather, finding user IDs, and registering any number of bots, each with its own role, access policy and agent. Ships typed tools for cards, inbound files, forum threads, structured asks, outbound media and payments, reaches every remaining Bot API method through telegram-api, and carries a build skill for authoring cards, in-place edits and Mini App surfaces.",
4
4
  "version": "0.1.0",
5
5
  "author": {
6
6
  "name": "Rubytech LLC"
@@ -1,12 +1,32 @@
1
1
  ---
2
2
  name: telegram
3
3
  surface: platform
4
- description: Guide users through connecting Telegram bots — creating a bot via BotFather, finding user IDs, and registering any number of bots, each with its own role, access policy and agent. Reaches every Bot API method through telegram-api, and ships a build skill for authoring cards, in-place edits and Mini App surfaces.
4
+ description: Guide users through connecting Telegram bots — creating a bot via BotFather, finding user IDs, and registering any number of bots, each with its own role, access policy and agent. Ships typed tools for cards, inbound files, forum threads, structured asks, outbound media and payments, reaches every remaining Bot API method through telegram-api, and carries a build skill for authoring cards, in-place edits and Mini App surfaces.
5
5
  metadata: {"platform":{"optional":false}}
6
6
  tools:
7
- - name: message
7
+ - name: telegram-card
8
8
  publicAllowlist: false
9
- adminAllowlist: false
9
+ adminAllowlist: true
10
+ riskClass: external
11
+ - name: telegram-media-fetch
12
+ publicAllowlist: false
13
+ adminAllowlist: true
14
+ riskClass: external
15
+ - name: telegram-thread
16
+ publicAllowlist: false
17
+ adminAllowlist: true
18
+ riskClass: external
19
+ - name: telegram-ask
20
+ publicAllowlist: false
21
+ adminAllowlist: true
22
+ riskClass: external
23
+ - name: telegram-media-send
24
+ publicAllowlist: false
25
+ adminAllowlist: true
26
+ riskClass: external
27
+ - name: telegram-invoice
28
+ publicAllowlist: false
29
+ adminAllowlist: true
10
30
  riskClass: external
11
31
  - name: message-history
12
32
  publicAllowlist: false
@@ -2,8 +2,11 @@ import { describe, expect, it } from "vitest";
2
2
  import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join, resolve } from "node:path";
5
- import { bootCensusLine, diffMethods, extractMethodNames } from "../lib/api-census.js";
5
+ import { bootCensusLine, diffMethods, extractMethodNames, OWNED_METHODS, tallyPassthrough, passthroughCensusLine, } from "../lib/api-census.js";
6
6
  import { BOT_API_METHODS } from "../lib/api-methods.js";
7
+ import { ASK_METHOD } from "../tools/ask.js";
8
+ import { MEDIA_SEND_METHOD } from "../tools/media-send.js";
9
+ import { INVOICE_METHOD } from "../tools/invoice.js";
7
10
  function stubAccount(bots) {
8
11
  const root = mkdtempSync(join(tmpdir(), "tg-census-"));
9
12
  const platformRoot = join(root, "platform");
@@ -74,4 +77,99 @@ describe("extractMethodNames", () => {
74
77
  expect(diffMethods(extractMethodNames(page))).toEqual({ missing: [], added: [] });
75
78
  });
76
79
  });
80
+ describe("OWNED_METHODS", () => {
81
+ it("names the tool that owns each method the three shipped tools absorbed", () => {
82
+ expect(OWNED_METHODS.sendMessage).toBe("telegram-card");
83
+ expect(OWNED_METHODS.editMessageText).toBe("telegram-card");
84
+ expect(OWNED_METHODS.editMessageReplyMarkup).toBe("telegram-card");
85
+ expect(OWNED_METHODS.answerCallbackQuery).toBe("telegram-card");
86
+ expect(OWNED_METHODS.getFile).toBe("telegram-media-fetch");
87
+ expect(OWNED_METHODS.createForumTopic).toBe("telegram-thread");
88
+ expect(OWNED_METHODS.unpinAllForumTopicMessages).toBe("telegram-thread");
89
+ });
90
+ it("names every method the Task 2594 tools absorb", () => {
91
+ for (const m of Object.values(ASK_METHOD))
92
+ expect(OWNED_METHODS[m]).toBe("telegram-ask");
93
+ for (const m of Object.values(MEDIA_SEND_METHOD)) {
94
+ expect(OWNED_METHODS[m]).toBe("telegram-media-send");
95
+ }
96
+ for (const m of Object.values(INVOICE_METHOD)) {
97
+ expect(OWNED_METHODS[m]).toBe("telegram-invoice");
98
+ }
99
+ });
100
+ it("claims nothing no tool implements", () => {
101
+ // The buckets that stay on telegram-api by design: membership,
102
+ // business-account, bot-self-config, org-verification, chat-cosmetic.
103
+ expect(OWNED_METHODS.pinChatMessage).toBeUndefined();
104
+ expect(OWNED_METHODS.setMyCommands).toBeUndefined();
105
+ expect(OWNED_METHODS.sendSticker).toBeUndefined();
106
+ });
107
+ it("counts a passthrough call to a newly owned method as owned, not as healthy passthrough", () => {
108
+ const t = tallyPassthrough([
109
+ "[telegram-api] op=call callId=aa method=sendPhoto listed=true files=1",
110
+ "[telegram-api] op=call callId=bb method=sendInvoice listed=true files=0",
111
+ "[telegram-api] op=call callId=cc method=pinChatMessage listed=true files=0",
112
+ ]);
113
+ expect(t.owned).toEqual({ sendPhoto: 1, sendInvoice: 1 });
114
+ expect(t.passthrough).toEqual({ pinChatMessage: 1 });
115
+ });
116
+ });
117
+ describe("tallyPassthrough", () => {
118
+ const call = (m) => `[telegram-api] op=call callId=aa method=${m} listed=true files=0`;
119
+ it("splits owned from passthrough by method name", () => {
120
+ const out = tallyPassthrough([
121
+ call("sendMessage"),
122
+ call("pinChatMessage"),
123
+ call("pinChatMessage"),
124
+ ]);
125
+ expect(out.owned).toEqual({ sendMessage: 1 });
126
+ expect(out.passthrough).toEqual({ pinChatMessage: 2 });
127
+ });
128
+ it("ignores lines that are not a telegram-api op=call", () => {
129
+ const out = tallyPassthrough([
130
+ "[telegram-api] op=result callId=aa method=sendMessage ok=true",
131
+ "[telegram-tools] op=call tool=telegram-card method=sendMessage callId=bb botId=1",
132
+ "unrelated log line",
133
+ ]);
134
+ expect(out.owned).toEqual({});
135
+ expect(out.passthrough).toEqual({});
136
+ });
137
+ it("counts nothing from an empty input, which is the not-measuring state", () => {
138
+ expect(tallyPassthrough([])).toEqual({ owned: {}, passthrough: {} });
139
+ });
140
+ });
141
+ describe("passthroughCensusLine", () => {
142
+ it("reports owned rising when an owned method goes through the passthrough", () => {
143
+ const dir = mkdtempSync(join(tmpdir(), "logs-"));
144
+ writeFileSync(join(dir, "mcp-admin-s1.log"), "[telegram-api] op=call callId=aa method=pinChatMessage listed=true files=0\n", "utf-8");
145
+ expect(passthroughCensusLine(dir)).toContain("owned=0 passthrough=1");
146
+ writeFileSync(join(dir, "mcp-admin-s2.log"), "[telegram-api] op=call callId=bb method=sendMessage listed=true files=0\n", "utf-8");
147
+ const risen = passthroughCensusLine(dir);
148
+ expect(risen).toContain("owned=1 passthrough=1");
149
+ expect(risen).toContain("sendMessage:1");
150
+ });
151
+ it("reports owned rising on a newly owned method, then falling to zero", () => {
152
+ // owned=0 is also what a dead counter prints, so a zero on its own proves
153
+ // nothing. The pair is the assertion: the same function must report 1 for a
154
+ // log that holds a sendPoll call and 0 for one that does not.
155
+ const risen = mkdtempSync(join(tmpdir(), "logs-"));
156
+ writeFileSync(join(risen, "mcp-admin-s1.log"), "[telegram-api] op=call callId=aa method=sendPoll listed=true files=0\n" +
157
+ "[telegram-api] op=call callId=bb method=pinChatMessage listed=true files=0\n", "utf-8");
158
+ const line = passthroughCensusLine(risen);
159
+ expect(line).toContain("owned=1 passthrough=1");
160
+ expect(line).toContain("sendPoll:1");
161
+ const quiet = mkdtempSync(join(tmpdir(), "logs-"));
162
+ writeFileSync(join(quiet, "mcp-admin-s1.log"), "[telegram-api] op=call callId=aa method=pinChatMessage listed=true files=0\n", "utf-8");
163
+ expect(passthroughCensusLine(quiet)).toContain("owned=0 passthrough=1");
164
+ });
165
+ it("reports zeros rather than throwing when LOG_DIR is absent", () => {
166
+ expect(passthroughCensusLine(undefined)).toContain("owned=0 passthrough=0");
167
+ expect(passthroughCensusLine("/no/such/dir")).toContain("owned=0 passthrough=0");
168
+ });
169
+ it("skips rotated .gz files, which it cannot read as text", () => {
170
+ const dir = mkdtempSync(join(tmpdir(), "logs-"));
171
+ writeFileSync(join(dir, "mcp-admin-s1.log.gz"), Buffer.from([0x1f, 0x8b, 0x08]));
172
+ expect(passthroughCensusLine(dir)).toContain("owned=0 passthrough=0");
173
+ });
174
+ });
77
175
  //# sourceMappingURL=api-census.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-census.test.js","sourceRoot":"","sources":["../../src/__tests__/api-census.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-census.test.js","sourceRoot":"","sources":["../../src/__tests__/api-census.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,SAAS,WAAW,CAAC,IAAyD;IAC5E,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,2EAA2E;IAC3E,0EAA0E;IAC1E,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAC7C,gEAAgE,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAC5C,gEAAgE,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,YAAY,GAAG,WAAW,CAAC;YAC/B,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAC1C,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CACjD,gEAAgE,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAChE,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,CAAC,cAAc,CAAC;SACxB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACxE,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,4EAA4E;IAC5E,wEAAwE;IACxE,wEAAwE;IACxE,6EAA6E;IAC7E,MAAM,IAAI,GACR,8GAA8G,CAAC;IAEjH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GACR,IAAI;YACJ,kGAAkG,CAAC;QACrG,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GACR,kHAAkH,CAAC;QACrH,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,+BAA+B,CAAC,CAAC,WAAW,EAAE,oCAAoC,CAAC,OAAO,CAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5D,MAAM,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnE,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,+DAA+D;QAC/D,sEAAsE;QACtE,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,MAAM,CAAC,GAAG,gBAAgB,CAAC;YACzB,uEAAuE;YACvE,yEAAyE;YACzE,4EAA4E;SAC7E,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,2CAA2C,CAAC,sBAAsB,CAAC;IAE/F,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAG,gBAAgB,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC;YACnB,IAAI,CAAC,gBAAgB,CAAC;YACtB,IAAI,CAAC,gBAAgB,CAAC;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,gBAAgB,CAAC;YAC3B,+DAA+D;YAC/D,kFAAkF;YAClF,oBAAoB;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAC7B,8EAA8E,EAC9E,OAAO,CACR,CAAC;QACF,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEtE,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAC7B,2EAA2E,EAC3E,OAAO,CACR,CAAC;QACF,MAAM,KAAK,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,8DAA8D;QAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,aAAa,CACX,IAAI,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAC/B,wEAAwE;YACtE,8EAA8E,EAChF,OAAO,CACR,CAAC;QACF,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,aAAa,CACX,IAAI,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAC/B,8EAA8E,EAC9E,OAAO,CACR,CAAC;QACF,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC5E,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ask-tool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-tool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ask-tool.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,226 @@
1
+ import { describe, expect, it, beforeEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { telegramAsk, ASK_METHOD } from "../tools/ask.js";
6
+ const ACC = "acc-1";
7
+ const BOT = "111";
8
+ let platformRoot;
9
+ let lines;
10
+ beforeEach(() => {
11
+ const root = mkdtempSync(join(tmpdir(), "brand-"));
12
+ mkdirSync(join(root, "platform"), { recursive: true });
13
+ const dir = join(root, "data", "accounts", ACC);
14
+ mkdirSync(dir, { recursive: true });
15
+ writeFileSync(join(dir, "account.json"), JSON.stringify({ telegram: { bots: [{ id: BOT, role: "admin", token: `${BOT}:SECRET` }] } }), "utf-8");
16
+ platformRoot = join(root, "platform");
17
+ lines = [];
18
+ });
19
+ function recorder(reply) {
20
+ const calls = [];
21
+ const fetchImpl = (async (url, init) => {
22
+ calls.push({
23
+ method: String(url).split("/").pop() ?? "",
24
+ body: JSON.parse(String(init.body)),
25
+ });
26
+ return new Response(JSON.stringify(reply));
27
+ });
28
+ return { calls, fetchImpl };
29
+ }
30
+ function deps(fetchImpl) {
31
+ return {
32
+ platformRoot,
33
+ accountId: ACC,
34
+ callId: "cafe",
35
+ log: (l) => lines.push(l),
36
+ fetchImpl,
37
+ };
38
+ }
39
+ describe("ASK_METHOD", () => {
40
+ it("maps every kind to its Bot API method name", () => {
41
+ expect(ASK_METHOD).toEqual({
42
+ poll: "sendPoll",
43
+ checklist: "sendChecklist",
44
+ location: "sendLocation",
45
+ venue: "sendVenue",
46
+ contact: "sendContact",
47
+ dice: "sendDice",
48
+ stopPoll: "stopPoll",
49
+ editChecklist: "editMessageChecklist",
50
+ editLiveLocation: "editMessageLiveLocation",
51
+ stopLiveLocation: "stopMessageLiveLocation",
52
+ });
53
+ });
54
+ });
55
+ describe("telegramAsk", () => {
56
+ it("sends a poll with options as InputPollOption objects", async () => {
57
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 5 } });
58
+ const out = await telegramAsk({ botId: BOT, chatId: -100123, kind: "poll", question: "Which slot?", options: ["9am", "2pm"] }, deps(fetchImpl));
59
+ expect(out.isError).toBe(false);
60
+ expect(calls[0]?.method).toBe("sendPoll");
61
+ expect(calls[0]?.body).toEqual({
62
+ chat_id: -100123,
63
+ question: "Which slot?",
64
+ options: [{ text: "9am" }, { text: "2pm" }],
65
+ });
66
+ });
67
+ it("passes the quiz optionals with the Bot API's own names", async () => {
68
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
69
+ await telegramAsk({
70
+ botId: BOT,
71
+ chatId: 1,
72
+ kind: "poll",
73
+ question: "q",
74
+ options: ["a", "b"],
75
+ pollType: "quiz",
76
+ correctOptionIds: [1],
77
+ isAnonymous: false,
78
+ openPeriod: 300,
79
+ }, deps(fetchImpl));
80
+ expect(calls[0]?.body).toMatchObject({
81
+ type: "quiz",
82
+ correct_option_ids: [1],
83
+ is_anonymous: false,
84
+ open_period: 300,
85
+ });
86
+ });
87
+ it("refuses a poll with no question, before any network call", async () => {
88
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
89
+ const out = await telegramAsk({ botId: BOT, chatId: 1, kind: "poll", options: ["a"] }, deps(fetchImpl));
90
+ expect(out.isError).toBe(true);
91
+ expect(out.text).toContain("question");
92
+ expect(calls.length).toBe(0);
93
+ });
94
+ it("refuses a checklist with no businessConnectionId, before any network call", async () => {
95
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
96
+ const out = await telegramAsk({
97
+ botId: BOT,
98
+ chatId: 1,
99
+ kind: "checklist",
100
+ checklist: { title: "Snags", tasks: [{ id: 1, text: "Seal the flashing" }] },
101
+ }, deps(fetchImpl));
102
+ expect(out.isError).toBe(true);
103
+ expect(out.text).toContain("businessConnectionId");
104
+ expect(calls.length).toBe(0);
105
+ });
106
+ it("refuses a venue missing its address, before any network call", async () => {
107
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
108
+ const out = await telegramAsk({ botId: BOT, chatId: 1, kind: "venue", latitude: 51.5, longitude: -0.1, title: "Site" }, deps(fetchImpl));
109
+ expect(out.isError).toBe(true);
110
+ expect(out.text).toContain("address");
111
+ expect(calls.length).toBe(0);
112
+ });
113
+ it("nests the checklist as Telegram's InputChecklist", async () => {
114
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 3 } });
115
+ await telegramAsk({
116
+ botId: BOT,
117
+ chatId: 1,
118
+ kind: "checklist",
119
+ businessConnectionId: "bc1",
120
+ checklist: {
121
+ title: "Snags",
122
+ tasks: [{ id: 1, text: "Seal" }],
123
+ othersCanMarkTasksAsDone: true,
124
+ },
125
+ }, deps(fetchImpl));
126
+ expect(calls[0]?.body).toEqual({
127
+ chat_id: 1,
128
+ business_connection_id: "bc1",
129
+ checklist: {
130
+ title: "Snags",
131
+ tasks: [{ id: 1, text: "Seal" }],
132
+ others_can_mark_tasks_as_done: true,
133
+ },
134
+ });
135
+ });
136
+ it("sends only chat_id and message_id for stopPoll and stopLiveLocation", async () => {
137
+ for (const kind of ["stopPoll", "stopLiveLocation"]) {
138
+ const { calls, fetchImpl } = recorder({ ok: true, result: true });
139
+ await telegramAsk({ botId: BOT, chatId: 5, kind, messageId: 9 }, deps(fetchImpl));
140
+ expect(calls[0]?.body).toEqual({ chat_id: 5, message_id: 9 });
141
+ expect(calls[0]?.method).toBe(ASK_METHOD[kind]);
142
+ }
143
+ });
144
+ it("adds the shared optionals to any kind", async () => {
145
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
146
+ await telegramAsk({
147
+ botId: BOT,
148
+ chatId: 1,
149
+ kind: "dice",
150
+ messageThreadId: 7,
151
+ disableNotification: true,
152
+ replyToMessageId: 42,
153
+ buttons: [[{ text: "Again", callbackData: "roll" }]],
154
+ }, deps(fetchImpl));
155
+ expect(calls[0]?.body).toMatchObject({
156
+ message_thread_id: 7,
157
+ disable_notification: true,
158
+ reply_parameters: { message_id: 42 },
159
+ reply_markup: { inline_keyboard: [[{ text: "Again", callback_data: "roll" }]] },
160
+ });
161
+ });
162
+ it("withholds the send-envelope options from the edit and stop kinds", async () => {
163
+ // Telegram's tables carry reply_markup on stopPoll, editMessageChecklist,
164
+ // editMessageLiveLocation and stopMessageLiveLocation, and none of the
165
+ // send-envelope options, so a caller setting them must not reach the wire.
166
+ const { calls, fetchImpl } = recorder({ ok: true, result: true });
167
+ await telegramAsk({
168
+ botId: BOT,
169
+ chatId: 5,
170
+ kind: "stopPoll",
171
+ messageId: 9,
172
+ disableNotification: true,
173
+ protectContent: true,
174
+ replyToMessageId: 3,
175
+ messageThreadId: 8,
176
+ buttons: [[{ text: "Results", callbackData: "r" }]],
177
+ }, deps(fetchImpl));
178
+ expect(calls[0]?.body).toEqual({
179
+ chat_id: 5,
180
+ message_id: 9,
181
+ reply_markup: { inline_keyboard: [[{ text: "Results", callback_data: "r" }]] },
182
+ });
183
+ });
184
+ it("omits message_thread_id on a checklist, the one send method with no such field", async () => {
185
+ const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 3 } });
186
+ await telegramAsk({
187
+ botId: BOT,
188
+ chatId: 1,
189
+ kind: "checklist",
190
+ businessConnectionId: "bc1",
191
+ checklist: { title: "Snags", tasks: [{ id: 1, text: "Seal" }] },
192
+ messageThreadId: 8,
193
+ disableNotification: true,
194
+ }, deps(fetchImpl));
195
+ expect(calls[0]?.body).toEqual({
196
+ chat_id: 1,
197
+ business_connection_id: "bc1",
198
+ checklist: { title: "Snags", tasks: [{ id: 1, text: "Seal" }] },
199
+ disable_notification: true,
200
+ });
201
+ });
202
+ it("relays Telegram's refusal unaltered", async () => {
203
+ const { fetchImpl } = recorder({
204
+ ok: false,
205
+ error_code: 400,
206
+ description: "Bad Request: poll can't be sent to channel direct messages chats",
207
+ });
208
+ const out = await telegramAsk({ botId: BOT, chatId: 1, kind: "poll", question: "q", options: ["a"] }, deps(fetchImpl));
209
+ expect(out.isError).toBe(true);
210
+ expect(out.text).toContain("channel direct messages chats");
211
+ });
212
+ it("emits a call/result pair sharing one callId", async () => {
213
+ const { fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
214
+ await telegramAsk({ botId: BOT, chatId: 1, kind: "dice" }, deps(fetchImpl));
215
+ expect(lines.join("\n")).toContain("op=call tool=telegram-ask method=sendDice callId=cafe");
216
+ expect(lines.join("\n")).toContain("op=result callId=cafe");
217
+ });
218
+ it("refuses when the account has no such bot, naming the registered ones", async () => {
219
+ const { calls, fetchImpl } = recorder({ ok: true, result: {} });
220
+ const out = await telegramAsk({ botId: "999", chatId: 1, kind: "dice" }, deps(fetchImpl));
221
+ expect(out.isError).toBe(true);
222
+ expect(out.text).toContain(BOT);
223
+ expect(calls.length).toBe(0);
224
+ });
225
+ });
226
+ //# sourceMappingURL=ask-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-tool.test.js","sourceRoot":"","sources":["../../src/__tests__/ask-tool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=card-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-store.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/card-store.test.ts"],"names":[],"mappings":""}