让 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
analystsandeep/Opencode-Arena
让 OpenCode 通过已登录浏览器会话调用 Arena 模型
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目