Skip to content

fix(dsh): use native sidebar with floating fallback - #236

Merged
iuyo5678 merged 1 commit into
mainfrom
fix/dsh-native-observation
Sep 15, 2026
Merged

iuyo5678 merged 1 commit into
mainfrom
fix/dsh-native-observation

Conversation

@iuyo5678

Copy link
Copy Markdown
Collaborator

问题与结果

BrowserSkill 的观测入口此前依赖 better-sidebar 的布局快照和标签打开语义。better-sidebar 0.19 将右栏交给 DSH 原生实现后,这些假设失效:缺失的布局树可能引发渲染异常,观测标签使用的占位 path 会被当作真实文件打开,原生标签状态也无法从旧布局树正确判断,导致错误标签反复出现。

本 PR 将观测入口直接接入 DSH 原生右栏,并保留悬浮窗兜底。例如,当前会话开始浏览器任务时,会打开正常的 Browser Skill 页面标签;不会再尝试读取名为 browser-skill:observation 的文件。

关联:#233#232#229#228

**范围说明:**本分支基于 main5241450,其中 #231 已补充缺失 splits 的空值保护。本 PR 在此基础上移除旧接入及其布局树遍历,解决剩余的标签打开、状态判断和故障兜底问题。#228 另外提到的 browser_tabs 等工具重名注册冲突未在本 PR 中处理,因此此处使用关联链接,不自动关闭全部 issue。

用户可见行为

场景 修改后的行为
原生右栏服务和插槽可用 默认使用原生 Browser Skill 标签
未安装 better-sidebar 无需额外安装;原生右栏可用时正常使用,否则显示悬浮窗
已安装 better-sidebar BrowserSkill 直接使用原生右栏,better-sidebar 的底部面板可继续使用
原生能力缺失、注册或导航失败、首次挂载超时 回退到悬浮窗
原生观测内容或宿主标签 hook 抛出渲染异常 由插件自己的错误边界处理,并切回悬浮窗
用户手动切换显示位置 支持 Use floating viewMove to sidebarShow here;选择仅存在于当前页面内存中,刷新后重新按自动模式选择
用户关闭观测标签,或切换到其他标签 普通截图、动作更新和切回原会话不会反复抢占或重新打开标签;可从原生右栏开始页重新打开

自动打开按 DSH 会话记录:当前会话有归属自己的浏览器会话时触发;全部相关浏览器会话结束后,新一轮任务可以再次触发。原生标签显示当前会话及其子代理的浏览器,悬浮窗延续显示本插件实例管理的全部浏览器会话。

实现与故障处理

  • 通过可选的 sidebarRight / sidebarRightTabs 服务注册页面类型及正文、标题插槽;删除对 betterSidebar 服务、splits / bottomSplits / panelOpen 等内部布局字段和占位文件路径的依赖。
  • 使用 openTabIn(sessionId, kind) 明确指定目标会话,避免会话切换期间操作上一会话仍挂载的右栏。订阅通知通过微任务调度导航,避免同步通知重入。
  • 原生会话存储尚未就绪时,首次打开最多尝试 4 次,间隔 250 ms;正文或标题挂载即确认成功。持续未挂载则回退悬浮窗,会话切换、手动切换或卸载会取消待处理请求。
  • 每个 observation store 独立持有页面内的显示状态,替代原来的模块级布尔标记。原生注册失败会回收已完成的注册,卸载时释放订阅、定时器和观测流引用。
  • 原生标签的可见性参与截图需求判断;保留既有的会话选择、固定、Interrupt、Stop 和画中画功能。

主要改动位于 packages/dsh-plugin-browserskill/src/client/observation-sidebar.tsx、新增的 observation-presentation.ts 和现有 ObservationOverlay.tsx,并更新相应测试和文档。没有新增必需运行时依赖,也没有修改浏览器工具定义、执行流程、观测 HTTP 协议或会话归属规则。

验证结果

验证对象:提交 934a73b

验证 结果
插件完整 Vitest 测试 14 个测试文件、238 项测试通过
TypeScript 类型检查 通过
插件 host/client 构建 通过
修改文件的 Biome、CSS Stylelint、git diff --check 通过
构建包 publint 通过
真实 DSH Web,不安装 better-sidebar 自动打开原生标签、手动双向切换、关闭后收到更新仍不重开、开始页恢复入口均已验证
真实 DSH Web,安装 better-sidebar 0.19.1 BrowserSkill 原生观测标签正常显示,better-sidebar 底部终端面板可同时打开
本地安装包验证 两种 profile 均成功启动,客户端启动页包含预期插件,/bsk-observation/state 正常响应;安装包内容与该提交的构建一致

回归测试覆盖有/无 better-sidebar、有/无原生能力、插槽延迟出现与撤销、部分注册失败、延迟挂载与超时、切换会话、关闭标签后的更新、手动切换不持久化、内容与控制按钮的会话范围、隐藏标签的截图需求,以及原生 hook 抛错后的可用悬浮窗。

可从仓库根目录复跑主要检查:

pnpm --filter @wxg-prc-cpg/browser-skill-dsh-plugin build
pnpm --filter @wxg-prc-cpg/browser-skill-dsh-plugin exec tsc --noEmit
pnpm --filter @wxg-prc-cpg/browser-skill-dsh-plugin exec vitest run

**验证边界:**真实界面测试在 macOS 上进行,DSH CLI 为 0.1.5-rc.1,实际加载的 Web/原生右栏组件为 0.1.5-rc.2;观测数据来自本地测试夹具。没有在报告问题的 Windows/Linux 环境复测,也没有把该测试表述为真实模型驱动浏览器任务的完整端到端验证。原生能力缺失和故障注入主要由自动化测试覆盖。

兼容边界与评审重点

  • **显示位置有意调整:**不保留旧的 better-sidebar 底部观测集成,不迁移或清理旧标签数据。已有布局中残留的旧 BrowserSkill 标签可能需要手动关闭;新的观测入口按上述规则工作。
  • 宿主契约:openTabIn 来自 DSH 0.1.5 导出的右栏控制器,并不属于较窄的 ISidebarRight 接口。实现使用结构化能力检测,没有静态导入该包;未来宿主改动该契约时仍需复核兼容性。兜底不是对所有第三方插件异常的全局保证。
  • **故障与生命周期:**请重点检查可选服务的注册/撤销、会话切换期间的导航目标、有限重试、错误边界,以及关闭标签后不会因观测刷新再次打开的行为。
  • **发布:**本 PR 没有修改版本号或发布 npm 包。合并后仍需按正常流程发布新版,已安装 npm 0.2.1 的用户才会收到修复;本地验证使用的是该提交的构建包。

建议在合并前补做 Windows 或 Linux 上的实际浏览器任务验证,尤其是首次打开、会话切换,以及安装 better-sidebar 时的共存场景。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants