From a1a0cb815b4f4b87929f95bc6891d3437751c286 Mon Sep 17 00:00:00 2001 From: Liang Jiaqing Date: Tue, 5 May 2026 11:57:40 +0800 Subject: [PATCH] feat: add contentSettings cmd to CDP bridge (bypass multi-download dialog); minor agentmain cleanup --- agentmain.py | 7 ++----- assets/tmwd_cdp_bridge/background.js | 12 ++++++++++++ assets/tmwd_cdp_bridge/manifest.json | 3 ++- memory/tmwebdriver_sop.md | 4 ++++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/agentmain.py b/agentmain.py index b8824d13..b436f8c7 100644 --- a/agentmain.py +++ b/agentmain.py @@ -127,7 +127,7 @@ class GeneraticAgent: def run(self): while True: task = self.task_queue.get() - raw_query, source, images, display_queue = task["query"], task["source"], task.get("images") or [], task["output"] + raw_query, source, display_queue = task["query"], task["source"], task["output"] raw_query = self._handle_slash_cmd(raw_query, display_queue) if raw_query is None: self.task_queue.task_done(); continue @@ -165,13 +165,10 @@ class GeneraticAgent: print(f"Backend Error: {format_error(e)}") display_queue.put({'done': full_resp + f'\n```\n{format_error(e)}\n```', 'source': source}) finally: - if self.stop_sig: - print('User aborted the task.') - #with self.task_queue.mutex: self.task_queue.queue.clear() + if self.stop_sig: print('User aborted the task.') self.is_running = self.stop_sig = False self.task_queue.task_done() if self.handler is not None: self.handler.code_stop_signal.append(1) - if __name__ == '__main__': import argparse diff --git a/assets/tmwd_cdp_bridge/background.js b/assets/tmwd_cdp_bridge/background.js index 8e070ae7..97fa88ec 100644 --- a/assets/tmwd_cdp_bridge/background.js +++ b/assets/tmwd_cdp_bridge/background.js @@ -53,6 +53,18 @@ async function handleExtMessage(msg, sender) { return { ok: false, error: 'Unknown method: ' + msg.method }; } catch (e) { return { ok: false, error: e.message }; } } + if (msg.cmd === 'contentSettings') { + try { + const type = msg.type || 'automaticDownloads'; + const setting = msg.setting || 'allow'; + const pattern = msg.pattern || ''; + await chrome.contentSettings[type].set({ + primaryPattern: pattern, + setting: setting + }); + return { ok: true }; + } catch (e) { return { ok: false, error: e.message }; } + } return { ok: false, error: 'Unknown cmd: ' + msg.cmd }; } diff --git a/assets/tmwd_cdp_bridge/manifest.json b/assets/tmwd_cdp_bridge/manifest.json index b0366ffd..0ed2aa7c 100644 --- a/assets/tmwd_cdp_bridge/manifest.json +++ b/assets/tmwd_cdp_bridge/manifest.json @@ -11,7 +11,8 @@ "scripting", "alarms", "declarativeNetRequest", - "management" + "management", + "contentSettings" ], "host_permissions": [""], "background": { diff --git a/memory/tmwebdriver_sop.md b/memory/tmwebdriver_sop.md index 71fbed13..e0dee2e7 100644 --- a/memory/tmwebdriver_sop.md +++ b/memory/tmwebdriver_sop.md @@ -54,6 +54,10 @@ web_execute_js script='{"cmd": "batch", "commands": [...]}' 通信方式:⭐JSON字符串直传(首选) | TID DOM方式(TID元素+MutationObserver,web_scan/execute_js底层依赖) 单命令:`{cmd:'tabs'}` | `{cmd:'cookies'}` | `{cmd:'cdp', tabId:N, method:'...', params:{...}}` | `{cmd:'management', method:'list|reload|disable|enable', extId:'...'}` - management:list返回所有扩展信息;reload/disable/enable需传extId +- contentSettings:`{cmd:'contentSettings', type:'automaticDownloads', pattern:'https://*/*', setting:'allow'}` + - 绕过Chrome"下载多个文件"对话框(该对话框会阻塞整个浏览器JS执行) + - type可选:automaticDownloads/popups/notifications等;setting:allow/block/ask + - ⚠CDP的Browser.setDownloadBehavior在扩展中不可用(chrome.debugger仅tab级),此为替代方案 - ⭐batch混合:`{cmd:'batch', commands:[{cmd:'cookies'},{cmd:'tabs'},{cmd:'cdp',...},...]}` - 返回`{ok:true, results:[...]}`,一次请求多命令,CDP懒attach复用session - 子命令会自动继承外层batch的tabId(如cookies命令可正确获取当前页面URL)