@xopcai/xopc 0.0.29 → 0.0.31
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/dist/extensions/telegram/src/adapters/config-surface.js +3 -1
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
- package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
- package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
- package/dist/extensions/telegram/src/config-schema.js +17 -4
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.js +4 -17
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
- package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
- package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
- package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
- package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
- package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
- package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
- package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
- package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
- package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
- package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +5 -7
- package/dist/src/agent/agent-manager.js +21 -19
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +4 -2
- package/dist/src/agent/ipc/inbox.js.map +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
- package/dist/src/agent/prompt/system-prompt.js +3 -17
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/btw-query.d.ts +16 -0
- package/dist/src/agent/service/btw-query.js +88 -0
- package/dist/src/agent/service/btw-query.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
- package/dist/src/agent/service/build-direct-message-content.js +75 -0
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
- package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
- package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
- package/dist/src/agent/service/process-direct-one-shot.js +67 -0
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +12 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
- package/dist/src/agent/service/session-context-report.d.ts +19 -0
- package/dist/src/agent/service/session-context-report.js +47 -0
- package/dist/src/agent/service/session-context-report.js.map +1 -0
- package/dist/src/agent/service/webchat-tts.d.ts +28 -0
- package/dist/src/agent/service/webchat-tts.js +73 -0
- package/dist/src/agent/service/webchat-tts.js.map +1 -0
- package/dist/src/agent/service.d.ts +8 -12
- package/dist/src/agent/service.js +74 -379
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/config.js +4 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
- package/dist/src/agent/skills/format-skills-prompt.js +3 -24
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-lock.js +4 -5
- package/dist/src/agent/skills/hub-lock.js.map +1 -1
- package/dist/src/agent/skills/index.js +9 -21
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
- package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
- package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
- package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
- package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
- package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
- package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
- package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
- package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
- package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
- package/dist/src/agent/skills/skill-view-path.js +66 -3
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
- package/dist/src/agent/skills/skills-marketplace.js +18 -0
- package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
- package/dist/src/agent/skills/test-framework.d.ts +0 -1
- package/dist/src/agent/skills/test-framework.js +2 -20
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/skills/types.d.ts +12 -6
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +2 -2
- package/dist/src/auth/credentials.js +8 -6
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/profiles/store.js +5 -3
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/channels/manager.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +4 -4
- package/dist/src/channels/outbound/persist-store.js.map +1 -1
- package/dist/src/cli/commands/config.js +8 -6
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/config/loader.js +3 -1
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.js +4 -5
- package/dist/src/config/models-json.js.map +1 -1
- package/dist/src/config/schema.d.ts +12 -4
- package/dist/src/config/schema.js +31 -5
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/cron/persistence.d.ts +1 -3
- package/dist/src/cron/persistence.js +6 -17
- package/dist/src/cron/persistence.js.map +1 -1
- package/dist/src/cron/validation.js +1 -1
- package/dist/src/cron/validation.js.map +1 -1
- package/dist/src/extensions/activation-context.js +0 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/lockfile.js +4 -2
- package/dist/src/extensions/lockfile.js.map +1 -1
- package/dist/src/gateway/auth.d.ts +0 -9
- package/dist/src/gateway/auth.js +1 -12
- package/dist/src/gateway/auth.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +4 -4
- package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +5 -3
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +23 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +124 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +9 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/index.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
- package/dist/src/gateway/service/run-gateway-agent.js +163 -0
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
- package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
- package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
- package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
- package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
- package/dist/src/gateway/service/session-chat-ids.js +33 -0
- package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
- package/dist/src/gateway/service/sse-hub.d.ts +10 -0
- package/dist/src/gateway/service/sse-hub.js +55 -0
- package/dist/src/gateway/service/sse-hub.js.map +1 -0
- package/dist/src/gateway/service/types.d.ts +9 -0
- package/dist/src/gateway/service/types.js +1 -0
- package/dist/src/gateway/service.d.ts +42 -33
- package/dist/src/gateway/service.js +92 -246
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/infra/update-lock.js +4 -2
- package/dist/src/infra/update-lock.js.map +1 -1
- package/dist/src/infra/update-startup.js +5 -14
- package/dist/src/infra/update-startup.js.map +1 -1
- package/dist/src/infra/write-file-atomic.d.ts +18 -0
- package/dist/src/infra/write-file-atomic.js +115 -0
- package/dist/src/infra/write-file-atomic.js.map +1 -0
- package/dist/src/session/abort-cutoff.d.ts +6 -0
- package/dist/src/session/abort-cutoff.js +10 -0
- package/dist/src/session/abort-cutoff.js.map +1 -0
- package/dist/src/session/compaction-checkpoints.d.ts +8 -0
- package/dist/src/session/compaction-checkpoints.js +21 -0
- package/dist/src/session/compaction-checkpoints.js.map +1 -0
- package/dist/src/session/config-store.js +4 -2
- package/dist/src/session/config-store.js.map +1 -1
- package/dist/src/session/index.d.ts +8 -1
- package/dist/src/session/index.js +7 -1
- package/dist/src/session/manager.d.ts +26 -1
- package/dist/src/session/manager.js +39 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/patch-metadata.d.ts +12 -0
- package/dist/src/session/patch-metadata.js +23 -0
- package/dist/src/session/patch-metadata.js.map +1 -0
- package/dist/src/session/search-index.d.ts +2 -0
- package/dist/src/session/search-index.js +30 -2
- package/dist/src/session/search-index.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +32 -0
- package/dist/src/session/session-context-for-llm.js +60 -0
- package/dist/src/session/session-context-for-llm.js.map +1 -0
- package/dist/src/session/store.d.ts +53 -2
- package/dist/src/session/store.js +427 -145
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
- package/dist/src/session/strip-webchat-early-save.js +17 -0
- package/dist/src/session/strip-webchat-early-save.js.map +1 -0
- package/dist/src/session/transcript-format.d.ts +46 -0
- package/dist/src/session/transcript-format.js +88 -0
- package/dist/src/session/transcript-format.js.map +1 -0
- package/dist/src/session/types.d.ts +37 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +4 -3
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/voice/tts/merge-config.js +0 -1
- package/dist/src/voice/tts/merge-config.js.map +1 -1
- package/dist/src/voice/tts/service.js +1 -2
- package/dist/src/voice/tts/service.js.map +1 -1
- package/package.json +1 -1
- package/skills/business/company-values/SKILL-zh.md +80 -0
- package/skills/business/company-values/SKILL.md +80 -0
- package/skills/business/find-community/SKILL-zh.md +50 -0
- package/skills/business/find-community/SKILL.md +50 -0
- package/skills/business/first-customers/SKILL-zh.md +76 -0
- package/skills/business/first-customers/SKILL.md +76 -0
- package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
- package/skills/business/grow-sustainably/SKILL.md +92 -0
- package/skills/business/marketing-plan/SKILL-zh.md +100 -0
- package/skills/business/marketing-plan/SKILL.md +100 -0
- package/skills/business/minimalist-review/SKILL-zh.md +82 -0
- package/skills/business/minimalist-review/SKILL.md +82 -0
- package/skills/business/mvp/SKILL-zh.md +81 -0
- package/skills/business/mvp/SKILL.md +81 -0
- package/skills/business/pricing/SKILL-zh.md +64 -0
- package/skills/business/pricing/SKILL.md +64 -0
- package/skills/business/processize/SKILL-zh.md +91 -0
- package/skills/business/processize/SKILL.md +91 -0
- package/skills/business/validate-idea/SKILL-zh.md +68 -0
- package/skills/business/validate-idea/SKILL.md +68 -0
- package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
- package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
- package/skills/creative/algorithmic-art/SKILL.md +405 -0
- package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
- package/skills/creative/canvas-design/LICENSE.txt +202 -0
- package/skills/creative/canvas-design/SKILL-zh.md +130 -0
- package/skills/creative/canvas-design/SKILL.md +130 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/creative/frontend-design/LICENSE.txt +177 -0
- package/skills/creative/frontend-design/SKILL-zh.md +42 -0
- package/skills/creative/frontend-design/SKILL.md +42 -0
- package/skills/creative/theme-factory/LICENSE.txt +202 -0
- package/skills/creative/theme-factory/SKILL-zh.md +59 -0
- package/skills/creative/theme-factory/SKILL.md +59 -0
- package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
- package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
- package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
- package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
- package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
- package/skills/documents/doc-coauthoring/SKILL.md +375 -0
- package/skills/documents/docx/SKILL-zh.md +590 -0
- package/skills/{docx → documents/docx}/SKILL.md +11 -11
- package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
- package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
- package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/pdf/SKILL-zh.md +314 -0
- package/skills/documents/pptx/SKILL-zh.md +232 -0
- package/skills/{pptx → documents/pptx}/editing.md +3 -3
- package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
- package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
- package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
- package/skills/documents/xlsx/SKILL-zh.md +292 -0
- package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
- package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
- package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
- package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
- package/skills/meta/skill-creator/LICENSE.txt +202 -0
- package/skills/meta/skill-creator/SKILL-zh.md +483 -0
- package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
- package/skills/tools/find-skills/SKILL-zh.md +440 -0
- package/skills/tools/github/SKILL-zh.md +48 -0
- package/skills/tools/internal-comms/LICENSE.txt +202 -0
- package/skills/tools/internal-comms/SKILL-zh.md +32 -0
- package/skills/tools/internal-comms/SKILL.md +32 -0
- package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
- package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
- package/skills/tools/internal-comms/examples/general-comms.md +16 -0
- package/skills/tools/summarize/SKILL-zh.md +47 -0
- package/skills/tools/weather/SKILL-zh.md +46 -0
- package/skills/tools/webapp-testing/LICENSE.txt +202 -0
- package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
- package/skills/tools/webapp-testing/SKILL.md +96 -0
- package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
- package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
- package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
- package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
- package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
- package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
- package/dist/src/agent/skills/skills-store-client.js.map +0 -1
- package/dist/src/stt/index.d.ts +0 -1
- package/dist/src/stt/index.js +0 -8
- /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
- /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
- /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
- /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
- /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
- /package/skills/{pdf → documents/pdf}/forms.md +0 -0
- /package/skills/{pdf → documents/pdf}/reference.md +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
- /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
- /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
- /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
- /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
- /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
- /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
- /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
- /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
- /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
- /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
- /package/skills/{github → tools/github}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
//#region extensions/telegram/src/adapters/config-surface.ts
|
|
2
2
|
const telegramConfigSurface = { buildConfigSurface(cfg) {
|
|
3
3
|
const telegram = cfg.channels?.telegram;
|
|
4
|
+
const accounts = telegram?.accounts;
|
|
5
|
+
const defTok = accounts?.default && typeof accounts.default === "object" ? accounts.default.botToken : void 0;
|
|
4
6
|
return {
|
|
5
7
|
enabled: telegram?.enabled,
|
|
6
|
-
botToken: typeof
|
|
8
|
+
botToken: typeof defTok === "string" ? defTok : "",
|
|
7
9
|
allowFrom: telegram?.allowFrom || [],
|
|
8
10
|
groupAllowFrom: telegram?.groupAllowFrom || [],
|
|
9
11
|
apiRoot: telegram?.apiRoot || "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-surface.js","names":[],"sources":["../../../../../extensions/telegram/src/adapters/config-surface.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelConfigSurfaceAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\nexport const telegramConfigSurface: ChannelConfigSurfaceAdapter = {\n buildConfigSurface(cfg: Config): Record<string, unknown> {\n const telegram = cfg.channels?.telegram as Record<string, unknown> | undefined;\n return {\n enabled: telegram?.enabled,\n // Send the real token to the authenticated settings UI.\n // The web UI is responsible for masking it by default.\n botToken: typeof
|
|
1
|
+
{"version":3,"file":"config-surface.js","names":[],"sources":["../../../../../extensions/telegram/src/adapters/config-surface.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelConfigSurfaceAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\nexport const telegramConfigSurface: ChannelConfigSurfaceAdapter = {\n buildConfigSurface(cfg: Config): Record<string, unknown> {\n const telegram = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const accounts = telegram?.accounts as Record<string, { botToken?: string }> | undefined;\n const defTok =\n accounts?.default && typeof accounts.default === 'object'\n ? accounts.default.botToken\n : undefined;\n return {\n enabled: telegram?.enabled,\n // Send the real token to the authenticated settings UI.\n // The web UI is responsible for masking it by default.\n botToken: typeof defTok === 'string' ? defTok : '',\n allowFrom: telegram?.allowFrom || [],\n groupAllowFrom: telegram?.groupAllowFrom || [],\n apiRoot: telegram?.apiRoot || '',\n debug: telegram?.debug || false,\n dmPolicy: telegram?.dmPolicy || 'pairing',\n groupPolicy: telegram?.groupPolicy || 'open',\n replyToMode: telegram?.replyToMode || 'off',\n streamMode: telegram?.streamMode || 'partial',\n historyLimit: telegram?.historyLimit || 50,\n textChunkLimit: telegram?.textChunkLimit || 4000,\n proxy: telegram?.proxy || '',\n accounts: telegram?.accounts || {},\n };\n },\n};\n"],"mappings":";AAGA,MAAa,wBAAqD,EAChE,mBAAmB,KAAsC;CACvD,MAAM,WAAW,IAAI,UAAU;CAC/B,MAAM,WAAW,UAAU;CAC3B,MAAM,SACJ,UAAU,WAAW,OAAO,SAAS,YAAY,WAC7C,SAAS,QAAQ,WACjB,KAAA;AACN,QAAO;EACL,SAAS,UAAU;EAGnB,UAAU,OAAO,WAAW,WAAW,SAAS;EAChD,WAAW,UAAU,aAAa,EAAE;EACpC,gBAAgB,UAAU,kBAAkB,EAAE;EAC9C,SAAS,UAAU,WAAW;EAC9B,OAAO,UAAU,SAAS;EAC1B,UAAU,UAAU,YAAY;EAChC,aAAa,UAAU,eAAe;EACtC,aAAa,UAAU,eAAe;EACtC,YAAY,UAAU,cAAc;EACpC,cAAc,UAAU,gBAAgB;EACxC,gBAAgB,UAAU,kBAAkB;EAC5C,OAAO,UAAU,SAAS;EAC1B,UAAU,UAAU,YAAY,EAAE;EACnC;GAEJ"}
|
|
@@ -6,10 +6,10 @@ import { confirm, input, select } from "@inquirer/prompts";
|
|
|
6
6
|
function isTelegramConfigured(config) {
|
|
7
7
|
const telegram = config.channels?.telegram;
|
|
8
8
|
if (!telegram) return false;
|
|
9
|
-
if (typeof telegram.botToken === "string" && telegram.botToken && telegram.enabled) return true;
|
|
10
9
|
const accounts = telegram.accounts;
|
|
11
|
-
if (accounts) {
|
|
12
|
-
|
|
10
|
+
if (accounts) for (const account of Object.values(accounts)) {
|
|
11
|
+
if (account?.enabled === false) continue;
|
|
12
|
+
if (typeof account.botToken === "string" && account.botToken.trim()) return true;
|
|
13
13
|
}
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
@@ -18,7 +18,7 @@ function detectEnvToken() {
|
|
|
18
18
|
}
|
|
19
19
|
async function promptBotToken(config) {
|
|
20
20
|
const envToken = detectEnvToken();
|
|
21
|
-
const existing = (config.channels?.telegram)?.botToken;
|
|
21
|
+
const existing = ((config.channels?.telegram)?.accounts)?.default?.botToken?.trim();
|
|
22
22
|
if (envToken && !existing) {
|
|
23
23
|
if (await confirm({
|
|
24
24
|
message: "TELEGRAM_BOT_TOKEN is set in the environment. Use it?",
|
|
@@ -117,28 +117,30 @@ async function configureTelegram(config) {
|
|
|
117
117
|
const groupPolicy = await promptGroupPolicy();
|
|
118
118
|
let groupAllowFrom;
|
|
119
119
|
if (groupPolicy === "allowlist") groupAllowFrom = await promptAllowlist("Allowed group chat IDs (comma-separated):");
|
|
120
|
+
const prev = config.channels?.telegram;
|
|
121
|
+
const prevAccounts = prev?.accounts && typeof prev.accounts === "object" && !Array.isArray(prev.accounts) ? { ...prev.accounts } : {};
|
|
122
|
+
const prevDefault = prevAccounts.default && typeof prevAccounts.default === "object" && !Array.isArray(prevAccounts.default) ? { ...prevAccounts.default } : {};
|
|
120
123
|
const telegramConfig = {
|
|
124
|
+
...prev ?? {},
|
|
121
125
|
enabled: true,
|
|
122
|
-
botToken,
|
|
123
126
|
dmPolicy,
|
|
124
127
|
groupPolicy,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
allowFrom: allowFrom ?? prev?.allowFrom ?? [],
|
|
129
|
+
groupAllowFrom: groupAllowFrom ?? prev?.groupAllowFrom ?? [],
|
|
130
|
+
accounts: {
|
|
131
|
+
...prevAccounts,
|
|
132
|
+
default: {
|
|
133
|
+
...prevDefault,
|
|
134
|
+
accountId: "default",
|
|
135
|
+
enabled: true,
|
|
136
|
+
botToken,
|
|
137
|
+
dmPolicy,
|
|
138
|
+
groupPolicy,
|
|
139
|
+
allowFrom: allowFrom ?? prevDefault.allowFrom ?? [],
|
|
140
|
+
groupAllowFrom: groupAllowFrom ?? prevDefault.groupAllowFrom ?? []
|
|
141
|
+
}
|
|
142
|
+
}
|
|
131
143
|
};
|
|
132
|
-
const existingTelegramConfig = config.channels?.telegram;
|
|
133
|
-
if (existingTelegramConfig) {
|
|
134
|
-
Object.assign(telegramConfig, existingTelegramConfig);
|
|
135
|
-
telegramConfig.enabled = true;
|
|
136
|
-
telegramConfig.botToken = botToken;
|
|
137
|
-
telegramConfig.dmPolicy = dmPolicy;
|
|
138
|
-
telegramConfig.groupPolicy = groupPolicy;
|
|
139
|
-
if (allowFrom) telegramConfig.allowFrom = allowFrom;
|
|
140
|
-
if (groupAllowFrom) telegramConfig.groupAllowFrom = groupAllowFrom;
|
|
141
|
-
}
|
|
142
144
|
const newConfig = {
|
|
143
145
|
...config,
|
|
144
146
|
channels: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard-cli.js","names":[],"sources":["../../../../../extensions/telegram/src/adapters/onboard-cli.ts"],"sourcesContent":["/**\n * Telegram interactive onboarding (CLI onboard) — {@link ChannelOnboardAdapter}.\n */\n\nimport { input, confirm, select } from '@inquirer/prompts';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { ChannelOnboardAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\ntype DmPolicy = 'pairing' | 'allowlist' | 'open' | 'disabled';\ntype GroupPolicy = 'open' | 'disabled' | 'allowlist';\n\nfunction isTelegramConfigured(config: Config): boolean {\n const telegram = config.channels?.telegram as Record<string, unknown> | undefined;\n if (!telegram) return false;\n\n if (typeof telegram.botToken === 'string' && telegram.botToken && telegram.enabled) return true;\n\n const accounts = telegram.accounts as Record<string, Record<string, unknown>> | undefined;\n if (accounts) {\n for (const account of Object.values(accounts)) {\n if (typeof account.botToken === 'string' && account.botToken && account.enabled) return true;\n }\n }\n\n return false;\n}\n\nfunction detectEnvToken(): string | null {\n return process.env.TELEGRAM_BOT_TOKEN?.trim() || null;\n}\n\nasync function promptBotToken(config: Config): Promise<string | null> {\n const envToken = detectEnvToken();\n const existing = (config.channels?.telegram as Record<string, unknown> | undefined)?.botToken;\n\n if (envToken && !existing) {\n const useEnv = await confirm({\n message: 'TELEGRAM_BOT_TOKEN is set in the environment. Use it?',\n default: true,\n });\n if (useEnv) return envToken;\n }\n\n if (typeof existing === 'string' && existing) {\n const keep = await confirm({\n message: 'A Telegram bot token is already configured. Keep it?',\n default: true,\n });\n if (keep) return existing;\n }\n\n console.log('\\n📝 Telegram Bot Token:');\n console.log(' 1. Open Telegram and chat with @BotFather');\n console.log(' 2. Send /newbot and follow the prompts');\n console.log(' 3. Copy the token BotFather gives you\\n');\n\n const token = await input({\n message: 'Enter bot token:',\n validate: (v) => v.trim().length > 0 || 'Token cannot be empty',\n });\n\n return token.trim();\n}\n\nasync function promptDmPolicy(): Promise<DmPolicy> {\n return select<DmPolicy>({\n message: 'DM (private chat) policy:',\n choices: [\n {\n value: 'pairing',\n name: 'pairing [recommended] verify new users with /pair',\n description: 'New users must send /pair before chatting',\n },\n {\n value: 'allowlist',\n name: 'allowlist allowlisted users only',\n description: 'Only listed users can message the bot',\n },\n {\n value: 'open',\n name: 'open anyone can DM (not recommended)',\n description: 'Any user can start a conversation',\n },\n {\n value: 'disabled',\n name: 'disabled DMs disabled',\n description: 'The bot does not respond to private messages',\n },\n ],\n default: 'pairing',\n });\n}\n\nasync function promptAllowlist(message: string): Promise<Array<string | number>> {\n const value = await input({\n message,\n default: '',\n });\n\n if (!value.trim()) return [];\n\n const entries = value\n .split(/[,\\s\\n]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n\n return entries.map((e) => {\n const num = parseInt(e, 10);\n return !isNaN(num) && String(num) === e ? num : e;\n });\n}\n\nasync function promptGroupPolicy(): Promise<GroupPolicy> {\n return select<GroupPolicy>({\n message: 'Group chat policy:',\n choices: [\n {\n value: 'open',\n name: 'open all groups allowed',\n description: 'The bot can be used in any group',\n },\n {\n value: 'disabled',\n name: 'disabled groups disabled',\n description: 'The bot does not respond in groups',\n },\n {\n value: 'allowlist',\n name: 'allowlist allowlisted groups only',\n description: 'Only listed group chats can use the bot',\n },\n ],\n default: 'open',\n });\n}\n\nasync function configureTelegram(config: Config): Promise<Config> {\n console.log(`\\n${'='.repeat(50)}`);\n console.log('📱 Telegram setup');\n console.log(`${'='.repeat(50)}\\n`);\n\n const botToken = await promptBotToken(config);\n if (!botToken) {\n console.log('⚠️ No bot token; skipping Telegram setup.');\n return config;\n }\n\n const dmPolicy = await promptDmPolicy();\n\n let allowFrom: Array<string | number> | undefined;\n if (dmPolicy === 'allowlist') {\n allowFrom = await promptAllowlist('User IDs or usernames allowed for DMs (comma-separated):');\n }\n\n const groupPolicy = await promptGroupPolicy();\n\n let groupAllowFrom: Array<string | number> | undefined;\n if (groupPolicy === 'allowlist') {\n groupAllowFrom = await promptAllowlist('Allowed group chat IDs (comma-separated):');\n }\n\n const telegramConfig: Record<string, unknown> = {\n enabled: true,\n botToken,\n dmPolicy,\n groupPolicy,\n debug: false,\n replyToMode: 'off',\n historyLimit: 50,\n textChunkLimit: 4000,\n allowFrom: allowFrom || [],\n groupAllowFrom: groupAllowFrom || [],\n };\n\n const existingTelegramConfig = config.channels?.telegram as Record<string, unknown> | undefined;\n if (existingTelegramConfig) {\n Object.assign(telegramConfig, existingTelegramConfig);\n telegramConfig.enabled = true;\n telegramConfig.botToken = botToken;\n telegramConfig.dmPolicy = dmPolicy;\n telegramConfig.groupPolicy = groupPolicy;\n if (allowFrom) telegramConfig.allowFrom = allowFrom;\n if (groupAllowFrom) telegramConfig.groupAllowFrom = groupAllowFrom;\n }\n\n const newConfig: Config = {\n ...config,\n channels: {\n ...config.channels,\n telegram: telegramConfig,\n },\n };\n\n console.log('\\n✅ Telegram configuration complete\\n');\n return newConfig;\n}\n\nexport const telegramOnboardAdapter: ChannelOnboardAdapter = {\n isConfigured: isTelegramConfigured,\n configure: configureTelegram,\n};\n\n/** Optional entry: confirm before running the full Telegram configure flow. */\nexport async function setupTelegramOnboard(\n config: Config,\n options: { confirmMessage?: string; confirmDefault?: boolean } = {},\n): Promise<Config> {\n const shouldEnable = await confirm({\n message: options.confirmMessage || 'Enable Telegram channel?',\n default: options.confirmDefault ?? true,\n });\n if (!shouldEnable) {\n console.log('ℹ️ Telegram skipped.');\n return config;\n }\n return configureTelegram(config);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"onboard-cli.js","names":[],"sources":["../../../../../extensions/telegram/src/adapters/onboard-cli.ts"],"sourcesContent":["/**\n * Telegram interactive onboarding (CLI onboard) — {@link ChannelOnboardAdapter}.\n */\n\nimport { input, confirm, select } from '@inquirer/prompts';\n\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type { ChannelOnboardAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\ntype DmPolicy = 'pairing' | 'allowlist' | 'open' | 'disabled';\ntype GroupPolicy = 'open' | 'disabled' | 'allowlist';\n\nfunction isTelegramConfigured(config: Config): boolean {\n const telegram = config.channels?.telegram as Record<string, unknown> | undefined;\n if (!telegram) return false;\n\n const accounts = telegram.accounts as Record<string, Record<string, unknown>> | undefined;\n if (accounts) {\n for (const account of Object.values(accounts)) {\n if (account?.enabled === false) continue;\n if (typeof account.botToken === 'string' && account.botToken.trim()) return true;\n }\n }\n\n return false;\n}\n\nfunction detectEnvToken(): string | null {\n return process.env.TELEGRAM_BOT_TOKEN?.trim() || null;\n}\n\nasync function promptBotToken(config: Config): Promise<string | null> {\n const envToken = detectEnvToken();\n const tg = config.channels?.telegram as Record<string, unknown> | undefined;\n const accounts = tg?.accounts as Record<string, { botToken?: string }> | undefined;\n const existing = accounts?.default?.botToken?.trim();\n\n if (envToken && !existing) {\n const useEnv = await confirm({\n message: 'TELEGRAM_BOT_TOKEN is set in the environment. Use it?',\n default: true,\n });\n if (useEnv) return envToken;\n }\n\n if (typeof existing === 'string' && existing) {\n const keep = await confirm({\n message: 'A Telegram bot token is already configured. Keep it?',\n default: true,\n });\n if (keep) return existing;\n }\n\n console.log('\\n📝 Telegram Bot Token:');\n console.log(' 1. Open Telegram and chat with @BotFather');\n console.log(' 2. Send /newbot and follow the prompts');\n console.log(' 3. Copy the token BotFather gives you\\n');\n\n const token = await input({\n message: 'Enter bot token:',\n validate: (v) => v.trim().length > 0 || 'Token cannot be empty',\n });\n\n return token.trim();\n}\n\nasync function promptDmPolicy(): Promise<DmPolicy> {\n return select<DmPolicy>({\n message: 'DM (private chat) policy:',\n choices: [\n {\n value: 'pairing',\n name: 'pairing [recommended] verify new users with /pair',\n description: 'New users must send /pair before chatting',\n },\n {\n value: 'allowlist',\n name: 'allowlist allowlisted users only',\n description: 'Only listed users can message the bot',\n },\n {\n value: 'open',\n name: 'open anyone can DM (not recommended)',\n description: 'Any user can start a conversation',\n },\n {\n value: 'disabled',\n name: 'disabled DMs disabled',\n description: 'The bot does not respond to private messages',\n },\n ],\n default: 'pairing',\n });\n}\n\nasync function promptAllowlist(message: string): Promise<Array<string | number>> {\n const value = await input({\n message,\n default: '',\n });\n\n if (!value.trim()) return [];\n\n const entries = value\n .split(/[,\\s\\n]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n\n return entries.map((e) => {\n const num = parseInt(e, 10);\n return !isNaN(num) && String(num) === e ? num : e;\n });\n}\n\nasync function promptGroupPolicy(): Promise<GroupPolicy> {\n return select<GroupPolicy>({\n message: 'Group chat policy:',\n choices: [\n {\n value: 'open',\n name: 'open all groups allowed',\n description: 'The bot can be used in any group',\n },\n {\n value: 'disabled',\n name: 'disabled groups disabled',\n description: 'The bot does not respond in groups',\n },\n {\n value: 'allowlist',\n name: 'allowlist allowlisted groups only',\n description: 'Only listed group chats can use the bot',\n },\n ],\n default: 'open',\n });\n}\n\nasync function configureTelegram(config: Config): Promise<Config> {\n console.log(`\\n${'='.repeat(50)}`);\n console.log('📱 Telegram setup');\n console.log(`${'='.repeat(50)}\\n`);\n\n const botToken = await promptBotToken(config);\n if (!botToken) {\n console.log('⚠️ No bot token; skipping Telegram setup.');\n return config;\n }\n\n const dmPolicy = await promptDmPolicy();\n\n let allowFrom: Array<string | number> | undefined;\n if (dmPolicy === 'allowlist') {\n allowFrom = await promptAllowlist('User IDs or usernames allowed for DMs (comma-separated):');\n }\n\n const groupPolicy = await promptGroupPolicy();\n\n let groupAllowFrom: Array<string | number> | undefined;\n if (groupPolicy === 'allowlist') {\n groupAllowFrom = await promptAllowlist('Allowed group chat IDs (comma-separated):');\n }\n\n const prev = config.channels?.telegram as Record<string, unknown> | undefined;\n const prevAccounts =\n prev?.accounts && typeof prev.accounts === 'object' && !Array.isArray(prev.accounts)\n ? { ...(prev.accounts as Record<string, unknown>) }\n : {};\n const prevDefault =\n prevAccounts.default && typeof prevAccounts.default === 'object' && !Array.isArray(prevAccounts.default)\n ? { ...(prevAccounts.default as Record<string, unknown>) }\n : {};\n\n const telegramConfig: Record<string, unknown> = {\n ...(prev ?? {}),\n enabled: true,\n dmPolicy,\n groupPolicy,\n allowFrom: allowFrom ?? (prev?.allowFrom as Array<string | number> | undefined) ?? [],\n groupAllowFrom: groupAllowFrom ?? (prev?.groupAllowFrom as Array<string | number> | undefined) ?? [],\n accounts: {\n ...prevAccounts,\n default: {\n ...prevDefault,\n accountId: 'default',\n enabled: true,\n botToken,\n dmPolicy,\n groupPolicy,\n allowFrom: allowFrom ?? (prevDefault.allowFrom as Array<string | number> | undefined) ?? [],\n groupAllowFrom:\n groupAllowFrom ?? (prevDefault.groupAllowFrom as Array<string | number> | undefined) ?? [],\n },\n },\n };\n\n const newConfig: Config = {\n ...config,\n channels: {\n ...config.channels,\n telegram: telegramConfig,\n },\n };\n\n console.log('\\n✅ Telegram configuration complete\\n');\n return newConfig;\n}\n\nexport const telegramOnboardAdapter: ChannelOnboardAdapter = {\n isConfigured: isTelegramConfigured,\n configure: configureTelegram,\n};\n\n/** Optional entry: confirm before running the full Telegram configure flow. */\nexport async function setupTelegramOnboard(\n config: Config,\n options: { confirmMessage?: string; confirmDefault?: boolean } = {},\n): Promise<Config> {\n const shouldEnable = await confirm({\n message: options.confirmMessage || 'Enable Telegram channel?',\n default: options.confirmDefault ?? true,\n });\n if (!shouldEnable) {\n console.log('ℹ️ Telegram skipped.');\n return config;\n }\n return configureTelegram(config);\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
//#region extensions/telegram/src/adapters/setup-wizard.ts
|
|
2
2
|
function resolveTelegramToken(cfg, _accountId) {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
return accounts && Object.values(accounts).find((a) => a?.botToken)?.botToken || tg?.botToken || process.env.TELEGRAM_BOT_TOKEN;
|
|
3
|
+
const accounts = (cfg.channels?.telegram)?.accounts;
|
|
4
|
+
return accounts && Object.values(accounts).find((a) => a?.botToken)?.botToken || process.env.TELEGRAM_BOT_TOKEN;
|
|
6
5
|
}
|
|
7
6
|
function createTelegramSetupWizard() {
|
|
8
7
|
return {
|
|
@@ -16,7 +15,7 @@ function createTelegramSetupWizard() {
|
|
|
16
15
|
} },
|
|
17
16
|
envShortcut: {
|
|
18
17
|
envVar: "TELEGRAM_BOT_TOKEN",
|
|
19
|
-
configPath: "channels.telegram.botToken"
|
|
18
|
+
configPath: "channels.telegram.accounts.default.botToken"
|
|
20
19
|
},
|
|
21
20
|
credentials: [{
|
|
22
21
|
key: "botToken",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-wizard.js","names":[],"sources":["../../../../../extensions/telegram/src/adapters/setup-wizard.ts"],"sourcesContent":["/**\n * Telegram ChannelSetupWizard factory (onboard / tooling).\n */\n\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelSetupWizard } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\nfunction resolveTelegramToken(cfg: Config, _accountId?: string): string | undefined {\n const tg = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const accounts = tg?.accounts as Record<string, { botToken?: string }> | undefined;\n
|
|
1
|
+
{"version":3,"file":"setup-wizard.js","names":[],"sources":["../../../../../extensions/telegram/src/adapters/setup-wizard.ts"],"sourcesContent":["/**\n * Telegram ChannelSetupWizard factory (onboard / tooling).\n */\n\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelSetupWizard } from '@xopcai/xopc/channels/plugins/types.adapters.js';\n\nfunction resolveTelegramToken(cfg: Config, _accountId?: string): string | undefined {\n const tg = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const accounts = tg?.accounts as Record<string, { botToken?: string }> | undefined;\n const fromAcc = accounts && Object.values(accounts).find((a) => a?.botToken)?.botToken;\n return (fromAcc as string | undefined) || process.env.TELEGRAM_BOT_TOKEN;\n}\n\nexport function createTelegramSetupWizard(): ChannelSetupWizard {\n return {\n channel: 'telegram',\n status: {\n check: async (cfg, accountId) => {\n const first = resolveTelegramToken(cfg, accountId);\n return { ok: !!first, detail: first ? '' : 'No bot token configured' };\n },\n },\n envShortcut: {\n envVar: 'TELEGRAM_BOT_TOKEN',\n configPath: 'channels.telegram.accounts.default.botToken',\n },\n credentials: [\n {\n key: 'botToken',\n label: 'Bot API token',\n type: 'password',\n validate: (v) => (v && v.length > 10 ? null : 'Paste a token from @BotFather'),\n hint: 'From BotFather → /newbot or your bot’s API token',\n },\n ],\n finalize: {\n validate: async (cfg) => {\n const token = resolveTelegramToken(cfg);\n return token\n ? { ok: true }\n : { ok: false, error: 'Configure channels.telegram with a bot token' };\n },\n message: 'Telegram bot token saved.',\n },\n };\n}\n"],"mappings":";AAOA,SAAS,qBAAqB,KAAa,YAAyC;CAElF,MAAM,YADK,IAAI,UAAU,WACJ;AAErB,QADgB,YAAY,OAAO,OAAO,SAAS,CAAC,MAAM,MAAM,GAAG,SAAS,EAAE,YACpC,QAAQ,IAAI;;AAGxD,SAAgB,4BAAgD;AAC9D,QAAO;EACL,SAAS;EACT,QAAQ,EACN,OAAO,OAAO,KAAK,cAAc;GAC/B,MAAM,QAAQ,qBAAqB,KAAK,UAAU;AAClD,UAAO;IAAE,IAAI,CAAC,CAAC;IAAO,QAAQ,QAAQ,KAAK;IAA2B;KAEzE;EACD,aAAa;GACX,QAAQ;GACR,YAAY;GACb;EACD,aAAa,CACX;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,WAAW,MAAO,KAAK,EAAE,SAAS,KAAK,OAAO;GAC9C,MAAM;GACP,CACF;EACD,UAAU;GACR,UAAU,OAAO,QAAQ;AAEvB,WADc,qBAAqB,IACvB,GACR,EAAE,IAAI,MAAM,GACZ;KAAE,IAAI;KAAO,OAAO;KAAgD;;GAE1E,SAAS;GACV;EACF"}
|
|
@@ -70,7 +70,6 @@ export declare const TelegramAccountConfigSchema: z.ZodObject<{
|
|
|
70
70
|
}, z.core.$strip>;
|
|
71
71
|
export declare const TelegramConfigSchema: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodObject<{
|
|
72
72
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
73
|
-
botToken: z.ZodDefault<z.ZodString>;
|
|
74
73
|
allowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
75
74
|
groupAllowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
76
75
|
apiRoot: z.ZodOptional<z.ZodString>;
|
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
//#region extensions/telegram/src/config-schema.ts
|
|
4
|
-
/**
|
|
4
|
+
/** Migrate legacy top-level `botToken` into `accounts.default`; implicit enable when `accounts.default.botToken` is set. */
|
|
5
5
|
function preprocessTelegramConfigInput(raw) {
|
|
6
6
|
if (raw === null || raw === void 0) return raw;
|
|
7
7
|
if (typeof raw !== "object" || Array.isArray(raw)) return raw;
|
|
8
8
|
const o = { ...raw };
|
|
9
|
-
const
|
|
10
|
-
if (
|
|
9
|
+
const legacyToken = typeof o.botToken === "string" ? o.botToken.trim() : "";
|
|
10
|
+
if (legacyToken) {
|
|
11
|
+
const acc = { ...o.accounts && typeof o.accounts === "object" && !Array.isArray(o.accounts) ? o.accounts : {} };
|
|
12
|
+
const rawDef = acc.default;
|
|
13
|
+
const def = rawDef && typeof rawDef === "object" && !Array.isArray(rawDef) ? { ...rawDef } : {};
|
|
14
|
+
if (!(typeof def.botToken === "string" ? def.botToken.trim() : "")) acc.default = {
|
|
15
|
+
...def,
|
|
16
|
+
accountId: "default",
|
|
17
|
+
botToken: legacyToken
|
|
18
|
+
};
|
|
19
|
+
o.accounts = acc;
|
|
20
|
+
}
|
|
21
|
+
delete o.botToken;
|
|
22
|
+
const defaultAcc = o.accounts?.default;
|
|
23
|
+
const token = defaultAcc && typeof defaultAcc === "object" && typeof defaultAcc.botToken === "string" ? defaultAcc.botToken : "";
|
|
24
|
+
if (o.enabled === void 0 && token.trim().length > 0) o.enabled = true;
|
|
11
25
|
return o;
|
|
12
26
|
}
|
|
13
27
|
var TelegramTopicConfigSchema, TelegramGroupConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchemaInner, TelegramConfigSchema;
|
|
@@ -64,7 +78,6 @@ var init_config_schema = __esmMin((() => {
|
|
|
64
78
|
});
|
|
65
79
|
TelegramConfigSchemaInner = z.object({
|
|
66
80
|
enabled: z.boolean().default(false),
|
|
67
|
-
botToken: z.string().default(""),
|
|
68
81
|
allowFrom: z.array(z.union([z.string(), z.number()])).default([]),
|
|
69
82
|
groupAllowFrom: z.array(z.union([z.string(), z.number()])).default([]),
|
|
70
83
|
apiRoot: z.string().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","names":[],"sources":["../../../../extensions/telegram/src/config-schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TelegramTopicConfigSchema = z.object({\n topicId: z.string(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n});\n\nexport const TelegramGroupConfigSchema = z.object({\n groupId: z.string(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n topics: z.record(z.string(), TelegramTopicConfigSchema).optional(),\n});\n\nexport const TelegramAccountConfigSchema = z.object({\n accountId: z.string(),\n name: z.string().optional(),\n enabled: z.boolean().default(true),\n botToken: z.string().default(''),\n tokenFile: z.string().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('pairing'),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).default('open'),\n replyToMode: z.enum(['off', 'first', 'all']).default('off'),\n groups: z.record(z.string(), TelegramGroupConfigSchema).optional(),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\n streamMode: z.enum(['off', 'partial', 'block']).default('partial'),\n proxy: z.string().optional(),\n apiRoot: z.string().optional(),\n});\n\n/**
|
|
1
|
+
{"version":3,"file":"config-schema.js","names":[],"sources":["../../../../extensions/telegram/src/config-schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TelegramTopicConfigSchema = z.object({\n topicId: z.string(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n});\n\nexport const TelegramGroupConfigSchema = z.object({\n groupId: z.string(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n topics: z.record(z.string(), TelegramTopicConfigSchema).optional(),\n});\n\nexport const TelegramAccountConfigSchema = z.object({\n accountId: z.string(),\n name: z.string().optional(),\n enabled: z.boolean().default(true),\n botToken: z.string().default(''),\n tokenFile: z.string().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('pairing'),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).default('open'),\n replyToMode: z.enum(['off', 'first', 'all']).default('off'),\n groups: z.record(z.string(), TelegramGroupConfigSchema).optional(),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\n streamMode: z.enum(['off', 'partial', 'block']).default('partial'),\n proxy: z.string().optional(),\n apiRoot: z.string().optional(),\n});\n\n/** Migrate legacy top-level `botToken` into `accounts.default`; implicit enable when `accounts.default.botToken` is set. */\nfunction preprocessTelegramConfigInput(raw: unknown): unknown {\n if (raw === null || raw === undefined) return raw;\n if (typeof raw !== 'object' || Array.isArray(raw)) return raw;\n const o = { ...(raw as Record<string, unknown>) };\n\n const legacyToken = typeof o.botToken === 'string' ? o.botToken.trim() : '';\n if (legacyToken) {\n const prev =\n o.accounts && typeof o.accounts === 'object' && !Array.isArray(o.accounts)\n ? (o.accounts as Record<string, unknown>)\n : {};\n const acc = { ...prev };\n const rawDef = acc.default;\n const def =\n rawDef && typeof rawDef === 'object' && !Array.isArray(rawDef)\n ? { ...(rawDef as Record<string, unknown>) }\n : {};\n const defToken = typeof def.botToken === 'string' ? def.botToken.trim() : '';\n if (!defToken) {\n acc.default = { ...def, accountId: 'default', botToken: legacyToken };\n }\n o.accounts = acc;\n }\n delete o.botToken;\n\n const accounts = o.accounts as Record<string, { botToken?: string }> | undefined;\n const defaultAcc = accounts?.default;\n const token =\n defaultAcc && typeof defaultAcc === 'object' && typeof defaultAcc.botToken === 'string'\n ? defaultAcc.botToken\n : '';\n if (o.enabled === undefined && token.trim().length > 0) {\n o.enabled = true;\n }\n return o;\n}\n\nconst TelegramConfigSchemaInner = z.object({\n enabled: z.boolean().default(false),\n allowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n groupAllowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n apiRoot: z.string().optional(),\n debug: z.boolean().default(false),\n accounts: z.record(z.string(), TelegramAccountConfigSchema).optional(),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('pairing'),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).default('open'),\n replyToMode: z.enum(['off', 'first', 'all']).default('off'),\n streamMode: z.enum(['off', 'partial', 'block']).optional(),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\n proxy: z.string().optional(),\n});\n\nexport const TelegramConfigSchema = z.preprocess(preprocessTelegramConfigInput, TelegramConfigSchemaInner);\n\nexport type TelegramConfig = z.infer<typeof TelegramConfigSchema>;\n"],"mappings":"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"}
|
|
@@ -204,23 +204,10 @@ var TelegramChannelPlugin = class {
|
|
|
204
204
|
if (!telegramCfg) return;
|
|
205
205
|
if (telegramCfg.enabled !== true) return;
|
|
206
206
|
const accounts = telegramCfg.accounts;
|
|
207
|
-
if (
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
});
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
if (telegramCfg.botToken) this.accountManager.registerAccount({
|
|
215
|
-
accountId: "default",
|
|
216
|
-
name: "Default Account",
|
|
217
|
-
enabled: true,
|
|
218
|
-
botToken: telegramCfg.botToken,
|
|
219
|
-
apiRoot: telegramCfg.apiRoot,
|
|
220
|
-
dmPolicy: telegramCfg.dmPolicy,
|
|
221
|
-
groupPolicy: telegramCfg.groupPolicy,
|
|
222
|
-
allowFrom: telegramCfg.allowFrom,
|
|
223
|
-
groupAllowFrom: telegramCfg.groupAllowFrom
|
|
207
|
+
if (!accounts || Object.keys(accounts).length === 0) return;
|
|
208
|
+
for (const [id, account] of Object.entries(accounts)) this.accountManager.registerAccount({
|
|
209
|
+
...account,
|
|
210
|
+
accountId: id
|
|
224
211
|
});
|
|
225
212
|
}
|
|
226
213
|
channelIsRunning(cfg) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":["sttTranscribe"],"sources":["../../../../extensions/telegram/src/plugin.ts"],"sourcesContent":["/**\n * Telegram Channel Plugin - Implementation based on ChannelPlugin interface\n *\n * This plugin integrates Telegram with the ChannelPlugin architecture.\n * It reuses components from this package's src tree where possible.\n */\n\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { Bot, type Context } from 'grammy';\nimport { run } from '@grammyjs/runner';\n\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport type {\n ChannelPlugin,\n ChannelPluginDefaults,\n ChannelPluginInitOptions,\n ChannelPluginReloadMeta,\n ChannelPluginSessionModelHooks,\n ChannelPluginStartOptions,\n ChannelOutboundAdapter,\n ChannelSecurityContext,\n ChannelGatewayAdapter,\n ChannelStreamingAdapter,\n ChannelCommandAdapter,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\nimport { submitClarifyChoiceFromChannel } from '@xopcai/xopc/gateway/clarify-runtime.js';\n\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport { createInboundDebouncer } from '@xopcai/xopc/infra/debounce.js';\nimport { getChatChannelMeta } from '@xopcai/xopc/channels/registry.js';\nimport { getMimeType } from '@xopcai/xopc/channels/media.js';\nimport { transcribe as sttTranscribe, isSTTAvailable } from '@xopcai/xopc/voice/stt/index.js';\nimport type { STTConfig } from '@xopcai/xopc/voice/stt/types.js';\n\nimport { TelegramAccountManager } from './account-manager.js';\nimport { createOutboundSender } from './outbound-sender.js';\nimport { createTelegramCommandHandler } from './command-handler.js';\nimport { createInboundProcessor } from './inbound-processor.js';\nimport { TELEGRAM_CHANNEL_DEFAULTS } from './plugin-defaults.js';\nimport {\n createTelegramPluginAdapters,\n createTelegramSetupWizard,\n createTelegramOutboundSendMethods,\n telegramTextChunker,\n TELEGRAM_OUTBOUND_DEFAULTS,\n createTelegramInboundAccessControl,\n telegramDebouncerKeyPolicy,\n type TelegramMessageEvent,\n} from './adapters/index.js';\nimport {\n createTelegramGatewayAdapter,\n createTelegramStreamingAdapter,\n createTelegramCommandAdapter,\n} from './channel.js';\nimport type { TelegramResolvedAccount } from './adapters/index.js';\nimport type { ChannelCronDeliveryAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { normalizeTelegramDeliveryChatId } from './delivery-chat-id.js';\nimport { telegramConfigSurface } from './adapters/config-surface.js';\nimport { telegramOnboardAdapter } from './adapters/onboard-cli.js';\nimport { TelegramConfigSchema } from './config-schema.js';\n\nconst log = createLogger('TelegramPlugin');\n\nconst TELEGRAM_REGISTRY_META = getChatChannelMeta('telegram');\n\nexport type { TelegramResolvedAccount as TelegramAccount } from './channel.js';\n\nexport class TelegramChannelPlugin implements ChannelPlugin<TelegramResolvedAccount> {\n readonly id = 'telegram' as const;\n\n readonly reload: ChannelPluginReloadMeta = {\n configPrefixes: ['channels.telegram'],\n };\n\n readonly meta = {\n id: TELEGRAM_REGISTRY_META.id,\n label: TELEGRAM_REGISTRY_META.label,\n selectionLabel: 'Telegram Bot',\n docsPath: '/channels/telegram',\n blurb: TELEGRAM_REGISTRY_META.description,\n order: 0,\n } as const;\n\n readonly capabilities = TELEGRAM_REGISTRY_META.capabilities;\n\n readonly defaults: ChannelPluginDefaults = {\n queue: { debounceMs: TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs },\n outbound: { textChunkLimit: TELEGRAM_CHANNEL_DEFAULTS.outbound.textChunkLimit },\n };\n\n readonly setupWizard = createTelegramSetupWizard();\n\n readonly configSchema = {\n schema: {},\n validate: (raw: unknown) => {\n const r = TelegramConfigSchema.safeParse(raw);\n return r.success ? { ok: true as const } : { ok: false as const, errors: [r.error.message] };\n },\n };\n\n readonly cronDelivery: ChannelCronDeliveryAdapter = {\n async normalizeDeliveryTarget(to) {\n return { chatId: normalizeTelegramDeliveryChatId(to) };\n },\n };\n\n readonly configSurface = telegramConfigSurface;\n\n readonly onboard = telegramOnboardAdapter;\n\n private bus!: NonNullable<ChannelPluginInitOptions['bus']>;\n private cfg!: NonNullable<ChannelPluginInitOptions['config']>;\n private debouncer!: ReturnType<typeof createInboundDebouncer<TelegramMessageEvent>>;\n\n private accountManager!: TelegramAccountManager;\n private outboundSender!: ReturnType<typeof createOutboundSender>;\n private commandHandler!: ReturnType<typeof createTelegramCommandHandler>;\n private inboundProcessor!: ReturnType<typeof createInboundProcessor>;\n private sessionModelHooks?: ChannelPluginSessionModelHooks;\n\n config!: import('@xopcai/xopc/channels/plugin-types.js').ChannelConfigAdapter<TelegramResolvedAccount>;\n security!: import('@xopcai/xopc/channels/plugin-types.js').ChannelSecurityAdapter<TelegramResolvedAccount>;\n status!: import('@xopcai/xopc/channels/plugin-types.js').ChannelStatusAdapter<TelegramResolvedAccount>;\n\n outbound!: ChannelOutboundAdapter;\n\n gateway!: ChannelGatewayAdapter<TelegramResolvedAccount>;\n\n streaming!: ChannelStreamingAdapter;\n\n commands!: ChannelCommandAdapter;\n\n async init(options: ChannelPluginInitOptions): Promise<void> {\n this.bus = options.bus;\n this.cfg = options.config;\n this.sessionModelHooks = options.sessionModel;\n\n this.accountManager = new TelegramAccountManager();\n this.loadAccounts();\n this.bindOutboundComponents();\n\n const debounceMs =\n this.defaults.queue?.debounceMs ?? TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs;\n const keyPolicy = telegramDebouncerKeyPolicy();\n this.debouncer = createInboundDebouncer<TelegramMessageEvent>({\n debounceMs,\n ...keyPolicy,\n onFlush: async (items) => {\n await this.processMessages(items);\n },\n onError: (err, items) => {\n log.error({ err, count: items.length }, 'Debounced message processing failed');\n },\n });\n\n log.debug('Telegram plugin initialized');\n }\n\n private bindOutboundComponents(): void {\n this.outboundSender = createOutboundSender({\n accountManager: this.accountManager,\n config: this.cfg,\n });\n const sm = this.sessionModelHooks;\n this.commandHandler = createTelegramCommandHandler({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n getSessionModel: (sessionKey) => sm?.getModelForSession(sessionKey),\n setSessionModel: (sessionKey, modelId) => {\n if (!sm) return;\n void sm.switchModelForSession(sessionKey, modelId);\n },\n });\n const adapters = createTelegramPluginAdapters({\n accountManager: this.accountManager,\n });\n this.config = adapters.config;\n this.security = adapters.security;\n this.status = adapters.status;\n\n const accessControl = createTelegramInboundAccessControl();\n\n this.inboundProcessor = createInboundProcessor({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n accessControl,\n sessionKeyService: {\n generateSessionKey: (opts) =>\n generateSessionKey({\n source: 'telegram',\n chatId: opts.chatId,\n senderId: opts.senderId,\n isGroup: opts.isGroup,\n threadId: opts.threadId,\n accountId: opts.accountId,\n }),\n },\n sttService: {\n transcribe: async (buffer, config, options) => {\n const result = await sttTranscribe(buffer, config as STTConfig, options);\n return { text: result.text };\n },\n isSTTAvailable: (config) => isSTTAvailable(config as STTConfig | undefined),\n },\n mediaUtils: { getMimeType },\n });\n\n const sends = createTelegramOutboundSendMethods((opts) => this.outboundSender.send(opts));\n this.outbound = {\n deliveryMode: 'direct',\n chunker: telegramTextChunker,\n chunkerMode: 'text',\n textChunkLimit: TELEGRAM_OUTBOUND_DEFAULTS.textChunkLimit,\n ...sends,\n };\n\n this.gateway = createTelegramGatewayAdapter({\n startAccount: (account) => this.startAccount(account),\n stopAccount: (accountId) => this.accountManager.stopRunner(accountId),\n });\n this.streaming = createTelegramStreamingAdapter({ accountManager: this.accountManager });\n this.commands = createTelegramCommandAdapter();\n }\n\n async onConfigUpdated(cfg: Config): Promise<void> {\n const prevTg = this.cfg.channels?.telegram as unknown;\n const nextTg = cfg.channels?.telegram as { enabled?: boolean } | undefined;\n // Match Weixin: only `enabled === true` keeps inbound (polling). Stops immediately on disable / missing section.\n const channelOff = !nextTg || nextTg.enabled !== true;\n if (channelOff) {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n this.bindOutboundComponents();\n return;\n }\n\n if (isDeepStrictEqual(prevTg, nextTg)) {\n this.cfg = cfg;\n this.bindOutboundComponents();\n // Config unchanged but runners may be stopped (e.g. disable → enable with identical JSON shape after normalize).\n if (!this.channelIsRunning(cfg)) {\n await this.reapplyFromConfig(cfg);\n }\n return;\n }\n await this.reapplyFromConfig(cfg);\n }\n\n private async reapplyFromConfig(cfg: Config): Promise<void> {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n const telegramCfg = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const channelOn = telegramCfg != null && telegramCfg.enabled === true;\n if (!channelOn) {\n this.bindOutboundComponents();\n return;\n }\n this.loadAccounts();\n this.bindOutboundComponents();\n await this.start();\n }\n\n private loadAccounts(): void {\n const telegramCfg = this.cfg.channels?.telegram as Record<string, unknown> | undefined;\n if (!telegramCfg) return;\n if (telegramCfg.enabled !== true) {\n return;\n }\n\n const accounts = telegramCfg.accounts as Record<string, any> | undefined;\n const hasNamedAccounts = Boolean(accounts && Object.keys(accounts).length > 0);\n\n if (hasNamedAccounts) {\n for (const [id, account] of Object.entries(accounts!)) {\n this.accountManager.registerAccount({ ...account, accountId: id });\n }\n return;\n }\n\n // Single-token layout: `accounts: {}` is truthy but must not skip root `botToken` registration.\n if (telegramCfg.botToken) {\n this.accountManager.registerAccount({\n accountId: 'default',\n name: 'Default Account',\n enabled: true,\n botToken: telegramCfg.botToken as string,\n apiRoot: telegramCfg.apiRoot as string | undefined,\n dmPolicy: telegramCfg.dmPolicy as any,\n groupPolicy: telegramCfg.groupPolicy as any,\n allowFrom: telegramCfg.allowFrom as Array<string | number> | undefined,\n groupAllowFrom: telegramCfg.groupAllowFrom as Array<string | number> | undefined,\n });\n }\n }\n\n channelIsRunning(cfg: Config): boolean {\n return this.accountManager.getAllAccounts().some(\n (a) => a.enabled !== false && !!a.botToken && this.accountManager.isRunning(a.accountId),\n );\n }\n\n async start(options?: ChannelPluginStartOptions): Promise<void> {\n const section = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!section || section.enabled !== true) {\n return;\n }\n\n const accountIds = options?.accountId\n ? [options.accountId]\n : this.config.listAccountIds(this.cfg);\n\n for (const accountId of accountIds) {\n const account = this.config.resolveAccount(this.cfg, accountId);\n if (!account.enabled || !account.botToken) continue;\n await this.startAccount(account);\n }\n }\n\n async stop(accountId?: string): Promise<void> {\n if (!this.config) return;\n const ids = accountId ? [accountId] : this.config.listAccountIds(this.cfg);\n for (const id of ids) {\n await this.accountManager.stopRunner(id);\n log.info({ accountId: id }, 'Telegram account stopped');\n }\n }\n\n private async startAccount(account: TelegramResolvedAccount): Promise<void> {\n if (this.accountManager.isRunning(account.accountId)) return;\n if (!account.botToken) return;\n\n this.accountManager.markStarting(account.accountId);\n\n try {\n const botConfig = account.apiRoot ? { client: { apiRoot: account.apiRoot } } : undefined;\n const bot = new Bot(account.botToken, botConfig);\n const me = await bot.api.getMe();\n\n const runner = run(bot, {\n runner: {\n fetch: { timeout: 30 },\n silent: true,\n maxRetryTime: Number.POSITIVE_INFINITY,\n retryInterval: 'exponential',\n },\n });\n\n this.accountManager.registerBot(account.accountId, bot);\n this.accountManager.registerRunner(account.accountId, runner);\n this.attachRunnerExitHandler(account.accountId, runner);\n this.accountManager.setBotUsername(account.accountId, me.username);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: true,\n mode: 'polling',\n });\n\n this.setupMessageHandler(account.accountId, bot);\n\n log.info({ accountId: account.accountId, username: me.username }, 'Telegram account started');\n } finally {\n this.accountManager.markStartComplete(account.accountId);\n }\n }\n\n private attachRunnerExitHandler(accountId: string, runner: ReturnType<typeof run>): void {\n const task = runner.task();\n if (!task) return;\n void task.catch((err) => {\n log.error({ err, accountId }, 'Telegram polling runner exited');\n void this.accountManager.stopRunner(accountId).catch((e) => {\n log.error({ err: e, accountId }, 'Telegram runner cleanup failed');\n });\n });\n }\n\n private setupMessageHandler(accountId: string, bot: Bot): void {\n bot.on('message', async (ctx) => {\n try {\n const text = ctx.message.text ?? ctx.message.caption ?? '';\n const command = text.trim().split(' ')[0].split('@')[0].toLowerCase();\n\n if (command === '/models') {\n await this.commandHandler.handleModels(ctx);\n return;\n }\n\n if (command === '/start') {\n await this.commandHandler.handleStart(ctx);\n return;\n }\n\n if (command === '/cleanup') {\n await this.commandHandler.handleCleanup(ctx);\n return;\n }\n\n await this.debouncer.enqueue({ ctx, accountId, message: ctx.message });\n } catch (err) {\n log.error({ accountId, err }, 'Message handler error');\n }\n });\n\n bot.on('callback_query:data', async (ctx) => {\n try {\n await this.handleCallbackQuery(ctx, accountId);\n } catch (err) {\n log.error({ accountId, err }, 'Callback query handler error');\n await ctx.answerCallbackQuery('An error occurred').catch(() => {});\n }\n });\n }\n\n private async handleCallbackQuery(ctx: Context, _accountId: string): Promise<void> {\n const data = ctx.callbackQuery?.data;\n if (!data) return;\n\n if (data.startsWith('provider:')) {\n const providerId = data.substring('provider:'.length);\n await this.commandHandler.handleProviderSelect(ctx, providerId);\n return;\n }\n\n if (data.startsWith('model:')) {\n const modelId = data.substring('model:'.length);\n await this.commandHandler.handleModelSelect(ctx, modelId);\n return;\n }\n\n if (data === 'cancel') {\n await this.commandHandler.handleCancel(ctx);\n return;\n }\n\n if (data === 'providers') {\n await this.commandHandler.handleShowProviders(ctx);\n return;\n }\n\n if (data === 'cleanup:confirm') {\n await this.commandHandler.handleCleanupConfirm(ctx);\n return;\n }\n\n if (data.startsWith('clarify:')) {\n const rest = data.slice('clarify:'.length);\n const lastColon = rest.lastIndexOf(':');\n if (lastColon > 0) {\n const requestId = rest.slice(0, lastColon);\n const idx = Number.parseInt(rest.slice(lastColon + 1), 10);\n if (requestId && Number.isFinite(idx) && submitClarifyChoiceFromChannel(requestId, idx)) {\n await ctx.answerCallbackQuery();\n return;\n }\n }\n await ctx.answerCallbackQuery('No pending question');\n return;\n }\n\n await ctx.answerCallbackQuery('Unknown action');\n }\n\n private async processMessages(items: TelegramMessageEvent[]): Promise<void> {\n if (items.length === 0) return;\n\n const tgSection = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!tgSection || tgSection.enabled !== true) {\n return;\n }\n\n const last = items[items.length - 1];\n const ctx = last.ctx;\n const accountId = last.accountId;\n if (!this.accountManager.getAccount(accountId)) {\n log.warn({ accountId }, 'Unknown account');\n return;\n }\n\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const isGroup = ctx.chat?.type === 'group' || ctx.chat?.type === 'supergroup';\n const senderId = ctx.from?.id?.toString() ?? '';\n const senderUsername = ctx.from?.username;\n const chatId = ctx.chat?.id?.toString() ?? '';\n\n const securityCtx: ChannelSecurityContext = {\n accountId,\n chatId,\n senderId,\n senderName: senderUsername,\n isGroup,\n };\n\n const accessResult = this.security.checkAccess?.(securityCtx, account, this.cfg);\n\n if (!accessResult?.allowed) {\n log.warn(\n {\n accountId,\n chatId,\n senderId,\n isGroup,\n reason: accessResult?.reason,\n dmPolicy: account.dmPolicy,\n groupPolicy: account.groupPolicy,\n },\n 'Telegram: message dropped by channel security (check dmPolicy/groupPolicy and allowFrom)',\n );\n return;\n }\n\n await this.inboundProcessor(ctx, accountId);\n }\n}\n\nexport const telegramPlugin = new TelegramChannelPlugin();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","names":["sttTranscribe"],"sources":["../../../../extensions/telegram/src/plugin.ts"],"sourcesContent":["/**\n * Telegram Channel Plugin - Implementation based on ChannelPlugin interface\n *\n * This plugin integrates Telegram with the ChannelPlugin architecture.\n * It reuses components from this package's src tree where possible.\n */\n\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { Bot, type Context } from 'grammy';\nimport { run } from '@grammyjs/runner';\n\nimport type { Config } from '@xopcai/xopc/config/index.js';\nimport type {\n ChannelPlugin,\n ChannelPluginDefaults,\n ChannelPluginInitOptions,\n ChannelPluginReloadMeta,\n ChannelPluginSessionModelHooks,\n ChannelPluginStartOptions,\n ChannelOutboundAdapter,\n ChannelSecurityContext,\n ChannelGatewayAdapter,\n ChannelStreamingAdapter,\n ChannelCommandAdapter,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport { generateSessionKey } from '@xopcai/xopc/chat-commands/session-key.js';\nimport { submitClarifyChoiceFromChannel } from '@xopcai/xopc/gateway/clarify-runtime.js';\n\nimport { createLogger } from '@xopcai/xopc/utils/logger.js';\nimport { createInboundDebouncer } from '@xopcai/xopc/infra/debounce.js';\nimport { getChatChannelMeta } from '@xopcai/xopc/channels/registry.js';\nimport { getMimeType } from '@xopcai/xopc/channels/media.js';\nimport { transcribe as sttTranscribe, isSTTAvailable } from '@xopcai/xopc/voice/stt/index.js';\nimport type { STTConfig } from '@xopcai/xopc/voice/stt/types.js';\n\nimport { TelegramAccountManager } from './account-manager.js';\nimport { createOutboundSender } from './outbound-sender.js';\nimport { createTelegramCommandHandler } from './command-handler.js';\nimport { createInboundProcessor } from './inbound-processor.js';\nimport { TELEGRAM_CHANNEL_DEFAULTS } from './plugin-defaults.js';\nimport {\n createTelegramPluginAdapters,\n createTelegramSetupWizard,\n createTelegramOutboundSendMethods,\n telegramTextChunker,\n TELEGRAM_OUTBOUND_DEFAULTS,\n createTelegramInboundAccessControl,\n telegramDebouncerKeyPolicy,\n type TelegramMessageEvent,\n} from './adapters/index.js';\nimport {\n createTelegramGatewayAdapter,\n createTelegramStreamingAdapter,\n createTelegramCommandAdapter,\n} from './channel.js';\nimport type { TelegramResolvedAccount } from './adapters/index.js';\nimport type { ChannelCronDeliveryAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { normalizeTelegramDeliveryChatId } from './delivery-chat-id.js';\nimport { telegramConfigSurface } from './adapters/config-surface.js';\nimport { telegramOnboardAdapter } from './adapters/onboard-cli.js';\nimport { TelegramConfigSchema } from './config-schema.js';\n\nconst log = createLogger('TelegramPlugin');\n\nconst TELEGRAM_REGISTRY_META = getChatChannelMeta('telegram');\n\nexport type { TelegramResolvedAccount as TelegramAccount } from './channel.js';\n\nexport class TelegramChannelPlugin implements ChannelPlugin<TelegramResolvedAccount> {\n readonly id = 'telegram' as const;\n\n readonly reload: ChannelPluginReloadMeta = {\n configPrefixes: ['channels.telegram'],\n };\n\n readonly meta = {\n id: TELEGRAM_REGISTRY_META.id,\n label: TELEGRAM_REGISTRY_META.label,\n selectionLabel: 'Telegram Bot',\n docsPath: '/channels/telegram',\n blurb: TELEGRAM_REGISTRY_META.description,\n order: 0,\n } as const;\n\n readonly capabilities = TELEGRAM_REGISTRY_META.capabilities;\n\n readonly defaults: ChannelPluginDefaults = {\n queue: { debounceMs: TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs },\n outbound: { textChunkLimit: TELEGRAM_CHANNEL_DEFAULTS.outbound.textChunkLimit },\n };\n\n readonly setupWizard = createTelegramSetupWizard();\n\n readonly configSchema = {\n schema: {},\n validate: (raw: unknown) => {\n const r = TelegramConfigSchema.safeParse(raw);\n return r.success ? { ok: true as const } : { ok: false as const, errors: [r.error.message] };\n },\n };\n\n readonly cronDelivery: ChannelCronDeliveryAdapter = {\n async normalizeDeliveryTarget(to) {\n return { chatId: normalizeTelegramDeliveryChatId(to) };\n },\n };\n\n readonly configSurface = telegramConfigSurface;\n\n readonly onboard = telegramOnboardAdapter;\n\n private bus!: NonNullable<ChannelPluginInitOptions['bus']>;\n private cfg!: NonNullable<ChannelPluginInitOptions['config']>;\n private debouncer!: ReturnType<typeof createInboundDebouncer<TelegramMessageEvent>>;\n\n private accountManager!: TelegramAccountManager;\n private outboundSender!: ReturnType<typeof createOutboundSender>;\n private commandHandler!: ReturnType<typeof createTelegramCommandHandler>;\n private inboundProcessor!: ReturnType<typeof createInboundProcessor>;\n private sessionModelHooks?: ChannelPluginSessionModelHooks;\n\n config!: import('@xopcai/xopc/channels/plugin-types.js').ChannelConfigAdapter<TelegramResolvedAccount>;\n security!: import('@xopcai/xopc/channels/plugin-types.js').ChannelSecurityAdapter<TelegramResolvedAccount>;\n status!: import('@xopcai/xopc/channels/plugin-types.js').ChannelStatusAdapter<TelegramResolvedAccount>;\n\n outbound!: ChannelOutboundAdapter;\n\n gateway!: ChannelGatewayAdapter<TelegramResolvedAccount>;\n\n streaming!: ChannelStreamingAdapter;\n\n commands!: ChannelCommandAdapter;\n\n async init(options: ChannelPluginInitOptions): Promise<void> {\n this.bus = options.bus;\n this.cfg = options.config;\n this.sessionModelHooks = options.sessionModel;\n\n this.accountManager = new TelegramAccountManager();\n this.loadAccounts();\n this.bindOutboundComponents();\n\n const debounceMs =\n this.defaults.queue?.debounceMs ?? TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs;\n const keyPolicy = telegramDebouncerKeyPolicy();\n this.debouncer = createInboundDebouncer<TelegramMessageEvent>({\n debounceMs,\n ...keyPolicy,\n onFlush: async (items) => {\n await this.processMessages(items);\n },\n onError: (err, items) => {\n log.error({ err, count: items.length }, 'Debounced message processing failed');\n },\n });\n\n log.debug('Telegram plugin initialized');\n }\n\n private bindOutboundComponents(): void {\n this.outboundSender = createOutboundSender({\n accountManager: this.accountManager,\n config: this.cfg,\n });\n const sm = this.sessionModelHooks;\n this.commandHandler = createTelegramCommandHandler({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n getSessionModel: (sessionKey) => sm?.getModelForSession(sessionKey),\n setSessionModel: (sessionKey, modelId) => {\n if (!sm) return;\n void sm.switchModelForSession(sessionKey, modelId);\n },\n });\n const adapters = createTelegramPluginAdapters({\n accountManager: this.accountManager,\n });\n this.config = adapters.config;\n this.security = adapters.security;\n this.status = adapters.status;\n\n const accessControl = createTelegramInboundAccessControl();\n\n this.inboundProcessor = createInboundProcessor({\n bus: this.bus,\n config: this.cfg,\n accountManager: this.accountManager,\n accessControl,\n sessionKeyService: {\n generateSessionKey: (opts) =>\n generateSessionKey({\n source: 'telegram',\n chatId: opts.chatId,\n senderId: opts.senderId,\n isGroup: opts.isGroup,\n threadId: opts.threadId,\n accountId: opts.accountId,\n }),\n },\n sttService: {\n transcribe: async (buffer, config, options) => {\n const result = await sttTranscribe(buffer, config as STTConfig, options);\n return { text: result.text };\n },\n isSTTAvailable: (config) => isSTTAvailable(config as STTConfig | undefined),\n },\n mediaUtils: { getMimeType },\n });\n\n const sends = createTelegramOutboundSendMethods((opts) => this.outboundSender.send(opts));\n this.outbound = {\n deliveryMode: 'direct',\n chunker: telegramTextChunker,\n chunkerMode: 'text',\n textChunkLimit: TELEGRAM_OUTBOUND_DEFAULTS.textChunkLimit,\n ...sends,\n };\n\n this.gateway = createTelegramGatewayAdapter({\n startAccount: (account) => this.startAccount(account),\n stopAccount: (accountId) => this.accountManager.stopRunner(accountId),\n });\n this.streaming = createTelegramStreamingAdapter({ accountManager: this.accountManager });\n this.commands = createTelegramCommandAdapter();\n }\n\n async onConfigUpdated(cfg: Config): Promise<void> {\n const prevTg = this.cfg.channels?.telegram as unknown;\n const nextTg = cfg.channels?.telegram as { enabled?: boolean } | undefined;\n // Match Weixin: only `enabled === true` keeps inbound (polling). Stops immediately on disable / missing section.\n const channelOff = !nextTg || nextTg.enabled !== true;\n if (channelOff) {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n this.bindOutboundComponents();\n return;\n }\n\n if (isDeepStrictEqual(prevTg, nextTg)) {\n this.cfg = cfg;\n this.bindOutboundComponents();\n // Config unchanged but runners may be stopped (e.g. disable → enable with identical JSON shape after normalize).\n if (!this.channelIsRunning(cfg)) {\n await this.reapplyFromConfig(cfg);\n }\n return;\n }\n await this.reapplyFromConfig(cfg);\n }\n\n private async reapplyFromConfig(cfg: Config): Promise<void> {\n this.cfg = cfg;\n await this.stop();\n this.accountManager.reset();\n const telegramCfg = cfg.channels?.telegram as Record<string, unknown> | undefined;\n const channelOn = telegramCfg != null && telegramCfg.enabled === true;\n if (!channelOn) {\n this.bindOutboundComponents();\n return;\n }\n this.loadAccounts();\n this.bindOutboundComponents();\n await this.start();\n }\n\n private loadAccounts(): void {\n const telegramCfg = this.cfg.channels?.telegram as Record<string, unknown> | undefined;\n if (!telegramCfg) return;\n if (telegramCfg.enabled !== true) {\n return;\n }\n\n const accounts = telegramCfg.accounts as Record<string, any> | undefined;\n if (!accounts || Object.keys(accounts).length === 0) return;\n\n for (const [id, account] of Object.entries(accounts)) {\n this.accountManager.registerAccount({ ...account, accountId: id });\n }\n }\n\n channelIsRunning(cfg: Config): boolean {\n return this.accountManager.getAllAccounts().some(\n (a) => a.enabled !== false && !!a.botToken && this.accountManager.isRunning(a.accountId),\n );\n }\n\n async start(options?: ChannelPluginStartOptions): Promise<void> {\n const section = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!section || section.enabled !== true) {\n return;\n }\n\n const accountIds = options?.accountId\n ? [options.accountId]\n : this.config.listAccountIds(this.cfg);\n\n for (const accountId of accountIds) {\n const account = this.config.resolveAccount(this.cfg, accountId);\n if (!account.enabled || !account.botToken) continue;\n await this.startAccount(account);\n }\n }\n\n async stop(accountId?: string): Promise<void> {\n if (!this.config) return;\n const ids = accountId ? [accountId] : this.config.listAccountIds(this.cfg);\n for (const id of ids) {\n await this.accountManager.stopRunner(id);\n log.info({ accountId: id }, 'Telegram account stopped');\n }\n }\n\n private async startAccount(account: TelegramResolvedAccount): Promise<void> {\n if (this.accountManager.isRunning(account.accountId)) return;\n if (!account.botToken) return;\n\n this.accountManager.markStarting(account.accountId);\n\n try {\n const botConfig = account.apiRoot ? { client: { apiRoot: account.apiRoot } } : undefined;\n const bot = new Bot(account.botToken, botConfig);\n const me = await bot.api.getMe();\n\n const runner = run(bot, {\n runner: {\n fetch: { timeout: 30 },\n silent: true,\n maxRetryTime: Number.POSITIVE_INFINITY,\n retryInterval: 'exponential',\n },\n });\n\n this.accountManager.registerBot(account.accountId, bot);\n this.accountManager.registerRunner(account.accountId, runner);\n this.attachRunnerExitHandler(account.accountId, runner);\n this.accountManager.setBotUsername(account.accountId, me.username);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: true,\n mode: 'polling',\n });\n\n this.setupMessageHandler(account.accountId, bot);\n\n log.info({ accountId: account.accountId, username: me.username }, 'Telegram account started');\n } finally {\n this.accountManager.markStartComplete(account.accountId);\n }\n }\n\n private attachRunnerExitHandler(accountId: string, runner: ReturnType<typeof run>): void {\n const task = runner.task();\n if (!task) return;\n void task.catch((err) => {\n log.error({ err, accountId }, 'Telegram polling runner exited');\n void this.accountManager.stopRunner(accountId).catch((e) => {\n log.error({ err: e, accountId }, 'Telegram runner cleanup failed');\n });\n });\n }\n\n private setupMessageHandler(accountId: string, bot: Bot): void {\n bot.on('message', async (ctx) => {\n try {\n const text = ctx.message.text ?? ctx.message.caption ?? '';\n const command = text.trim().split(' ')[0].split('@')[0].toLowerCase();\n\n if (command === '/models') {\n await this.commandHandler.handleModels(ctx);\n return;\n }\n\n if (command === '/start') {\n await this.commandHandler.handleStart(ctx);\n return;\n }\n\n if (command === '/cleanup') {\n await this.commandHandler.handleCleanup(ctx);\n return;\n }\n\n await this.debouncer.enqueue({ ctx, accountId, message: ctx.message });\n } catch (err) {\n log.error({ accountId, err }, 'Message handler error');\n }\n });\n\n bot.on('callback_query:data', async (ctx) => {\n try {\n await this.handleCallbackQuery(ctx, accountId);\n } catch (err) {\n log.error({ accountId, err }, 'Callback query handler error');\n await ctx.answerCallbackQuery('An error occurred').catch(() => {});\n }\n });\n }\n\n private async handleCallbackQuery(ctx: Context, _accountId: string): Promise<void> {\n const data = ctx.callbackQuery?.data;\n if (!data) return;\n\n if (data.startsWith('provider:')) {\n const providerId = data.substring('provider:'.length);\n await this.commandHandler.handleProviderSelect(ctx, providerId);\n return;\n }\n\n if (data.startsWith('model:')) {\n const modelId = data.substring('model:'.length);\n await this.commandHandler.handleModelSelect(ctx, modelId);\n return;\n }\n\n if (data === 'cancel') {\n await this.commandHandler.handleCancel(ctx);\n return;\n }\n\n if (data === 'providers') {\n await this.commandHandler.handleShowProviders(ctx);\n return;\n }\n\n if (data === 'cleanup:confirm') {\n await this.commandHandler.handleCleanupConfirm(ctx);\n return;\n }\n\n if (data.startsWith('clarify:')) {\n const rest = data.slice('clarify:'.length);\n const lastColon = rest.lastIndexOf(':');\n if (lastColon > 0) {\n const requestId = rest.slice(0, lastColon);\n const idx = Number.parseInt(rest.slice(lastColon + 1), 10);\n if (requestId && Number.isFinite(idx) && submitClarifyChoiceFromChannel(requestId, idx)) {\n await ctx.answerCallbackQuery();\n return;\n }\n }\n await ctx.answerCallbackQuery('No pending question');\n return;\n }\n\n await ctx.answerCallbackQuery('Unknown action');\n }\n\n private async processMessages(items: TelegramMessageEvent[]): Promise<void> {\n if (items.length === 0) return;\n\n const tgSection = this.cfg.channels?.telegram as { enabled?: boolean } | undefined;\n if (!tgSection || tgSection.enabled !== true) {\n return;\n }\n\n const last = items[items.length - 1];\n const ctx = last.ctx;\n const accountId = last.accountId;\n if (!this.accountManager.getAccount(accountId)) {\n log.warn({ accountId }, 'Unknown account');\n return;\n }\n\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const isGroup = ctx.chat?.type === 'group' || ctx.chat?.type === 'supergroup';\n const senderId = ctx.from?.id?.toString() ?? '';\n const senderUsername = ctx.from?.username;\n const chatId = ctx.chat?.id?.toString() ?? '';\n\n const securityCtx: ChannelSecurityContext = {\n accountId,\n chatId,\n senderId,\n senderName: senderUsername,\n isGroup,\n };\n\n const accessResult = this.security.checkAccess?.(securityCtx, account, this.cfg);\n\n if (!accessResult?.allowed) {\n log.warn(\n {\n accountId,\n chatId,\n senderId,\n isGroup,\n reason: accessResult?.reason,\n dmPolicy: account.dmPolicy,\n groupPolicy: account.groupPolicy,\n },\n 'Telegram: message dropped by channel security (check dmPolicy/groupPolicy and allowFrom)',\n );\n return;\n }\n\n await this.inboundProcessor(ctx, accountId);\n }\n}\n\nexport const telegramPlugin = new TelegramChannelPlugin();\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "telegram",
|
|
3
3
|
"name": "Telegram Channel",
|
|
4
4
|
"description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.31",
|
|
6
6
|
"kind": "channel",
|
|
7
7
|
"main": "src/index.ts",
|
|
8
8
|
"channels": ["telegram"],
|
|
@@ -7,8 +7,8 @@ import { getExtensionFromContentTypeOrUrl } from "../media/mime.js";
|
|
|
7
7
|
import { aesEcbPaddedSize } from "./aes-ecb.js";
|
|
8
8
|
import { uploadBufferToCdn } from "./cdn-upload.js";
|
|
9
9
|
import path from "node:path";
|
|
10
|
-
import fs from "node:fs/promises";
|
|
11
10
|
import crypto from "node:crypto";
|
|
11
|
+
import fs from "node:fs/promises";
|
|
12
12
|
//#region extensions/weixin/src/cdn/upload.ts
|
|
13
13
|
/**
|
|
14
14
|
* Download a remote media URL (image, video, file) to a local temp file in destDir.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getExtensionFromMime } from "./mime.js";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
3
|
import { randomBytes } from "node:crypto";
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
5
|
//#region extensions/weixin/src/media/data-url.ts
|
|
6
6
|
/**
|
|
7
7
|
* Parse `data:mime;base64,...` into buffer (aligned with Telegram `parseDataUrl`).
|
|
@@ -9,8 +9,8 @@ import { downloadMediaFromItem } from "../media/media-download.js";
|
|
|
9
9
|
import { isDebugMode } from "./debug-mode.js";
|
|
10
10
|
import { handleSlashCommand } from "./slash-commands.js";
|
|
11
11
|
import path from "node:path";
|
|
12
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
13
12
|
import { randomBytes } from "node:crypto";
|
|
13
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
14
14
|
//#region extensions/weixin/src/messaging/process-message.ts
|
|
15
15
|
function extractTextBody(itemList) {
|
|
16
16
|
if (!itemList?.length) return "";
|