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

跨端智能体工作台 lxfebd/AgentPilot

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

在手机和网页远程管理各设备上的 AI 智能体会话

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 92 处,展示前 60 条)
  • 读取本地文件
    desktop-next/electron/main.cjs:132
    if (!fs.existsSync(legacyDir)) return canonicalDir;
  • 写入本地文件
    desktop-next/electron/main.cjs:133
    fs.mkdirSync(canonicalDir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    desktop-next/electron/main.cjs:134
    for (const name of fs.readdirSync(legacyDir)) {
  • 删除本地文件
    desktop-next/electron/main.cjs:137
    fs.rmSync(source, { force: true });
  • 读取本地文件
    desktop-next/electron/main.cjs:141
    for (let index = 1; fs.existsSync(target); index += 1) {
  • 写入本地文件
    desktop-next/electron/main.cjs:144
    fs.renameSync(source, target);
  • 删除本地文件
    desktop-next/electron/main.cjs:146
    fs.rmdirSync(legacyDir);
  • 读取本地文件
    desktop-next/electron/main.cjs:161
    return JSON.parse(fs.readFileSync(filePath, "utf8"));
  • 读取本地文件
    desktop-next/electron/main.cjs:168
    return JSON.parse(fs.readFileSync(filePath, "utf8"));
  • 写入本地文件
    desktop-next/electron/main.cjs:172
    fs.mkdirSync(path.dirname(filePath), { recursive: true });
  • 写入本地文件
    desktop-next/electron/main.cjs:173
    fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
  • 删除本地文件
    desktop-next/electron/main.cjs:179
    fs.rmSync(targetPath, { recursive: true, force: true });
  • 发起网络请求
    desktop-next/electron/main.cjs:212
    return net.fetch(pathToFileURL(filePath).toString());
  • 读取本地文件
    desktop-next/electron/main.cjs:267
    if (fs.existsSync(trimmed)) return trimmed;
  • 执行外部命令来自配置/变量
    desktop-next/electron/main.cjs:400
    const child = spawn(executable, args, { windowsHide: true, stdio: ["ignore", "pipe", "ignore"] });
  • 写入本地文件
    desktop-next/electron/main.cjs:586
    fs.mkdirSync(logDir(), { recursive: true });
  • 写入本地文件
    desktop-next/electron/main.cjs:603
    fs.appendFileSync(activeLogChunkPath(), `${JSON.stringify(log)}\n`, "utf8");
  • 删除本地文件
    desktop-next/electron/main.cjs:626
    fs.unlinkSync(file);
  • 删除本地文件
    desktop-next/electron/main.cjs:683
    fs.unlinkSync(file);
  • 删除本地文件
    desktop-next/electron/main.cjs:705
    fs.rmSync(file, { force: true });
  • 执行外部命令来自配置/变量
    desktop-next/electron/main.cjs:876
    rpcProcess = spawn(uvPath, args, {
  • 执行外部命令固定命令
    desktop-next/electron/main.cjs:908
    spawn("taskkill.exe", ["/pid", String(rpcProcess.pid), "/t", "/f"], { windowsHide: true });
  • 执行外部命令来自配置/变量
    desktop-workbench/electron/backend-client.ts:97
    const child = fork(entry, [payload], {
  • 删除本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:34
    t.after(() => fs.rmSync(root, { recursive: true, force: true }));
  • 写入本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:35
    fs.writeFileSync(path.join(root, "pyproject.toml"), "");
  • 写入本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:38
    fs.writeFileSync(script, runtime);
  • 读取本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:70
    assert.deepEqual(JSON.parse(fs.readFileSync(captured, "utf8")), {
  • 删除本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:80
    t.after(() => fs.rmSync(root, { recursive: true, force: true }));
  • 写入本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:81
    fs.writeFileSync(path.join(root, "pyproject.toml"), "");
  • 写入本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:84
    fs.writeFileSync(script, `
  • 写入本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:97
    fs.writeFileSync(configPath, JSON.stringify(credentials));
  • 读取本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:126
    assert.deepEqual(JSON.parse(fs.readFileSync(configPath, "utf8")), credentials);
  • 写入本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:129
    fs.writeFileSync(ready, "");
  • 删除本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:143
    t.after(() => fs.rmSync(root, { recursive: true, force: true }));
  • 删除本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:188
    t.after(() => fs.rmSync(root, { recursive: true, force: true }));
  • 删除本地文件
    desktop-workbench/electron/connector-supervisor.test.ts:228
    fs.rmSync(environment, { recursive: true, force: true });
  • 发起网络请求
    desktop-workbench/electron/connector-supervisor.ts:146
    const runtimeState = await this.request("connector.getState", undefined, {
  • 发起网络请求
    desktop-workbench/electron/connector-supervisor.ts:160
    const runtimeState = await this.request("connector.acquireOwnership", undefined, {
  • 发起网络请求
    desktop-workbench/electron/connector-supervisor.ts:171
    await this.request("connector.acquireOwnership", undefined, { requiresConfig: false, timeoutMs });
  • 发起网络请求
    desktop-workbench/electron/connector-supervisor.ts:220
    const result = await this.request("connector.saveConfig", normalized, {
  • 发起网络请求
    desktop-workbench/electron/connector-supervisor.ts:251
    const result = await this.request("connector.start", undefined, {
  • 发起网络请求
    desktop-workbench/electron/connector-supervisor.ts:263
    const result = await this.request("connector.stop", undefined, {
  • 执行外部命令来自配置/变量
    desktop-workbench/electron/connector-supervisor.ts:358
    const child = spawn(launcher.executable, launcher.args, {
  • 执行外部命令固定命令
    desktop-workbench/electron/connector-supervisor.ts:513
    spawn("taskkill.exe", ["/pid", String(child.pid), "/t", "/f"], {
  • 发起网络请求
    desktop-workbench/electron/desktop-device-service.ts:274
    return parseCredentialResponse(await this.request(serverUrl, path, userToken, "POST", body));
  • 发起网络请求
    desktop-workbench/electron/desktop-device-service.ts:279
    const devices = parseConnectorList(await this.request(serverUrl, "/connectors", userToken, "GET"));
  • 写入本地文件
    desktop-workbench/electron/machine-state-lock.ts:13
    await mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });
  • 读取本地文件
    desktop-workbench/electron/machine-state-lock.ts:14
    const directory = await realpath(path.dirname(filePath));
  • 发起网络请求
    desktop-workbench/electron/main.ts:155
    await backend.request("/server", {
  • 发起网络请求
    desktop-workbench/electron/main.ts:247
    const tokens = await exchangeDesktopOAuthCode(code, pending.verifier, pending.server, (url, init) => net.fetch(String(url), init));
  • 发起网络请求
    desktop-workbench/electron/main.ts:289
    (input, init) => net.fetch(String(input), init),
  • 发起网络请求
    desktop-workbench/electron/main.ts:295
    if (filePath) return net.fetch(pathToFileURL(filePath).toString());
  • 发起网络请求
    desktop-workbench/electron/main.ts:595
    void backend.request("/logs/append", { method: "POST", body: JSON.stringify(payload) }).catch(() => undefined);
  • 发起网络请求
    desktop-workbench/electron/main.ts:687
    return backend.request("/onboarding/complete", { method: "POST", body: JSON.stringify({ source }) });
  • 发起网络请求
    desktop-workbench/electron/preload.ts:65
    const response = await fetch(`${target.base}${route}`, { ...init, headers });
  • 发起网络请求
    desktop-workbench/electron/preload.ts:98
    const response = await fetch(`${target.base}/events`, { headers, signal: controller.signal });
  • 执行外部命令来自配置/变量
    desktop-workbench/electron/shell-environment.ts:38
    const child = spawn(executable, args, {
  • 执行外部命令来自配置/变量
    desktop-workbench/electron/system-device-name.ts:20
    execFile(
  • 读取本地文件
    dsh-bridge/src/bridge-service.ts:1080
    if (existsSync(join(candidate, 'pyproject.toml'))) return candidate
  • 写入剪贴板
    packages/ui-core/src/lib/clipboard.ts:4
    await navigator.clipboard.writeText(text)
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

AgentPilot:跨设备智能体工作台(Connector/Server/客户端)

README

由 DeepSeek 最新模型翻译生成
AgentPilot:跨设备的开源 Agent 工作台连接工作设备,在桌面、手机和 Web 管理 AI Agent。 开源 · 多种 Agent · 会话与工作区 · 自托管 下载客户端 ·部署并打开 Web · AgentPilot 是跨设备的开源 Agent 工作台。连接运行 Codex、Claude Code 或 DeepSeek Harness 的工作设备,在桌面、手机和 Web 查看会话、回复请求、管理文件与终端。Agent 在连接的工作设备上执行任务。 下载与入口 在工作设备上安装桌面客户端,再通过手机、平板或 Web 访问。Linux 和无图形界面的服务器可使用 Connector CLI 接入。各客户端连接你自己部署的服务实例。
展开完整文档(README 剩余 1 节)
AgentPilot:跨设备的开源 Agent 工作台连接工作设备,在桌面、手机和 Web 管理 AI Agent。

开源 · 多种 Agent · 会话与工作区 · 自托管

下载客户端 ·部署并打开 Web ·

AgentPilot 是跨设备的开源 Agent 工作台。连接运行 Codex、Claude Code 或 DeepSeek Harness 的工作设备,在桌面、手机和 Web 查看会话、回复请求、管理文件与终端。Agent 在连接的工作设备上执行任务。

下载与入口

在工作设备上安装桌面客户端,再通过手机、平板或 Web 访问。Linux 和无图形界面的服务器可使用 Connector CLI 接入。各客户端连接你自己部署的服务实例。

| 平台 | 获取客户端 |
| macOS | GitHub Releases · Universal DMG |
| Windows | GitHub Releases · x64 安装包 |
| Android | GitHub Releases · APK |
| iOS / iPadOS | App Store · TestFlight |
| Web | 部署自己的服务后打开对应地址(见自托管快速开始) |
| Linux / headless | 运行 Connector CLI |

正式发布后,上面的安装包链接会指向对应 Release;当前 main 是开发主线,源码中的新修复不一定已进入安装包。

平台要求、安装包与更新说明

- macOS:Apple Silicon / Intel 通用,已签名、公证;需要 macOS 12 及以上。
- Windows:x64 桌面工作台,含本机 Connector;当前安装包未做代码签名。
- Android:Android 8.0 及以上。
- iOS / iPadOS:在 App Store 下载安装;也可以通过 TestFlight 安装测试版,以邀请页显示的可用状态为准。
- Linux / headless:运行 Connector 接入工作设备,通过其他客户端操作。

各端 PATCH 版本独立发布,数据库 schema revision 单独编号。

Agent 与工作区管理

| 你想做的事 | 在 AgentPilot 中 |
| 管理项目与会话 | 在设备、项目和会话之间切换,通过时间线(Timeline)查看运行进度。 |
| 审批操作与回复请求 | 响应工具审批和输入请求;按 Runtime 能力打断或继续任务。 |
| 查看文件与使用终端 | 浏览与预览文件、上传下载附件,打开远程 shell 和交互式终端。 |
| 配置 Agent | 配置 Codex、Claude Code 和 DSH;根据对应 Runtime 支持的能力选择模型、权限与操作。 |

Runtime 是工作设备上运行和连接 Agent 的组件。模型账号和调用费用遵循所使用 Agent 的规则。各 Runtime 的能力存在差异,具体操作以客户端显示为准。DSH 接入说明 →

桌面、移动端与 Web

用手机查看进展、回复 Agent,在平板上打开工作区,回到电脑后继续处理。同一服务、同一账号下,自己的设备和会话可以从不同客户端访问。

手机负责控制,工作设备负责执行。 远程使用时,工作设备需要保持开机、联网,并让 Connector 与对应 Runtime 正常运行。

首次使用

1. 登录服务。 安装客户端或打开 Web,填写你的服务地址并登录。
2. 连接工作设备。 Desktop 集成本机 Connector;服务器与无图形环境使用 Connector CLI。
3. 准备 Agent 和项目。 在工作设备上配置 Runtime、账号与工作目录,创建或打开会话。
4. 从其他设备访问。 在手机、平板或另一台电脑登录同一服务和账号,访问自己的设备与任务。

执行位置与自托管

Agent 使用 Connector 所在机器的工作区与权限。服务部署在你自己的服务器上,客户端填入该地址即可。

flowchart LR
Clients["桌面 · 手机 · Web"] <-->|"访问与控制"| Server["AgentPilot Server"]
Server <-->|"Connector RPC"| Connector["工作设备上的 Connector"]
Connector <--> Agents["Codex · Claude Code · DSH"]
Connector <--> Workspace["工作区 · 文件 · 终端"]

会话内容、Timeline 和上传附件等数据会按功能经过或存储在 Server。自托管时,这些服务端数据由你部署的实例处理。

使用 Docker 部署

克隆仓库后,在根目录运行以下命令,先替换示例密码和密钥:

POSTGRES_PASSWORD=replace-with-a-strong-password \
AGENT_SERVER_SECRET=replace-with-a-long-random-secret \
docker compose -f docker/docker-compose.postgres.yml up --build

打开 http://127.0.0.1:5174,从 Server 日志取得 setup token,完成首位管理员设置。Compose 包含 PostgreSQL、Redis、迁移任务以及托管 Web 的 Server。

完整部署步骤 · Server 文档

开发与贡献

开发环境使用 Python 3.12+ / uv / Node.js 22 / Corepack + Yarn。

| 想了解什么 | 从这里开始 |
| Agent 接入与本机执行 | Connector |
| Web 与桌面客户端 | Web 源码 · Desktop Workbench |
| 原生移动客户端 | Android · iOS 源码 |
| DSH 集成 | DSH Bridge Next |

欢迎通过 Issues 反馈问题,或通过 Pull Requests 参与改进。报告问题时,请附上客户端版本、系统、Runtime 类型和复现步骤,并移除日志中的凭据。

交流与反馈

欢迎通过 Issues 反馈问题、通过 Pull Requests 参与改进。如果项目对你有用,欢迎在 GitHub 点个 Star。

开源许可

MIT。本项目的品牌、下载入口与社区以本项目仓库为准。

致谢:AgentPilot 基于 Agents Anywhere(MIT License)二次开发并更名。感谢原作者的开源工作。
预览分享卡片长什么样 ↓lxfebd/AgentPilot
分享 · DeepSeek Harness Hub
lxfebd/AgentPilot

在手机和网页远程管理各设备上的 AI 智能体会话

这是你的仓库?认领条目

回到顶部