@rubytech/create-maxy-code 0.1.579 → 0.1.581
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/platform-architecture/SKILL.md +13 -1
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +16 -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/docs/references/telegram-guide.md +12 -0
- package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/telegram/PLUGIN.md +27 -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-ratio.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.test.js +75 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-ratio.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 +152 -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 +231 -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__/live-location-store.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.js +93 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-store.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-tool.test.js +76 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/live-location-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 +89 -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 +38 -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-ratio.d.ts +15 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.js +78 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-ratio.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.d.ts +60 -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 +141 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/card-store.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.d.ts +44 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-store.js +88 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/live-location-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 +140 -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/live-location.d.ts +23 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.js +43 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/live-location.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 +171 -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 +7 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.js +15 -1
- package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/{adminuser-self-heal-Y4U3UNKF.js → adminuser-self-heal-ZHFNDKJK.js} +2 -10
- package/payload/server/{chunk-637C2FGE.js → chunk-BFRB2U75.js} +3278 -3381
- package/payload/server/{chunk-6DQCFP2E.js → chunk-BTXRBXMU.js} +3785 -4090
- package/payload/server/{chunk-KVR2FT6O.js → chunk-HYQNUVGO.js} +1 -12
- package/payload/server/{chunk-PGGGWUBM.js → chunk-SKYZG6OT.js} +224 -372
- package/payload/server/{manager-R3XH3BNM.js → manager-CTVTF4YB.js} +3 -3
- package/payload/server/maxy-edge.js +4 -27
- 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-B1lu4-_F.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-B1lu4-_F.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-CkASgYA7.js} +1 -1
- package/payload/server/public/assets/admin-CkASgYA7.js.br +0 -0
- package/payload/server/public/assets/admin-CkASgYA7.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-CKyMT5Ai.js +1 -0
- package/payload/server/public/assets/chat-CKyMT5Ai.js.br +1 -0
- package/payload/server/public/assets/chat-CKyMT5Ai.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-1c33cAHp.js +1 -0
- package/payload/server/public/assets/data-1c33cAHp.js.br +2 -0
- package/payload/server/public/assets/data-1c33cAHp.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-DRn9LITC.js} +1 -1
- package/payload/server/public/assets/operator-DRn9LITC.js.br +0 -0
- package/payload/server/public/assets/operator-DRn9LITC.js.gz +0 -0
- package/payload/server/public/assets/page-BwqQsoU8.js +1 -0
- package/payload/server/public/assets/page-BwqQsoU8.js.br +0 -0
- package/payload/server/public/assets/page-BwqQsoU8.js.gz +0 -0
- package/payload/server/public/assets/{page-B-F08pod.js → page-D_9mPS6W.js} +1 -1
- package/payload/server/public/assets/page-D_9mPS6W.js.br +0 -0
- package/payload/server/public/assets/page-D_9mPS6W.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-CrjZYpdW.js} +1 -1
- package/payload/server/public/assets/public-CrjZYpdW.js.br +0 -0
- package/payload/server/public/assets/public-CrjZYpdW.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-CCK60d2i.js +2 -0
- package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-CCK60d2i.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 +10561 -10491
- package/payload/server/{src-IJCLNFYU.js → src-MM64CYYZ.js} +1 -1
- package/payload/server/{userprofile-reconcile-PUA657YX.js → userprofile-reconcile-TL4JKBPG.js} +1 -8
- 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 +0 -2
- 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,232 @@
|
|
|
1
|
+
import { callBotApi } from "../lib/bot-api.js";
|
|
2
|
+
import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
|
|
3
|
+
const TAG = "[telegram-tools]";
|
|
4
|
+
const TOOL = "telegram-invoice";
|
|
5
|
+
/** Action to Bot API method. Verified against the live parameter tables on
|
|
6
|
+
* 2026-08-08. Exported so the census's owned-method map and this tool cannot
|
|
7
|
+
* disagree about which methods the tool owns. */
|
|
8
|
+
export const INVOICE_METHOD = Object.freeze({
|
|
9
|
+
send: "sendInvoice",
|
|
10
|
+
link: "createInvoiceLink",
|
|
11
|
+
answerShipping: "answerShippingQuery",
|
|
12
|
+
answerPreCheckout: "answerPreCheckoutQuery",
|
|
13
|
+
balance: "getMyStarBalance",
|
|
14
|
+
transactions: "getStarTransactions",
|
|
15
|
+
refund: "refundStarPayment",
|
|
16
|
+
editSubscription: "editUserStarSubscription",
|
|
17
|
+
});
|
|
18
|
+
/** The per-action required fields Zod cannot express in one flat shape, refused
|
|
19
|
+
* BEFORE any network call.
|
|
20
|
+
*
|
|
21
|
+
* `ok` and `isCanceled` are tested against undefined rather than falsiness:
|
|
22
|
+
* false is a meaningful answer to both, and `!p.ok` would refuse the very call
|
|
23
|
+
* that declines an order. */
|
|
24
|
+
function missingField(p) {
|
|
25
|
+
switch (p.action) {
|
|
26
|
+
case "send":
|
|
27
|
+
case "link": {
|
|
28
|
+
if (p.action === "send" && p.chatId === undefined) {
|
|
29
|
+
return "send needs `chatId` (the chat the invoice is posted into). Use action `link` for a payable URL with no chat.";
|
|
30
|
+
}
|
|
31
|
+
if (!p.title)
|
|
32
|
+
return `${p.action} needs \`title\` (the product name, 1-32 characters).`;
|
|
33
|
+
if (!p.description) {
|
|
34
|
+
return `${p.action} needs \`description\` (the product description, 1-255 characters).`;
|
|
35
|
+
}
|
|
36
|
+
if (!p.payload) {
|
|
37
|
+
return `${p.action} needs \`payload\` (your own reference, 1-128 bytes, returned to you on payment).`;
|
|
38
|
+
}
|
|
39
|
+
if (!p.currency) {
|
|
40
|
+
return `${p.action} needs \`currency\` (a three-letter ISO 4217 code, or XTR for Telegram Stars).`;
|
|
41
|
+
}
|
|
42
|
+
if (!p.prices?.length) {
|
|
43
|
+
return `${p.action} needs \`prices\` (the price breakdown; exactly one item for Telegram Stars).`;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
case "answerShipping":
|
|
48
|
+
if (!p.shippingQueryId)
|
|
49
|
+
return "answerShipping needs `shippingQueryId`.";
|
|
50
|
+
if (p.ok === undefined) {
|
|
51
|
+
return "answerShipping needs `ok`: true with `shippingOptions`, or false with `errorMessage`.";
|
|
52
|
+
}
|
|
53
|
+
if (p.ok && !p.shippingOptions?.length) {
|
|
54
|
+
return "answerShipping with ok true needs `shippingOptions`.";
|
|
55
|
+
}
|
|
56
|
+
if (!p.ok && !p.errorMessage) {
|
|
57
|
+
return "answerShipping with ok false needs `errorMessage`, which Telegram shows the payer.";
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
case "answerPreCheckout":
|
|
61
|
+
if (!p.preCheckoutQueryId)
|
|
62
|
+
return "answerPreCheckout needs `preCheckoutQueryId`.";
|
|
63
|
+
if (p.ok === undefined) {
|
|
64
|
+
return "answerPreCheckout needs `ok`: true to proceed, or false with `errorMessage`.";
|
|
65
|
+
}
|
|
66
|
+
if (!p.ok && !p.errorMessage) {
|
|
67
|
+
return "answerPreCheckout with ok false needs `errorMessage`, which Telegram shows the payer.";
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
case "balance":
|
|
71
|
+
case "transactions":
|
|
72
|
+
return null;
|
|
73
|
+
case "refund":
|
|
74
|
+
case "editSubscription": {
|
|
75
|
+
if (p.userId === undefined)
|
|
76
|
+
return `${p.action} needs \`userId\` (the payer's numeric id).`;
|
|
77
|
+
if (!p.telegramPaymentChargeId) {
|
|
78
|
+
return `${p.action} needs \`telegramPaymentChargeId\` (Telegram's own id for the payment).`;
|
|
79
|
+
}
|
|
80
|
+
if (p.action === "editSubscription" && p.isCanceled === undefined) {
|
|
81
|
+
return "editSubscription needs `isCanceled`: true stops the renewal, false re-enables it.";
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** The product fields sendInvoice and createInvoiceLink share. One definition,
|
|
88
|
+
* because an invoice and its link describing different products would be a
|
|
89
|
+
* difference nobody intended. */
|
|
90
|
+
function productBody(p) {
|
|
91
|
+
return {
|
|
92
|
+
title: p.title,
|
|
93
|
+
description: p.description,
|
|
94
|
+
payload: p.payload,
|
|
95
|
+
...(p.providerToken !== undefined ? { provider_token: p.providerToken } : {}),
|
|
96
|
+
currency: p.currency,
|
|
97
|
+
prices: p.prices,
|
|
98
|
+
...(p.maxTipAmount !== undefined ? { max_tip_amount: p.maxTipAmount } : {}),
|
|
99
|
+
...(p.suggestedTipAmounts !== undefined
|
|
100
|
+
? { suggested_tip_amounts: p.suggestedTipAmounts }
|
|
101
|
+
: {}),
|
|
102
|
+
...(p.photoUrl !== undefined ? { photo_url: p.photoUrl } : {}),
|
|
103
|
+
...(p.needName !== undefined ? { need_name: p.needName } : {}),
|
|
104
|
+
...(p.needPhoneNumber !== undefined ? { need_phone_number: p.needPhoneNumber } : {}),
|
|
105
|
+
...(p.needEmail !== undefined ? { need_email: p.needEmail } : {}),
|
|
106
|
+
...(p.needShippingAddress !== undefined
|
|
107
|
+
? { need_shipping_address: p.needShippingAddress }
|
|
108
|
+
: {}),
|
|
109
|
+
...(p.isFlexible !== undefined ? { is_flexible: p.isFlexible } : {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function bodyFor(p) {
|
|
113
|
+
switch (p.action) {
|
|
114
|
+
case "send":
|
|
115
|
+
return { chat_id: p.chatId, ...productBody(p) };
|
|
116
|
+
case "link":
|
|
117
|
+
return {
|
|
118
|
+
...productBody(p),
|
|
119
|
+
...(p.subscriptionPeriod !== undefined
|
|
120
|
+
? { subscription_period: p.subscriptionPeriod }
|
|
121
|
+
: {}),
|
|
122
|
+
};
|
|
123
|
+
case "answerShipping":
|
|
124
|
+
return {
|
|
125
|
+
shipping_query_id: p.shippingQueryId,
|
|
126
|
+
ok: p.ok,
|
|
127
|
+
...(p.shippingOptions !== undefined ? { shipping_options: p.shippingOptions } : {}),
|
|
128
|
+
...(p.errorMessage !== undefined ? { error_message: p.errorMessage } : {}),
|
|
129
|
+
};
|
|
130
|
+
case "answerPreCheckout":
|
|
131
|
+
return {
|
|
132
|
+
pre_checkout_query_id: p.preCheckoutQueryId,
|
|
133
|
+
ok: p.ok,
|
|
134
|
+
...(p.errorMessage !== undefined ? { error_message: p.errorMessage } : {}),
|
|
135
|
+
};
|
|
136
|
+
case "balance":
|
|
137
|
+
return {};
|
|
138
|
+
case "transactions":
|
|
139
|
+
return {
|
|
140
|
+
...(p.offset !== undefined ? { offset: p.offset } : {}),
|
|
141
|
+
...(p.limit !== undefined ? { limit: p.limit } : {}),
|
|
142
|
+
};
|
|
143
|
+
case "refund":
|
|
144
|
+
return { user_id: p.userId, telegram_payment_charge_id: p.telegramPaymentChargeId };
|
|
145
|
+
case "editSubscription":
|
|
146
|
+
return {
|
|
147
|
+
user_id: p.userId,
|
|
148
|
+
telegram_payment_charge_id: p.telegramPaymentChargeId,
|
|
149
|
+
is_canceled: p.isCanceled,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Invoices and invoice links, the two checkout answers, and the Telegram Stars
|
|
154
|
+
* balance, transaction list, refund and subscription controls.
|
|
155
|
+
*
|
|
156
|
+
* Task 2594: these eight methods were reachable only through telegram-api,
|
|
157
|
+
* whose untyped params object gave the model no field names for any of them.
|
|
158
|
+
*
|
|
159
|
+
* An invoice created and never paid is a business outcome, not a defect, so
|
|
160
|
+
* op=invoice is one line and no alert. */
|
|
161
|
+
export async function telegramInvoice(p, deps) {
|
|
162
|
+
const { callId, log } = deps;
|
|
163
|
+
if (!deps.accountId) {
|
|
164
|
+
log(`${TAG} op=no-account callId=${callId} tool=${TOOL}`);
|
|
165
|
+
return {
|
|
166
|
+
ok: false,
|
|
167
|
+
isError: true,
|
|
168
|
+
outcome: "none",
|
|
169
|
+
text: "telegram-invoice cannot execute: this MCP instance was launched without ACCOUNT_ID " +
|
|
170
|
+
"(plugin-system metadata-only mode).",
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const missing = missingField(p);
|
|
174
|
+
if (missing) {
|
|
175
|
+
log(`${TAG} op=refused callId=${callId} tool=${TOOL} action=${p.action} reason=missing-field`);
|
|
176
|
+
return { ok: false, isError: true, outcome: "none", text: missing };
|
|
177
|
+
}
|
|
178
|
+
const token = resolveBotToken(deps.platformRoot, deps.accountId, p.botId);
|
|
179
|
+
if (!token) {
|
|
180
|
+
const known = listRegisteredBots(deps.platformRoot, deps.accountId);
|
|
181
|
+
log(`${TAG} op=no-bot callId=${callId} tool=${TOOL} account=${deps.accountId} botId=${p.botId} registered=${known.length}`);
|
|
182
|
+
return {
|
|
183
|
+
ok: false,
|
|
184
|
+
isError: true,
|
|
185
|
+
outcome: "none",
|
|
186
|
+
text: known.length
|
|
187
|
+
? `No bot "${p.botId}" is registered on this account. Registered: ${known
|
|
188
|
+
.map((b) => `${b.id} (${b.role})`)
|
|
189
|
+
.join(", ")}.`
|
|
190
|
+
: "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const method = INVOICE_METHOD[p.action];
|
|
194
|
+
log(`${TAG} op=call tool=${TOOL} method=${method} callId=${callId} botId=${p.botId}`);
|
|
195
|
+
let envelope;
|
|
196
|
+
try {
|
|
197
|
+
envelope = await callBotApi(token, method, bodyFor(p), {
|
|
198
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
203
|
+
log(`${TAG} op=error callId=${callId} tool=${TOOL} method=${method} reason="${reason}"`);
|
|
204
|
+
return {
|
|
205
|
+
ok: false,
|
|
206
|
+
isError: true,
|
|
207
|
+
outcome: "none",
|
|
208
|
+
text: `telegram-invoice could not reach Telegram: ${reason}`,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
log(`${TAG} op=result callId=${callId} tool=${TOOL} method=${method} ok=${envelope.ok} ` +
|
|
212
|
+
`errorCode=${envelope.error_code ?? "-"} description="${envelope.description ?? ""}"`);
|
|
213
|
+
if (!envelope.ok) {
|
|
214
|
+
return {
|
|
215
|
+
ok: false,
|
|
216
|
+
isError: true,
|
|
217
|
+
outcome: "none",
|
|
218
|
+
text: `Telegram refused ${method} (${envelope.error_code ?? "no code"}): ${envelope.description ?? "no description"}`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const outcome = p.action === "send" ? "sent" : p.action === "link" ? "link" : "none";
|
|
222
|
+
if (outcome !== "none") {
|
|
223
|
+
log(`${TAG} op=invoice callId=${callId} outcome=${outcome}`);
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
ok: true,
|
|
227
|
+
isError: false,
|
|
228
|
+
outcome,
|
|
229
|
+
text: JSON.stringify(envelope.result ?? true, null, 2),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=invoice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../src/tools/invoice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Task 2602 — read where a Telegram live share currently is.
|
|
2
|
+
*
|
|
3
|
+
* Before this, a live share's position reached nothing readable: every ping
|
|
4
|
+
* raised a turn that answered it once and forgot it, and the only other reader
|
|
5
|
+
* was gated on a dispatch config most accounts do not have. Suppressing those
|
|
6
|
+
* turns without this tool would have made the position less reachable than it
|
|
7
|
+
* already was, so the two ship together.
|
|
8
|
+
*/
|
|
9
|
+
export interface LiveLocationToolParams {
|
|
10
|
+
botId: string;
|
|
11
|
+
senderId: string;
|
|
12
|
+
}
|
|
13
|
+
export interface LiveLocationToolContext {
|
|
14
|
+
platformRoot: string;
|
|
15
|
+
accountId: string | undefined;
|
|
16
|
+
now?: number;
|
|
17
|
+
log: (line: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function telegramLiveLocation(params: LiveLocationToolParams, ctx: LiveLocationToolContext): {
|
|
20
|
+
text: string;
|
|
21
|
+
isError?: boolean;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=live-location.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-location.d.ts","sourceRoot":"","sources":["../../src/tools/live-location.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAID,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,uBAAuB,GAC3B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CA8CrC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readLiveLocation, currentLiveLocationKeys, liveLocationKey, } from "../lib/live-location-store.js";
|
|
2
|
+
const TAG = "[telegram-live-location]";
|
|
3
|
+
export function telegramLiveLocation(params, ctx) {
|
|
4
|
+
const now = ctx.now ?? Date.now();
|
|
5
|
+
const { botId, senderId } = params;
|
|
6
|
+
if (!ctx.accountId) {
|
|
7
|
+
ctx.log(`${TAG} op=read botId=${botId} senderId=${senderId} outcome=no-account`);
|
|
8
|
+
return { text: "No account is resolved for this session, so no share can be read.", isError: true };
|
|
9
|
+
}
|
|
10
|
+
const out = readLiveLocation(ctx.platformRoot, ctx.accountId, botId, senderId, now);
|
|
11
|
+
ctx.log(`${TAG} op=read botId=${botId} senderId=${senderId} ` +
|
|
12
|
+
`ageMs=${out.ageMs ?? "none"} outcome=${out.outcome}`);
|
|
13
|
+
if (out.outcome === "expired") {
|
|
14
|
+
// Named, with the numbers behind the refusal. An expired fix is never
|
|
15
|
+
// reported as a position: answering an hours-old point as "where they are"
|
|
16
|
+
// is the failure this refusal exists to prevent.
|
|
17
|
+
return {
|
|
18
|
+
text: `The last position from ${senderId} is ${Math.round((out.ageMs ?? 0) / 1000)}s old, ` +
|
|
19
|
+
`past the share's own live_period. The share has ended, so there is no current position. ` +
|
|
20
|
+
`Ask them to share again if you need one.`,
|
|
21
|
+
isError: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (out.outcome === "absent") {
|
|
25
|
+
const keys = currentLiveLocationKeys(ctx.platformRoot, ctx.accountId, now);
|
|
26
|
+
return {
|
|
27
|
+
text: `No live location is being shared by ${senderId} on bot ${botId}. ` +
|
|
28
|
+
(keys.length > 0
|
|
29
|
+
? `Shares currently active (botId:senderId): ${keys.join(", ")}.`
|
|
30
|
+
: `No share is active on this account.`),
|
|
31
|
+
isError: true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const rec = out.record;
|
|
35
|
+
const measuredAt = new Date(rec.at).toISOString();
|
|
36
|
+
const ageS = Math.round((out.ageMs ?? 0) / 1000);
|
|
37
|
+
return {
|
|
38
|
+
text: `${liveLocationKey(botId, senderId)} is at ${rec.lat},${rec.lon}.\n` +
|
|
39
|
+
`Measured ${measuredAt} (${ageS}s ago, by Telegram's own clock).\n` +
|
|
40
|
+
`The share runs for ${rec.livePeriodS}s from each update; after that this reads as ended.`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=live-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-location.js","sourceRoot":"","sources":["../../src/tools/live-location.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAsBvC,MAAM,GAAG,GAAG,0BAA0B,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAClC,MAA8B,EAC9B,GAA4B;IAE5B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,kBAAkB,KAAK,aAAa,QAAQ,qBAAqB,CAAC,CAAC;QACjF,OAAO,EAAE,IAAI,EAAE,mEAAmE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtG,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpF,GAAG,CAAC,GAAG,CACL,GAAG,GAAG,kBAAkB,KAAK,aAAa,QAAQ,GAAG;QACnD,SAAS,GAAG,CAAC,KAAK,IAAI,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,CACxD,CAAC;IAEF,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9B,sEAAsE;QACtE,2EAA2E;QAC3E,iDAAiD;QACjD,OAAO;YACL,IAAI,EACF,0BAA0B,QAAQ,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS;gBACrF,0FAA0F;gBAC1F,0CAA0C;YAC5C,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC3E,OAAO;YACL,IAAI,EACF,uCAAuC,QAAQ,WAAW,KAAK,IAAI;gBACnE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;oBACd,CAAC,CAAC,6CAA6C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBACjE,CAAC,CAAC,qCAAqC,CAAC;YAC5C,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,MAAO,CAAC;IACxB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EACF,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK;YACpE,YAAY,UAAU,KAAK,IAAI,oCAAoC;YACnE,sBAAsB,GAAG,CAAC,WAAW,qDAAqD;KAC7F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** The directory the inbound path already uses
|
|
2
|
+
* (platform/ui/app/lib/telegram/inbound/media.ts:20). A second media store
|
|
3
|
+
* would be a second thing to clean up. */
|
|
4
|
+
export declare const TELEGRAM_MEDIA_DIR = "/tmp/maxy-media";
|
|
5
|
+
/** Every other Telegram call in this plugin is bounded: `callBotApi` defaults to
|
|
6
|
+
* 30s (bot-api.ts:41). The primitives take a signal but supply no default, so
|
|
7
|
+
* without this the fetch is the one call here that can hang for ever. 45s
|
|
8
|
+
* matches the inbound downloader (ui/app/lib/telegram/inbound/media.ts:37),
|
|
9
|
+
* which is the closer analogue because this is a file transfer, not an API
|
|
10
|
+
* round trip. One signal covers both hops, as it does there. */
|
|
11
|
+
export declare const FETCH_TIMEOUT_MS = 45000;
|
|
12
|
+
export interface MediaFetchParams {
|
|
13
|
+
botId: string;
|
|
14
|
+
fileId: string;
|
|
15
|
+
destDir?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface MediaFetchDeps {
|
|
18
|
+
platformRoot: string;
|
|
19
|
+
accountId: string | undefined;
|
|
20
|
+
/** Per-invocation id threading one call's lines together. */
|
|
21
|
+
callId: string;
|
|
22
|
+
log: (line: string) => void;
|
|
23
|
+
fetchImpl?: typeof fetch;
|
|
24
|
+
/** Overrides FETCH_TIMEOUT_MS. Injected in tests. */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface MediaFetchResult {
|
|
28
|
+
ok: boolean;
|
|
29
|
+
text: string;
|
|
30
|
+
isError: boolean;
|
|
31
|
+
path?: string;
|
|
32
|
+
bytes?: number;
|
|
33
|
+
}
|
|
34
|
+
/** Fetch one Telegram file by `file_id` and hand back a local path.
|
|
35
|
+
*
|
|
36
|
+
* Task 2588: the inbound webhook downloads what arrives
|
|
37
|
+
* (platform/ui/server/routes/telegram.ts:519), but nothing let an agent fetch a
|
|
38
|
+
* `file_id` it learned about later. Names the file from the `file_id`, not
|
|
39
|
+
* `file_unique_id`, which a bare `file_id` does not carry — so this tool cannot
|
|
40
|
+
* use the channel layer's identity-stable name and does not pretend to. */
|
|
41
|
+
export declare function telegramMediaFetch(p: MediaFetchParams, deps: MediaFetchDeps): Promise<MediaFetchResult>;
|
|
42
|
+
//# sourceMappingURL=media-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/media-fetch.ts"],"names":[],"mappings":"AAaA;;2CAE2C;AAC3C,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAEpD;;;;;iEAKiE;AACjE,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;4EAM4E;AAC5E,wBAAsB,kBAAkB,CACtC,CAAC,EAAE,gBAAgB,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAkF3B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { resolveTelegramFile, downloadTelegramFile, extensionFor, pathSafe, } from "../../../../../lib/telegram-media/dist/index.js";
|
|
3
|
+
import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
|
|
4
|
+
const TAG = "[telegram-tools]";
|
|
5
|
+
const MEDIA_TAG = "[telegram-media-census]";
|
|
6
|
+
const TOOL = "telegram-media-fetch";
|
|
7
|
+
/** The directory the inbound path already uses
|
|
8
|
+
* (platform/ui/app/lib/telegram/inbound/media.ts:20). A second media store
|
|
9
|
+
* would be a second thing to clean up. */
|
|
10
|
+
export const TELEGRAM_MEDIA_DIR = "/tmp/maxy-media";
|
|
11
|
+
/** Every other Telegram call in this plugin is bounded: `callBotApi` defaults to
|
|
12
|
+
* 30s (bot-api.ts:41). The primitives take a signal but supply no default, so
|
|
13
|
+
* without this the fetch is the one call here that can hang for ever. 45s
|
|
14
|
+
* matches the inbound downloader (ui/app/lib/telegram/inbound/media.ts:37),
|
|
15
|
+
* which is the closer analogue because this is a file transfer, not an API
|
|
16
|
+
* round trip. One signal covers both hops, as it does there. */
|
|
17
|
+
export const FETCH_TIMEOUT_MS = 45_000;
|
|
18
|
+
/** Fetch one Telegram file by `file_id` and hand back a local path.
|
|
19
|
+
*
|
|
20
|
+
* Task 2588: the inbound webhook downloads what arrives
|
|
21
|
+
* (platform/ui/server/routes/telegram.ts:519), but nothing let an agent fetch a
|
|
22
|
+
* `file_id` it learned about later. Names the file from the `file_id`, not
|
|
23
|
+
* `file_unique_id`, which a bare `file_id` does not carry — so this tool cannot
|
|
24
|
+
* use the channel layer's identity-stable name and does not pretend to. */
|
|
25
|
+
export async function telegramMediaFetch(p, deps) {
|
|
26
|
+
const { callId, log } = deps;
|
|
27
|
+
if (!deps.accountId) {
|
|
28
|
+
log(`${TAG} op=no-account callId=${callId} tool=${TOOL}`);
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
isError: true,
|
|
32
|
+
text: "telegram-media-fetch cannot execute: this MCP instance was launched without " +
|
|
33
|
+
"ACCOUNT_ID (plugin-system metadata-only mode).",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const token = resolveBotToken(deps.platformRoot, deps.accountId, p.botId);
|
|
37
|
+
if (!token) {
|
|
38
|
+
const known = listRegisteredBots(deps.platformRoot, deps.accountId);
|
|
39
|
+
log(`${TAG} op=no-bot callId=${callId} tool=${TOOL} account=${deps.accountId} botId=${p.botId} registered=${known.length}`);
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
isError: true,
|
|
43
|
+
text: known.length
|
|
44
|
+
? `No bot "${p.botId}" is registered on this account. Registered: ${known
|
|
45
|
+
.map((b) => `${b.id} (${b.role})`)
|
|
46
|
+
.join(", ")}.`
|
|
47
|
+
: "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const dir = p.destDir ?? TELEGRAM_MEDIA_DIR;
|
|
51
|
+
// One signal for both hops: the ceiling is on the whole fetch.
|
|
52
|
+
const signal = AbortSignal.timeout(deps.timeoutMs ?? FETCH_TIMEOUT_MS);
|
|
53
|
+
log(`${TAG} op=call tool=${TOOL} method=getFile callId=${callId} botId=${p.botId}`);
|
|
54
|
+
const meta = await resolveTelegramFile({
|
|
55
|
+
token,
|
|
56
|
+
fileId: p.fileId,
|
|
57
|
+
signal,
|
|
58
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
59
|
+
});
|
|
60
|
+
if (!meta.ok) {
|
|
61
|
+
log(`${TAG} op=result callId=${callId} tool=${TOOL} method=getFile ok=false description="${meta.failure}"`);
|
|
62
|
+
return {
|
|
63
|
+
ok: false,
|
|
64
|
+
isError: true,
|
|
65
|
+
text: `Telegram would not resolve that file_id: ${meta.failure}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const path = join(dir, `tg-${pathSafe(p.botId)}-${pathSafe(p.fileId)}.${extensionFor(meta.filePath, undefined)}`);
|
|
69
|
+
const got = await downloadTelegramFile({
|
|
70
|
+
token,
|
|
71
|
+
filePath: meta.filePath,
|
|
72
|
+
destPath: path,
|
|
73
|
+
signal,
|
|
74
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
75
|
+
});
|
|
76
|
+
if (!got.ok) {
|
|
77
|
+
log(`${TAG} op=result callId=${callId} tool=${TOOL} method=getFile ok=false description="${got.failure}"`);
|
|
78
|
+
return { ok: false, isError: true, text: `That file did not download: ${got.failure}` };
|
|
79
|
+
}
|
|
80
|
+
log(`${TAG} op=result callId=${callId} tool=${TOOL} method=getFile ok=true`);
|
|
81
|
+
// The measured post-condition, one line per fetch. `files` rising while
|
|
82
|
+
// conversations end is the leak signature.
|
|
83
|
+
log(`${MEDIA_TAG} files=1 bytes=${got.bytes} path=${path}`);
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
isError: false,
|
|
87
|
+
text: `Saved to ${path} (${got.bytes} bytes).`,
|
|
88
|
+
path,
|
|
89
|
+
bytes: got.bytes,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=media-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-fetch.js","sourceRoot":"","sources":["../../src/tools/media-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type InlineKeyboardButtonInput } from "../lib/telegram.js";
|
|
2
|
+
export type MediaKind = "photo" | "document" | "video" | "audio" | "voice" | "animation" | "videoNote" | "group" | "editMedia" | "editCaption";
|
|
3
|
+
/** Kind to Bot API method. Verified against the live parameter tables on
|
|
4
|
+
* 2026-08-08. Exported so the census's owned-method map and this tool cannot
|
|
5
|
+
* disagree about which methods the tool owns. */
|
|
6
|
+
export declare const MEDIA_SEND_METHOD: Readonly<Record<MediaKind, string>>;
|
|
7
|
+
export type MediaRoute = "file-id" | "url" | "multipart";
|
|
8
|
+
export interface MediaItem {
|
|
9
|
+
type: "photo" | "video" | "document" | "audio";
|
|
10
|
+
fileId?: string;
|
|
11
|
+
url?: string;
|
|
12
|
+
filePath?: string;
|
|
13
|
+
caption?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MediaSendParams {
|
|
16
|
+
botId: string;
|
|
17
|
+
chatId: string | number;
|
|
18
|
+
kind: MediaKind;
|
|
19
|
+
fileId?: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
filePath?: string;
|
|
22
|
+
items?: MediaItem[];
|
|
23
|
+
mediaType?: "photo" | "video" | "document" | "audio" | "animation";
|
|
24
|
+
caption?: string;
|
|
25
|
+
parseMode?: "HTML" | "Markdown" | "MarkdownV2";
|
|
26
|
+
showCaptionAboveMedia?: boolean;
|
|
27
|
+
hasSpoiler?: boolean;
|
|
28
|
+
duration?: number;
|
|
29
|
+
width?: number;
|
|
30
|
+
height?: number;
|
|
31
|
+
length?: number;
|
|
32
|
+
performer?: string;
|
|
33
|
+
title?: string;
|
|
34
|
+
supportsStreaming?: boolean;
|
|
35
|
+
messageId?: number;
|
|
36
|
+
buttons?: InlineKeyboardButtonInput[][];
|
|
37
|
+
replyToMessageId?: number;
|
|
38
|
+
messageThreadId?: number;
|
|
39
|
+
disableNotification?: boolean;
|
|
40
|
+
protectContent?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface MediaSendDeps {
|
|
43
|
+
platformRoot: string;
|
|
44
|
+
accountId: string | undefined;
|
|
45
|
+
/** Per-invocation id threading one call's lines together. */
|
|
46
|
+
callId: string;
|
|
47
|
+
log: (line: string) => void;
|
|
48
|
+
fetchImpl?: typeof fetch;
|
|
49
|
+
}
|
|
50
|
+
export interface MediaSendResult {
|
|
51
|
+
ok: boolean;
|
|
52
|
+
text: string;
|
|
53
|
+
isError: boolean;
|
|
54
|
+
/** Which of Telegram's three documented ways of naming a file was used.
|
|
55
|
+
* `mixed` is an album whose items chose different ways and carried no local
|
|
56
|
+
* file; `none` is editCaption, which carries no file at all. */
|
|
57
|
+
route: MediaRoute | "mixed" | "none";
|
|
58
|
+
}
|
|
59
|
+
export interface MediaRequest {
|
|
60
|
+
body: Record<string, unknown>;
|
|
61
|
+
/** Bot API field name to absolute local path. Its presence is what switches
|
|
62
|
+
* callBotApi to multipart. */
|
|
63
|
+
files: Record<string, string> | undefined;
|
|
64
|
+
route: MediaRoute | "mixed" | "none";
|
|
65
|
+
}
|
|
66
|
+
/** Photos, documents, video, audio, voice notes, animations, video notes and
|
|
67
|
+
* albums, plus editing a message's media or its caption.
|
|
68
|
+
*
|
|
69
|
+
* Task 2594: these ten methods were reachable only through telegram-api, whose
|
|
70
|
+
* untyped params object gave the model no field names for any of them.
|
|
71
|
+
*
|
|
72
|
+
* A group's route is `multipart` when any item is a local file and `file-id`
|
|
73
|
+
* otherwise, because one album is one request: a batch with a single local
|
|
74
|
+
* photo in it goes up as multipart in its entirety. */
|
|
75
|
+
export declare function telegramMediaSend(p: MediaSendParams, deps: MediaSendDeps): Promise<MediaSendResult>;
|
|
76
|
+
//# sourceMappingURL=media-send.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-send.d.ts","sourceRoot":"","sources":["../../src/tools/media-send.ts"],"names":[],"mappings":"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"}
|