moki 710129ac16 去掉sse方式,改用hooks方式 2 روز پیش
..
README.md 710129ac16 去掉sse方式,改用hooks方式 2 روز پیش
index.ts 710129ac16 去掉sse方式,改用hooks方式 2 روز پیش
package.json 710129ac16 去掉sse方式,改用hooks方式 2 روز پیش
status-light.ts 710129ac16 去掉sse方式,改用hooks方式 2 روز پیش

README.md

OpenCode Status Light Plugin

这是一个OpenCode插件,用于将工具执行和会话状态事件发送到AI Status Light监控服务。

功能

  • 监听工具执行事件(开始、完成)
  • 监听会话状态变化(空闲、错误)
  • 监听权限请求
  • 监听消息更新(工具状态、推理状态)
  • 通过HTTP webhook发送事件到监控服务

安装

方式1:本地安装

  1. 将此目录复制到OpenCode的插件目录:

    • 项目级:.opencode/plugins/
    • 全局级:~/.config/opencode/plugins/
  2. 安装依赖:

    cd opencode-plugin
    npm install
    

方式2:npm安装(推荐)

npm install opencode-status-light-plugin

然后在opencode.json中添加:

{
  "plugin": ["opencode-status-light-plugin"]
}

配置

环境变量

变量名 说明 默认值
OPENCODE_WEBHOOK_URL Webhook接收地址 http://localhost:8080/api/webhook
OPENCODE_WEBHOOK_SECRET Webhook密钥(用于签名验证) (空)
OPENCODE_WEBHOOK_ENABLED 是否启用webhook true

示例配置

# 设置webhook地址
export OPENCODE_WEBHOOK_URL="http://your-server:8080/api/webhook"

# 设置密钥(可选)
export OPENCODE_WEBHOOK_SECRET="your-secret-key"

# 启用webhook
export OPENCODE_WEBHOOK_ENABLED="true"

事件类型

插件会发送以下事件:

事件类型 说明 数据格式
tool.execute.before 工具执行前 { tool, args, status: "running" }
tool.execute.after 工具执行后 { tool, args, result, status: "completed" }
session.status 会话状态变化 { status }
session.idle 会话空闲 { status: "idle" }
session.error 会话错误 { error }
permission.asked 权限请求 { permission }
message.part.updated 消息部分更新 { part: { type, tool?, state?, status? } }

Webhook请求格式

{
  "type": "tool.execute.before",
  "timestamp": "2026-06-27T10:30:00Z",
  "project": "my-project",
  "directory": "/path/to/project",
  "worktree": "/path/to/worktree",
  "data": {
    "tool": "read",
    "args": { "filePath": "src/index.ts" },
    "status": "running"
  }
}

签名验证

如果设置了OPENCODE_WEBHOOK_SECRET,插件会在请求头中添加签名:

X-Webhook-Signature: sha256=<hex-signature>

验证签名的示例代码(Node.js):

const crypto = require('crypto')

function verifySignature(payload, signature, secret) {
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(JSON.stringify(payload))
    .digest('hex')
  
  return signature === `sha256=${expectedSignature}`
}

开发

本地开发

# 安装依赖
npm install

# 构建
npm run build

# 测试
npm test

调试

设置环境变量启用详细日志:

export DEBUG=status-light-plugin

许可证

MIT