mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-08-26 00:53:48 +00:00
* feat(mcp): add 2026 protocol negotiation * feat(mcp): render MCP Apps in WebShell * fix(mcp): keep legacy tool discovery lenient * fix(mcp): keep Apps HTML out of TUI and honor tool visibility TUI and history compaction dumped mcp_app HTML as JSON, and discoverTools registered app-only tools for the model. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): stabilize AppBridge lifetime and close sandbox CSP gaps Theme toggles and transcript reseeds were tearing down MCP Apps; the host CSP also allowed any loopback port and form posts bypassed connect-src. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): list under-declared modern MCP capabilities over the wire v2 typed helpers return [] without a request when a capability is omitted. Use them only when the server declared the capability, and keep Apps unmounted in collapsed tool rows. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): keep Apps sandbox reachable and list past 64 pages Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): reject empty compacted html and keep MCP Apps expanded in multi-tool groups Fixes R3-1 and R3-2 review comments: R3-1: getMcpAppDisplay now rejects empty html strings (from compaction) so session replay shows fallbackText instead of mounting an empty iframe. R3-2: ToolGroup now checks for MCP apps across all tools (not just singleTool), auto-expands when any tool has an MCP app, and keeps MCP app rows expanded (summaryOnly=false, forceExpanded=true) even when adjacent tool calls are merged into the group. * feat(web-shell): fold thinking into the compact-mode tool summary (#9148) Compact mode used to drop thinking messages entirely, so a running turn gave no indication of the thinking step. Keep the thoughts and aggregate them with the adjacent tools into one summary: a streaming thought reads "Thinking…" with the running shimmer, and a completed thought settles into a click-to-expand row in its original interleaved position. The translate action is preserved on both the thinking block and the folded thought rows, and the merged group gets a synthetic id so its expanded state never leaks into non-compact mode. Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com> * fix(mcp): address app discovery and sandbox regressions * fix(web-shell): keep MCP apps expanded in compact summaries * Revert "feat(web-shell): fold thinking into the compact-mode tool summary (#9148)" This reverts commit ab2eebc5d36f17a51ce94e423db5745dcbb273fe. * fix(web-shell): render compacted MCP App fallback and teardown before unload Compacted history keeps type:mcp_app with empty html; show fallbackText instead of a blank sandbox, and wait for ui/resource-teardown before unloading the iframe. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): bound the discover probe and raise the daemon bundle cap Silent legacy stdio servers inherited the 10-minute request timeout for server/discover. Cap the probe at 5s so fallback fits the discovery window, and raise the browser bundle budget after the main merge overflowed CI by 47 bytes. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): skip version-negotiation probe on remote transports SDK v2 rejects HTTP server/discover timeouts without falling back to initialize, and the 5s probe consumed the entire remote discovery window. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(web-shell): keep MCP App iframe src across deferred teardown Deferred unload() was clearing src on the live iframe after a remount, so the new AppBridge never saw sandbox-proxy-ready. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): honor listing-level MCP App CSP and permissions registerAppResource puts ui.csp/permissions on resources/list, and resources/read does not merge that metadata into content entries. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): reuse session client for list and emit app fallback text Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): keep mcp list and IPv6 sandbox CSP valid Give qwen mcp list leftover handshake budget after the 5s discover probe, and stop emitting invalid [::1] CSP origins. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): keep modern list and short discovery budgets working Drop the era-illegal ping after mcp list connect, shrink the stdio discover probe to the discovery window, and document that remotes stay on legacy initialize until the SDK can fall back. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): keep the 2026 slice free of review-only extras Drop the global tools/list page cap, generated companion notices, and the review screenshot so this PR stays on stdio 2026 plus the WebShell Apps host. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): restore generated companion notices after the SDK v2 bump CI regenerates NOTICES.txt from the lockfile; the file has to ship with the new MCP client dependencies. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): isolate the Apps proxy from WebShell storage Drop allow-same-origin on the outer sandbox iframe so a default localhost daemon cannot read the WebShell session token. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(mcp): harden fallback and app sandbox * fix(core): preserve large and app-only MCP catalogs * fix(mcp): preserve legacy negotiation compatibility * fix(mcp): default stdio negotiation to legacy --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: ytahdn <1294726970@qq.com> Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com> Co-authored-by: YungSen Hsin <yungsenhsin@U-G0HXNQM1-2052.local>
91 lines
3.2 KiB
JSON
91 lines
3.2 KiB
JSON
{
|
|
"name": "@qwen-code/web-shell",
|
|
"version": "0.22.0",
|
|
"type": "module",
|
|
"main": "./dist/index.js",
|
|
"module": "./dist/index.js",
|
|
"types": "./dist/types/index.d.ts",
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/types/index.d.ts",
|
|
"import": "./dist/index.js"
|
|
}
|
|
},
|
|
"files": [
|
|
"dist/index.js",
|
|
"dist/types"
|
|
],
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "vite build && vite build --config vite.lib.config.ts && tsc -p tsconfig.lib.json",
|
|
"lint": "cd ../.. && eslint packages/web-shell --ext .ts,.tsx",
|
|
"lint:fix": "cd ../.. && eslint packages/web-shell --ext .ts,.tsx --fix",
|
|
"format:check": "cd ../.. && prettier --experimental-cli --check packages/web-shell",
|
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
"test": "vitest run --config vitest.config.ts",
|
|
"test:ci": "vitest run --config vitest.config.ts --coverage",
|
|
"test:coverage": "vitest run --config vitest.config.ts --coverage",
|
|
"test:e2e:smoke": "playwright test --config playwright.config.ts --grep @smoke",
|
|
"test:e2e:perf": "cross-env WEB_SHELL_PERF=1 playwright test --config playwright.config.ts --grep @perf --project=chromium",
|
|
"test:e2e": "playwright test --config playwright.config.ts",
|
|
"test:e2e:visuals": "playwright test --config playwright.visuals.config.ts",
|
|
"test:e2e:report": "playwright show-report client/e2e/playwright-report",
|
|
"verify": "npm run lint && npm run format:check && npm run typecheck && npm run test:ci"
|
|
},
|
|
"dependencies": {
|
|
"@codemirror/autocomplete": "^6.18.0",
|
|
"@codemirror/commands": "^6.7.0",
|
|
"@codemirror/language": "^6.10.0",
|
|
"@codemirror/merge": "^6.12.2",
|
|
"@codemirror/state": "^6.5.0",
|
|
"@codemirror/view": "^6.35.0",
|
|
"@datafe-open/markdown-chart": "^0.1.12",
|
|
"@datafe-open/markdown-chart-echarts": "^0.1.12",
|
|
"@datafe-open/markdown-chart-react": "^0.1.12",
|
|
"@modelcontextprotocol/ext-apps": "^1.7.5",
|
|
"@tanstack/react-virtual": "^3.13.26",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"codemirror": "^6.0.0",
|
|
"echarts": "^6.0.0",
|
|
"fzf": "^0.5.2",
|
|
"katex": "^0.16.47",
|
|
"lucide-react": "^1.24.0",
|
|
"mermaid": "^11.15.0",
|
|
"radix-ui": "^1.6.2",
|
|
"react-markdown": "^9.0.0",
|
|
"rehype-katex": "^7.0.1",
|
|
"remark-cjk-friendly": "^2.3.1",
|
|
"remark-gfm": "^4.0.0",
|
|
"remark-math": "^6.0.0",
|
|
"shiki": "^1.29.2",
|
|
"tailwind-merge": "^3.6.0",
|
|
"vaul": "^1.1.2"
|
|
},
|
|
"peerDependencies": {
|
|
"@qwen-code/sdk": ">=0.1.8",
|
|
"@qwen-code/webui": ">=0.0.1",
|
|
"react": "^18.0.0 || ^19.0.0",
|
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.57.0",
|
|
"@qwen-code/sdk": "file:../sdk-typescript",
|
|
"@qwen-code/webui": "file:../webui",
|
|
"@tailwindcss/vite": "^4.3.2",
|
|
"@types/node": "^22.0.0",
|
|
"@types/react": "^19.2.0",
|
|
"@types/react-dom": "^19.0.0",
|
|
"@vitejs/plugin-react": "^4.2.0",
|
|
"postcss": "^8.5.17",
|
|
"postcss-selector-parser": "^7.1.4",
|
|
"react": "^19.2.0",
|
|
"react-dom": "^19.0.0",
|
|
"shadcn": "^4.13.0",
|
|
"tailwindcss": "^4.3.2",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.3.3",
|
|
"vite": "^5.0.0",
|
|
"vitest": "^3.2.4"
|
|
}
|
|
}
|