Repository navigation
Releases: Fisfzy/dsh-ego-browser
Release list
v0.9.6 — 等待响应回放 / 会话级 space / 截图卡片与人工等待
安装:dsh plugin --profile desktop add dsh-ego-browser@0.9.6
配套 Chrome 扩展:dsh-ego-browser-extension-0.9.6.zip(chrome://extensions → 开发者模式 → Load unpacked)。
[0.9.6] - 2026-10-28 — 等待响应回放 / 会话级 space / 截图卡片与人工等待
修复
ego_wait_for_response看不到"已经完成"的响应:运行时只在等待期间启用 Network 域,且只监听未来事件——典型场景(page.goto()之后再等那次文档响应)永远匹配不到,只能干等到超时。现在:- 会话 attach 时即启用
Network.enable(导航期间的请求因此也会被记录),并且等待结束后不再关闭该域,全局事件缓冲得以保留整段导航; waitForResponse在等待前先回放缓冲:窗口从当前文档的Network.requestWillBeSent开始——该事件早于Page.frameNavigated,所以不能简单地"从 frameNavigated 之后切片"(第一版就是这么错的,真机上文档响应始终匹配不到,已修正);- 新增
includeBuffered选项(默认 true)回放当前文档已完成的请求;传false可回到 Playwright 的严格"只看未来"语义; - 超时时若命中的请求由缓存提供(
Network.requestServedFromCache,不产生网络往返),错误信息会列出具体 URL 并提示加 cache-busting 查询,而不是一句莫名的 timeout。
- 会话 attach 时即启用
ego_wait_for_response工具:新增includeBuffered参数(默认 true),超时 hint 补充缓存说明与"请求与等待需在同一ego_script"的边界。
新增
- 会话级 task space(PR #85):新增
sessionScopedSpaces设置(默认 开)。省略space时按dsh-agent-<sessionId前8位>解析,每个 DSH session 拥有独立的 browser context / window / tab 集合 / tab cursor,并发 session 或子 agent 不再互相抢标签、覆盖目标;显式传space仍共享。tab cursor key 也加入 session,因此关闭该设置后两个 session 仍保持各自 target。升级后首次调用会为新 space 打开一个新窗口,旧dsh-agent的标签不迁移;可设sessionScopedSpaces: false或显式space: "dsh-agent"保持旧行为。 - 截图/下载卡片 +
ego_wait_for_human(PR #86):ego_screenshot/ego_download通过deliverables/presented事件让 Web GUI 显示可点击卡片(deliver:false可关闭,best-effort);新增ego_wait_for_human阻塞等待 CAPTCHA / 登录 / 2FA 完成(可选selector作为"已登录"信号),超时返回resolved:false+ 可执行提示,而不是抛错;它不是审批流程。
测试
- 新增
tests/wait-for-response-buffer.test.ts(6 项):Network 域的启用时机、等待结束后不关闭、回放窗口包含文档请求、缓存提示文案、插件侧默认传参。 - 真机验证(repo 运行时 + 真实 Chrome):
page.goto()之后等待文档响应 →{firstLoadMatched:true, firstStatus:200};includeBuffered:false仍按 Playwright 语义超时。
v0.9.5 — 滚轮修复 / 双缓冲硬化 / PR #83
安装:dsh plugin --profile desktop add dsh-ego-browser@0.9.5
配套 Chrome 扩展:dsh-ego-browser-extension-0.9.5.zip(chrome://extensions → 开发者模式 → Load unpacked)。
[0.9.5] - 2026-10-27 — 滚轮修复 / 双缓冲硬化 / PR #83
修复
- 侧栏滚轮/触控板滚动失效(#81 回归):0.9.4 的 wheel 监听绑在条件渲染的语义
<img>上,首帧到达前<img>不存在,one-shot effect 之后不再重绑。现在监听器挂在始终存在的.dsh-ego-side-stage上(passive:false),点击/双击/Ctrl+滚轮行为不变。 - 双缓冲 review 硬化(#82):冷启动/切目标时用
liveFrameUrl/ frameCache / 当前缩略图做种子,不再清空两层导致空白;onerror不再交换失败层(保留上一帧);目标切换清理liveBufferPending并加 generation guard,防止旧页面的帧落到新页面;黑色背景移到.dsh-ego-side-livebox。maxWidthHint变化后重启 watch 的逻辑已在 0.9.4 提供。
新增
- PR #83(社区 @mecamangeg):修复多标签时结构化工具总是切到第一个 tab /
ego_script没有 tab 选择的问题——新增 per-space tab cursor +@@EGO_TARGET@@side channel;ego_navigate/ego_script/ego_cli支持显式tab;新增viewportWidth/viewportHeight/deviceScaleFactor(HiDPI 下避免移动版布局);ego_select回退 value → label → index。源码已 rebase 到 0.9.4 并用当前工具链重建,新增 25 个测试。
v0.9.4 — Chrome 风格 UI / 一键复用登录态 / ego_tabs
安装:dsh plugin --profile desktop add dsh-ego-browser@0.9.4
配套 Chrome 扩展:下载下方 dsh-ego-browser-extension-0.9.4.zip,在 chrome://extensions 开发者模式 Load unpacked 安装一次。
[0.9.4] - 2026-10-27 — Chrome 风格 UI / 一键登录态 / ego_tabs
新增
- Agent 浏览器面板 UI 重做(Chrome 配色):移除「需要账号登录时…」引导条;改用 Chrome 调色板(
#f1f3f4工具栏、#202124/#5f6368文字、#1a73e8强调,深色模式跟随prefers-color-scheme);标题栏为浅灰工具区 + 蓝色实心「连接/复用 Chrome 登录态」主按钮;标签栏改为 Chrome 式活动白标签;页面标题/URL 放在标签栏下方;状态改为轻量 dot + 文本 + 执行器 chip;操作按钮改为扁平 ghost 样式(26px 高、4px 圆角、hover/focus 状态);配对面板为 Chrome 风白色浮层(锚定在页面信息下方)。同时修掉整行opacity:.6导致按钮发灰的问题。 ego_tabs工具(0.9.4):一个工具管理标签页——list(返回 targetId/title/url/active/index)、switch(按 targetId 切换)、open(按 url 新建,默认 about:blank)、close(按 targetId 关闭),每次操作后返回最新标签列表。底层复用 runtime 的browser.listTabs/switchTab/closeTab与ego.createTab,targetId 与ego_space_open/ego_navigate返回一致。真机脚本已验证 list → open → switch → close 全链路。ego_login_import双安全路径(#69 E + A):- E 安全复制:删除 junction/symlink 启动真实 profile + 强杀的旧路径;现在只复制
Local State+ Cookies 到临时 profile 读取,真实 profile 从不被浏览器打开/写入。Chrome/Edge 127+ 因 ABE 复制读到 0 条 cookie,工具明确报错而不是回退到破坏性路径。真机验证:源 Cookies SHA-256 前后一致。 - A Chrome 扩展桥接:新增
extension/(MV3,cookies/alarms权限)与常驻回环桥接login-extension.ts;Agent 浏览器面板右侧新增 「连接 / 复用 Chrome 登录态」 按钮:首次配对码(6 位)配对一次,之后每次点击即启动导入任务,扩展通过后台轮询(30s alarm,配对后立即触发)自动读取当前网站 cookie 并写入 ego 浏览器——不再需要每次打开 Chrome UI 或手动点 Export。ego_login_import({source:"extension",domains:[...]})仍可用(等待扩展轮询)。用 Chrome for Testing 156 完成真实端到端验证(扩展读取测试 cookie → 回环 POST → ego 浏览器写入 1 条)。
- E 安全复制:删除 junction/symlink 启动真实 profile + 强杀的旧路径;现在只复制
v0.9.3 — 侧栏双缓冲 / TUI 纯文字 / 图标统一 / 移除悬浮球
安装:dsh plugin --profile desktop add dsh-ego-browser@0.9.3
[0.9.3] - 2026-10-26 — 侧栏双缓冲 / TUI 纯文字 / 图标统一 / 移除悬浮球
新增
- 常驻执行器可视化与失败监督(#73 phase 2):新增 host 路由
/api/ego/executor,观察窗状态行显示当前执行模式(常驻+ 运行时长 /一次性/常驻已停用),悬停可看到 pid、最后一次重建原因或停用原因。监督逻辑:连续 3 次冷启动失败后常驻进程保持停用(parked),一次性 spawn 继续工作,直到用户切换设置或插件重启,避免 park → one-shot → respawn 循环。默认保持 opt-in(residentExecutor默认关):尚无"一整天浸泡无回归"的数据,先不做默认开启决策。设置持久化(gateway 写入后重启回退)仍需真机复现,留待验证。
修复
- 统一 Agent 浏览器图标:面板头部原先用 globe 图标,与侧边栏入口的「浏览器窗口 + 光标」不一致;现在两处都使用同一个
ICON_AGENT_BROWSER几何(16×16 圆角窗口、标题栏双点、agent 光标),侧边栏EgoWatchIcon与字符串图标保持同步。 - 移除悬浮球回退:DSH 官方右侧边栏已覆盖观察窗,删除浮动 FAB / 浮窗、拖拽吸附、其专用 CSS/图标/常量与键盘代理代码(client bundle 明显减小),只保留原生侧边栏 Tab + 可选
dsh-better-sidebar回退;两者都不可用时不再显示侧栏面板。 - 侧栏实时画面黑闪(#81 / #82):
<img src>逐帧替换会在新 JPEG 解码完成前丢掉已绘制的位图,面板整块露出黑色背景(macOS 无头 CDP 链路尤其明显,Windows 也可复现)。原生侧栏改为双缓冲:语义<img>只负责布局与指针/缩放(opacity:0),上方两层层叠<img>承载可见像素,新帧在隐藏层load/decode完成后才交换可见层,旧帧始终保留;挂载/切标签时用缓存的上一帧做种子,避免首帧空窗。旧浮动面板同样改为先预加载/解码、再换可见帧。另修maxWidthHint:在root.clientWidth为 0 时不再锁成 480;宽度测量提前到首次 watch 之前,ResizeObserver更新后若与当前采集宽度差 >20% 则防抖重启一次 watch,避免 Retina 上一直用 800 采集导致发虚。验证:staging 中两层交替、可见层始终有帧、指针映射不受影响、采集宽度 653px。macOS 实机复测待 #81 报告者确认。 - TUI 面板改为纯文字(无画面):TUI 没有浏览器视窗渲染能力,面板不再使用
ui.Image//api/snapshot/SSE 帧,只显示标签、状态、人机验证、当前工具/错误、最近动作与快捷键;同时把标签元数据与disableFrameRelay解耦(禁用 Web 画面回传时 TUI 仍能看到标签列表)。选中项改为按targetId保持,标签增删/重排后x/o不会作用到错误的页面。 - 登录导入安全范围扩大(#69):Windows 上从仅拒绝 Chrome ≥155 扩展为拒绝 Chrome/Edge ≥127(App-Bound Encryption 范围)。127–154 同样存在"junction 启动真实 profile + 强杀"的破坏性路径,本次先 fail-closed;
EGO_LINUX_LOGIN_IMPORT_FORCE=1仍可覆盖。Linux/macOS 与 Windows 上 Chrome <127 不受影响。 - headless UA 版本与实际 Chromium 不一致(#79):headless 启动时注入的 UA 一直是硬编码
Chrome/152.0.0.0,而navigator.userAgentData来自真实二进制(社区实测 Termux 上外部 Chromium 为 155)。这种自相矛盾的指纹会被风控标记。现在运行时首次 headless 启动会用<binary> --version探测真实主版本(缓存,2s 超时,失败才回落 152);Windows 上为避免chrome.exe --version弹窗不做探测,继续使用兜底值。新增parseChromeVersionMajor()单测。
文档
- macOS 27 / Chrome 156 复测通过(#68):社区在 0.9.2 上复测(macOS 27.0.1 arm64 + Chrome 156.0.8078.47,去掉
chromePath/--headless两个旧 workaround)——.app自动探测、headed 冷启动、navigate/截图/ego_doctor全通;README 的 macOS 实测记录已补充该环境(此前为 macOS arm64 + Chrome 154)。 - Termux / Android 开箱说明(#78):README 新增 Termux 小节——
pkg install chromium(x11 repo)、chromium-browser已在候选列表中、无$DISPLAY/Xvfb 自动 headless、无需--no-sandbox、DBus 报错无害、手机终端建议disableFrameRelay: true;ego_doctor的“未找到浏览器”提示补充pkg install chromium。 ego_script的 page 门面不是 Playwright API(#80):ego_help script、ego_script工具描述与 README 都列出完整 page 方法清单,并明确没有fill/click/type/press(用ego_fill/ego_click或page.locator(...)),page.goto()不返回 Playwright Response。
v0.9.2 — macOS 开箱支持(#65/#68)
v0.9.2
[0.9.2] - 2026-10-23 — macOS 开箱支持(#65/#68,社区 PR #72 移植)
本版把 macOS 从"需手动填 chromePath、headed 路径找 Xvfb"变成开箱即用:自动探测 .app 内的 Chrome/Chromium/Edge/Brave 并注入运行时,headed 启动不再依赖 X11/Xvfb,同时保留 #16 要求的真实窗口能力。社区贡献者 @syjnzh918 提供实现与 macOS arm64 真机验证。
修复
- macOS 开箱可用(#65、#68):两处平台缺口叠在一起,使 macOS 首装第一次调用任意
ego_*工具必然失败。其一,COMMON_CHROME_BINS只列 Linux 路径、resolveEgoEnv()的注入条件也不含 darwin,而 macOS 上 Chrome 不在PATH里(只在.appbundle 内),于是报no Chrome/Chromium binary found;现在由darwinChromeCandidates()探测 Chrome / Chromium / Edge / Brave(含~/Applications),并像 win32 一样把结果注入EGO_LINUX_CHROME。其二,填好路径后仍会撞运行时ensureXDisplay():它只给 win32 留了"有桌面会话、无 X server"的豁免,而 macOS 在这一点上完全同形(GUI 是 Aqua/Quartz,永不导出$DISPLAY,Xvfb 也不存在于该生态),现在同样豁免。isHeadlessDetected保持排除 darwin——把缺$DISPLAY当成无头正是 #16 的回归。真机验证:macOS arm64 + Chrome 154,冷启动 → navigate → 截图 →ego_doctor全通。
社区
- macOS 适配(#65/#68)来自社区 PR #72(@syjnzh918),由其基于当时主干提交并附 macOS arm64 真机冷启动验证;本次将其移植到 0.9.1 后的主线上(解冲突、保留后续 win32/no-Xvfb、常驻执行器与观察窗改动,并补回归测试)。
安装 / 升级
sh dsh plugin --profile <profile> add dsh-ego-browser@0.9.2 n
或插件页添加;npm:https://www.npmjs.com/package/dsh-ego-browser
v0.9.1 — 观察窗尺寸同步 / 帧链路性能 / 输入映射修复
v0.9.1
[0.9.1] - 2026-10-23 — 观察窗尺寸同步 / 帧链路性能 / 输入映射修复
本版把观察窗从"只能看"扩展成"能直接改真实窗口大小":尺寸同步开关 + 比例预设 + 边缘拖拽,同时把串流 CPU 砍到约一半,并修复窗口缩放后的点击偏移与拖动卡顿。
新增
- 观察窗尺寸同步(真实窗口):侧边栏观察窗的「打开真实页 / 弹出窗口」按钮行新增 🔒/🔓 尺寸同步 开关与 尺寸预设 菜单。
- 解锁本身不改变窗口;之后拖动右侧边栏宽度、或直接拖观察窗的右侧 / 底部 / 右下角手柄,窗口按拖动增量 1:1 缩放(
POST /api/ego/window-size+ CDPBrowser.setWindowBounds),横向拖动保持页面比例,纵向拖动改变高度。 - 尺寸预设 提供 16:9 / 4:3 / 21:9 / 1:1 / 9:16:保持当前窗口宽度,把高度设成对应比例。
- 页面标题与 URL 现在显示在实时状态栏那一行(画面下方不再占两行)。
- 布局/窗口其它变化会被吸收为新的基准,不会形成"越缩越小"的反馈环;无头浏览器返回
headless并提示先「弹出窗口」;本次只做 CDP 后端,FFmpeg 路径未改。
- 解锁本身不改变窗口;之后拖动右侧边栏宽度、或直接拖观察窗的右侧 / 底部 / 右下角手柄,窗口按拖动增量 1:1 缩放(
修复
- 重启后观察窗卡在「⚠ 未接管 / 暂无截图」:如果面板在浏览器/worker 还没起来时打开,host 的
/api/ego/stream当时只能建一条静默 SSE,并且之后永远不会再接上 worker——即使浏览器后来启动了、worker 也在推帧,面板也收不到任何frame/spaces事件。现在这条流会每 1.5 秒重试ensureWorker(),worker 一出现就自动接上(新增单测覆盖"worker 晚于 SSE 出现"的情况)。 - 画面边缘的红/橙色条:边缘拖拽热区原来常显高亮条,看起来像画面多了一圈红边。现在热区默认完全透明,只在鼠标悬停时低调显示;解锁尺寸同步时仅保留极淡的提示色。
- 调整窗口后点击位置偏移:screencast 帧携带的
vw/vh视口元数据不会在每次窗口变化后更新(实测窗口已缩到 900×573 时帧仍标注 1264×805),面板按旧视口换算点击坐标导致落点偏移。现在:capture 每秒用Page.getLayoutMetrics同步真实视口;/api/ego/window-size应用新尺寸后 160ms 内刷新会话视口;客户端收到 resize 响应立即用返回的viewport更新坐标映射。验证:窗口缩放到 900×573 后点击面板 60%/40% 位置,页面收到的坐标与预期一致(540,229)。 - 拖动边缘缩放卡顿:
/api/ego/window-size原来每一步都重新 getWindowForTarget + getWindowBounds + 测量 chrome 边框 + 测量视口 + setWindowBounds(约 5 次 CDP 往返)。现在缓存 windowId / chrome 边框 / 窗口位置与视口(10s / 2s 过期),每步只需 1 次 setWindowBounds;实测单步延迟 avg 22ms(10–47ms)。
性能
- 观察窗串流 CPU 大幅下降:两处结构性优化,帧率与功能不变。
- 按源取帧:
Page.startScreencast的everyNthFrame现在按cdpFps计算(20fps → 每 3 帧取 1 帧),Chrome 不再编码 ~100 帧/秒再丢掉 80%;实测源帧 ~100/s → ~33/s。 - 采集宽度跟随面板:客户端把面板实际显示宽度(× devicePixelRatio,含余量)通过
watch/start的maxWidth上报,worker 取配置上限与面板宽度的较小值。面板约 550px 时采集从 1280 宽降到 ~654 宽,编码/传输/解码像素约降 4 倍;全屏面板时仍会按需放大。 - 实测(Windows,面板开启、视频页面):总 CPU 约占 196% 单核 → 72% 单核(Chrome ~170% → ~63%,worker ~20% → ~4%);实际下发帧率 ~19/s → ~17/s。
- 按源取帧:
- 窗口隐藏/最小化时停止串流:面板监听到
visibilitychange后会停掉 watch、关闭 SSE 与画面(恢复窗口时自动重新 watch/串流)。实测:最小化后 watchers 2 → 1,采集侧 CPU 降到约 6%;恢复后自动回到 2 并继续出帧。纯静态页面本来就只在内容变化时出帧。 - TUI/无头环境可不传画面:TUI 设置新增「关闭实时画面传输」(
disableFrameRelay)开关;开启后不启动 cast worker、不做 screencast、不发帧,TUI 面板仅保留文字状态,ego_*工具不受影响。TUI 面板本身只是事件驱动地按需取一张快照(maxWidth 320),没有连续串流。 - 画面
<img>使用decoding="async",减少主线程解码阻塞。
安装:dsh plugin --profile <profile> add dsh-ego-browser@0.9.1(或插件页添加);npm:https://www.npmjs.com/package/dsh-ego-browser
v0.9.0 — dsh-TUI support: settings, status, side panel, thumbnails
dsh-TUI 支持:设置页 / 工具状态栏 / 侧栏面板 / 页面缩略图(合并社区 PR #74/#75/#76)
TUI 集成全部通过可选服务独立注入:宿主没有对应服务时静默跳过,不新增文件读取、轮询或 worker 启动。合并社区 PR #74、#75、#76(ccch1mneyyy)。
新增
- TUI 通过独立可选注入注册真实的 Agent Browser 设置页、工具活动状态栏和有限通知;缺席服务时不新增 TUI I/O 或后台轮询。
- 不可变浏览器状态快照记录当前工具与最近十次完成结果,包含执行耗时和截短错误;锁内工具从实际取得锁后开始计时。
- Web/TUI 共用安全的工具卡标题:只显示允许的定位摘要,按终端单元截断,隐藏输入值、HTTP 头/正文以及可执行源码。
- 侧栏面板(PR #75):可选 28 列 Agent Browser 面板,展示浏览器运行/无头状态、活动页标题与 URL、按任务空间分组的标签列表、人机验证提示、最近 3–5 次动作;面板聚焦时支持
↑/↓选标签、o弹出真实窗口、x关闭标签(有对话框服务时确认,否则双按)、f落盘登录态、r刷新;可见时约 2 秒刷新、隐藏即停、并发合并。新增tuiAutoOpenPanel(默认关)。 - 页面缩略图(PR #76):worker 新增本机回环
GET /api/snapshot?targetId=…&maxWidth=…(不占插件全局锁、不启动直播订阅),终端用宿主ui.Image显示;选中标签/工具结束/r时各截一帧,隐藏时不请求,无拖影;PNG 用 Nodezlib自解(含大小/尺寸/解压上限,无新依赖),终端不支持图形协议时回退为一行文字;disableFrameRelay时不截图。另显示既有的捕获后端/状态行。
修复
- 删除未实现的 TUI Scene 清单声明,Notification fallback 改为无 toast 服务时省略通知、保留工具结果。
- TUI 设置直接读取清单字段作为单一来源,并将清单画质选项纠正为运行时实际接受的
low / balanced / high;不改现有 Web 设置实现。
验证范围
- 增加可选服务、真实注册、设置一致性、隐私、Unicode 宽度、不可变快照、锁内执行、重试通知、空闲回收成功与生命周期清理测试。
- 合并后在本地通过
typecheck/vitest(234 passed, 5 skipped)/build;尚未在真实 DSH TUI 或 Chrome 环境验证视觉布局与人工接管。
v0.8.8 — native right sidebar, resident executor, orphan-tab reaping, scoped login-import guard
原生右侧边栏 + 常驻执行器 + 孤儿标签清扫 + 登录导入定向放行
新增
- 原生右侧边栏支持(#64):DSH ≥ 0.2.1 自带右侧边栏(
@deepseek-ai/dsh-client-ui-sidebar-right)时,观察窗注册为原生 Tab——dsh-ego-browser:watch类型 +sidebar.right.pane.tab面板 + guide 入口(自绘「浏览器窗口 + agent 光标」图标)。检测用ctx.inject(['sidebarRight','sidebarRightTabs'])等待服务(服务晚于插件就绪时不再漏检),优先级 原生 > dsh-better-sidebar > 浮动球;升级挂载时会释放上一个宿主,不会出现两份面板。自动打开仍按调用会话作用域。 - 常驻执行器(#56 第一期,可选):新增
residentExecutor(默认关)与residentIdleMin(默认 30 分钟,0 = 保留到卸载)。开启后ego_*调用复用同一个ego-browser --serve进程:首次调用支付启动开销,之后每次 ~1–2 ms(一次性 spawn 基准 ~340 ms)。浏览器被空闲回收/崩溃后,下一次调用自动回退到一次性 spawn 并重新拉起浏览器(带启动重试),随后恢复常驻;已经写出的请求不会重试,避免重复点击/填表。设置卡片(插件 → dsh-ego-browser → 配置)与 TUI settings 字段均已接线。 - TUI 设置字段:
dsh-plugin.json的 SettingsSection 补充常驻两项。
修复
- 浏览器在常驻进程下被停/崩溃后请求永久失败(#56):
--serve的 CDP socket 在浏览器停止后不会恢复,旧实现之后每次请求都报CDP channel is not open。现在--serve每请求检查cdp.isOpen(),失效立即返回可重试的browser is not reachable;插件把它归为冷启动错误,回收常驻进程并走一次性 spawn 恢复(10s cooldown 后才重新常驻)。Windows 上启动失败不再空等 Xvfb(本来不存在,只会多等 10s+)。 - 孤儿标签(#67):
reconcile()增加两阶段 + 120s 宽限的孤儿 page target 清扫——关闭不属于任何 space 的标签(崩溃恢复/手动打开),跳过about:blank/chrome://,并在closedSpaces留下(orphan tab)轨迹。此前pruneIdle/pruneAbandoned/--prune-spaces只遍历state.spaces,扫不到这些孤儿。 - 登录导入定向放行(#69):
ego_login_import从"全禁"改为仅 Windows + Chrome ≥155 拒绝(该组合的 junction 别名 + 无头启动 + 强杀路径会读到 0 条 cookie 并破坏源 profile);Linux / macOS / 旧 Chrome 正常可用,EGO_LINUX_LOGIN_IMPORT_FORCE=1可在任何环境强制放行。工具会在错误信息里带上检测到的版本。
变更
- README 同步 v0.8.8:版本号、DSH 兼容矩阵(0.2.1 原生侧边栏)、侧边栏三种形态、常驻执行器、登录导入定向放行、Windows 已知限制。
dsh-plugin.json版本 0.8.8。- 测试:181 passed / 5 skipped(新增常驻传输、恢复契约、配置与孤儿选择器用例)。
验证
- 真实桌面端(DSH 0.2.1-rc.2):常驻首调 1485ms(含浏览器冷启动)→ 之后 1ms;
--stop后下一次调用自动恢复并重新拉起浏览器;冷却期走一次性;冷却后回到新常驻;全程仅 1 个常驻进程、无残留。 - 原生侧边栏(临时 web profile):guide 出现「Agent 浏览器」及图标,面板正常推流/输入。
- #69:Windows + Chrome 155 正确拒绝并给出原因。
v0.8.7 — tool-semantics fixes, Windows profile lock, login-import fail-closed, reaper session restore
工具语义修复 + Windows 孤儿锁 + 登录导入止损 + 回收器会话清理
修复
- 虚拟光标箭头与小手重叠:覆盖层
#arrow的 ID 规则带display:block,优先级压过svg.shape{display:none}——showShape()切到手形/文字光标后箭头仍在绘制,两者在同一点重叠。现在可见性统一由svg.shape/.on控制:悬停链接只显示手形,悬停文本显示输入光标。 ego_wait_for_url在导航已完成后仍报reached:false(#71):改为两段式——先比对当前 URL(对无 glob 的模式做保守子串匹配),再等待未来导航;失败 payload 带当前 URL 与matchedCurrent,并提示等待只在同一次调用内有效、匹配语义是全 URL 或**glob。ego_wait_for_response超时直接抛错(#71):现在捕获超时并返回结构化{ok:false, reached:false, url, error, hint},不再让整次调用以退出码 1 结束。ego_dialog的误导性 "No dialog is showing"(#71):描述明确"只对当前正阻塞的 dialog 有效,跨调用的 dialog 已被自动 dismiss";失败时附当前 URL 与可执行建议(在同一次ego_script里page.once('dialog', d => d.accept())后再触发点击)。ego_script/ego_cli忘记哨兵即硬失败(#71):描述写出@@DSH_RESULT@@字面量;新增兜底解析——没有哨兵时取最后一行可解析 JSON,并标记result.fallback: true。- Windows 上孤儿 Chrome 永久占住 agent profile(#70):Chrome 在 Windows 只留空
lockfile、没有SingletonLock符号链接,旧clearProfileLock()永远 no-op;浏览器一旦非优雅退出,之后每次启动都被转交给孤儿进程并耗尽 20s 超时。现在 win32 下按命令行枚举持有本 profile 的chrome.exe,先收集后终止(500ms 释放等待、10s 硬上限),再清lockfile;只按本 profile 路径匹配,不动用户自己的 Chrome。 ego_login_import默认关闭(#69 止损):Chrome 155 上 junction 别名 + 无头启动 + 强杀路径读到 0 条 cookie,且被观测到会清空真实 profile 的扩展注册表、重置默认搜索引擎。现在默认 fail-closed,EGO_LINUX_LOGIN_IMPORT_FORCE=1才放行;彻底修复待独立设计。- 空闲回收后 Chrome 崩溃恢复复活全部旧标签(#67 止损):
--stop被 Chrome 记为 crash,Default/Sessions/残留会让下次冷启动静默恢复上一轮标签,而这些页面不在state.spaces中、pruneIdle/pruneAbandoned/--prune-spaces都扫不到。现在stopBrowser()在确认浏览器已停止(或本就没在跑)后清理Default/Sessions/;登录态在Network/Cookies,不受影响。 - 纯文本/JSON 标签页不再被光标覆盖层糊成"乱码":
renderOverlay()在document.contentType非text/html/application/xhtml+xml时不注入覆盖层,并清掉上一个文档残留的 host(本地 runtime 补丁,见runtime/PATCHES.md)。
变更
- CDP 预览帧默认宽度 960 → 1280:960 会把 1264 宽的常见笔记本视口先缩小再由面板放大,是"面板里文字发虚/发糊"的直接来源;1280 让常见视口落在原生宽度,更大屏幕可在设置页调到 1600/1920。
新增
--serve常驻传输层(PR #63,BeiWay1145,refs #56):CLI 新增 NDJSON 常驻模式,一次启动摊掉进程启动与 harness 加载开销(报告者实测 ~350ms → 后续请求 0–1ms 级)。本次只合并传输半边,默认仍走 spawn 路径;插件侧生命周期(spawn 策略/监督/设置开关/客户端重建)留待后续版本接线。
社区
v0.8.6 — 登录态导入安全加固 + DSH 0.1.7 设置适配 + 人机验证误报修复
[0.8.6] - 2026-09-28 — 登录态导入安全加固 + DSH 0.1.7 设置适配 + 人机验证误报修复
安全
ego_login_import不再可能损坏源浏览器 cookie 库(#61,数据丢失):旧流程用Browser.close优雅关闭无头源实例,其异步 flush(热 Profile 上 10s+)会晚于还原逻辑落盘——在 Edge 153 上把还原好的 cookie 库覆盖成空库,且第二次调用抓到的"备份"已是空库,兜底全部失效(报告者靠手工快照救回)。现在:① 拆除时丢弃 CDP 连接并强杀实例(被杀进程不会 flush,磁盘保持启动前状态);② 无条件还原并校验(重读加密标记计数,失败重试一次),备份文件保留供手工恢复;③ 若源浏览器期间重新出现(用户在用)则跳过还原,不与活写入者竞争。代价是用户下次真开浏览器会看到一次"未正确关闭"气泡——比静默丢数据划算。
修复
- 导入/落盘的返回值不再"假成功"(#60):
closedSource/restoredFromBackup补进输出 schema(严格宿主此前把每次成功导入判为 invalid output,而副作用其实已执行);读 cookie 的循环改为计数稳定后退出(旧逻辑"首次非空即停"在冷启动渐进加载时只读到 0-1 条却报成功);ego_auth_flush无错误时不再返回error: undefined(undefined 不是合法 JSON,整条结果被拒)。 - 写入落地改为服务端确认:
written旧值只是批处理算术,browser.json指向陈旧/被替换的实例时会"报成功但什么都没写"。现在每个 jar 写入后读回逐条比对;一条都没落地 = 硬失败并给出重启 agent 浏览器的指引。 - 隔离空间收不到导入的 cookie:
EGO_ISOLATE_SPACES=1时空间上下文是创建时从默认 jar 播种的快照(点时间拷贝,非实时共享),导入后已打开的 space 页面仍显示未登录。导入现在写入默认 jar 加task-spaces.json中所有活跃 space 上下文;某个上下文已消失时降级为警告而非使整体失败。 - 人机验证误报(#62):文本兜底匹配裸
captcha名词,任何讨论验证码的页面都会误报——包括渲染了本插件源码注释的本地 dashboard。现在:① 本机地址(loopback)不做文本探测;② 改为匹配挑战短语而非裸名词。选择器命中逻辑不变(真实 reCAPTCHA/hCaptcha/Turnstile/Cloudflare 容器仍立即上报)。worker 内的并行探针同步修改。 - DSH 0.1.7 设置保存后不再静默(0.1.7 forms 路径):适配后读路径切到了 loader 活配置,但没有任何变更订阅,
onChange()保存后零次触发——投屏 worker 的热推送只在下次 spawn 才看到新值(worker 常驻时永远看不到)。现订阅宿主settings/document-updated(forms 服务describe()后发出),一条订阅覆盖插件页表单与/ego/api/set网关两条写入路径,随插件 fiber 卸载。 --open在 Windows 上退出码为 1(#62):process.exit(0)在 CDP socket 仍在关闭时执行,触发 libuv!(handle->flags & UV_HANDLE_CLOSING)断言——窗口正常抬起但退出码非 0,按$LASTEXITCODE判断的调用方视为失败。现改为设置process.exitCode让事件循环自然退出,加 unref 的 3 秒兜底防句柄泄漏挂起。- 登录/验证提示的窗口名对不上(#62):Chrome 显示的是网页标题,按「ego lite — agent」在任务栏/Alt+Tab 都找不到。文案改为指引面板里已有的**「弹出窗口」按钮**(会置前,无头实例替换为同 Profile 有头窗口)。
新增
- DSH 0.1.7 设置页适配(插件页行配置):0.1.7 退役了可注册的 settings 命名空间与
settings.plugin.item槽。现于plugins.row.config注册配置视图(同时按@dsh-external/ego-browser与包名dsh-ego-browser两个 bundle 名注册,键为<bundle>#<rowId>),由宿主下发的ConfigPageForm渲染(保存走form.mutate(ops, revision)),偏好字段标记.volatile()并用宿主自己的 schemastery fork 构建 schema;≤ 0.1.6 保留旧设置卡片。0.1.7 上实机验证:行页渲染全部 18 个字段,保存即时生效,重启后保留。 - 「禁用画面回传」开关
disableFrameRelay(PR #55,HuanLinOTO):可选关闭实时帧回传(含/api/ego/stream的相应行为)。