Commit graph

5543 commits

Author SHA1 Message Date
Mingholy
f7716eeb01
Merge pull request #2712 from QwenLM/mingholy/fix/permission-message-variants
test(sdk): improve permission message pattern matching
2026-03-27 17:35:28 +08:00
JohnKeating1997
5871be4496 fix(auth): update references to Alibaba Cloud ModelStudio Standard API Key in AuthDialog
- Changed all instances of "Alibaba Cloud Standard API Key" to "Alibaba Cloud ModelStudio Standard API Key" in AuthDialog and related tests.
- Added documentation links for ModelStudio Standard API Key based on region selection.
- Enhanced user feedback messages to reflect the new API key terminology.
2026-03-27 17:30:24 +08:00
tanzhenxin
af345a3924 chore(channels): bump package versions and improve clean script
- Bump all channel packages from 0.1.0 to 0.13.0
- Fix plugin-example to use file reference for channel-base dependency
- Add bin entry for plugin-example server
- Clean tsconfig.tsbuildinfo files in clean script

This aligns channel package versions with the main project and ensures
proper cleanup of TypeScript build artifacts.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 09:26:07 +00:00
Mingholy
f6c273d0a0
Merge pull request #2690 from LaZzyMan/fix/acp-permission-flow
fix(acp): align permission flow across clients
2026-03-27 17:19:46 +08:00
Mingholy
81c7a3a3f4
Merge pull request #2694 from QwenLM/fix/at-file-search-after-slash-command-2518
fix: @ file search stops working after selecting a slash command
2026-03-27 17:19:27 +08:00
Mingholy
4f8c98576a
Merge pull request #2675 from LaZzyMan/fix-issue-2671
fix: use config working directory for OpenAI logger path resolution in ACP mode
2026-03-27 16:54:59 +08:00
tanzhenxin
dea144918b feat(channels): configure channel adapters for compiled distribution
- Update package.json exports to point to dist directory
- Add TypeScript build scripts to each channel adapter
- Include channel adapters in build order

This enables proper TypeScript compilation and distribution of channel
adapter packages.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 08:46:54 +00:00
mingholy.lmh
4219101397 test(sdk): improve permission message pattern matching
Support both 'declined' and 'denied' variants for permission denied messages in tool control tests.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 16:36:06 +08:00
tanzhenxin
fc0bb3c3db chore(cli): add TypeScript project references for channels packages
Add references to channels packages (base, telegram, weixin, dingtalk)
to enable proper TypeScript project references for the CLI package.

This enables better incremental builds and type checking across the
monorepo's channel packages.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 08:29:21 +00:00
LaZzyMan
f5349d80b9 fix: preserve original line endings (CRLF/LF) when editing files
- Add LineEnding type and detectLineEnding() function to fileSystemService
- Detect and record line ending format in readTextFile _meta
- Honor lineEnding from _meta in writeTextFile to restore original format
- Update edit.ts and write-file.ts to pass lineEnding through _meta
- Add comprehensive unit tests for line ending detection and preservation

Fixes: #2704
2026-03-27 16:28:41 +08:00
tanzhenxin
811ccdd02d Merge remote-tracking branch 'origin/main' into feat/channels-telegram 2026-03-27 08:21:41 +00:00
tanzhenxin
5dfcfd63c0 feat(build): add channel-base package to build order
This adds the new channel-base package to the build order, positioned
before cli since cli depends on it.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 08:17:00 +00:00
JohnKeating1997
ddc397360f refactor(auth): support multiple model IDs in Alibaba Cloud Standard API authentication
- Updated AuthDialog to handle multiple model IDs, allowing users to input and submit a comma-separated list.
- Adjusted related functions to process and validate multiple model IDs.
- Enhanced user feedback messages to reflect the changes in model ID handling.
2026-03-27 15:49:05 +08:00
tanzhenxin
a700ce8186 chore(release): add channel packages to release workflow
- Bump channel package versions to 0.13.0
- Add publish steps for @qwen-code/channel-base and @qwen-code/channel-plugin-example
- Update version script to convert file: references to semver for published packages

This enables proper npm publishing of channel packages during the release process.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 06:16:22 +00:00
DennisYu07
8dfd981af0 Merge branch 'main' into feat/hooks-refactor-ui-event 2026-03-27 13:59:33 +08:00
LaZzyMan
1506934756 feat: add claw guide to readme 2026-03-27 13:43:12 +08:00
tanzhenxin
c97c548acb feat(channels): make plugin-example package publishable
- Update channel-base to use built dist/ output with proper exports
- Add README with quick start guide and usage instructions
- Add qwen-extension.json manifest for extension discovery
- Add start-server CLI for running the mock WebSocket server
- Update dependencies from local file: to npm version

This enables the plugin-example package to be published and installed
as a standalone extension for testing the channel plugin system.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 04:21:56 +00:00
LaZzyMan
7a6b725b0c feat: replace qwen-settings-config with bundled qc-helper skill
- Remove project-level qwen-settings-config skill and its references/
- Create bundled qc-helper skill at packages/core/src/skills/bundled/
  that references docs/users/ for answering usage/config questions
- Update copy_bundle_assets.js to copy docs/users/ into dist/bundled/qc-helper/docs/
- Update dev.js to create symlink for dev mode docs access
- Add bundled docs directory verification in prepare-package.js
- Revert doc-update skills (docs-audit-and-refresh, docs-update-from-diff)
  to main branch versions
2026-03-27 12:03:00 +08:00
tanzhenxin
ad20049a4e Merge remote-tracking branch 'origin/main' into refactor/subagent-model-selection 2026-03-27 11:56:29 +08:00
tanzhenxin
5d58b2f112 feat: simplify subagent model configuration with model selector
Refactor subagent model configuration from nested modelConfig object to a simple model string field for better UX and clarity.

Changes:
- Replace modelConfig object with model string in SubagentConfig interface
- Add model-selection.ts utility for parsing and validating model selectors
- Support 'inherit' keyword and bare model IDs (e.g., 'glm-5', 'claude-sonnet-4-6')
- Maintain backward compatibility by parsing legacy modelConfig frontmatter
- Update validation to reject cross-provider authType-prefixed selectors
- Update SDK types (TypeScript and Java) to reflect new schema
- Add comprehensive tests for model selection and validation
- Update documentation with model selection examples

Breaking changes:
- modelConfig.frontmatter field deprecated in favor of model field
- Cross-provider model selectors (e.g., 'openai:gpt-4') not supported for subagents

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 11:49:45 +08:00
DennisYu07
0c6b16c695 add check for userPromptSubmit 2026-03-27 11:27:33 +08:00
tanzhenxin
987eebd1c4 docs(channels): add plugin developer guide and rename mock to plugin-example
- Add comprehensive developer guide for building channel plugins
- Add user-facing docs for installing/configuring custom channel plugins
- Replace custom-channels.md with new plugins.md
- Rename @qwen-code/channel-mock to @qwen-code/channel-plugin-example
- Add messageId field to Envelope type for response correlation

This provides clear documentation for developers building custom channel
adapters and renames the mock package to better reflect its purpose as
a reference implementation example.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 03:19:34 +00:00
LaZzyMan
cec0074b2d fix(acp): prefer filePath over fileName in buildPermissionRequestContent
When building diff content for edit-type permission requests, use
confirmation.filePath (full path) when available, falling back to
confirmation.fileName. This aligns with the test expectation and
ensures SubAgentTracker sends the correct file path in ACP permission
dialogs.
2026-03-27 10:58:00 +08:00
LaZzyMan
0fd6f3a78b Merge branch 'main' into fix/acp-permission-flow 2026-03-27 10:54:25 +08:00
DennisYu07
cf0b67ef8e refactor ui for stop hook reason and systemMessage 2026-03-27 10:54:16 +08:00
LaZzyMan
3b2d50fad6 fix: @ file search stops working after selecting a slash command (#2518) 2026-03-27 10:47:55 +08:00
LaZzyMan
07273015fd test(acp): add coverage for L1 isToolEnabled deny in Session.runTool
Verify that when PermissionManager.isToolEnabled resolves to false the
tool is never executed and no permission dialog is opened.  This guards
against the async-await regression fixed in the previous commit.
2026-03-27 10:46:35 +08:00
LaZzyMan
cb97bf6068 fix(acp): add missing await for async isToolEnabled in Session.runTool
PermissionManager.isToolEnabled was changed to async in this PR but the
call site in Session.runTool was not updated, causing the Promise to be
evaluated as a truthy value and the L1 tool-enablement check to always
pass — effectively disabling permission denial in the ACP session path.
2026-03-27 10:37:20 +08:00
LaZzyMan
585bce06d2 Merge branch 'fix-permission-issues' into fix/acp-permission-flow 2026-03-27 10:05:01 +08:00
LaZzyMan
dd518de5b0 fix(acp): align permission flow across clients 2026-03-26 23:25:04 +08:00
tanzhenxin
01c2e5a373 docs(channels): add custom channel plugins documentation
- Document channels config in extension manifest
- Add guide for creating custom channel adapters
- Explain ChannelPlugin interface and ChannelBase usage

This enables users to extend the channel system with custom platform adapters.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 14:41:20 +00:00
tanzhenxin
0f9e4409df feat(channels): add mock channel package for E2E testing
- Add @qwen-code/channel-mock package with MockPluginChannel
- Add createMockServer for programmatic test control via WebSocket
- Refactor integration test to use real WebSocket E2E flow

This enables testing the full channel pipeline (WebSocket → ChannelBase → AcpBridge → agent)
instead of the previous in-process loopback approach.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 14:30:33 +00:00
tanzhenxin
2b10a2dc54 test(channels): add loopback channel integration test
- Uses in-process LoopbackChannel instead of 3-process mock architecture
- Tests real agent responses through full channel pipeline
- Verifies session state persistence across messages
- Validates per-sender session routing

This provides lightweight integration testing for the channel plugin
system without external dependencies.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 14:15:56 +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
Mingholy
26e0128dc6
Merge pull request #2631 from QwenLM/fix/issue-1203-subagent-diff-tab-stuck
Some checks are pending
Qwen Code CI / Lint (push) Waiting to run
Qwen Code CI / Test (push) Blocked by required conditions
Qwen Code CI / Test-1 (push) Blocked by required conditions
Qwen Code CI / Test-2 (push) Blocked by required conditions
Qwen Code CI / Test-3 (push) Blocked by required conditions
Qwen Code CI / Test-4 (push) Blocked by required conditions
Qwen Code CI / Test-5 (push) Blocked by required conditions
Qwen Code CI / Test-6 (push) Blocked by required conditions
Qwen Code CI / Test-7 (push) Blocked by required conditions
Qwen Code CI / Test-8 (push) Blocked by required conditions
Qwen Code CI / Post Coverage Comment (push) Blocked by required conditions
Qwen Code CI / CodeQL (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none (push) Waiting to run
E2E Tests / E2E Test - macOS (push) Waiting to run
fix(acp-integration/agent): clear stale subagent diff confirmation after IDE accept
2026-03-26 21:44:16 +08:00
Mingholy
d6502dd352
Merge pull request #2637 from LaZzyMan/fix-permission-issues
feat: human-readable permission labels, deny rule feedback, and multi-dir search improvements
2026-03-26 21:44:00 +08:00
Mingholy
be32213973
Merge pull request #2611 from QwenLM/mingholy/fix/node-pty-errors
fix(shell): handle PTY race condition errors gracefully
2026-03-26 21:43:33 +08:00
Mingholy
27bb18455f
Merge pull request #2644 from QwenLM/fix-sdk-e2e
test(sdk): improve tool control docs and add pattern matching tests
2026-03-26 21:43:09 +08:00
Mingholy
849a7327eb
Potential fix for code scanning alert no. 110: Replacement of a substring with itself
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-03-26 21:41:10 +08:00
mingholy.lmh
3edbf561e6 test(sdk): remove debug executable path 2026-03-26 21:14:35 +08:00
mingholy.lmh
9db176a07b test(sdk): improve abort test reliability with partial message handling
- Use includePartialMessages and isSDKPartialAssistantMessage for more reliable abort triggering
- Remove flaky tool name assertions that could fail when tools aren't registered (issue #2653)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-26 21:02:30 +08:00
wenshao
3ce0d42c83 fix: resolve review feedback issues in /review skill
- Add `side="RIGHT"` param and multi-line support (start_line + line) to gh api calls
- Add fallback: if inline comment fails, include finding in overall review summary
- Warn user when `--comment` is used with non-PR target instead of silently ignoring
- Move environment restoration from Step 3 to new Step 5, after Step 4 posts comments,
  to ensure `git rev-parse HEAD` returns the correct PR commit SHA

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 20:53:40 +08:00
wenshao
b24b9e191d enhance /review: add verification step, false positive control, and PR comment integration
Add three enhancements to the /review skill to improve review quality and
GitHub integration:

- False positive exclusion list and structured output format for review agents
- Step 2.5: deduplicate findings then verify each with independent parallel agents
- Step 4: post inline comments on PRs via `gh api` when `--comment` flag is set

Closes #2684

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 20:46:24 +08: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
DennisYu07
80d4b50f90
Merge pull request #2679 from QwenLM/feat/hooks-doc
docs: add hooks documentation and fix JSON schema
2026-03-26 20:14:40 +08:00
Mingholy
00447356ad
Merge pull request #2602 from QwenLM/feat/hooks-refactor-hooks-ui
feat(hooks ui): refactor ui for Qwen Code hooks
2026-03-26 20:11:50 +08:00
tanzhenxin
f3a03d0bdc fix(channels): isolate sessions per chat and serialize prompts per session
Two bugs caused cross-talk between DM and group conversations:

1. Session routing key only used senderId, so the same user in DM and
   group shared one ACP session (and conversation context). Now includes
   chatId: `channelName:senderId:chatId`.

2. Concurrent messages on the same session caused textChunk listener
   pollution in AcpBridge.prompt(), leaking response text across chats.
   Added per-session promise queue in ChannelBase to serialize prompts.
2026-03-26 11:58:03 +00:00
DennisYu07
e11deedc67 fix test 2026-03-26 19:52:53 +08:00
DennisYu07
a4e2ff9554 remove cases 2026-03-26 19:25:48 +08:00
DennisYu07
b0d01a1fb9 remove case 2026-03-26 18:53:51 +08:00