Skip to content

qbot-dsh

Verified

@qqbrowser/qbot-dsh · v0.2.2 · Proprietary · Web UI

[English](README.md) | 中文

Install

dsh plugin add @qqbrowser/qbot-dsh

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Creators

Readme

@qqbrowser/qbot-dsh

English | 中文

qbot-dsh 是基于仓库内 pristine @deepseek-ai/dsh 基线的 QQ 浏览器产品启动器。它负责可执行入口、产品 profile 层、QQ 浏览器鉴权与模型网关、内容审核、产品网页搜索、模型设置快捷入口、产品政策界面、浏览器生命周期埋点和原生宿主启动协议。上游 dsh 包不引用产品代码,保持独立复用。

运行方式

launcher 会在加载 dsh 模块前将 DSH_HOME 默认设为 ~/.qbot-dsh;显式设置的 DSH_HOME 优先。profile 位于 $DSH_HOME/profiles。随包提供的 Web profile 依次组合 @deepseek-ai/dsh-base、@deepseek-ai/dsh-web-app、本包的 cordis.patch.yml,再叠本包的 cordis.patch.web.yml(web-runtime、connection、approval-auto-responder、ui-jsapi-bridge 四行覆盖,加上网页引用和 OAuth 连接器行);这一层只在组合了 Web bundle 的 profile 上叠加,因此 headless profile 不会带上任何需要 Web-only 服务的行。launcher bundle 内置 @tencent/[email protected],产品默认配置为 target: RPC.QBotDSH.Launcher、endpoint: https://galileotelemetry.tencent.com、namespace: Production 和 envName: formal;可发布和当前目标的完整归档都会携带它,无需单独安装 Profile 插件,也不依赖检出目录的 fallback。

Galileo 插件从 launcher 进程环境读取 IS_TENCENT_INNER_USER,作为 traces 和 metrics 的 innerUser 自定义属性。它保留传入的字符串,包括 0 和 false;未设置或为空时使用 unknown。模拟原生环境的 CLI 脚本会透传已提供的该变量。独立的 launcher 日志上报不包含此属性。

Galileo 的 traces 和 metrics 包含 launcher_version,启动时从 launcher 包 manifest 读取,并通过 DSH_QB_LAUNCHER_VERSION 传入。它与 qbot-dsh --version 及 launcher 日志字段一致;启动时会覆盖继承的环境变量值。详见版本上报决策。

Galileo 还会上报仅在启动时采集的 hardware 字符串,各值经过 URL 编码:CPU(第一个逻辑 CPU 的型号)、LCPU(逻辑核数)、MEM_GIB(总内存)、MEM_AVAIL_GIB(潜在可用内存)、CPU_PCT(整机 CPU 占用)、DISK_GIB 和 DISK_AVAIL_GIB(启动工作目录所在文件系统的总容量和调用者可用容量)。容量按 GiB 保留两位小数,CPU 占用按百分比保留一位小数。launcher 通过 systeminformation 读取内存可用量和 CPU 占用,通过 Node 内置接口读取 CPU 信息和文件系统容量。独立采集进程不接收 harness 凭证,限时五秒;部分采集失败或超时时保留已完成字段,缺失值使用 unknown。launcher 在 profile 启动前通过 DSH_QB_HARDWARE 提供快照,运行期间不刷新。它保留浏览器提供的 qua2,不查询 GPU,也不上报序列号、MAC 地址、硬件 UUID 或文件系统路径。这些字段随 traces 和 metrics 上报,不进入独立的 launcher 日志。

profile 准备过程通过上游包级 fallback healer 持有 $DSH_HOME/profiles/node_modules。它会在解析 bundle 层之前准备安装依赖闭包,再在组合完成后加入所选 profile 的 bundle 依赖闭包。如果托管安装提供了旧的整目录链接,首次准备 profile 时仅在该链接指向当前 launcher 依赖目录的情况下迁移;任何其他链接目标都会失败且不会被删除。

随包提供的 Web 名册包含标准、Code、极简和创造模式。创造模式保留标准 agent 能力、浏览器工具和产品随包技能,再增加实时 Cordis 检查、临时插件挂载以及内嵌的组合创作技能。只应在受信任的任务中选择它:实时运行时工具具有与 shell 访问相同的权限。

嵌入宿主持有 npm 和 Python 环境变量,并将包管理器状态放入 ~/.qbot-dsh 下的专用目录。在 workspace-write 模式下,launcher sandbox provider 仅允许受限 shell 和 terminal 进程写入该根目录下的 npm-cache、npm-logs、node-user、pip-cache、python-user、pycache 和 tmp,以及 QQ 浏览器 skill 根目录。skill 根不存在时由 launcher 创建:Windows 使用 %LOCALAPPDATA%/qqbrowser-skill,其他平台使用 ~/.qqbrowser-skill。$DSH_HOME/connectors(skill pack 与按需 CLI 前缀)和各 CLI 的登录目录(~/.config/wecom、~/.dws 以及 dws 的 file-DEK 目录)仍由 Host ensureConnectorAssets 和各 CLI 自己写入;沙箱既不创建也不放行它们。read-only 行为不变,进程内文件系统工具不会获得额外权限,也不会放行任何父目录或其他 Qbot 目录。产品 system prompt 要求 npm 全局安装、pip --user 安装、pipx 工具和因其他位置受限而改放的临时文件使用宿主已配置的 DSH 目录,使浏览器在卸载时能随 DSH 根目录一并删除。

当图片提示词被路由到明确的纯文字模型时,只有该 Agent 能看到产品注册的精确 image_recognition definition,Launcher 才会准入;definition 缺失、受限或被遮蔽时,通用层仍按默认规则拒绝。首次模型请求只接收持久附件占位符,由模型自行决定是否以及如何调用工具——Launcher 不会在该请求前识别图片。attachment_id 来源会先通过会话作用域授权读取,再进行 token 签发或网络访问;现有 path 与 image_base64 来源、OCR/caption 限制、token 重试和流式服务链路保持不变。支持图片的模型继续使用原生多模态链路,绝不会进入这一产品准入 hook。

qbot-dsh web
qbot-dsh --profile headless "task"
qbot-dsh --profile web --dump-config
qbot-dsh --version

--version 以无前缀的单行文本显示 launcher 包版本。

Web profile 还会把本包挂载为 client plugin。该插件添加「关于DSH」设置页,展示政策链接并提供卸载流程,渲染底部 AI 风险声明,在 compact 模式的「设置」下方渲染全屏和关闭控件,并调用嵌入页面提供的类型化 RPC 方法上报 dt_clck/new_session、dt_clck/send、dt_clck/session_feedback、ai_ask/ai_first_token、ai_ask/ai_reply_complete,以及执行 openFullscreen、close 和 uninstall。反馈上报包装共享的 messageFeedback Remote,只在评分或备注变更提交成功后上报,不根据 DOM click 或失败变更上报。RPC endpoint 负责固定目标 origin、source/origin 校验、ready 握手、请求关联、超时和销毁。调用只携带标识符和耗时,不包含消息正文。产品还会经宿主白名单内的 invokeJsApi RPC 多选已打开的浏览器标签,在输入框上方展示它们,并把每个已选标签的 id、URL 和标题追加到用户提示词;该功能不会发送网页正文内容。

评测专用的自动审批默认关闭;显式用户 patch、持久化权限默认值、验证方法和安全限制参见为评测配置自动审批。

插件

profile 的插件是声明了 dsh.bundle 的 npm 包;安装一个插件即把它的 patch 层加入 dsh.profile.bundles。两个入口都能管理插件,它们都用当前进程的 Node 可执行文件运行本包内置的 pnpm,因此 PATH 上不需要 pnpm、Node 或 git。

在对话中管理。 直接粘贴社区 README 里的安装命令,或用自然语言提出请求。agent 会调用 plugin_manage:它先展示将要执行的完整 pnpm 命令供用户确认,确认后安装进当前 DSH 正在运行的 profile。服务端部分立即生效;带浏览器界面的插件需要刷新一次页面,侧边栏会给出「刷新」提示条。更新会替换已经加载的代码,因此结果会说明需要重启——agent 会提示 harness_restart,仅在用户要求时调用,进程随后在本轮结束后退出,侧边栏察觉后自动拉起新进程并重新加载到它上面。插件对产品行(它自己没有插入的行,例如会话持久化行)的 patch 只在启动时生效:运行中的行保持 DSH 启动时的设置,结果会列出新设置等待重启的行——重新配置一个已挂载的行会重启它和所有依赖它的行。拒绝确认则不改变任何内容。插件市场那种复制粘贴式的安装提示词走的是同一条路:无论提示词把步骤写成什么样,agent 都把它路由到 plugin_manage,并在答复里说明哪一条流水线性质替代了哪一步。本产品不内置任何插件市场,因此这类提示词能装的只有它自己已经写死的 pinned 来源;写得再含糊一点,agent 就会停下来,请用户给出安装命令。它不会为安装去跑包管理器,也不会为安装申请沙箱提权——提示词诱导其中任何一项,恰恰是应当改走这两个工具的信号。

在终端中管理。 产品不安装 PATH shim,请用运行时自带的 Node 以绝对路径调用入口:

~/.qbot-dsh/runtime/node/bin/node ~/.qbot-dsh/app/node_modules/@qqbrowser/qbot-dsh/lib/bin.js \
  plugin --profile web add github:owner/repo#<sha>

所有 pnpm 动词原样转发,因此 add、remove、update、list 和 why 均可使用;pnpm 能解析的任何 spec 也都可用:registry 包名、github:owner/repo#<sha>、git+https://…、.tgz URL 或本地路径。运行中的 DSH 监视 profile manifest,因此终端安装同样会在其中生效;它的产品行保持启动时的设置,命令会列出变更要等到下次启动才生效的行。在同一台机器上工作的外部编码 agent 应当使用这条命令,而不是自己去调包管理器;命令行没有批准关卡,它装坏的层也只能经由启动时那条路径进入搁置。pnpm 的输出边产生边流到终端,命令也从这同一份输出归类失败:pnpm 拦下的构建脚本——包括 git 源包的 prepare——报为 pnpm_build,并给出重试所需的确切 --allow-build=<key>,与 plugin_manage 对它返回的报告一致。没有哪个类别能解释的失败报为 pnpm_other,并带上 pnpm 的错误行和失败脚本打印的最后几行,两种 reporter 下都如此,因此只展示命令最后几行的调用方——SkillHub 的市场就是——仍能看到原因。

状态隔离。 pnpm 的 store、cache 和 state 目录位于 $DSH_HOME/pnpm,通过命令行设置传入,优先级高于命令行中位于其前的任何写法。pnpm 准备 git 来源的包时,会以 shell 命令运行那个 checkout 自己的包管理器——checkout 带 pnpm-lock.yaml 时就是 pnpm install——所以每次操作还会在子进程 PATH 的最前面放一个 pnpm 命令,用同一份内置 pnpm、同一组设置运行;这个命令放在只属于这次运行的私有目录里,运行结束即删除,管线之外的任何 PATH 上仍然没有 pnpm。不会写入 ~/Library/pnpm、~/.npmrc 或 Harness home 之外的任何位置;卸载浏览器的 DSH 时插件随之删除。

镜像源。 取包时先尝试浏览器注入的 registry,然后依次尝试腾讯云、华为云和 npmjs 镜像;@tencent scope 始终从公司镜像解析。有两种失败会切换到下一个镜像:取包失败,以及 pnpm 因 git 源 checkout 的 lockfile 把 tarball URL 钉在它当初所用的 registry 上、而镜像的元数据不复述这些 URL 而拒绝它(ERR_PNPM_TARBALL_URL_MISMATCH)——那个 registry(对大多数 checkout 是 npmjs)能通过;其他失败按原样上报。镜像链和十分钟的操作超时是 plugin-manager 行的 registries 与 timeoutMs,可在 $DSH_HOME/cordis.patch.yml 中修改。

插件加载不了时。 启动时无法解析的第三方层会被搁置并记录在 profile manifest 旁的 dsh-quarantine.json 中,DSH 照常启动;该记录会在该层重新加载成功时自行清除。浏览器半边需要本安装的页面无法提供的模块的层——为另一个 DSH 版本构建的包——会在安装时和每次启动时、在运行中的 DSH 接纳它之前被搁置,报告会指出缺的是哪个模块;提供了该模块的产品更新会在下次启动时把该层收回。被运行中的 DSH 在激活时拒绝的层,以及连续两次启动都没有到达就绪状态之后的全部层,则一直搁置到该包更新或重装成功为止。上述每种情况都会在会话开始时告知 agent。更新或重新安装即可恢复,无需手工清理任何状态。

不内置插件市场。 本次发布不带任何插件市场,上面两个入口就是全部入口,侧边栏和模型都够不到任何目录。SkillHub 广场的定点副本仍然留在仓库里,由 src/embedded-skillhub.ts 中的 SKILLHUB_EMBEDDED 把守:关着的时候它一行组合都不出、一个字节都不发布,提示词里也不提它。怎么开、怎么关:四处改动,外加两套用例替你核对。

上报。 插件操作会作为一条 plugin_action 埋点事件转发给浏览器,携带操作类型、包名、版本、结果、失败分类和耗时——不包含 spec,因为 spec 可能指向私有仓库。浏览器扩展按事件名白名单接收,因此在白名单条目合入前该事件会被丢弃。

原生宿主协议

qbot-dsh --profile web --port 0 --native-protocol=jsonl-v1 会将 stdout 保留给一条启动记录。绑定成功后输出包含 loopback URL、端口和进程 ID 的 ready JSON 对象。嵌入宿主负责加载该 URL;launcher Web profile 不会把它交给外部默认浏览器。启动失败时输出错误码为 WEB_LISTEN_FAILED 或 WEB_STARTUP_FAILED 的 error 对象。其他进程输出会重定向到 stderr。

宿主 lifeline

嵌入宿主可以传入一条继承的可读 pipe,并把其描述符编号写入 DSH_HOST_LIFELINE_FD。pipe 关闭后产生的 EOF 会请求与中断信号相同的有界有序关闭。POSIX 宿主通常使用描述符 3;Windows Web 宿主可在组合没有 stdin 所有者时使用描述符 0。无效描述符只会告警并关闭 lifeline,不会让启动失败。

开发

正式发布包必须原样携带仓库的开源归属声明;参见发布必需文件与检查。

先在仓库根目录运行 pnpm run build,再通过 pnpm --dir apps/launcher run qbot-dsh -- <args...> 执行源码入口。pnpm --dir apps/launcher run release:pack 会在 apps/launcher/dist/npm 下构建可发布 tarball,产物包含固定版本的 pristine dsh 运行时和全部受支持目标的原生依赖。

连接器 skill 源码位于跟踪 master 的 skill-sources/deepseek-harness-skills submodule;只有 config/skills/qqbrowser-use 作为常驻产品 skill 随包发布。克隆主仓库后运行 npm --prefix apps/launcher run skills:setup,需要主动前移到最新源码提交时运行 npm --prefix apps/launcher run skills:update。联合修改先在 skill 仓库提交并推送,再在本仓库把 submodule 指针与 catalog 版本、摘要改动一同提交。skills:validate 校验 submodule 目录与 catalog pack 行完全对应。

pnpm --dir apps/launcher run publish:local 会保留增量构建产物,只组装托管 Node 运行时报告的目标,把不可发布 tarball 写入 apps/launcher/dist/local,并替换 ~/.qbot-dsh 下的包,即使产物版本没有变化。该模式保留 payload 审计,但不执行最高等级重压缩。添加 -- --release-equivalent 后会执行发布构建使用的 clean、三目标打包和压缩;添加 -- --skip-pack 后会复用当前模式选定的产物目录。pnpm --dir apps/launcher run publish <X.Y.Z> --yes 发布指定版本并推送对应 release 分支和 tag;详见发布流程。

pack 命令默认会从已组装 payload 中剪除 source map、类型声明和测试、示例类开发目录,保留其中的文档、注释和可读 JavaScript,且不生成 mapping 归档。传入 --minimize-public-payload 后,命令会剪除其余开发材料并压缩 JavaScript;发布 mapping 写入 apps/launcher/dist/mapping,当前目标的本地 mapping 则写入 apps/launcher/dist/local-mapping。

launcher 自有细节见架构与 DSH 边界、浏览器产品界面设计、完整包指南、QB 网关参考和模型路由搜索设计。