diff --git a/packages/chrome-qwen-bridge/.extension-id b/packages/chrome-qwen-bridge/.extension-id
new file mode 100644
index 00000000..73039ed9
--- /dev/null
+++ b/packages/chrome-qwen-bridge/.extension-id
@@ -0,0 +1 @@
+cimaabkejokbhjkdnajgfniiolfjgbhd
diff --git a/packages/chrome-qwen-bridge/.gitignore b/packages/chrome-qwen-bridge/.gitignore
new file mode 100644
index 00000000..ed26baf9
--- /dev/null
+++ b/packages/chrome-qwen-bridge/.gitignore
@@ -0,0 +1,23 @@
+# Dependencies
+node_modules/
+
+# Build outputs
+dist/
+*.zip
+
+# Logs
+*.log
+
+# OS files
+.DS_Store
+Thumbs.db
+
+# IDE files
+.idea/
+.vscode/
+*.swp
+*.swo
+
+# Temporary files
+*.tmp
+.temp/
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/CONNECTION_STATUS.md b/packages/chrome-qwen-bridge/CONNECTION_STATUS.md
new file mode 100644
index 00000000..b6ab8331
--- /dev/null
+++ b/packages/chrome-qwen-bridge/CONNECTION_STATUS.md
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+echo "ð¯ Chrome Extension è¿æ¥ç¶ææ»ç»"
+echo "================================"
+echo ""
+
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m'
+
+echo -e "${GREEN}â
Native Host å·²æ£ç¡®é
眮${NC}"
+echo " - é
眮æä»¶äœçœ®æ£ç¡®"
+echo " - äœ¿çš shell å
è£
èæ¬ç¡®ä¿ Node.js ç¯å¢"
+echo " - æ©å± ID å·²é
眮: cimaabkejokbhjkdnajgfniiolfjgbhd"
+echo ""
+
+echo -e "${GREEN}â
Native Host æµè¯ååºæ£åžž${NC}"
+echo " - æ¡æåè®®å·¥äœæ£åžž"
+echo " - æ¶æ¯äŒ éæºå¶æ£ç¡®"
+echo ""
+
+echo -e "${GREEN}â
Service Worker å·²å¢åŒº${NC}"
+echo " - æ·»å äºè¯Šç»çé误æ¥å¿"
+echo " - å®ç°äºæ¡æè¶
æ¶æºå¶"
+echo " - æ¹è¿äºæåŒè¿æ¥å€ç"
+echo ""
+
+echo -e "${YELLOW}ð ç°åšè¯·è¿è¡ä»¥äžæäœïŒ${NC}"
+echo ""
+echo "1. éæ°å 蜜 Chrome æ©å±ïŒ"
+echo " open 'chrome://extensions/'"
+echo " æŸå° 'Qwen CLI Bridge' å¹¶ç¹å» ð"
+echo ""
+echo "2. ç¹å»æ©å±åŸæ æµè¯ïŒ"
+echo " - ç¹å» 'Connect to Qwen CLI'"
+echo " - è¿æ¥åºè¯¥äŒæå"
+echo ""
+echo "3. åŠæä»æé®é¢ïŒ"
+echo " a) æ¥ç Service Worker æ§å¶å°ïŒ"
+echo " open 'chrome://extensions/?id=cimaabkejokbhjkdnajgfniiolfjgbhd'"
+echo " ç¹å» 'Service Worker' æ¥çæ¥å¿"
+echo ""
+echo " b) æ¥ç Native Host æ¥å¿ïŒ"
+echo " tail -f /tmp/qwen-bridge-host.log"
+echo ""
+echo " c) è¿è¡è°è¯æ§å¶å°ïŒ"
+echo " open file://$PWD/debug-console.html"
+echo ""
+
+echo "================================"
+echo ""
+echo "ð åžžè§é®é¢ææ¥ïŒ"
+echo ""
+echo "åŠæçå° 'Native host has exited' é误ïŒ"
+echo "- ç¡®ä¿ Node.js å·²å®è£
: node --version"
+echo "- æ£æ¥è·¯åŸæ¯åŠæ£ç¡®: ls -la native-host/run.sh"
+echo ""
+echo "åŠæçå° 'Specified native messaging host not found'ïŒ"
+echo "- éæ°è¿è¡: ./set-extension-id.sh"
+echo "- 确讀æ©å± ID æ£ç¡®"
+echo ""
+echo "è¿æ¥ç°åšåºè¯¥èœæ£åžžå·¥äœäºïŒð"
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/INSTALL.md b/packages/chrome-qwen-bridge/INSTALL.md
new file mode 100644
index 00000000..0a817d1c
--- /dev/null
+++ b/packages/chrome-qwen-bridge/INSTALL.md
@@ -0,0 +1,121 @@
+# ðŠ Chrome Qwen Bridge - å®è£
æå
+
+## ð å¿«éå®è£
ïŒæšèïŒ
+
+### äžé®å®è£
ïŒéŠæ¬¡çšæ·ïŒ
+
+```bash
+# è¿å
¥é¡¹ç®ç®åœ
+cd packages/chrome-qwen-bridge
+
+# è¿è¡å®è£
å富
+npm run install:all
+```
+
+è¿äžªåœä»€äŒïŒ
+1. â
åŒå¯Œäœ å®è£
Chrome æ©å±
+2. â
èªåšé
眮 Native Host
+3. â
ä¿åæ©å± ID äŸåç»äœ¿çš
+4. â
å¯åšè°è¯ç¯å¢
+
+## ð å®è£
æ¹åŒè¯Žæ
+
+### åºæ¯ 1ïŒä» Chrome Web Store å®è£
ïŒæªæ¥ïŒ
+
+åœæ©å±ååžå° Chrome Web Store åïŒ
+1. ä»ååºå®è£
æ©å±
+2. è¿è¡ `npm run install:host`ïŒäŒèªå𿣿µå·²å®è£
çæ©å±ïŒ
+3. 宿ïŒ
+
+### åºæ¯ 2ïŒåŒåè
æš¡åŒå®è£
ïŒåœåïŒ
+
+```bash
+# æ¥éª€ 1ïŒå®è£
æ©å±å Native Host
+npm run install:all
+
+# æ¥éª€ 2ïŒå¯åšè°è¯
+npm run dev
+```
+
+### åºæ¯ 3ïŒåæ¥å®è£
+
+```bash
+# 1. ä»
å®è£
Chrome æ©å±
+npm run install:extension
+
+# 2. ä»
é
眮 Native Host
+npm run install:host
+
+# 3. å¯åšåŒåç¯å¢
+npm run dev
+```
+
+## ð§ Native Host 诎æ
+
+### ä»ä¹æ¯ Native HostïŒ
+
+Native Host æ¯äžäžªæ¬å°çšåºïŒå
讞 Chrome æ©å±äžæ¬å°åºçšïŒåŠ Qwen CLIïŒéä¿¡ãåºäºå®å
šèèïŒChrome èŠæ±å¿
é¡»æåšå®è£
ã
+
+### æºèœå®è£
åšç¹æ§
+
+æä»¬ç `smart-install.sh` èæ¬äŒïŒ
+
+1. **èªå𿣿µ** - å°è¯èªåšæŸå°å·²å®è£
çæ©å±
+2. **ä¿åé
眮** - è®°äœæ©å± IDïŒäžæ¬¡æ éèŸå
¥
+3. **éçšæš¡åŒ** - å³äœ¿æ²¡ææ©å± ID ä¹èœé
眮
+4. **è¿æ¥æµè¯** - å¯éçè¿æ¥éªè¯
+
+### å®è£
äœçœ®
+
+Native Host é
眮æä»¶äœçœ®ïŒ
+- **macOS**: `~/Library/Application Support/Google/Chrome/NativeMessagingHosts/`
+- **Linux**: `~/.config/google-chrome/NativeMessagingHosts/`
+
+## â åžžè§é®é¢
+
+### Q: å¿
é¡»æåšå®è£
Native Host åïŒ
+
+A: æ¯çïŒè¿æ¯ Chrome çå®å
šèŠæ±ãäœæä»¬çæºèœå®è£
åšè®©è¿äžªè¿çšéåžžç®åã
+
+### Q: åŠäœæŸå°æ©å± IDïŒ
+
+A:
+1. æåŒ `chrome://extensions/`
+2. æŸå° "Qwen CLI Bridge"
+3. ID æŸç€ºåšæ©å±å¡çäžïŒç±»äŒŒ `abcdefghijklmnop...`ïŒ
+
+### Q: éè£
æ©å±åéèŠéæ°é
眮åïŒ
+
+A: åŠææ©å± ID æ¹åäºïŒéèŠéæ°è¿è¡ `npm run install:host`ãèæ¬äŒèªå𿣿µæ°ç IDã
+
+### Q: åŠäœéªè¯å®è£
æåïŒ
+
+A: è¿è¡ `npm run dev`ïŒåŠæèœçå°æä»¶åŸæ å¹¶èœç¹å»è¿æ¥ïŒè¯Žæå®è£
æåã
+
+## ð åœä»€åè
+
+| åœä»€ | 诎æ |
+|------|------|
+| `npm run install:all` | 宿Žå®è£
å富 |
+| `npm run install:extension` | ä»
å®è£
æ©å± |
+| `npm run install:host` | ä»
é
眮 Native Host |
+| `npm run dev` | å¯åšè°è¯ç¯å¢ |
+| `npm run clean` | æž
çææé
çœ®åæ¥å¿ |
+
+## ð æŽæ°åéè£
+
+åŠæéèŠéæ°å®è£
ïŒ
+
+```bash
+# æž
çæ§é
眮
+npm run clean
+
+# éæ°å®è£
+npm run install:all
+```
+
+## ð æŽå€ä¿¡æ¯
+
+- [è°è¯æå](./docs/debugging.md)
+- [API ææ¡£](./docs/api-reference.md)
+- [æ¶æè®Ÿè®¡](./docs/architecture.md)
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/QUICK_START.md b/packages/chrome-qwen-bridge/QUICK_START.md
new file mode 100644
index 00000000..1b6e43b4
--- /dev/null
+++ b/packages/chrome-qwen-bridge/QUICK_START.md
@@ -0,0 +1,64 @@
+# ð å¿«éåŒå§
+
+## éŠæ¬¡äœ¿çš
+
+åŠææ¯ç¬¬äžæ¬¡äœ¿çšïŒè¯·è¿è¡ïŒ
+
+```bash
+npm run dev
+```
+
+ç³»ç»äŒèªå𿣿µå¹¶åŒå¯Œäœ 宿ïŒ
+1. ðŠ æåšå®è£
Chrome æä»¶
+2. ð§ é
眮 Native Host
+3. ð¯ å¯åšè°è¯ç¯å¢
+
+## å®è£
æ¥éª€è¯Žæ
+
+### ç¬¬äžæ¬¡è¿è¡æ¶éèŠïŒ
+
+1. **æåšå 蜜æä»¶å° Chrome**
+ - æåŒ `chrome://extensions/`
+ - åŒå¯ãåŒåè
æš¡åŒãïŒå³äžè§ïŒ
+ - ç¹å»ãå 蜜已解åçæ©å±çšåºã
+ - éæ© `extension` ç®åœ
+ - **è®°äžæ©å± ID**ïŒåŸéèŠïŒïŒ
+
+2. **èŸå
¥æ©å± ID**
+ - èæ¬äŒæç€ºäœ èŸå
¥
+ - è¿æ · Native Host æèœè¯å«æä»¶
+
+3. **宿å**
+ - 以åè¿è¡ `npm run dev` å°±äŒèªåšå 蜜ææå
容
+
+## åžžè§é®é¢
+
+### Q: 䞺ä»ä¹éèŠæåšå 蜜æä»¶ïŒ
+A: Chrome å®å
šæºå¶èŠæ±åŒåè
æš¡åŒçæä»¶å¿
é¡»æåšå èœœäžæ¬¡ã
+
+### Q: æä»¶åŸæ åšåªéïŒ
+A: ç¹å» Chrome å·¥å
·æ çæŒåŸåŸæ ïŒæŸå° "Qwen CLI Bridge" å¹¶ç¹å»åºå®ã
+
+### Q: åŠäœç¥éæä»¶æ¯åŠå 蜜æåïŒ
+A:
+- åš `chrome://extensions/` èœçå°æä»¶
+- å·¥å
·æ ææä»¶åŸæ
+- ç¹å»åŸæ èœçå°åŒ¹åºçªå£
+
+## è°è¯åœä»€
+
+```bash
+npm run dev # å¯åšè°è¯ç¯å¢ïŒéŠæ¬¡äŒåŒå¯Œå®è£
ïŒ
+npm run logs # æ¥ç Native Host æ¥å¿
+npm run logs:qwen # æ¥ç Qwen æå¡åšæ¥å¿
+npm run clean # æž
çææäžŽæ¶æä»¶
+```
+
+## æä»¶è¯Žæ
+
+```
+âââ first-install.sh # éŠæ¬¡å®è£
å富
+âââ debug.sh # è°è¯å¯åšèæ¬
+âââ .extension-id # ä¿åçæ©å± IDïŒèªåšçæïŒ
+âââ extension/ # Chrome æä»¶æºç
+```
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/README.md b/packages/chrome-qwen-bridge/README.md
new file mode 100644
index 00000000..1ccaf4ea
--- /dev/null
+++ b/packages/chrome-qwen-bridge/README.md
@@ -0,0 +1,204 @@
+# Qwen CLI Bridge - Chrome Extension
+
+A Chrome extension that bridges your browser with Qwen CLI, enabling AI-powered analysis and interaction with web content.
+
+> This package is part of the [Qwen Code](https://github.com/QwenLM/qwen-code) mono repository.
+
+## Features
+
+- **Page Data Extraction**: Extract structured data from any webpage including text, links, images, and metadata
+- **Screenshot Capture**: Capture and analyze screenshots with AI
+- **Console & Network Monitoring**: Monitor console logs and network requests
+- **Selected Text Processing**: Send selected text to Qwen CLI for processing
+- **AI Analysis**: Leverage Qwen's AI capabilities to analyze web content
+- **MCP Server Integration**: Support for multiple MCP (Model Context Protocol) servers
+
+## Architecture
+
+```
+âââââââââââââââââââââââ
+â Chrome Extension â
+â - Content Script â
+â - Background Workerâ
+â - Popup UI â
+ââââââââââââ¬âââââââââââ
+ â
+ Native Messaging
+ â
+ ââââââââŒâââââââââââ
+ â Native Host â
+ â (Node.js) â
+ ââââââââ¬âââââââââââ
+ â
+ ââââââââŒâââââââââââ
+ â Qwen CLI â
+ â + MCP Servers â
+ âââââââââââââââââââ
+```
+
+## Installation
+
+### Prerequisites
+
+1. **Node.js**: Install from [nodejs.org](https://nodejs.org/)
+2. **Qwen CLI**: Install the Qwen CLI tool (required for full functionality)
+3. **Chrome Browser**: Version 88 or higher
+
+### Step 1: Install the Chrome Extension
+
+1. Open Chrome and navigate to `chrome://extensions/`
+2. Enable "Developer mode" (toggle in top right)
+3. Click "Load unpacked"
+4. Select the `chrome-qwen-bridge/extension` folder
+5. Note the Extension ID that appears (you'll need this for the next step)
+
+### Step 2: Install the Native Messaging Host
+
+The Native Messaging Host allows the Chrome extension to communicate with Qwen CLI.
+
+#### macOS/Linux
+
+```bash
+cd chrome-qwen-bridge/native-host
+./install.sh
+```
+
+When prompted, enter your Chrome Extension ID.
+
+#### Windows
+
+1. Run Command Prompt as Administrator
+2. Navigate to the `native-host` directory:
+ ```cmd
+ cd chrome-qwen-bridge\native-host
+ ```
+3. Run the installation script:
+ ```cmd
+ install.bat
+ ```
+4. Enter your Chrome Extension ID when prompted
+
+### Step 3: Configure Qwen CLI (Optional)
+
+If you want to use MCP servers with the extension:
+
+```bash
+# Add chrome-devtools MCP server
+qwen mcp add chrome-devtools
+
+# Add other MCP servers as needed
+qwen mcp add playwright-mcp
+```
+
+## Usage
+
+### Basic Usage
+
+1. Click the Qwen CLI Bridge extension icon in Chrome
+2. Click "Connect to Qwen CLI" to establish connection
+3. Click "Start Qwen CLI" to launch the CLI process
+4. Use the action buttons to:
+ - Extract and analyze page data
+ - Capture screenshots
+ - Send selected text to Qwen
+ - Monitor console and network logs
+
+### Advanced Settings
+
+In the popup's "Advanced Settings" section, you can configure:
+
+- **MCP Servers**: Comma-separated list of MCP servers to load
+- **HTTP Port**: Port for Qwen CLI HTTP server (default: 8080)
+- **Auto-connect**: Automatically connect when opening the popup
+
+### API Actions
+
+The extension supports the following actions that can be sent to Qwen CLI:
+
+- `analyze_page`: Analyze extracted page data
+- `analyze_screenshot`: Analyze captured screenshot
+- `ai_analyze`: Perform AI analysis on content
+- `process_text`: Process selected text
+- Custom actions based on your MCP server configurations
+
+## Development
+
+### Project Structure
+
+```
+chrome-qwen-bridge/
+âââ extension/ # Chrome extension source
+â âââ manifest.json # Extension manifest
+â âââ background/ # Service worker
+â âââ content/ # Content scripts
+â âââ popup/ # Popup UI
+â âââ icons/ # Extension icons
+âââ native-host/ # Native messaging host
+â âââ host.js # Node.js host script
+â âââ manifest.json # Native host manifest
+â âââ install scripts # Platform-specific installers
+âââ docs/ # Documentation
+```
+
+### Building from Source
+
+1. Clone the repository
+2. No build step required - the extension uses vanilla JavaScript
+3. Load the extension as unpacked in Chrome for development
+
+### Testing
+
+1. Enable Chrome Developer Tools
+2. Check the extension's background page console for logs
+3. Native host logs are written to:
+ - macOS/Linux: `/tmp/qwen-bridge-host.log`
+ - Windows: `%TEMP%\qwen-bridge-host.log`
+
+## Troubleshooting
+
+### Extension not connecting to Native Host
+
+1. Verify Node.js is installed: `node --version`
+2. Check that the Native Host is properly installed
+3. Ensure the Extension ID in the manifest matches your actual extension
+4. Check logs for errors
+
+### Qwen CLI not starting
+
+1. Verify Qwen CLI is installed: `qwen --version`
+2. Check that Qwen CLI can run normally from terminal
+3. Review Native Host logs for error messages
+
+### No response from Qwen CLI
+
+1. Ensure Qwen CLI server is running
+2. Check the configured HTTP port is not in use
+3. Verify MCP servers are properly configured
+
+## Security Considerations
+
+- The extension requires broad permissions to function properly
+- Native Messaging Host runs with user privileges
+- All communication between components uses structured JSON messages
+- No sensitive data is stored; all processing is ephemeral
+
+## Contributing
+
+Contributions are welcome! Please:
+
+1. Fork the repository
+2. Create a feature branch
+3. Make your changes
+4. Test thoroughly
+5. Submit a pull request
+
+## License
+
+MIT License - See LICENSE file for details
+
+## Support
+
+For issues, questions, or feature requests:
+- Open an issue on GitHub
+- Check the logs for debugging information
+- Ensure all prerequisites are properly installed
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/build.sh b/packages/chrome-qwen-bridge/build.sh
new file mode 100755
index 00000000..8e2633a0
--- /dev/null
+++ b/packages/chrome-qwen-bridge/build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Build script for Chrome extension package
+
+echo "Building Chrome Qwen Bridge..."
+
+# Ensure we're in the right directory
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+cd "$SCRIPT_DIR"
+
+# Create dist directory
+mkdir -p dist
+
+# Copy extension files to dist
+echo "Copying extension files..."
+cp -r extension dist/
+
+# Create a zip file for Chrome Web Store
+echo "Creating extension package..."
+cd dist
+zip -r ../chrome-qwen-bridge.zip extension/
+cd ..
+
+echo "â
Build complete!"
+echo " Extension package: chrome-qwen-bridge.zip"
+echo " Extension files: dist/extension/"
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/debug-chrome.sh b/packages/chrome-qwen-bridge/debug-chrome.sh
new file mode 100755
index 00000000..58d0246b
--- /dev/null
+++ b/packages/chrome-qwen-bridge/debug-chrome.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+echo "ð Chrome Extension è°è¯å¯åšåš"
+echo "================================"
+echo ""
+
+# æ£æ¥ Chrome æ¯åŠå·²ç»è¿è¡
+if pgrep -x "Google Chrome" > /dev/null; then
+ echo "â ïž Chrome å·²åšè¿è¡ïŒè¯·å
å
³é Chrome åè¿è¡æ€èæ¬"
+ echo " æè
åšæ°ç Chrome çªå£äžæåšæäœ"
+ echo ""
+fi
+
+# è·åæ©å±è·¯åŸ
+EXTENSION_PATH="$PWD/extension"
+echo "ð æ©å±è·¯åŸ: $EXTENSION_PATH"
+
+# 读åä¿åçæ©å± ID
+if [ -f ".extension-id" ]; then
+ EXTENSION_ID=$(cat .extension-id)
+ echo "ð æ©å± ID: $EXTENSION_ID"
+else
+ echo "â ïž æªæŸå°æ©å± IDïŒéŠæ¬¡å 蜜åäŒèªåšä¿å"
+fi
+
+echo ""
+echo "æ£åšå¯åš Chrome è°è¯æš¡åŒ..."
+echo ""
+
+# å¯åš Chrome with debugging
+open -na "Google Chrome" --args \
+ --load-extension="$EXTENSION_PATH" \
+ --auto-open-devtools-for-tabs \
+ --enable-logging \
+ --v=1 \
+ "file://$PWD/debug-console.html"
+
+echo "â
Chrome å·²å¯åš"
+echo ""
+echo "ð è°è¯æ¥éª€ïŒ"
+echo "1. Chrome äŒèªåšå 蜜æ©å±å¹¶æåŒè°è¯æ§å¶å°"
+echo "2. ç¹å» 'Test Connection' æµè¯è¿æ¥"
+echo "3. åŠæè¿æ¥å€±èŽ¥ïŒç¹å» 'View Background Logs' æ¥çè¯Šç»æ¥å¿"
+echo ""
+echo "ð¡ æç€ºïŒ"
+echo "- æ F12 æåŒåŒåè
å·¥å
·æ¥çæ§å¶å°èŸåº"
+echo "- åš chrome://extensions/ 页é¢ç¹å» 'Service Worker' æ¥çåå°æ¥å¿"
+echo "- æ¥å¿æä»¶: /tmp/qwen-bridge-host.log"
+echo ""
+echo "ð çæ§æ¥å¿ (Ctrl+C éåº):"
+echo "----------------------------"
+tail -f /tmp/qwen-bridge-host.log 2>/dev/null || echo "çåŸ
æ¥å¿çæ..."
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/debug-console.html b/packages/chrome-qwen-bridge/debug-console.html
new file mode 100644
index 00000000..ba02fb17
--- /dev/null
+++ b/packages/chrome-qwen-bridge/debug-console.html
@@ -0,0 +1,178 @@
+
+
+
+ Chrome Extension Debug Console
+
+
+
+ ð§ Chrome Extension Debug Console
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/debug.sh b/packages/chrome-qwen-bridge/debug.sh
new file mode 100755
index 00000000..bf890107
--- /dev/null
+++ b/packages/chrome-qwen-bridge/debug.sh
@@ -0,0 +1,376 @@
+#!/bin/bash
+
+# Qwen CLI Bridge - macOS äžé®è°è¯èæ¬
+
+# é¢è²å®ä¹
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+CYAN='\033[0;36m'
+NC='\033[0m' # No Color
+
+# è·åèæ¬ç®åœ
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+# æ£æ¥æ¯åŠéŠæ¬¡å®è£
+if [[ ! -f "$SCRIPT_DIR/.extension-id" ]]; then
+ echo -e "${YELLOW}ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ${NC}"
+ echo -e "${YELLOW}â â${NC}"
+ echo -e "${YELLOW}â â ïž æ£æµå°éŠæ¬¡è¿è¡ïŒéèŠå
å®è£
æä»¶ â${NC}"
+ echo -e "${YELLOW}â â${NC}"
+ echo -e "${YELLOW}ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ${NC}"
+ echo ""
+ echo -e "${CYAN}å³å°å¯åšéŠæ¬¡å®è£
å富...${NC}"
+ sleep 2
+ exec "$SCRIPT_DIR/first-install.sh"
+ exit 0
+fi
+
+# æž
屿Ÿç€ºæ é¢
+clear
+echo -e "${CYAN}ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ${NC}"
+echo -e "${CYAN}â â${NC}"
+echo -e "${CYAN}â ð Qwen CLI Bridge - macOS è°è¯ç¯å¢ â${NC}"
+echo -e "${CYAN}â â${NC}"
+echo -e "${CYAN}ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ${NC}"
+echo ""
+
+# ç¬¬äžæ¥ïŒæ£æ¥ç¯å¢
+echo -e "${BLUE}[1/5]${NC} æ£æ¥åŒåç¯å¢..."
+
+# æ£æ¥ Node.js
+if ! command -v node &> /dev/null; then
+ echo -e "${RED}â${NC} Node.js æªå®è£
ïŒè¯·å
å®è£
Node.js"
+ echo " è®¿é® https://nodejs.org äžèœœå®è£
"
+ exit 1
+fi
+echo -e "${GREEN}â${NC} Node.js $(node --version)"
+
+# æ£æ¥ Chrome
+CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
+if [[ ! -f "$CHROME_PATH" ]]; then
+ echo -e "${RED}â${NC} Chrome æªæŸå°"
+ exit 1
+fi
+echo -e "${GREEN}â${NC} Chrome å·²å®è£
"
+
+# ç¬¬äºæ¥ïŒé
眮 Native Host
+echo -e "\n${BLUE}[2/5]${NC} é
眮 Native Host..."
+
+MANIFEST_DIR="$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts"
+mkdir -p "$MANIFEST_DIR"
+
+cat > "$MANIFEST_DIR/com.qwen.cli.bridge.json" << EOF
+{
+ "name": "com.qwen.cli.bridge",
+ "description": "Native messaging host for Qwen CLI Bridge",
+ "path": "$SCRIPT_DIR/native-host/host.js",
+ "type": "stdio",
+ "allowed_origins": ["chrome-extension://*/"]
+}
+EOF
+
+echo -e "${GREEN}â${NC} Native Host å·²é
眮"
+
+# ç¬¬äžæ¥ïŒæ£æ¥ Qwen CLIïŒå¯éïŒ
+echo -e "\n${BLUE}[3/5]${NC} æ£æ¥ Qwen CLI..."
+
+QWEN_AVAILABLE=false
+if command -v qwen &> /dev/null; then
+ QWEN_AVAILABLE=true
+ echo -e "${GREEN}â${NC} Qwen CLI $(qwen --version 2>/dev/null || echo "å·²å®è£
")"
+
+ # å°è¯å¯åš Qwen server
+ if ! lsof -i:8080 &> /dev/null; then
+ echo -e "${CYAN}â${NC} å¯åš Qwen server (ç«¯å£ 8080)..."
+ qwen server --port 8080 > /tmp/qwen-server.log 2>&1 &
+ QWEN_PID=$!
+ sleep 2
+
+ if kill -0 $QWEN_PID 2>/dev/null; then
+ echo -e "${GREEN}â${NC} Qwen server å·²å¯åš (PID: $QWEN_PID)"
+ else
+ echo -e "${YELLOW}!${NC} Qwen server å¯åšå€±èŽ¥ïŒç»§ç»è¿è¡..."
+ QWEN_AVAILABLE=false
+ fi
+ else
+ echo -e "${YELLOW}!${NC} ç«¯å£ 8080 已被å çš"
+ fi
+else
+ echo -e "${YELLOW}!${NC} Qwen CLI æªå®è£
ïŒæä»¶åºç¡åèœä»å¯äœ¿çšïŒ"
+fi
+
+# ç¬¬åæ¥ïŒå¯åšæµè¯é¡µé¢
+echo -e "\n${BLUE}[4/5]${NC} å¯åšæµè¯æå¡åš..."
+
+# å建æµè¯é¡µé¢
+cat > /tmp/qwen-test.html << 'HTML'
+
+
+
+
+ Qwen CLI Bridge æµè¯é¡µé¢
+
+
+
+
+
+
+
+
+
ð æµè¯åèœ
+
+
+
+
+
+
+
+
+
ð 瀺äŸå
容
+
è¿æ¯äžæ®µå¯ä»¥è¢«æä»¶æåçç€ºäŸææ¬ãäœ å¯ä»¥éæ©è¿æ®µæåïŒç¶åäœ¿çšæä»¶ç"Send Selected Text"åèœã
+
+ - å衚项 1ïŒLorem ipsum dolor sit amet
+ - å衚项 2ïŒConsectetur adipiscing elit
+ - å衚项 3ïŒSed do eiusmod tempor incididunt
+
+
+ "è¿æ¯äžäžªåŒçšåïŒå¯ä»¥æµè¯ Markdown 蜬æ¢åèœã"
+
+
+
+
+
ð¯ 䜿çšè¯Žæ
+
+ - ç¹å» Chrome å·¥å
·æ äžçæä»¶åŸæ
+ - ç¹å» "Connect to Qwen CLI" 建ç«è¿æ¥
+ - åŠæå®è£
äº Qwen CLIïŒç¹å» "Start Qwen CLI"
+ - 䜿çšåç§åèœæé®æµè¯æä»¶åèœ
+ - æ F12 æåŒ DevTools æ¥çè¯Šç»æ¥å¿
+
+
+
+
+
+
+
+
+HTML
+
+# å¯åš Python HTTP æå¡åš
+cd /tmp
+python3 -m http.server 3000 > /tmp/test-server.log 2>&1 &
+TEST_PID=$!
+sleep 1
+
+echo -e "${GREEN}â${NC} æµè¯æå¡åšå·²å¯åš (http://localhost:3000)"
+
+# ç¬¬äºæ¥ïŒå¯åš Chrome
+echo -e "\n${BLUE}[5/5]${NC} å¯åš Chrome å¹¶å 蜜æä»¶..."
+
+"$CHROME_PATH" \
+ --load-extension="$SCRIPT_DIR/extension" \
+ --auto-open-devtools-for-tabs \
+ --no-first-run \
+ --no-default-browser-check \
+ "http://localhost:3000/qwen-test.html" &
+
+CHROME_PID=$!
+
+echo -e "${GREEN}â${NC} Chrome å·²å¯åš"
+
+# æŸç€ºæç»ç¶æ
+echo ""
+echo -e "${GREEN}ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ${NC}"
+echo -e "${GREEN}â â${NC}"
+echo -e "${GREEN}â â
è°è¯ç¯å¢å¯åšæåïŒ â${NC}"
+echo -e "${GREEN}â â${NC}"
+echo -e "${GREEN}ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ${NC}"
+echo ""
+echo -e "${CYAN}ð æå¡ç¶æïŒ${NC}"
+echo -e " ⢠Chrome: è¿è¡äž"
+echo -e " ⢠æµè¯é¡µé¢: ${BLUE}http://localhost:3000/qwen-test.html${NC}"
+echo -e " ⢠æä»¶: å·²å 蜜å°å·¥å
·æ "
+
+if [ "$QWEN_AVAILABLE" = true ]; then
+ echo -e " ⢠Qwen Server: ${BLUE}http://localhost:8080${NC}"
+fi
+
+echo ""
+echo -e "${CYAN}ð è°è¯äœçœ®ïŒ${NC}"
+echo -e " ⢠æä»¶æ¥å¿: Chrome DevTools Console"
+echo -e " ⢠åå°èæ¬: chrome://extensions â Service Worker"
+echo -e " ⢠Native Host: /tmp/qwen-bridge-host.log"
+
+if [ "$QWEN_AVAILABLE" = true ]; then
+ echo -e " ⢠Qwen æ¥å¿: /tmp/qwen-server.log"
+fi
+
+echo ""
+echo -e "${YELLOW}æ Ctrl+C åæ¢æææå¡${NC}"
+echo ""
+
+# æž
çåœæ°
+cleanup() {
+ echo -e "\n${YELLOW}æ£åšåæ¢æå¡...${NC}"
+
+ # 忢è¿çš
+ [ ! -z "$TEST_PID" ] && kill $TEST_PID 2>/dev/null
+ [ ! -z "$QWEN_PID" ] && kill $QWEN_PID 2>/dev/null
+
+ echo -e "${GREEN}â${NC} å·²åæ¢æææå¡"
+ exit 0
+}
+
+# æè·äžæä¿¡å·
+trap cleanup INT TERM
+
+# ä¿æè¿è¡
+while true; do
+ sleep 1
+done
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/dev.js b/packages/chrome-qwen-bridge/dev.js
new file mode 100644
index 00000000..fdfcc9d9
--- /dev/null
+++ b/packages/chrome-qwen-bridge/dev.js
@@ -0,0 +1,511 @@
+#!/usr/bin/env node
+
+/**
+ * åŒåç¯å¢äžé®å¯åšèæ¬
+ * èªåšå®æææé
眮åå¯åšæ¥éª€
+ */
+
+const { spawn, exec } = require('child_process');
+const fs = require('fs');
+const path = require('path');
+const os = require('os');
+const readline = require('readline');
+
+// é¢è²èŸåº
+const colors = {
+ reset: '\x1b[0m',
+ bright: '\x1b[1m',
+ green: '\x1b[32m',
+ yellow: '\x1b[33m',
+ blue: '\x1b[34m',
+ red: '\x1b[31m',
+ cyan: '\x1b[36m'
+};
+
+function log(message, color = '') {
+ console.log(`${color}${message}${colors.reset}`);
+}
+
+function logStep(step, message) {
+ log(`\n[${step}] ${message}`, colors.bright + colors.blue);
+}
+
+function logSuccess(message) {
+ log(`â
${message}`, colors.green);
+}
+
+function logWarning(message) {
+ log(`â ïž ${message}`, colors.yellow);
+}
+
+function logError(message) {
+ log(`â ${message}`, colors.red);
+}
+
+function logInfo(message) {
+ log(`â¹ïž ${message}`, colors.cyan);
+}
+
+// æ£æ¥åœä»€æ¯åŠååš
+function commandExists(command) {
+ return new Promise((resolve) => {
+ exec(`command -v ${command}`, (error) => {
+ resolve(!error);
+ });
+ });
+}
+
+// è·å Chrome è·¯åŸ
+function getChromePath() {
+ const platform = process.platform;
+
+ const chromePaths = {
+ darwin: [
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
+ '/Applications/Chromium.app/Contents/MacOS/Chromium'
+ ],
+ win32: [
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
+ process.env.LOCALAPPDATA + '\\Google\\Chrome\\Application\\chrome.exe'
+ ],
+ linux: [
+ '/usr/bin/google-chrome',
+ '/usr/bin/chromium-browser',
+ '/usr/bin/chromium'
+ ]
+ };
+
+ const paths = chromePaths[platform] || [];
+
+ for (const chromePath of paths) {
+ if (fs.existsSync(chromePath)) {
+ return chromePath;
+ }
+ }
+
+ return null;
+}
+
+// è·åæ©å± ID
+function getExtensionId(extensionPath) {
+ // è¿æ¯äžäžªç®åçæ¹æ³ïŒå®é
ç Extension ID æ¯éè¿ Chrome çæç
+ // åŒåæ¶å¯ä»¥åºå®äœ¿çšäžäžª ID
+ return 'development-extension-id';
+}
+
+// å®è£
Native Host
+async function installNativeHost(extensionPath) {
+ logStep(2, 'Installing Native Host...');
+
+ const hostPath = path.join(extensionPath, 'native-host');
+ const scriptPath = path.join(hostPath, 'host.js');
+
+ if (!fs.existsSync(scriptPath)) {
+ logError('Native host script not found!');
+ return false;
+ }
+
+ const platform = process.platform;
+ const hostName = 'com.qwen.cli.bridge';
+
+ let manifestDir;
+ if (platform === 'darwin') {
+ manifestDir = path.join(os.homedir(), 'Library/Application Support/Google/Chrome/NativeMessagingHosts');
+ } else if (platform === 'linux') {
+ manifestDir = path.join(os.homedir(), '.config/google-chrome/NativeMessagingHosts');
+ } else if (platform === 'win32') {
+ // Windows éèŠå泚å衚
+ logWarning('Windows requires registry modification. Please run install.bat manually.');
+ return true;
+ } else {
+ logError('Unsupported platform');
+ return false;
+ }
+
+ // å建ç®åœ
+ if (!fs.existsSync(manifestDir)) {
+ fs.mkdirSync(manifestDir, { recursive: true });
+ }
+
+ // å建 manifest æä»¶
+ const manifest = {
+ name: hostName,
+ description: 'Native messaging host for Qwen CLI Bridge',
+ path: scriptPath,
+ type: 'stdio',
+ allowed_origins: [
+ 'chrome-extension://jniepomhbdkeifkadbfolbcihcmfpfjo/', // åŒåçš ID
+ 'chrome-extension://*/' // å
è®žä»»äœæ©å±ïŒä»
åŒåç¯å¢ïŒ
+ ]
+ };
+
+ const manifestPath = path.join(manifestDir, `${hostName}.json`);
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
+
+ logSuccess(`Native Host installed at: ${manifestPath}`);
+ return true;
+}
+
+// æ£æ¥ Qwen CLI
+async function checkQwenCli() {
+ logStep(3, 'Checking Qwen CLI...');
+
+ const qwenExists = await commandExists('qwen');
+
+ if (qwenExists) {
+ logSuccess('Qwen CLI is installed');
+
+ // è·åçæ¬
+ return new Promise((resolve) => {
+ exec('qwen --version', (error, stdout) => {
+ if (!error && stdout) {
+ logInfo(`Version: ${stdout.trim()}`);
+ }
+ resolve(true);
+ });
+ });
+ } else {
+ logWarning('Qwen CLI is not installed');
+ logInfo('You can still use the extension, but some features will be limited');
+ return false;
+ }
+}
+
+// å¯åš Qwen CLI æå¡åš
+function startQwenServer(port = 8080) {
+ logStep(4, 'Starting Qwen CLI Server...');
+
+ return new Promise((resolve) => {
+ // æ£æ¥ç«¯å£æ¯åŠè¢«å çš
+ exec(`lsof -i:${port} || netstat -an | grep ${port}`, (error, stdout) => {
+ if (stdout && stdout.length > 0) {
+ logWarning(`Port ${port} is already in use`);
+ logInfo('Qwen server might already be running');
+ resolve(null);
+ return;
+ }
+
+ // å¯åšæå¡åš
+ const qwenProcess = spawn('qwen', ['server', '--port', String(port)], {
+ detached: false,
+ stdio: ['ignore', 'pipe', 'pipe']
+ });
+
+ qwenProcess.stdout.on('data', (data) => {
+ const output = data.toString();
+ if (output.includes('Server started') || output.includes('listening')) {
+ logSuccess(`Qwen server started on port ${port}`);
+ resolve(qwenProcess);
+ }
+ });
+
+ qwenProcess.stderr.on('data', (data) => {
+ logError(`Qwen server error: ${data}`);
+ });
+
+ qwenProcess.on('error', (error) => {
+ logError(`Failed to start Qwen server: ${error.message}`);
+ resolve(null);
+ });
+
+ // è¶
æ¶å€ç
+ setTimeout(() => {
+ logWarning('Qwen server start timeout, continuing anyway...');
+ resolve(qwenProcess);
+ }, 5000);
+ });
+ });
+}
+
+// å¯åš Chrome åŒåæš¡åŒ
+function startChrome(extensionPath, chromePath) {
+ logStep(5, 'Starting Chrome with extension...');
+
+ const args = [
+ `--load-extension=${extensionPath}`,
+ '--auto-open-devtools-for-tabs', // èªåšæåŒ DevTools
+ '--disable-extensions-except=' + extensionPath,
+ '--no-first-run',
+ '--no-default-browser-check',
+ '--disable-default-apps',
+ '--disable-popup-blocking',
+ '--disable-translate',
+ '--disable-sync',
+ '--no-pings',
+ '--disable-background-timer-throttling',
+ '--disable-renderer-backgrounding',
+ '--disable-device-discovery-notifications'
+ ];
+
+ // åŒåæš¡åŒç¹å®åæ°
+ if (process.env.DEBUG === 'true') {
+ args.push('--enable-logging=stderr');
+ args.push('--v=1');
+ }
+
+ // æ·»å æµè¯é¡µé¢
+ args.push('http://localhost:3000'); // æå
¶ä»æµè¯é¡µé¢
+
+ const chromeProcess = spawn(chromePath, args, {
+ detached: false,
+ stdio: 'inherit'
+ });
+
+ chromeProcess.on('error', (error) => {
+ logError(`Failed to start Chrome: ${error.message}`);
+ });
+
+ logSuccess('Chrome started with extension loaded');
+ logInfo('Extension should be visible in the toolbar');
+
+ return chromeProcess;
+}
+
+// å建æµè¯æå¡åš
+function createTestServer(port = 3000) {
+ logStep(6, 'Starting test server...');
+
+ const http = require('http');
+ const testHtml = `
+
+
+
+ Qwen CLI Bridge Test Page
+
+
+
+
+
ð Qwen CLI Bridge Test Page
+
+
+
Test Content
+
This is a test page for the Qwen CLI Bridge Chrome Extension.
+
Click the extension icon in your toolbar to start testing!
+
+
Sample Data
+
+ - Item 1: Lorem ipsum dolor sit amet
+ - Item 2: Consectetur adipiscing elit
+ - Item 3: Sed do eiusmod tempor incididunt
+
+
+
Test Actions
+
+
+
+
+
Console Output
+
+
+
+
+
Test Form
+
+
+
+
+
Images
+

+
+
+
+
+
+
+ `;
+
+ const server = http.createServer((req, res) => {
+ res.writeHead(200, { 'Content-Type': 'text/html' });
+ res.end(testHtml);
+ });
+
+ server.listen(port, () => {
+ logSuccess(`Test server running at http://localhost:${port}`);
+ });
+
+ return server;
+}
+
+// äž»åœæ°
+async function main() {
+ console.clear();
+ log(`
+ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â â
+â ð Qwen CLI Bridge - Development Environment Setup â
+â â
+ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+`, colors.bright + colors.cyan);
+
+ const extensionPath = path.join(__dirname, 'extension');
+
+ // Step 1: æ£æ¥ Chrome
+ logStep(1, 'Checking Chrome installation...');
+ const chromePath = getChromePath();
+
+ if (!chromePath) {
+ logError('Chrome not found! Please install Google Chrome.');
+ process.exit(1);
+ }
+
+ logSuccess(`Chrome found at: ${chromePath}`);
+
+ // Step 2: å®è£
Native Host
+ const nativeHostInstalled = await installNativeHost(__dirname);
+ if (!nativeHostInstalled && process.platform === 'win32') {
+ logWarning('Please run install.bat as Administrator to complete Native Host setup');
+ }
+
+ // Step 3: æ£æ¥ Qwen CLI
+ const qwenInstalled = await checkQwenCli();
+
+ // Step 4: å¯åš Qwen æå¡åšïŒåŠæå·²å®è£
ïŒ
+ let qwenProcess = null;
+ if (qwenInstalled) {
+ qwenProcess = await startQwenServer(8080);
+ }
+
+ // Step 5: å¯åšæµè¯æå¡åš
+ const testServer = createTestServer(3000);
+
+ // Step 6: å¯åš Chrome
+ await new Promise(resolve => setTimeout(resolve, 1000)); // çåŸ
æå¡åšå¯åš
+ const chromeProcess = startChrome(extensionPath, chromePath);
+
+ // 讟眮æž
çå€ç
+ const cleanup = () => {
+ log('\n\nShutting down...', colors.yellow);
+
+ if (qwenProcess) {
+ qwenProcess.kill();
+ logInfo('Qwen server stopped');
+ }
+
+ if (testServer) {
+ testServer.close();
+ logInfo('Test server stopped');
+ }
+
+ if (chromeProcess) {
+ chromeProcess.kill();
+ logInfo('Chrome stopped');
+ }
+
+ process.exit(0);
+ };
+
+ process.on('SIGINT', cleanup);
+ process.on('SIGTERM', cleanup);
+
+ // æŸç€ºäœ¿çšè¯Žæ
+ log(`
+ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â â
Setup Complete! â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
+â â
+â ð Chrome is running with the extension loaded â
+â ð Test page: http://localhost:3000 â
+â ${qwenInstalled ? 'ð Qwen server: http://localhost:8080 ' : 'ð Qwen CLI not installed (limited functionality) '}â
+â â
+â ð How to debug: â
+â 1. Click the extension icon in Chrome toolbar â
+â 2. Open Chrome DevTools (F12) to see console logs â
+â 3. Check background page: chrome://extensions â Details â
+â 4. Native Host logs: /tmp/qwen-bridge-host.log â
+â â
+â ð Press Ctrl+C to stop all services â
+â â
+ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+`, colors.bright + colors.green);
+
+ // ä¿æè¿çšè¿è¡
+ await new Promise(() => {});
+}
+
+// è¿è¡
+main().catch((error) => {
+ logError(`Fatal error: ${error.message}`);
+ process.exit(1);
+});
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/diagnose.sh b/packages/chrome-qwen-bridge/diagnose.sh
new file mode 100755
index 00000000..852fff8d
--- /dev/null
+++ b/packages/chrome-qwen-bridge/diagnose.sh
@@ -0,0 +1,139 @@
+#!/bin/bash
+
+echo "ð Chrome Qwen Bridge è¿æ¥è¯æ"
+echo "==============================="
+echo ""
+
+# é¢è²å®ä¹
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m'
+
+# 1. æ£æ¥ Native Host é
眮
+echo -e "${BLUE}1. æ£æ¥ Native Host é
眮${NC}"
+NATIVE_HOST_CONFIG="$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.qwen.cli.bridge.json"
+
+if [ -f "$NATIVE_HOST_CONFIG" ]; then
+ echo -e "${GREEN}â${NC} Native Host é
眮ååš"
+ echo " å
容:"
+ cat "$NATIVE_HOST_CONFIG" | sed 's/^/ /'
+
+ # æ£æ¥è·¯åŸæ¯åŠæ£ç¡®
+ HOST_PATH=$(cat "$NATIVE_HOST_CONFIG" | grep '"path"' | sed 's/.*"path".*:.*"\(.*\)".*/\1/')
+ if [ -f "$HOST_PATH" ]; then
+ echo -e "${GREEN}â${NC} Host æä»¶ååš: $HOST_PATH"
+ # æ£æ¥æ¯åŠå¯æ§è¡
+ if [ -x "$HOST_PATH" ]; then
+ echo -e "${GREEN}â${NC} Host æä»¶å¯æ§è¡"
+ else
+ echo -e "${RED}â${NC} Host æä»¶äžå¯æ§è¡"
+ echo " ä¿®å€: chmod +x '$HOST_PATH'"
+ fi
+ else
+ echo -e "${RED}â${NC} Host æä»¶äžååš: $HOST_PATH"
+ fi
+else
+ echo -e "${RED}â${NC} Native Host é
眮äžååš"
+ echo " 请è¿è¡: npm run install:host"
+fi
+echo ""
+
+# 2. æ£æ¥æ©å± ID
+echo -e "${BLUE}2. æ£æ¥æ©å± ID${NC}"
+if [ -f ".extension-id" ]; then
+ SAVED_ID=$(cat .extension-id)
+ echo -e "${GREEN}â${NC} ä¿åçæ©å± ID: $SAVED_ID"
+
+ # æ£æ¥é
眮äžç ID
+ if grep -q "$SAVED_ID" "$NATIVE_HOST_CONFIG" 2>/dev/null; then
+ echo -e "${GREEN}â${NC} Native Host é
眮å
嫿€ ID"
+ else
+ if grep -q 'chrome-extension://\*/' "$NATIVE_HOST_CONFIG" 2>/dev/null; then
+ echo -e "${YELLOW}â ${NC} Native Host 䜿çšéé
笊 (æ¥åæææ©å±)"
+ else
+ echo -e "${RED}â${NC} Native Host é
眮äžå
嫿€ ID"
+ fi
+ fi
+else
+ echo -e "${YELLOW}â ${NC} æªä¿åæ©å± ID"
+fi
+echo ""
+
+# 3. æµè¯ Native Host
+echo -e "${BLUE}3. æµè¯ Native Host çŽæ¥è¿æ¥${NC}"
+if [ -f "$HOST_PATH" ]; then
+ # åéæµè¯æ¶æ¯
+ TEST_RESPONSE=$(echo '{"type":"handshake","version":"1.0.0"}' | \
+ python3 -c "
+import sys, json, struct
+msg = sys.stdin.read().strip()
+encoded = msg.encode('utf-8')
+sys.stdout.buffer.write(struct.pack('/dev/null | \
+ python3 -c "
+import sys, struct, json
+try:
+ length_bytes = sys.stdin.buffer.read(4)
+ if length_bytes:
+ length = struct.unpack('/dev/null)
+
+ if [ -n "$TEST_RESPONSE" ]; then
+ echo -e "${GREEN}â${NC} Native Host ååº: $TEST_RESPONSE"
+ else
+ echo -e "${RED}â${NC} Native Host æ ååº"
+ fi
+else
+ echo -e "${YELLOW}â ${NC} è·³è¿æµè¯ (Host æä»¶äžååš)"
+fi
+echo ""
+
+# 4. æ£æ¥æ¥å¿
+echo -e "${BLUE}4. æ£æ¥æè¿çé误æ¥å¿${NC}"
+LOG_FILE="/tmp/qwen-bridge-host.log"
+if [ -f "$LOG_FILE" ]; then
+ RECENT_ERRORS=$(tail -20 "$LOG_FILE" | grep -i error | tail -3)
+ if [ -n "$RECENT_ERRORS" ]; then
+ echo -e "${YELLOW}â ${NC} æè¿çé误:"
+ echo "$RECENT_ERRORS" | sed 's/^/ /'
+ else
+ echo -e "${GREEN}â${NC} æ¥å¿äžæ æè¿é误"
+ fi
+else
+ echo " æ¥å¿æä»¶äžååš"
+fi
+echo ""
+
+# 5. 建议
+echo -e "${BLUE}5. äžäžæ¥æäœå»ºè®®${NC}"
+echo ""
+echo "请æä»¥äžæ¥éª€æäœïŒ"
+echo ""
+echo "1. éæ°å 蜜æ©å±:"
+echo " - æåŒ chrome://extensions/"
+echo " - æŸå° 'Qwen CLI Bridge' æ©å±"
+echo " - ç¹å»éæ°å 蜜æé® (ð)"
+echo ""
+echo "2. æ¥ç Service Worker æ¥å¿:"
+echo " - åšæ©å±å¡çäžç¹å» 'Service Worker'"
+echo " - åšæåŒçæ§å¶å°äžæ¥çé误信æ¯"
+echo ""
+echo "3. æµè¯è¿æ¥:"
+echo " - ç¹å»æ©å±åŸæ "
+echo " - ç¹å» 'Connect to Qwen CLI'"
+echo " - è§å¯æ§å¶å°èŸåº"
+echo ""
+echo "4. åŠæä»æé®é¢:"
+echo " - è¿è¡: ./debug-chrome.sh"
+echo " - è¿äŒæåŒè°è¯æ§å¶å°åž®å©è¯æ"
+echo ""
+
+echo "==============================="
+echo "è¯æå®æ"
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/docs/README.md b/packages/chrome-qwen-bridge/docs/README.md
new file mode 100644
index 00000000..3804e6db
--- /dev/null
+++ b/packages/chrome-qwen-bridge/docs/README.md
@@ -0,0 +1,119 @@
+# Chrome Qwen Bridge ææ¡£
+
+æ¬¢è¿æ¥é
Chrome Qwen Bridge çææ¯ææ¡£ãæ¬é¡¹ç®æ¯äžäžª Chrome æ©å±ïŒçšäºè¿æ¥æµè§åšäž Qwen CLIïŒå®ç° AI å¢åŒºççœé¡µäº€äºã
+
+## ð ææ¡£ç®åœ
+
+### æ žå¿ææ¡£
+
+1. **[æ¶æè®Ÿè®¡ææ¡£](./architecture.md)**
+ - ç³»ç»æ¶ææŠè§
+ - ç»ä»¶è莣åå
+ - æ°æ®æµè®Ÿè®¡
+ - å®å
šè®Ÿè®¡
+ - æ§èœäŒåçç¥
+
+2. **[宿œè®¡åææ¡£](./implementation-plan.md)**
+ - 项ç®èæ¯äžéæ±
+ - åé¶æ®µå®æœè®¡å
+ - ææ¯æ éæ©
+ - æµè¯äžéšçœ²è®¡å
+ - é£é©è¯äŒ°
+
+3. **[ææ¯ç»èææ¡£](./technical-details.md)**
+ - Native Messaging å议诊解
+ - Chrome Extension API 䜿çš
+ - æ°æ®æåç®æ³
+ - è¿çšç®¡ç
+ - è°è¯æå·§
+
+4. **[API åèææ¡£](./api-reference.md)**
+ - Chrome Extension APIs
+ - Native Host APIs
+ - Qwen CLI éæ
+ - é误代ç
+ - 䜿çšç€ºäŸ
+
+### å¿«ééŸæ¥
+
+- [äž» README](../README.md) - å®è£
åäœ¿çšæå
+- [GitHub ä»åº](https://github.com/QwenLM/qwen-code) - æºä»£ç
+- [é®é¢åéŠ](https://github.com/QwenLM/qwen-code/issues) - æäº€ Issue
+
+## ð¯ 项ç®ç¹æ§
+
+- â
**Native Messaging** - Chrome 宿¹æšèçå®å
šéä¿¡æ¹åŒ
+- â
**MCP æå¡å𿝿** - éæå€äžª Model Context Protocol æå¡åš
+- â
**äž°å¯çæ°æ®æå** - DOMãConsoleãçœç»è¯·æ±çå
šæ¹äœæ°æ®
+- â
**AI åæèœå** - å©çš Qwen ç AI èœååæçœé¡µå
容
+- â
**è·šå¹³å°æ¯æ** - WindowsãmacOSãLinux å
šå¹³å°
+
+## ð å¿«éåŒå§
+
+1. **å®è£
æ©å±**
+ ```bash
+ # åš Chrome äžå èœœæªæå
çæ©å±
+ chrome://extensions/ â åŒåè
æš¡åŒ â å 蜜已解åçæ©å±çšåº
+ éæ©: packages/chrome-qwen-bridge/extension
+ ```
+
+2. **å®è£
Native Host**
+ ```bash
+ cd packages/chrome-qwen-bridge/native-host
+ ./install.sh # macOS/Linux
+ # æ
+ install.bat # Windows
+ ```
+
+3. **è¿æ¥äœ¿çš**
+ - ç¹å»æ©å±åŸæ
+ - è¿æ¥å° Qwen CLI
+ - åŒå§åæçœé¡µïŒ
+
+## ð ææ¡£è¯Žæ
+
+### æ¶æè®Ÿè®¡ææ¡£
+è¯Šç»æè¿°äºç³»ç»çæŽäœæ¶æïŒå
æ¬ Chrome ExtensionãNative Host å Qwen CLI äžå±æ¶æç讟计ç念ãç»ä»¶èèŽ£ãæ°æ®æµåçæ žå¿æŠå¿µã
+
+### 宿œè®¡åææ¡£
+è®°åœäºé¡¹ç®ä»æŠå¿µå°å®ç°ç宿Žè¿çšïŒå
æ¬å䞪åŒåé¶æ®µçä»»å¡åè§£ãææ¯éåäŸæ®ãæµè¯è®¡ååæªæ¥äŒåæ¹åã
+
+### ææ¯ç»èææ¡£
+æ·±å
¥æ¢è®šäºå
³é®ææ¯çå®ç°ç»èïŒåŠ Native Messaging åè®®çå
·äœå®ç°ãæ°æ®æåç®æ³ãè¿çšç®¡ççç¥çã
+
+### API åèææ¡£
+æäŸäºææ API ç宿ŽåèïŒå
æ¬æ¶æ¯æ ŒåŒãåæ°è¯Žæãè¿ååŒãé误代ç çïŒæ¯åŒååè°è¯çéèŠåèã
+
+## ð ææ¯æ¶æ
+
+```
+Chrome Browser
+ â
+Chrome Extension (Content Script + Service Worker + Popup)
+ â
+Native Messaging API
+ â
+Native Host (Node.js)
+ â
+Qwen CLI + MCP Servers
+```
+
+## ð çæ¬åå²
+
+- **v1.0.0** (2024-12) - åå§çæ¬
+ - å®ç°åºç¡æ¶æ
+ - Native Messaging éä¿¡
+ - 页颿°æ®æå
+ - Qwen CLI éæ
+
+## ð€ èŽ¡ç®æå
+
+欢è¿èŽ¡ç®ä»£ç åææ¡£ïŒè¯·æ¥çäž»ä»åºçèŽ¡ç®æåã
+
+## ð 讞å¯è¯
+
+Apache-2.0 License
+
+---
+
+*æ¬ææ¡£éæ¯ Chrome Qwen Bridge 项ç®çææ¯åèïŒæç»æŽæ°äžã*
\ No newline at end of file
diff --git a/packages/chrome-qwen-bridge/docs/api-reference.md b/packages/chrome-qwen-bridge/docs/api-reference.md
new file mode 100644
index 00000000..1c2a7813
--- /dev/null
+++ b/packages/chrome-qwen-bridge/docs/api-reference.md
@@ -0,0 +1,646 @@
+# Chrome Qwen Bridge API åèææ¡£
+
+## Chrome Extension APIs
+
+### Background Service Worker
+
+#### æ¶æ¯ç±»å
+
+##### è¿æ¥ç®¡ç
+
+**CONNECT**
+```javascript
+// 请æ±
+{
+ type: 'CONNECT'
+}
+
+// ååº
+{
+ success: boolean,
+ status?: string, // 'connected' | 'running' | 'stopped'
+ error?: string
+}
+```
+
+**GET_STATUS**
+```javascript
+// 请æ±
+{
+ type: 'GET_STATUS'
+}
+
+// ååº
+{
+ connected: boolean,
+ status: string // 'disconnected' | 'connecting' | 'connected' | 'running'
+}
+```
+
+##### Qwen CLI æ§å¶
+
+**START_QWEN_CLI**
+```javascript
+// 请æ±
+{
+ type: 'START_QWEN_CLI',
+ config?: {
+ mcpServers?: string[], // MCP æå¡åšå衚
+ httpPort?: number // HTTP 端å£ïŒé»è®€ 8080
+ }
+}
+
+// ååº
+{
+ success: boolean,
+ data?: {
+ status: string,
+ pid: number,
+ port: number
+ },
+ error?: string
+}
+```
+
+**STOP_QWEN_CLI**
+```javascript
+// 请æ±
+{
+ type: 'STOP_QWEN_CLI'
+}
+
+// ååº
+{
+ success: boolean,
+ data?: string,
+ error?: string
+}
+```
+
+##### æ°æ®æäœ
+
+**EXTRACT_PAGE_DATA**
+```javascript
+// 请æ±
+{
+ type: 'EXTRACT_PAGE_DATA'
+}
+
+// ååº
+{
+ success: boolean,
+ data?: {
+ url: string,
+ title: string,
+ domain: string,
+ path: string,
+ timestamp: string,
+ meta: object,
+ content: {
+ text: string,
+ html: string,
+ markdown: string
+ },
+ links: Array<{
+ text: string,
+ href: string,
+ target: string,
+ isExternal: boolean
+ }>,
+ images: Array<{
+ src: string,
+ alt: string,
+ title: string,
+ width: number,
+ height: number
+ }>,
+ forms: Array<{
+ action: string,
+ method: string,
+ fields: Array