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

逗沙包 tianye1999/dsb

DeepSeek Harness
tianye19995 天前有提交已提供中文文档扫描:含敏感能力

让 AI 在手机后台虚拟屏替你操作 App 并审计

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 5 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 46 处,展示前 43 条)
  • 读取密钥环境变量
    bridge/bridge.mjs:48
    const MAX_TOKENS = Number(process.env.BRIDGE_MAX_TOKENS || 1600);
  • 执行外部命令来自配置/变量
    bridge/bridge.mjs:143
    const p = spawn(DSH, ['--profile', PROFILE, prompt], {
  • 发起网络请求
    bridge/bridge.mjs:173
    const res = await fetch(API, {
  • 执行外部命令来自配置/变量
    bridge/bridge.mjs:278
    const child = spawn(DSH, ['--profile', RUNTIME_PROFILE], {
  • 执行外部命令来自配置/变量
    bridge/fake-dsh-test.mjs:10
    const descendant = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { stdio: 'ignore' });
  • 执行外部命令固定命令
    bridge/sdk-memory-test.mjs:5
    const child = spawn('dsh', ['--profile', 'phone'], { cwd: '/root', env: { ...process.env, DSH_PERMISSION_MODE: 'danger-full-access' }, stdio: ['pipe',
  • 执行外部命令固定命令
    bridge/sdk-persist-test.mjs:13
    const child = spawn('dsh', ['--profile', 'phone'], { cwd: '/root', env: { ...process.env, DSH_PERMISSION_MODE: 'danger-full-access' }, stdio: ['pipe',
  • 执行外部命令固定命令
    bridge/sdk-test.mjs:7
    const child = spawn('dsh', ['--profile', 'phone'], {
  • 执行外部命令来自配置/变量
    bridge/task-report-store.mjs:155
    const child = spawn(this.python, [this.script, '--audit', this.audit, '--ledger', ledger,
  • 执行外部命令来自配置/变量
    bridge/test-cancel.mjs:48
    const child = spawn(process.execPath, [path.join(here, 'bridge.mjs')], {
  • 发起网络请求
    bridge/test-cancel.mjs:58
    const post = (route, body = {}) => fetch(base + route, { method: 'POST',
  • 发起网络请求
    bridge/test-cancel.mjs:72
    try { return (await fetch(base + '/health')).ok; } catch { return false; }
  • 发起网络请求
    bridge/test-cancel.mjs:74
    return { post, health: () => fetch(base + '/health').then(r => r.json()), events, logs: () => logs,
  • 执行外部命令来自配置/变量
    bridge/test-error-privacy.mjs:20
    const child = spawn(process.execPath, [new URL('./bridge.mjs', import.meta.url).pathname], {
  • 发起网络请求
    bridge/test-error-privacy.mjs:38
    try { if ((await fetch('http://localhost/health')).ok) break; } catch {}
  • 发起网络请求
    bridge/test-error-privacy.mjs:43
    const response = await fetch('http://localhost/ask', { method: 'POST', body: JSON.stringify({
  • 发起网络请求
    bridge/test-error-privacy.mjs:51
    const cancel = await fetch('http://localhost/cancel', { method: 'POST', body: JSON.stringify({
  • 发起网络请求
    bridge/test-error-privacy.mjs:55
    const runtime = await fetch('http://localhost/do', { method: 'POST', body: JSON.stringify({
  • 执行外部命令来自配置/变量
    bridge/test-restart-audit.mjs:62
    const child = spawn(process.execPath, [path.join(here, 'bridge.mjs')], {
  • 发起网络请求
    bridge/test-restart-audit.mjs:72
    try { return (await fetch(base + '/health')).ok; } catch { return false; }
  • 发起网络请求
    bridge/test-restart-audit.mjs:77
    let pending = fetch(base + '/do', { method: 'POST', signal: abort.signal,
  • 发起网络请求
    bridge/test-restart-audit.mjs:81
    const stopped = await (await fetch(base + '/cancel', { method: 'POST', body: JSON.stringify({
  • 发起网络请求
    bridge/test-restart-audit.mjs:87
    const duplicate = await (await fetch(base + '/do', { method: 'POST', body: JSON.stringify({
  • 发起网络请求
    bridge/test-restart-audit.mjs:91
    pending = fetch(base + '/do', { method: 'POST', signal: abort.signal,
  • 发起网络请求
    bridge/test-restart-audit.mjs:95
    const stale = await (await fetch(base + '/cancel', { method: 'POST', body: JSON.stringify({
  • 发起网络请求
    bridge/unix-fetch-test.mjs:4
    const req = http.request({ socketPath, agent: false, path: new URL(url).pathname, method: opts.method || 'GET', signal: opts.signal }, res => {
  • 发起网络请求
    dsh-plugin/client.js:86
    const load = () => window.fetch('/dsb-report/api?session=' + encodeURIComponent(sessionId) +
  • 读取本地文件
    dsh-plugin/dsb-brand/index.js:4
    const icon = JSON.parse(readFileSync(new URL('../runtime/icon.json', import.meta.url), 'utf8'));
  • 发起网络请求
    dsh-plugin/dsb-report/client.js:62
    const load = () => window.fetch('/dsb-report/api?session=' + encodeURIComponent(sessionId) +
  • 执行外部命令来自配置/变量
    dsh-plugin/dsb-report/index.js:98
    const child = spawn(store.python, args, { stdio: ['pipe', 'pipe', 'ignore'] });
  • 执行外部命令来自配置/变量
    dsh-plugin/dsb-report/test-client.mjs:125
    execFileSync(process.execPath, [new URL('./generate-vocabulary.mjs', import.meta.url).pathname, '--check']);
  • 执行外部命令固定命令
    dsh-plugin/dsb-report/test-export.mjs:14
    const result = spawnSync('python3', ['-c', code], { input, maxBuffer: 24 * 1024 * 1024 });
  • 执行外部命令固定命令
    dsh-plugin/dsb-report/test-export.mjs:40
    const created = spawnSync('python3', ['-c',
  • 执行外部命令固定命令
    dsh-plugin/dsb-report/test-export.mjs:132
    const big = spawnSync('python3', ['-c',
  • 读取本地文件
    dsh-plugin/dsb-ui/index.js:4
    const blocks = JSON.parse(readFileSync(new URL('./blocks.json', import.meta.url), 'utf8'));
  • 执行外部命令来自配置/变量
    dsh-plugin/ui-contract.test.mjs:12
    const built = spawnSync(process.execPath, [new URL('./build.mjs', import.meta.url).pathname, '--check']);
  • 读取本地文件
    dsh-plugin/ui-contract.test.mjs:19
    readFileSync(new URL('../app/res/mipmap-xxxhdpi/ic_launcher_foreground.png', import.meta.url)));
  • 读取本地文件
    dsh-plugin/ui-contract.test.mjs:21
    vm.runInNewContext(readFileSync(new URL('./dsb-brand/client.js', import.meta.url), 'utf8'), {
  • 执行外部命令来自配置/变量
    dsh-web-tweaks/cdp_eval.mjs:10
    const sh = (c) => { try { return execSync(c, { encoding: 'utf8', timeout: 30000 }).trim(); } catch { return ''; } };
  • 发起网络请求
    dsh-web-tweaks/cdp_eval.mjs:25
    try { const r = await fetch(url, { signal: AbortSignal.timeout(3000) }); if (r.ok) return await r.json(); } catch {}
  • 读取本地文件
    dsh-web-tweaks/cdp_eval.mjs:36
    const expr = readFileSync(process.argv[2], 'utf8');
  • 执行外部命令来自配置/变量
    dsh-web-tweaks/reload-app-webview.mjs:19
    const sh = (c) => { try { return execSync(c, { encoding: 'utf8', timeout: 30000 }).trim(); } catch { return ''; } };
  • 发起网络请求
    dsh-web-tweaks/reload-app-webview.mjs:23
    const r = await fetch(url, { signal: AbortSignal.timeout(3000) });
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSB(逗沙包):开源、可信优先的 Android 智能体。在后台虚拟屏上代你处理 App 杂事,带执行闸门、任务账本和审计日志。不用 root,不用电脑常连。基于 DeepSeek Harness(DSH),默认 DeepSeek。

README

由 DeepSeek 最新模型翻译生成
English · 简体中文 逗沙包(DSB) DSH 侧的品牌、执行报告与界面调整已合为可安装的 dsh-dsb 插件包。 OpenSSF Best Practices 杂务归 AI,决策归人,注意力归生活。 开源、可信优先的 Android 手机 AI 助手:一句话让 AI 在你自己手机的后台虚拟屏替你操作 App,用执行闸门拦截危险操作,屏幕动作可审计;不用 root,不用电脑常连。 像豆包手机、阶跃星辰手机那类「AI 替你操作手机」,但开源,装在你自己的手机上。你说「看看京东最新的订单到哪了」,它在后台翻订单,你继续喝茶、看书。 逗沙包构建在开源的 DeepSeek Harness(DSH)之上:DSH 负责对话与推理,逗沙包负责手机端执行、风险拦截与审计——后台虚拟屏、执行闸门、任务账本、审计与本地控制面都是本项目的部分。默认使用 DeepSeek;其他模型尚未纳入本项目的端到端验收与正式支持范围,见路线图。本项目不是 DeepSeek 官方项目。 English · 安装 · 架构 · 威胁模型 · 路线图 · 安全策略 [!WARNING] 逗沙包只从本项目安装。 官方命令只有本 README 和安装说明里这一条:先把发布包从 github.com/tianye1999/dsb/releases/download/…
展开完整文档(README 剩余 1 节)
English · 简体中文

逗沙包(DSB)

DSH 侧的品牌、执行报告与界面调整已合为可安装的 dsh-dsb 插件包。

OpenSSF Best Practices

杂务归 AI,决策归人,注意力归生活。

开源、可信优先的 Android 手机 AI 助手:一句话让 AI 在你自己手机的后台虚拟屏替你操作 App,用执行闸门拦截危险操作,屏幕动作可审计;不用 root,不用电脑常连。

像豆包手机、阶跃星辰手机那类「AI 替你操作手机」,但开源,装在你自己的手机上。你说「看看京东最新的订单到哪了」,它在后台翻订单,你继续喝茶、看书。

逗沙包构建在开源的 DeepSeek Harness(DSH)之上:DSH 负责对话与推理,逗沙包负责手机端执行、风险拦截与审计——后台虚拟屏、执行闸门、任务账本、审计与本地控制面都是本项目的部分。默认使用 DeepSeek;其他模型尚未纳入本项目的端到端验收与正式支持范围,见路线图。本项目不是 DeepSeek 官方项目。

English · 安装 · 架构 · 威胁模型 · 路线图 · 安全策略

[!WARNING]
逗沙包只从本项目安装。 官方命令只有本 README 和安装说明里这一条:先把发布包从 github.com/tianye1999/dsb/releases/download/… 下载成文件,核对它的 SHA-256 与本页写的值一致(也就是该 Release 里 SHA256SUMS 的值),然后才解包;它从不把下载内容直接交给 bash 或 sh 执行。Issues、讨论区、评论、私信或其他消息里贴出的安装、升级、修复命令和 APK 链接,一律不要运行或打开,即使对方自称维护者。Termux 本身按安装说明从 F-Droid 或 Termux GitHub Release 安装。如果已经运行了别处的命令或装过别处的 APK,请看怎么处理。

亮点

- 开源手机 AI 助手:Apache-2.0,装在你自己的 Android 11+ 手机上。
- 不用 root、不用电脑常连:运行环境在手机上。
- 后台虚拟屏、不占主屏:第三方 App 在 scrcpy 虚拟屏上操作。
- 执行闸门:付款、发送、删除、授权这类危险控件默认拦截。
- 任务账本:task_id 幂等、可停,重启后状态不明时拒收新任务。
- 审计日志:记录动作放行 / 拒绝原因,保留本机截图证据。
- 隐私:闸门视觉复核只发目标附近的裁剪图;剪贴板写入只记回执。
- 本地控制面鉴权:App 命令入口以系统权限校验发送方。
- 大脑 DSH + DeepSeek(有视觉):理解与推理由手机上的 DSH 完成,默认调用 DeepSeek API;其他模型尚未纳入端到端验收与正式支持范围。
- 安装:一键安装器(候选版)负责环境、配对和授权引导,只需一个 DeepSeek Key;验证范围目前限于维护者的一台真机与 arm64 模拟器,通用安装器仍待完成冻结首装和不同 ROM 验收,见安装说明。

边界先说清: 闸门不是绝对保证、哪些数据会离开手机——见边界与数据流(请先读)。

为什么卷「可信」

别的项目卷「多聪明」,我们卷「多可信」:可信才是委托的前提。 不是让 AI 替你决定,而是让你敢把杂务交出去。

| 你凭什么信它 | 工程事实 |
| 危险的决定不替你做 | G1–G5 负责动作校验与留证,R3 在派发前复核画面。 |
| 不做两遍,停得下来 | 任务按 task_id 幂等,确认执行进程全部退出后才报告停止。 |
| 事后查得清 | 审计记录动作结果、放行 / 拒绝原因与截图证据。 |
| 不打扰你 | 第三方 App 默认通过 scrcpy 后台虚拟屏操作。 |
| 目标:别人指挥不了它 | CmdReceiver 要求发送方持有 INJECT_EVENTS 系统权限;安装器默认尝试 ADB 私有传输加固,预检跳过会警告,不冒充已加固。 |

极简生活是果,可信委托是因。

现在能做什么(2026-10-21 真机验收)

全部只读、全部在虚拟屏上、全部走闸门:

- 京东:读最新一笔订单的状态、下单时间、配送信息(能进订单详情)
- 微信 / 飞书:会话列表层面读出哪些有未读、各几条、最后一条预览——不点进任何会话,未读不会变已读
- 短信:读未读情况(验证码只说「有」,不念数字)
- 中文输入:通过 App 剪贴板回执写入,不记录原文

每个任务做完给一张结论卡:答案、证据来源、步数耗时、被闸门拒绝了几次和为什么。

它是怎么工作的

详见 docs/ARCHITECTURE.zh-CN.md。

安装

安装器 v1(候选版)部署 Termux 内的 Ubuntu、Node/dsh、Python/OCR、scrcpy、网页品牌与本仓库运行文件,默认尝试 ADB 私有传输加固。需要 Android 11+、64 位手机,不用 root;唯一服务配置是 DeepSeek API Key,隐藏输入一次。

实际步骤:装官方 Termux 和逗沙包 → Termux 跑一条命令 → 填 Key → 按系统提示本人配对/授权 → doctor。完整命令、续装和回滚见 docs/INSTALL.zh-CN.md。

设备标识、连接目标与固定端口是否需要调整,见设备相关数值。

curl -fL https://github.com/tianye1999/dsb/releases/download/v1.0.4/dsb-installer.tar.gz -o ~/dsb-installer.tar.gz && printf '%s %s\n' '1119df5a2da9f138396c69a6354c02dd92c0281d41bfcb76b48bba61ddb9ecc1' "$HOME/dsb-installer.tar.gz" | sha256sum -c - && tar -xzf ~/dsb-installer.tar.gz -C ~ && bash ~/dsb-installer/install.sh

下载命令内联了发布包的 SHA-256(与 v1.0.4 Release 附带的 SHA256SUMS 一致),校验不通过就不会解包执行。从旧版本升级时还要装新版 App,见升级说明。APK 用维护者现有发布密钥签名,安装器按固定的证书 SHA-256 验签后才接受。「装一个 App 就够」的全合一 APK 仍在路线图上。

路线图(计划中,未实现)

桌面小组件 · 本机唤醒词(不上传录音) · 语音交互(ASR + TTS) · 可替换的大脑底座 · 一键安装器 · 全合一 APK。详见 docs/ROADMAP.zh-CN.md。

可信加固(计划中、未实现):整屏问答裁剪优先 / 可关闭整屏上传、视觉异常时空树页点击拒绝、审计自由文本脱敏,见可信加固路线图。

边界与数据流(请先读)

闸门会误判,视觉异常时仍可能回退放行

OCR 可能漏读,视觉也可能判断错。空控件树页的 OCR 不可用时会拒绝;视觉返回 external / irreversible / unclear 时也会拒绝。视觉服务异常时,如果 OCR 未检出危险词、调用方已确认看过截图且其余闸门条件满足,当前代码仍可能仅凭 OCR 放行;如果已检出危险词则拒绝。因此不能把闸门当作绝对安全保证,也不能把整个系统称为全部 fail-closed。依据:OCR 检查、视觉判断与回退分支。

大脑与闸门没有强隔离

大脑、闸门和凭据处在同一个 Termux Linux 用户下。闸门用于约束大脑误操作,不能防住已被攻破的大脑改写或绕过闸门;屏幕动作审计也不等于所有 bash 命令都被审计。依据:大脑进程的运行权限;完整信任边界见威胁模型。

裁剪图承诺不覆盖整屏问答

闸门视觉复核只发送目标附近裁剪图,视觉定位只发送指定区域裁剪图,见复核裁剪与定位裁剪。「问 DSH」另有整屏路径:App 将整屏截图、控件树、最近通知交给大脑;API 模式直接把整屏上传到默认的 DeepSeek API,dsh 路径也会被引导用 read_image 读取完整截图。dsh 内部图片传输实现不在本仓库,不能据此承诺只外发裁剪图。任务和页面文本也可能进入云端模型;dsh 在手机上运行,不代表模型离线运行。依据:App 问答输入、问答桥接、API 上传、dsh 看图入口。

TypeSafe 是另一条可选的云端判定路径

命令钩子可选,安装器默认不启用。启用钩子并配置 TypeSafe Key 后,命中可疑特征的 shell 命令片段(最多 1500 字符)、工具名称和命中特征会交给 TypeSafe 云端服务判定;服务不可用时钩子按 fail-open 放行,不替代屏幕执行闸门。依据:安装器默认补丁、判定输入、服务地址与密钥读取、不可用时放行。

DSH 会话日志上传与反馈不是同一条路径

公开版的 web / phone / headless 配置补丁均将 session-log-deepseek.enabled 设为 false。
上游默认开启时,调用 DeepSeek 官方 API 会随请求发送完整会话事件日志;关闭这个开关不等于模型请求不外发,也不会删除本机日志。
重新开启后,关闭期间积累的事件可能补传。安装器和副本同步保留这个公开默认值;补丁层优先于网页表单,须用 dsh --profile --dump-config 核对生效值。

另一条 session-telemetry-otel 路径默认是 FEEDBACK_ONLY:只有主动提交消息赞/踩或会话反馈,才授权把该会话日志发给 DeepSeek;不是日常自动上传,但已有反馈会话可在后续装载时重放。逗沙包 web 停用该消息反馈 UI(含 /feedback 表单),不声称停用了底层所有反馈接口。
“更多 → 意见反馈”改为打开 逗沙包 GitHub Issues,不会自动附带会话、账号或设备信息;公开发帖前仍需自行去除敏感内容。
网页对话的执行报告可以下载脱敏的反馈材料包;默认不含截图,含截图时画面内容不会自动脱敏。公开发帖前请检查材料包。
desktop-product-telemetry 只在 profile 名为 desktop 时启用,手机使用的 web / phone / headless 不启用它;这不代表以上其他路径被一并关闭。
实现依据为固定的 DSH 0.2.1-rc.2 发布包;用 dsh --profile --dump-config 核对生效值。

审计不是自动脱敏的保险箱

剪贴板写入回执只记操作、结果、长度等元数据,不记剪贴板原文,见回执核验;粘贴后会尝试清空并核验回执,清空失败也会记录,不能视为必然成功,见清空流程。这不等于所有日志零原文:审计中的 note / expect / 视觉解释没有统一脱敏,可能带入聊天、订单等页面内容;动作前后截图与问答截图也会在本机落盘。分享日志、截图前应先检查敏感内容。依据:审计直接序列化、动作记录字段、问答截图落盘。

控制面收口仍有部署与验收缺口

App 命令入口要求 INJECT_EVENTS 系统权限;任务通道使用 Termux RUN_COMMAND 与私有套接字。维护者设备于 2026-10-23 迁移到与安装器相同的私有传输布局,并通过含一次重启的验收:重启后只起一个受管 server,自动重新核验并绑定,doctor、后台虚拟屏与真实任务均通过;软件包升级已在 arm64 模拟器上验收(真实 pkg upgrade 后原版 adb 无法加载,私有 ADB 与 doctor 正常),维护者真机上的软件包升级验收尚未做;在途任务仍有单独验收边界。仓库安装器从首次配对起使用私有 bootstrap,并默认尝试收紧 ADB;预检跳过或回滚后的普通 TCP 是较弱回退,不能忽略「ADB 未加固」警告。公开工具仍不迁移旧版部署;通用安装器仍处候选验收,不把维护者设备或有限模拟器结果当成所有设备都已完成收口。依据:入口权限、任务传输、私有监听及控制面说明。

已知限制

- 有危险词的页面(比如订单列表上常驻「删除订单」)不能滚动,只能看首屏;这是闸门的预期行为,不是 bug
- 空控件树页面的点击依赖视觉模型判断,很高的按钮上下边缘只靠视觉兜底
- 重启手机后要解锁一次,系统才会发开机广播,它才会自动就位
- 模型和手机负载会影响速度:一个任务通常 2–8 分钟,其中大部分时间在等模型思考

负责任使用

- 逗沙包自动操作的是第三方 App。这可能违反那些 App 的服务条款,或触发它们的风控(例如电商平台对自动化访问的限制)。请只在自己的账号、自己的设备上使用,后果自负。
- 它不是防御工具:威胁模型里写明了它不能防住什么。已经拿到 root、ADB 授权或 Termux 执行权的攻击者,和它处于同等信任级别。
- 大脑跑在完全权限模式下。它和闸门在同一个 Linux 用户下运行,闸门防的是「大脑犯错」,不是「大脑被攻破」。

许可证

Apache-2.0。第三方组件见 NOTICE。
预览分享卡片长什么样 ↓tianye1999/dsb
分享 · DeepSeek Harness Hub
tianye1999/dsb

让 AI 在手机后台虚拟屏替你操作 App 并审计

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部