Skip to content

Releases: drscrewdriver/dsh-browser-cdp

v1.6.0

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.6.0

默认行为变更:会话隔离成为默认。 一个 bcdp_* 调用省略 space 时,不再落到跨会话共享的 default,而是落到本会话自己的任务空间 dsh-agent-<会话id前8位>;只有显式写 space: 'default'(或 op=open name='default')才使用共享具名槽。

变更:默认任务空间改为按会话派生

  • resolveConfig 中 defaultSpace 的空值折叠目标由 'default' 改为 ':auto':不配置即为会话隔离,无需额外开关。
  • deriveSlotDefaultName 取消 isolateSpaces 门::auto 在持久模式与沙箱模式下都派生 dsh-agent-<sid8>。空间命名与 isolateSpaces(只管 Profile 落盘 vs 内存沙箱)是两条独立的轴,此前把两者绑死,导致「持久模式下配 :auto 也永远得到 default」。
  • 显式 space: 'default' / op=open name='default' 仍完全可用:该会话随后固定用这个共享槽。把 defaultSpace 设成具名值(如 default)可全局退回旧行为。
  • 无 session 的调用(__global__ 槽)仍回落 default,向后兼容。

修复:真实 DSH 会话 id 会塌缩成同一个空间

  • 旧派生用 sessionKey.slice(0, 8)。真实 DSH id 形如 session-52adc205-3251-…,前 8 位恒为字面量 session-,于是所有会话撞进同一个 dsh-agent-session- 空间,隔离在无声中完全失效(不报错,只是共用上下文)。
  • 新增 sessionSpaceToken():先剥掉 session- 前缀、去掉非 [A-Za-z0-9-] 字符,再取 8 位;短 id 原样使用(仍唯一);退化/空 id 用 FNV-1a 哈希兜底保证非空。
  • 补 5 条回归测试:真实 id 正确分离(session-52adc205-… → 52adc205)、两会话 token 不同、永不返回裸前缀 session-、短 id 原样、token 合法且 ≤8 位。

文档与描述

  • bcdp_space 描述改为教新默认语义:省略 space = 本会话空间;要共享才显式传 default。
  • Config.defaultSpace 的 schema 描述同步;README 的「任务空间命名与并发隔离」小节重写为 1.6.0 口径,附「你怎么写 → 落到哪个空间」对照表,并记录 session- 塌缩这个坑。

迁移指引

  • 无需任何操作:默认即隔离。
  • 想维持「所有会话共用一个空间」的旧行为:把 defaultSpace 设为 default,或在调用里显式 space: 'default'。
  • 注意:会话空间是按会话命名的命名空间,不是「每个会话独立 Cookie」。是否把登录态落盘仍由 isolateSpaces 决定;Profile 持久模式下登录态依然跨重启保留。

验证

  • npm run typecheck EXIT 0;npm run test 866 passed / 12 skipped(878)(较 1.5.0 的 861 增 5 项 token 回归);npm run build 三 bundle complete。
  • 确认 profile / 设置存储中无持久化的 defaultSpace 残留,新默认会生效(~/.dsh 全量扫过,命中均在记忆库与会话缓存,非插件配置)。

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.5.0

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.5.0

破坏性变更:工具面三族合并(计划组 bcdp-tool-consolidation)。wait / space / escape 三族按 op 收口,工具数 41 → 34,全量 schema 24,093 → 22,224 字符(净省 1,869,天花板 24,094 未上调)。旧工具名直接移除,不保留薄别名——别名同样占 schema 预算,保留等于没省。迁移表见 README「1.5.0 迁移表」。

移除(破坏性):8 个旧工具名

  • bcdp_wait_for_selector / bcdp_wait_for_url / bcdp_wait_for_response / bcdp_wait_page → 并入 bcdp_wait 的 op=selector|url|response|load|function|request|event。
  • bcdp_space_open / bcdp_space_close → 并入 bcdp_space 的 op=open|close(原有 op=list|handoff|takeover 不变)。
  • bcdp_cli → 并入 bcdp_script 的 verbatim:true(裸 heredoc、无 preamble、返回含 output 合并文本)。

变更:三族为何可合(同源证据)

  • wait(5 → 1):五个工具共用同一 useSpace(...) + ensureRealTab() preamble、同一 timeout 语义、同一 space 参数;bcdp_wait_page 本身已是 op 多动作形态,合并是把既有范式用完,不是新范式。
  • space(3 → 1):bcdp_space 本就是 op 工具(list/handoff/takeover),open/close 只是没并进去。
  • escape(2 → 1):bcdp_cli 与 bcdp_script 是同一 heredoc 运行时,唯一差异是 preamble(script 先选空间 + 激活真实 tab)。

修复:空间追踪的分派基准随合并调整

  • 共享 t() 包装器的 afterExecute 原按工具名分派 tracker(bcdp_space_open → spaceTracker.opened、bcdp_space_close → spaceTracker.closed)。三族合并后工具名不再携带动作信息,改为按 args.op 分派。若不改,活动空间追踪会静默失效(不报错、只是状态不对)。已补三条单测直接观察该唯一用户可见效应(后续调用解析到的默认空间)。

保留的守卫(逐字未动)

  • op=function 仍用 safeEvalWrap(expr, true)(preserveFalsy)——否则 DOM/window 返回值会撞 SDK 的 Object reference chain is too long。
  • timeout 默认值分档不变:普通 op 10,000ms、页面级 op(load/function/request/event)30,000ms。
  • 各 op 的失败均可归因:reason 带 op 名(如 bcdp_wait: selector is required for op=selector),不退化为裸 ok:false。
  • handoff 后同脚本不碰 page.* 的硬停(P0-5)、ensureRealTab、attachSessionHint 全部保留。

变更:默认注入面更窄

  • lazy 默认档下不碰浏览器的会话在场工具 10 → 7(core 6 + escape 1 = 4,978 字符 ≈ 1,430 token);always 全量 34 件 = 22,224 字符。
  • core 批次 8 → 6、wait 批次 5 → 1、escape 批次 2 → 1。

文档

  • 6 个 README(README.md + de/es/fr/it/ru)工具表、分级表、注入面实测值、core 计数全部同步;主 README 新增「1.5.0 迁移表」。
  • help.ts 工具清单与 navigate / wait / network / script 四个 topic 改为合并后口径。

验证

  • npm run typecheck EXIT 0;npm run test 861 passed / 12 skipped(873)(三族合并新增 11 项断言);npm run build 三 bundle complete。
  • 全量 schema 门:34 工具 / 22,224 字符 ≤ 24,094(实测落值,非估算)。
  • npm pack --ignore-scripts 出 dsh-browser-cdp-1.5.0.tgz,解包 lib/index.js SHA256 与本地构建逐字节一致。

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.4.1

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.4.1

空间命名与并发隔离加固(计划组 bcdp-space-ns-hardening,A/B/C/D1/E/F/G)。按风险分级落地,SDK 快照编号生成逻辑(D3)不在本轮改,以 D1 插件层解法替代。

新增(A):可配置默认空间

  • Config.defaultSpace(zod .volatile() 标量):空值折叠为 DEFAULT_SPACE='default',热更新无需重注册。resolveConfig 出的字段与运行时活值分离——cfg.activeSpace 是当前会话槽的实时值,cfg.defaultSpace 是配置/schema 值,避免二者撞名引发的 EgoRuntimeConfig ↔ ResolvedConfig 结构镜像类型断裂。

新增(B):会话级空间隔离

  • createSessionSpaceTracker + GLOBAL_SESSION_KEY='__global__':把单一 ActiveSpaceTracker 升级为按 sessionId 键控的 Map<string,Slot>,SessionSpaceTracker extends ActiveSpaceTracker 增 setCurrentSession / currentSession。每个 bcdp_* execute 顶部先 cfg.spaceTracker.setCurrentSession(callingSessionId(exec)),并发多会话各开各空间互不漂移;无 session 调用落 __global__ 槽保持向后兼容。

新增(C)::auto 派生名

  • AUTO_SPACE_SENTINEL=':auto':沙箱模式(isolateSpaces:true)下默认名派生为 dsh-agent-${sessionId.slice(0,8)}(AUTO_SPACE_PREFIX='dsh-agent-',沿用历史前缀);持久模式折叠为具名单槽。

变更(D1):跨调用稳定定位

  • bcdp_snapshot 三处 snapshotRaw 统一带 includeStableLocator: true,输出含 loc=css:/loc=role:/loc:href: token;subtree 解析优先 loc=(跨子进程稳定)而非 @N(每次快照重编)。零 SDK 改动,活体验证:bcdp_click 吃 loc=... 命中。schema 预算门(≤+15%)以压缩描述守住,未放宽天花板。

修复(E):页内返回值防御序列化

  • safeEvalWrap(expr, preserveFalsy):根因是 SDK 自身 handleMessage 序列化在 page.evaluate 返回 DOM/window 时抛 Object reference chain is too long(硬拒在 SDK 内层,早于任何外层 safe()),故修复必须在页内完成。bcdp_wait_page op=function 与 bcdp_js 套同款返回值降级包裹,返回 window/DOM 时 ok:true 且 value 为描述串。

修复(G):heredoc 错误引导

  • attachSessionHint / ATTACH_SESSION_HINT:bcdp_cli / bcdp_script 错误含 no active tab to attach session 时追加一行「先 await taskSpaces.useOrCreate(name)」引导,把裸 heredoc 缺 preamble 的坑点名给出,不留模型重新踩。

新增(F):navigate 卡死自愈 watchdog

  • runWithTabRevive + isTabStuckFailure(TAB_STUCK_RE):复刻 runWithStaleSpaceRetry 骨架但换触发条件为 eval 超时 / no active tab / 主线程挂死特征,复位动作为先开新空白 tab 再关挂死 tab(顺序关键:先关会触发末-tab 守卫留下死 tab),重试硬上限一次,二次仍卡如实返回不循环(拒绝假绿)。bcdp_navigate 经 tabRevive:true opt-in,结果附 recoveredFrom(正常路径为 null)。

测试

  • 新增 runWithTabRevive 5 条(tab-stuck 特征识别、恢复一次打标记、正常路径单次 spawn 不复活、非 tab 失败不复活、硬上限一次不循环)。全量 832 passed / 12 skipped,两套 tsc 通过,tsdown build 过,schema 预算门绿。

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.3.2

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.3.2

fix(1.3.2): parse a pretty-printed payload; never invent one from prose

No CHANGELOG section found for this version; notes auto-derived from the tag commit message.

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.3.1

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.3.1

fix(1.3.1): bcdp_script/ bcdp_cli reported success as failure

No CHANGELOG section found for this version; notes auto-derived from the tag commit message.

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.2.4

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.2.4

修复(P0)

  • --sdk-path 贯通到工具执行:此前只有探测路径带 --sdk-path,runEgoScript 拼 argv 时不带,ego-cli + useSdkPath: true 下每个脚本首行都崩 ReferenceError: taskSpaces is not defined。现在 AttachState.sdkPath 记录探测实际用过的 harness,buildEgoToolArgv() 统一为探测与执行构造 argv。写入条件带 R-1 守卫(useSdkPath && probe.warning === undefined):CLI 不认该旗标并回退时,执行侧不会强塞一个它不认的参数。

修复(P1)

  • bcdp_status 改 facade 探针:不再 spawn 官方 CLI 不存在的 --status,改为与干活同通道的 nodejs 探针,检查 taskSpaces/browser/page 三个 facade;输出新增 facades 字段,超时 25s → 15s(实测约 300ms)。
  • 就绪探针不再假阳性:useSdkPath 打开时,除 sentinel 外还要求 taskSpaces/browser 均为 object;未打开时保持原判据,vendored runtime 不受影响。
  • --open / --stop 按 link kind 门控:ego-cli 下浏览器本就可见,--open 直接返回成功;空闲回收与卸载清理绝不对用户自己的 ego lite 发 --stop(三处均带明确日志)。

变更(P2)

  • bcdp_space_close 从 browse 归入 core,与 bcdp_space_open 配对。
  • Schema 压缩:按 AST 实测成本压缩 Top 工具(login_import / jev_ask / http / download / click / jev_run / jev_attempt / wait_for_selector / key / read_element / wait_for_response),全量 22,836 → 18,834 字符(-17.5%)。测量口径见 ego-browser-cdp-issues.md §9.0。
  • browse 注入批次:内部按 act → observe → wait 顺序放行,对外仍是 4 个开关;always 模式不受影响。

文档

  • runtime/skills/ego-browser/SKILL.md 更新为官方 ego-browser skill v2.1.0(550 行,ego lite 0.6.0.16)。
  • README 补 useSdkPath / --sdk-path 语义与「双 API 面共存风险」(插件 taskSpaces.* vs 官方 taskSpace())。

验证

  • 全测 779 passed / 12 skipped;两套 tsc 通过;tsdown build 过。

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.2.3

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.2.3

fix(1.2.3): issue #1 + #2 — login_import schema fields, import error typing, family-host uSES crash backstop

No CHANGELOG section found for this version; notes auto-derived from the tag commit message.

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v1.2.2

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v1.2.2

  • hosts: 追加 0.2.1-rc.2 声明面枚举(34/34 @deepseek-ai/* 宿主 peer 逐包 npm 实测 rc.2 在版;本插件不触 ctx.web provider 与 conversation.input.model.label 槽,代码零改动,纯元数据发版;农场 rc.2 格挂账待命)

⚠️ 0.18.10 已被 registry 烧号:npmjs 受理后长期停留在 staged 状态从未提交(读路径 404、重发 EPUBLISHCONFLICT: previously staged),版本号永久不可安装——安装请用 0.18.11(内容 = 0.18.10 全部 + dock 注册诊断 __dshBrowserCdpDeco + locale 补齐 + 点选卡片正则放宽)。0.18.5 同前例。


Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v0.18.0

Choose a tag to compare

@drscrewdriver drscrewdriver released this 22 Oct 12:28

v0.18.0

新增

  • render worker captureWithinBudget 实现(0.2.0 线修复真机阻断):bin/cdp-render-worker.mjs 的 capture 此前调用一个从未定义的函数(真机链路 capture 必挂,且被门控探针掩盖)。现实现 JPEG 质量阶梯(72 起步、步长 12、下限 24,超预算如实上报 overBudget)+ scale.maxWidth 几何降采样 + PNG/无预算单发路径;data 以 base64 回传供 JEV 判定链消费。真机实测:Chrome/153 实连,预算一次达标(attempt 1, q=72)。
  • client 半 noImplicitAny 开启:tsconfig.client.json 升 noImplicitAny: true,401 处 implicit-any 全部显式化(scripts/fix-implicit-any.mjs 位置精确 codemod + 手工收尾);类型注解零运行时影响,client-input.test.ts 源码正则同步。
  • 门控探针真机启用:remote CDP 探针(4/4)与 render 探针(1/1)对本机真实 Chrome/153 实跑通过——discovery→attach→inspect→input→binding 回环 + 截图预算链路。cli-probe 与 login-import e2e 绑 vendored Linux 运行时,维持门控(本机 N/A)。

变更

  • peerDependencies 换代(替换式):六项 @deepseek-ai/dsh-client-locale / dsh-client-store / dsh-client-ui-settings-plugins / dsh-client-ui-slots / dsh-settings / dsh-tools 由 >=0.1.7-rc.1 <0.1.8-0 → >=0.2.0-rc.1 <0.2.1-0;0.1.7 线由 0.17.x 冻结续服,DSH 0.1.2-rc.1 ~ 0.1.7 请用 0.17.x。
  • engines.dsh 两处同步:顶层 engines.dsh 与嵌套 dsh.engines.dsh 均换代至 >=0.2.0-rc.1 <0.2.1-0(运行时门只读 peer,元数据保持一致)。
  • devDependencies 换代:@deepseek-ai/dsh-tools 与 @deepseek-ai/dsh-sandbox 由 0.1.7 线 → >=0.2.0-rc.1 <0.2.1-0,typecheck 据此解析 0.2.0 宿主类型——「全绿」证明的是 0.2.0 兼容而非 0.1.7 残留。
  • 零代码依据:0.2.0 的 composer/forkSession 为向后兼容签名扩展,本插件经 ctx.get('conversation').input 门面投递选区(不调 submit()、不 override 契约),不在影响面内。
  • README 徽章/版本兼容矩阵/适配说明改写为 0.2.0 口径。

验证

  • 双 tsconfig typecheck + build + vitest(656 passed / 11 skipped)针对 dsh-tools@0.2.0-rc.1 全绿;npm ls 无 invalid / peer 冲突。

其他

  • dsh-plugin.json 版本 0.17.0 → 0.18.0(该字段此前落后于 package.json,本版一并拉齐)。
  • 依赖树由 npmmirror 全量重建,package-lock.json 重新生成提交。

Release backfilled on 2026-10-22 from git tag + CHANGELOG history.

v0.17.4 — DSH 0.1.7 线(声明式设置)

Choose a tag to compare

@drscrewdriver drscrewdriver released this 26 Sep 15:19

面向 DSH 0.1.7-rc.1+ 的当前版本线(npm latest / dist-tag dsh-0.1.7)。

0.17.x 线要点

  • 声明式设置:插件不再注册设置节,改为 Config .volatile() 字段由宿主设置页自动生成表单,变更经 loader/volatile-update 热生效(兼容提交 da045b8)。
  • 插件族共用设置 tab:设置卡加入「起子插件设置」共享席位,0.17.4 起全量渲染 Config 用户可调 volatile 字段(基础 / 截图与推流 / 评审三组,内联中英文案)。
  • 能力网关:仅保留 runtime 路由(67dabb8)。
  • 含 stage 9(本机 ego CLI 连接类型)与 stage 10(JEV/Laya 评审管道)成果。

DSH 0.1.2-rc.1 ~ 0.1.6 请使用 0.16.x 线;完整历史见 CHANGELOG.md。