@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.
- package/package.json +1 -1
- package/payload/platform/lib/telegram-media/dist/index.d.ts +45 -0
- package/payload/platform/lib/telegram-media/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/telegram-media/dist/index.js +89 -0
- package/payload/platform/lib/telegram-media/dist/index.js.map +1 -0
- package/payload/platform/lib/telegram-media/src/__tests__/telegram-media.test.ts +104 -0
- package/payload/platform/lib/telegram-media/src/index.ts +102 -0
- package/payload/platform/lib/telegram-media/tsconfig.json +9 -0
- package/payload/platform/lib/telegram-media/vitest.config.ts +9 -0
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/admin/PLUGIN.md +2 -2
- package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +22 -0
- package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +34 -0
- package/payload/platform/plugins/admin/hooks/__tests__/quote-path-write-gate.test.sh +25 -0
- package/payload/platform/plugins/admin/hooks/archive-ingest-surface-gate.sh +11 -4
- package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +2 -2
- package/payload/platform/plugins/admin/hooks/quote-path-write-gate.sh +6 -3
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
- package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-schema-shape.test.ts +23 -0
- package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visit-status-write.test.ts +175 -3
- package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +101 -0
- package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +35 -1
- package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visit-status.ts +73 -8
- package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +59 -8
- package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/telegram/PLUGIN.md +23 -3
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +99 -1
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +226 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js +143 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-store.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +197 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js +196 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/invoice-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js +95 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js +293 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js +130 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/schemas.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js +119 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/thread-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/index.js +71 -66
- package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +15 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +27 -10
- package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts +34 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +106 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts +41 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js +120 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts +73 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js +270 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +34 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +134 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts +70 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js +232 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/invoice.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts +42 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js +92 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts +76 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js +288 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts +250 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js +400 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/schemas.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts +38 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js +120 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/vitest.config.ts +14 -0
- package/payload/platform/plugins/telegram/skills/build/SKILL.md +161 -21
- package/payload/platform/scripts/__tests__/hook-matcher-dispatch.test.sh +163 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +6 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/public/activity.html +6 -6
- package/payload/server/public/agents.html +5 -5
- package/payload/server/public/assets/{AdminLoginScreens-Bus-Y-rG.js → AdminLoginScreens-Dxv5t1YY.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-Dxv5t1YY.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Dxv5t1YY.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-Bsm7q3CW.js → AdminShell-BMslfZxN.js} +1 -1
- package/payload/server/public/assets/AdminShell-BMslfZxN.js.br +0 -0
- package/payload/server/public/assets/AdminShell-BMslfZxN.js.gz +0 -0
- package/payload/server/public/assets/{activity-BWqrCyYM.js → activity-kQ3w70LJ.js} +1 -1
- package/payload/server/public/assets/activity-kQ3w70LJ.js.br +0 -0
- package/payload/server/public/assets/activity-kQ3w70LJ.js.gz +0 -0
- package/payload/server/public/assets/{admin-zly7Y6EZ.js → admin-DapcMKCG.js} +1 -1
- package/payload/server/public/assets/admin-DapcMKCG.js.br +0 -0
- package/payload/server/public/assets/admin-DapcMKCG.js.gz +0 -0
- package/payload/server/public/assets/{agents-BsxGD1V1.js → agents-Cn_bZgnD.js} +1 -1
- package/payload/server/public/assets/agents-Cn_bZgnD.js.br +0 -0
- package/payload/server/public/assets/agents-Cn_bZgnD.js.gz +0 -0
- package/payload/server/public/assets/{browser-CRLxTaw2.js → browser-BE-GDk5-.js} +1 -1
- package/payload/server/public/assets/browser-BE-GDk5-.js.br +0 -0
- package/payload/server/public/assets/browser-BE-GDk5-.js.gz +0 -0
- package/payload/server/public/assets/{calendar-Bmp6qI_P.js → calendar-Di7BEHHN.js} +1 -1
- package/payload/server/public/assets/calendar-Di7BEHHN.js.br +0 -0
- package/payload/server/public/assets/calendar-Di7BEHHN.js.gz +0 -0
- package/payload/server/public/assets/chat-DLmikhie.js +1 -0
- package/payload/server/public/assets/chat-DLmikhie.js.br +1 -0
- package/payload/server/public/assets/chat-DLmikhie.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-Id9VAZAz.js +1 -0
- package/payload/server/public/assets/chevron-left-Id9VAZAz.js.br +0 -0
- package/payload/server/public/assets/clock-DKpWWJbJ.js +1 -0
- package/payload/server/public/assets/clock-DKpWWJbJ.js.br +0 -0
- package/payload/server/public/assets/{copy-Bcjpxqzn.js → copy-nkxspu2J.js} +1 -1
- package/payload/server/public/assets/copy-nkxspu2J.js.br +0 -0
- package/payload/server/public/assets/copy-nkxspu2J.js.gz +0 -0
- package/payload/server/public/assets/data-C1_m9Xyf.js +1 -0
- package/payload/server/public/assets/data-C1_m9Xyf.js.br +0 -0
- package/payload/server/public/assets/data-C1_m9Xyf.js.gz +0 -0
- package/payload/server/public/assets/{field-ChKB2l_d.js → field-2rIXxGMt.js} +1 -1
- package/payload/server/public/assets/field-2rIXxGMt.js.br +0 -0
- package/payload/server/public/assets/field-2rIXxGMt.js.gz +0 -0
- package/payload/server/public/assets/{file-text-COZcf7mU.js → file-text-CdSqrscg.js} +1 -1
- package/payload/server/public/assets/file-text-CdSqrscg.js.br +0 -0
- package/payload/server/public/assets/file-text-CdSqrscg.js.gz +0 -0
- package/payload/server/public/assets/{graph-nnV47iqM.js → graph-BfBHHXaC.js} +1 -1
- package/payload/server/public/assets/graph-BfBHHXaC.js.br +0 -0
- package/payload/server/public/assets/graph-BfBHHXaC.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-x-1MT-3c.js → graph-labels-CHW2aBke.js} +1 -1
- package/payload/server/public/assets/graph-labels-CHW2aBke.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CHW2aBke.js.gz +0 -0
- package/payload/server/public/assets/jsx-runtime-D43jgaWP.css +1 -0
- package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.br +0 -0
- package/payload/server/public/assets/jsx-runtime-D43jgaWP.css.gz +0 -0
- package/payload/server/public/assets/{operator-BAO0-mjU.js → operator-BOiL8sxx.js} +1 -1
- package/payload/server/public/assets/operator-BOiL8sxx.js.br +0 -0
- package/payload/server/public/assets/operator-BOiL8sxx.js.gz +0 -0
- package/payload/server/public/assets/page-CZ6tyH8t.js +1 -0
- package/payload/server/public/assets/page-CZ6tyH8t.js.br +0 -0
- package/payload/server/public/assets/page-CZ6tyH8t.js.gz +0 -0
- package/payload/server/public/assets/{page-B-F08pod.js → page-Cd36Y0h6.js} +1 -1
- package/payload/server/public/assets/page-Cd36Y0h6.js.br +0 -0
- package/payload/server/public/assets/page-Cd36Y0h6.js.gz +0 -0
- package/payload/server/public/assets/play-7LTxCuLX.js +1 -0
- package/payload/server/public/assets/play-7LTxCuLX.js.br +0 -0
- package/payload/server/public/assets/play-7LTxCuLX.js.gz +0 -0
- package/payload/server/public/assets/{public-_HJsUohA.js → public-CVBav4FQ.js} +1 -1
- package/payload/server/public/assets/public-CVBav4FQ.js.br +0 -0
- package/payload/server/public/assets/public-CVBav4FQ.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DJeAnYLQ.js → rotate-ccw-J9f-GWjm.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-J9f-GWjm.js.gz +0 -0
- package/payload/server/public/assets/{routines-CoIVXRCB.js → routines-C1AB-3FR.js} +1 -1
- package/payload/server/public/assets/routines-C1AB-3FR.js.br +0 -0
- package/payload/server/public/assets/routines-C1AB-3FR.js.gz +0 -0
- package/payload/server/public/assets/{skills-BjHt5lDG.js → skills-C4EfNKEx.js} +1 -1
- package/payload/server/public/assets/skills-C4EfNKEx.js.br +0 -0
- package/payload/server/public/assets/skills-C4EfNKEx.js.gz +0 -0
- package/payload/server/public/assets/{tasks-iUFfeA9_.js → tasks-DszD3aZl.js} +1 -1
- package/payload/server/public/assets/tasks-DszD3aZl.js.br +0 -0
- package/payload/server/public/assets/tasks-DszD3aZl.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-Dwa986Gg.js → triangle-alert-B5WAyAkC.js} +1 -1
- package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.br +4 -0
- package/payload/server/public/assets/triangle-alert-B5WAyAkC.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-B1Jp6CsE.js → useCopyFeedback-B2nuNNJw.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-B2nuNNJw.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-CVZYjRf6.js → useMediaQuery-DUPJPHQt.js} +1 -1
- package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-DUPJPHQt.js.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-D5b4r4z0.js → useVoiceRecorder-BEgr0nHN.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-BEgr0nHN.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BEgr0nHN.js.gz +0 -0
- package/payload/server/public/assets/{wrench-BD7xwbV1.js → wrench-DZJZm17j.js} +1 -1
- package/payload/server/public/assets/wrench-DZJZm17j.js.br +0 -0
- package/payload/server/public/assets/wrench-DZJZm17j.js.gz +0 -0
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +8 -8
- package/payload/server/public/chat.html +14 -14
- package/payload/server/public/data.html +12 -12
- package/payload/server/public/field.html +3 -3
- package/payload/server/public/graph.html +10 -10
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +15 -15
- package/payload/server/public/public.html +14 -14
- package/payload/server/public/routines.html +8 -8
- package/payload/server/public/skills.html +6 -6
- package/payload/server/public/tasks.html +7 -7
- package/payload/server/server.js +965 -687
- package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Bus-Y-rG.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.br +0 -0
- package/payload/server/public/assets/AdminShell-Bsm7q3CW.js.gz +0 -0
- package/payload/server/public/assets/activity-BWqrCyYM.js.br +0 -0
- package/payload/server/public/assets/activity-BWqrCyYM.js.gz +0 -0
- package/payload/server/public/assets/admin-zly7Y6EZ.js.br +0 -0
- package/payload/server/public/assets/admin-zly7Y6EZ.js.gz +0 -0
- package/payload/server/public/assets/agents-BsxGD1V1.js.br +0 -0
- package/payload/server/public/assets/agents-BsxGD1V1.js.gz +0 -0
- package/payload/server/public/assets/browser-CRLxTaw2.js.br +0 -0
- package/payload/server/public/assets/browser-CRLxTaw2.js.gz +0 -0
- package/payload/server/public/assets/calendar-Bmp6qI_P.js.br +0 -0
- package/payload/server/public/assets/calendar-Bmp6qI_P.js.gz +0 -0
- package/payload/server/public/assets/chat-ChObDKHy.js +0 -1
- package/payload/server/public/assets/chat-ChObDKHy.js.br +0 -0
- package/payload/server/public/assets/chat-ChObDKHy.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-D2l4jMcd.js +0 -1
- package/payload/server/public/assets/chevron-left-D2l4jMcd.js.br +0 -0
- package/payload/server/public/assets/clock-CMdfsroW.js +0 -1
- package/payload/server/public/assets/clock-CMdfsroW.js.br +0 -0
- package/payload/server/public/assets/clock-CMdfsroW.js.gz +0 -0
- package/payload/server/public/assets/copy-Bcjpxqzn.js.br +0 -0
- package/payload/server/public/assets/copy-Bcjpxqzn.js.gz +0 -0
- package/payload/server/public/assets/data-CFB5Lgw-.js +0 -1
- package/payload/server/public/assets/data-CFB5Lgw-.js.br +0 -0
- package/payload/server/public/assets/data-CFB5Lgw-.js.gz +0 -0
- package/payload/server/public/assets/field-ChKB2l_d.js.br +0 -0
- package/payload/server/public/assets/field-ChKB2l_d.js.gz +0 -0
- package/payload/server/public/assets/file-text-COZcf7mU.js.br +0 -0
- package/payload/server/public/assets/file-text-COZcf7mU.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-x-1MT-3c.js.br +0 -0
- package/payload/server/public/assets/graph-labels-x-1MT-3c.js.gz +0 -0
- package/payload/server/public/assets/graph-nnV47iqM.js.br +0 -0
- package/payload/server/public/assets/graph-nnV47iqM.js.gz +0 -0
- package/payload/server/public/assets/jsx-runtime-CeNZasfC.css +0 -1
- package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.br +0 -0
- package/payload/server/public/assets/jsx-runtime-CeNZasfC.css.gz +0 -0
- package/payload/server/public/assets/operator-BAO0-mjU.js.br +0 -0
- package/payload/server/public/assets/operator-BAO0-mjU.js.gz +0 -0
- package/payload/server/public/assets/page-B-F08pod.js.br +0 -0
- package/payload/server/public/assets/page-B-F08pod.js.gz +0 -0
- package/payload/server/public/assets/page-BMOCy2aD.js +0 -1
- package/payload/server/public/assets/page-BMOCy2aD.js.br +0 -0
- package/payload/server/public/assets/page-BMOCy2aD.js.gz +0 -0
- package/payload/server/public/assets/play-DFtlk8Zs.js +0 -1
- package/payload/server/public/assets/play-DFtlk8Zs.js.br +0 -0
- package/payload/server/public/assets/play-DFtlk8Zs.js.gz +0 -0
- package/payload/server/public/assets/public-_HJsUohA.js.br +0 -0
- package/payload/server/public/assets/public-_HJsUohA.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DJeAnYLQ.js.gz +0 -0
- package/payload/server/public/assets/routines-CoIVXRCB.js.br +0 -0
- package/payload/server/public/assets/routines-CoIVXRCB.js.gz +0 -0
- package/payload/server/public/assets/skills-BjHt5lDG.js.br +0 -0
- package/payload/server/public/assets/skills-BjHt5lDG.js.gz +0 -0
- package/payload/server/public/assets/tasks-iUFfeA9_.js.br +0 -0
- package/payload/server/public/assets/tasks-iUFfeA9_.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-Dwa986Gg.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-B1Jp6CsE.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-CVZYjRf6.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-D5b4r4z0.js.gz +0 -0
- package/payload/server/public/assets/wrench-BD7xwbV1.js.br +0 -0
- package/payload/server/public/assets/wrench-BD7xwbV1.js.gz +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js → jsx-runtime-Cjug_Cyb.js} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.br → jsx-runtime-Cjug_Cyb.js.br} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CjJ246F7.js.gz → jsx-runtime-Cjug_Cyb.js.gz} +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach } 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 { telegramMediaFetch } from "../tools/media-fetch.js";
|
|
6
|
+
const ACC = "acc-1";
|
|
7
|
+
const BOT = "111";
|
|
8
|
+
let platformRoot;
|
|
9
|
+
let destDir;
|
|
10
|
+
let lines;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
const root = mkdtempSync(join(tmpdir(), "brand-"));
|
|
13
|
+
mkdirSync(join(root, "platform"), { recursive: true });
|
|
14
|
+
const dir = join(root, "data", "accounts", ACC);
|
|
15
|
+
mkdirSync(dir, { recursive: true });
|
|
16
|
+
writeFileSync(join(dir, "account.json"), JSON.stringify({ telegram: { bots: [{ id: BOT, role: "admin", token: `${BOT}:SECRET` }] } }), "utf-8");
|
|
17
|
+
platformRoot = join(root, "platform");
|
|
18
|
+
destDir = mkdtempSync(join(tmpdir(), "media-"));
|
|
19
|
+
lines = [];
|
|
20
|
+
});
|
|
21
|
+
function deps(fetchImpl) {
|
|
22
|
+
return {
|
|
23
|
+
platformRoot,
|
|
24
|
+
accountId: ACC,
|
|
25
|
+
callId: "beef",
|
|
26
|
+
log: (l) => lines.push(l),
|
|
27
|
+
fetchImpl,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** getFile then the file host, in that order. */
|
|
31
|
+
function twoHop(filePath, bytes) {
|
|
32
|
+
let n = 0;
|
|
33
|
+
return (async () => {
|
|
34
|
+
n += 1;
|
|
35
|
+
return n === 1
|
|
36
|
+
? new Response(JSON.stringify({ ok: true, result: { file_path: filePath } }))
|
|
37
|
+
: new Response(bytes);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
describe("telegramMediaFetch", () => {
|
|
41
|
+
it("writes the bytes and returns the path and count", async () => {
|
|
42
|
+
const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1, 2, 3]))));
|
|
43
|
+
expect(out.isError).toBe(false);
|
|
44
|
+
expect(out.bytes).toBe(3);
|
|
45
|
+
expect(out.path).toBe(join(destDir, "tg-111-F1.jpg"));
|
|
46
|
+
expect(readFileSync(out.path).length).toBe(3);
|
|
47
|
+
});
|
|
48
|
+
it("takes the extension from Telegram's own file_path", async () => {
|
|
49
|
+
const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("voice/a.oga", new Uint8Array([9]))));
|
|
50
|
+
expect(out.path?.endsWith(".oga")).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it("escapes a file_id that would traverse out of the destination", async () => {
|
|
53
|
+
const out = await telegramMediaFetch({ botId: BOT, fileId: "../../etc/passwd", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1]))));
|
|
54
|
+
expect(out.path).toBe(join(destDir, "tg-111-______etc_passwd.jpg"));
|
|
55
|
+
});
|
|
56
|
+
it("reports Telegram's own reason when getFile refuses", async () => {
|
|
57
|
+
const fetchImpl = (async () => new Response(JSON.stringify({ ok: false, description: "file is too big" }), {
|
|
58
|
+
status: 400,
|
|
59
|
+
}));
|
|
60
|
+
const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(fetchImpl));
|
|
61
|
+
expect(out.isError).toBe(true);
|
|
62
|
+
expect(out.text).toContain("file is too big");
|
|
63
|
+
});
|
|
64
|
+
it("emits the media census line carrying the byte count", async () => {
|
|
65
|
+
await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1, 2, 3, 4, 5]))));
|
|
66
|
+
expect(lines.join("\n")).toContain("[telegram-media-census] files=1 bytes=5");
|
|
67
|
+
});
|
|
68
|
+
it("refuses an unknown botId and makes no network call", async () => {
|
|
69
|
+
let called = 0;
|
|
70
|
+
const fetchImpl = (async () => {
|
|
71
|
+
called += 1;
|
|
72
|
+
return new Response("{}");
|
|
73
|
+
});
|
|
74
|
+
const out = await telegramMediaFetch({ botId: "999", fileId: "F1", destDir }, deps(fetchImpl));
|
|
75
|
+
expect(out.isError).toBe(true);
|
|
76
|
+
expect(called).toBe(0);
|
|
77
|
+
});
|
|
78
|
+
it("bounds the fetch, so a hung Telegram cannot hang the tool for ever", async () => {
|
|
79
|
+
// Without a signal this call never returns. Every other Telegram call in
|
|
80
|
+
// this plugin is bounded by callBotApi's 30s default (bot-api.ts:41); the
|
|
81
|
+
// primitives take a signal but default to none, so the bound has to be
|
|
82
|
+
// supplied here and a test is the only thing that proves it was.
|
|
83
|
+
const hangs = ((_url, init) => new Promise((_resolve, reject) => {
|
|
84
|
+
init.signal?.addEventListener("abort", () => reject(new Error("aborted")));
|
|
85
|
+
}));
|
|
86
|
+
const out = await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, { ...deps(hangs), timeoutMs: 40 });
|
|
87
|
+
expect(out.isError).toBe(true);
|
|
88
|
+
expect(out.text).toContain("aborted");
|
|
89
|
+
});
|
|
90
|
+
it("never puts the token in a log line", async () => {
|
|
91
|
+
await telegramMediaFetch({ botId: BOT, fileId: "F1", destDir }, deps(twoHop("photos/a.jpg", new Uint8Array([1]))));
|
|
92
|
+
expect(lines.join("\n")).not.toContain("SECRET");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=media-fetch-tool.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-fetch-tool.test.js","sourceRoot":"","sources":["../../src/__tests__/media-fetch-tool.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-send-tool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/media-send-tool.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,293 @@
|
|
|
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 { telegramMediaSend, MEDIA_SEND_METHOD } from "../tools/media-send.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
|
+
/** Unlike the other tool recorders this one must see BOTH body shapes: the
|
|
20
|
+
* whole point of the tool is that a file_id goes as JSON and a local path goes
|
|
21
|
+
* as multipart, and a recorder that JSON.parses blindly cannot tell them
|
|
22
|
+
* apart. */
|
|
23
|
+
function recorder(reply) {
|
|
24
|
+
const calls = [];
|
|
25
|
+
const fetchImpl = (async (url, init) => {
|
|
26
|
+
const isForm = init.body instanceof FormData;
|
|
27
|
+
calls.push({
|
|
28
|
+
method: String(url).split("/").pop() ?? "",
|
|
29
|
+
body: isForm ? null : JSON.parse(String(init.body)),
|
|
30
|
+
form: isForm ? init.body : null,
|
|
31
|
+
});
|
|
32
|
+
return new Response(JSON.stringify(reply));
|
|
33
|
+
});
|
|
34
|
+
return { calls, fetchImpl };
|
|
35
|
+
}
|
|
36
|
+
function deps(fetchImpl) {
|
|
37
|
+
return {
|
|
38
|
+
platformRoot,
|
|
39
|
+
accountId: ACC,
|
|
40
|
+
callId: "cafe",
|
|
41
|
+
log: (l) => lines.push(l),
|
|
42
|
+
fetchImpl,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function tempFile(name) {
|
|
46
|
+
const path = join(mkdtempSync(join(tmpdir(), "media-")), name);
|
|
47
|
+
writeFileSync(path, "BYTES");
|
|
48
|
+
return path;
|
|
49
|
+
}
|
|
50
|
+
describe("MEDIA_SEND_METHOD", () => {
|
|
51
|
+
it("maps every kind to its Bot API method name", () => {
|
|
52
|
+
expect(MEDIA_SEND_METHOD).toEqual({
|
|
53
|
+
photo: "sendPhoto",
|
|
54
|
+
document: "sendDocument",
|
|
55
|
+
video: "sendVideo",
|
|
56
|
+
audio: "sendAudio",
|
|
57
|
+
voice: "sendVoice",
|
|
58
|
+
animation: "sendAnimation",
|
|
59
|
+
videoNote: "sendVideoNote",
|
|
60
|
+
group: "sendMediaGroup",
|
|
61
|
+
editMedia: "editMessageMedia",
|
|
62
|
+
editCaption: "editMessageCaption",
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("telegramMediaSend routes", () => {
|
|
67
|
+
it("sends a file_id as a plain string in a JSON body", async () => {
|
|
68
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
|
|
69
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 9, kind: "photo", fileId: "AgACAgQ" }, deps(fetchImpl));
|
|
70
|
+
expect(out.route).toBe("file-id");
|
|
71
|
+
expect(calls[0]?.form).toBeNull();
|
|
72
|
+
expect(calls[0]?.body).toEqual({ chat_id: 9, photo: "AgACAgQ" });
|
|
73
|
+
});
|
|
74
|
+
it("sends an https URL as a plain string in a JSON body", async () => {
|
|
75
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
|
|
76
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 9, kind: "document", url: "https://example.com/spec.pdf" }, deps(fetchImpl));
|
|
77
|
+
expect(out.route).toBe("url");
|
|
78
|
+
expect(calls[0]?.form).toBeNull();
|
|
79
|
+
expect(calls[0]?.body).toEqual({ chat_id: 9, document: "https://example.com/spec.pdf" });
|
|
80
|
+
});
|
|
81
|
+
it("sends a local path as a multipart file part", async () => {
|
|
82
|
+
const path = tempFile("before.jpg");
|
|
83
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
|
|
84
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 9, kind: "photo", filePath: path, caption: "Before" }, deps(fetchImpl));
|
|
85
|
+
expect(out.route).toBe("multipart");
|
|
86
|
+
const form = calls[0]?.form;
|
|
87
|
+
expect(form).toBeInstanceOf(FormData);
|
|
88
|
+
expect(form?.get("chat_id")).toBe("9");
|
|
89
|
+
expect(form?.get("caption")).toBe("Before");
|
|
90
|
+
expect(form?.get("photo")).toBeInstanceOf(Blob);
|
|
91
|
+
});
|
|
92
|
+
it("uses the method's own field name for the file", async () => {
|
|
93
|
+
for (const [kind, field] of [
|
|
94
|
+
["video", "video"],
|
|
95
|
+
["audio", "audio"],
|
|
96
|
+
["voice", "voice"],
|
|
97
|
+
["animation", "animation"],
|
|
98
|
+
["videoNote", "video_note"],
|
|
99
|
+
]) {
|
|
100
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
|
|
101
|
+
await telegramMediaSend({ botId: BOT, chatId: 1, kind, fileId: "F" }, deps(fetchImpl));
|
|
102
|
+
expect(calls[0]?.body).toEqual({ chat_id: 1, [field]: "F" });
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("telegramMediaSend refusals", () => {
|
|
107
|
+
it("refuses a send with no source, before any network call", async () => {
|
|
108
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: {} });
|
|
109
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo" }, deps(fetchImpl));
|
|
110
|
+
expect(out.isError).toBe(true);
|
|
111
|
+
expect(out.text).toContain("fileId");
|
|
112
|
+
expect(calls.length).toBe(0);
|
|
113
|
+
});
|
|
114
|
+
it("refuses two sources at once, before any network call", async () => {
|
|
115
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: {} });
|
|
116
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo", fileId: "A", url: "https://x/y.jpg" }, deps(fetchImpl));
|
|
117
|
+
expect(out.isError).toBe(true);
|
|
118
|
+
expect(calls.length).toBe(0);
|
|
119
|
+
});
|
|
120
|
+
it("refuses a video note by URL, which Telegram does not support", async () => {
|
|
121
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: {} });
|
|
122
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "videoNote", url: "https://x/y.mp4" }, deps(fetchImpl));
|
|
123
|
+
expect(out.isError).toBe(true);
|
|
124
|
+
expect(out.text).toContain("video note");
|
|
125
|
+
expect(calls.length).toBe(0);
|
|
126
|
+
});
|
|
127
|
+
it("refuses a batch of one, which Telegram documents as 2-10 items", async () => {
|
|
128
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: [] });
|
|
129
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 4, kind: "group", items: [{ type: "photo", fileId: "A" }] }, deps(fetchImpl));
|
|
130
|
+
expect(out.isError).toBe(true);
|
|
131
|
+
expect(calls.length).toBe(0);
|
|
132
|
+
});
|
|
133
|
+
it("refuses editMedia with no mediaType, before any network call", async () => {
|
|
134
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: {} });
|
|
135
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 4, kind: "editMedia", messageId: 7, fileId: "A" }, deps(fetchImpl));
|
|
136
|
+
expect(out.isError).toBe(true);
|
|
137
|
+
expect(out.text).toContain("mediaType");
|
|
138
|
+
expect(calls.length).toBe(0);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("telegramMediaSend batches and edits", () => {
|
|
142
|
+
it("wires a mixed batch: file_id inline, local paths as attach:// parts", async () => {
|
|
143
|
+
const path = tempFile("two.jpg");
|
|
144
|
+
const { calls, fetchImpl } = recorder({
|
|
145
|
+
ok: true,
|
|
146
|
+
result: [{ message_id: 1 }, { message_id: 2 }],
|
|
147
|
+
});
|
|
148
|
+
await telegramMediaSend({
|
|
149
|
+
botId: BOT,
|
|
150
|
+
chatId: 4,
|
|
151
|
+
kind: "group",
|
|
152
|
+
items: [
|
|
153
|
+
{ type: "photo", fileId: "AgACAgQ", caption: "one" },
|
|
154
|
+
{ type: "photo", filePath: path },
|
|
155
|
+
],
|
|
156
|
+
}, deps(fetchImpl));
|
|
157
|
+
const form = calls[0]?.form;
|
|
158
|
+
expect(JSON.parse(String(form?.get("media")))).toEqual([
|
|
159
|
+
{ type: "photo", media: "AgACAgQ", caption: "one" },
|
|
160
|
+
{ type: "photo", media: "attach://item1" },
|
|
161
|
+
]);
|
|
162
|
+
expect(form?.get("item1")).toBeInstanceOf(Blob);
|
|
163
|
+
});
|
|
164
|
+
it("sends a batch of already-uploaded files as JSON, with no form at all", async () => {
|
|
165
|
+
const { calls, fetchImpl } = recorder({
|
|
166
|
+
ok: true,
|
|
167
|
+
result: [{ message_id: 1 }, { message_id: 2 }],
|
|
168
|
+
});
|
|
169
|
+
await telegramMediaSend({
|
|
170
|
+
botId: BOT,
|
|
171
|
+
chatId: 4,
|
|
172
|
+
kind: "group",
|
|
173
|
+
items: [
|
|
174
|
+
{ type: "photo", fileId: "A" },
|
|
175
|
+
{ type: "photo", url: "https://x/y.jpg" },
|
|
176
|
+
],
|
|
177
|
+
}, deps(fetchImpl));
|
|
178
|
+
expect(calls[0]?.form).toBeNull();
|
|
179
|
+
expect(calls[0]?.body).toEqual({
|
|
180
|
+
chat_id: 4,
|
|
181
|
+
media: [
|
|
182
|
+
{ type: "photo", media: "A" },
|
|
183
|
+
{ type: "photo", media: "https://x/y.jpg" },
|
|
184
|
+
],
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
it("reports the batch route only when every item agrees, and mixed when they do not", async () => {
|
|
188
|
+
// A single label is a lie for an album whose items chose different ways,
|
|
189
|
+
// and the route field exists to stop a reader looking down the wrong
|
|
190
|
+
// branch. Any local file still makes the whole request multipart.
|
|
191
|
+
const allUrls = recorder({ ok: true, result: [] });
|
|
192
|
+
const a = await telegramMediaSend({
|
|
193
|
+
botId: BOT,
|
|
194
|
+
chatId: 4,
|
|
195
|
+
kind: "group",
|
|
196
|
+
items: [
|
|
197
|
+
{ type: "photo", url: "https://x/1.jpg" },
|
|
198
|
+
{ type: "photo", url: "https://x/2.jpg" },
|
|
199
|
+
],
|
|
200
|
+
}, deps(allUrls.fetchImpl));
|
|
201
|
+
expect(a.route).toBe("url");
|
|
202
|
+
const mixed = recorder({ ok: true, result: [] });
|
|
203
|
+
const b = await telegramMediaSend({
|
|
204
|
+
botId: BOT,
|
|
205
|
+
chatId: 4,
|
|
206
|
+
kind: "group",
|
|
207
|
+
items: [
|
|
208
|
+
{ type: "photo", fileId: "A" },
|
|
209
|
+
{ type: "photo", url: "https://x/2.jpg" },
|
|
210
|
+
],
|
|
211
|
+
}, deps(mixed.fetchImpl));
|
|
212
|
+
expect(b.route).toBe("mixed");
|
|
213
|
+
const withLocal = recorder({ ok: true, result: [] });
|
|
214
|
+
const c = await telegramMediaSend({
|
|
215
|
+
botId: BOT,
|
|
216
|
+
chatId: 4,
|
|
217
|
+
kind: "group",
|
|
218
|
+
items: [
|
|
219
|
+
{ type: "photo", url: "https://x/1.jpg" },
|
|
220
|
+
{ type: "photo", filePath: tempFile("three.jpg") },
|
|
221
|
+
],
|
|
222
|
+
}, deps(withLocal.fetchImpl));
|
|
223
|
+
expect(c.route).toBe("multipart");
|
|
224
|
+
});
|
|
225
|
+
it("withholds the send-envelope options from the two edit kinds", async () => {
|
|
226
|
+
// Telegram's tables carry reply_markup on editMessageMedia and
|
|
227
|
+
// editMessageCaption and none of the send-envelope options, so a caller
|
|
228
|
+
// setting them on an edit must not have them reach the wire.
|
|
229
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 7 } });
|
|
230
|
+
await telegramMediaSend({
|
|
231
|
+
botId: BOT,
|
|
232
|
+
chatId: 4,
|
|
233
|
+
kind: "editCaption",
|
|
234
|
+
messageId: 7,
|
|
235
|
+
caption: "After",
|
|
236
|
+
disableNotification: true,
|
|
237
|
+
protectContent: true,
|
|
238
|
+
replyToMessageId: 3,
|
|
239
|
+
messageThreadId: 8,
|
|
240
|
+
buttons: [[{ text: "Ok", callbackData: "ok" }]],
|
|
241
|
+
}, deps(fetchImpl));
|
|
242
|
+
expect(calls[0]?.body).toEqual({
|
|
243
|
+
chat_id: 4,
|
|
244
|
+
message_id: 7,
|
|
245
|
+
caption: "After",
|
|
246
|
+
reply_markup: { inline_keyboard: [[{ text: "Ok", callback_data: "ok" }]] },
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
it("edits a message's media, naming the type Telegram's InputMedia needs", async () => {
|
|
250
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 7 } });
|
|
251
|
+
await telegramMediaSend({
|
|
252
|
+
botId: BOT,
|
|
253
|
+
chatId: 4,
|
|
254
|
+
kind: "editMedia",
|
|
255
|
+
messageId: 7,
|
|
256
|
+
mediaType: "photo",
|
|
257
|
+
fileId: "AgACAgQ",
|
|
258
|
+
caption: "Replaced",
|
|
259
|
+
}, deps(fetchImpl));
|
|
260
|
+
expect(calls[0]?.method).toBe("editMessageMedia");
|
|
261
|
+
expect(calls[0]?.body).toEqual({
|
|
262
|
+
chat_id: 4,
|
|
263
|
+
message_id: 7,
|
|
264
|
+
media: { type: "photo", media: "AgACAgQ", caption: "Replaced" },
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
it("edits a caption with no media route at all", async () => {
|
|
268
|
+
const { calls, fetchImpl } = recorder({ ok: true, result: { message_id: 7 } });
|
|
269
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 4, kind: "editCaption", messageId: 7, caption: "After" }, deps(fetchImpl));
|
|
270
|
+
expect(out.route).toBe("none");
|
|
271
|
+
expect(calls[0]?.body).toEqual({ chat_id: 4, message_id: 7, caption: "After" });
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe("telegramMediaSend observability", () => {
|
|
275
|
+
it("puts the route on the op=call line", async () => {
|
|
276
|
+
const { fetchImpl } = recorder({ ok: true, result: { message_id: 1 } });
|
|
277
|
+
await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo", fileId: "A" }, deps(fetchImpl));
|
|
278
|
+
expect(lines.join("\n")).toContain("op=call tool=telegram-media-send method=sendPhoto callId=cafe");
|
|
279
|
+
expect(lines.join("\n")).toContain("route=file-id");
|
|
280
|
+
expect(lines.join("\n")).toContain("op=result callId=cafe");
|
|
281
|
+
});
|
|
282
|
+
it("relays Telegram's refusal unaltered", async () => {
|
|
283
|
+
const { fetchImpl } = recorder({
|
|
284
|
+
ok: false,
|
|
285
|
+
error_code: 400,
|
|
286
|
+
description: "Bad Request: wrong file identifier/HTTP URL specified",
|
|
287
|
+
});
|
|
288
|
+
const out = await telegramMediaSend({ botId: BOT, chatId: 1, kind: "photo", fileId: "nope" }, deps(fetchImpl));
|
|
289
|
+
expect(out.isError).toBe(true);
|
|
290
|
+
expect(out.text).toContain("wrong file identifier");
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=media-send-tool.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-send-tool.test.js","sourceRoot":"","sources":["../../src/__tests__/media-send-tool.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schemas.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { ASK_SHAPE, CARD_SHAPE, INVOICE_SHAPE, MEDIA_FETCH_SHAPE, MEDIA_SEND_SHAPE, THREAD_SHAPE, } from "../tools/schemas.js";
|
|
4
|
+
const card = z.object(CARD_SHAPE);
|
|
5
|
+
const mediaFetch = z.object(MEDIA_FETCH_SHAPE);
|
|
6
|
+
const thread = z.object(THREAD_SHAPE);
|
|
7
|
+
const ask = z.object(ASK_SHAPE);
|
|
8
|
+
const mediaSend = z.object(MEDIA_SEND_SHAPE);
|
|
9
|
+
const invoice = z.object(INVOICE_SHAPE);
|
|
10
|
+
describe("CARD_SHAPE", () => {
|
|
11
|
+
it("accepts a minimal valid card", () => {
|
|
12
|
+
expect(card.safeParse({ botId: "111", chatId: 222, text: "hi" }).success).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it("rejects a card with no text, naming the field", () => {
|
|
15
|
+
const out = card.safeParse({ botId: "111", chatId: 222 });
|
|
16
|
+
expect(out.success).toBe(false);
|
|
17
|
+
expect(JSON.stringify(out.error?.issues)).toContain("text");
|
|
18
|
+
});
|
|
19
|
+
it("rejects a card with no botId", () => {
|
|
20
|
+
expect(card.safeParse({ chatId: 222, text: "hi" }).success).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it("rejects a parseMode outside the three Telegram documents", () => {
|
|
23
|
+
expect(card.safeParse({ botId: "1", chatId: 2, text: "t", parseMode: "rtf" }).success).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it("rejects a button row that is not an array of rows", () => {
|
|
26
|
+
expect(card.safeParse({ botId: "1", chatId: 2, text: "t", buttons: [{ text: "flat" }] }).success).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it("rejects a button with no label", () => {
|
|
29
|
+
expect(card.safeParse({ botId: "1", chatId: 2, text: "t", buttons: [[{ callbackData: "x" }]] })
|
|
30
|
+
.success).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
it("accepts either a string or a number chatId, which Telegram documents as both", () => {
|
|
33
|
+
expect(card.safeParse({ botId: "1", chatId: "@chan", text: "t" }).success).toBe(true);
|
|
34
|
+
expect(card.safeParse({ botId: "1", chatId: -100123, text: "t" }).success).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("MEDIA_FETCH_SHAPE", () => {
|
|
38
|
+
it("accepts botId plus fileId", () => {
|
|
39
|
+
expect(mediaFetch.safeParse({ botId: "111", fileId: "F" }).success).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it("rejects a fetch with no fileId", () => {
|
|
42
|
+
const out = mediaFetch.safeParse({ botId: "111" });
|
|
43
|
+
expect(out.success).toBe(false);
|
|
44
|
+
expect(JSON.stringify(out.error?.issues)).toContain("fileId");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("THREAD_SHAPE", () => {
|
|
48
|
+
it("accepts a create with a name", () => {
|
|
49
|
+
expect(thread.safeParse({ botId: "1", chatId: 2, action: "create", name: "Job" }).success).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it("rejects an action Telegram has no method for", () => {
|
|
52
|
+
expect(thread.safeParse({ botId: "1", chatId: 2, action: "archive" }).success).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it("rejects a messageThreadId that is not a number", () => {
|
|
55
|
+
expect(thread.safeParse({ botId: "1", chatId: 2, action: "close", messageThreadId: "9" }).success).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("ASK_SHAPE", () => {
|
|
59
|
+
it("accepts a minimal poll", () => {
|
|
60
|
+
expect(ask.safeParse({ botId: "1", chatId: 2, kind: "poll", question: "q", options: ["a"] }).success).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
it("rejects a kind Telegram has no method for", () => {
|
|
63
|
+
expect(ask.safeParse({ botId: "1", chatId: 2, kind: "survey" }).success).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
it("rejects a checklist task with no text", () => {
|
|
66
|
+
expect(ask.safeParse({
|
|
67
|
+
botId: "1",
|
|
68
|
+
chatId: 2,
|
|
69
|
+
kind: "checklist",
|
|
70
|
+
businessConnectionId: "b",
|
|
71
|
+
checklist: { title: "t", tasks: [{ id: 1 }] },
|
|
72
|
+
}).success).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
it("rejects a latitude that is not a number", () => {
|
|
75
|
+
expect(ask.safeParse({ botId: "1", chatId: 2, kind: "location", latitude: "51.5", longitude: -0.1 })
|
|
76
|
+
.success).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("MEDIA_SEND_SHAPE", () => {
|
|
80
|
+
it("accepts a photo by file_id", () => {
|
|
81
|
+
expect(mediaSend.safeParse({ botId: "1", chatId: 2, kind: "photo", fileId: "A" }).success).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it("rejects a kind Telegram has no method for", () => {
|
|
84
|
+
expect(mediaSend.safeParse({ botId: "1", chatId: 2, kind: "sticker", fileId: "A" }).success).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
it("rejects a batch item with no type", () => {
|
|
87
|
+
expect(mediaSend.safeParse({ botId: "1", chatId: 2, kind: "group", items: [{ fileId: "A" }] })
|
|
88
|
+
.success).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe("INVOICE_SHAPE", () => {
|
|
92
|
+
it("accepts a Stars invoice", () => {
|
|
93
|
+
expect(invoice.safeParse({
|
|
94
|
+
botId: "1",
|
|
95
|
+
action: "send",
|
|
96
|
+
chatId: 2,
|
|
97
|
+
title: "t",
|
|
98
|
+
description: "d",
|
|
99
|
+
payload: "p",
|
|
100
|
+
currency: "XTR",
|
|
101
|
+
prices: [{ label: "l", amount: 1 }],
|
|
102
|
+
}).success).toBe(true);
|
|
103
|
+
});
|
|
104
|
+
it("rejects an action Telegram has no method for", () => {
|
|
105
|
+
expect(invoice.safeParse({ botId: "1", action: "chargeback" }).success).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
it("rejects a price with no amount", () => {
|
|
108
|
+
expect(invoice.safeParse({
|
|
109
|
+
botId: "1",
|
|
110
|
+
action: "link",
|
|
111
|
+
title: "t",
|
|
112
|
+
description: "d",
|
|
113
|
+
payload: "p",
|
|
114
|
+
currency: "XTR",
|
|
115
|
+
prices: [{ label: "l" }],
|
|
116
|
+
}).success).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("the shapes and telegram-api's own params field", () => {
|
|
120
|
+
it("names every field, unlike the passthrough's z.record(z.unknown())", () => {
|
|
121
|
+
// The defect Task 2588 exists to fix: a passthrough params object accepts
|
|
122
|
+
// anything at all, so a typo reaches the wire. Each typed shape must reject
|
|
123
|
+
// a body that carries only an unknown key.
|
|
124
|
+
for (const shape of [card, mediaFetch, thread, ask, mediaSend, invoice]) {
|
|
125
|
+
expect(shape.safeParse({ nonsense: true }).success).toBe(false);
|
|
126
|
+
}
|
|
127
|
+
expect(z.record(z.unknown()).safeParse({ nonsense: true }).success).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=schemas.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../src/__tests__/schemas.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-tool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-tool.test.ts"],"names":[],"mappings":""}
|