READMESource: main@ef4185ae
description: dsh-net-inspector —— 抓 Host 进程、DSH 页面、桌面内置浏览器与外部 Chromium(CDP)HTTP 流量的 DSH 插件
dsh-net-inspector
给 DeepSeek Harness 内置一个类似浏览器 DevTools「Network」的网络面板:输入框工具栏上的波形按钮打开它,面板停靠在输入框正上方,能看到请求方法、URL、状态码、耗时、大小、请求头、请求体、响应头、响应体,并按 Host / DSH 页面 / 内置浏览器 / CDP 分栏过滤。
同一份面板里合并四条完全不同的流量:
| 来源 | 抓什么 | 怎么抓 |
|---|---|---|
| Host 进程 | 工具调用(web_fetch、web_search、图片 API、MCP)、LLM 请求等所有出站 HTTP |
包装 Host 进程的 globalThis.fetch |
| DSH 页面 | DSH 页面自己的 fetch / XMLHttpRequest / WebSocket / EventSource |
在页面内包装对应构造函数 |
| 内置浏览器 | DSH 桌面版右侧栏浏览器(Electron <webview>)里打开的任意网页 |
对每个 <webview> 元素 executeJavaScript 注入采集脚本,再用同一条通道把排队的事件抽回页面 |
| CDP | 外部 Chrome / Edge 的任意标签页(XHR、fetch、文档、图片……) | 连上 --remote-debugging-port 的 DevTools 协议,订阅 Network 域 |
安装
plugin_manager install_bundle <本仓库所在的绝对路径>
安装后插件行 net-inspector 变为 active。桌面版在启动时组装客户端 bundle,所以 lib/client.js 与 lib/index.js 的改动都要重启 DSH 才生效。
用法
- 输入框工具行(模型选择器左侧)有波形图标按钮,点一下在输入框上方展开面板;再点一次、点右上角 × 或按
Esc收起。按钮右上角的红色角标只统计「上次打开面板之后」新出现的失败请求,不会把历史错误一直挂着。 - 「全部 / Host / DSH 页面 / 内置浏览器 / CDP」是分段标签;过滤框支持空格分词、
-关键词排除、method:post、status:4(前缀匹配)或status:404。 - 点「耗时」「大小」表头排序(再点切换升/降);底部「失败 N」按钮一键只看失败请求。
- 点任意一行:右侧展开详情,含 URL、来源、开始时间、耗时、错误、请求头表、请求体、响应头表、响应体。JSON 自动美化,URL / cURL / 每一段内容都能单独复制并给出「已复制」反馈。
- 键盘:列表聚焦时
↑/↓切换请求,/聚焦过滤框,Esc逐级清空过滤 → 取消选中 → 收起面板;过滤框内Esc清空过滤。
Agent 侧还注册了 net_inspect 工具,模型可以自己读最近的请求(四侧都能读):
{ "limit": 10, "side": "client", "urlContains": "api", "includeBodies": false }
每行前缀 [H] 是 Host 进程发出、[B] 是 DSH 页面发出、[W] 是右侧栏内置浏览器发出、[C] 是外部浏览器(CDP)发出。
抓外部浏览器(CDP)
默认只抓 Host 和 DSH 页面。要抓 Chrome / Edge 里打开的任意网页,让浏览器带一个调试端口启动,插件会自动连上去:
& 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' `
--remote-debugging-port=9222 `
--user-data-dir="$env:TEMP\edge-cdp-profile"
- 面板底部出现
CDP N绿标(N = 当前挂上的标签页数),列表里出现带橙色C徽标的行,来源写「外部浏览器」;点顶部分段标签的「CDP」可以只看这类流量。 - 端口不通时底部显示
CDP 未连接,点「CDP」标签也会看到这一状态;改端口/重开浏览器后 5 秒内自动重连。 - 抓的是浏览器内部视角,没有证书问题:HTTPS 请求、请求体、响应体、状态码都完整,和 DevTools 的 Network 面板一致。
限制:
- 只覆盖 CDP 连接之后发起的请求。连接瞬间正在加载的页面可能缺文档请求,刷新一次就齐了。
- 只支持 Chromium(Chrome / Edge / Brave 等带 DevTools 协议的浏览器)。Firefox 需要
--start-debugger-server的另一种协议,未实现。
配置(cordis.patch.yml)
- id: net-inspector
name: dsh-net-inspector
config:
enabled: true
maxEvents: 2000 # 环形缓冲条数
bodyCap: 24576 # 单条 body 预览字节上限(Host / 浏览器 / CDP 都按它截断)
ignore: # URL 正则,命中即不记录(四侧都生效)
- 'dsh-app://app/dsh-whale/'
cdp: # 可选:外部浏览器
enabled: true
endpoints:
- 'http://127.0.0.1:9222'
retryMs: 5000 # 连不上时的重试间隔
ignore 默认只屏蔽 dsh-whale 插件的每秒轮询——不屏蔽的话几分钟就能把环形缓冲刷满。面板底部会显示「忽略 N 条(ignore 规则)」和「丢弃 N 条(环形缓冲淘汰)」。
设计取舍
- 透明:包装函数原样调用原 fetch/构造函数,返回值与异常不做任何改写;任何记录异常都被吞掉,面板本身不会打断请求。
- 有界:环形缓冲 + 每体字节上限;
text/event-stream(LLM 流式响应)、二进制、图片、音视频一律不 clone、不读 body——clone 一个流式响应会让它整段缓冲,既泄漏内存又拖慢调用方。 - 仅本机:桥接路由
/api/dsh-net-inspector/{meta,events,config,clear,ingest}只接受 127.0.0.1 / ::1 且 Host 头匹配的回环请求;/clear只接受 POST。捕获内容含 API Key、Cookie 等敏感头,面板只在本机内存里保存,不落盘、不上报。 - 浏览器→Host 上报:页面每 1.5s(或攒够 40 条、或页面隐藏时)把浏览器侧事件
POST /ingest给 Host,合并进同一个环形缓冲,net_inspect因此能读到页面请求;上报失败只影响 Agent 可见性,面板仍用本地副本正常显示。 - 轮询而非推送:面板 900ms 拉一次增量事件(
?since=seq,响应里同时带缓冲/丢弃/忽略计数),关闭面板时降到 5s 只为角标计数;实现简单、断线自愈,不需要额外 WebSocket。Host 重启导致 seq 回绕时客户端会自动重置游标,Host 列不会卡死。 - 暂停 ≠ 丢数据:暂停只冻结界面,采集与上报继续;错误角标按「上次看过之后」计数,浏览器事件与 Host 镜像按 URL + 时间戳去重,不会一次失败计两遍。
- CDP 只读:
lib/cdp.js自带一个不依赖ws的 WebSocket 客户端(握手、分片、ping/pong、掩码),只发Network.enable/Target.setAutoAttach这类订阅命令,不注入脚本、不改写请求;响应体按bodyCap截断,二进制与event-stream不读。连不上就在后台静默重试,不刷日志。
已知限制
- Host 侧只覆盖
globalThis.fetch(undici)。走node:http/node:https原生模块的代码不会出现在面板里。 - 流式响应(SSE)只记录状态码、响应头与耗时,不记录响应体——这是刻意的。
- 浏览器侧记录的是「插件加载之后」的页面请求;页面加载初期、在插件加载前就建立的常连接(例如 RPC/流式通道)无法补钩子,不会出现在面板里。刷新页面后新建立的连接可以。
- WebSocket 只记录
send出去的帧(页面发出的请求)与连接生命周期,不逐条记录收到的帧,避免 token 级流式消息把缓冲刷爆。 - DSH 桌面版右侧栏的内置浏览器:每个
<webview>在dom-ready(含每次导航后)注入采集脚本,覆盖 fetch / XHR / WebSocket / 静态资源与文档请求;脚本把事件排队,面板每 700ms 用executeJavaScript取一次,不需要开 DevTools、也不受页面 CSP 影响。标签未挂载时,面板底部显示「内置浏览器未开」,注入次数为 0。 - 请求体若是
Blob/ArrayBuffer/流,只记录类型与大小,不展开内容。
文件
package.json 插件清单(dsh.bundle.patch + dsh.client)
cordis.patch.yml 插入 net-inspector 行
lib/index.js Host 半:fetch 包装、环形缓冲、HTTP 桥、net_inspect 工具
lib/cdp.js CDP 源:自建 WebSocket + Target/Network 订阅
lib/client.js 浏览器半:fetch/XHR/WebSocket/EventSource 包装 + 内置 webview 注入 + 停靠面板 UI
lib/probe.js 诊断用飞行记录器:心跳 / 会话 / flush 打点,默认写系统临时目录,可用 DSH_NET_PROBE_LOG 改路径
No comments yet. Be the first to write one.