merge: pull mhiqrambg/9router-mibp-version into master

Merge the MIBP fork (v1.0.14, synced to decolua v0.5.81) into our master
(0.5.86) at merge-base a8c9d380. Keep HEAD's infra policy (untracked
lockfile, mirror-configurable Dockerfile, decolua GHCR/DockerHub, README)
while absorbing the fork's engine features:

- feat(providers): freebuff provider + executor + OAuth + usage tracking
- feat(providers): cline free-tier models, Freebuff catalog sync
- feat(proxy-pools): pool egress geo probe, proxy-pool fitness + retry
- fix(usage): hide noAuth providers (devin-cli, mimo-free) from usage list
- test(harness): DATA_DIR isolation so tests never write the real DB
- fix(codebuddy-intl): probe token in connection test, OAuth by identity
- chore(guards): durable markers so fixes aren't silently dropped

Resolutions:
- registry/index.js regenerated deterministically (122 providers, alpha
  order). trae/windsurf/devin-cli stay hidden per HEAD security posture
  (no tool-calling / local-agent shell access) — not re-enabled.
- nonStreamingHandler: drop the generic unconditional unwrapDataEnvelope
  call; envelope unwrap stays scoped to clineEnvelope-quirk providers
  (unwrapClineEnvelope), fixing a latent mibp bug where non-opted-in
  providers ({success,data} bodies) were stripped.
- Drop fork-local Docker lockfile policy (package-lock.json, AGENTS.md,
  .npmrc verify scripts): this repo keeps package-lock untracked (nix
  build deploy). .npmrc (audit=false/fund=false) kept.
- Keep gitbook-pages workflow enabled (ours); mibp disabled it.
- Restore 13 upstream tests mibp deleted (they cover features we keep).

Verified: 2841 tests, 2687 pass, fail set byte-identical to HEAD (zero
new regressions); providers/alias/oauth baselines regenerated to merged
code and all green.
This commit is contained in:
asepharyana committed 2026-09-23 11:44:58 +07:00
commit 2bc9d67d26
96 files changed
+7709 -1787

No files matched your search

+15 -1
View File
@@ -14,8 +14,9 @@ export default {
},
},
category: "oauth",
authModes: ["oauth"],
authModes: ["oauth", "apikey"],
hasOAuth: true,
authHint: "API key dari app.cline.bot → Settings > API Keys, atau login OAuth via browser.",
transport: {
baseUrl: "https://api.cline.bot/api/v1/chat/completions",
headers: {
@@ -30,6 +31,9 @@ export default {
combined: true,
header: "Authorization",
scheme: "bearer",
// Hook owns Authorization: workos:-prefixed OAuth vs plain API key
// (a merged token can't express both) — see applyAuth.
preserveHookAuth: true,
hooks: [
"clineHeaders",
],
@@ -44,6 +48,16 @@ export default {
{ id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview" },
{ id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview" },
{ id: "kwaipilot/kat-coder-pro", name: "KAT Coder Pro" },
// Free tier (verified live via GET /api/v1/ai/cline/recommended-models):
// billed $0 on usage, limited quota separate from ClinePass. The
// cline-free/* aliases require Cline product headers (see shared/clineAuth.js)
// or upstream 403s with "only available via Cline product surfaces".
{ id: "cline-free/muse-spark-1.3-contributor", name: "Muse Spark 1.3 (Free)" },
{ id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash (Free)" },
{ id: "z-ai/glm-5.3-flash", name: "GLM 5.3 Flash (Free)" },
{ id: "cline-free/solar-pro4", name: "Solar Pro 4 (Free)" },
{ id: "cline-free/longcat-2.0", name: "LongCat 2.0 (Free)" },
{ id: "poolside/laguna-s-2.1:free", name: "Laguna S 2.1 (Free)" },
],
oauth: {
appBaseUrl: "https://app.cline.bot",
+3
View File
@@ -31,6 +31,9 @@ export default {
combined: true,
header: "Authorization",
scheme: "bearer",
// Hook owns Authorization: workos:-prefixed OAuth vs plain API key
// (a merged token can't express both) — see applyAuth.
preserveHookAuth: true,
hooks: [
"clineHeaders",
],
+106
View File
@@ -0,0 +1,106 @@
/**
* Freebuff — the free, ad-supported coding agent by Codebuff (freebuff.com).
*
* The Freebuff CLI (github.com/CodebuffAI/freebuff) is an interactive TUI that
* talks to the Codebuff/Freebuff backend. Two hosts are involved:
* - login flow (freebuff mode) runs on https://freebuff.com
* POST /api/auth/cli/code {fingerprintId} → { loginUrl, fingerprintHash, expiresAt }
* open loginUrl in browser, then GET /api/auth/cli/status until {user}.
* (The server echoes the request host into loginUrl, so calling
* freebuff.com yields freebuff.com/login?auth_code=… exactly like the
* official CLI — www.codebuff.com would yield the wrong link.)
* - LLM traffic goes to the OpenAI-compatible endpoint on
* https://www.codebuff.com/api/v1/chat/completions
* (freebuff.com does NOT serve /api/v1/* — it 404s with the SPA shell.)
*
* Both hosts share one backend: the authToken obtained via the freebuff.com
* login validates against www.codebuff.com (Bearer auth). The request body
* must carry the CLI's `codebuff` provider block
* (`codebuff_metadata.run_id/client_id/cost_mode`) — injected by
* executors/freebuff.js. cost_mode:"free" is what admits a session on the free
* (country-gated, session-limited) tier instead of billing credits.
*/
export default {
id: "freebuff",
priority: 45,
hasFree: true,
alias: "fb",
uiAlias: "fb",
display: {
name: "Freebuff",
icon: "bolt",
color: "#84CC16",
textIcon: "FB",
website: "https://freebuff.com",
notice: {
signupUrl: "https://freebuff.com",
text: "Free ad-supported coding agent by Codebuff. Sign in with your Freebuff/Codebuff account via browser login. Each model is priced in Freebucks per hour of session, charged once when the session starts. Your daily Freebucks refill at midnight Pacific; the wallet keeps what you buy or earn. Free tier is ad-supported and limited in some regions (limited mode: 6 x 1-hour sessions/day); full mode runs in select countries. ⚠️ One account has ONE active session locked to ONE model — rLine truncated
},
},
category: "free",
authType: "oauth",
authModes: ["oauth"],
hasOAuth: true,
transport: {
baseUrl: "https://www.codebuff.com/api/v1/chat/completions",
format: "openai",
headers: {
"User-Agent": "ai-sdk/openai-compatible/1.0/codebuff",
},
retry: {
429: { attempts: 2, delayMs: 2000 },
503: { attempts: 2, delayMs: 1500 },
},
// Session endpoint doubles as the quota API: GET /api/v1/freebuff/session
// returns the shared daily session quota (rateLimitsByModel) without
// claiming anything — POST would burn a session, so quota reads are GET
// only (see services/usage/freebuff.js).
usage: {
url: "https://www.codebuff.com/api/v1/freebuff/session",
},
},
features: {
usage: true,
},
// Mirrors the Freebuff waiting-room picker (upstream FREEBUFF_MODELS) as of
// 2026-09-11. NO per-model prices live here: Freebucks pricing is
// server-authoritative — the session response's `freebucks` block carries
// `prices` (model → Freebucks/hr) plus an announced `priceChanges` schedule
// (promos like Solar Pro 4's Labor Day run expire server-side; see
// services/usage/freebuff.js which folds both in, exactly like the upstream
// CLI which hardcodes no number). Plus the capacity-limited Fable trial.
// deepseek-v4-pro and minimax-m3 were withdrawn upstream (2026-08-26 /
// 2026-08-20) and ox-alpha (2026-08-27) + gemini-3.8-flash (2026-09-03)
// never stuck — none are claimable anymore.
// z-ai/glm-5.2 is a referral reward (not a free pick), luna-es / kimi-k3-eco
// are god-only rows, and the `-max` variants are provisioned per-account —
// all intentionally omitted. Fable is a capacity-limited WAVE trial: sessions
// only claim while the backend advertises it via limitedModelOffers on the
// session status (the executor auto-checks before claiming); the model is
// otherwise refused.
// meta/muse-spark-1.3-contributor was withdrawn upstream 2026-09-07 (Meta
// returns 404 model_not_found on every key) and replaced in the picker by
// meta/muse-spark-1.2-contributor — same Contributor terms/pool. 1.3 is
// intentionally NOT listed: 9Router has no server-side coercion, so a dead
// pick would only fail.
// deepseek/deepseek-v4-flash was RENAMED upstream 2026-09-10 to DeepSeek
// V4.1 Flash (same undated wire id, new build) — display label follows.
models: [
{ id: "z-ai/glm-5.3-flash", name: "GLM 5.3 Flash" },
{ id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4.1 Flash" },
{ id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna" },
{ id: "mimo/mimo-v2.5", name: "MiMo 2.5" },
{ id: "upstage/solar-pro4", name: "Solar Pro 4" },
{ id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2" },
{ id: "anthropic/claude-fable-5", name: "Claude Fable 5 (limited offer)" },
],
// Login-flow host — the CLI in freebuff mode logs in via freebuff.com, and
// the server builds loginUrl from the host it was called on, so the link the
// user opens must come from freebuff.com to match the official CLI.
oauth: {
baseUrl: "https://freebuff.com",
loginCodePath: "/api/auth/cli/code",
loginStatusPath: "/api/auth/cli/status",
oauthTimeoutMs: 300000,
},
};
+126 -131
View File
@@ -1,130 +1,127 @@
// Auto-generated: static imports for all registry entries
import p0 from "./alicode-intl.js";
import p1 from "./alicode.js";
import p2 from "./anthropic.js";
import p3 from "./antigravity.js";
import p4 from "./assemblyai.js";
import p5 from "./aws-polly.js";
import p6 from "./azure.js";
import p7 from "./black-forest-labs.js";
import p8 from "./blackbox.js";
import p9 from "./brave-search.js";
import p10 from "./byteplus.js";
import p11 from "./cartesia.js";
import p12 from "./cerebras.js";
import p13 from "./chutes.js";
import p14 from "./claude.js";
import p15 from "./cline.js";
import p16 from "./clinepass.js";
import p17 from "./cloudflare-ai.js";
import p18 from "./codebuddy-cn.js";
import p19 from "./codex.js";
import p20 from "./cohere.js";
import p21 from "./comfyui.js";
import p22 from "./commandcode.js";
import p23 from "./coqui.js";
import p24 from "./cursor.js";
import p25 from "./deepgram.js";
import p26 from "./deepseek.js";
import p27 from "./edge-tts.js";
import p28 from "./elevenlabs.js";
import p29 from "./exa.js";
import p30 from "./fal-ai.js";
import p31 from "./featherless.js";
import p32 from "./firecrawl.js";
import p33 from "./fireworks.js";
import p34 from "./gemini-cli.js";
import p35 from "./gemini.js";
import p36 from "./github.js";
import p37 from "./gitlab.js";
import p38 from "./glm-cn.js";
import p39 from "./glm.js";
import p40 from "./google-pse.js";
import p41 from "./google-tts.js";
import p42 from "./grok-cli.js";
import p43 from "./grok-web.js";
import p44 from "./groq.js";
import p45 from "./huggingface.js";
import p46 from "./hyperbolic.js";
import p47 from "./iflow.js";
import p48 from "./inworld.js";
import p49 from "./jina-ai.js";
import p50 from "./jina-reader.js";
import p51 from "./kilocode.js";
import p52 from "./kimchi.js";
import p53 from "./kimi.js";
import p54 from "./kiro.js";
import p55 from "./linkup.js";
import p56 from "./local-device.js";
import p57 from "./mimo-free.js";
import p58 from "./minimax-cn.js";
import p59 from "./minimax.js";
import p60 from "./mistral.js";
import p61 from "./mmf.js";
import p62 from "./nanobanana.js";
import p63 from "./nebius.js";
import p64 from "./nvidia.js";
import p65 from "./ollama-local.js";
import p66 from "./ollama.js";
import p123 from "./ollama-search.js";
import p67 from "./openai.js";
import p68 from "./opencode-go.js";
import p68z from "./opencode-zen.js";
import p69 from "./opencode.js";
import p70 from "./openrouter.js";
import p71 from "./perplexity-web.js";
import p72 from "./perplexity.js";
import p73 from "./perplexity-agent.js";
import p74 from "./playht.js";
import p75 from "./qoder.js";
import p124 from "./qoder-cn.js";
import p77 from "./recraft.js";
import p78 from "./runwayml.js";
import p79 from "./sdwebui.js";
import p80 from "./searchapi.js";
import p81 from "./searxng.js";
import p82 from "./serper.js";
import p83 from "./siliconflow.js";
import p84 from "./stability-ai.js";
import p85 from "./tavily.js";
import p86 from "./together.js";
import p87 from "./topaz.js";
import p88 from "./tortoise.js";
import p89 from "./venice.js";
import p90 from "./vercel-ai-gateway.js";
import p91 from "./vertex-partner.js";
import p92 from "./vertex.js";
import p93 from "./volcengine-ark.js";
import p94 from "./voyage-ai.js";
import p95 from "./xai.js";
import p96 from "./xiaomi-mimo.js";
import p97 from "./xiaomi-tokenplan.js";
import p98 from "./youcom.js";
import p99 from "./alims-intl.js";
import p100 from "./codebuddy-intl.js";
// Temporarily hidden — no tool calling support (trae SOLO agent / windsurf gRPC skip ToolCallChunk).
// Re-enable by uncommenting both the import and the array entry below.
// import p102 from "./trae.js";
import p103 from "./zed.js";
import p105 from "./api-airforce.js";
import p106 from "./baidu.js";
import p107 from "./bazaarlink.js";
import p108 from "./bluesminds.js";
import p109 from "./kilo-gateway.js";
import p110 from "./llm7.js";
import p111 from "./sambanova.js";
import p112 from "./tencent.js";
import p113 from "./morph.js";
// import p114 from "./devin-cli.js";
// import p104 from "./windsurf.js";
import p115 from "./poolside.js";
import p116 from "./tokenrouter.js";
import p117 from "./selfhosted-stt.js";
import p118 from "./selfhosted-tts.js";
import p119 from "./selfhosted-embedding.js";
import p120 from "./fish-audio.js";
import p121 from "./alitp-intl.js";
import p122 from "./xquik.js";
import p2 from "./alims-intl.js";
import p3 from "./alitp-intl.js";
import p4 from "./anthropic.js";
import p5 from "./antigravity.js";
import p6 from "./api-airforce.js";
import p7 from "./assemblyai.js";
import p8 from "./aws-polly.js";
import p9 from "./azure.js";
import p10 from "./baidu.js";
import p11 from "./bazaarlink.js";
import p12 from "./black-forest-labs.js";
import p13 from "./blackbox.js";
import p14 from "./bluesminds.js";
import p15 from "./brave-search.js";
import p16 from "./byteplus.js";
import p17 from "./cartesia.js";
import p18 from "./cerebras.js";
import p19 from "./chutes.js";
import p20 from "./claude.js";
import p21 from "./cline.js";
import p22 from "./clinepass.js";
import p23 from "./cloudflare-ai.js";
import p24 from "./codebuddy-cn.js";
import p25 from "./codebuddy-intl.js";
import p26 from "./codex.js";
import p27 from "./cohere.js";
import p28 from "./comfyui.js";
import p29 from "./commandcode.js";
import p30 from "./coqui.js";
import p31 from "./cursor.js";
import p32 from "./deepgram.js";
import p33 from "./deepseek.js";
import p34 from "./edge-tts.js";
import p35 from "./elevenlabs.js";
import p36 from "./exa.js";
import p37 from "./fal-ai.js";
import p38 from "./featherless.js";
import p39 from "./firecrawl.js";
import p40 from "./fireworks.js";
import p41 from "./fish-audio.js";
import p42 from "./freebuff.js";
import p43 from "./gemini-cli.js";
import p44 from "./gemini.js";
import p45 from "./github.js";
import p46 from "./gitlab.js";
import p47 from "./glm-cn.js";
import p48 from "./glm.js";
import p49 from "./google-pse.js";
import p50 from "./google-tts.js";
import p51 from "./grok-cli.js";
import p52 from "./grok-web.js";
import p53 from "./groq.js";
import p54 from "./huggingface.js";
import p55 from "./hyperbolic.js";
import p56 from "./iflow.js";
import p57 from "./inworld.js";
import p58 from "./jina-ai.js";
import p59 from "./jina-reader.js";
import p60 from "./kilo-gateway.js";
import p61 from "./kilocode.js";
import p62 from "./kimchi.js";
import p63 from "./kimi.js";
import p64 from "./kiro.js";
import p65 from "./linkup.js";
import p66 from "./llm7.js";
import p67 from "./local-device.js";
import p68 from "./mimo-free.js";
import p69 from "./minimax-cn.js";
import p70 from "./minimax.js";
import p71 from "./mistral.js";
import p72 from "./mmf.js";
import p73 from "./morph.js";
import p74 from "./nanobanana.js";
import p75 from "./nebius.js";
import p76 from "./nvidia.js";
import p77 from "./ollama-local.js";
import p78 from "./ollama-search.js";
import p79 from "./ollama.js";
import p80 from "./openai.js";
import p81 from "./opencode-go.js";
import p82 from "./opencode-zen.js";
import p83 from "./opencode.js";
import p84 from "./openrouter.js";
import p85 from "./perplexity-agent.js";
import p86 from "./perplexity-web.js";
import p87 from "./perplexity.js";
import p88 from "./playht.js";
import p89 from "./poolside.js";
import p90 from "./qoder-cn.js";
import p91 from "./qoder.js";
import p92 from "./recraft.js";
import p93 from "./runwayml.js";
import p94 from "./sambanova.js";
import p95 from "./sdwebui.js";
import p96 from "./searchapi.js";
import p97 from "./searxng.js";
import p98 from "./selfhosted-embedding.js";
import p99 from "./selfhosted-stt.js";
import p100 from "./selfhosted-tts.js";
import p101 from "./serper.js";
import p102 from "./siliconflow.js";
import p103 from "./stability-ai.js";
import p104 from "./tavily.js";
import p105 from "./tencent.js";
import p106 from "./together.js";
import p107 from "./tokenrouter.js";
import p108 from "./topaz.js";
import p109 from "./tortoise.js";
import p110 from "./venice.js";
import p111 from "./vercel-ai-gateway.js";
import p112 from "./vertex-partner.js";
import p113 from "./vertex.js";
import p114 from "./volcengine-ark.js";
import p115 from "./voyage-ai.js";
import p116 from "./xai.js";
import p117 from "./xiaomi-mimo.js";
import p118 from "./xiaomi-tokenplan.js";
import p119 from "./xquik.js";
import p120 from "./youcom.js";
import p121 from "./zed.js";
export default [
p0,
p1,
@@ -193,11 +190,8 @@ export default [
p64,
p65,
p66,
p123,
p124,
p67,
p68,
p68z,
p69,
p70,
p71,
@@ -205,6 +199,7 @@ export default [
p73,
p74,
p75,
p76,
p77,
p78,
p79,
@@ -229,8 +224,10 @@ export default [
p98,
p99,
p100,
// p102, // trae — hidden, no tool calling
p101,
p102,
p103,
p104,
p105,
p106,
p107,
@@ -240,8 +237,7 @@ export default [
p111,
p112,
p113,
// p114, // devin-cli — hidden, spawns local agent with shell/fs access
// p104, // windsurf — hidden, no tool calling
p114,
p115,
p116,
p117,
@@ -249,5 +245,4 @@ export default [
p119,
p120,
p121,
p122,
];