Repository navigation
Releases: drscrewdriver/dsh-browser-cdp
Release list
v1.6.0
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 typecheckEXIT 0;npm run test866 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
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 typecheckEXIT 0;npm run test861 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.jsSHA256 与本地构建逐字节一致。
Release backfilled on 2026-10-22 from git tag + CHANGELOG history.
v1.4.1
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:trueopt-in,结果附recoveredFrom(正常路径为null)。
测试
- 新增
runWithTabRevive5 条(tab-stuck 特征识别、恢复一次打标记、正常路径单次 spawn 不复活、非 tab 失败不复活、硬上限一次不循环)。全量 832 passed / 12 skipped,两套tsc通过,tsdownbuild 过,schema 预算门绿。
Release backfilled on 2026-10-22 from git tag + CHANGELOG history.
v1.3.2
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
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
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 skillv2.1.0(550 行,ego lite 0.6.0.16)。- README 补
useSdkPath/--sdk-path语义与「双 API 面共存风险」(插件taskSpaces.*vs 官方taskSpace())。
验证
- 全测 779 passed / 12 skipped;两套
tsc通过;tsdownbuild 过。
Release backfilled on 2026-10-22 from git tag + CHANGELOG history.
v1.2.3
v1.2.2
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
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 线(声明式设置)
面向 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。