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
2026-09-23 11:44:58 +07:00
96 changed files with 7709 additions and 1787 deletions
@@ -140,6 +140,22 @@ function openAICompletionToResponses(responseBody, customToolNames = null) {
};
}
/**
* Unwrap gateway envelopes around an OpenAI Chat Completions body.
* Some OpenAI-compatible gateways wrap the body in a `data` envelope
* (Cline: {data, success}) — without this, choices/usage don't resolve at
* top level downstream and surface as "no completion choices".
* Generic guard, no provider hardcode: only fires when the OpenAI body is
* nested under `data`. Callers decide when to apply it — the handler scopes
* it to providers opting in via transport.quirks.clineEnvelope.
*/
export function unwrapDataEnvelope(responseBody) {
if (responseBody && !responseBody.choices && responseBody.data?.choices) {
return responseBody.data;
}
return responseBody;
}
/**
* Translate non-streaming response body from provider format → OpenAI format.
*/
@@ -312,6 +328,8 @@ export async function handleNonStreamingResponse({ providerResponse, provider, m
responseBody = unwrapClineEnvelope(responseBody, provider);
reqLogger.logProviderResponse(providerResponse.status, providerResponse.statusText, providerResponse.headers, responseBody);
// Unwrap AFTER logging (raw envelope stays in the log for forensics) but
// BEFORE usage extraction/translation so choices/usage resolve downstream.
if (onRequestSuccess) {
Promise.resolve()
.then(onRequestSuccess)