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

云电脑沙箱 RayrunOS/dsh-rayrun-computer

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

在侧边栏创建远程 Linux 桌面,让模型直接执行任务

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成

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

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 48 处,展示前 48 条)
  • 读取本地文件
    index.js:62
    return JSON.parse(readFileSync(new URL('./package.json', import.meta.url), 'utf8')).version
  • 读取本地文件
    index.js:414
    if (configured && existsSync(configured)) return configured
  • 读取本地文件
    index.js:430
    if (existsSync(candidate)) return candidate
  • 读取密钥环境变量
    index.js:471
    const key = entered || String(process.env.DEEPSEEK_API_KEY ?? '').trim()
  • 执行外部命令来自配置/变量
    index.js:662
    const child = spawn(
  • 删除本地文件递归
    index.js:693
    await rm(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }).catch(() => {})
  • 读取本地文件
    index.js:740
    port = String(await readFile(path.join(dir, 'DevToolsActivePort'), 'utf8')).split('\n')[0].trim()
  • 发起网络请求
    index.js:750
    const targets = await (await fetch(`http://127.0.0.1:${port}/json`)).json()
  • 读取本地文件
    index.js:1570
    typeof args.text === 'string' ? Buffer.from(args.text, 'utf8') : await readFile(localPath(args.local_path, exec.agent))
  • 写入本地文件
    index.js:1579
    await mkdir(path.dirname(destination), { recursive: true })
  • 写入本地文件
    index.js:1580
    await writeFile(destination, bytes)
  • 发起网络请求
    client.js:48
    res = await fetch(RPC, {
  • 发起网络请求
    client.js:66
    res = await fetch(`${RPC}?action=${encodeURIComponent(action)}`, {
  • 写入剪贴板
    client.js:159
    await navigator.clipboard.writeText(String(value ?? ''))
  • 发起网络请求
    lib/auth.js:76
    const res = await fetch(`${dashboardBase}/_api/v1/auth/providers`, {
  • 发起网络请求
    lib/auth.js:90
    const res = await fetch(tokenUrl, {
  • 发起网络请求
    lib/auth.js:120
    const res = await fetch(`${baseUrl}/auth/login`, {
  • 发起网络请求
    lib/auth.js:137
    const me = await fetch(`${baseUrl}/auth/me`, {
  • 发起网络请求
    lib/auth.js:162
    const res = await fetch(`${baseUrl}/tokens/${encodeURIComponent(tokenId)}`, {
  • 发起网络请求
    lib/rayrun.js:132
    const res = await fetch(`${baseUrl}${route}`, {
  • 读取本地文件
    lib/rayrun.js:242
    const text = await readFile(SETTINGS_FILE, 'utf8')
  • 写入本地文件
    lib/rayrun.js:257
    await mkdir(path.dirname(SETTINGS_FILE), { recursive: true })
  • 写入本地文件
    lib/rayrun.js:258
    await writeFile(SETTINGS_FILE, `${JSON.stringify(next, null, 2)}\n`, 'utf8')
  • 读取密钥环境变量
    lib/rayrun.js:272
    const fromEnv = String(process.env.RAYRUN_TOKEN ?? '').trim()
  • 读取本地文件
    lib/rayrun.js:275
    const value = (await readFile(settings.tokenFile, 'utf8')).trim()
  • 发起网络请求
    lib/rayrun.js:516
    const res = await fetch(`${auth.baseUrl}/sandboxes/${encodeURIComponent(id)}/events`, {
  • 读取本地文件
    lib/cloud-dsh.js:90
    files[name] = await readFile(path.join(packageDir, name))
  • 读取本地文件
    lib/cloud-dsh.js:92
    for (const name of await readdir(path.join(packageDir, 'lib'))) {
  • 读取本地文件
    lib/cloud-dsh.js:93
    if (name.endsWith('.js')) files[`lib/${name}`] = await readFile(path.join(packageDir, 'lib', name))
  • 读取本地文件
    lib/cloud-dsh.js:137
    parts.push(`${name}\0${await readFile(path.join(sourceDir, name), 'utf8')}`)
  • 执行外部命令固定命令
    lib/cloud-workspace.js:105
    const child = spawn('git', ['-c', 'core.quotepath=false', ...args], {
  • 读取本地文件
    lib/cloud-workspace.js:114
    const stdout = await readFile(stdoutPath)
  • 读取本地文件
    lib/cloud-workspace.js:115
    const stderr = (await readFile(stderrPath)).toString('utf8')
  • 删除本地文件递归
    lib/cloud-workspace.js:125
    await rm(dir, { recursive: true, force: true, maxRetries: 3 })
  • 读取本地文件
    lib/cloud-workspace.js:160
    const content = await readFile(absolute)
  • 读取本地文件
    lib/cloud-workspace.js:194
    const content = await readFile(file)
  • 删除本地文件递归
    lib/cloud-workspace.js:200
    await rm(dir, { recursive: true, force: true, maxRetries: 3 })
  • 写入本地文件
    lib/cloud-workspace.js:452
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/cloud-workspace.js:453
    await writeFile(path.join(dir, 'dirty.patch'), patch)
  • 写入本地文件
    lib/cloud-workspace.js:454
    await writeFile(path.join(dir, 'status.txt'), statusText)
  • 读取本地文件
    lib/delegate.js:73
    questions = await readFile(path.join(localDir, RESULTS_DIR, taskId, 'questions.md'), 'utf8')
  • 写入本地文件
    lib/delegate.js:199
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/delegate.js:200
    await writeFile(path.join(dir, name), bytes)
  • 写入本地文件
    lib/context-pack.js:183
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/context-pack.js:185
    await writeFile(path.join(dir, name), content)
  • 读取本地文件
    lib/context-pack.js:190
    task = JSON.parse(await readFile(taskFile, 'utf8'))
  • 写入本地文件
    lib/context-pack.js:204
    await writeFile(taskFile, `${JSON.stringify(next, null, 2)}\n`)
  • 读取本地文件
    lib/context-pack.js:211
    const task = JSON.parse(await readFile(path.join(localDir, taskPath(taskId)), 'utf8'))
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(141 字)↓

Rayrun 云电脑插件,用于 DeepSeek Harness:在侧边栏创建、管理并打开远程 Linux 桌面(noVNC),还能用 rayrun_* 工具把智能体任务交给同一批机器。支持按会话选择云端或本地路由,可用密码或微信登录,token 保存在 Harness 保险库中。

README

由 DeepSeek 最新模型翻译生成
dsh-rayrun-computer DSH 里的 Rayrun 云电脑。 侧边栏就能打开的 Linux 桌面,也是模型能直接驱动的沙箱。 English · 简体中文 给 DeepSeek Harness 一台足够便宜的云主机,可以帮助我们干多少活呢?带着这么一个疑问,我们创建了这个项目——把云电脑接进 DSH:在侧边栏创建 Linux 机器,在页面里打开远程桌面,或者直接让模型在上面跑命令、传文件、委托整段任务。每台机器有独立的 CPU、内存和持久化工作区,模型可以在上面一轮接一轮地做下去。 原则是本地优先。云上只是 worker,不是第二个家:你的 checkout 是唯一事实来源,推送会校验到 patch 的 SHA-256,拉回的改动先落在 .dsh/incoming/ 等你审阅,再决定要不要应用。 有什么 - 侧边栏里的云电脑。 选镜像、vCPU、内存(以及给机器内 agent 用的模型凭证)创建,之后开机、暂停、恢复、关机、重命名、销毁。卡片展示状态、镜像、规格、IP 和机时,顶部显示余额和累计机时。 - 页面里的真桌面。 创建时开启远程桌面的机器会发布 noVNC 端口,可以内嵌打开、新窗口打开或全屏;桌面密码一键取。
展开完整文档(README 剩余 1 节)
dsh-rayrun-computer
DSH 里的 Rayrun 云电脑。
侧边栏就能打开的 Linux 桌面,也是模型能直接驱动的沙箱。

English · 简体中文

给 DeepSeek Harness 一台足够便宜的云主机,可以帮助我们干多少活呢?带着这么一个疑问,我们创建了这个项目——把云电脑接进 DSH:在侧边栏创建 Linux 机器,在页面里打开远程桌面,或者直接让模型在上面跑命令、传文件、委托整段任务。每台机器有独立的 CPU、内存和持久化工作区,模型可以在上面一轮接一轮地做下去。

原则是本地优先。云上只是 worker,不是第二个家:你的 checkout 是唯一事实来源,推送会校验到 patch 的 SHA-256,拉回的改动先落在 .dsh/incoming/ 等你审阅,再决定要不要应用。

有什么

- 侧边栏里的云电脑。 选镜像、vCPU、内存(以及给机器内 agent 用的模型凭证)创建,之后开机、暂停、恢复、关机、重命名、销毁。卡片展示状态、镜像、规格、IP 和机时,顶部显示余额和累计机时。
- 页面里的真桌面。 创建时开启远程桌面的机器会发布 noVNC 端口,可以内嵌打开、新窗口打开或全屏;桌面密码一键取。镜像里空 /etc/hosts 导致 websockify 解析失败(WebSocket 以 1011 关闭)的问题,会在连接桌面时自动修好。
- 给模型用的工具。 rayrun_sandbox、rayrun_exec、rayrun_files、rayrun_agent、桌面 computer use 的 rayrun_desktop,以及云上 worker 的 rayrun_dsh 和 rayrun_workspace。
- 按会话切换云上 / 本地。 输入区的切换是真路由,不是提示词:云上模式下 Host 直接拒绝本地 pwsh / bash / write / edit,模型没法偷偷在本地干活;只读工具仍然可用,用来审阅和汇总。
- 和本地一致的 worker。 往机器的 headless profile 推一层 worker 图层,用哈希校验它真的生效;把整段任务连同目标和验收标准委托过去,拿回结果,支持多轮。
- 可核对的工作区同步。 push 用 git bundle 带走提交,再带脏改动和未跟踪文件,两边各自重算 patch 的 SHA-256;pull 只把云端 diff 写进 .dsh/incoming/<时间戳>/,不会自动应用。
- 不用手动复制 Token。 账号密码或微信登录,登录后自动创建 Token 并存入 Harness 凭证库,只存在 Host 侧。
- 可选的自动停机与更新。 任务结束后空闲多久自动关机(永不销毁),以及页面里的一键更新。

架构

flowchart LR
subgraph you["你的电脑"]
page["DSH 页面侧边栏 · 桌面 · 切换"]
host["插件 Host同源 RPC · 工具"]
page <--> host
end
host -->|"HTTPS · Token 只留本地"| api["Rayrun APIapi.rayrunos.com/v1"]
api --> vm["云电脑Linux · 持久工作区"]
page -.->|"noVNC 走 ingress"| vm

快速开始

要求

- DeepSeek Harness 在 0.2.1-rc.5 上验证过 — 桌面应用或 dsh web。
- 一个 Rayrun 账号,来自 rayrunos.com;Token 由插件自动创建。
- Chrome / Edge 只有微信登录需要;其他情况可选。

这个包还没有发布到 npm,从 checkout 安装:

git clone https://github.com/RayrunOS/dsh-rayrun-computer.git

1. 在 插件 → 添加插件 里填这个 checkout 的绝对路径;或者在终端执行 dsh plugin --profile web add /abs/path/dsh-rayrun-computer
2. 重启 DSH。 Client 半区只在页面启动时加载。
3. 打开 云电脑 → 连接设置,用 Rayrun 账号登录,或粘贴已有的 API Token。
4. 新建云电脑 → 选镜像、内存至少 2 GB、开启远程桌面 → 创建并打开(约 15 秒)。

桌面应用和 dsh web 用的是两个 profile(desktop 和 web),装到你实际会打开的那一个。更多安装方式和排障见安装指南。

自检:让模型列一下你的机器。没配 Token 时它必须报 token_required,而不是说「已完成」。

机器与计费

机器来自 Rayrun,按秒计费。侧边栏顶部显示账户余额和累计机时。

工具

| 工具 | 作用 |
| rayrun_sandbox | create · list · inspect · start · stop · pause · resume · destroy |
| rayrun_exec | 执行非交互命令(/bin/sh -c 或 argv),返回 exit code、stdout、stderr |
| rayrun_desktop | 截取桌面,并在上面点击、键入、按键、滚动(X11 / xdotool) |
| rayrun_files | 列目录、上传、下载机器工作区里的文件 |
| rayrun_agent | 把整段任务交给机器内的 agent,流式等待结果 |
| rayrun_dsh | sync 推送并校验 worker 图层,status 只读比对,delegate 委托任务 |
| rayrun_workspace | push 推送并校验 checkout,pull 回传云端 diff 供审阅 |

配置

bundle 的默认值在 cordis.patch.yml;只覆盖你要改的键:

$DSH_HOME/profiles/<profile>/cordis.patch.yml
- id: rayrun-cloud
name: 'dsh-rayrun-computer'
config:
sandboxName: dsh-workspace
idle_stop_minutes: 15 # 空闲后自动关机,永不销毁 egress_allow: # 新机器默认没有出向网络
- api.deepseek.com

完整的配置项见使用手册,Token 解析顺序见这里。

文档

| 文档 | 内容 |
| 安装指南 | 各种安装方式、第一次连接、常见问题 |
| 使用手册 | 远程桌面、云上/本地切换、worker 图层、工作区同步、委托、自动停机、完整配置与工具参考 |
| 一致性方案 | 为什么要有云上 worker 图层,什么同步、什么不同步 |
| 开发与自测 | 模块地图、检查与测试命令、联调 |

安全边界

- Token 只存在 Host 侧。 页面通过同源的 /plugins/rayrun/rpc 调用(校验 Origin),拿不到 Token;密码只存在内存。
- destroy 不可恢复——机器和工作区数据一起删除。
- 新建机器默认没有出向网络。 装包或调外部 API 之前,得先在 egress_allow 里列出来。
- 云上镜子里本来就是 root。 镜像没有 bubblewrap,worker 图层只能覆盖成 danger-full-access 让 shell 可用;这是绕路,不是隔离。
- bundle 的 Host 代码跑在 DSH 进程里。 只从你信任的来源安装。

开发

node --check index.js
node --check client.js
node test/security.mjs
node test/tool-routing.mjs
node test/desktop.mjs

没有构建步骤,也没有运行时依赖;client.js 只用 DSH 提供的内建模块。完整的检查与测试清单见开发与自测。

License

MIT © RayrunOS — 见 LICENSE。
预览分享卡片长什么样 ↓RayrunOS/dsh-rayrun-computer
分享 · DeepSeek Harness Hub
RayrunOS/dsh-rayrun-computer

在侧边栏创建远程 Linux 桌面,让模型直接执行任务

这是你的仓库?认领条目

回到顶部