🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

应用启动胶囊 samorachumbi/dsh-app-launcher

DeepSeek Harness
samorachumbi34 天前有提交已提供中文文档扫描:未发现敏感能力

一键在独立系统窗口打开插件页面并显示存活状态

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add samorachumbi/dsh-app-launcher
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · ui
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 34 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 3 处,展示前 3 条)
  • 发起网络请求
    lib/client.js:62
    await fetch(target, { method: "HEAD", cache: "no-store" });
  • 发起网络请求
    lib/client.js:65
    await fetch(target, { method: "HEAD", cache: "no-store", mode: "no-cors" });
  • 发起网络请求
    lib/client.js:114
    const res = await fetch("/app-launcher/apps", { cache: "no-store" });
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 独立窗口打开插件页
  • 显示应用存活状态
  • 可拖拽药丸

可拖拽的 Apps 药丸,挂在 DeepSeek Harness shell 上:点一下就在独立系统窗口里打开宿主渲染的插件页,每个应用带一个存活状态点。

README

由 DeepSeek 最新模型翻译生成
dsh-app-launcher DeepSeek Harness shell 中一个可拖拽的 Apps 胶囊按钮。点击它,再点击一个应用,你的宿主渲染插件页面就会在它自己的操作系统窗口中打开——你可以把它拖到第二块屏幕、调整大小,然后留在那里。每个应用旁边的圆点显示它此刻是否正在响应。 为 DeepSeek Harness 0.1.1-rc.2 构建。 为什么会有这个 宿主渲染的 DSH 页面除了 URL 之外没有别的入口。这本来没什么问题,直到它出问题: - 你一直开着的标签页会随机器一起死掉。 在本地端口上提供服务的插件页面在重启之后就不在了,而一个指向虚无的书签看起来和坏掉的插件一模一样; - harness 不会给你任何提示。 没有 dock,没有徽标,没有状态——你只能点一下然后等着才知道; - “把它拖到第二块屏幕”是一套手动仪式,每个会话、每个页面都要重复一遍。 这个胶囊按钮就是缺失的那扇前门:页面只需一次点击,而一个没有响应的页面会在你点击之前就告诉你。
展开完整文档(README 剩余 1 节)
dsh-app-launcher

DeepSeek Harness shell 中一个可拖拽的 Apps 胶囊按钮。点击它,再点击一个应用,你的宿主渲染插件页面就会在它自己的操作系统窗口中打开——你可以把它拖到第二块屏幕、调整大小,然后留在那里。每个应用旁边的圆点显示它此刻是否正在响应。

为 DeepSeek Harness 0.1.1-rc.2 构建。

为什么会有这个

宿主渲染的 DSH 页面除了 URL 之外没有别的入口。这本来没什么问题,直到它出问题:

- 你一直开着的标签页会随机器一起死掉。 在本地端口上提供服务的插件页面在重启之后就不在了,而一个指向虚无的书签看起来和坏掉的插件一模一样;
- harness 不会给你任何提示。 没有 dock,没有徽标,没有状态——你只能点一下然后等着才知道;
- “把它拖到第二块屏幕”是一套手动仪式,每个会话、每个页面都要重复一遍。

这个胶囊按钮就是缺失的那扇前门:页面只需一次点击,而一个没有响应的页面会在你点击之前就告诉你。

安装

DEST="$HOME/.dsh/profiles/web/node_modules/dsh-app-launcher"
mkdir -p "$DEST"
cp -r lib package.json "$DEST"/

~/.dsh/profiles/web/cordis.patch.yml (append)
- insert:
- id: app-launcher
name: 'dsh-app-launcher'
config:
apps:
- label: Planner
url: /daily-progress-tab/ui
- label: Cost panel
url: http://127.0.0.1:3080/cost-bubble/panel

然后重启 harness。胶囊按钮会出现在左下角;在你配置至少一个应用之前,什么都不会出现。

不要使用 dsh plugin add——在 profile 里运行包管理器会实体化出第二棵 @deepseek-ai/dsh- 树,然后每次工具调用都会以 Cannot read properties of undefined (reading 'prepare') 失败。把文件作为真实文件复制进去,并注册那一行。完整的故事,以及恢复方法: How dsh plugin add bricked my profile。

配置

| 字段 | 它是什么 |
| apps[].label | 这一行显示的内容。保持简短;它同时也是窗口的名字,所以每个应用复用一个标签 |
| apps[].url | 要么是 harness 源上的路径(/my-page/ui),要么是另一个本地端口上页面的绝对 http(s) URL |

宿主在任何内容到达浏览器之前会强制执行的规则:

- 该路由仅限回环。 如果请求的 Host 不是 127.0.0.1、localhost 或 [::1],就会被
以 403 拒绝,并且只响应 GET。它不是秘密数据,但一个任何网页都能读取的未认证本地路由是一个指纹识别面,而这个路由会暴露你的应用和端口。
- URL scheme 是允许列表。 以 / 开头的路径,或 http(s) URL。javascript:、 data: 以及协议相对的 //host 值会被丢弃,而不是净化——客户端会把该值交给 window.open,因此丢弃条目是唯一安全的结果。
- 不可用的条目会在宿主端被静默丢弃。 没有标签、没有 URL,或 URL 过长的应用不会渲染成空白行。

工作原理

两部分,就像每个会绘制内容的 DSH 插件一样:

- 宿主(lib/index.js)注册一个路由 GET /app-launcher/apps,并返回配置好的列表。第三方客户端插件无法调用 Typert 远程接口,因此路由加 fetch 就是这种模式。
- 客户端(lib/client.js)通过 window.__ModuleLoader__ 挂载到 shell.overlay,获取该路由,并渲染药丸。存活状态是每 15 秒一次的 HEAD 请求:任何应答都算数——404 或 405 仍然意味着宿主在线,把它称为“离线”会教会你忽略那个圆点。
只有网络故障(连接被拒绝,例如重启之后)才会让它变灰。

点击一行会调用 window.open(url, "dsh-app-" + label, "popup=yes,width=1400,height=900,…")。
稳定的名称意味着同一个应用会复用它的窗口,而不是堆积标签页,而 popup=yes 会给出一个真正的窗口,窗口管理器可以将其移动到另一台显示器。这里刻意没有 noopener:目标是你自己的本地页面,而丢掉名称会破坏这种复用,正是这种复用让它感觉像一个应用而不是浏览器。

自己验证

node scripts/probe.mjs

三层共 23 项检查:通过真实的 apply() 驱动路由(包括上面的拒绝情况),在真实的 cordis Context 上挂载,这样错误的服务名会在这里失败而不是在启动时失败,以及针对桩 __ModuleLoader__ 评估客户端 bundle——这证明它能解析、能命名自己并注册到 shell.overlay。

探针无法证明的是任何东西会渲染,或者点击会打开窗口。两者都在真实浏览器中验证过,数字在这里,而不是一句声称:

- 药丸渲染在左下角:position: fixed、left: 16、z-index: 2147482000——刻意低于成本药丸的 2147483000——并且面板在被点击前不包含任何行;
- 存活状态,在同时配置两个应用的情况下测量:有应答的那个报告
data-alive="up",圆点为 rgb(34, 197, 94);一个指向无人监听端口的应用
报告 data-alive="down",圆点为 rgb(107, 114, 128);
- 在药丸上、然后在行上进行一次真实的鼠标点击(不是 JS .click()),产生了一个新的浏览器
页面目标——["…/daily-progress-tab/ui", "…/"]——所以该应用确实在自己的窗口中打开,
并且 window.open 返回了一个窗口而不是 null。

复现点击测试需要一个能派发真实输入的驱动:JS .click() 不是用户激活,因此窗口会被阻止,一个正常工作的按钮会被报告为损坏。这个区别就是解释最后一个陷阱为何存在。

陷阱

- 两个浮层争夺同一个角落。 这个胶囊故意位于底部左侧,且 z-index 低于费用胶囊:如果它们发生重叠,报告金额的那个胜出。
- 仪表盘页面不是应用。 如果你的页面需要 harness 会话,它在弹出的窗口中无法工作——该窗口没有自己的会话上下文。这适用于承载自身状态、由宿主渲染的页面,而插件页面正是如此。
- 窗口位置由浏览器记住,而不是由插件记住。 只要窗口处于打开状态,位置和大小就会保留;重新打开时会使用配置的大小。
- setPointerCapture 会抢走嵌套元素的点击——这一点坑了我们。 胶囊捕获指针以便拖动,而被捕获*的指针会把随后的 click 派发给捕获元素。因此,对应用行的点击被派发给了胶囊:面板切换为关闭,window.open 从未被调用,而处理函数本身没有问题。现在,从面板内部开始的按压已被排除在拖动之外(closest("[data-app],[data-panel]"))。这是通过真实鼠标操作发现的;用 JS 的 .click() 会报告该按钮工作正常。

与我合作

我构建并审计 DeepSeek Harness 插件——包括客户端部分,也就是这个胶囊所演示的部分:一个挂载到 shell 中的真实 UI,由插件自己的宿主部分提供服务。

- 插件构建——宿主路由加客户端 UI,安全安装,并支持回滚
- 插件审计——先给结论,针对固定提交给出 file:line 级别的发现
- 配置救援——reading 'prepare' 崩溃,已恢复并记录在案

可接单——在本仓库开一个 issue,或通过我的 GitHub 主页联系我。

我的其他作品:dsh-cost-bubble(一个实时 $ 胶囊)以及 dsh-daily-progress-tab(一个带 agent 工具的规划器)。

许可证

MIT——见 LICENSE。
预览分享卡片长什么样 ↓samorachumbi/dsh-app-launcher
分享 · DeepSeek Harness Hub
samorachumbi/dsh-app-launcher

一键在独立系统窗口打开插件页面并显示存活状态

回到顶部