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

Arena 本地桥接 analystsandeep/Opencode-Arena

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

让 OpenCode 通过已登录浏览器会话调用 Arena 模型

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

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

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

状态速览

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

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

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 39 处,展示前 39 条)
  • 写入本地文件
    lib/activity-log.js:19
    if (!this.ready) { mkdirSync(dirname(this.file), { recursive: true, mode: 0o700 }); this.ready = true; }
  • 写入本地文件
    lib/activity-log.js:21
    appendFileSync(this.file, `${new Date().toISOString()} ${String(event).replace(/[^A-Za-z0-9_.-]/g, '')}${fields.length ? ' ' + fields.join(' ') : ''}\
  • 读取本地文件
    lib/activity-log.js:22
    if (statSync(this.file).size > this.maxBytes) {
  • 读取本地文件
    lib/activity-log.js:23
    const text = readFileSync(this.file, 'utf8'); const tail = text.slice(-this.keepBytes);
  • 写入本地文件
    lib/activity-log.js:24
    writeFileSync(this.file, tail.slice(tail.indexOf('\n') + 1), { mode: 0o600 });
  • 读取本地文件
    lib/browser.js:27
    const metadata = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
  • 读取本地文件
    lib/browser.js:35
    if (existsSync(file)) return file;
  • 发起网络请求
    lib/browser.js:134
    const response = await fetch('/api/me', { credentials: 'same-origin', cache: 'no-store', signal: AbortSignal.timeout(10000) });
  • 读取本地文件
    lib/browser.js:262
    const info = await lstat(this.paths.lock);
  • 读取本地文件
    lib/browser.js:264
    previous = JSON.parse(await readFile(this.paths.lock, 'utf8'));
  • 删除本地文件
    lib/browser.js:269
    if (check.code === 'ESRCH') { await unlink(this.paths.lock); continue; }
  • 删除本地文件
    lib/browser.js:276
    if (ownerName && imageName && imageName !== ownerName) { await unlink(this.paths.lock); continue; }
  • 读取本地文件
    lib/browser.js:298
    for (const entry of await readdir(this.paths.runtime, { withFileTypes: true })) {
  • 删除本地文件递归
    lib/browser.js:299
    if (entry.isDirectory() && /^run-[A-Za-z0-9]{6}$/.test(entry.name)) await rm(join(this.paths.runtime, entry.name), { recursive: true, force: true });
  • 删除本地文件递归
    lib/browser.js:652
    await rm(this.profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }).catch(() => {});
  • 读取本地文件
    lib/browser.js:657
    const saved = JSON.parse(await readFile(this.paths.lock, 'utf8'));
  • 删除本地文件
    lib/browser.js:658
    if (saved.nonce === this.lockNonce && saved.pid === process.pid) await unlink(this.paths.lock);
  • 读取本地文件
    lib/direct-chat.js:81
    const value = JSON.parse(readFileSync(this.modelFile, 'utf8')).model;
  • 写入本地文件
    lib/direct-chat.js:89
    mkdirSync(dirname(this.modelFile), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/direct-chat.js:90
    writeFileSync(this.modelFile, JSON.stringify({ model: code }), { mode: 0o600 });
  • 读取本地文件
    lib/direct-chat.js:177
    try { await access(this.host.paths.maxConsent); return true; } catch { return false; }
  • 读取本地文件
    lib/model-catalog.js:55
    try { mtimeMs = statSync(file).mtimeMs; } catch { mtimeMs = 0; }
  • 读取本地文件
    lib/model-catalog.js:61
    const saved = JSON.parse(readFileSync(file, 'utf8'));
  • 写入本地文件
    lib/model-catalog.js:83
    mkdirSync(root, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/model-catalog.js:86
    writeFileSync(join(root, CATALOG_FILE), JSON.stringify(saved, null, 2) + '\n', { mode: 0o600 });
  • 读取本地文件
    lib/model-catalog.js:92
    try { return JSON.parse(readFileSync(join(root, CATALOG_FILE), 'utf8')); } catch { return []; }
  • 发起网络请求
    lib/recovery.js:11
    const response = await fetch(url, { credentials: 'same-origin', cache: 'no-store', signal: AbortSignal.timeout(10000) });
  • 写入本地文件
    lib/secure-session.js:61
    await mkdir(path, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/secure-session.js:62
    if ((await lstat(path)).isSymbolicLink()) throw new ArenaError('Arena credential storage cannot be a directory junction or symbolic link.', 'ARENA_UNS
  • 读取本地文件
    lib/secure-session.js:109
    const info = await lstat(this.paths.session);
  • 读取本地文件
    lib/secure-session.js:111
    sealed = await readFile(this.paths.session);
  • 写入本地文件
    lib/secure-session.js:131
    await writeFile(temp, sealed, { mode: 0o600, flag: 'wx' });
  • 写入本地文件
    lib/secure-session.js:132
    await rename(temp, this.paths.session);
  • 删除本地文件
    lib/secure-session.js:133
    } finally { await unlink(temp).catch(() => {}); }
  • 读取本地文件
    lib/secure-session.js:135
    async exists() { try { return (await lstat(this.paths.session)).isFile(); } catch { return false; } }
  • 读取本地文件
    lib/usage-window.js:18
    const data = JSON.parse(readFileSync(this.file, 'utf8'));
  • 写入本地文件
    lib/usage-window.js:27
    mkdirSync(dirname(this.file), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/usage-window.js:29
    writeFileSync(temporary, JSON.stringify({ sent: this.sent, pausedUntil: this.pausedUntil }), { mode: 0o600 });
  • 写入本地文件
    lib/usage-window.js:30
    renameSync(temporary, this.file);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

为 OpenCode 桌面应用里的 Arena Direct Chat 模型提供本地 OpenAI 兼容桥接,通过你在 Windows 上已登录的浏览器会话驱动。

README

由 DeepSeek 最新模型翻译生成
Opencode Arena 一个本地 OpenAI 兼容桥接服务,让 OpenCode 桌面应用通过你自己已登录的浏览器会话,在 Windows 上使用 Arena Direct Chat 模型。这是个人软件:除了你在自己浏览器里通过 Arena 发送的内容,其他数据都不会离开你的电脑。 概述 桥接服务在 localhost(127.0.0.1:47147)上运行一个小型 HTTP 服务器,使用 OpenAI chat completions 协议。OpenCode 向它发送请求,桥接服务则用你已登录的 Arena 会话,在真实安装的浏览器(Microsoft Edge 或 Google Chrome,通过 Playwright 驱动)里操作 Arena 网站。你的 Arena 登录信息用 Windows DPAPI 加密,只保存在这台电脑上。 支持两种对话通道: - Arena Agent(AI 智能体模式),通过 Arena 智能体页面。 - Arena Max Direct Chat,只通过页面上可见的控件驱动,包括具名的 Direct Chat 模型,例如 arena-max:gemini-3-flash。 本地 DeepSeek Harness 文本工具在你的电脑上运行。
展开完整文档(README 剩余 1 节)
Opencode Arena

一个本地 OpenAI 兼容桥接服务,让 OpenCode 桌面应用通过你自己已登录的浏览器会话,在 Windows 上使用 Arena Direct Chat 模型。这是个人软件:除了你在自己浏览器里通过 Arena 发送的内容,其他数据都不会离开你的电脑。

概述

桥接服务在 localhost(127.0.0.1:47147)上运行一个小型 HTTP 服务器,使用 OpenAI chat completions 协议。OpenCode 向它发送请求,桥接服务则用你已登录的 Arena 会话,在真实安装的浏览器(Microsoft Edge 或 Google Chrome,通过 Playwright 驱动)里操作 Arena 网站。你的 Arena 登录信息用 Windows DPAPI 加密,只保存在这台电脑上。

支持两种对话通道:

- Arena Agent(AI 智能体模式),通过 Arena 智能体页面。
- Arena Max Direct Chat,只通过页面上可见的控件驱动,包括具名的 Direct Chat 模型,例如 arena-max:gemini-3-flash。

本地 DeepSeek Harness 文本工具在你的电脑上运行。Arena 自带的云端工具(网页搜索、浏览器、云 shell 与代码执行、文件工具、连接器)在 Arena 云端运行,可用于不需要访问你文件的工作。

功能

- 仅限 localhost 的 OpenAI 兼容 /v1/models 和 /v1/chat/completions(支持流式与非流式)
- 每个 /v1 路由都做本地 bearer token 认证
- 使用你自己的 Arena 账号建立真实浏览器会话;不需要 API key,也不用粘贴 token
- 保存的会话用 Windows DPAPI 加密
- 本地工具协议:围栏 JSON 工具调用由 DeepSeek Harness 智能体在本地执行
- 本地控制面板,用于登录和选择 Direct Chat 模型
- Windows 安装脚本:Install.cmd、Arena Login.cmd、Check Arena.cmd、Start Arena Bridge.cmd、Stop Arena Bridge.cmd、Uninstall.cmd
- 离线测试套件和离线自检

前置条件

- Windows 10 或 11
- Node.js 22.19.0 或更新版本
- 已安装 Microsoft Edge 或 Google Chrome
- 一个 Arena 账号
- OpenCode 桌面应用

安装

1. 下载或克隆本项目。
2. 双击 Install.cmd。它会安装依赖(npm ci)、运行离线自检,并把 arena 服务商加入你的 OpenCode 配置(%USERPROFILE%\.config\opencode\opencode.json)。该服务商使用 OpenCode 的 {file:...} token 间接引用,从 %USERPROFILE%\.opencode-arena\bridge-token 读取桥接 token,因此 token 本身永远不会写进 OpenCode 配置文件。
3. 双击 Arena Login.cmd,在浏览器窗口里登录你的 Arena 账号。任何验证都由你自己完成;桥接服务绝不会替你点击登录框。
4. 双击 Check Arena.cmd,确认登录、加密会话存储和模型访问都正常。
5. 如果 OpenCode 正在运行,重启它。

配置

桥接服务在 http://127.0.0.1:47147/v1 上处理请求。端口保存在 %USERPROFILE%\.opencode-arena\bridge.json。

可选环境变量:

| 变量 | 含义 |
| OPENCODE_ARENA_HOME | 存放 token、已保存会话和日志的状态目录(默认 %USERPROFILE%\.opencode-arena) |
| DSH_PROFILE_DIR | Playwright 使用的浏览器配置档目录(默认 %OPENCODE_ARENA_HOME%\profiles\web) |
| ARENA_BROWSER_TESTS | 设为 1 可运行浏览器测试组 |
| ARENA_BROWSER_CHANNEL | 浏览器测试使用的浏览器通道,例如 chrome 或 msedge |

可复制的模板见 .env.example。.env 文件本身已加入 gitignore。

用法

1. 双击 Start Arena Bridge.cmd。使用 OpenCode 期间保持窗口打开。
2. 在 OpenCode 中,与 Arena 服务商开始聊天。模型选择器会显示 Arena Agent(AI 智能体模式)和 Arena Max Direct Chat 模型。
3. 照常发送消息。本地工具请求会以围栏 JSON 块的形式出现,桥接程序会校验这些请求并在本地执行。
4. 停止:关闭桥接窗口,或双击 Stop Arena Bridge.cmd。
5. 从 OpenCode 中移除服务商:双击 Uninstall.cmd。已保存的登录信息和 token 会保留,除非你选择清除它们。

开发命令

npm test Run the offline test suite
node tools/self-check.mjs Offline module and configuration checks
npm run bridge Start the bridge manually
npm run benchmark Run the local SSE / page benchmark

测试使用 Node 内置的测试运行器。浏览器测试需手动开启:

ARENA_BROWSER_TESTS=1 ARENA_BROWSER_CHANNEL=chrome node --test test/*.test.mjs

安全

- 桥接程序只绑定 127.0.0.1,并拒绝不带本地 bearer token 的请求。
- 提示词、token 和回复都不会写入日志;活动日志只记录大小。
- Arena 会话在当前 Windows 账户下用 Windows DPAPI 加密,且从不显示。
- 桥接程序绝不会替你完成验证、条款或登录框。
- 不要与任何人分享桥接 token、已保存会话或你的 Arena 登录信息。

许可证

MIT
预览分享卡片长什么样 ↓analystsandeep/Opencode-Arena
分享 · DeepSeek Harness Hub
analystsandeep/Opencode-Arena

让 OpenCode 通过已登录浏览器会话调用 Arena 模型

这是你的仓库?认领条目

回到顶部