🎉 Stable Release v3.5.45
Multi-Architecture Binaries
Download the appropriate binary for your platform:
- Linux x86_64:
better-ccflare-linux-amd64 - Linux ARM64 (Raspberry Pi 3/4/5, Oracle Cloud ARM, AWS Graviton):
better-ccflare-linux-arm64 - macOS Intel:
better-ccflare-macos-x86_64 - macOS Apple Silicon:
better-ccflare-macos-arm64 - Windows x86_64:
better-ccflare-windows-x64.exe
Installation
# Linux x86_64
wget https://github.com/tombii/better-ccflare/releases/download/v3.5.45/better-ccflare-linux-amd64
chmod +x better-ccflare-linux-amd64
./better-ccflare-linux-amd64
# macOS Apple Silicon (ARM64)
curl -L -o better-ccflare-macos-arm64 https://github.com/tombii/better-ccflare/releases/download/v3.5.45/better-ccflare-macos-arm64
chmod +x better-ccflare-macos-arm64
xattr -d com.apple.quarantine better-ccflare-macos-arm64 # Required for unsigned binaries
./better-ccflare-macos-arm64macOS Users: The xattr command is required to bypass Gatekeeper for unsigned binaries. If you prefer not to run unsigned binaries, install from source instead.
Or install via npm: npm install -g better-ccflare@v3.5.45
What's Changed
🚀 Features
- feat(version): CCFLARE_BUILD_SUFFIX for patched-build identification (
1362d2f0) - feat: expose the stream terminal state through the API (
23cf0cea) - feat(http-api): add GET /api/capacity-state endpoint (
27e17e49) - feat(proxy): per-account SSE stream admission control (
65b2bf9a) - feat(proxy): add circuit_open reason to pool-exhausted response (
68866886) - feat: persist the client session id with each request (
866282e4) - feat(proxy): circuit breaker core state machine (
86e87324) - feat: surface anomaly totals and severity in the Insights UI (
87779dbf) - feat(proxy): drain stream-admission waiters on circuit_open (
ecf3f19e)
🐛 Bug Fixes
- fix: wire minimax usage polling into server bootstrap and instrument unknown model_name (
03cc6deb) - fix: repair broken tests and eliminate cross-file mock.module pollution [skip-version] (
053746c1) - fix(proxy): enforce RateLimitReason exhaustiveness in circuit breaker (F1.a, ported) (
11c27531) - fix(dashboard): derive anomaly threshold text from response meta (
12ce70a5) - fix: bound the stored session id and attribute failure rows too (
190aca0c) - fix(proxy): make pool-exhausted 503 usage-aware (
21f2a2dd) - fix(pg): collapse GROUP BY expression and drop ? IN (...) sentinel for PostgreSQL (
33ef2be9) - fix(minimax): positive status_code allowlist (review finding F5) (
36a35b99) - fix(minimax): warn on missing API key + distinguish summary log (Greptile #350 P2) (
4c831a8e) - fix: stop reporting a missing payload as a missing request (
5144a7a0) - fix(proxy): fold merge fixup and lint formatting into PR #349 merge [skip-version] (
5442dee2) - fix(issue-273): cancel abandoned extractUsageInfo clone after await (
57a982ea) - fix(proxy): break Zai 100%/100% usage ties by the later reset (
65791a85) - fix: add MinimaxUsageData type to close a typecheck gap from PR #372 (
7b1ea136) - fix(#273): remove unreliable leak harness, correct drain chunk-size docs [skip-version] (
7b7e2a80) - fix: make the terminal-state guarantees hold (
7d753e8f) - fix(proxy): align circuit breaker to upstream vocabulary and bound cooldown (
840d6494) - fix: validate CCFLARE_BUILD_SUFFIX to prevent shell injection (
84ea1700) - fix(proxy): wire circuit breaker into cooldown chokepoint and active-clear (
89cb0aef) - fix: strip regex lookaround from tool schemas forwarded to OpenAI (
8a752ec1) - fix(pg-harness): align 7 assertion failures + coerce Bun.SQL BIGINT to Number (
946b23cb) - fix: attribute the two synthetic failure paths as well (
952a0fe7) - fix(dashboard): render per-window MiniMax usage from canonical seven_day key (
95e827b4) - fix(issue-273): use drainBody instead of body.cancel() for the usage clone (
b1f32d9f) - fix: harden the live path and the guard test that guarded nothing (
b3c69ad6) - fix: narrow the persisted terminal state instead of casting it (
b5b77539) - fix(proxy): update stream-admission test to upstream RateLimitReason literal (
b61cf4f9) - fix: release teed response bodies outside the 529 path (
bcbe9954) - fix(http-api): keep raw project through anomaly detection (
c0502b91) - fix: end the request on client disconnect instead of failing over (
cec5b5b9) - fix(proxy): dispose orphaned response clones on the 529 overload path (
df9155cd) - fix(issue-273): drain discarded response bodies on failover/retry paths (
ef42b42f) - fix(database,http-api): bind no_account bucket to NULL and legacy literal alike (
f11c3c36) - fix(proxy): pair Zai pool-exhausted reset with the winning window (
f47702bf) - fix: abort the upstream fetch when the client disconnects (
fd389fd2) - fix(proxy): close circuit on request success and strip stream-admission (
ff85f026)
🔒 Security
- security: validate header-derived project names against isLowRiskProjectSlug (fixes #373) (
c65d7aa6)
🙏 Thanks to our contributors
- Thanks to @lunetics for #358, #360, #362, #363, #364
- Thanks to @vansh2408 for #359
- Thanks to @zenprocess for #349, #350, #352, #353, #361, #365, #369, #371, #372