@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,134 @@
|
|
|
1
|
+
import { callBotApi } from "../lib/bot-api.js";
|
|
2
|
+
import { listRegisteredBots, resolveBotToken } from "../lib/account-token.js";
|
|
3
|
+
import { buildInlineKeyboard } from "../lib/telegram.js";
|
|
4
|
+
import { cardKey, readCardId, writeCardId } from "../lib/card-store.js";
|
|
5
|
+
const TAG = "[telegram-tools]";
|
|
6
|
+
const TOOL = "telegram-card";
|
|
7
|
+
/** Telegram's answer when the new text and markup match the old. It is a no-op,
|
|
8
|
+
* not a failure to retry, and an idempotent card re-post is the normal case
|
|
9
|
+
* rather than an error. This is the ONE place this plugin does not relay
|
|
10
|
+
* Telegram's verdict as an error. */
|
|
11
|
+
const NOT_MODIFIED = "message is not modified";
|
|
12
|
+
/** Post a card, or edit the one this key already names.
|
|
13
|
+
*
|
|
14
|
+
* Absorbs sendMessage, editMessageText, editMessageReplyMarkup and
|
|
15
|
+
* answerCallbackQuery behind one typed schema. Task 2588: the passthrough gave
|
|
16
|
+
* the model no field names for any of them, so a malformed call was only
|
|
17
|
+
* caught by Telegram's 400. */
|
|
18
|
+
export async function telegramCard(p, deps) {
|
|
19
|
+
const { callId, log } = deps;
|
|
20
|
+
if (!deps.accountId) {
|
|
21
|
+
log(`${TAG} op=no-account callId=${callId} tool=${TOOL}`);
|
|
22
|
+
return {
|
|
23
|
+
ok: false,
|
|
24
|
+
isError: true,
|
|
25
|
+
outcome: "none",
|
|
26
|
+
text: "telegram-card cannot execute: this MCP instance was launched without ACCOUNT_ID " +
|
|
27
|
+
"(plugin-system metadata-only mode). Per-account bot tokens require ACCOUNT_ID at spawn.",
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const token = resolveBotToken(deps.platformRoot, deps.accountId, p.botId);
|
|
31
|
+
if (!token) {
|
|
32
|
+
const known = listRegisteredBots(deps.platformRoot, deps.accountId);
|
|
33
|
+
log(`${TAG} op=no-bot callId=${callId} tool=${TOOL} account=${deps.accountId} botId=${p.botId} registered=${known.length}`);
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
isError: true,
|
|
37
|
+
outcome: "none",
|
|
38
|
+
text: known.length
|
|
39
|
+
? `No bot "${p.botId}" is registered on this account. Registered: ${known
|
|
40
|
+
.map((b) => `${b.id} (${b.role})`)
|
|
41
|
+
.join(", ")}.`
|
|
42
|
+
: "No Telegram bot is registered on this account. Run the telegram:configure skill first.",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const markup = p.buttons ? buildInlineKeyboard(p.buttons) : undefined;
|
|
46
|
+
const stored = p.key
|
|
47
|
+
? readCardId(deps.platformRoot, deps.accountId, cardKey(p.botId, p.chatId, p.key))
|
|
48
|
+
: null;
|
|
49
|
+
const common = {
|
|
50
|
+
chat_id: p.chatId,
|
|
51
|
+
text: p.text,
|
|
52
|
+
parse_mode: p.parseMode ?? "HTML",
|
|
53
|
+
...(markup ? { reply_markup: markup } : {}),
|
|
54
|
+
...(p.disablePreview ? { link_preview_options: { is_disabled: true } } : {}),
|
|
55
|
+
};
|
|
56
|
+
const method = stored === null ? "sendMessage" : "editMessageText";
|
|
57
|
+
const body = stored === null ? common : { ...common, message_id: stored };
|
|
58
|
+
log(`${TAG} op=call tool=${TOOL} method=${method} callId=${callId} botId=${p.botId}`);
|
|
59
|
+
let envelope;
|
|
60
|
+
try {
|
|
61
|
+
envelope = await callBotApi(token, method, body, {
|
|
62
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
67
|
+
log(`${TAG} op=error callId=${callId} tool=${TOOL} method=${method} reason="${reason}"`);
|
|
68
|
+
return {
|
|
69
|
+
ok: false,
|
|
70
|
+
isError: true,
|
|
71
|
+
outcome: "none",
|
|
72
|
+
text: `telegram-card could not reach Telegram: ${reason}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
let outcome;
|
|
76
|
+
let sendError = null;
|
|
77
|
+
if (envelope.ok) {
|
|
78
|
+
outcome = stored === null ? "sent" : "edited";
|
|
79
|
+
const id = envelope.result?.message_id;
|
|
80
|
+
// An edit refreshes the entry's timestamp as well as a first post writing
|
|
81
|
+
// it. The store ages a key out after CARD_TTL_MS UNTOUCHED (card-store.ts);
|
|
82
|
+
// without this a card edited every day would still expire seven days after
|
|
83
|
+
// it was created, mid-life.
|
|
84
|
+
if (p.key) {
|
|
85
|
+
const toStore = stored === null ? (typeof id === "number" ? id : null) : stored;
|
|
86
|
+
if (toStore !== null) {
|
|
87
|
+
writeCardId(deps.platformRoot, deps.accountId, cardKey(p.botId, p.chatId, p.key), toStore);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if ((envelope.description ?? "").includes(NOT_MODIFIED)) {
|
|
92
|
+
outcome = "unchanged";
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
outcome = "none";
|
|
96
|
+
sendError = `Telegram refused ${method} (${envelope.error_code ?? "no code"}): ${envelope.description ?? "no description"}`;
|
|
97
|
+
}
|
|
98
|
+
log(`${TAG} op=result callId=${callId} tool=${TOOL} method=${method} ok=${envelope.ok || outcome === "unchanged"} ` +
|
|
99
|
+
`errorCode=${envelope.error_code ?? "-"} description="${envelope.description ?? ""}"`);
|
|
100
|
+
log(`${TAG} op=card callId=${callId} outcome=${outcome}`);
|
|
101
|
+
// AFTER the send, deliberately. Telegram refuses a callback id older than its
|
|
102
|
+
// window, and answering first would let a stale id block the card update,
|
|
103
|
+
// which is the caller's actual work. A failure here is reported, never
|
|
104
|
+
// swallowed and never retried.
|
|
105
|
+
let answerError = null;
|
|
106
|
+
if (p.callbackQueryId) {
|
|
107
|
+
log(`${TAG} op=call tool=${TOOL} method=answerCallbackQuery callId=${callId} botId=${p.botId}`);
|
|
108
|
+
try {
|
|
109
|
+
const ack = await callBotApi(token, "answerCallbackQuery", { callback_query_id: p.callbackQueryId, ...(p.alert ? { show_alert: true } : {}) }, { ...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}) });
|
|
110
|
+
log(`${TAG} op=result callId=${callId} tool=${TOOL} method=answerCallbackQuery ok=${ack.ok}`);
|
|
111
|
+
if (!ack.ok) {
|
|
112
|
+
answerError = `Telegram refused answerCallbackQuery (${ack.error_code ?? "no code"}): ${ack.description ?? "no description"}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
answerError = `answerCallbackQuery could not reach Telegram: ${err instanceof Error ? err.message : String(err)}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (sendError || answerError) {
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
isError: true,
|
|
123
|
+
outcome,
|
|
124
|
+
text: [sendError, answerError].filter(Boolean).join(" "),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const said = outcome === "unchanged"
|
|
128
|
+
? "Card unchanged: the new text and markup match what is already there."
|
|
129
|
+
: outcome === "edited"
|
|
130
|
+
? `Card edited in place (message ${stored}).`
|
|
131
|
+
: `Card sent to ${p.chatId}.`;
|
|
132
|
+
return { ok: true, isError: false, outcome, text: said };
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/tools/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export type InvoiceAction = "send" | "link" | "answerShipping" | "answerPreCheckout" | "balance" | "transactions" | "refund" | "editSubscription";
|
|
2
|
+
/** Action to Bot API method. Verified against the live parameter tables on
|
|
3
|
+
* 2026-08-08. Exported so the census's owned-method map and this tool cannot
|
|
4
|
+
* disagree about which methods the tool owns. */
|
|
5
|
+
export declare const INVOICE_METHOD: Readonly<Record<InvoiceAction, string>>;
|
|
6
|
+
export interface LabeledPrice {
|
|
7
|
+
label: string;
|
|
8
|
+
amount: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ShippingOptionInput {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
prices: LabeledPrice[];
|
|
14
|
+
}
|
|
15
|
+
export interface InvoiceParams {
|
|
16
|
+
botId: string;
|
|
17
|
+
action: InvoiceAction;
|
|
18
|
+
chatId?: string | number;
|
|
19
|
+
title?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
payload?: string;
|
|
22
|
+
providerToken?: string;
|
|
23
|
+
currency?: string;
|
|
24
|
+
prices?: LabeledPrice[];
|
|
25
|
+
subscriptionPeriod?: number;
|
|
26
|
+
maxTipAmount?: number;
|
|
27
|
+
suggestedTipAmounts?: number[];
|
|
28
|
+
photoUrl?: string;
|
|
29
|
+
needName?: boolean;
|
|
30
|
+
needPhoneNumber?: boolean;
|
|
31
|
+
needEmail?: boolean;
|
|
32
|
+
needShippingAddress?: boolean;
|
|
33
|
+
isFlexible?: boolean;
|
|
34
|
+
shippingQueryId?: string;
|
|
35
|
+
preCheckoutQueryId?: string;
|
|
36
|
+
ok?: boolean;
|
|
37
|
+
shippingOptions?: ShippingOptionInput[];
|
|
38
|
+
errorMessage?: string;
|
|
39
|
+
offset?: number;
|
|
40
|
+
limit?: number;
|
|
41
|
+
userId?: number;
|
|
42
|
+
telegramPaymentChargeId?: string;
|
|
43
|
+
isCanceled?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface InvoiceDeps {
|
|
46
|
+
platformRoot: string;
|
|
47
|
+
accountId: string | undefined;
|
|
48
|
+
/** Per-invocation id threading one call's lines together. */
|
|
49
|
+
callId: string;
|
|
50
|
+
log: (line: string) => void;
|
|
51
|
+
fetchImpl?: typeof fetch;
|
|
52
|
+
}
|
|
53
|
+
export interface InvoiceResult {
|
|
54
|
+
ok: boolean;
|
|
55
|
+
text: string;
|
|
56
|
+
isError: boolean;
|
|
57
|
+
/** What was created, for the op=invoice line. `none` covers the six actions
|
|
58
|
+
* that create nothing, and any action Telegram refused. */
|
|
59
|
+
outcome: "sent" | "link" | "none";
|
|
60
|
+
}
|
|
61
|
+
/** Invoices and invoice links, the two checkout answers, and the Telegram Stars
|
|
62
|
+
* balance, transaction list, refund and subscription controls.
|
|
63
|
+
*
|
|
64
|
+
* Task 2594: these eight methods were reachable only through telegram-api,
|
|
65
|
+
* whose untyped params object gave the model no field names for any of them.
|
|
66
|
+
*
|
|
67
|
+
* An invoice created and never paid is a business outcome, not a defect, so
|
|
68
|
+
* op=invoice is one line and no alert. */
|
|
69
|
+
export declare function telegramInvoice(p: InvoiceParams, deps: InvoiceDeps): Promise<InvoiceResult>;
|
|
70
|
+
//# sourceMappingURL=invoice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.d.ts","sourceRoot":"","sources":["../../src/tools/invoice.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,cAAc,GACd,QAAQ,GACR,kBAAkB,CAAC;AAEvB;;kDAEkD;AAClD,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CASjE,CAAC;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB;gEAC4D;IAC5D,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACnC;AAwID;;;;;;;2CAO2C;AAC3C,wBAAsB,eAAe,CACnC,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CAoFxB"}
|
|
@@ -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,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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"}
|