qwen-code/packages/cli
Aleks-0 736b710ed0
feat(core): add tools.visible config for selective deferred-tool visibility at startup (#6372)
* feat(core): add tools.visible config for selective deferred-tool visibility

* fix(cli): wire tools.visible from settings.json into Config

Add settingsSchema entry for tools.visible and plumb it through loadCliConfig into ConfigParameters.visibleTools. Without this the core-level visibleTools support was unreachable from settings.json.

Adds 3 CLI-level tests: visibleTools passthrough, empty default, safe-mode suppression.

Fixes #6368

* fix(core): exclude visibleTools from tool_search candidates and reveal path

Add visibleTools gate to collectCandidates() and loadAndReturnSchemas in tool-search.ts to prevent KV-cache invalidation when tool_search is invoked for a visible-deferred tool.

Without this, a tool listed in tools.visible would still appear as a keyword-search candidate and select: would still trigger revealDeferredTool + setTools, defeating the purpose of promoting it to first-class visibility.

3 tests: keyword-search exclusion, select: no-reveal/no-setTools, and select: still works for non-visible deferred tools.

* fix(cli): include visibleTools in /context per-tool token breakdown

Add config.getVisibleTools().has(tool.name) gate to the deferred-tool skip condition in collectContextData. Without this, visible-deferred tools appear in the headline total (via getFunctionDeclarations()) but are excluded from the per-tool breakdown, causing the sum to mismatch.

1 test: visibleTools included in breakdown despite deferred+unrevealed.

* fix: address all 7 review suggestions for tools.visible

1. settingsSchema: user-facing description instead of internal jargon

2. config.ts: use normalizeToolNameList (generic name) for both disabled and visible

3. config.test.ts: add bare-mode exclusion test

4. tool-registry.test.ts: disabledTools > visibleTools priority test

5. tool-registry.ts: update JSDoc for getDeferredToolSummary

6. tool-search.test.ts: mixed select: visible+non-visible test

7. tool-registry.test.ts: visible survives clearRevealedDeferredTools

* chore: regenerate settings.schema.json after description update

CI check detected that settings.schema.json was out of sync with settingsSchema.ts after the description was changed in commit 73e879882.

* fix: address wenshao review — extract isDeferredAndHidden, clean up abstractions

1. Remove normalizeToolNameList (empty wrapper, violates AGENTS.md no-abstraction rule)

2. Extract ToolRegistry.isDeferredAndHidden() — 5 call sites reduced to 1 predicate source

3. Add dirty-input test for tools.visible (whitespace, duplicates, empty strings)

4. Add MergeStrategy.UNION test for tools.visible across user + workspace scopes

---------

Co-authored-by: Aleks-0 <aleks-0@users.noreply.github.com>
2026-07-07 07:11:44 +00:00
..
src feat(core): add tools.visible config for selective deferred-tool visibility at startup (#6372) 2026-07-07 07:11:44 +00:00
index.ts fix(cli): add bootstrap fast paths (#6188) 2026-07-02 22:28:11 +00:00
package.json chore(release): v0.19.6 (#6280) 2026-07-03 16:37:54 +00:00
test-setup.ts perf(cli): code-split lowlight to cut startup V8 parse cost (#4070) 2026-05-15 17:26:18 +08:00
tsconfig.json feat(cli): Add daemon-managed channel worker for serve --channel (#6031) 2026-07-01 01:40:54 +00:00
vitest.config.ts fix(serve): optimize daemon NDJSON stream handling (#6263) 2026-07-03 15:27:28 +00:00