@xopcai/xopc 0.0.103 → 0.0.105
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/README.md +7 -4
- package/README.zh-CN.md +7 -4
- package/dist/_virtual/_rolldown/runtime.js +2 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/feishu/src/index.d.ts +8 -1
- package/dist/extensions/feishu/src/index.js +14 -1
- package/dist/extensions/feishu/src/index.js.map +1 -0
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -1
- package/dist/extensions/feishu/src/plugin.js +2 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/xopc.extension.json +66 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.js +2 -2
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/doctor.d.ts +1 -0
- package/dist/extensions/telegram/src/doctor.js +68 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/index.d.ts +8 -1
- package/dist/extensions/telegram/src/index.js +15 -2
- package/dist/extensions/telegram/src/index.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +13 -5
- package/dist/extensions/telegram/src/plugin.js +32 -12
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +412 -5
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/index.d.ts +8 -0
- package/dist/extensions/weixin/src/index.js +12 -1
- package/dist/extensions/weixin/src/index.js.map +1 -0
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -1
- package/dist/extensions/weixin/src/plugin.js +77 -2
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +52 -0
- package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-B7Us3RMl.js} +1 -1
- package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +1 -0
- package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-DJDkNhu5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-DI1XJTJi.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-SuafGTT_.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-cKmGax9v.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-CkvRO30i.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-BkKyRDrF.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-CRiDcxtt.js +1 -0
- package/dist/gateway/static/root/assets/index-50FVtgXU.js +4845 -0
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DM8o5-Bm.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-j53jtvq9.js} +53 -53
- package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-Ck2H2Qpw.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-BvmGNxiJ.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DRdayl8P.js +2 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-BlIYg2gZ.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-BlT6Akvk.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-DYgVdRB4.js} +1 -1
- package/dist/gateway/static/root/assets/url-DPEStU4M.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-_sjXCMvi.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +27 -0
- package/dist/gateway/static/root/index.html +6 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +18 -6
- package/dist/src/agent/agent-manager.js +60 -35
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
- package/dist/src/agent/builtin-agent-ids.js +17 -0
- package/dist/src/agent/builtin-agent-ids.js.map +1 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -0
- package/dist/src/agent/child-agent-factory.js +28 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
- package/dist/src/agent/embedded/run-turn.js +8 -2
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +33 -51
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +36 -35
- package/dist/src/agent/fallback/candidates.js +1 -1
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +25 -5
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.js +30 -2
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -0
- package/dist/src/agent/service/direct-turn-helpers.js +6 -3
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +3 -0
- package/dist/src/agent/service/process-direct-streaming.js +50 -19
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service-inbound-utils.d.ts +0 -1
- package/dist/src/agent/service-inbound-utils.js +1 -17
- package/dist/src/agent/service-inbound-utils.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -4
- package/dist/src/agent/service.js +29 -16
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +3 -0
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +9 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +4 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +1 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
- package/dist/src/agent/skills/format-skills-prompt.js +3 -2
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/index.js +20 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +14 -27
- package/dist/src/agent/skills/installer.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -1
- package/dist/src/agent/skills/skill-manager.js +3 -3
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
- package/dist/src/agent/skills/skill-view-path.js +3 -66
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/test-framework.js +2 -3
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/source-context/index.d.ts +2 -0
- package/dist/src/agent/source-context/index.js +3 -0
- package/dist/src/agent/source-context/injector.d.ts +3 -0
- package/dist/src/agent/source-context/injector.js +36 -0
- package/dist/src/agent/source-context/injector.js.map +1 -0
- package/dist/src/agent/source-context/types.d.ts +19 -0
- package/dist/src/agent/source-context/types.js +10 -0
- package/dist/src/agent/source-context/types.js.map +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
- package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
- package/dist/src/agent/tool-manuals/browser.js.map +1 -0
- package/dist/src/agent/tool-manuals/index.d.ts +10 -0
- package/dist/src/agent/tool-manuals/index.js +28 -0
- package/dist/src/agent/tool-manuals/index.js.map +1 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +2 -0
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/skills-tools.js +37 -8
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
- package/dist/src/agent/tools/tool-manual-tool.js +34 -0
- package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
- package/dist/src/agent/workflow/catalog.d.ts +7 -2
- package/dist/src/agent/workflow/catalog.js +66 -25
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
- package/dist/src/agent/workflow/subagent-runner.js +50 -4
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +10 -0
- package/dist/src/auth/credentials.js +10 -5
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
- package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
- package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
- package/dist/src/channels/dock.d.ts +0 -7
- package/dist/src/channels/dock.js +1 -21
- package/dist/src/channels/index.d.ts +1 -3
- package/dist/src/channels/index.js +1 -5
- package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
- package/dist/src/channels/lifecycle-supervisor.js +11 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
- package/dist/src/channels/manager.d.ts +1 -0
- package/dist/src/channels/manager.js +3 -0
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
- package/dist/src/channels/pairing/pairing-messages.js +1 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
- package/dist/src/channels/pairing/pairing-service.js +8 -27
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
- package/dist/src/channels/telegram/index.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/bin.js +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +2 -4
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/auth.js +1 -1
- package/dist/src/cli/commands/channels.d.ts +1 -5
- package/dist/src/cli/commands/channels.js +115 -281
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/config.js +2 -2
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -1
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +2 -1
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/models.js +7 -4
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +8 -5
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -6
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
- package/dist/src/cli/commands/tui.js +13 -5
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/commands/agents.config.d.ts +3 -3
- package/dist/src/commands/agents.config.js +7 -7
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +1 -1
- package/dist/src/config/agent-profile.js +6 -2
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +2 -2
- package/dist/src/config/agent-typed-models.js +13 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.d.ts +0 -1
- package/dist/src/config/loader.js +4 -9
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.d.ts +6 -6
- package/dist/src/config/paths.d.ts +1 -0
- package/dist/src/config/paths.js +5 -1
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/rules.js +2 -12
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +74 -47
- package/dist/src/config/schema.js +28 -66
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/validate-channel-configs.d.ts +0 -3
- package/dist/src/config/validate-channel-configs.js +29 -10
- package/dist/src/config/validate-channel-configs.js.map +1 -1
- package/dist/src/cron/executor.js +1 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/document-understanding/extract.d.ts +13 -0
- package/dist/src/document-understanding/extract.js +63 -0
- package/dist/src/document-understanding/extract.js.map +1 -0
- package/dist/src/extensions/activation-context.js +3 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/activation-planner.js +12 -0
- package/dist/src/extensions/activation-planner.js.map +1 -1
- package/dist/src/extensions/api.d.ts +5 -1
- package/dist/src/extensions/api.js +12 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/discover-extensions.js +17 -13
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
- package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
- package/dist/src/extensions/index.js +12 -4
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +5 -1
- package/dist/src/extensions/loader.js +12 -11
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manifest-registry.js +98 -93
- package/dist/src/extensions/manifest-registry.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +91 -15
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/sdk/testing.js +4 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +32 -1
- package/dist/src/extensions/types/manifest.d.ts +60 -0
- package/dist/src/extensions/types/tui.d.ts +414 -5
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +16 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agent-run-relay.d.ts +2 -3
- package/dist/src/gateway/agent-run-relay.js +10 -3
- package/dist/src/gateway/agent-run-relay.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +32 -19
- package/dist/src/gateway/agents-admin.js +113 -93
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
- package/dist/src/gateway/chat-stream/mapper.js +244 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
- package/dist/src/gateway/chat-stream/protocol.js +1 -0
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
- package/dist/src/gateway/hono/lib/agent-model.js +13 -11
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
- package/dist/src/gateway/hono/lib/config-payload.js +16 -15
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +83 -48
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +134 -214
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +5 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/notes.js +46 -27
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +179 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
- package/dist/src/gateway/hono/routes/tui.js +16 -0
- package/dist/src/gateway/hono/routes/tui.js.map +1 -0
- package/dist/src/gateway/hono/routes/workflows.js +25 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +5 -7
- package/dist/src/gateway/hono/sse.js +21 -38
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/protocol.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -4
- package/dist/src/gateway/service/agent-runner.js +1 -1
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
- package/dist/src/gateway/service/marketplace-service.js +7 -4
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
- package/dist/src/gateway/service/run-gateway-agent.js +63 -36
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +19 -0
- package/dist/src/gateway/service/sessions-api.js +12 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +6 -0
- package/dist/src/gateway/service.js +84 -57
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/notes/agent-context.d.ts +40 -0
- package/dist/src/notes/agent-context.js +383 -0
- package/dist/src/notes/agent-context.js.map +1 -0
- package/dist/src/notes/index.d.ts +2 -0
- package/dist/src/notes/index.js +2 -1
- package/dist/src/notes/service.d.ts +5 -0
- package/dist/src/notes/service.js +22 -0
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/notes/store.js +2 -0
- package/dist/src/notes/store.js.map +1 -1
- package/dist/src/project-trust/trust-store.d.ts +30 -0
- package/dist/src/project-trust/trust-store.js +194 -0
- package/dist/src/project-trust/trust-store.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -1
- package/dist/src/providers/index.js +18 -7
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/routing/resolve-route.d.ts +0 -3
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
- package/dist/src/routing/resolve-tui-session-key.js +8 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/client-history.d.ts +32 -0
- package/dist/src/session/client-history.js +232 -1
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/manager.d.ts +37 -4
- package/dist/src/session/manager.js +39 -15
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +93 -1
- package/dist/src/session/session-context-for-llm.js +105 -2
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.d.ts +37 -0
- package/dist/src/session/store.js +127 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.js +37 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
- package/dist/src/session/types.d.ts +14 -1
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
- package/dist/src/storage/sqlite/migrations/005_add_note_agent_contexts.sql +10 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/note-agent-context-repository.d.ts +10 -0
- package/dist/src/storage/sqlite/note-agent-context-repository.js +35 -0
- package/dist/src/storage/sqlite/note-agent-context-repository.js.map +1 -0
- package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
- package/dist/src/storage/sqlite/row-mappers.js +14 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +52 -25
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
- package/dist/src/tui/backends/embedded-backend.js +227 -39
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
- package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +5 -1
- package/dist/src/tui/chat-history.js +78 -8
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-text.d.ts +5 -0
- package/dist/src/tui/clipboard-text.js +46 -0
- package/dist/src/tui/clipboard-text.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +19 -3
- package/dist/src/tui/components/assistant-message.js +115 -9
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/bash-execution.d.ts +3 -2
- package/dist/src/tui/components/bash-execution.js +31 -3
- package/dist/src/tui/components/bash-execution.js.map +1 -1
- package/dist/src/tui/components/bash-summary.d.ts +23 -0
- package/dist/src/tui/components/bash-summary.js +87 -0
- package/dist/src/tui/components/bash-summary.js.map +1 -0
- package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
- package/dist/src/tui/components/branch-message-summary.js +43 -0
- package/dist/src/tui/components/branch-message-summary.js.map +1 -0
- package/dist/src/tui/components/branch-summary.d.ts +13 -0
- package/dist/src/tui/components/branch-summary.js +51 -0
- package/dist/src/tui/components/branch-summary.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +46 -6
- package/dist/src/tui/components/chat-log.js +183 -21
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/compaction-summary.d.ts +13 -0
- package/dist/src/tui/components/compaction-summary.js +46 -0
- package/dist/src/tui/components/compaction-summary.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +2 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/custom-message.d.ts +23 -0
- package/dist/src/tui/components/custom-message.js +65 -0
- package/dist/src/tui/components/custom-message.js.map +1 -0
- package/dist/src/tui/components/extension-dialog.d.ts +42 -0
- package/dist/src/tui/components/extension-dialog.js +127 -0
- package/dist/src/tui/components/extension-dialog.js.map +1 -0
- package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
- package/dist/src/tui/components/scoped-models-selector.js +89 -16
- package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
- package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
- package/dist/src/tui/components/searchable-select-list.js +82 -10
- package/dist/src/tui/components/searchable-select-list.js.map +1 -1
- package/dist/src/tui/components/session-selector.d.ts +18 -4
- package/dist/src/tui/components/session-selector.js +207 -40
- package/dist/src/tui/components/session-selector.js.map +1 -1
- package/dist/src/tui/components/settings-selector.d.ts +6 -2
- package/dist/src/tui/components/settings-selector.js +126 -7
- package/dist/src/tui/components/settings-selector.js.map +1 -1
- package/dist/src/tui/components/thinking-selector.d.ts +12 -0
- package/dist/src/tui/components/thinking-selector.js +48 -0
- package/dist/src/tui/components/thinking-selector.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +57 -3
- package/dist/src/tui/components/tool-execution.js +378 -28
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
- package/dist/src/tui/components/tui-bottom-bar.js +56 -11
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +9 -2
- package/dist/src/tui/components/tui-header.js +25 -5
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/components/user-message.d.ts +4 -2
- package/dist/src/tui/components/user-message.js +42 -9
- package/dist/src/tui/components/user-message.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +11 -0
- package/dist/src/tui/components/visual-truncate.js +27 -0
- package/dist/src/tui/components/visual-truncate.js.map +1 -0
- package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
- package/dist/src/tui/extension-host/autocomplete.js +116 -0
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
- package/dist/src/tui/extension-host/host.d.ts +31 -1
- package/dist/src/tui/extension-host/host.js +123 -6
- package/dist/src/tui/extension-host/host.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
- package/dist/src/tui/extension-host/load-extensions.js +4 -3
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
- package/dist/src/tui/extension-host/runtime-context.js +152 -0
- package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
- package/dist/src/tui/extension-host/runtime.d.ts +52 -4
- package/dist/src/tui/extension-host/runtime.js +547 -85
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/extension-host/surface.d.ts +20 -0
- package/dist/src/tui/extension-host/surface.js +30 -6
- package/dist/src/tui/extension-host/surface.js.map +1 -1
- package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
- package/dist/src/tui/extension-host/tool-renderers.js +43 -5
- package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
- package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
- package/dist/src/tui/format-tui-hotkeys.js +22 -5
- package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +8 -6
- package/dist/src/tui/tui-agent-events.js +200 -59
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +169 -3
- package/dist/src/tui/tui-command-formatters.d.ts +76 -0
- package/dist/src/tui/tui-command-formatters.js +594 -0
- package/dist/src/tui/tui-command-formatters.js.map +1 -0
- package/dist/src/tui/tui-commands.d.ts +57 -7
- package/dist/src/tui/tui-commands.js +639 -43
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-context-usage.d.ts +1 -1
- package/dist/src/tui/tui-context-usage.js +9 -1
- package/dist/src/tui/tui-context-usage.js.map +1 -1
- package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
- package/dist/src/tui/tui-extension-user-message.js +32 -0
- package/dist/src/tui/tui-extension-user-message.js.map +1 -0
- package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
- package/dist/src/tui/tui-follow-up-queue.js +18 -0
- package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +11 -1
- package/dist/src/tui/tui-local-shell.js +50 -8
- package/dist/src/tui/tui-local-shell.js.map +1 -1
- package/dist/src/tui/tui-model-picker.d.ts +26 -0
- package/dist/src/tui/tui-model-picker.js +152 -0
- package/dist/src/tui/tui-model-picker.js.map +1 -0
- package/dist/src/tui/tui-oauth-login.d.ts +16 -0
- package/dist/src/tui/tui-oauth-login.js +189 -0
- package/dist/src/tui/tui-oauth-login.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +3 -3
- package/dist/src/tui/tui-overlays.js +6 -7
- package/dist/src/tui/tui-overlays.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
- package/dist/src/tui/tui-picker-overlay.js +340 -30
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +41 -0
- package/dist/src/tui/tui-picker-services.js +1 -0
- package/dist/src/tui/tui-run-state.d.ts +11 -0
- package/dist/src/tui/tui-run-state.js +114 -0
- package/dist/src/tui/tui-run-state.js.map +1 -0
- package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
- package/dist/src/tui/tui-runtime-hints.js +18 -0
- package/dist/src/tui/tui-runtime-hints.js.map +1 -0
- package/dist/src/tui/tui-scoped-models.d.ts +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-scoped-models.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +5 -3
- package/dist/src/tui/tui-session-actions.js +21 -9
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-session-format.d.ts +4 -1
- package/dist/src/tui/tui-session-format.js +17 -3
- package/dist/src/tui/tui-session-format.js.map +1 -1
- package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
- package/dist/src/tui/tui-session-snapshot.js +184 -0
- package/dist/src/tui/tui-session-snapshot.js.map +1 -0
- package/dist/src/tui/tui-session-stats.d.ts +3 -0
- package/dist/src/tui/tui-session-stats.js +59 -0
- package/dist/src/tui/tui-session-stats.js.map +1 -0
- package/dist/src/tui/tui-settings.d.ts +21 -0
- package/dist/src/tui/tui-settings.js +28 -1
- package/dist/src/tui/tui-settings.js.map +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.d.ts +3 -0
- package/dist/src/tui/tui-startup-resources.js +39 -0
- package/dist/src/tui/tui-startup-resources.js.map +1 -0
- package/dist/src/tui/tui-startup-text.d.ts +10 -0
- package/dist/src/tui/tui-startup-text.js +58 -0
- package/dist/src/tui/tui-startup-text.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
- package/dist/src/tui/tui-stdio-filter.js +11 -7
- package/dist/src/tui/tui-stdio-filter.js.map +1 -1
- package/dist/src/tui/tui-submit.d.ts +2 -0
- package/dist/src/tui/tui-submit.js +2 -1
- package/dist/src/tui/tui-submit.js.map +1 -1
- package/dist/src/tui/tui-tool-diff.js +61 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-tool-result.d.ts +17 -0
- package/dist/src/tui/tui-tool-result.js +74 -0
- package/dist/src/tui/tui-tool-result.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
- package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
- package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
- package/dist/src/tui/tui-transcript-tree.js +316 -0
- package/dist/src/tui/tui-transcript-tree.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +25 -34
- package/dist/src/tui/tui-types.js +12 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +1288 -112
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
- package/dist/src/workflows/domain/definition-utils.js +18 -8
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +25 -0
- package/dist/src/workflows/domain/event.d.ts +1 -0
- package/dist/src/workflows/domain/result.d.ts +15 -0
- package/dist/src/workflows/domain/run.d.ts +2 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/engine/projector.js +4 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
- package/dist/src/workflows/engine/workflow-engine.js +75 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.d.ts +1 -0
- package/dist/src/workflows/index.js +4 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
- package/dist/src/workflows/registry/index.d.ts +2 -0
- package/dist/src/workflows/registry/index.js +2 -0
- package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
- package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
- package/dist/src/workflows/runtime/index.d.ts +2 -0
- package/dist/src/workflows/runtime/index.js +2 -1
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
- package/dist/src/workflows/service/workflow-run-service.js +10 -15
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +23 -17
- package/skills/creative/frontend-design/SKILL.md +1 -1
- package/skills/creative/theme-factory/SKILL.md +1 -1
- package/skills/documents/xlsx/SKILL.md +1 -1
- package/skills/engineering/diagnose/SKILL.md +2 -2
- package/skills/engineering/tdd/SKILL.md +1 -1
- package/skills/tools/github/SKILL.md +6 -1
- package/skills/tools/webapp-testing/SKILL.md +4 -1
- package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
- package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
- package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
- package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
- package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
- package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
- package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
- package/dist/src/agent/embedded/map-stream-events.js +0 -63
- package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
- package/dist/src/channels/dock.js.map +0 -1
- package/dist/src/channels/plugins/bundled.d.ts +0 -11
- package/dist/src/channels/plugins/bundled.js +0 -10
- package/dist/src/channels/plugins/bundled.js.map +0 -1
- package/dist/src/channels/registry.d.ts +0 -25
- package/dist/src/channels/registry.js +0 -82
- package/dist/src/channels/registry.js.map +0 -1
- package/dist/src/config/localized-text.d.ts +0 -6
- package/dist/src/config/localized-text.js +0 -42
- package/dist/src/config/localized-text.js.map +0 -1
- package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
- package/dist/src/generated/bundled-channel-plugins.js +0 -16
- package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
- package/dist/src/tui/stream-assembler.d.ts +0 -22
- package/dist/src/tui/stream-assembler.js +0 -63
- package/dist/src/tui/stream-assembler.js.map +0 -1
- package/skills/browser/SKILL-zh.md +0 -188
- package/skills/business/company-values/SKILL-zh.md +0 -80
- package/skills/business/company-values/SKILL.md +0 -80
- package/skills/business/find-community/SKILL-zh.md +0 -50
- package/skills/business/find-community/SKILL.md +0 -50
- package/skills/business/first-customers/SKILL-zh.md +0 -76
- package/skills/business/first-customers/SKILL.md +0 -76
- package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
- package/skills/business/grow-sustainably/SKILL.md +0 -92
- package/skills/business/marketing-plan/SKILL-zh.md +0 -100
- package/skills/business/marketing-plan/SKILL.md +0 -100
- package/skills/business/minimalist-review/SKILL-zh.md +0 -82
- package/skills/business/minimalist-review/SKILL.md +0 -82
- package/skills/business/mvp/SKILL-zh.md +0 -81
- package/skills/business/mvp/SKILL.md +0 -81
- package/skills/business/pricing/SKILL-zh.md +0 -64
- package/skills/business/pricing/SKILL.md +0 -64
- package/skills/business/processize/SKILL-zh.md +0 -91
- package/skills/business/processize/SKILL.md +0 -91
- package/skills/business/validate-idea/SKILL-zh.md +0 -68
- package/skills/business/validate-idea/SKILL.md +0 -68
- package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
- package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
- package/skills/creative/algorithmic-art/SKILL.md +0 -405
- package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
- package/skills/creative/frontend-design/SKILL-zh.md +0 -42
- package/skills/creative/theme-factory/SKILL-zh.md +0 -59
- package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
- package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
- package/skills/documents/doc-coauthoring/SKILL.md +0 -375
- package/skills/documents/docx/LICENSE.txt +0 -30
- package/skills/documents/docx/SKILL-zh.md +0 -590
- package/skills/documents/docx/SKILL.md +0 -590
- package/skills/documents/docx/scripts/__init__.py +0 -1
- package/skills/documents/docx/scripts/accept_changes.py +0 -135
- package/skills/documents/docx/scripts/comment.py +0 -318
- package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/docx/scripts/office/pack.py +0 -159
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/docx/scripts/office/soffice.py +0 -183
- package/skills/documents/docx/scripts/office/unpack.py +0 -132
- package/skills/documents/docx/scripts/office/validate.py +0 -111
- package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/docx/scripts/office/validators/base.py +0 -847
- package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/docx/scripts/templates/comments.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/documents/docx/scripts/templates/people.xml +0 -3
- package/skills/documents/pdf/LICENSE.txt +0 -30
- package/skills/documents/pdf/SKILL-zh.md +0 -314
- package/skills/documents/pdf/SKILL.md +0 -314
- package/skills/documents/pdf/forms.md +0 -294
- package/skills/documents/pdf/reference.md +0 -612
- package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
- package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
- package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
- package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
- package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
- package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
- package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
- package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
- package/skills/documents/pptx/LICENSE.txt +0 -30
- package/skills/documents/pptx/SKILL-zh.md +0 -232
- package/skills/documents/pptx/SKILL.md +0 -232
- package/skills/documents/pptx/editing.md +0 -205
- package/skills/documents/pptx/pptxgenjs.md +0 -420
- package/skills/documents/pptx/scripts/__init__.py +0 -0
- package/skills/documents/pptx/scripts/add_slide.py +0 -195
- package/skills/documents/pptx/scripts/clean.py +0 -286
- package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/pptx/scripts/office/pack.py +0 -159
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/pptx/scripts/office/soffice.py +0 -183
- package/skills/documents/pptx/scripts/office/unpack.py +0 -132
- package/skills/documents/pptx/scripts/office/validate.py +0 -111
- package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
- package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/pptx/scripts/thumbnail.py +0 -289
- package/skills/documents/xlsx/SKILL-zh.md +0 -292
- package/skills/engineering/diagnose/SKILL-zh.md +0 -117
- package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
- package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
- package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
- package/skills/engineering/grill-with-docs/SKILL.md +0 -88
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
- package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
- package/skills/engineering/tdd/SKILL-zh.md +0 -109
- package/skills/engineering/to-issues/SKILL-zh.md +0 -81
- package/skills/engineering/to-issues/SKILL.md +0 -81
- package/skills/engineering/to-prd/SKILL-zh.md +0 -76
- package/skills/engineering/to-prd/SKILL.md +0 -74
- package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
- package/skills/engineering/zoom-out/SKILL.md +0 -7
- package/skills/tools/find-skills/SKILL-zh.md +0 -440
- package/skills/tools/github/SKILL-zh.md +0 -48
- package/skills/tools/internal-comms/LICENSE.txt +0 -202
- package/skills/tools/internal-comms/SKILL-zh.md +0 -32
- package/skills/tools/internal-comms/SKILL.md +0 -32
- package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
- package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
- package/skills/tools/internal-comms/examples/general-comms.md +0 -16
- package/skills/tools/skill-creator/LICENSE.txt +0 -202
- package/skills/tools/skill-creator/SKILL-zh.md +0 -483
- package/skills/tools/skill-creator/SKILL.md +0 -485
- package/skills/tools/skill-creator/agents/analyzer.md +0 -274
- package/skills/tools/skill-creator/agents/comparator.md +0 -202
- package/skills/tools/skill-creator/agents/grader.md +0 -223
- package/skills/tools/skill-creator/assets/eval_review.html +0 -146
- package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
- package/skills/tools/skill-creator/references/schemas.md +0 -430
- package/skills/tools/skill-creator/scripts/__init__.py +0 -0
- package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
- package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
- package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
- package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
- package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
- package/skills/tools/skill-creator/scripts/utils.py +0 -47
- package/skills/tools/summarize/SKILL-zh.md +0 -47
- package/skills/tools/weather/SKILL-zh.md +0 -46
- package/skills/tools/weather/SKILL.md +0 -46
- package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { hasTelegramBotEndpointApiRoot, normalizeTelegramApiRoot } from "./api-root.js";
|
|
2
2
|
import { resolveTelegramBotToken } from "./token-resolver.js";
|
|
3
|
+
import { isTelegramUnauthorizedTokenError } from "./startup-errors.js";
|
|
4
|
+
import { createProxyFetch } from "./proxy-fetch.js";
|
|
3
5
|
//#region extensions/telegram/src/doctor.ts
|
|
6
|
+
const TELEGRAM_DOCTOR_GETME_TIMEOUT_MS = 1e4;
|
|
4
7
|
function collectTokens(cfg) {
|
|
5
8
|
const map = /* @__PURE__ */ new Map();
|
|
6
9
|
const accounts = cfg.accounts ?? {};
|
|
@@ -16,6 +19,64 @@ function collectTokens(cfg) {
|
|
|
16
19
|
}
|
|
17
20
|
return map;
|
|
18
21
|
}
|
|
22
|
+
function formatGetMeError(err) {
|
|
23
|
+
if (err instanceof Error) return err.message;
|
|
24
|
+
return String(err);
|
|
25
|
+
}
|
|
26
|
+
function createTimeoutSignal(timeoutMs) {
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
const timer = setTimeout(() => controller.abort(/* @__PURE__ */ new Error(`Timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
29
|
+
timer.unref?.();
|
|
30
|
+
return {
|
|
31
|
+
signal: controller.signal,
|
|
32
|
+
dispose: () => clearTimeout(timer)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async function checkGetMe(params) {
|
|
36
|
+
const apiRoot = normalizeTelegramApiRoot(params.apiRoot);
|
|
37
|
+
const url = `${apiRoot}/bot${params.token}/getMe`;
|
|
38
|
+
const timeout = createTimeoutSignal(TELEGRAM_DOCTOR_GETME_TIMEOUT_MS);
|
|
39
|
+
const fetchImpl = params.proxy ? createProxyFetch(params.proxy) : params.fetchImpl ?? fetch;
|
|
40
|
+
try {
|
|
41
|
+
const startedAt = Date.now();
|
|
42
|
+
const response = await fetchImpl(url, { signal: timeout.signal });
|
|
43
|
+
const elapsedMs = Date.now() - startedAt;
|
|
44
|
+
const body = await response.json().catch(() => void 0);
|
|
45
|
+
if (response.ok && body?.ok === true) {
|
|
46
|
+
const username = body.result?.username ? ` @${body.result.username}` : "";
|
|
47
|
+
return {
|
|
48
|
+
id: `telegram-account-getme-${params.accountId}`,
|
|
49
|
+
label: `Telegram getMe (${params.accountId})`,
|
|
50
|
+
status: "pass",
|
|
51
|
+
message: `getMe succeeded${username} in ${elapsedMs}ms.`,
|
|
52
|
+
hints: params.proxy ? [`Using proxy: ${params.proxy}`] : []
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const description = body?.description || `HTTP ${response.status}`;
|
|
56
|
+
return {
|
|
57
|
+
id: `telegram-account-getme-${params.accountId}`,
|
|
58
|
+
label: `Telegram getMe (${params.accountId})`,
|
|
59
|
+
status: isTelegramUnauthorizedTokenError(description) ? "fail" : "warn",
|
|
60
|
+
message: `getMe failed: ${description}`,
|
|
61
|
+
hints: isTelegramUnauthorizedTokenError(description) ? ["Verify the bot token from @BotFather."] : ["Check channels.telegram.apiRoot / account apiRoot and network access."]
|
|
62
|
+
};
|
|
63
|
+
} catch (err) {
|
|
64
|
+
const message = formatGetMeError(err);
|
|
65
|
+
return {
|
|
66
|
+
id: `telegram-account-getme-${params.accountId}`,
|
|
67
|
+
label: `Telegram getMe (${params.accountId})`,
|
|
68
|
+
status: "fail",
|
|
69
|
+
message: `getMe network check failed: ${message}`,
|
|
70
|
+
hints: [
|
|
71
|
+
"Verify this host can reach the Telegram Bot API.",
|
|
72
|
+
"If your shell uses HTTP(S)_PROXY, also set channels.telegram.proxy because Node fetch does not use env proxy automatically.",
|
|
73
|
+
`Effective apiRoot: ${apiRoot}`
|
|
74
|
+
]
|
|
75
|
+
};
|
|
76
|
+
} finally {
|
|
77
|
+
timeout.dispose();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
19
80
|
async function runTelegramDoctorChecks(params) {
|
|
20
81
|
const results = [];
|
|
21
82
|
const tg = params.cfg.channels?.telegram;
|
|
@@ -71,6 +132,13 @@ async function runTelegramDoctorChecks(params) {
|
|
|
71
132
|
message: `Account "${id}" bot token looks too short.`,
|
|
72
133
|
hints: ["Verify the token from @BotFather."]
|
|
73
134
|
});
|
|
135
|
+
if (tg.enabled && token && acc.enabled !== false) results.push(await checkGetMe({
|
|
136
|
+
accountId: id,
|
|
137
|
+
token,
|
|
138
|
+
apiRoot: acc.apiRoot || tg.apiRoot,
|
|
139
|
+
proxy: acc.proxy || tg.proxy,
|
|
140
|
+
fetchImpl: params.fetchImpl
|
|
141
|
+
}));
|
|
74
142
|
}
|
|
75
143
|
return results;
|
|
76
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","names":[],"sources":["../../../../extensions/telegram/src/doctor.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelDoctorCheckResult } from '@xopcai/xopc/channels/plugin-types.js';\nimport { hasTelegramBotEndpointApiRoot, normalizeTelegramApiRoot } from './api-root.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\n\ntype TelegramCfg = {\n enabled?: boolean;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n apiRoot?: string;\n accounts?: Record<\n string,\n {\n botToken?: string;\n tokenFile?: string;\n apiRoot?: string;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n }\n >;\n};\n\nfunction collectTokens(cfg: TelegramCfg): Map<string, string[]> {\n const map = new Map<string, string[]>();\n const accounts = cfg.accounts ?? {};\n for (const [id, acc] of Object.entries(accounts)) {\n const { token } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (!token) continue;\n const list = map.get(token) ?? [];\n list.push(id);\n map.set(token, list);\n }\n return map;\n}\n\nexport async function runTelegramDoctorChecks(params: {\n cfg: Config;\n}): Promise<ChannelDoctorCheckResult[]> {\n const results: ChannelDoctorCheckResult[] = [];\n const tg = params.cfg.channels?.telegram as TelegramCfg | undefined;\n if (!tg) {\n return results;\n }\n\n if (tg.enabled && tg.dmPolicy === 'open') {\n const allow = tg.allowFrom ?? [];\n const hasWildcard = allow.some((e) => String(e).trim() === '*');\n results.push({\n id: 'telegram-dm-open-wildcard',\n label: 'Telegram DM open policy',\n status: hasWildcard ? 'pass' : 'warn',\n message: hasWildcard\n ? 'DM policy is open with allowFrom wildcard.'\n : 'dmPolicy \"open\" should include allowFrom: [\"*\"] for explicit opt-in.',\n hints: hasWildcard ? [] : ['Add `\"allowFrom\": [\"*\"]` or switch to pairing/allowlist.'],\n });\n }\n\n if (hasTelegramBotEndpointApiRoot(tg.apiRoot)) {\n results.push({\n id: 'telegram-api-root-bot-endpoint',\n label: 'Telegram apiRoot',\n status: 'warn',\n message: 'apiRoot includes a bot token path segment; it will be normalized to the API root.',\n hints: [`Use \"${normalizeTelegramApiRoot(tg.apiRoot)}\" instead.`],\n });\n }\n\n const tokenMap = collectTokens(tg);\n for (const [token, accountIds] of tokenMap) {\n if (accountIds.length > 1) {\n results.push({\n id: `telegram-duplicate-token-${accountIds.join('-')}`,\n label: 'Telegram duplicate bot token',\n status: 'fail',\n message: `Bot token is shared by accounts: ${accountIds.join(', ')}.`,\n hints: ['Use one token per account or disable duplicate accounts.'],\n });\n }\n void token;\n }\n\n for (const [id, acc] of Object.entries(tg.accounts ?? {})) {\n if (hasTelegramBotEndpointApiRoot(acc.apiRoot)) {\n results.push({\n id: `telegram-account-api-root-${id}`,\n label: `Telegram apiRoot (${id})`,\n status: 'warn',\n message: `Account \"${id}\" apiRoot includes bot endpoint; will be normalized.`,\n hints: [`Use \"${normalizeTelegramApiRoot(acc.apiRoot)}\"`],\n });\n }\n const { token, source } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (tg.enabled && acc && source === 'none' && (acc as { enabled?: boolean }).enabled !== false) {\n results.push({\n id: `telegram-account-token-${id}`,\n label: `Telegram token (${id})`,\n status: 'fail',\n message: `Account \"${id}\" has no bot token or readable tokenFile.`,\n hints: ['Set botToken or tokenFile in channels.telegram.accounts.' + id],\n });\n }\n if (token && token.length < 20) {\n results.push({\n id: `telegram-account-token-short-${id}`,\n label: `Telegram token (${id})`,\n status: 'warn',\n message: `Account \"${id}\" bot token looks too short.`,\n hints: ['Verify the token from @BotFather.'],\n });\n }\n }\n\n return results;\n}\n"],"mappings":";;;AAsBA,SAAS,cAAc,KAAyC;CAC9D,MAAM,sBAAM,IAAI,KAAuB;CACvC,MAAM,WAAW,IAAI,YAAY,EAAE;AACnC,MAAK,MAAM,CAAC,IAAI,QAAQ,OAAO,QAAQ,SAAS,EAAE;EAChD,MAAM,EAAE,UAAU,wBAAwB;GACxC,UAAU,IAAI;GACd,WAAW,IAAI;GAChB,CAAC;AACF,MAAI,CAAC,MAAO;EACZ,MAAM,OAAO,IAAI,IAAI,MAAM,IAAI,EAAE;AACjC,OAAK,KAAK,GAAG;AACb,MAAI,IAAI,OAAO,KAAK;;AAEtB,QAAO;;AAGT,eAAsB,wBAAwB,QAEN;CACtC,MAAM,UAAsC,EAAE;CAC9C,MAAM,KAAK,OAAO,IAAI,UAAU;AAChC,KAAI,CAAC,GACH,QAAO;AAGT,KAAI,GAAG,WAAW,GAAG,aAAa,QAAQ;EAExC,MAAM,eADQ,GAAG,aAAa,EAAE,EACN,MAAM,MAAM,OAAO,EAAE,CAAC,MAAM,KAAK,IAAI;AAC/D,UAAQ,KAAK;GACX,IAAI;GACJ,OAAO;GACP,QAAQ,cAAc,SAAS;GAC/B,SAAS,cACL,+CACA;GACJ,OAAO,cAAc,EAAE,GAAG,CAAC,+DAA2D;GACvF,CAAC;;AAGJ,KAAI,8BAA8B,GAAG,QAAQ,CAC3C,SAAQ,KAAK;EACX,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,QAAQ,yBAAyB,GAAG,QAAQ,CAAC,YAAY;EAClE,CAAC;CAGJ,MAAM,WAAW,cAAc,GAAG;AAClC,MAAK,MAAM,CAAC,OAAO,eAAe,SAChC,KAAI,WAAW,SAAS,EACtB,SAAQ,KAAK;EACX,IAAI,4BAA4B,WAAW,KAAK,IAAI;EACpD,OAAO;EACP,QAAQ;EACR,SAAS,oCAAoC,WAAW,KAAK,KAAK,CAAC;EACnE,OAAO,CAAC,2DAA2D;EACpE,CAAC;AAKN,MAAK,MAAM,CAAC,IAAI,QAAQ,OAAO,QAAQ,GAAG,YAAY,EAAE,CAAC,EAAE;AACzD,MAAI,8BAA8B,IAAI,QAAQ,CAC5C,SAAQ,KAAK;GACX,IAAI,6BAA6B;GACjC,OAAO,qBAAqB,GAAG;GAC/B,QAAQ;GACR,SAAS,YAAY,GAAG;GACxB,OAAO,CAAC,QAAQ,yBAAyB,IAAI,QAAQ,CAAC,GAAG;GAC1D,CAAC;EAEJ,MAAM,EAAE,OAAO,WAAW,wBAAwB;GAChD,UAAU,IAAI;GACd,WAAW,IAAI;GAChB,CAAC;AACF,MAAI,GAAG,WAAW,OAAO,WAAW,UAAW,IAA8B,YAAY,MACvF,SAAQ,KAAK;GACX,IAAI,0BAA0B;GAC9B,OAAO,mBAAmB,GAAG;GAC7B,QAAQ;GACR,SAAS,YAAY,GAAG;GACxB,OAAO,CAAC,6DAA6D,GAAG;GACzE,CAAC;AAEJ,MAAI,SAAS,MAAM,SAAS,GAC1B,SAAQ,KAAK;GACX,IAAI,gCAAgC;GACpC,OAAO,mBAAmB,GAAG;GAC7B,QAAQ;GACR,SAAS,YAAY,GAAG;GACxB,OAAO,CAAC,oCAAoC;GAC7C,CAAC;;AAIN,QAAO"}
|
|
1
|
+
{"version":3,"file":"doctor.js","names":[],"sources":["../../../../extensions/telegram/src/doctor.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelDoctorCheckResult } from '@xopcai/xopc/channels/plugin-types.js';\nimport { hasTelegramBotEndpointApiRoot, normalizeTelegramApiRoot } from './api-root.js';\nimport { createProxyFetch } from './proxy-fetch.js';\nimport { isTelegramUnauthorizedTokenError } from './startup-errors.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\n\nconst TELEGRAM_DOCTOR_GETME_TIMEOUT_MS = 10_000;\n\ntype TelegramCfg = {\n enabled?: boolean;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n apiRoot?: string;\n proxy?: string;\n accounts?: Record<\n string,\n {\n enabled?: boolean;\n botToken?: string;\n tokenFile?: string;\n apiRoot?: string;\n proxy?: string;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n }\n >;\n};\n\nfunction collectTokens(cfg: TelegramCfg): Map<string, string[]> {\n const map = new Map<string, string[]>();\n const accounts = cfg.accounts ?? {};\n for (const [id, acc] of Object.entries(accounts)) {\n const { token } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (!token) continue;\n const list = map.get(token) ?? [];\n list.push(id);\n map.set(token, list);\n }\n return map;\n}\n\nfunction formatGetMeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction createTimeoutSignal(timeoutMs: number): { signal: AbortSignal; dispose: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error(`Timed out after ${timeoutMs}ms`)), timeoutMs);\n timer.unref?.();\n return {\n signal: controller.signal,\n dispose: () => clearTimeout(timer),\n };\n}\n\nasync function checkGetMe(params: {\n accountId: string;\n token: string;\n apiRoot?: string;\n proxy?: string;\n fetchImpl?: typeof fetch;\n}): Promise<ChannelDoctorCheckResult> {\n const apiRoot = normalizeTelegramApiRoot(params.apiRoot);\n const url = `${apiRoot}/bot${params.token}/getMe`;\n const timeout = createTimeoutSignal(TELEGRAM_DOCTOR_GETME_TIMEOUT_MS);\n const fetchImpl = params.proxy ? createProxyFetch(params.proxy) : (params.fetchImpl ?? fetch);\n\n try {\n const startedAt = Date.now();\n const response = await fetchImpl(url, { signal: timeout.signal });\n const elapsedMs = Date.now() - startedAt;\n const body = (await response.json().catch(() => undefined)) as\n | { ok?: boolean; result?: { username?: string }; description?: string }\n | undefined;\n\n if (response.ok && body?.ok === true) {\n const username = body.result?.username ? ` @${body.result.username}` : '';\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: 'pass',\n message: `getMe succeeded${username} in ${elapsedMs}ms.`,\n hints: params.proxy ? [`Using proxy: ${params.proxy}`] : [],\n };\n }\n\n const description = body?.description || `HTTP ${response.status}`;\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: isTelegramUnauthorizedTokenError(description) ? 'fail' : 'warn',\n message: `getMe failed: ${description}`,\n hints: isTelegramUnauthorizedTokenError(description)\n ? ['Verify the bot token from @BotFather.']\n : ['Check channels.telegram.apiRoot / account apiRoot and network access.'],\n };\n } catch (err) {\n const message = formatGetMeError(err);\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: 'fail',\n message: `getMe network check failed: ${message}`,\n hints: [\n 'Verify this host can reach the Telegram Bot API.',\n 'If your shell uses HTTP(S)_PROXY, also set channels.telegram.proxy because Node fetch does not use env proxy automatically.',\n `Effective apiRoot: ${apiRoot}`,\n ],\n };\n } finally {\n timeout.dispose();\n }\n}\n\nexport async function runTelegramDoctorChecks(params: {\n cfg: Config;\n fetchImpl?: typeof fetch;\n}): Promise<ChannelDoctorCheckResult[]> {\n const results: ChannelDoctorCheckResult[] = [];\n const tg = params.cfg.channels?.telegram as TelegramCfg | undefined;\n if (!tg) {\n return results;\n }\n\n if (tg.enabled && tg.dmPolicy === 'open') {\n const allow = tg.allowFrom ?? [];\n const hasWildcard = allow.some((e) => String(e).trim() === '*');\n results.push({\n id: 'telegram-dm-open-wildcard',\n label: 'Telegram DM open policy',\n status: hasWildcard ? 'pass' : 'warn',\n message: hasWildcard\n ? 'DM policy is open with allowFrom wildcard.'\n : 'dmPolicy \"open\" should include allowFrom: [\"*\"] for explicit opt-in.',\n hints: hasWildcard ? [] : ['Add `\"allowFrom\": [\"*\"]` or switch to pairing/allowlist.'],\n });\n }\n\n if (hasTelegramBotEndpointApiRoot(tg.apiRoot)) {\n results.push({\n id: 'telegram-api-root-bot-endpoint',\n label: 'Telegram apiRoot',\n status: 'warn',\n message: 'apiRoot includes a bot token path segment; it will be normalized to the API root.',\n hints: [`Use \"${normalizeTelegramApiRoot(tg.apiRoot)}\" instead.`],\n });\n }\n\n const tokenMap = collectTokens(tg);\n for (const [token, accountIds] of tokenMap) {\n if (accountIds.length > 1) {\n results.push({\n id: `telegram-duplicate-token-${accountIds.join('-')}`,\n label: 'Telegram duplicate bot token',\n status: 'fail',\n message: `Bot token is shared by accounts: ${accountIds.join(', ')}.`,\n hints: ['Use one token per account or disable duplicate accounts.'],\n });\n }\n void token;\n }\n\n for (const [id, acc] of Object.entries(tg.accounts ?? {})) {\n if (hasTelegramBotEndpointApiRoot(acc.apiRoot)) {\n results.push({\n id: `telegram-account-api-root-${id}`,\n label: `Telegram apiRoot (${id})`,\n status: 'warn',\n message: `Account \"${id}\" apiRoot includes bot endpoint; will be normalized.`,\n hints: [`Use \"${normalizeTelegramApiRoot(acc.apiRoot)}\"`],\n });\n }\n const { token, source } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (tg.enabled && acc && source === 'none' && (acc as { enabled?: boolean }).enabled !== false) {\n results.push({\n id: `telegram-account-token-${id}`,\n label: `Telegram token (${id})`,\n status: 'fail',\n message: `Account \"${id}\" has no bot token or readable tokenFile.`,\n hints: ['Set botToken or tokenFile in channels.telegram.accounts.' + id],\n });\n }\n if (token && token.length < 20) {\n results.push({\n id: `telegram-account-token-short-${id}`,\n label: `Telegram token (${id})`,\n status: 'warn',\n message: `Account \"${id}\" bot token looks too short.`,\n hints: ['Verify the token from @BotFather.'],\n });\n }\n\n if (tg.enabled && token && acc.enabled !== false) {\n results.push(\n await checkGetMe({\n accountId: id,\n token,\n apiRoot: acc.apiRoot || tg.apiRoot,\n proxy: acc.proxy || tg.proxy,\n fetchImpl: params.fetchImpl,\n }),\n );\n }\n }\n\n return results;\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Bundled Telegram channel extension entry
|
|
2
|
+
* Bundled Telegram channel extension entry.
|
|
3
3
|
*/
|
|
4
4
|
export { telegramPlugin } from './plugin.js';
|
|
5
5
|
export type { TelegramAccount } from './plugin.js';
|
|
6
6
|
export { defineChannelPluginEntry } from '@xopcai/xopc/extensions/sdk/channel-entry.js';
|
|
7
|
+
declare const _default: {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
register(api: import("@xopcai/xopc/extension-sdk").ExtensionApi): void;
|
|
12
|
+
};
|
|
13
|
+
export default _default;
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
import { telegramPlugin } from "./plugin.js";
|
|
2
1
|
import { defineChannelPluginEntry } from "../../../src/extensions/sdk/channel-entry.js";
|
|
3
|
-
|
|
2
|
+
import { telegramPlugin } from "./plugin.js";
|
|
3
|
+
//#region extensions/telegram/src/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Bundled Telegram channel extension entry.
|
|
6
|
+
*/
|
|
7
|
+
var src_default = defineChannelPluginEntry({
|
|
8
|
+
id: "telegram",
|
|
9
|
+
name: "Telegram",
|
|
10
|
+
description: "Telegram Bot API channel",
|
|
11
|
+
plugin: telegramPlugin
|
|
12
|
+
});
|
|
13
|
+
//#endregion
|
|
14
|
+
export { src_default as default, defineChannelPluginEntry, telegramPlugin };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../extensions/telegram/src/index.ts"],"sourcesContent":["/**\n * Bundled Telegram channel extension entry.\n */\n\nimport { defineChannelPluginEntry } from '@xopcai/xopc/extensions/sdk/channel-entry.js';\n\nimport { telegramPlugin } from './plugin.js';\n\nexport { telegramPlugin } from './plugin.js';\nexport type { TelegramAccount } from './plugin.js';\nexport { defineChannelPluginEntry } from '@xopcai/xopc/extensions/sdk/channel-entry.js';\n\nexport default defineChannelPluginEntry({\n id: 'telegram',\n name: 'Telegram',\n description: 'Telegram Bot API channel',\n plugin: telegramPlugin,\n});\n"],"mappings":";;;;;;AAYA,IAAA,cAAe,yBAAyB;CACtC,IAAI;CACJ,MAAM;CACN,aAAa;CACb,QAAQ;CACT,CAAC"}
|
|
@@ -14,15 +14,23 @@ export declare class TelegramChannelPlugin implements ChannelPlugin<TelegramReso
|
|
|
14
14
|
readonly id: "telegram";
|
|
15
15
|
readonly reload: ChannelPluginReloadMeta;
|
|
16
16
|
readonly meta: {
|
|
17
|
-
readonly id: "telegram"
|
|
18
|
-
readonly label:
|
|
17
|
+
readonly id: "telegram";
|
|
18
|
+
readonly label: "Telegram";
|
|
19
19
|
readonly selectionLabel: "Telegram Bot";
|
|
20
20
|
readonly docsPath: "/channels/telegram";
|
|
21
|
-
readonly blurb:
|
|
21
|
+
readonly blurb: "Telegram Bot API channel";
|
|
22
22
|
readonly order: 0;
|
|
23
23
|
readonly deferConnectUntilAfterListen: true;
|
|
24
24
|
};
|
|
25
|
-
readonly capabilities:
|
|
25
|
+
readonly capabilities: {
|
|
26
|
+
readonly chatTypes: Array<"direct" | "group" | "channel" | "thread">;
|
|
27
|
+
readonly reactions: true;
|
|
28
|
+
readonly threads: true;
|
|
29
|
+
readonly media: true;
|
|
30
|
+
readonly polls: false;
|
|
31
|
+
readonly nativeCommands: true;
|
|
32
|
+
readonly blockStreaming: true;
|
|
33
|
+
};
|
|
26
34
|
readonly defaults: ChannelPluginDefaults;
|
|
27
35
|
readonly setupWizard: import("@xopcai/xopc/channels/setup-wizard.js").ChannelSetupWizard;
|
|
28
36
|
readonly configSchema: {
|
|
@@ -36,8 +44,8 @@ export declare class TelegramChannelPlugin implements ChannelPlugin<TelegramReso
|
|
|
36
44
|
};
|
|
37
45
|
};
|
|
38
46
|
readonly cronDelivery: ChannelCronDeliveryAdapter;
|
|
39
|
-
readonly configSurface: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelConfigSurfaceAdapter;
|
|
40
47
|
readonly onboard: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelOnboardAdapter;
|
|
48
|
+
readonly runtimeActions: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelRuntimeActionAdapter;
|
|
41
49
|
readonly doctor: {
|
|
42
50
|
check: (params: {
|
|
43
51
|
cfg: Config;
|
|
@@ -14,7 +14,6 @@ import { issuePairingChallenge } from "../../../src/channels/pairing/pairing-cha
|
|
|
14
14
|
import { createStandardPairingAdapter } from "../../../src/channels/pairing/pairing-store-adapter.js";
|
|
15
15
|
import { createTimeoutAbortSignal } from "./timeout-abort.js";
|
|
16
16
|
import { createInboundDebouncer } from "../../../src/infra/debounce.js";
|
|
17
|
-
import { getChatChannelMeta } from "../../../src/channels/registry.js";
|
|
18
17
|
import { getMimeType } from "../../../src/channels/media.js";
|
|
19
18
|
import { TelegramAccountManager } from "./account-manager.js";
|
|
20
19
|
import { createOutboundSender } from "./outbound-sender.js";
|
|
@@ -34,8 +33,8 @@ import { createTelegramStreamingAdapter } from "./adapters/streaming-adapter.js"
|
|
|
34
33
|
import { createTelegramCommandAdapter } from "./adapters/command-adapter.js";
|
|
35
34
|
import "./channel.js";
|
|
36
35
|
import { normalizeTelegramDeliveryChatId } from "./delivery-chat-id.js";
|
|
37
|
-
import { telegramConfigSurface } from "./adapters/config-surface.js";
|
|
38
36
|
import { telegramOnboardAdapter } from "./adapters/onboard-cli.js";
|
|
37
|
+
import { telegramGatewaySetupActions } from "./adapters/gateway-setup.js";
|
|
39
38
|
import { normalizeTelegramApiRoot } from "./api-root.js";
|
|
40
39
|
import { resolveTelegramBotToken } from "./token-resolver.js";
|
|
41
40
|
import { formatTelegramStartupError, isTelegramUnauthorizedTokenError } from "./startup-errors.js";
|
|
@@ -64,20 +63,44 @@ const TELEGRAM_GETME_TIMEOUT_MS = 2e4;
|
|
|
64
63
|
/** grammY per-request ceiling; must exceed long-poll `getUpdates` (~30s) but avoid multi-minute hangs on bad hosts. */
|
|
65
64
|
const TELEGRAM_CLIENT_TIMEOUT_SECONDS = 75;
|
|
66
65
|
const log = createLogger("TelegramPlugin");
|
|
67
|
-
|
|
66
|
+
function contextWithMessage(ctx, message) {
|
|
67
|
+
if (ctx.message === message) return ctx;
|
|
68
|
+
const clone = Object.create(Object.getPrototypeOf(ctx));
|
|
69
|
+
Object.defineProperties(clone, Object.getOwnPropertyDescriptors(ctx));
|
|
70
|
+
Object.defineProperty(clone, "message", {
|
|
71
|
+
configurable: true,
|
|
72
|
+
enumerable: true,
|
|
73
|
+
value: message,
|
|
74
|
+
writable: true
|
|
75
|
+
});
|
|
76
|
+
return clone;
|
|
77
|
+
}
|
|
68
78
|
var TelegramChannelPlugin = class {
|
|
69
79
|
id = "telegram";
|
|
70
80
|
reload = { configPrefixes: ["channels.telegram"] };
|
|
71
81
|
meta = {
|
|
72
|
-
id:
|
|
73
|
-
label:
|
|
82
|
+
id: "telegram",
|
|
83
|
+
label: "Telegram",
|
|
74
84
|
selectionLabel: "Telegram Bot",
|
|
75
85
|
docsPath: "/channels/telegram",
|
|
76
|
-
blurb:
|
|
86
|
+
blurb: "Telegram Bot API channel",
|
|
77
87
|
order: 0,
|
|
78
88
|
deferConnectUntilAfterListen: true
|
|
79
89
|
};
|
|
80
|
-
capabilities =
|
|
90
|
+
capabilities = {
|
|
91
|
+
chatTypes: [
|
|
92
|
+
"direct",
|
|
93
|
+
"group",
|
|
94
|
+
"channel",
|
|
95
|
+
"thread"
|
|
96
|
+
],
|
|
97
|
+
reactions: true,
|
|
98
|
+
threads: true,
|
|
99
|
+
media: true,
|
|
100
|
+
polls: false,
|
|
101
|
+
nativeCommands: true,
|
|
102
|
+
blockStreaming: true
|
|
103
|
+
};
|
|
81
104
|
defaults = {
|
|
82
105
|
queue: { debounceMs: TELEGRAM_CHANNEL_DEFAULTS.queue.debounceMs },
|
|
83
106
|
outbound: { textChunkLimit: TELEGRAM_CHANNEL_DEFAULTS.outbound.textChunkLimit }
|
|
@@ -96,8 +119,8 @@ var TelegramChannelPlugin = class {
|
|
|
96
119
|
cronDelivery = { async normalizeDeliveryTarget(to) {
|
|
97
120
|
return { chatId: normalizeTelegramDeliveryChatId(to) };
|
|
98
121
|
} };
|
|
99
|
-
configSurface = telegramConfigSurface;
|
|
100
122
|
onboard = telegramOnboardAdapter;
|
|
123
|
+
runtimeActions = telegramGatewaySetupActions;
|
|
101
124
|
doctor = { check: (params) => runTelegramDoctorChecks(params) };
|
|
102
125
|
pairing = createStandardPairingAdapter("telegram");
|
|
103
126
|
bus;
|
|
@@ -423,10 +446,7 @@ var TelegramChannelPlugin = class {
|
|
|
423
446
|
for (const msg of batch.messages) {
|
|
424
447
|
const batchCtx = batch.ctx;
|
|
425
448
|
await this.debouncer.enqueue({
|
|
426
|
-
ctx:
|
|
427
|
-
...batchCtx,
|
|
428
|
-
message: msg
|
|
429
|
-
},
|
|
449
|
+
ctx: contextWithMessage(batchCtx, msg),
|
|
430
450
|
accountId: batch.accountId,
|
|
431
451
|
message: msg
|
|
432
452
|
});
|
|
@@ -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';\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 { issuePairingChallenge, resolveStandardPairingPath } from '@xopcai/xopc/channels/pairing/index.js';\nimport { createStandardPairingAdapter } from '@xopcai/xopc/channels/pairing/pairing-store-adapter.js';\nimport { createTimeoutAbortSignal } from './timeout-abort.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 { getWorkflowProgressBroker } from '@xopcai/xopc/agent/workflow/index.js';\nimport { createTelegramWorkflowProgressCapability } from './workflow-progress.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';\nimport { normalizeTelegramApiRoot } from './api-root.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\nimport { formatTelegramStartupError, isTelegramUnauthorizedTokenError } from './startup-errors.js';\nimport { startTelegramPollingSession } from './polling-session.js';\nimport { createProxyFetch } from './proxy-fetch.js';\nimport { runTelegramDoctorChecks } from './doctor.js';\nimport { telegramReplyTracker } from './reply-params.js';\nimport { createTelegramInboundCoalescer } from './inbound-coalescer.js';\nimport { sendTelegramAckReaction, handleTelegramMessageReaction } from './reactions.js';\nimport { handleTelegramChannelAction, bindTelegramMessageActionAccountManager } from './actions/message-actions.js';\nimport { registerChannelExecApprovalHandler } from '@xopcai/xopc/channels/exec-approval-runtime.js';\nimport { createTelegramExecApprovalHandler } from './exec-approval-handler.js';\nimport { handleTelegramFocusCommand } from './focus-handler.js';\nimport { resolveTelegramApproval } from './approval-store.js';\nimport { isTelegramExecApprovalApprover } from './exec-approvals.js';\n\n/** Bound initial `getMe` so a bad `apiRoot` or unreachable API cannot block gateway startup for minutes. */\nconst TELEGRAM_GETME_TIMEOUT_MS = 20_000;\n/** grammY per-request ceiling; must exceed long-poll `getUpdates` (~30s) but avoid multi-minute hangs on bad hosts. */\nconst TELEGRAM_CLIENT_TIMEOUT_SECONDS = 75;\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 deferConnectUntilAfterListen: true,\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 readonly doctor = {\n check: (params: { cfg: Config }) => runTelegramDoctorChecks(params),\n };\n\n readonly pairing = createStandardPairingAdapter('telegram');\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 /** Unregister fn for the workflow-progress capability registered against the global broker. */\n private workflowProgressUnregister: (() => void) | null = null;\n private inboundCoalescer = createTelegramInboundCoalescer();\n private execApprovalUnregister: (() => void) | null = null;\n\n readonly actions = {\n handleAction: handleTelegramChannelAction,\n };\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 bindTelegramMessageActionAccountManager(this.accountManager);\n this.execApprovalUnregister?.();\n this.execApprovalUnregister = registerChannelExecApprovalHandler(\n 'telegram',\n createTelegramExecApprovalHandler({\n accountManager: this.accountManager,\n getConfig: () => this.cfg,\n }),\n );\n\n // Workflow progress is fed from the agent-side broker (subscribes to\n // tool_execution_update for the `workflow` tool); the capability turns\n // each snapshot into an edit-in-place Telegram message. Registration is\n // idempotent — the broker replaces a prior cap with the same channelId.\n this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(\n createTelegramWorkflowProgressCapability(this.accountManager),\n );\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(\n (opts) => this.outboundSender.send(opts),\n this.accountManager,\n );\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, Record<string, unknown>> | undefined;\n if (!accounts || Object.keys(accounts).length === 0) return;\n\n const channelApiRoot =\n typeof telegramCfg.apiRoot === 'string'\n ? normalizeTelegramApiRoot(telegramCfg.apiRoot)\n : undefined;\n const channelProxy =\n typeof telegramCfg.proxy === 'string' && telegramCfg.proxy.trim()\n ? telegramCfg.proxy.trim()\n : undefined;\n const channelReplyToMode = telegramCfg.replyToMode as TelegramResolvedAccount['replyToMode'];\n const channelStreaming = telegramCfg.streaming as TelegramResolvedAccount['streaming'];\n\n const tokenOwners = new Map<string, string[]>();\n\n for (const [id, account] of Object.entries(accounts)) {\n const { token, source } = resolveTelegramBotToken({\n botToken: typeof account.botToken === 'string' ? account.botToken : undefined,\n tokenFile: typeof account.tokenFile === 'string' ? account.tokenFile : undefined,\n });\n if (token) {\n const owners = tokenOwners.get(token) ?? [];\n owners.push(id);\n tokenOwners.set(token, owners);\n }\n\n const accApiRoot =\n typeof account.apiRoot === 'string'\n ? normalizeTelegramApiRoot(account.apiRoot)\n : undefined;\n const accProxy =\n typeof account.proxy === 'string' && account.proxy.trim() ? account.proxy.trim() : undefined;\n\n this.accountManager.registerAccount({\n ...account,\n accountId: id,\n botToken: token,\n tokenFile: typeof account.tokenFile === 'string' ? account.tokenFile : undefined,\n tokenSource: source,\n ...(accApiRoot || channelApiRoot ? { apiRoot: accApiRoot || channelApiRoot } : {}),\n ...(accProxy || channelProxy ? { proxy: accProxy || channelProxy } : {}),\n replyToMode:\n (account.replyToMode as TelegramResolvedAccount['replyToMode']) ?? channelReplyToMode,\n streaming:\n (account.streaming as TelegramResolvedAccount['streaming']) ?? channelStreaming,\n } as import('@xopcai/xopc/channels/channel-domain.js').TelegramAccountConfig);\n }\n\n for (const [token, owners] of tokenOwners) {\n if (owners.length > 1) {\n log.error(\n { accountIds: owners, tokenPreview: `${token.slice(0, 8)}…` },\n `Duplicate Telegram bot token across accounts: ${owners.join(', ')}`,\n );\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 // Only unregister the broker capability on a full stop (no specific\n // account). A per-account stop still leaves other accounts capable of\n // sending progress through the same registered cap.\n if (!accountId) {\n this.workflowProgressUnregister?.();\n this.workflowProgressUnregister = null;\n this.execApprovalUnregister?.();\n this.execApprovalUnregister = null;\n }\n }\n\n private async startAccount(account: TelegramResolvedAccount): Promise<void> {\n if (this.accountManager.isRunning(account.accountId)) return;\n\n const resolved = resolveTelegramBotToken({\n botToken: account.botToken,\n tokenFile: account.tokenFile,\n });\n if (!resolved.token) return;\n\n const duplicateAccounts = this.accountManager\n .getAllAccounts()\n .filter((a) => {\n const t = resolveTelegramBotToken({\n botToken: a.botToken,\n tokenFile: a.tokenFile,\n }).token;\n return t === resolved.token && a.accountId !== account.accountId;\n })\n .map((a) => a.accountId);\n if (duplicateAccounts.length > 0) {\n const em = `Duplicate bot token shared with account(s): ${duplicateAccounts.join(', ')}`;\n log.error({ accountId: account.accountId, duplicateAccounts }, em);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em,\n });\n return;\n }\n\n this.accountManager.markStarting(account.accountId);\n\n try {\n const client: {\n timeoutSeconds: number;\n apiRoot?: string;\n fetch?: typeof fetch;\n } = {\n timeoutSeconds: TELEGRAM_CLIENT_TIMEOUT_SECONDS,\n ...(account.apiRoot ? { apiRoot: account.apiRoot } : {}),\n ...(account.proxy ? { fetch: createProxyFetch(account.proxy) } : {}),\n };\n const bot = new Bot(resolved.token, { client });\n const getMeSignal = createTimeoutAbortSignal(TELEGRAM_GETME_TIMEOUT_MS);\n let me;\n try {\n me = await bot.api.getMe(getMeSignal.signal);\n } finally {\n getMeSignal.dispose();\n }\n\n this.accountManager.registerBot(account.accountId, bot);\n this.accountManager.setBotUsername(account.accountId, me.username);\n this.setupMessageHandler(account.accountId, bot);\n\n const session = startTelegramPollingSession({\n accountId: account.accountId,\n botToken: resolved.token,\n bot,\n stallThresholdMs: account.pollingStallThresholdMs,\n onExit: () => {\n void this.accountManager.stopRunner(account.accountId);\n },\n });\n this.accountManager.registerPollingSession(account.accountId, session);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: true,\n mode: 'polling',\n });\n\n log.info({ accountId: account.accountId, username: me.username }, 'Telegram account started');\n } catch (err) {\n const em = formatTelegramStartupError(err);\n const level = isTelegramUnauthorizedTokenError(err) ? 'error' : 'warn';\n log[level](\n {\n accountId: account.accountId,\n apiRootConfigured: !!account.apiRoot,\n unauthorized: isTelegramUnauthorizedTokenError(err),\n errorMessage: em,\n },\n `Telegram account not started: ${em}`,\n );\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em.slice(0, 400),\n });\n } finally {\n this.accountManager.markStartComplete(account.accountId);\n }\n }\n\n private attachRunnerExitHandler(_accountId: string, _runner: unknown): void {\n // Polling exit is handled by startTelegramPollingSession.onExit.\n }\n\n private setupMessageHandler(accountId: string, bot: Bot): void {\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const handleInboundMessage = async (ctx: Context) => {\n const text = ctx.message?.text ?? ctx.message?.caption ?? ctx.channelPost?.text ?? ctx.channelPost?.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 if (command === '/start') {\n await this.commandHandler.handleStart(ctx);\n return;\n }\n if (command === '/cleanup') {\n await this.commandHandler.handleCleanup(ctx);\n return;\n }\n if (command === '/focus') {\n await handleTelegramFocusCommand({ ctx, accountId, config: this.cfg });\n return;\n }\n\n const message = ctx.message ?? ctx.channelPost;\n if (!message) return;\n\n await this.inboundCoalescer.enqueue({\n ctx,\n accountId,\n message,\n onReady: async (batch) => {\n for (const msg of batch.messages) {\n const batchCtx = batch.ctx;\n await this.debouncer.enqueue({\n ctx: { ...batchCtx, message: msg } as Context,\n accountId: batch.accountId,\n message: msg,\n });\n }\n },\n });\n };\n\n bot.on('message', async (ctx) => {\n try {\n await handleInboundMessage(ctx);\n } catch (err) {\n log.error({ accountId, err }, 'Message handler error');\n }\n });\n\n bot.on('channel_post', async (ctx) => {\n try {\n await handleInboundMessage(ctx);\n } catch (err) {\n log.error({ accountId, err }, 'Channel post handler error');\n }\n });\n\n bot.on('message_reaction', async (ctx) => {\n try {\n await handleTelegramMessageReaction({\n ctx,\n accountId,\n bus: this.bus,\n mode: account.reactionNotifications as 'off' | 'own' | 'all' | undefined,\n });\n } catch (err) {\n log.error({ accountId, err }, 'Message reaction 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 if (data.startsWith('approval:approve:') || data.startsWith('approval:deny:')) {\n const approved = data.startsWith('approval:approve:');\n const approvalId = data.slice(approved ? 'approval:approve:'.length : 'approval:deny:'.length);\n const senderId = String(ctx.from?.id ?? '');\n if (\n !isTelegramExecApprovalApprover({\n cfg: this.cfg,\n accountId: _accountId,\n senderId,\n })\n ) {\n await ctx.answerCallbackQuery('Not authorized');\n return;\n }\n if (resolveTelegramApproval(approvalId, approved)) {\n await ctx.answerCallbackQuery(approved ? 'Approved' : 'Denied');\n } else {\n await ctx.answerCallbackQuery('Approval expired or already resolved');\n }\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 telegramReplyTracker.reset(accountId, chatId);\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 if (!isGroup && accessResult?.reason === 'pairing-required') {\n const cid = ctx.chat?.id;\n const bot = cid != null ? this.accountManager.getBot(accountId) : undefined;\n if (bot && cid != null && senderId) {\n void issuePairingChallenge({\n channel: 'telegram',\n pairingFilePath: resolveStandardPairingPath('telegram', accountId),\n accountId,\n senderId,\n senderIdLine: `Your Telegram user id: ${senderId}`,\n sendPairingReply: async (text) => {\n await bot.api.sendMessage(cid, text);\n },\n onCreated: ({ code }) => {\n log.info({ accountId, senderId, code }, 'Telegram DM pairing code issued');\n },\n onReplyError: (err) => {\n log.warn({ err, accountId, chatId: String(cid) }, 'Telegram pairing reply failed');\n },\n });\n }\n return;\n }\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 const bot = this.accountManager.getBot(accountId);\n const messageId = ctx.message?.message_id;\n const reactionLevel = (account as { reactionLevel?: string }).reactionLevel ?? 'ack';\n const ackEmoji = (account as { ackReaction?: string }).ackReaction ?? '👀';\n if (\n bot &&\n messageId &&\n reactionLevel !== 'off' &&\n ctx.chat?.id != null &&\n !ctx.channelPost\n ) {\n void sendTelegramAckReaction({\n bot,\n chatId: ctx.chat.id,\n messageId,\n emoji: ackEmoji,\n });\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';\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 { issuePairingChallenge, resolveStandardPairingPath } from '@xopcai/xopc/channels/pairing/index.js';\nimport { createStandardPairingAdapter } from '@xopcai/xopc/channels/pairing/pairing-store-adapter.js';\nimport { createTimeoutAbortSignal } from './timeout-abort.js';\nimport { createInboundDebouncer } from '@xopcai/xopc/infra/debounce.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 { getWorkflowProgressBroker } from '@xopcai/xopc/agent/workflow/index.js';\nimport { createTelegramWorkflowProgressCapability } from './workflow-progress.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 { telegramOnboardAdapter } from './adapters/onboard-cli.js';\nimport { telegramGatewaySetupActions } from './adapters/gateway-setup.js';\nimport { TelegramConfigSchema } from './config-schema.js';\nimport { normalizeTelegramApiRoot } from './api-root.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\nimport { formatTelegramStartupError, isTelegramUnauthorizedTokenError } from './startup-errors.js';\nimport { startTelegramPollingSession } from './polling-session.js';\nimport { createProxyFetch } from './proxy-fetch.js';\nimport { runTelegramDoctorChecks } from './doctor.js';\nimport { telegramReplyTracker } from './reply-params.js';\nimport { createTelegramInboundCoalescer } from './inbound-coalescer.js';\nimport { sendTelegramAckReaction, handleTelegramMessageReaction } from './reactions.js';\nimport { handleTelegramChannelAction, bindTelegramMessageActionAccountManager } from './actions/message-actions.js';\nimport { registerChannelExecApprovalHandler } from '@xopcai/xopc/channels/exec-approval-runtime.js';\nimport { createTelegramExecApprovalHandler } from './exec-approval-handler.js';\nimport { handleTelegramFocusCommand } from './focus-handler.js';\nimport { resolveTelegramApproval } from './approval-store.js';\nimport { isTelegramExecApprovalApprover } from './exec-approvals.js';\n\n/** Bound initial `getMe` so a bad `apiRoot` or unreachable API cannot block gateway startup for minutes. */\nconst TELEGRAM_GETME_TIMEOUT_MS = 20_000;\n/** grammY per-request ceiling; must exceed long-poll `getUpdates` (~30s) but avoid multi-minute hangs on bad hosts. */\nconst TELEGRAM_CLIENT_TIMEOUT_SECONDS = 75;\n\nconst log = createLogger('TelegramPlugin');\n\nfunction contextWithMessage(ctx: Context, message: import('@grammyjs/types').Message): Context {\n if (ctx.message === message) return ctx;\n\n const clone = Object.create(Object.getPrototypeOf(ctx)) as Context;\n Object.defineProperties(clone, Object.getOwnPropertyDescriptors(ctx));\n Object.defineProperty(clone, 'message', {\n configurable: true,\n enumerable: true,\n value: message,\n writable: true,\n });\n return clone;\n}\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',\n label: 'Telegram',\n selectionLabel: 'Telegram Bot',\n docsPath: '/channels/telegram',\n blurb: 'Telegram Bot API channel',\n order: 0,\n deferConnectUntilAfterListen: true,\n } as const;\n\n readonly capabilities = {\n chatTypes: ['direct', 'group', 'channel', 'thread'] as Array<'direct' | 'group' | 'channel' | 'thread'>,\n reactions: true,\n threads: true,\n media: true,\n polls: false,\n nativeCommands: true,\n blockStreaming: true,\n } as const;\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 onboard = telegramOnboardAdapter;\n\n readonly runtimeActions = telegramGatewaySetupActions;\n\n readonly doctor = {\n check: (params: { cfg: Config }) => runTelegramDoctorChecks(params),\n };\n\n readonly pairing = createStandardPairingAdapter('telegram');\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 /** Unregister fn for the workflow-progress capability registered against the global broker. */\n private workflowProgressUnregister: (() => void) | null = null;\n private inboundCoalescer = createTelegramInboundCoalescer();\n private execApprovalUnregister: (() => void) | null = null;\n\n readonly actions = {\n handleAction: handleTelegramChannelAction,\n };\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 bindTelegramMessageActionAccountManager(this.accountManager);\n this.execApprovalUnregister?.();\n this.execApprovalUnregister = registerChannelExecApprovalHandler(\n 'telegram',\n createTelegramExecApprovalHandler({\n accountManager: this.accountManager,\n getConfig: () => this.cfg,\n }),\n );\n\n // Workflow progress is fed from the agent-side broker (subscribes to\n // tool_execution_update for the `workflow` tool); the capability turns\n // each snapshot into an edit-in-place Telegram message. Registration is\n // idempotent — the broker replaces a prior cap with the same channelId.\n this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(\n createTelegramWorkflowProgressCapability(this.accountManager),\n );\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(\n (opts) => this.outboundSender.send(opts),\n this.accountManager,\n );\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, Record<string, unknown>> | undefined;\n if (!accounts || Object.keys(accounts).length === 0) return;\n\n const channelApiRoot =\n typeof telegramCfg.apiRoot === 'string'\n ? normalizeTelegramApiRoot(telegramCfg.apiRoot)\n : undefined;\n const channelProxy =\n typeof telegramCfg.proxy === 'string' && telegramCfg.proxy.trim()\n ? telegramCfg.proxy.trim()\n : undefined;\n const channelReplyToMode = telegramCfg.replyToMode as TelegramResolvedAccount['replyToMode'];\n const channelStreaming = telegramCfg.streaming as TelegramResolvedAccount['streaming'];\n\n const tokenOwners = new Map<string, string[]>();\n\n for (const [id, account] of Object.entries(accounts)) {\n const { token, source } = resolveTelegramBotToken({\n botToken: typeof account.botToken === 'string' ? account.botToken : undefined,\n tokenFile: typeof account.tokenFile === 'string' ? account.tokenFile : undefined,\n });\n if (token) {\n const owners = tokenOwners.get(token) ?? [];\n owners.push(id);\n tokenOwners.set(token, owners);\n }\n\n const accApiRoot =\n typeof account.apiRoot === 'string'\n ? normalizeTelegramApiRoot(account.apiRoot)\n : undefined;\n const accProxy =\n typeof account.proxy === 'string' && account.proxy.trim() ? account.proxy.trim() : undefined;\n\n this.accountManager.registerAccount({\n ...account,\n accountId: id,\n botToken: token,\n tokenFile: typeof account.tokenFile === 'string' ? account.tokenFile : undefined,\n tokenSource: source,\n ...(accApiRoot || channelApiRoot ? { apiRoot: accApiRoot || channelApiRoot } : {}),\n ...(accProxy || channelProxy ? { proxy: accProxy || channelProxy } : {}),\n replyToMode:\n (account.replyToMode as TelegramResolvedAccount['replyToMode']) ?? channelReplyToMode,\n streaming:\n (account.streaming as TelegramResolvedAccount['streaming']) ?? channelStreaming,\n } as import('@xopcai/xopc/channels/channel-domain.js').TelegramAccountConfig);\n }\n\n for (const [token, owners] of tokenOwners) {\n if (owners.length > 1) {\n log.error(\n { accountIds: owners, tokenPreview: `${token.slice(0, 8)}…` },\n `Duplicate Telegram bot token across accounts: ${owners.join(', ')}`,\n );\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 // Only unregister the broker capability on a full stop (no specific\n // account). A per-account stop still leaves other accounts capable of\n // sending progress through the same registered cap.\n if (!accountId) {\n this.workflowProgressUnregister?.();\n this.workflowProgressUnregister = null;\n this.execApprovalUnregister?.();\n this.execApprovalUnregister = null;\n }\n }\n\n private async startAccount(account: TelegramResolvedAccount): Promise<void> {\n if (this.accountManager.isRunning(account.accountId)) return;\n\n const resolved = resolveTelegramBotToken({\n botToken: account.botToken,\n tokenFile: account.tokenFile,\n });\n if (!resolved.token) return;\n\n const duplicateAccounts = this.accountManager\n .getAllAccounts()\n .filter((a) => {\n const t = resolveTelegramBotToken({\n botToken: a.botToken,\n tokenFile: a.tokenFile,\n }).token;\n return t === resolved.token && a.accountId !== account.accountId;\n })\n .map((a) => a.accountId);\n if (duplicateAccounts.length > 0) {\n const em = `Duplicate bot token shared with account(s): ${duplicateAccounts.join(', ')}`;\n log.error({ accountId: account.accountId, duplicateAccounts }, em);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em,\n });\n return;\n }\n\n this.accountManager.markStarting(account.accountId);\n\n try {\n const client: {\n timeoutSeconds: number;\n apiRoot?: string;\n fetch?: typeof fetch;\n } = {\n timeoutSeconds: TELEGRAM_CLIENT_TIMEOUT_SECONDS,\n ...(account.apiRoot ? { apiRoot: account.apiRoot } : {}),\n ...(account.proxy ? { fetch: createProxyFetch(account.proxy) } : {}),\n };\n const bot = new Bot(resolved.token, { client });\n const getMeSignal = createTimeoutAbortSignal(TELEGRAM_GETME_TIMEOUT_MS);\n let me;\n try {\n me = await bot.api.getMe(getMeSignal.signal);\n } finally {\n getMeSignal.dispose();\n }\n\n this.accountManager.registerBot(account.accountId, bot);\n this.accountManager.setBotUsername(account.accountId, me.username);\n this.setupMessageHandler(account.accountId, bot);\n\n const session = startTelegramPollingSession({\n accountId: account.accountId,\n botToken: resolved.token,\n bot,\n stallThresholdMs: account.pollingStallThresholdMs,\n onExit: () => {\n void this.accountManager.stopRunner(account.accountId);\n },\n });\n this.accountManager.registerPollingSession(account.accountId, session);\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: true,\n mode: 'polling',\n });\n\n log.info({ accountId: account.accountId, username: me.username }, 'Telegram account started');\n } catch (err) {\n const em = formatTelegramStartupError(err);\n const level = isTelegramUnauthorizedTokenError(err) ? 'error' : 'warn';\n log[level](\n {\n accountId: account.accountId,\n apiRootConfigured: !!account.apiRoot,\n unauthorized: isTelegramUnauthorizedTokenError(err),\n errorMessage: em,\n },\n `Telegram account not started: ${em}`,\n );\n this.accountManager.updateStatus({\n accountId: account.accountId,\n running: false,\n mode: 'stopped',\n lastError: em.slice(0, 400),\n });\n } finally {\n this.accountManager.markStartComplete(account.accountId);\n }\n }\n\n private attachRunnerExitHandler(_accountId: string, _runner: unknown): void {\n // Polling exit is handled by startTelegramPollingSession.onExit.\n }\n\n private setupMessageHandler(accountId: string, bot: Bot): void {\n const account = this.config.resolveAccount(this.cfg, accountId);\n\n const handleInboundMessage = async (ctx: Context) => {\n const text = ctx.message?.text ?? ctx.message?.caption ?? ctx.channelPost?.text ?? ctx.channelPost?.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 if (command === '/start') {\n await this.commandHandler.handleStart(ctx);\n return;\n }\n if (command === '/cleanup') {\n await this.commandHandler.handleCleanup(ctx);\n return;\n }\n if (command === '/focus') {\n await handleTelegramFocusCommand({ ctx, accountId, config: this.cfg });\n return;\n }\n\n const message = ctx.message ?? ctx.channelPost;\n if (!message) return;\n\n await this.inboundCoalescer.enqueue({\n ctx,\n accountId,\n message,\n onReady: async (batch) => {\n for (const msg of batch.messages) {\n const batchCtx = batch.ctx;\n await this.debouncer.enqueue({\n ctx: contextWithMessage(batchCtx, msg),\n accountId: batch.accountId,\n message: msg,\n });\n }\n },\n });\n };\n\n bot.on('message', async (ctx) => {\n try {\n await handleInboundMessage(ctx);\n } catch (err) {\n log.error({ accountId, err }, 'Message handler error');\n }\n });\n\n bot.on('channel_post', async (ctx) => {\n try {\n await handleInboundMessage(ctx);\n } catch (err) {\n log.error({ accountId, err }, 'Channel post handler error');\n }\n });\n\n bot.on('message_reaction', async (ctx) => {\n try {\n await handleTelegramMessageReaction({\n ctx,\n accountId,\n bus: this.bus,\n mode: account.reactionNotifications as 'off' | 'own' | 'all' | undefined,\n });\n } catch (err) {\n log.error({ accountId, err }, 'Message reaction 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 if (data.startsWith('approval:approve:') || data.startsWith('approval:deny:')) {\n const approved = data.startsWith('approval:approve:');\n const approvalId = data.slice(approved ? 'approval:approve:'.length : 'approval:deny:'.length);\n const senderId = String(ctx.from?.id ?? '');\n if (\n !isTelegramExecApprovalApprover({\n cfg: this.cfg,\n accountId: _accountId,\n senderId,\n })\n ) {\n await ctx.answerCallbackQuery('Not authorized');\n return;\n }\n if (resolveTelegramApproval(approvalId, approved)) {\n await ctx.answerCallbackQuery(approved ? 'Approved' : 'Denied');\n } else {\n await ctx.answerCallbackQuery('Approval expired or already resolved');\n }\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 telegramReplyTracker.reset(accountId, chatId);\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 if (!isGroup && accessResult?.reason === 'pairing-required') {\n const cid = ctx.chat?.id;\n const bot = cid != null ? this.accountManager.getBot(accountId) : undefined;\n if (bot && cid != null && senderId) {\n void issuePairingChallenge({\n channel: 'telegram',\n pairingFilePath: resolveStandardPairingPath('telegram', accountId),\n accountId,\n senderId,\n senderIdLine: `Your Telegram user id: ${senderId}`,\n sendPairingReply: async (text) => {\n await bot.api.sendMessage(cid, text);\n },\n onCreated: ({ code }) => {\n log.info({ accountId, senderId, code }, 'Telegram DM pairing code issued');\n },\n onReplyError: (err) => {\n log.warn({ err, accountId, chatId: String(cid) }, 'Telegram pairing reply failed');\n },\n });\n }\n return;\n }\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 const bot = this.accountManager.getBot(accountId);\n const messageId = ctx.message?.message_id;\n const reactionLevel = (account as { reactionLevel?: string }).reactionLevel ?? 'ack';\n const ackEmoji = (account as { ackReaction?: string }).ackReaction ?? '👀';\n if (\n bot &&\n messageId &&\n reactionLevel !== 'off' &&\n ctx.chat?.id != null &&\n !ctx.channelPost\n ) {\n void sendTelegramAckReaction({\n bot,\n chatId: ctx.chat.id,\n messageId,\n emoji: ackEmoji,\n });\n }\n\n await this.inboundProcessor(ctx, accountId);\n }\n}\n\nexport const telegramPlugin = new TelegramChannelPlugin();\n"],"mappings":"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"}
|
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
import { ProxyAgent, fetch } from "undici";
|
|
2
2
|
//#region extensions/telegram/src/proxy-fetch.ts
|
|
3
|
+
function toNativeAbortSignal(signal) {
|
|
4
|
+
if (!signal) return void 0;
|
|
5
|
+
if (signal instanceof AbortSignal) return signal;
|
|
6
|
+
const maybeSignal = signal;
|
|
7
|
+
if (typeof maybeSignal.addEventListener !== "function") return void 0;
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
if (maybeSignal.aborted) {
|
|
10
|
+
controller.abort(maybeSignal.reason);
|
|
11
|
+
return controller.signal;
|
|
12
|
+
}
|
|
13
|
+
maybeSignal.addEventListener("abort", () => controller.abort(maybeSignal.reason), { once: true });
|
|
14
|
+
return controller.signal;
|
|
15
|
+
}
|
|
3
16
|
/** Build a fetch compatible with grammY client when an HTTP proxy is configured. */
|
|
4
17
|
function createProxyFetch(proxyUrl) {
|
|
5
|
-
const
|
|
6
|
-
return ((input, init) =>
|
|
7
|
-
...init
|
|
8
|
-
|
|
9
|
-
|
|
18
|
+
const dispatcher = new ProxyAgent(proxyUrl);
|
|
19
|
+
return ((input, init) => {
|
|
20
|
+
const { agent: _agent, compress: _compress, signal, ...rest } = init ?? {};
|
|
21
|
+
return fetch(input, {
|
|
22
|
+
...rest,
|
|
23
|
+
signal: toNativeAbortSignal(signal),
|
|
24
|
+
dispatcher
|
|
25
|
+
});
|
|
26
|
+
});
|
|
10
27
|
}
|
|
11
28
|
//#endregion
|
|
12
29
|
export { createProxyFetch };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-fetch.js","names":["undiciFetch"],"sources":["../../../../extensions/telegram/src/proxy-fetch.ts"],"sourcesContent":["import { ProxyAgent, fetch as undiciFetch } from 'undici';\n\n/** Build a fetch compatible with grammY client when an HTTP proxy is configured. */\nexport function createProxyFetch(proxyUrl: string): typeof fetch {\n const
|
|
1
|
+
{"version":3,"file":"proxy-fetch.js","names":["undiciFetch"],"sources":["../../../../extensions/telegram/src/proxy-fetch.ts"],"sourcesContent":["import { ProxyAgent, fetch as undiciFetch } from 'undici';\n\nfunction toNativeAbortSignal(signal: unknown): AbortSignal | undefined {\n if (!signal) return undefined;\n if (signal instanceof AbortSignal) return signal;\n\n const maybeSignal = signal as {\n aborted?: boolean;\n reason?: unknown;\n addEventListener?: (type: 'abort', listener: () => void, opts?: { once?: boolean }) => void;\n };\n if (typeof maybeSignal.addEventListener !== 'function') return undefined;\n\n const controller = new AbortController();\n if (maybeSignal.aborted) {\n controller.abort(maybeSignal.reason);\n return controller.signal;\n }\n maybeSignal.addEventListener('abort', () => controller.abort(maybeSignal.reason), { once: true });\n return controller.signal;\n}\n\n/** Build a fetch compatible with grammY client when an HTTP proxy is configured. */\nexport function createProxyFetch(proxyUrl: string): typeof fetch {\n const dispatcher = new ProxyAgent(proxyUrl);\n return ((input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => {\n const { agent: _agent, compress: _compress, signal, ...rest } = (init ?? {}) as Record<string, unknown>;\n return undiciFetch(input as string, {\n ...rest,\n signal: toNativeAbortSignal(signal),\n dispatcher,\n }) as unknown as Promise<Response>;\n }) as typeof fetch;\n}\n"],"mappings":";;AAEA,SAAS,oBAAoB,QAA0C;AACrE,KAAI,CAAC,OAAQ,QAAO,KAAA;AACpB,KAAI,kBAAkB,YAAa,QAAO;CAE1C,MAAM,cAAc;AAKpB,KAAI,OAAO,YAAY,qBAAqB,WAAY,QAAO,KAAA;CAE/D,MAAM,aAAa,IAAI,iBAAiB;AACxC,KAAI,YAAY,SAAS;AACvB,aAAW,MAAM,YAAY,OAAO;AACpC,SAAO,WAAW;;AAEpB,aAAY,iBAAiB,eAAe,WAAW,MAAM,YAAY,OAAO,EAAE,EAAE,MAAM,MAAM,CAAC;AACjG,QAAO,WAAW;;;AAIpB,SAAgB,iBAAiB,UAAgC;CAC/D,MAAM,aAAa,IAAI,WAAW,SAAS;AAC3C,UAAS,OAAoC,SAAuC;EAClF,MAAM,EAAE,OAAO,QAAQ,UAAU,WAAW,QAAQ,GAAG,SAAU,QAAQ,EAAE;AAC3E,SAAOA,MAAY,OAAiB;GAClC,GAAG;GACH,QAAQ,oBAAoB,OAAO;GACnC;GACD,CAAC"}
|