@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":[],"sources":["../../../src/channels/manager.ts"],"sourcesContent":["/**\n * Channel Manager — thin composition root for the channel subsystem.\n *\n * Wires together the four coordinators that own what used to be the eight\n * concerns of this 707-line class:\n *\n * - {@link ChannelPluginRegistry} — plugins Map, register/get\n * - {@link ChannelLifecycleSupervisor} — init/start/stop/restart-backoff\n * - {@link ChannelHeartbeatScheduler} — per-account heartbeat probes\n * - {@link ChannelOutboundSender} — TTS rewrite + persist + delivery\n *\n * The public surface (`registerPlugin`, `initialize`, `start`, `send`, etc.) is\n * preserved so callers (`GatewayService`, CLI commands, channel plugins) are\n * unchanged.\n */\n\nimport type { Config } from '../config/schema.js';\nimport type { MessageBus } from '../infra/bus/index.js';\n\nimport type { InboundMessage, OutboundMessage } from './transport-types.js';\nimport type {\n ChannelPlugin,\n ChannelPluginSessionModelHooks,\n ChannelStreamHandle,\n} from './plugin-types.js';\nimport { ChannelHealthMonitor, type ChannelHealthState } from './health-monitor.js';\nimport { ChannelPluginRegistry } from './plugin-registry.js';\nimport { ChannelHeartbeatScheduler } from './heartbeat-scheduler.js';\nimport {\n ChannelOutboundSender,\n type OutboundChannelHooks,\n} from './outbound-sender.js';\nimport { ChannelLifecycleSupervisor } from './lifecycle-supervisor.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('ChannelManager');\n\nexport type { OutboundChannelHooks } from './outbound-sender.js';\n\nexport class ChannelManager {\n private config: Config;\n private readonly registry = new ChannelPluginRegistry();\n private readonly healthMonitor = new ChannelHealthMonitor();\n private readonly lifecycle: ChannelLifecycleSupervisor;\n private readonly heartbeat: ChannelHeartbeatScheduler;\n private readonly outbound: ChannelOutboundSender;\n private sessionModelHooks?: ChannelPluginSessionModelHooks;\n\n constructor(config: Config, bus: MessageBus) {\n this.config = config;\n\n this.heartbeat = new ChannelHeartbeatScheduler({\n getConfig: () => this.config,\n healthMonitor: this.healthMonitor,\n requestSoftRestart: (channelId) => {\n void this.lifecycle.softRestart(channelId);\n },\n });\n\n this.lifecycle = new ChannelLifecycleSupervisor({\n bus,\n registry: this.registry,\n getConfig: () => this.config,\n getSessionModelHooks: () => this.sessionModelHooks,\n onPluginStarted: (plugin) => this.heartbeat.schedule(plugin),\n onPluginStopped: (pluginId) => this.heartbeat.clear(pluginId),\n });\n\n this.outbound = new ChannelOutboundSender({\n registry: this.registry,\n getConfig: () => this.config,\n });\n }\n\n // ── Wiring hooks (called by GatewayService / cli) ─────────────────────\n\n setOutboundHooks(hooks: OutboundChannelHooks): void {\n this.outbound.setHooks(hooks);\n }\n\n /** Call before `initialize()` so plugins can persist per-session model overrides. */\n setSessionModelHooks(hooks: ChannelPluginSessionModelHooks | undefined): void {\n this.sessionModelHooks = hooks;\n }\n\n enableOutboundPersistence(agentDir: string): void {\n this.outbound.enablePersistence(agentDir);\n }\n\n // ── Plugin registry pass-throughs ──────────────────────────────────────\n\n registerPlugin(plugin: ChannelPlugin): void {\n this.registry.register(plugin);\n }\n\n getPlugin(id: string): ChannelPlugin | undefined {\n return this.registry.get(id);\n }\n\n getAllPlugins(): ChannelPlugin[] {\n return this.registry.all();\n }\n\n /** Backward-compat alias for `getAllPlugins`. */\n getAllChannels(): ChannelPlugin[] {\n return this.registry.all();\n }\n\n /** Channel IDs whose runtime reports connected (e.g. Telegram polling active). */\n getRunningChannels(): string[] {\n return this.registry.runningChannelIds(this.config, (id) => this.lifecycle.isInitialized(id));\n }\n\n // ── Lifecycle pass-throughs ────────────────────────────────────────────\n\n initialize(): Promise<void> {\n return this.lifecycle.initialize();\n }\n\n start(options?: { deferConnectPluginIds?: ReadonlySet<string> }): Promise<void> {\n return this.lifecycle.start(options);\n }\n\n startDeferredConnects(): Promise<void> {\n return this.lifecycle.startDeferredConnects();\n }\n\n async stop(): Promise<void> {\n await this.lifecycle.stop();\n this.heartbeat.clearAll();\n }\n\n stopChannel(channelId: string): Promise<void> {\n return this.lifecycle.stopChannel(channelId);\n }\n\n startChannel(channelId: string): Promise<void> {\n return this.lifecycle.startChannel(channelId);\n }\n\n listDeferConnectChannelIds(cfg: Config): string[] {\n return this.lifecycle.listDeferConnectChannelIds(cfg);\n }\n\n // ── Outbound pass-throughs ─────────────────────────────────────────────\n\n send(msg: OutboundMessage, options?: { skipPersist?: boolean }): Promise<void> {\n return this.outbound.send(msg, options);\n }\n\n replayPendingOutboundMessages(): Promise<void> {\n return this.outbound.replayPending();\n }\n\n // ── Streaming + status query (delegated to plugin directly) ────────────\n\n startStream(\n channel: string,\n chatId: string,\n accountId?: string,\n opts?: { threadId?: string; replyToMessageId?: string },\n ): ChannelStreamHandle | null {\n const plugin = this.registry.get(channel);\n if (!plugin) {\n log.error({ channel }, 'Unknown channel');\n return null;\n }\n return (\n plugin.streaming?.startStream?.({\n chatId,\n accountId,\n threadId: opts?.threadId,\n replyToMessageId: opts?.replyToMessageId,\n }) ?? null\n );\n }\n\n async getChannelStatus(channel: string): Promise<Record<string, unknown>> {\n const plugin = this.registry.get(channel);\n if (!plugin) return { error: 'Unknown channel' };\n if (!plugin.status?.buildChannelSummary) return { status: 'unknown' };\n\n try {\n const accountId = plugin.config.listAccountIds(this.config)[0] ?? 'default';\n const account = plugin.config.resolveAccount(this.config, accountId);\n return await plugin.status.buildChannelSummary({\n account,\n cfg: this.config,\n defaultAccountId: accountId,\n snapshot: plugin.status.defaultRuntime ?? { accountId, channelId: channel, enabled: true, configured: true },\n });\n } catch (err) {\n return { error: String(err) };\n }\n }\n\n // ── Inbound action dispatch (Feishu card actions) ──────────────────────\n\n /**\n * Optional channel hook before `AgentService` consumes an inbound message\n * (e.g. Feishu card-action triggers).\n */\n async dispatchInboundMessageAction(msg: InboundMessage): Promise<void> {\n const plugin = this.registry.get(msg.channel);\n const handle = plugin?.actions?.handleAction;\n if (!handle) return;\n\n const meta = msg.metadata as Record<string, unknown> | undefined;\n if (msg.channel !== 'feishu' || meta?.feishuEventType !== 'card.action.trigger') {\n return;\n }\n\n const cardAction = meta.cardAction as Record<string, unknown> | undefined;\n const actionTag =\n cardAction && typeof cardAction.tag === 'string' && cardAction.tag.trim()\n ? cardAction.tag.trim()\n : 'feishu.card_action';\n const cardCtx = meta.cardContext as Record<string, unknown> | undefined;\n const openMsg =\n cardCtx && typeof cardCtx.open_message_id === 'string' ? cardCtx.open_message_id.trim() : '';\n const fallbackMsgId = typeof meta.messageId === 'string' ? meta.messageId.trim() : '';\n const messageId = openMsg || fallbackMsgId;\n const accountId =\n typeof meta.accountId === 'string' && meta.accountId.trim() ? meta.accountId.trim() : 'default';\n\n try {\n await handle({\n action: actionTag,\n data: JSON.stringify({\n cardAction: meta.cardAction,\n cardContext: meta.cardContext,\n cardActionText: meta.cardActionText,\n }),\n messageId,\n senderId: msg.sender_id,\n chatId: msg.chat_id,\n accountId,\n metadata: {\n feishuEventType: meta.feishuEventType,\n raw: meta.raw,\n sessionKey: meta.sessionKey,\n userContent: msg.content,\n },\n });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ err, channel: msg.channel, accountId, em }, 'dispatchInboundMessageAction failed');\n }\n }\n\n // ── Config + introspection ─────────────────────────────────────────────\n\n async updateConfig(config: Config): Promise<void> {\n this.config = config;\n await this.lifecycle.forwardConfigUpdate(config);\n log.info('Channel config updated');\n }\n\n /** Replace in-memory config without running plugin `onConfigUpdated` hooks. */\n setRuntimeConfig(config: Config): void {\n this.config = config;\n }\n\n getRuntimeSnapshot(): {\n initialized: boolean;\n running: boolean;\n pluginIds: string[];\n initializedPluginIds: string[];\n manuallyStopped: string[];\n restartAttempts: Record<string, number>;\n channelHealth: Record<string, ChannelHealthState>;\n } {\n const lifecycleSnap = this.lifecycle.snapshot();\n return {\n ...lifecycleSnap,\n pluginIds: this.registry.ids(),\n channelHealth: this.healthMonitor.toJSON(),\n };\n }\n\n getHealthMonitor(): ChannelHealthMonitor {\n return this.healthMonitor;\n }\n}\n\nexport function createChannelManager(config: Config, bus: MessageBus): ChannelManager {\n return new ChannelManager(config, bus);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","names":[],"sources":["../../../src/channels/manager.ts"],"sourcesContent":["/**\n * Channel Manager — thin composition root for the channel subsystem.\n *\n * Wires together the four coordinators that own what used to be the eight\n * concerns of this 707-line class:\n *\n * - {@link ChannelPluginRegistry} — plugins Map, register/get\n * - {@link ChannelLifecycleSupervisor} — init/start/stop/restart-backoff\n * - {@link ChannelHeartbeatScheduler} — per-account heartbeat probes\n * - {@link ChannelOutboundSender} — TTS rewrite + persist + delivery\n *\n * The public surface (`registerPlugin`, `initialize`, `start`, `send`, etc.) is\n * preserved so callers (`GatewayService`, CLI commands, channel plugins) are\n * unchanged.\n */\n\nimport type { Config } from '../config/schema.js';\nimport type { MessageBus } from '../infra/bus/index.js';\n\nimport type { InboundMessage, OutboundMessage } from './transport-types.js';\nimport type {\n ChannelPlugin,\n ChannelPluginSessionModelHooks,\n ChannelStreamHandle,\n} from './plugin-types.js';\nimport { ChannelHealthMonitor, type ChannelHealthState } from './health-monitor.js';\nimport { ChannelPluginRegistry } from './plugin-registry.js';\nimport { ChannelHeartbeatScheduler } from './heartbeat-scheduler.js';\nimport {\n ChannelOutboundSender,\n type OutboundChannelHooks,\n} from './outbound-sender.js';\nimport { ChannelLifecycleSupervisor } from './lifecycle-supervisor.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('ChannelManager');\n\nexport type { OutboundChannelHooks } from './outbound-sender.js';\n\nexport class ChannelManager {\n private config: Config;\n private readonly registry = new ChannelPluginRegistry();\n private readonly healthMonitor = new ChannelHealthMonitor();\n private readonly lifecycle: ChannelLifecycleSupervisor;\n private readonly heartbeat: ChannelHeartbeatScheduler;\n private readonly outbound: ChannelOutboundSender;\n private sessionModelHooks?: ChannelPluginSessionModelHooks;\n\n constructor(config: Config, bus: MessageBus) {\n this.config = config;\n\n this.heartbeat = new ChannelHeartbeatScheduler({\n getConfig: () => this.config,\n healthMonitor: this.healthMonitor,\n requestSoftRestart: (channelId) => {\n void this.lifecycle.softRestart(channelId);\n },\n });\n\n this.lifecycle = new ChannelLifecycleSupervisor({\n bus,\n registry: this.registry,\n getConfig: () => this.config,\n getSessionModelHooks: () => this.sessionModelHooks,\n onPluginStarted: (plugin) => this.heartbeat.schedule(plugin),\n onPluginStopped: (pluginId) => this.heartbeat.clear(pluginId),\n });\n\n this.outbound = new ChannelOutboundSender({\n registry: this.registry,\n getConfig: () => this.config,\n });\n }\n\n // ── Wiring hooks (called by GatewayService / cli) ─────────────────────\n\n setOutboundHooks(hooks: OutboundChannelHooks): void {\n this.outbound.setHooks(hooks);\n }\n\n /** Call before `initialize()` so plugins can persist per-session model overrides. */\n setSessionModelHooks(hooks: ChannelPluginSessionModelHooks | undefined): void {\n this.sessionModelHooks = hooks;\n }\n\n enableOutboundPersistence(agentDir: string): void {\n this.outbound.enablePersistence(agentDir);\n }\n\n // ── Plugin registry pass-throughs ──────────────────────────────────────\n\n registerPlugin(plugin: ChannelPlugin): void {\n this.registry.register(plugin);\n }\n\n getPlugin(id: string): ChannelPlugin | undefined {\n return this.registry.get(id);\n }\n\n getAllPlugins(): ChannelPlugin[] {\n return this.registry.all();\n }\n\n /** Backward-compat alias for `getAllPlugins`. */\n getAllChannels(): ChannelPlugin[] {\n return this.registry.all();\n }\n\n /** Channel IDs whose runtime reports connected (e.g. Telegram polling active). */\n getRunningChannels(): string[] {\n return this.registry.runningChannelIds(this.config, (id) => this.lifecycle.isInitialized(id));\n }\n\n // ── Lifecycle pass-throughs ────────────────────────────────────────────\n\n initialize(): Promise<void> {\n return this.lifecycle.initialize();\n }\n\n initializeChannel(channelId: string): Promise<boolean> {\n return this.lifecycle.initializeChannel(channelId);\n }\n\n start(options?: { deferConnectPluginIds?: ReadonlySet<string> }): Promise<void> {\n return this.lifecycle.start(options);\n }\n\n startDeferredConnects(): Promise<void> {\n return this.lifecycle.startDeferredConnects();\n }\n\n async stop(): Promise<void> {\n await this.lifecycle.stop();\n this.heartbeat.clearAll();\n }\n\n stopChannel(channelId: string): Promise<void> {\n return this.lifecycle.stopChannel(channelId);\n }\n\n startChannel(channelId: string): Promise<void> {\n return this.lifecycle.startChannel(channelId);\n }\n\n listDeferConnectChannelIds(cfg: Config): string[] {\n return this.lifecycle.listDeferConnectChannelIds(cfg);\n }\n\n // ── Outbound pass-throughs ─────────────────────────────────────────────\n\n send(msg: OutboundMessage, options?: { skipPersist?: boolean }): Promise<void> {\n return this.outbound.send(msg, options);\n }\n\n replayPendingOutboundMessages(): Promise<void> {\n return this.outbound.replayPending();\n }\n\n // ── Streaming + status query (delegated to plugin directly) ────────────\n\n startStream(\n channel: string,\n chatId: string,\n accountId?: string,\n opts?: { threadId?: string; replyToMessageId?: string },\n ): ChannelStreamHandle | null {\n const plugin = this.registry.get(channel);\n if (!plugin) {\n log.error({ channel }, 'Unknown channel');\n return null;\n }\n return (\n plugin.streaming?.startStream?.({\n chatId,\n accountId,\n threadId: opts?.threadId,\n replyToMessageId: opts?.replyToMessageId,\n }) ?? null\n );\n }\n\n async getChannelStatus(channel: string): Promise<Record<string, unknown>> {\n const plugin = this.registry.get(channel);\n if (!plugin) return { error: 'Unknown channel' };\n if (!plugin.status?.buildChannelSummary) return { status: 'unknown' };\n\n try {\n const accountId = plugin.config.listAccountIds(this.config)[0] ?? 'default';\n const account = plugin.config.resolveAccount(this.config, accountId);\n return await plugin.status.buildChannelSummary({\n account,\n cfg: this.config,\n defaultAccountId: accountId,\n snapshot: plugin.status.defaultRuntime ?? { accountId, channelId: channel, enabled: true, configured: true },\n });\n } catch (err) {\n return { error: String(err) };\n }\n }\n\n // ── Inbound action dispatch (Feishu card actions) ──────────────────────\n\n /**\n * Optional channel hook before `AgentService` consumes an inbound message\n * (e.g. Feishu card-action triggers).\n */\n async dispatchInboundMessageAction(msg: InboundMessage): Promise<void> {\n const plugin = this.registry.get(msg.channel);\n const handle = plugin?.actions?.handleAction;\n if (!handle) return;\n\n const meta = msg.metadata as Record<string, unknown> | undefined;\n if (msg.channel !== 'feishu' || meta?.feishuEventType !== 'card.action.trigger') {\n return;\n }\n\n const cardAction = meta.cardAction as Record<string, unknown> | undefined;\n const actionTag =\n cardAction && typeof cardAction.tag === 'string' && cardAction.tag.trim()\n ? cardAction.tag.trim()\n : 'feishu.card_action';\n const cardCtx = meta.cardContext as Record<string, unknown> | undefined;\n const openMsg =\n cardCtx && typeof cardCtx.open_message_id === 'string' ? cardCtx.open_message_id.trim() : '';\n const fallbackMsgId = typeof meta.messageId === 'string' ? meta.messageId.trim() : '';\n const messageId = openMsg || fallbackMsgId;\n const accountId =\n typeof meta.accountId === 'string' && meta.accountId.trim() ? meta.accountId.trim() : 'default';\n\n try {\n await handle({\n action: actionTag,\n data: JSON.stringify({\n cardAction: meta.cardAction,\n cardContext: meta.cardContext,\n cardActionText: meta.cardActionText,\n }),\n messageId,\n senderId: msg.sender_id,\n chatId: msg.chat_id,\n accountId,\n metadata: {\n feishuEventType: meta.feishuEventType,\n raw: meta.raw,\n sessionKey: meta.sessionKey,\n userContent: msg.content,\n },\n });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ err, channel: msg.channel, accountId, em }, 'dispatchInboundMessageAction failed');\n }\n }\n\n // ── Config + introspection ─────────────────────────────────────────────\n\n async updateConfig(config: Config): Promise<void> {\n this.config = config;\n await this.lifecycle.forwardConfigUpdate(config);\n log.info('Channel config updated');\n }\n\n /** Replace in-memory config without running plugin `onConfigUpdated` hooks. */\n setRuntimeConfig(config: Config): void {\n this.config = config;\n }\n\n getRuntimeSnapshot(): {\n initialized: boolean;\n running: boolean;\n pluginIds: string[];\n initializedPluginIds: string[];\n manuallyStopped: string[];\n restartAttempts: Record<string, number>;\n channelHealth: Record<string, ChannelHealthState>;\n } {\n const lifecycleSnap = this.lifecycle.snapshot();\n return {\n ...lifecycleSnap,\n pluginIds: this.registry.ids(),\n channelHealth: this.healthMonitor.toJSON(),\n };\n }\n\n getHealthMonitor(): ChannelHealthMonitor {\n return this.healthMonitor;\n }\n}\n\nexport function createChannelManager(config: Config, bus: MessageBus): ChannelManager {\n return new ChannelManager(config, bus);\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export type
|
|
3
|
-
export type PairingCliChannel = StandardPairingChannel | 'weixin';
|
|
1
|
+
export type StandardPairingChannel = string;
|
|
2
|
+
export type PairingCliChannel = string;
|
|
@@ -9,7 +9,7 @@ function buildPairingInstructionText(params) {
|
|
|
9
9
|
code,
|
|
10
10
|
"",
|
|
11
11
|
"Ask the owner to approve in Settings → Channels → Pairing, or run:",
|
|
12
|
-
`xopc channels pairing approve
|
|
12
|
+
`xopc channels pairing approve ${channel}${!accountId || accountId.trim().toLowerCase() === "default" ? "" : ` --account ${accountId.trim()}`} ${code}`
|
|
13
13
|
].join("\n");
|
|
14
14
|
}
|
|
15
15
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-messages.js","names":[],"sources":["../../../../src/channels/pairing/pairing-messages.ts"],"sourcesContent":["import type { PairingCliChannel } from './pairing-channel.js';\n\nexport function buildPairingInstructionText(params: {\n channel: PairingCliChannel;\n accountId: string;\n code: string;\n senderIdLine: string;\n}): string {\n const { channel, accountId, code, senderIdLine } = params;\n const acc =\n !accountId || accountId.trim().toLowerCase() === 'default' ? '' : ` --account ${accountId.trim()}`;\n const approve = `xopc channels pairing approve
|
|
1
|
+
{"version":3,"file":"pairing-messages.js","names":[],"sources":["../../../../src/channels/pairing/pairing-messages.ts"],"sourcesContent":["import type { PairingCliChannel } from './pairing-channel.js';\n\nexport function buildPairingInstructionText(params: {\n channel: PairingCliChannel;\n accountId: string;\n code: string;\n senderIdLine: string;\n}): string {\n const { channel, accountId, code, senderIdLine } = params;\n const acc =\n !accountId || accountId.trim().toLowerCase() === 'default' ? '' : ` --account ${accountId.trim()}`;\n const approve = `xopc channels pairing approve ${channel}${acc} ${code}`;\n return [\n 'XOPC: this bot is in pairing mode.',\n '',\n senderIdLine,\n 'Pairing code:',\n code,\n '',\n 'Ask the owner to approve in Settings → Channels → Pairing, or run:',\n approve,\n ].join('\\n');\n}\n"],"mappings":";AAEA,SAAgB,4BAA4B,QAKjC;CACT,MAAM,EAAE,SAAS,WAAW,MAAM,iBAAiB;AAInD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iCAT+C,UAD/C,CAAC,aAAa,UAAU,MAAM,CAAC,aAAa,KAAK,YAAY,KAAK,cAAc,UAAU,MAAM,GACnC,GAAG;EAUjE,CAAC,KAAK,KAAK"}
|
|
@@ -18,7 +18,7 @@ export type ChannelPairingSummaryEntry = {
|
|
|
18
18
|
stale: number;
|
|
19
19
|
atCapacity: boolean;
|
|
20
20
|
};
|
|
21
|
-
export type ChannelPairingSummary = Record<
|
|
21
|
+
export type ChannelPairingSummary = Record<string, ChannelPairingSummaryEntry>;
|
|
22
22
|
export type PairingPendingIssue = {
|
|
23
23
|
channel: PairingCliChannel;
|
|
24
24
|
accountId: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { resolveDmPolicy } from "../security.js";
|
|
1
2
|
import { resolveStandardAllowFromPath, resolveStandardPairingPath, resolveWeixinAllowFromPath, resolveWeixinPairingPath } from "./paths.js";
|
|
2
3
|
import { readAllowFromIdsSync, removeAllowFromIdSync } from "./allow-from-file.js";
|
|
3
4
|
import "./pairing-constants.js";
|
|
4
5
|
import { PAIRING_PENDING_TTL_MS, approvePairingBySenderIdSync, approvePairingCodeSync, dismissPairingBySenderIdSync, listPendingPairingRequestsSync } from "./pairing-store.js";
|
|
5
6
|
import { broadcastPairingEvent } from "./pairing-events.js";
|
|
6
|
-
import { resolveDmPolicy } from "../security.js";
|
|
7
7
|
//#region src/channels/pairing/pairing-service.ts
|
|
8
8
|
function normalizeAccountId(accountId) {
|
|
9
9
|
return (accountId ?? "default").trim().toLowerCase() || "default";
|
|
@@ -115,30 +115,15 @@ function resolvePairingAccountIds(config, channel) {
|
|
|
115
115
|
return ["default"];
|
|
116
116
|
}
|
|
117
117
|
function listChannelPairingSummary(config) {
|
|
118
|
-
const channels =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const summary = {
|
|
124
|
-
telegram: {
|
|
125
|
-
pending: 0,
|
|
126
|
-
stale: 0,
|
|
127
|
-
atCapacity: false
|
|
128
|
-
},
|
|
129
|
-
feishu: {
|
|
130
|
-
pending: 0,
|
|
131
|
-
stale: 0,
|
|
132
|
-
atCapacity: false
|
|
133
|
-
},
|
|
134
|
-
weixin: {
|
|
118
|
+
const channels = Object.keys(config?.channels ?? {});
|
|
119
|
+
const summary = {};
|
|
120
|
+
for (const channel of channels) {
|
|
121
|
+
if (!resolveChannelEnabled(config, channel)) continue;
|
|
122
|
+
summary[channel] = {
|
|
135
123
|
pending: 0,
|
|
136
124
|
stale: 0,
|
|
137
125
|
atCapacity: false
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
for (const channel of channels) {
|
|
141
|
-
if (!resolveChannelEnabled(config, channel)) continue;
|
|
126
|
+
};
|
|
142
127
|
const accountIds = resolvePairingAccountIds(config, channel);
|
|
143
128
|
for (const accountId of accountIds) {
|
|
144
129
|
if (!resolveAccountEnabled(config, channel, accountId)) continue;
|
|
@@ -154,11 +139,7 @@ function listChannelPairingSummary(config) {
|
|
|
154
139
|
}
|
|
155
140
|
function collectPairingPendingIssues(config) {
|
|
156
141
|
const issues = [];
|
|
157
|
-
for (const channel of
|
|
158
|
-
"telegram",
|
|
159
|
-
"feishu",
|
|
160
|
-
"weixin"
|
|
161
|
-
]) {
|
|
142
|
+
for (const channel of Object.keys(config?.channels ?? {})) {
|
|
162
143
|
if (!resolveChannelEnabled(config, channel)) continue;
|
|
163
144
|
const accountIds = resolvePairingAccountIds(config, channel);
|
|
164
145
|
for (const accountId of accountIds) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-service.js","names":["block"],"sources":["../../../../src/channels/pairing/pairing-service.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { resolveDmPolicy } from '../security.js';\nimport type { DmPolicy } from '../channel-domain.js';\n\nimport { readAllowFromIdsSync, removeAllowFromIdSync } from './allow-from-file.js';\nimport type { PairingCliChannel } from './pairing-channel.js';\nimport { broadcastPairingEvent } from './pairing-events.js';\nimport { PAIRING_PENDING_MAX, PAIRING_STALE_PENDING_MS } from './pairing-constants.js';\nimport {\n approvePairingBySenderIdSync,\n approvePairingCodeSync,\n dismissPairingBySenderIdSync,\n listPendingPairingRequestsSync,\n PAIRING_PENDING_TTL_MS,\n type PairingRequest,\n} from './pairing-store.js';\nimport {\n resolveStandardAllowFromPath,\n resolveStandardPairingPath,\n resolveWeixinAllowFromPath,\n resolveWeixinPairingPath,\n} from './paths.js';\n\n// `PairingPendingView` moved to `./pairing-types.js` (leaf) so\n// `plugins/types.adapters.ts` and other lower-level callers can reference it\n// without forming a `types.adapters → pairing-service → security → plugin-types\n// → types.adapters` cycle. Re-exported here for backward-compat.\nexport { type PairingPendingView } from './pairing-types.js';\nimport type { PairingPendingView } from './pairing-types.js';\n\nexport type ChannelPairingState = {\n channel: PairingCliChannel;\n accountId: string;\n dmPolicy: DmPolicy;\n pending: PairingPendingView[];\n paired: {\n fromConfig: string[];\n fromCredentials: string[];\n };\n};\n\nfunction normalizeAccountId(accountId: string | undefined): string {\n return (accountId ?? 'default').trim().toLowerCase() || 'default';\n}\n\nfunction resolvePairingPaths(channel: PairingCliChannel, accountId: string): {\n pairingPath: string;\n allowPath: string;\n} {\n const normalized = normalizeAccountId(accountId);\n if (channel === 'weixin') {\n return {\n pairingPath: resolveWeixinPairingPath(normalized),\n allowPath: resolveWeixinAllowFromPath(normalized),\n };\n }\n return {\n pairingPath: resolveStandardPairingPath(channel, normalized),\n allowPath: resolveStandardAllowFromPath(channel, normalized),\n };\n}\n\nfunction requestAccountId(entry: PairingRequest): string {\n const fromMeta = entry.meta?.accountId?.trim().toLowerCase();\n return fromMeta || 'default';\n}\n\nfunction toPendingView(entry: PairingRequest): PairingPendingView {\n const createdMs = Date.parse(entry.createdAt);\n const expiresAt = Number.isFinite(createdMs)\n ? new Date(createdMs + PAIRING_PENDING_TTL_MS).toISOString()\n : new Date(Date.now() + PAIRING_PENDING_TTL_MS).toISOString();\n const code = entry.code ?? '';\n const codeLast4 = code.length >= 4 ? code.slice(-4) : code;\n const meta =\n entry.meta && typeof entry.meta === 'object'\n ? Object.fromEntries(\n Object.entries(entry.meta).filter(\n ([k, v]) => k !== 'accountId' && typeof v === 'string' && v.trim() !== '',\n ),\n )\n : undefined;\n return {\n senderId: entry.id,\n codeLast4,\n createdAt: entry.createdAt,\n lastSeenAt: entry.lastSeenAt,\n expiresAt,\n isStale:\n Number.isFinite(createdMs) && Date.now() - (createdMs as number) >= PAIRING_STALE_PENDING_MS,\n meta: meta && Object.keys(meta).length > 0 ? meta : undefined,\n };\n}\n\nfunction pendingEntryStats(pending: PairingRequest[]): {\n pending: number;\n stale: number;\n atCapacity: boolean;\n} {\n const now = Date.now();\n let stale = 0;\n for (const p of pending) {\n const created = Date.parse(p.createdAt);\n if (Number.isFinite(created) && now - created >= PAIRING_STALE_PENDING_MS) {\n stale += 1;\n }\n }\n return {\n pending: pending.length,\n stale,\n atCapacity: pending.length >= PAIRING_PENDING_MAX,\n };\n}\n\nfunction resolveChannelAllowFromConfig(\n config: Config | undefined,\n channel: PairingCliChannel,\n accountId: string,\n): string[] {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) return [];\n const block = ch as Record<string, unknown>;\n const top = Array.isArray(block.allowFrom)\n ? block.allowFrom.map(String).filter(Boolean)\n : [];\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const acc = (accounts as Record<string, unknown>)[accountId];\n if (acc && typeof acc === 'object' && !Array.isArray(acc)) {\n const fromAcc = (acc as { allowFrom?: unknown }).allowFrom;\n if (Array.isArray(fromAcc)) {\n return [...new Set([...top, ...fromAcc.map(String).filter(Boolean)])];\n }\n }\n }\n return [...new Set(top)];\n}\n\nfunction resolveChannelEnabled(config: Config | undefined, channel: PairingCliChannel): boolean {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) return false;\n return (ch as { enabled?: boolean }).enabled === true;\n}\n\nfunction resolveAccountEnabled(\n config: Config | undefined,\n channel: PairingCliChannel,\n accountId: string,\n): boolean {\n if (!resolveChannelEnabled(config, channel)) return false;\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) return true;\n const block = ch as Record<string, unknown>;\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const acc = (accounts as Record<string, unknown>)[accountId];\n if (acc && typeof acc === 'object' && !Array.isArray(acc)) {\n return (acc as { enabled?: boolean }).enabled !== false;\n }\n }\n return true;\n}\n\nfunction resolveChannelDmPolicy(\n config: Config | undefined,\n channel: PairingCliChannel,\n accountId: string,\n): DmPolicy {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) {\n return resolveDmPolicy(undefined, channel === 'weixin' ? 'open' : 'pairing');\n }\n const block = ch as Record<string, unknown>;\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const acc = (accounts as Record<string, unknown>)[accountId];\n if (acc && typeof acc === 'object' && !Array.isArray(acc)) {\n const accPolicy = (acc as { dmPolicy?: DmPolicy }).dmPolicy;\n if (accPolicy) return resolveDmPolicy(accPolicy, 'pairing');\n }\n }\n const topPolicy = block.dmPolicy as DmPolicy | undefined;\n return resolveDmPolicy(topPolicy, channel === 'weixin' ? 'open' : 'pairing');\n}\n\nexport type ChannelPairingSummaryEntry = {\n pending: number;\n stale: number;\n atCapacity: boolean;\n};\n\nexport type ChannelPairingSummary = Record<PairingCliChannel, ChannelPairingSummaryEntry>;\n\nexport type PairingPendingIssue = {\n channel: PairingCliChannel;\n accountId: string;\n pending: number;\n stale: number;\n atCapacity: boolean;\n};\n\nfunction resolvePairingAccountIds(config: Config | undefined, channel: PairingCliChannel): string[] {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) {\n return channel === 'telegram' ? ['default'] : [];\n }\n const block = ch as Record<string, unknown>;\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const keys = Object.keys(accounts as Record<string, unknown>).sort();\n if (keys.length > 0) return keys;\n }\n if (channel === 'feishu') {\n const appId = typeof block.appId === 'string' ? block.appId.trim() : '';\n const appSecret = typeof block.appSecret === 'string' ? block.appSecret.trim() : '';\n return appId && appSecret ? ['default'] : [];\n }\n if (channel === 'telegram') return ['default'];\n return ['default'];\n}\n\nexport function listChannelPairingSummary(config?: Config): ChannelPairingSummary {\n const channels: PairingCliChannel[] = ['telegram', 'feishu', 'weixin'];\n const summary: ChannelPairingSummary = {\n telegram: { pending: 0, stale: 0, atCapacity: false },\n feishu: { pending: 0, stale: 0, atCapacity: false },\n weixin: { pending: 0, stale: 0, atCapacity: false },\n };\n for (const channel of channels) {\n if (!resolveChannelEnabled(config, channel)) continue;\n const accountIds = resolvePairingAccountIds(config, channel);\n for (const accountId of accountIds) {\n if (!resolveAccountEnabled(config, channel, accountId)) continue;\n if (resolveChannelDmPolicy(config, channel, accountId) !== 'pairing') continue;\n const { pairingPath } = resolvePairingPaths(channel, accountId);\n const pendingRaw = listPendingPairingRequestsSync(pairingPath).filter(\n (r) => requestAccountId(r) === accountId,\n );\n const stats = pendingEntryStats(pendingRaw);\n summary[channel].pending += stats.pending;\n summary[channel].stale += stats.stale;\n summary[channel].atCapacity ||= stats.atCapacity;\n }\n }\n return summary;\n}\n\nexport function collectPairingPendingIssues(config?: Config): PairingPendingIssue[] {\n const issues: PairingPendingIssue[] = [];\n for (const channel of ['telegram', 'feishu', 'weixin'] as const) {\n if (!resolveChannelEnabled(config, channel)) continue;\n const accountIds = resolvePairingAccountIds(config, channel);\n for (const accountId of accountIds) {\n if (!resolveAccountEnabled(config, channel, accountId)) continue;\n if (resolveChannelDmPolicy(config, channel, accountId) !== 'pairing') continue;\n const { pairingPath } = resolvePairingPaths(channel, accountId);\n const pendingRaw = listPendingPairingRequestsSync(pairingPath).filter(\n (r) => requestAccountId(r) === accountId,\n );\n const stats = pendingEntryStats(pendingRaw);\n if (stats.pending > 0) {\n issues.push({ channel, accountId, ...stats });\n }\n }\n }\n return issues;\n}\n\nexport function listChannelPairingState(params: {\n channel: PairingCliChannel;\n accountId?: string;\n config?: Config;\n}): ChannelPairingState {\n const accountId = normalizeAccountId(params.accountId);\n const { pairingPath, allowPath } = resolvePairingPaths(params.channel, accountId);\n const pendingRaw = listPendingPairingRequestsSync(pairingPath).filter(\n (r) => requestAccountId(r) === accountId,\n );\n return {\n channel: params.channel,\n accountId,\n dmPolicy: resolveChannelDmPolicy(params.config, params.channel, accountId),\n pending: pendingRaw.map(toPendingView),\n paired: {\n fromConfig: resolveChannelAllowFromConfig(params.config, params.channel, accountId),\n fromCredentials: readAllowFromIdsSync(allowPath),\n },\n };\n}\n\nexport function approveChannelPairing(params: {\n channel: PairingCliChannel;\n accountId?: string;\n code: string;\n}): { ok: true; senderId: string; alreadyPaired: boolean } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const code = params.code.trim();\n if (!code) return { ok: false, error: 'Missing pairing code.' };\n\n const { pairingPath, allowPath } = resolvePairingPaths(params.channel, accountId);\n const alreadyPaired = readAllowFromIdsSync(allowPath);\n\n const result = approvePairingCodeSync({\n pairingFilePath: pairingPath,\n allowFromFilePath: allowPath,\n code,\n accountId,\n });\n if (!result) {\n return { ok: false, error: 'Invalid or expired pairing code (or wrong account).' };\n }\n broadcastPairingEvent('channels.pairing.approved', {\n channel: params.channel,\n accountId,\n senderId: result.senderId,\n });\n return {\n ok: true,\n senderId: result.senderId,\n alreadyPaired: alreadyPaired.includes(result.senderId),\n };\n}\n\nexport function approveChannelPairingBySender(params: {\n channel: PairingCliChannel;\n accountId?: string;\n senderId: string;\n}): { ok: true; senderId: string; alreadyPaired: boolean } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const senderId = params.senderId.trim();\n if (!senderId) return { ok: false, error: 'Missing sender id.' };\n\n const { pairingPath, allowPath } = resolvePairingPaths(params.channel, accountId);\n const alreadyPaired = readAllowFromIdsSync(allowPath);\n\n const result = approvePairingBySenderIdSync({\n pairingFilePath: pairingPath,\n allowFromFilePath: allowPath,\n senderId,\n accountId,\n });\n if (!result) {\n return { ok: false, error: 'No pending pairing request for this sender (or wrong account).' };\n }\n broadcastPairingEvent('channels.pairing.approved', {\n channel: params.channel,\n accountId,\n senderId: result.senderId,\n });\n return {\n ok: true,\n senderId: result.senderId,\n alreadyPaired: alreadyPaired.includes(result.senderId),\n };\n}\n\nexport function revokeChannelPairingPaired(params: {\n channel: PairingCliChannel;\n accountId?: string;\n senderId: string;\n}): { ok: true; changed: boolean } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const senderId = params.senderId.trim();\n if (!senderId) return { ok: false, error: 'Missing sender id.' };\n\n const { allowPath } = resolvePairingPaths(params.channel, accountId);\n const { changed } = removeAllowFromIdSync(allowPath, senderId);\n if (changed) {\n broadcastPairingEvent('channels.pairing.revoked', {\n channel: params.channel,\n accountId,\n senderId,\n });\n }\n return { ok: true, changed };\n}\n\nexport function dismissChannelPairingPending(params: {\n channel: PairingCliChannel;\n accountId?: string;\n senderId: string;\n}): { ok: true; senderId: string } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const senderId = params.senderId.trim();\n if (!senderId) return { ok: false, error: 'Missing sender id.' };\n\n const { pairingPath } = resolvePairingPaths(params.channel, accountId);\n const result = dismissPairingBySenderIdSync({\n pairingFilePath: pairingPath,\n senderId,\n accountId,\n });\n if (!result) {\n return { ok: false, error: 'No pending pairing request for this sender (or wrong account).' };\n }\n broadcastPairingEvent('channels.pairing.dismissed', {\n channel: params.channel,\n accountId,\n senderId: result.senderId,\n });\n return { ok: true, senderId: result.senderId };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pairing-service.js","names":["block"],"sources":["../../../../src/channels/pairing/pairing-service.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { resolveDmPolicy } from '../security.js';\nimport type { DmPolicy } from '../channel-domain.js';\n\nimport { readAllowFromIdsSync, removeAllowFromIdSync } from './allow-from-file.js';\nimport type { PairingCliChannel } from './pairing-channel.js';\nimport { broadcastPairingEvent } from './pairing-events.js';\nimport { PAIRING_PENDING_MAX, PAIRING_STALE_PENDING_MS } from './pairing-constants.js';\nimport {\n approvePairingBySenderIdSync,\n approvePairingCodeSync,\n dismissPairingBySenderIdSync,\n listPendingPairingRequestsSync,\n PAIRING_PENDING_TTL_MS,\n type PairingRequest,\n} from './pairing-store.js';\nimport {\n resolveStandardAllowFromPath,\n resolveStandardPairingPath,\n resolveWeixinAllowFromPath,\n resolveWeixinPairingPath,\n} from './paths.js';\n\n// `PairingPendingView` moved to `./pairing-types.js` (leaf) so\n// `plugins/types.adapters.ts` and other lower-level callers can reference it\n// without forming a `types.adapters → pairing-service → security → plugin-types\n// → types.adapters` cycle. Re-exported here for backward-compat.\nexport { type PairingPendingView } from './pairing-types.js';\nimport type { PairingPendingView } from './pairing-types.js';\n\nexport type ChannelPairingState = {\n channel: PairingCliChannel;\n accountId: string;\n dmPolicy: DmPolicy;\n pending: PairingPendingView[];\n paired: {\n fromConfig: string[];\n fromCredentials: string[];\n };\n};\n\nfunction normalizeAccountId(accountId: string | undefined): string {\n return (accountId ?? 'default').trim().toLowerCase() || 'default';\n}\n\nfunction resolvePairingPaths(channel: PairingCliChannel, accountId: string): {\n pairingPath: string;\n allowPath: string;\n} {\n const normalized = normalizeAccountId(accountId);\n if (channel === 'weixin') {\n return {\n pairingPath: resolveWeixinPairingPath(normalized),\n allowPath: resolveWeixinAllowFromPath(normalized),\n };\n }\n return {\n pairingPath: resolveStandardPairingPath(channel, normalized),\n allowPath: resolveStandardAllowFromPath(channel, normalized),\n };\n}\n\nfunction requestAccountId(entry: PairingRequest): string {\n const fromMeta = entry.meta?.accountId?.trim().toLowerCase();\n return fromMeta || 'default';\n}\n\nfunction toPendingView(entry: PairingRequest): PairingPendingView {\n const createdMs = Date.parse(entry.createdAt);\n const expiresAt = Number.isFinite(createdMs)\n ? new Date(createdMs + PAIRING_PENDING_TTL_MS).toISOString()\n : new Date(Date.now() + PAIRING_PENDING_TTL_MS).toISOString();\n const code = entry.code ?? '';\n const codeLast4 = code.length >= 4 ? code.slice(-4) : code;\n const meta =\n entry.meta && typeof entry.meta === 'object'\n ? Object.fromEntries(\n Object.entries(entry.meta).filter(\n ([k, v]) => k !== 'accountId' && typeof v === 'string' && v.trim() !== '',\n ),\n )\n : undefined;\n return {\n senderId: entry.id,\n codeLast4,\n createdAt: entry.createdAt,\n lastSeenAt: entry.lastSeenAt,\n expiresAt,\n isStale:\n Number.isFinite(createdMs) && Date.now() - (createdMs as number) >= PAIRING_STALE_PENDING_MS,\n meta: meta && Object.keys(meta).length > 0 ? meta : undefined,\n };\n}\n\nfunction pendingEntryStats(pending: PairingRequest[]): {\n pending: number;\n stale: number;\n atCapacity: boolean;\n} {\n const now = Date.now();\n let stale = 0;\n for (const p of pending) {\n const created = Date.parse(p.createdAt);\n if (Number.isFinite(created) && now - created >= PAIRING_STALE_PENDING_MS) {\n stale += 1;\n }\n }\n return {\n pending: pending.length,\n stale,\n atCapacity: pending.length >= PAIRING_PENDING_MAX,\n };\n}\n\nfunction resolveChannelAllowFromConfig(\n config: Config | undefined,\n channel: PairingCliChannel,\n accountId: string,\n): string[] {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) return [];\n const block = ch as Record<string, unknown>;\n const top = Array.isArray(block.allowFrom)\n ? block.allowFrom.map(String).filter(Boolean)\n : [];\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const acc = (accounts as Record<string, unknown>)[accountId];\n if (acc && typeof acc === 'object' && !Array.isArray(acc)) {\n const fromAcc = (acc as { allowFrom?: unknown }).allowFrom;\n if (Array.isArray(fromAcc)) {\n return [...new Set([...top, ...fromAcc.map(String).filter(Boolean)])];\n }\n }\n }\n return [...new Set(top)];\n}\n\nfunction resolveChannelEnabled(config: Config | undefined, channel: PairingCliChannel): boolean {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) return false;\n return (ch as { enabled?: boolean }).enabled === true;\n}\n\nfunction resolveAccountEnabled(\n config: Config | undefined,\n channel: PairingCliChannel,\n accountId: string,\n): boolean {\n if (!resolveChannelEnabled(config, channel)) return false;\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) return true;\n const block = ch as Record<string, unknown>;\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const acc = (accounts as Record<string, unknown>)[accountId];\n if (acc && typeof acc === 'object' && !Array.isArray(acc)) {\n return (acc as { enabled?: boolean }).enabled !== false;\n }\n }\n return true;\n}\n\nfunction resolveChannelDmPolicy(\n config: Config | undefined,\n channel: PairingCliChannel,\n accountId: string,\n): DmPolicy {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) {\n return resolveDmPolicy(undefined, channel === 'weixin' ? 'open' : 'pairing');\n }\n const block = ch as Record<string, unknown>;\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const acc = (accounts as Record<string, unknown>)[accountId];\n if (acc && typeof acc === 'object' && !Array.isArray(acc)) {\n const accPolicy = (acc as { dmPolicy?: DmPolicy }).dmPolicy;\n if (accPolicy) return resolveDmPolicy(accPolicy, 'pairing');\n }\n }\n const topPolicy = block.dmPolicy as DmPolicy | undefined;\n return resolveDmPolicy(topPolicy, channel === 'weixin' ? 'open' : 'pairing');\n}\n\nexport type ChannelPairingSummaryEntry = {\n pending: number;\n stale: number;\n atCapacity: boolean;\n};\n\nexport type ChannelPairingSummary = Record<string, ChannelPairingSummaryEntry>;\n\nexport type PairingPendingIssue = {\n channel: PairingCliChannel;\n accountId: string;\n pending: number;\n stale: number;\n atCapacity: boolean;\n};\n\nfunction resolvePairingAccountIds(config: Config | undefined, channel: PairingCliChannel): string[] {\n const ch = config?.channels?.[channel as keyof NonNullable<Config['channels']>];\n if (!ch || typeof ch !== 'object' || Array.isArray(ch)) {\n return channel === 'telegram' ? ['default'] : [];\n }\n const block = ch as Record<string, unknown>;\n const accounts = block.accounts;\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const keys = Object.keys(accounts as Record<string, unknown>).sort();\n if (keys.length > 0) return keys;\n }\n if (channel === 'feishu') {\n const appId = typeof block.appId === 'string' ? block.appId.trim() : '';\n const appSecret = typeof block.appSecret === 'string' ? block.appSecret.trim() : '';\n return appId && appSecret ? ['default'] : [];\n }\n if (channel === 'telegram') return ['default'];\n return ['default'];\n}\n\nexport function listChannelPairingSummary(config?: Config): ChannelPairingSummary {\n const channels = Object.keys(config?.channels ?? {});\n const summary: ChannelPairingSummary = {};\n for (const channel of channels) {\n if (!resolveChannelEnabled(config, channel)) continue;\n summary[channel] = { pending: 0, stale: 0, atCapacity: false };\n const accountIds = resolvePairingAccountIds(config, channel);\n for (const accountId of accountIds) {\n if (!resolveAccountEnabled(config, channel, accountId)) continue;\n if (resolveChannelDmPolicy(config, channel, accountId) !== 'pairing') continue;\n const { pairingPath } = resolvePairingPaths(channel, accountId);\n const pendingRaw = listPendingPairingRequestsSync(pairingPath).filter(\n (r) => requestAccountId(r) === accountId,\n );\n const stats = pendingEntryStats(pendingRaw);\n summary[channel]!.pending += stats.pending;\n summary[channel]!.stale += stats.stale;\n summary[channel]!.atCapacity ||= stats.atCapacity;\n }\n }\n return summary;\n}\n\nexport function collectPairingPendingIssues(config?: Config): PairingPendingIssue[] {\n const issues: PairingPendingIssue[] = [];\n for (const channel of Object.keys(config?.channels ?? {})) {\n if (!resolveChannelEnabled(config, channel)) continue;\n const accountIds = resolvePairingAccountIds(config, channel);\n for (const accountId of accountIds) {\n if (!resolveAccountEnabled(config, channel, accountId)) continue;\n if (resolveChannelDmPolicy(config, channel, accountId) !== 'pairing') continue;\n const { pairingPath } = resolvePairingPaths(channel, accountId);\n const pendingRaw = listPendingPairingRequestsSync(pairingPath).filter(\n (r) => requestAccountId(r) === accountId,\n );\n const stats = pendingEntryStats(pendingRaw);\n if (stats.pending > 0) {\n issues.push({ channel, accountId, ...stats });\n }\n }\n }\n return issues;\n}\n\nexport function listChannelPairingState(params: {\n channel: PairingCliChannel;\n accountId?: string;\n config?: Config;\n}): ChannelPairingState {\n const accountId = normalizeAccountId(params.accountId);\n const { pairingPath, allowPath } = resolvePairingPaths(params.channel, accountId);\n const pendingRaw = listPendingPairingRequestsSync(pairingPath).filter(\n (r) => requestAccountId(r) === accountId,\n );\n return {\n channel: params.channel,\n accountId,\n dmPolicy: resolveChannelDmPolicy(params.config, params.channel, accountId),\n pending: pendingRaw.map(toPendingView),\n paired: {\n fromConfig: resolveChannelAllowFromConfig(params.config, params.channel, accountId),\n fromCredentials: readAllowFromIdsSync(allowPath),\n },\n };\n}\n\nexport function approveChannelPairing(params: {\n channel: PairingCliChannel;\n accountId?: string;\n code: string;\n}): { ok: true; senderId: string; alreadyPaired: boolean } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const code = params.code.trim();\n if (!code) return { ok: false, error: 'Missing pairing code.' };\n\n const { pairingPath, allowPath } = resolvePairingPaths(params.channel, accountId);\n const alreadyPaired = readAllowFromIdsSync(allowPath);\n\n const result = approvePairingCodeSync({\n pairingFilePath: pairingPath,\n allowFromFilePath: allowPath,\n code,\n accountId,\n });\n if (!result) {\n return { ok: false, error: 'Invalid or expired pairing code (or wrong account).' };\n }\n broadcastPairingEvent('channels.pairing.approved', {\n channel: params.channel,\n accountId,\n senderId: result.senderId,\n });\n return {\n ok: true,\n senderId: result.senderId,\n alreadyPaired: alreadyPaired.includes(result.senderId),\n };\n}\n\nexport function approveChannelPairingBySender(params: {\n channel: PairingCliChannel;\n accountId?: string;\n senderId: string;\n}): { ok: true; senderId: string; alreadyPaired: boolean } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const senderId = params.senderId.trim();\n if (!senderId) return { ok: false, error: 'Missing sender id.' };\n\n const { pairingPath, allowPath } = resolvePairingPaths(params.channel, accountId);\n const alreadyPaired = readAllowFromIdsSync(allowPath);\n\n const result = approvePairingBySenderIdSync({\n pairingFilePath: pairingPath,\n allowFromFilePath: allowPath,\n senderId,\n accountId,\n });\n if (!result) {\n return { ok: false, error: 'No pending pairing request for this sender (or wrong account).' };\n }\n broadcastPairingEvent('channels.pairing.approved', {\n channel: params.channel,\n accountId,\n senderId: result.senderId,\n });\n return {\n ok: true,\n senderId: result.senderId,\n alreadyPaired: alreadyPaired.includes(result.senderId),\n };\n}\n\nexport function revokeChannelPairingPaired(params: {\n channel: PairingCliChannel;\n accountId?: string;\n senderId: string;\n}): { ok: true; changed: boolean } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const senderId = params.senderId.trim();\n if (!senderId) return { ok: false, error: 'Missing sender id.' };\n\n const { allowPath } = resolvePairingPaths(params.channel, accountId);\n const { changed } = removeAllowFromIdSync(allowPath, senderId);\n if (changed) {\n broadcastPairingEvent('channels.pairing.revoked', {\n channel: params.channel,\n accountId,\n senderId,\n });\n }\n return { ok: true, changed };\n}\n\nexport function dismissChannelPairingPending(params: {\n channel: PairingCliChannel;\n accountId?: string;\n senderId: string;\n}): { ok: true; senderId: string } | { ok: false; error: string } {\n const accountId = normalizeAccountId(params.accountId);\n const senderId = params.senderId.trim();\n if (!senderId) return { ok: false, error: 'Missing sender id.' };\n\n const { pairingPath } = resolvePairingPaths(params.channel, accountId);\n const result = dismissPairingBySenderIdSync({\n pairingFilePath: pairingPath,\n senderId,\n accountId,\n });\n if (!result) {\n return { ok: false, error: 'No pending pairing request for this sender (or wrong account).' };\n }\n broadcastPairingEvent('channels.pairing.dismissed', {\n channel: params.channel,\n accountId,\n senderId: result.senderId,\n });\n return { ok: true, senderId: result.senderId };\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { Config } from '../config/schema.js';
|
|
5
5
|
import type { MessageBus } from '../infra/bus/index.js';
|
|
6
6
|
import type { ChannelId, ChannelMeta, ChannelCapabilities } from './plugins/types.core.js';
|
|
7
|
-
import type { ChannelPairingAdapter, ChannelAllowlistAdapter, ChannelThreadingAdapter, ChannelLifecycleAdapter, ChannelHeartbeatAdapter, ChannelConfiguredBindingProvider, ChannelMessagingAdapter, ChannelDirectoryAdapter, ChannelResolverAdapter, ChannelAuthAdapter, ChannelElevatedAdapter, ChannelExecApprovalAdapter, ChannelAgentPromptAdapter, ChannelSetupWizard, ChannelCronDeliveryAdapter, ChannelCliLoginAdapter, ChannelConfigSurfaceAdapter, ChannelOnboardAdapter } from './plugins/types.adapters.js';
|
|
7
|
+
import type { ChannelPairingAdapter, ChannelAllowlistAdapter, ChannelThreadingAdapter, ChannelLifecycleAdapter, ChannelHeartbeatAdapter, ChannelConfiguredBindingProvider, ChannelMessagingAdapter, ChannelDirectoryAdapter, ChannelResolverAdapter, ChannelAuthAdapter, ChannelElevatedAdapter, ChannelExecApprovalAdapter, ChannelAgentPromptAdapter, ChannelSetupWizard, ChannelCronDeliveryAdapter, ChannelCliLoginAdapter, ChannelConfigSurfaceAdapter, ChannelOnboardAdapter, ChannelRuntimeActionAdapter } from './plugins/types.adapters.js';
|
|
8
8
|
export type { ChannelId, ChatType, ChannelMeta, ChannelCapabilities } from './plugins/types.core.js';
|
|
9
9
|
import type { DmPolicy, GroupPolicy } from './channel-domain.js';
|
|
10
10
|
export type { DmPolicy, GroupPolicy };
|
|
@@ -79,6 +79,7 @@ export interface ChannelDoctorCheckResult {
|
|
|
79
79
|
export interface ChannelDoctorAdapter {
|
|
80
80
|
check(params: {
|
|
81
81
|
cfg: Config;
|
|
82
|
+
locale?: string;
|
|
82
83
|
}): Promise<ChannelDoctorCheckResult[]>;
|
|
83
84
|
}
|
|
84
85
|
export interface ChannelPlugin<ResolvedAccount = any> {
|
|
@@ -123,6 +124,7 @@ export interface ChannelPlugin<ResolvedAccount = any> {
|
|
|
123
124
|
resolver?: ChannelResolverAdapter;
|
|
124
125
|
commands?: ChannelCommandAdapter;
|
|
125
126
|
actions?: ChannelMessageActionAdapter;
|
|
127
|
+
runtimeActions?: ChannelRuntimeActionAdapter;
|
|
126
128
|
auth?: ChannelAuthAdapter;
|
|
127
129
|
elevated?: ChannelElevatedAdapter;
|
|
128
130
|
execApprovals?: ChannelExecApprovalAdapter;
|
|
@@ -7,7 +7,7 @@ import type { SessionStore } from '../../session/store.js';
|
|
|
7
7
|
import type { PairingPendingView } from '../pairing/pairing-types.js';
|
|
8
8
|
export interface ChannelPairingAdapter {
|
|
9
9
|
/** Credential-store channel key (`telegram` | `feishu` | `weixin`). */
|
|
10
|
-
pairingChannel:
|
|
10
|
+
pairingChannel: string;
|
|
11
11
|
listPending(params: {
|
|
12
12
|
cfg: Config;
|
|
13
13
|
accountId?: string;
|
|
@@ -134,6 +134,59 @@ export interface ChannelAgentPromptAdapter {
|
|
|
134
134
|
accountId?: string;
|
|
135
135
|
}): string | undefined;
|
|
136
136
|
}
|
|
137
|
+
export type ChannelRuntimeActionPayload = {
|
|
138
|
+
type: 'ok';
|
|
139
|
+
message?: string;
|
|
140
|
+
configChanged?: boolean;
|
|
141
|
+
[key: string]: unknown;
|
|
142
|
+
} | {
|
|
143
|
+
type: 'qr';
|
|
144
|
+
sessionKey: string;
|
|
145
|
+
qrcodeUrl?: string;
|
|
146
|
+
qrPayload?: string;
|
|
147
|
+
statusAction?: string;
|
|
148
|
+
pollIntervalMs?: number;
|
|
149
|
+
expiresInSec?: number;
|
|
150
|
+
message?: string;
|
|
151
|
+
[key: string]: unknown;
|
|
152
|
+
} | {
|
|
153
|
+
type: 'poll';
|
|
154
|
+
phase: 'pending' | 'done' | 'unknown';
|
|
155
|
+
ok?: boolean;
|
|
156
|
+
message?: string;
|
|
157
|
+
accountId?: string;
|
|
158
|
+
qrcodeUrl?: string;
|
|
159
|
+
qrPayload?: string;
|
|
160
|
+
qrStatus?: string;
|
|
161
|
+
configChanged?: boolean;
|
|
162
|
+
[key: string]: unknown;
|
|
163
|
+
} | {
|
|
164
|
+
type: 'diagnostics';
|
|
165
|
+
checks: unknown[];
|
|
166
|
+
[key: string]: unknown;
|
|
167
|
+
} | {
|
|
168
|
+
type: 'form';
|
|
169
|
+
schema: Record<string, unknown>;
|
|
170
|
+
values?: Record<string, unknown>;
|
|
171
|
+
submitAction: string;
|
|
172
|
+
message?: string;
|
|
173
|
+
[key: string]: unknown;
|
|
174
|
+
};
|
|
175
|
+
export interface ChannelRuntimeActionResult {
|
|
176
|
+
ok: boolean;
|
|
177
|
+
payload?: ChannelRuntimeActionPayload;
|
|
178
|
+
message?: string;
|
|
179
|
+
}
|
|
180
|
+
/** Gateway/CLI control-plane actions declared by extension manifests. */
|
|
181
|
+
export interface ChannelRuntimeActionAdapter {
|
|
182
|
+
runAction(params: {
|
|
183
|
+
cfg: Config;
|
|
184
|
+
locale?: string;
|
|
185
|
+
actionId: string;
|
|
186
|
+
accountId?: string;
|
|
187
|
+
input?: unknown;
|
|
188
|
+
}): Promise<ChannelRuntimeActionResult>;
|
|
189
|
+
}
|
|
137
190
|
/**
|
|
138
191
|
* Resolves a cron job `delivery.to` string into a normalized chat target for outbound.
|
|
139
192
|
*/
|
|
@@ -144,7 +197,7 @@ export interface ChannelCronDeliveryAdapter {
|
|
|
144
197
|
metadata?: Record<string, unknown>;
|
|
145
198
|
}>;
|
|
146
199
|
}
|
|
147
|
-
/**
|
|
200
|
+
/** Interactive credential login for channels that support terminal setup. */
|
|
148
201
|
export interface ChannelCliLoginAdapter {
|
|
149
202
|
runLogin(params: {
|
|
150
203
|
configPath: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { defineChannelPluginEntry } from "../../extensions/sdk/channel-entry.js";
|
|
1
2
|
import { normalizeTelegramDeliveryChatId } from "../../../extensions/telegram/src/delivery-chat-id.js";
|
|
2
3
|
import { telegramPlugin } from "../../../extensions/telegram/src/plugin.js";
|
|
3
|
-
import { defineChannelPluginEntry } from "../../extensions/sdk/channel-entry.js";
|
|
4
4
|
import "../../../extensions/telegram/src/index.js";
|
|
5
5
|
import { generateSessionKeyWithRouting } from "../../../extensions/telegram/src/routing-integration.js";
|
|
6
6
|
export { defineChannelPluginEntry, generateSessionKeyWithRouting, normalizeTelegramDeliveryChatId, telegramPlugin };
|
|
@@ -5,9 +5,9 @@ import { ConfigSchema, init_schema } from "../../config/schema.js";
|
|
|
5
5
|
import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
|
|
6
6
|
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
7
7
|
import { commandRegistry } from "../registry.js";
|
|
8
|
-
import { resolveAllowlistMatchSimple } from "../../channels/security.js";
|
|
9
8
|
import { parseConfigValue } from "../config-value.js";
|
|
10
9
|
import { getConfigValueAtPath, parseConfigPath, setConfigValueAtPath, unsetConfigValueAtPath } from "../config-paths.js";
|
|
10
|
+
import { resolveAllowlistMatchSimple } from "../../channels/security.js";
|
|
11
11
|
//#region src/chat-commands/builtins/config.ts
|
|
12
12
|
init_schema();
|
|
13
13
|
init_loader();
|
|
@@ -83,8 +83,8 @@ const configCommand = {
|
|
|
83
83
|
acceptsArgs: true,
|
|
84
84
|
examples: [
|
|
85
85
|
"/config show",
|
|
86
|
-
"/config show agents.defaults.
|
|
87
|
-
"/config set agents.defaults.
|
|
86
|
+
"/config show agents.defaults.models.chat",
|
|
87
|
+
"/config set agents.defaults.models.chat.primary=anthropic/claude-opus-4-5",
|
|
88
88
|
"/config set agents.defaults.temperature=0.5",
|
|
89
89
|
"/config unset tts"
|
|
90
90
|
],
|
|
@@ -185,7 +185,7 @@ const configCommand = {
|
|
|
185
185
|
log.info({ path: rest }, "Config key removed via /config unset");
|
|
186
186
|
return { content: `⚙️ Config updated: \`${rest}\` removed.` };
|
|
187
187
|
}
|
|
188
|
-
return { content: "⚙️ *Config Command*\n\n`/config show [path]` — view config (or a specific path)\n`/config set path=value` — update a config value\n`/config unset path` — remove a config key\n\nExamples:\n`/config show agents.defaults.
|
|
188
|
+
return { content: "⚙️ *Config Command*\n\n`/config show [path]` — view config (or a specific path)\n`/config set path=value` — update a config value\n`/config unset path` — remove a config key\n\nExamples:\n`/config show agents.defaults.models.chat`\n`/config set agents.defaults.temperature=0.5`\n`/config set agents.defaults.thinkingDefault=medium`\n`/config unset tts`" };
|
|
189
189
|
}
|
|
190
190
|
};
|
|
191
191
|
function registerConfigCommand() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../../../src/chat-commands/builtins/config.ts"],"sourcesContent":["/**\n * /config — read and write persistent config (~/.xopc/xopc.json) from chat.\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\nimport { parseConfigValue } from '../config-value.js';\nimport {\n parseConfigPath,\n getConfigValueAtPath,\n setConfigValueAtPath,\n unsetConfigValueAtPath,\n} from '../config-paths.js';\nimport { ConfigSchema, type TelegramConfig, type WeixinConfig } from '../../config/schema.js';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { resolveConfigPath } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseSessionKey } from '../../routing/session-key.js';\nimport { resolveAllowlistMatchSimple } from '../../channels/security.js';\n\nconst log = createLogger('ConfigCommand');\n\nconst BLOCKED_WRITE_PATHS = new Set(['gateway.auth.token', 'providers']);\n\nfunction isBlockedPath(path: string[]): boolean {\n const joined = path.join('.');\n for (const blocked of BLOCKED_WRITE_PATHS) {\n if (joined === blocked || joined.startsWith(`${blocked}.`)) return true;\n }\n return false;\n}\n\nfunction redactConfigForDisplay(plain: Record<string, unknown>): void {\n if (plain.gateway && typeof plain.gateway === 'object') {\n const gw = plain.gateway as Record<string, unknown>;\n if (gw.auth && typeof gw.auth === 'object') {\n (gw.auth as Record<string, unknown>).token = '[redacted]';\n }\n }\n if (plain.providers !== undefined) plain.providers = '[redacted]';\n}\n\nfunction senderMayWritePersistentConfig(ctx: CommandContext): boolean {\n const { source, senderId, isGroup, sessionKey } = ctx;\n if (source !== 'telegram' && source !== 'weixin') {\n return true;\n }\n\n const cfg = ctx.getConfig?.() ?? ctx.config;\n\n if (source === 'weixin') {\n const wx = cfg.channels?.weixin as WeixinConfig | undefined;\n if (!wx?.enabled) return false;\n const parsed = parseSessionKey(sessionKey);\n const accountId = parsed?.accountId ?? 'default';\n let allowFrom: Array<string | number> = [];\n if (wx.accounts && Object.keys(wx.accounts).length > 0) {\n const acc = wx.accounts[accountId] ?? wx.accounts['default'];\n if (!acc || acc.enabled === false) return false;\n allowFrom = [...(acc.allowFrom ?? [])];\n } else {\n allowFrom = [...(wx.allowFrom ?? [])];\n }\n if (allowFrom.length === 0) return false;\n return resolveAllowlistMatchSimple({ allowFrom, senderId }).allowed;\n }\n\n const tg = cfg.channels?.telegram as TelegramConfig | undefined;\n if (!tg?.enabled) return false;\n const parsed = parseSessionKey(sessionKey);\n const accountId = parsed?.accountId ?? 'default';\n let allowFrom: Array<string | number> = [];\n let groupAllowFrom: Array<string | number> = [];\n if (tg.accounts && Object.keys(tg.accounts).length > 0) {\n const acc = tg.accounts[accountId] ?? tg.accounts['default'];\n if (!acc || acc.enabled === false) return false;\n allowFrom = [...(acc.allowFrom ?? [])];\n groupAllowFrom = [...(acc.groupAllowFrom ?? [])];\n } else {\n allowFrom = [...(tg.allowFrom ?? [])];\n groupAllowFrom = [...(tg.groupAllowFrom ?? [])];\n }\n const list = isGroup && groupAllowFrom.length > 0 ? groupAllowFrom : allowFrom;\n if (list.length === 0) return false;\n return resolveAllowlistMatchSimple({ allowFrom: list, senderId }).allowed;\n}\n\nconst configCommand: CommandDefinition = {\n id: 'system.config',\n name: 'config',\n aliases: ['cfg'],\n description:\n 'Show or update configuration. Usage: /config show [path] | /config set path=value | /config unset path',\n category: 'system',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: [\n '/config show',\n '/config show agents.defaults.model',\n '/config set agents.defaults.model=anthropic/claude-opus-4-5',\n '/config set agents.defaults.temperature=0.5',\n '/config unset tts',\n ],\n handler: async (ctx: CommandContext, args: string) => {\n const parts = args.trim().split(/\\s+/);\n const action = parts[0]?.toLowerCase();\n const rest = parts.slice(1).join(' ').trim();\n\n if (!action || action === 'show' || action === 'get') {\n const config = ctx.getConfig?.() ?? loadConfig(resolveConfigPath());\n const plain = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n redactConfigForDisplay(plain);\n\n if (rest) {\n const parsed = parseConfigPath(rest);\n if (!parsed.ok || !parsed.path) {\n return { content: `⚠️ ${parsed.error ?? 'Invalid path.'}`, success: false };\n }\n const value = getConfigValueAtPath(plain, parsed.path);\n const rendered = JSON.stringify(value ?? null, null, 2);\n return { content: `⚙️ \\`${rest}\\`:\\n\\`\\`\\`json\\n${rendered}\\n\\`\\`\\`` };\n }\n\n const json = JSON.stringify(plain, null, 2);\n return { content: `⚙️ Current config:\\n\\`\\`\\`json\\n${json}\\n\\`\\`\\`` };\n }\n\n if (action === 'set') {\n if (!senderMayWritePersistentConfig(ctx)) {\n return {\n content: '⚠️ You are not allowed to change config from this chat surface.',\n success: false,\n };\n }\n const eqIndex = rest.indexOf('=');\n if (eqIndex <= 0) {\n return { content: '⚠️ Usage: /config set path=value', success: false };\n }\n const pathRaw = rest.slice(0, eqIndex).trim();\n const valueRaw = rest.slice(eqIndex + 1);\n\n const parsedPath = parseConfigPath(pathRaw);\n if (!parsedPath.ok || !parsedPath.path) {\n return { content: `⚠️ ${parsedPath.error}`, success: false };\n }\n if (isBlockedPath(parsedPath.path)) {\n return {\n content: `⚠️ Path \\`${pathRaw}\\` cannot be modified via chat for security reasons.`,\n success: false,\n };\n }\n\n const parsedValue = parseConfigValue(valueRaw);\n if (parsedValue.ok === false) {\n return { content: `⚠️ ${parsedValue.error}`, success: false };\n }\n\n const configPath = resolveConfigPath();\n const currentConfig = loadConfig(configPath) as Record<string, unknown>;\n setConfigValueAtPath(currentConfig, parsedPath.path, parsedValue.value);\n\n const validated = ConfigSchema.safeParse(currentConfig);\n if (!validated.success) {\n const firstIssue = validated.error.issues[0];\n const fieldPath = firstIssue.path.join('.');\n return {\n content: `⚠️ Config invalid after set (${fieldPath}: ${firstIssue.message}). Change not saved.`,\n success: false,\n };\n }\n\n await saveConfig(validated.data);\n log.info({ path: pathRaw, value: parsedValue.value }, 'Config updated via /config set');\n\n const valueLabel =\n typeof parsedValue.value === 'string'\n ? `\"${parsedValue.value}\"`\n : JSON.stringify(parsedValue.value);\n return { content: `⚙️ Config updated: \\`${pathRaw}\\` = ${valueLabel}` };\n }\n\n if (action === 'unset') {\n if (!senderMayWritePersistentConfig(ctx)) {\n return {\n content: '⚠️ You are not allowed to change config from this chat surface.',\n success: false,\n };\n }\n if (!rest) {\n return { content: '⚠️ Usage: /config unset path', success: false };\n }\n const parsedPath = parseConfigPath(rest);\n if (!parsedPath.ok || !parsedPath.path) {\n return { content: `⚠️ ${parsedPath.error}`, success: false };\n }\n if (isBlockedPath(parsedPath.path)) {\n return {\n content: `⚠️ Path \\`${rest}\\` cannot be modified via chat for security reasons.`,\n success: false,\n };\n }\n\n const configPath = resolveConfigPath();\n const currentConfig = loadConfig(configPath) as Record<string, unknown>;\n const removed = unsetConfigValueAtPath(currentConfig, parsedPath.path);\n if (!removed) {\n return { content: `⚙️ No config value found at \\`${rest}\\`.`, success: false };\n }\n\n const validated = ConfigSchema.safeParse(currentConfig);\n if (!validated.success) {\n const firstIssue = validated.error.issues[0];\n const fieldPath = firstIssue.path.join('.');\n return {\n content: `⚠️ Config invalid after unset (${fieldPath}: ${firstIssue.message}). Change not saved.`,\n success: false,\n };\n }\n\n await saveConfig(validated.data);\n log.info({ path: rest }, 'Config key removed via /config unset');\n return { content: `⚙️ Config updated: \\`${rest}\\` removed.` };\n }\n\n return {\n content:\n '⚙️ *Config Command*\\n\\n' +\n '`/config show [path]` — view config (or a specific path)\\n' +\n '`/config set path=value` — update a config value\\n' +\n '`/config unset path` — remove a config key\\n\\n' +\n 'Examples:\\n' +\n '`/config show agents.defaults.model`\\n' +\n '`/config set agents.defaults.temperature=0.5`\\n' +\n '`/config set agents.defaults.thinkingDefault=medium`\\n' +\n '`/config unset tts`',\n };\n },\n};\n\nexport function registerConfigCommand(): void {\n commandRegistry.register(configCommand);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../../src/chat-commands/builtins/config.ts"],"sourcesContent":["/**\n * /config — read and write persistent config (~/.xopc/xopc.json) from chat.\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\nimport { parseConfigValue } from '../config-value.js';\nimport {\n parseConfigPath,\n getConfigValueAtPath,\n setConfigValueAtPath,\n unsetConfigValueAtPath,\n} from '../config-paths.js';\nimport { ConfigSchema, type TelegramConfig, type WeixinConfig } from '../../config/schema.js';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport { resolveConfigPath } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseSessionKey } from '../../routing/session-key.js';\nimport { resolveAllowlistMatchSimple } from '../../channels/security.js';\n\nconst log = createLogger('ConfigCommand');\n\nconst BLOCKED_WRITE_PATHS = new Set(['gateway.auth.token', 'providers']);\n\nfunction isBlockedPath(path: string[]): boolean {\n const joined = path.join('.');\n for (const blocked of BLOCKED_WRITE_PATHS) {\n if (joined === blocked || joined.startsWith(`${blocked}.`)) return true;\n }\n return false;\n}\n\nfunction redactConfigForDisplay(plain: Record<string, unknown>): void {\n if (plain.gateway && typeof plain.gateway === 'object') {\n const gw = plain.gateway as Record<string, unknown>;\n if (gw.auth && typeof gw.auth === 'object') {\n (gw.auth as Record<string, unknown>).token = '[redacted]';\n }\n }\n if (plain.providers !== undefined) plain.providers = '[redacted]';\n}\n\nfunction senderMayWritePersistentConfig(ctx: CommandContext): boolean {\n const { source, senderId, isGroup, sessionKey } = ctx;\n if (source !== 'telegram' && source !== 'weixin') {\n return true;\n }\n\n const cfg = ctx.getConfig?.() ?? ctx.config;\n\n if (source === 'weixin') {\n const wx = cfg.channels?.weixin as WeixinConfig | undefined;\n if (!wx?.enabled) return false;\n const parsed = parseSessionKey(sessionKey);\n const accountId = parsed?.accountId ?? 'default';\n let allowFrom: Array<string | number> = [];\n if (wx.accounts && Object.keys(wx.accounts).length > 0) {\n const acc = wx.accounts[accountId] ?? wx.accounts['default'];\n if (!acc || acc.enabled === false) return false;\n allowFrom = [...(acc.allowFrom ?? [])];\n } else {\n allowFrom = [...(wx.allowFrom ?? [])];\n }\n if (allowFrom.length === 0) return false;\n return resolveAllowlistMatchSimple({ allowFrom, senderId }).allowed;\n }\n\n const tg = cfg.channels?.telegram as TelegramConfig | undefined;\n if (!tg?.enabled) return false;\n const parsed = parseSessionKey(sessionKey);\n const accountId = parsed?.accountId ?? 'default';\n let allowFrom: Array<string | number> = [];\n let groupAllowFrom: Array<string | number> = [];\n if (tg.accounts && Object.keys(tg.accounts).length > 0) {\n const acc = tg.accounts[accountId] ?? tg.accounts['default'];\n if (!acc || acc.enabled === false) return false;\n allowFrom = [...(acc.allowFrom ?? [])];\n groupAllowFrom = [...(acc.groupAllowFrom ?? [])];\n } else {\n allowFrom = [...(tg.allowFrom ?? [])];\n groupAllowFrom = [...(tg.groupAllowFrom ?? [])];\n }\n const list = isGroup && groupAllowFrom.length > 0 ? groupAllowFrom : allowFrom;\n if (list.length === 0) return false;\n return resolveAllowlistMatchSimple({ allowFrom: list, senderId }).allowed;\n}\n\nconst configCommand: CommandDefinition = {\n id: 'system.config',\n name: 'config',\n aliases: ['cfg'],\n description:\n 'Show or update configuration. Usage: /config show [path] | /config set path=value | /config unset path',\n category: 'system',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: [\n '/config show',\n '/config show agents.defaults.models.chat',\n '/config set agents.defaults.models.chat.primary=anthropic/claude-opus-4-5',\n '/config set agents.defaults.temperature=0.5',\n '/config unset tts',\n ],\n handler: async (ctx: CommandContext, args: string) => {\n const parts = args.trim().split(/\\s+/);\n const action = parts[0]?.toLowerCase();\n const rest = parts.slice(1).join(' ').trim();\n\n if (!action || action === 'show' || action === 'get') {\n const config = ctx.getConfig?.() ?? loadConfig(resolveConfigPath());\n const plain = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n redactConfigForDisplay(plain);\n\n if (rest) {\n const parsed = parseConfigPath(rest);\n if (!parsed.ok || !parsed.path) {\n return { content: `⚠️ ${parsed.error ?? 'Invalid path.'}`, success: false };\n }\n const value = getConfigValueAtPath(plain, parsed.path);\n const rendered = JSON.stringify(value ?? null, null, 2);\n return { content: `⚙️ \\`${rest}\\`:\\n\\`\\`\\`json\\n${rendered}\\n\\`\\`\\`` };\n }\n\n const json = JSON.stringify(plain, null, 2);\n return { content: `⚙️ Current config:\\n\\`\\`\\`json\\n${json}\\n\\`\\`\\`` };\n }\n\n if (action === 'set') {\n if (!senderMayWritePersistentConfig(ctx)) {\n return {\n content: '⚠️ You are not allowed to change config from this chat surface.',\n success: false,\n };\n }\n const eqIndex = rest.indexOf('=');\n if (eqIndex <= 0) {\n return { content: '⚠️ Usage: /config set path=value', success: false };\n }\n const pathRaw = rest.slice(0, eqIndex).trim();\n const valueRaw = rest.slice(eqIndex + 1);\n\n const parsedPath = parseConfigPath(pathRaw);\n if (!parsedPath.ok || !parsedPath.path) {\n return { content: `⚠️ ${parsedPath.error}`, success: false };\n }\n if (isBlockedPath(parsedPath.path)) {\n return {\n content: `⚠️ Path \\`${pathRaw}\\` cannot be modified via chat for security reasons.`,\n success: false,\n };\n }\n\n const parsedValue = parseConfigValue(valueRaw);\n if (parsedValue.ok === false) {\n return { content: `⚠️ ${parsedValue.error}`, success: false };\n }\n\n const configPath = resolveConfigPath();\n const currentConfig = loadConfig(configPath) as Record<string, unknown>;\n setConfigValueAtPath(currentConfig, parsedPath.path, parsedValue.value);\n\n const validated = ConfigSchema.safeParse(currentConfig);\n if (!validated.success) {\n const firstIssue = validated.error.issues[0];\n const fieldPath = firstIssue.path.join('.');\n return {\n content: `⚠️ Config invalid after set (${fieldPath}: ${firstIssue.message}). Change not saved.`,\n success: false,\n };\n }\n\n await saveConfig(validated.data);\n log.info({ path: pathRaw, value: parsedValue.value }, 'Config updated via /config set');\n\n const valueLabel =\n typeof parsedValue.value === 'string'\n ? `\"${parsedValue.value}\"`\n : JSON.stringify(parsedValue.value);\n return { content: `⚙️ Config updated: \\`${pathRaw}\\` = ${valueLabel}` };\n }\n\n if (action === 'unset') {\n if (!senderMayWritePersistentConfig(ctx)) {\n return {\n content: '⚠️ You are not allowed to change config from this chat surface.',\n success: false,\n };\n }\n if (!rest) {\n return { content: '⚠️ Usage: /config unset path', success: false };\n }\n const parsedPath = parseConfigPath(rest);\n if (!parsedPath.ok || !parsedPath.path) {\n return { content: `⚠️ ${parsedPath.error}`, success: false };\n }\n if (isBlockedPath(parsedPath.path)) {\n return {\n content: `⚠️ Path \\`${rest}\\` cannot be modified via chat for security reasons.`,\n success: false,\n };\n }\n\n const configPath = resolveConfigPath();\n const currentConfig = loadConfig(configPath) as Record<string, unknown>;\n const removed = unsetConfigValueAtPath(currentConfig, parsedPath.path);\n if (!removed) {\n return { content: `⚙️ No config value found at \\`${rest}\\`.`, success: false };\n }\n\n const validated = ConfigSchema.safeParse(currentConfig);\n if (!validated.success) {\n const firstIssue = validated.error.issues[0];\n const fieldPath = firstIssue.path.join('.');\n return {\n content: `⚠️ Config invalid after unset (${fieldPath}: ${firstIssue.message}). Change not saved.`,\n success: false,\n };\n }\n\n await saveConfig(validated.data);\n log.info({ path: rest }, 'Config key removed via /config unset');\n return { content: `⚙️ Config updated: \\`${rest}\\` removed.` };\n }\n\n return {\n content:\n '⚙️ *Config Command*\\n\\n' +\n '`/config show [path]` — view config (or a specific path)\\n' +\n '`/config set path=value` — update a config value\\n' +\n '`/config unset path` — remove a config key\\n\\n' +\n 'Examples:\\n' +\n '`/config show agents.defaults.models.chat`\\n' +\n '`/config set agents.defaults.temperature=0.5`\\n' +\n '`/config set agents.defaults.thinkingDefault=medium`\\n' +\n '`/config unset tts`',\n };\n },\n};\n\nexport function registerConfigCommand(): void {\n commandRegistry.register(configCommand);\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ function parseConfigPath(raw) {
|
|
|
3
3
|
const parts = raw.trim().split(".").map((p) => p.trim());
|
|
4
4
|
if (parts.some((p) => !p)) return {
|
|
5
5
|
ok: false,
|
|
6
|
-
error: "Invalid path. Use dot notation (e.g. agents.defaults.
|
|
6
|
+
error: "Invalid path. Use dot notation (e.g. agents.defaults.models.chat.primary)."
|
|
7
7
|
};
|
|
8
8
|
return {
|
|
9
9
|
ok: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-paths.js","names":[],"sources":["../../../src/chat-commands/config-paths.ts"],"sourcesContent":["type PathNode = Record<string, unknown>;\n\nexport function parseConfigPath(raw: string): { ok: boolean; path?: string[]; error?: string } {\n const parts = raw.trim().split('.').map((p) => p.trim());\n if (parts.some((p) => !p)) {\n return { ok: false, error: 'Invalid path. Use dot notation (e.g. agents.defaults.
|
|
1
|
+
{"version":3,"file":"config-paths.js","names":[],"sources":["../../../src/chat-commands/config-paths.ts"],"sourcesContent":["type PathNode = Record<string, unknown>;\n\nexport function parseConfigPath(raw: string): { ok: boolean; path?: string[]; error?: string } {\n const parts = raw.trim().split('.').map((p) => p.trim());\n if (parts.some((p) => !p)) {\n return { ok: false, error: 'Invalid path. Use dot notation (e.g. agents.defaults.models.chat.primary).' };\n }\n return { ok: true, path: parts };\n}\n\nexport function getConfigValueAtPath(root: PathNode, path: string[]): unknown {\n let cursor: unknown = root;\n for (const key of path) {\n if (typeof cursor !== 'object' || cursor === null) return undefined;\n cursor = (cursor as PathNode)[key];\n }\n return cursor;\n}\n\nexport function setConfigValueAtPath(root: PathNode, path: string[], value: unknown): void {\n let cursor: PathNode = root;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (typeof cursor[key] !== 'object' || cursor[key] === null) cursor[key] = {};\n cursor = cursor[key] as PathNode;\n }\n cursor[path[path.length - 1]] = value;\n}\n\nexport function unsetConfigValueAtPath(root: PathNode, path: string[]): boolean {\n let cursor: PathNode = root;\n for (let i = 0; i < path.length - 1; i++) {\n const next = cursor[path[i]];\n if (typeof next !== 'object' || next === null) return false;\n cursor = next as PathNode;\n }\n const leaf = path[path.length - 1];\n if (!(leaf in cursor)) return false;\n delete cursor[leaf];\n return true;\n}\n"],"mappings":";AAEA,SAAgB,gBAAgB,KAA+D;CAC7F,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;AACxD,KAAI,MAAM,MAAM,MAAM,CAAC,EAAE,CACvB,QAAO;EAAE,IAAI;EAAO,OAAO;EAA8E;AAE3G,QAAO;EAAE,IAAI;EAAM,MAAM;EAAO;;AAGlC,SAAgB,qBAAqB,MAAgB,MAAyB;CAC5E,IAAI,SAAkB;AACtB,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO,KAAA;AAC1D,WAAU,OAAoB;;AAEhC,QAAO;;AAGT,SAAgB,qBAAqB,MAAgB,MAAgB,OAAsB;CACzF,IAAI,SAAmB;AACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;EACxC,MAAM,MAAM,KAAK;AACjB,MAAI,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,KAAM,QAAO,OAAO,EAAE;AAC7E,WAAS,OAAO;;AAElB,QAAO,KAAK,KAAK,SAAS,MAAM;;AAGlC,SAAgB,uBAAuB,MAAgB,MAAyB;CAC9E,IAAI,SAAmB;AACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;EACxC,MAAM,OAAO,OAAO,KAAK;AACzB,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,WAAS;;CAEX,MAAM,OAAO,KAAK,KAAK,SAAS;AAChC,KAAI,EAAE,QAAQ,QAAS,QAAO;AAC9B,QAAO,OAAO;AACd,QAAO"}
|
|
@@ -114,7 +114,7 @@ var CommandContextImpl = class {
|
|
|
114
114
|
}
|
|
115
115
|
getCurrentModel() {
|
|
116
116
|
if (this.deps.getCurrentModel) return this.deps.getCurrentModel();
|
|
117
|
-
return this.config.agents?.defaults?.
|
|
117
|
+
return this.config.agents?.defaults?.models?.chat?.primary || "minimax/minimax-m2.1";
|
|
118
118
|
}
|
|
119
119
|
async listModels() {
|
|
120
120
|
if (this.deps.listModels) return this.deps.listModels();
|