Commit graph

77 commits

Author SHA1 Message Date
tanzhenxin
5c1e7ecadb
Merge pull request #2428 from qqqys/feat/mcp_reconnect_error
feat(mcp): add reconnect command and implement auto-reconnect logic
2026-04-01 16:53:36 +08:00
tanzhenxin
b2f04418fa
Merge pull request #2628 from QwenLM/feat/channels-telegram
feat(channels): add extensible Channels platform with plugin system and Telegram/WeChat/DingTalk channels
2026-04-01 16:19:08 +08:00
tanzhenxin
2eb2f4e319
Merge pull request #2719 from QwenLM/feat/npm-extension-installation
feat(extension): Add npm registry support for extension installation
2026-04-01 16:18:17 +08:00
qqqys
371a5cfa21 Merge branch 'main' of https://github.com/qqqys/qwen-code into feat/mcp_reconnect_error 2026-04-01 14:55:07 +08:00
DennisYu07
5221002831 remove hooks experimental and refactor hook Config 2026-04-01 11:50:23 +08:00
tanzhenxin
7bbd5e6471 fix(channels): address PR review — security, bugs, and reliability
- fix: sanitize remote filenames with basename() and isolate uploads
  in UUID subdirs to prevent path traversal and collision (#2-4, #27)
- fix: use crypto.randomInt() for pairing codes instead of Math.random() (#5)
- fix: pass config.sessionScope instead of hardcoded 'user' (#6);
  add per-channel scope overrides via setChannelScope() for startAll (#7)
- fix: removeSession now returns removed session IDs and persists
  when chatId is provided (#8)
- fix: /clear only removes the cleared session from instructedSessions,
  not all sessions (#9)
- fix: DingTalk @mention stripping now removes only the first mention
  instead of all mentions (#10)
- fix: remove dead TELEGRAF_COMMANDS Set and its guard (#13)
- fix: WeChat cursor saved after message processing, not before (#14)
- fix: crash recovery uses time-window counting instead of resettable
  counter to prevent infinite restart loops (#17)
- fix: call channel.disconnect() before exit on crash exhaustion (#18)
2026-03-31 00:57:59 +00:00
tanzhenxin
9fc2abbed2 style(test): use bracket notation for process.env access
This satisfies ESLint no-dot-notation rule for consistent property access.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-28 04:17:04 +00:00
tanzhenxin
d84675e86f test(channels): add comprehensive test suites for channel adapters
- Add ChannelBase, GroupGate, SenderGate, SessionRouter tests
- Add DingTalk markdown utility tests
- Add Weixin media and send helper tests
- Add CLI channel config-utils and pidfile tests
- Configure vitest for all channel packages
- Exclude test files from TypeScript build

Tests cover attachment handling, block streaming, gating policies,
session routing, markdown conversion, config parsing, and service management.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 15:26:39 +00:00
tanzhenxin
3a157d1fec feat(extension): add npm registry support for extension installation
- Add new npm extension installation channel via scoped packages (@scope/name)
- Implement npm.ts module with registry resolution, authentication, and download logic
- Support version pinning, dist-tags (latest, beta), and custom registries
- Handle private registry auth via NPM_TOKEN env var and .npmrc _authToken entries
- Update CLI install command with --registry flag for npm extensions
- Add comprehensive tests for npm package parsing and registry operations
- Update documentation for releasing and installing from npm registries
- Integrate npm updates into extension manager and update checking flow

This enables teams using npm for package distribution to publish Qwen Code extensions through their existing infrastructure, with full support for private registries and access control.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 20:38:35 +08:00
tanzhenxin
811ccdd02d Merge remote-tracking branch 'origin/main' into feat/channels-telegram 2026-03-27 08:21:41 +00:00
tanzhenxin
06ccc80c48 feat(channels): allow extensions to register channel plugins
- Add ExtensionChannelConfig interface for declaring channels in extension manifests
- Add loadChannelsFromExtensions() to discover and register channel plugins from active extensions
- Integrate extension channel loading into channel start commands

This enables extensions to contribute new channel types (e.g., Telegram, Slack) without modifying core code.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 13:59:32 +00:00
tanzhenxin
8a6ed128ea feat(channels): add ChannelPlugin interface and registry-based factory
Refactor channel system to use a formal plugin interface:

- Add ChannelPlugin interface to @qwen-code/channel-base (channelType,
  displayName, requiredConfigFields, createChannel factory)
- Each built-in adapter (Telegram, WeChat, DingTalk) exports a plugin object
- Replace hardcoded if/else factory with a Map-based channel registry
- Config validation now uses plugin's requiredConfigFields dynamically
- ChannelType changed from fixed union to string for extensibility
- Multi-channel mode now picks model from first channel config

This is the foundation for external plugin support — built-in channels
go through the exact same code path that third-party plugins will use.
2026-03-26 12:34:31 +00:00
tanzhenxin
92c54ff309 feat(channels): add DingTalk channel adapter
- Add @qwen-code/channel-dingtalk package with stream-based bot integration
- Support clientId/clientSecret authentication for DingTalk
- Add message deduplication and group chat mention handling
- Update ChannelConfig type to include dingtalk channel type

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 08:03:43 +00:00
tanzhenxin
697898a9fb feat(channel): add status and stop commands for service management
- Add `qwen channel status` to check running service info
- Add `qwen channel stop` to gracefully stop the service
- Add PID file tracking to prevent duplicate service instances
- Update documentation with new commands and usage

This enables users to manage the channel service from another terminal
without needing to use Ctrl+C on the foreground process.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 03:06:48 +00:00
tanzhenxin
1a605ec973 feat(channels): add crash recovery and gateway mode support
- Add session persistence to SessionRouter for crash recovery
- Add loadSession method to AcpBridge for restoring sessions
- Add ChannelBaseOptions to support external router injection
- Refactor start.ts to support both standalone and gateway modes
- Extract config utilities into separate module

This enables channels to recover sessions after bridge crashes and
supports running multiple channels under a gateway process.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 02:55:18 +00:00
tanzhenxin
4f2b9e9bd8 feat(channels): add multimodal support with image handling
- Add model configuration option for channel-specific model selection
- Support base64-encoded images in prompts via AcpBridge
- Add media utilities for WeChat/Weixin channel
- Update settings schema for model configuration

Enables channels to process images and use custom models.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-25 07:43:48 +00:00
tanzhenxin
24c9b0f333 feat(channels): add WeChat/Weixin channel support
- Add WeixinAdapter with accounts, api, login, monitor, send modules
- Add channel configure command for interactive setup
- Update TelegramAdapter for consistency

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-25 06:54:51 +00:00
tanzhenxin
90236465d3 feat(channels): add group chat support for Telegram
- Add GroupGate class for group access control with three policies:
  disabled (default), allowlist, and open
- Implement mention gating: bot only responds when @mentioned or replied to
  in groups (configurable per-group)
- Extend Envelope type with isGroup, isMentioned, isReplyToBot fields
- Update TelegramAdapter to detect group context and mentions
- Add comprehensive documentation for group chat setup and troubleshooting

This enables using Qwen Code bots in Telegram groups with fine-grained
access control and mention-based activation to prevent noise.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-25 02:04:27 +00:00
tanzhenxin
8753245b5f feat(channels): add DM pairing flow for sender approval
- Add PairingStore for managing pending requests and approved users
- Update SenderGate to support pairing policy with code generation
- Add CLI commands: `qwen channel pairing list/approve`
- Document pairing flow with rules and usage examples

This allows unknown senders to request access via a pairing code
that the bot operator approves through the CLI.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-24 11:37:16 +00:00
tanzhenxin
615ccd08f2 feat(channels): add config validation, instructions, and sessionScope support
- Validate required fields (type, token) with clear error messages
- Prepend channel instructions to first prompt of each session
- SessionRouter respects sessionScope (user/thread/single) for routing keys
2026-03-24 06:33:37 +00:00
tanzhenxin
3eedc43238 feat(channels): add Telegram channel integration with ACP bridge
Implements the channels infrastructure for connecting external messaging
platforms to Qwen Code via ACP. Phase 1 supports plain text round-trip:
Telegram user sends message -> AcpBridge -> qwen-code --acp -> response
back to Telegram.

New packages:
- @qwen-code/channel-base: AcpBridge, SessionRouter, SenderGate, ChannelBase
- @qwen-code/channel-telegram: TelegramAdapter using telegraf

CLI: `qwen channel start <name>` reads from settings.json channels config,
spawns ACP agent, connects to Telegram via polling.
2026-03-24 06:33:36 +00:00
DennisYu07
b08154dbee refactor ui for qwen code hooks 2026-03-23 11:24:59 +08:00
LaZzyMan
4b67e60e63 fix lint 2026-03-19 10:47:30 +08:00
LaZzyMan
620807b1ee fix: code-plan to coding-plan 2026-03-18 19:57:11 +08:00
qqqys
9555e96ec2 test(mcp): update tests to include verification of reconnect command registration 2026-03-18 17:43:39 +08:00
LaZzyMan
28149e0cc4 fix test ci 2026-03-17 19:15:58 +08:00
LaZzyMan
8722dc9dd6 fix remove useless output 2026-03-17 18:53:42 +08:00
LaZzyMan
9a3041335f feat: add auth command 2026-03-17 18:11:22 +08:00
qqqys
9909edc8f2 refactor(mcp): enhance reconnect logic and error handling 2026-03-17 10:46:40 +08:00
qqqys
8a2bda67ed feat(mcp): add reconnect command and implement auto-reconnect logic
- Added a new reconnect command to the MCP CLI.
- Implemented auto-reconnect functionality in DiscoveredMCPToolInvocation to handle connection errors with retry logic.
- Enhanced tests to cover reconnect scenarios and ensure reliability during connection failures.
2026-03-16 23:25:33 +08:00
Yusheng
66c625a555 fix: improve qwen mcp add option handling for arrays 2026-03-10 17:37:51 +08:00
DennisYu07
43d64e26ca refactor stop hook 2026-02-22 02:20:45 -08:00
tanzhenxin
a3b95414de feat(mcp): auto-detect transport type from URL in mcp add command
- Automatically detect 'http' transport when commandOrUrl starts with http:// or https://
- Default to 'stdio' transport for non-URL commands
- Explicit --transport flag still takes precedence over auto-detection
- Update help text to indicate auto-detection capability

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-08 11:11:02 +08:00
tanzhenxin
21e711469d fix(mcp): update OAuth client names and improve MCP commands
- Rename MCP OAuth client names from 'Gemini CLI' to 'Qwen Code'
- Update MCP add/remove/list commands with improved error handling
- Add comprehensive tests for OAuth provider
- Fix token storage test assertions
- Clean up unused i18n translation keys
- Update gemini-converter and window title references

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-08 10:46:48 +08:00
tanzhenxin
4abec5c055 Merge remote-tracking branch 'origin/main' into feat/debug-logging-refactor 2026-02-05 20:23:48 +08:00
LaZzyMan
b15b9b7ef4 fix ui 2026-02-03 14:30:55 +08:00
LaZzyMan
7b63b24773 fix: add hint for installing external extensions 2026-02-03 14:17:32 +08:00
tanzhenxin
89e3c2cd7a refactor(debug): replace ConsolePatcher with debugLogger and update error reporting
- Replace ConsolePatcher with centralized debugLogger utility
- Refactor errorReporting to use debugLogger instead of file-based reporting
- Remove user-facing console message components:
  - Delete ConsolePatcher.ts, useConsoleMessages.ts/hook
  - Delete ConsoleSummaryDisplay.tsx, DetailedMessagesDisplay.tsx
- Update all tests in packages/core and packages/cli:
  - Mock debugLogger where needed
  - Remove assertions for console output on non-critical errors
  - Keep debugLogger assertions for fatal/network errors
  - Use HOME directory mocking for hermetic file system tests

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-02 17:37:54 +08:00
tanzhenxin
135df54f27 Merge branch 'main' into feat/debug-logging-refactor
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-01 20:47:38 +08:00
ojha
6f7180251b feat: add Gemini extension origin warning in consent prompt
Shows warning when installing Gemini CLI extensions to set user expectations
about potential compatibility differences.

- Keeps isGeminiExtensionConfig validation intact (no skipped checks)
- Zero UI in core package (warning only in CLI layer via consent.ts)
- Uses t() for internationalization
- Warning appears in consent prompt before installation

Fixes: #1621
2026-01-30 05:33:11 +05:30
LaZzyMan
61d2c72c90 feat: add skills and agents display to extension list with i18n support
- Add skills and agents sections to extensionToOutputString() output
- Implement full i18n support for all extension info labels
- Add translations for en, zh, de, ru languages
- Display skill names and agent names in extension list command
2026-01-27 20:42:35 +08:00
tanzhenxin
7995c65571 feat(cli): migrate console calls to debugLogger and stdioHelpers (M3 Phase 7-9)
Route CLI console.* calls to structured logging:
- Debug/internal diagnostics → debugLogger (logfile)
- User-facing output → writeStdoutLine/writeStderrLine/clearScreen (stdioHelpers)
- Add stdioHelpers.ts with writeStdoutLine, writeStderrLine, clearScreen
- Migrate pre-session files (gemini.tsx, sandbox.ts, config.ts) to stdioHelpers
- Migrate extension/MCP commands to stdioHelpers
- Migrate non-interactive session/control to debugLogger
- Migrate UI hooks and components to debugLogger
2026-01-26 15:02:37 +08:00
tanzhenxin
6081052236
Merge pull request #1592 from QwenLM/feat/extension-improvements
feat(extensions): add plugin selection UI for Claude marketplace
2026-01-26 10:36:36 +08:00
LaZzyMan
9af9ea259d feat: add select ui for claude marketplace 2026-01-23 16:23:30 +08:00
tanzhenxin
8d0f785c28
Merge pull request #1572 from weiyuanke/patch-1
Update command usage in add.ts to reflect new name
2026-01-23 09:33:01 +08:00
LaZzyMan
674bb6386e feat(extensions): add detail command and improve extension validation
- Add /extensions detail command to show extension details
- Allow underscores and dots in extension names
- Fix contextFileName empty array handling to use default QWEN.md
- Fix marketplace extension clone to use correct source URL
- Add inline parameter to extensionToOutputString
- Add comprehensive tests for all changes
2026-01-22 19:37:01 +08:00
LaZzyMan
aa80e738fb fix dependences of core pkg 2026-01-22 14:09:08 +08:00
yuanke wei
27df0486a3
Update command usage in add.ts to reflect new name 2026-01-22 09:56:59 +08:00
LaZzyMan
f467054372 feat: remove excludeTools in extension 2026-01-20 17:50:18 +08:00
LaZzyMan
e87376e06c i18n add extension commands 2026-01-20 17:20:20 +08:00