Skip to content

ClawProxyHub v1.2.0

Choose a tag to compare

@ShadowSmallBaby ShadowSmallBaby released this 24 Sep 19:29
· 89 commits to main since this release
b9bbb9d

ClawProxyHub v1.2.0

Lua 插件运行时版。新增脚本插件宿主 LuaHost(社区零 Go、零编译写 Lua 插件),并强化网关鉴权/恢复/超时体系、统一 SDK 传输层、插件 KV store 隔离持久化。

概览

  • LuaHost 运行时:Lua 插件宿主(hosts/luahost,独立 module),沙箱化 gopher-lua VM;社区作者只写 main.lua
  • 分发与加载:pack 识别 runtime=lua;核心 -tags luahost_embed 内置注入;P1 共享单份 + P0 启动刷新 + 手动上传替换
  • 系统设置「插件」板块:Lua 启用 / 隔离 / 更新三配置;插件卡片 Go/Lua 运行时徽章
  • 插件 KV store:按插件名隔离 + 持久化到 DB(迁移 000014)
  • 网关强化:O(1) 鉴权、凭据恢复链、首帧/首字双超时、超窗自动截断
  • SDK 统一传输层:HTTP/SSE 出站统一 + 日志铺底

明细

LuaHost 运行时(hosts/luahost)

  • 通用 go-plugin 宿主:把 ClawPlugin 契约翻成 Lua 调用——proto ↔ table 双向映射(snake_case 对齐)、stream 对象 typed 方法(message_start/content_delta/reasoning_delta/tool_call_delta/message_finish/failed)
  • 宿主能力 cph.*:http(request 回 {body,status,headers},请求未完成 raise;stream 支持 format="openai" 宿主解析 SSE 驱动 stream 对象)、json / hash(md5/sha256/hmac_sha256/base64url)/ time(now/sleep)/ random(uuid/hex)/ log(落核心 runlog)/ openai.chat_body(信封→OpenAI body)
  • 约定函数(return M,函数挂为字段):handshake(声明 capabilities/auth_methods,与 Go 插件 Handshake 同构;缺失回退 manifest.json)/ chat(req, stream) / models / login / refresh / profile
  • 沙箱:白名单标准库(base/table/string/math)+ 剔除 dofile/load/print/collectgarbage;沙箱化 require("lib.*")(仅插件目录、禁路径逃逸、模块缓存);一切出站只经 cph.*
  • VM 复用池;所有 RPC 顶层 recover()(Go 侧 panic 转错误不崩进程,stderr 打 [luahost] panic in X())
  • 独立 module:依赖 sdk + 纯 Go gopher-lua(交叉编译零痛)

分发与加载(P1 + P0)

  • pack:双目录扫描(plugins/ + plugins-lua/);plugins-lua/ 即盖 runtime="lua" + entry,protocol_version 由 SDK 盖——作者 manifest 只写 name/version/author/label/icon;lua 产平台无关 zip(跳过 go build);市场 index.json 带 runtime
  • 加载(方案 A):核心按 manifest.runtime=="lua" 分流,启动共享 LuaHost(data/hosts/luahost-<os>-<arch> + --dir <插件目录>),manager 全程零改动(照标准 go-plugin 处理)
  • P1 共享单份:一份 LuaHost 服务所有 lua 插件(磁盘一份、每插件一进程=隔离不丢);pack -install 旧式逐插件拷贝仍兼容(回退)
  • P0 升级刷新:ensureLuahost 按 sha256 比对,核心升级带来新内置 LuaHost 时开机自动刷新共享文件;.manual 标记(手动上传)跳过自动刷新
  • go:embed:-tags luahost_embed 把 internal/plugin/luahost.bin 编进核心(默认 stub,装 lua 插件被拒并提示);Dockerfile 已带两步构建
  • Start 取名:由插件目录取插件名(共享后 binPath 落 data/hosts,不能从二进制路径推名)——与 store 隔离命名空间对齐

系统设置「插件」板块(web + internal/admin)

  • Lua 启用 plugin.lua_enabled(默认开):关闭则安装网关拒装 lua 插件(installZip 单点读包内 manifest.runtime,市场/上传两路径覆盖)
  • Lua 隔离 plugin.lua_isolation:本版锁定为开(UI disabled + 服务端强制 true;共享运行态后续版本)
  • Lua 更新:手动更新(上传 LuaHost 二进制 → 停 lua 插件 → 覆盖共享运行时 → 打 .manual → 拉起)/ 检查更新(占位禁用)
  • Go/Lua 运行时徽章:市场卡 + 已装卡(MarketEntry/pluginView 加 runtime,取自落盘 manifest——决策 A:不动 proto、protocol_version 保持 2)

插件 KV store(internal/plugin)

  • 按插件名隔离:HostService 加 plugin 字段 + forPlugin(name) 派生(manager 从插件目录取名注入)
  • 持久化:迁移 000014 plugin_stores(PK plugin+key);StoreGet(Find 避免命中不到日志噪声)/ StorePut(UPSERT);卸载级联清理;重启不丢

网关强化(internal/gateway)

  • O(1) 鉴权:keys.key_lookup 确定性查找列(sha256(raw)),命中免全表解密
  • 凭据恢复链:401 → 刷新同账号后重试;线性重试(gateway.max_retries 上限)
  • 首帧/首字双超时:first_event_timeout(等首事件,探测上游/代理挂死)+ first_token_timeout(首事件→首个内容 token,容纳推理),路由级可覆盖全局(迁移 000013 拆分旧 timeout_seconds)
  • 输入超窗自动截断:gateway.context_truncate_*(开关/阈值/估算系数)

SDK 统一传输层(sdk)

  • sdk/http.go 出站 request/stream 统一:敏感头打码(api-key/authorization/cookie…,保留前后 4 字符)、debug 级全量入库、Host.LogFields 结构化字段

其他

  • 内部计划文档移出仓库(docs/ 入 .gitignore,不入库)

升级说明

  • 新增 migration 000014(plugin_stores):启动自动执行,无手工步骤
  • 带 Lua 支持的核心需两步构建:先 go build -C hosts/luahost -o internal/plugin/luahost.bin .,再 go build -tags luahost_embed ./cmd/cph(Dockerfile 已含);不带 tag 的核心为 stub——lua 插件仍能跑(共享文件在 data/hosts/ 时),但从市场装新 lua 插件会被拒
  • 插件仓(submodule):autoclaw(lua)与 pack 改动在插件仓,需单独提交/发布后回核心 bump 指针
  • 如需引用本版本核心,把插件 go.mod 依赖升到 github.com/ShadowSmallBaby/ClawProxyHub v1.2.0