Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 36 additions & 7 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
tags: ['v*']
pull_request:
workflow_dispatch:
schedule:
# Weekly check against the newest CPA release; publish-release only runs for tags.
- cron: '23 3 * * 1'

permissions:
contents: read
Expand Down Expand Up @@ -47,11 +50,13 @@ jobs:
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_reliability.py
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_diagnostics.py
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_round2.py
gh release download v0.2.8 --repo Gaoshou101/CommandCodeBridge --pattern commandcodebridge_0.2.8_linux_amd64.zip --pattern checksums.txt --dir /tmp/bridge-previous
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_count_tokens.py
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_thinking_suffix.py
gh release download v0.2.11 --repo Gaoshou101/CommandCodeBridge --pattern commandcodebridge_0.2.11_linux_amd64.zip --pattern checksums.txt --dir /tmp/bridge-previous
cd /tmp/bridge-previous
sha256sum --check --ignore-missing checksums.txt
cd "$GITHUB_WORKSPACE"
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_hot_reload.py --previous-archive /tmp/bridge-previous/commandcodebridge_0.2.8_linux_amd64.zip
CPA_BINARY=/tmp/cpa-test/cli-proxy-api python3 tests/cpa_hot_reload.py --previous-archive /tmp/bridge-previous/commandcodebridge_0.2.11_linux_amd64.zip
- uses: actions/download-artifact@v4
with:
name: cpamp-manager-test
Expand All @@ -77,7 +82,8 @@ jobs:
- runner: windows-2022
target: windows-amd64
extension: dll
- runner: macos-14
# macos-14 was retired on 2026-11-02; MACOSX_DEPLOYMENT_TARGET below keeps the shipped minimum at 14.0.
- runner: macos-15
target: darwin-arm64
extension: dylib
runs-on: ${{ matrix.runner }}
Expand All @@ -101,9 +107,16 @@ jobs:
env:
CGO_ENABLED: '1'
REPOSITORY: https://github.com/${{ github.repository }}
# Only read by the darwin toolchain; v0.2.11 and earlier shipped with minos 14.0.
MACOSX_DEPLOYMENT_TARGET: '14.0'
run: |
mkdir -p dist
go build -trimpath -buildvcs=false -buildmode=c-shared -ldflags="-s -w -X commandcodebridge/internal/bridge.Repository=$REPOSITORY" -o dist/commandcodebridge.${{ matrix.extension }} ./cmd/commandcodebridge
if [ "${{ matrix.target }}" = darwin-arm64 ]; then
minos="$(otool -l dist/commandcodebridge.dylib | awk '/LC_BUILD_VERSION/ {found=1} found && $1 == "minos" {print $2; exit}')"
echo "darwin dylib minos: $minos"
if [ "$minos" != "$MACOSX_DEPLOYMENT_TARGET" ]; then echo "::error::dylib minos $minos != $MACOSX_DEPLOYMENT_TARGET"; exit 1; fi
fi
helper=dist/commandcodebridge-login
if [ "${{ matrix.target }}" = windows-amd64 ]; then helper="$helper.exe"; fi
CGO_ENABLED=0 go build -trimpath -buildvcs=false -ldflags="-s -w" -o "$helper" ./cmd/commandcodebridge-login
Expand Down Expand Up @@ -135,6 +148,10 @@ jobs:
if ($LASTEXITCODE -ne 0) { throw 'Windows diagnostics integration failed' }
python tests/cpa_round2.py
if ($LASTEXITCODE -ne 0) { throw 'Windows round two integration failed' }
python tests/cpa_count_tokens.py
if ($LASTEXITCODE -ne 0) { throw 'Windows count_tokens integration failed' }
python tests/cpa_thinking_suffix.py
if ($LASTEXITCODE -ne 0) { throw 'Windows thinking suffix integration failed' }
python tests/cpa_hot_reload.py
if ($LASTEXITCODE -ne 0) { throw 'Windows live configuration integration failed' }
- name: ARM64 native host integration
Expand Down Expand Up @@ -164,6 +181,8 @@ jobs:
python tests/cpa_e2e.py
python tests/cpa_native_management.py
python tests/cpa_reliability.py
python tests/cpa_count_tokens.py
python tests/cpa_thinking_suffix.py
python tests/cpa_hot_reload.py
- uses: actions/upload-artifact@v4
with:
Expand Down Expand Up @@ -243,7 +262,8 @@ jobs:
needs: cpamp-web
runs-on: ubuntu-24.04
# Report candidate compatibility without changing the pinned release gate.
continue-on-error: true
# The weekly scheduled run fails visibly so a breaking CPA release is noticed.
continue-on-error: ${{ github.event_name != 'schedule' }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
Expand All @@ -270,11 +290,20 @@ jobs:
(cd dist/upstream-compatibility && sha256sum --check --ignore-missing checksums.txt && tar -xzf "$archive")
python scripts/embed_cpamp_panel.py dist/cpamp-web/*_cpamp-web.zip
go build -trimpath -buildvcs=false -buildmode=c-shared -o dist/upstream-compatibility/commandcodebridge.so ./cmd/commandcodebridge
# cpa_native_management.py drives the local OAuth helper from dist/.
CGO_ENABLED=0 go build -trimpath -buildvcs=false -o dist/commandcodebridge-login ./cmd/commandcodebridge-login
export CPA_BINARY="$PWD/dist/upstream-compatibility/cli-proxy-api"
export BRIDGE_LIBRARY="$PWD/dist/upstream-compatibility/commandcodebridge.so"
python tests/cpa_e2e.py 2>&1 | tee -a dist/upstream-compatibility/result.txt
python tests/cpa_reliability.py 2>&1 | tee -a dist/upstream-compatibility/result.txt
python tests/cpa_diagnostics.py 2>&1 | tee -a dist/upstream-compatibility/result.txt
# Run every check so the report is complete, then fail if any of them failed.
failed=()
for test in cpa_e2e cpa_reliability cpa_diagnostics cpa_native_management cpa_round2 cpa_count_tokens cpa_thinking_suffix cpa_hot_reload; do
echo "### $test" >> dist/upstream-compatibility/result.txt
if ! python "tests/$test.py" 2>&1 | tee -a dist/upstream-compatibility/result.txt; then failed+=("$test"); fi
done
if [ "${#failed[@]}" -ne 0 ]; then
echo "FAILED: ${failed[*]}" | tee -a dist/upstream-compatibility/result.txt
exit 1
fi
- name: Record candidate result
if: always()
shell: bash
Expand Down
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## [0.2.12] - 2026-11-07

### Fixed

- `count_tokens` 改为插件本地返回 404 `count_tokens_unsupported`,不访问上游。CPA v8.0.23 等较早宿主会把原先的 501 当作凭证故障并冷却,随后的 `/v1/messages` 返回 503 `auth_unavailable`(CLIProxyAPI #7271,上游修复 `1c53721`);已在 v8.0.23 复现并验证修复。
- 支持 CPA 模型名思考后缀 `model(level)`/`model(budget)`。v8.0.59 之前的宿主把带后缀的模型名原样交给插件,插件此前返回 404,宿主随即把凭证标为 unavailable(v8.0.23 实测约 12 小时后才重试),未带后缀的同模型请求也变为 503。插件现按宿主规则解析后缀(`none`、`auto`/`-1`、`minimal`–`max`,数值预算按 512/1024/8192/24576 分级),并覆盖请求体中的推理设置;无法识别的后缀忽略。
- CPA v8.0.59 会先剥离后缀,但插件以原始请求体重建原生 Messages 请求时丢失了后缀指定的等级,现已从原始模型名补回。宿主注入的 `reasoning_effort=auto` 不再发往上游,也不再在 Anthropic 模型上返回 400。

### Changed

- 新增 `cpa_count_tokens.py` 与 `cpa_thinking_suffix.py` 宿主联测,接入固定 v8.0.23 基线、Windows、Linux/macOS ARM64 和最新 CPA 候选任务;候选任务另跑原生管理、第二轮协议和热重载检查。
- 新增每周定时运行,用于复核最新 CPA 候选;定时运行时候选失败会使工作流显式失败,非标签运行不发布。热升级联测的前一版本改为 v0.2.11。
- macOS Apple Silicon 包改在 `macos-15` runner 构建(GitHub 已于 2026-11-02 停用 `macos-14`),以 `MACOSX_DEPLOYMENT_TARGET=14.0` 保持最低 macOS 14.0 不变,并在构建后校验。

## [0.2.11] - 2026-10-23

### Fixed
Expand Down
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@
- **原生额度窗口**:在 CPAMP 列表、卡片和详情查看 5h、周、月额度,查询窗口请求统计、预测和周期快照。
- **请求记录**:查看凭证健康度、tokens、缓存用量、预估花费、首字耗时、输出速率及模型统计;支持明暗主题和手机布局。

当前版本 **v0.2.11**。插件调用官方 Provider API;Go 订阅的 `/alpha/generate` 路径和固定上游 provider 模式不在支持范围内。账户用量通过官方 `/alpha/...` 查询接口读取,模型权限以实际套餐为准。
当前版本 **v0.2.12**。插件调用官方 Provider API;Go 订阅的 `/alpha/generate` 路径和固定上游 provider 模式不在支持范围内。账户用量通过官方 `/alpha/...` 查询接口读取,模型权限以实际套餐为准。

### v0.2.12 更新

修复两类会让 CPA 宿主误冷却凭证的请求:`count_tokens` 改为本地 404,不再在 v8.0.23 等宿主上触发随后的 503 `auth_unavailable`;`model(high)`、`model(16384)` 等思考后缀按宿主规则解析,不再因 404 冷却基础模型。CI 新增对应宿主联测,并每周复核最新 CPA 候选版本。

### v0.2.11 更新

Expand All @@ -39,7 +43,7 @@ plugins:
- https://raw.githubusercontent.com/Gaoshou101/CommandCodeBridge/main/registry.json
```

保存并重载配置,在 CPAMP「插件商店」找到 **CommandCodeBridge**,选择 Latest 或 **v0.2.11** 安装。支持热升级的宿主会下载匹配平台的 ZIP、验证校验值并切换版本;安装后检查插件控制台显示的运行版本。
保存并重载配置,在 CPAMP「插件商店」找到 **CommandCodeBridge**,选择 Latest 或 **v0.2.12** 安装。支持热升级的宿主会下载匹配平台的 ZIP、验证校验值并切换版本;安装后检查插件控制台显示的运行版本。

也可从 [Releases](https://github.com/Gaoshou101/CommandCodeBridge/releases/latest) 手动下载 ZIP 和 `checksums.txt`。按 **CPA 所在服务器**选择动态库:

Expand All @@ -65,7 +69,7 @@ Linux 发布包要求 glibc ≥2.34;Alpine/musl 需自行构建。手动安装

## 安装或更新原生面板

**升级插件后还要更新 CPAMP 页面**,才能使用新版凭证布局。v0.2.11 动态库已内嵌匹配页面。
**升级插件后还要更新 CPAMP 页面**,才能使用新版凭证布局。v0.2.12 动态库已内嵌匹配页面。

CPA 与 Manager Server 在同一主机直接运行时:

Expand All @@ -80,7 +84,7 @@ CPA 与 Manager Server 在同一主机直接运行时:
| 首次启用外部页面,或更改 Manager Server 的页面路径 | 重启 Manager Server 一次 |
| 迁移插件数据目录,或旧宿主不支持动态库热升级 | 安排相应服务重启 |

Manager Server 在另一台主机或独立容器中时,在其运行环境安装 `commandcodebridge_0.2.11_cpamp-web.zip` 内的 `management.html`,通过 `PANEL_PATH` 或 `panelPath` 托管。面板源码基线见 [compatibility.json](./internal/bridge/compatibility.json) 的 `cpamp_source_commit`;不同版本应在匹配源码上应用适配。
Manager Server 在另一台主机或独立容器中时,在其运行环境安装 `commandcodebridge_0.2.12_cpamp-web.zip` 内的 `management.html`,通过 `PANEL_PATH` 或 `panelPath` 托管。面板源码基线见 [compatibility.json](./internal/bridge/compatibility.json) 的 `cpamp_source_commit`;不同版本应在匹配源码上应用适配。

**完整周期快照另需 Manager Server 接受 `commandcode` 平台。** 前端包附带适配脚本、服务器名单补丁和测试;按现有 Manager Server 的同一源码版本重建并部署。仅更新插件和页面不能替代这个服务器改动。[原生集成说明](./integrations/cpamp/README.md)包含构建、HTTP 生效核验和回滚步骤。

Expand Down
8 changes: 7 additions & 1 deletion docs/DEPLOYMENT.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
# CPAMP 部署、升级与回滚

本文说明 CommandCodeBridge v0.2.11 的安装、页面更新与回滚。路径应以实际运行环境为准;历史排查中的路径仅用于说明当时的问题。
本文说明 CommandCodeBridge v0.2.12 的安装、页面更新与回滚。路径应以实际运行环境为准;历史排查中的路径仅用于说明当时的问题。

## v0.2.12:count_tokens 与思考后缀兼容

1. 更新插件至 v0.2.12,确认实际运行版本;配置无需修改。
2. 页面功能未变,但页面带插件版本标识,仍按下节步骤在「设置 → CPAMP 原生面板」更新页面并强刷浏览器。
3. 此前因 `count_tokens` 或带后缀模型名被冷却的凭证会显示 unavailable(v8.0.23 实测约 12 小时后重试);重启 CPA 可立即恢复。插件热升级是否清除宿主冷却未验证。

## v0.2.11:更新 Antigravity 面板身份

Expand Down
23 changes: 22 additions & 1 deletion docs/RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,27 @@
# CommandCodeBridge 发布说明

## v0.2.11
## v0.2.12

发布日期:2026-11-07。CPA 原生插件,C ABI 1 / RPC schema 6;调用官方 Provider API。

### 本次更新

- **count_tokens 不再导致凭证冷却**:插件本地返回 404 `count_tokens_unsupported`,不访问上游。较早宿主(含 v8.0.23)会因原先的 501 冷却凭证,使随后的 `/v1/messages` 返回 503 `auth_unavailable`(CLIProxyAPI #7271)。
- **支持模型名思考后缀**:`model(high)`、`model(16384)` 等写法在 v8.0.23 起的宿主上均可用,按宿主规则换算推理等级并覆盖请求体设置;修复前较早宿主会冷却对应基础模型。v8.0.59 上原生 Messages 丢失后缀等级、`auto` 等级在 Anthropic 模型返回 400 的问题一并修复。
- **兼容性回归**:新增 count_tokens 与思考后缀宿主联测,覆盖固定基线、四平台和最新 CPA 候选;每周定时复核最新 CPA,候选失败会显式报警且不发布。
- **macOS 构建环境**:GitHub 已停用 `macos-14` runner,macOS 包改在 `macos-15` 构建;最低系统要求仍为 macOS 14.0。

### 升级步骤

1. 更新插件至 **v0.2.12**,确认实际运行版本。无需修改配置。
2. 本次未改变 CPAMP 页面功能;页面带插件版本标识,仍建议在「设置 → CPAMP 原生面板」更新页面,异机/独立容器使用 `commandcodebridge_0.2.12_cpamp-web.zip`。
3. 使用思考后缀的客户端无需改动。在 v8.0.23 上实测,修复前一次带后缀请求会使凭证显示 unavailable,约 12 小时后才重试;重启 CPA 后立即恢复。插件热升级本身是否清除宿主已记录的冷却未验证,如仍不可用请重启 CPA。

### 下载与校验

四平台原生 ZIP、独立 CPAMP 前端 ZIP、五个 `.zip.sha256` 和统一 `checksums.txt`,共 **11 个资产**。CPA 发布门槛仍为 v8.0.23;v8.0.59 作为候选版本在 Windows 本地完成全套宿主联测,并由 CI 候选任务持续复核,不改变发布门槛。本次只使用本地模拟上游,未进行真实模型生成,未访问或修改任何部署服务器。

## 已发布 v0.2.11

发布日期:2026-10-23。CPA 原生插件,C ABI 1 / RPC schema 6;调用官方 Provider API。

Expand Down
28 changes: 28 additions & 0 deletions docs/VALIDATION.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,33 @@
# 开发验证记录

## v0.2.12 CPA 兼容修复(2026-11-07,未发布源码)

本轮只使用本地模拟上游,未进行真实模型生成,未访问或修改任何部署服务器。CPA 发布门槛仍为 v8.0.23;`compatibility.json` 未改动。

### 问题复现

- **count_tokens**:v0.2.11 对 `/v1/messages/count_tokens` 返回 501。在 Windows CPA v8.0.23 上复现:宿主把 501 当作凭证故障冷却凭证,随后同模型的 `/v1/messages` 返回 503 `auth_unavailable`(CLIProxyAPI #7271,上游修复 `1c53721`)。
- **思考后缀**:v8.0.23 把 `mock-chat(high)` 原样交给插件,v0.2.11 返回 404,宿主随即把凭证标为 unavailable,未带后缀的同模型请求也变为 503。实测约 12 小时后宿主才重试;重启 CPA 立即恢复。插件热升级本身是否清除宿主已记录的冷却未验证。
- v8.0.59(上游 `c9af529`)由宿主剥离后缀,但 v0.2.11 以原始请求体重建原生 Messages 请求时丢失后缀等级;宿主注入的 `reasoning_effort=auto` 在 Chat 模型上原样发往上游,在 Anthropic 模型上返回 400 `unsupported Anthropic reasoning effort`。
- 新增 `tests/cpa_thinking_suffix.py` 使用修复前动态库在 v8.0.23 与 v8.0.59 上均失败,确认该测试能识别上述问题。

### 自动化与宿主联测

- Windows Go 1.26 `go vet ./internal/... ./cmd/...`、`gofmt -l` 与 `go test ./internal/... ./cmd/... -count=1` 通过,包括新增的 count_tokens 与思考后缀单元测试;Node **31 项**通过;`test_cpamp_panel_validation.py` 在 WSL Python 3.10 下 6 项通过(Windows 商店版 Python 的 `python.exe` 无法被 `shutil.copyfile` 读取,该用例在本机 Windows 上属于环境错误,非代码失败)。
- Windows amd64 动态库(WSL 交叉编译,晚于最后一次源码修改)在实际 Windows CPA **v8.0.23** 与 **v8.0.59** 上各运行 9 项,共 **18/18 通过**:`cpa_e2e.py`(25 个请求)、`cpa_native_management.py`、`cpa_reliability.py`、`cpa_diagnostics.py`、`cpa_round2.py`(13 次模拟请求,真实请求 0)、`cpa_count_tokens.py`(两类模型各 3 轮 count_tokens 均为 404、随后 Messages 均为 200)、`cpa_thinking_suffix.py`(Chat/Responses/原生 Messages、流式与请求体覆盖,事后无冷却)、`cpa_hot_reload.py`,以及以 v0.2.11 正式 Windows 包(SHA-256 与发布 checksums 一致)为前一版本的 `cpa_hot_reload.py --previous-archive`,确认同一 CPA 进程内 0.2.11 → 0.2.12 热升级。
- `tests/cpa_store_install.py` 在隔离 Windows CPA v8.0.59 中通过:匿名公开源发现、Release 选包、校验安装、重启加载。当时 `main` 的 `registry.json` 仍为 0.2.11,因此该次按 0.2.11 断言,验证的是 v8.0.59 宿主的商店安装路径,不代表 v0.2.12 资产已发布。

### CI 变更

- GitHub 已于 2026-11-02 停用 `macos-14` runner;PR #14 的 macOS 任务即因 `The configuration 'macos-14-arm64-us-default' is not supported` 被取消。darwin-arm64 改用 `macos-15`,并以 `MACOSX_DEPLOYMENT_TARGET=14.0` 保持与 v0.2.11 相同的最低系统(v0.2.11 发布包 dylib 的 `LC_BUILD_VERSION` 为 minos 14.0/SDK 14.5),构建后用 `otool -l` 校验。macOS 构建只能在 CI 验证,本机未运行。
- 新增每周定时运行;最新 CPA 候选任务加跑原生管理、第二轮协议、count_tokens、思考后缀与热重载,定时运行时候选失败会使工作流失败。热升级联测的前一版本改为 v0.2.11。
- PR #15 首次 CI 中,候选任务(v8.0.59)的 e2e/可靠性/诊断通过,`cpa_native_management.py` 因该任务未构建本地 OAuth 辅助程序 `dist/commandcodebridge-login` 而报 `FileNotFoundError`(测试环境缺失,非插件行为)。已在候选任务中构建该程序,并改为逐项运行全部联测、汇总失败后再退出,避免前一项失败掩盖后续结果。

### 待验证

- 四平台 CI(尤其 `macos-15` 与 Linux ARM64 上的新增联测)。
- 真实上游下的思考后缀等级效果与 count_tokens 客户端行为。

## v0.2.10 发版记录(2026-10-18)

用户已授权合并 PR #12 并发版。发布任务新增标签与源码版本、同一来源提交、四平台及 CPAMP 页面一致性检查;仅在协议测试、构建和校验通过后发布 11 个资产。实际发布状态以 [Release](https://github.com/Gaoshou101/CommandCodeBridge/releases/tag/v0.2.10) 和对应标签 CI 为准。下方“未发布”描述保留为当轮验证时的历史状态,不代表真实上游验收已经完成。本次不部署目标服务。
Expand Down
Loading
Loading