dsh-xdpool 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "dsh-xdpool",
3
3
  "displayName": "DSH XD Pool",
4
4
  "description": "One DSH model pool for every free quota you have: merge all locally signed-in WorkBuddy accounts with auto-failover, sign in to 13 vendors by QR/web, aggregate 76 vendors' free tiers, plus a usage dashboard, model routing, a local OpenAI-compatible gateway and a points-automation suite.",
5
- "version": "2.5.0",
5
+ "version": "2.6.0",
6
6
  "license": "MIT",
7
7
  "author": "XDTrees",
8
8
  "homepage": "https://github.com/XDTrees/dsh-xdpool#readme",
@@ -75,9 +75,6 @@
75
75
  "platform": "web"
76
76
  }
77
77
  },
78
- "optionalDependencies": {
79
- "billion-context": "^0.1.197"
80
- },
81
78
  "devDependencies": {
82
79
  "@deepseek-ai/cordis": "4.0.2",
83
80
  "@deepseek-ai/dsh-client-locale": "0.1.5-rc.2",
@@ -29837,6 +29837,82 @@ function createPermanentLockStore(ctx) {
29837
29837
 
29838
29838
  // vendor/channel-pack/src/account-pool.ts
29839
29839
  var EMPTY_MODEL_SET = /* @__PURE__ */ new Set();
29840
+
29841
+ // [xdpool-local] laneAllowedIds
29842
+ //
29843
+ // buddy / workbuddy are exempt from the startup silence pass because
29844
+ // dsh-xdpool's own pool card owns their model selection (see
29845
+ // POOL_OWNED_PROVIDERS below). The exemption avoided a conflict but not a GAP:
29846
+ // `disabledModelsFor("buddy")` is therefore always empty, so every adapter
29847
+ // returned its whole catalogue and the card's "1 of 16" had no effect on the
29848
+ // host's model picker (#121).
29849
+ //
29850
+ // This helper is the missing link. It intersects the pack's own blacklist with
29851
+ // the allow-list dsh-xdpool publishes on `globalThis.__xdpoolLaneSelection`,
29852
+ // keyed by lane id. The global is a handoff, not an API: the pack is a build
29853
+ // artifact of another repository and cannot import from the plugin's src/, and
29854
+ // threading a value through ten adapter constructors would be rejected by the
29855
+ // next pack refresh.
29856
+ //
29857
+ // Semantics that matter:
29858
+ // - an ABSENT entry (undefined) means "no restriction". A lane the user never
29859
+ // touched must keep showing everything; treating it as "empty allow-list"
29860
+ // would blank the picker.
29861
+ // - an EMPTY array means the user disabled every model, which is a real state
29862
+ // and must be honoured — hence the two are distinguished below rather than
29863
+ // folded with `??`.
29864
+ function laneAllowedIds(disabled, laneId, catalogue) {
29865
+ // [xdpool-local] laneAllowedIds returns the DISABLED set.
29866
+ //
29867
+ // The call sites consume the result as a BLACKLIST
29868
+ // (`source.filter(model => !disabled.has(model.id))`), so returning the
29869
+ // allow-list inverted the picker: ticking three of sixteen showed the other
29870
+ // thirteen. Building the complement needs the roster, which is what the third
29871
+ // argument carries.
29872
+ //
29873
+ // It is a THUNK: one adapter declares its roster on the line AFTER this call, so
29874
+ // a value would read it before initialization. The body runs later.
29875
+ const table = globalThis.__xdpoolLaneSelection;
29876
+ const allow = table === void 0 || table === null ? void 0 : table[laneId];
29877
+ if (allow === void 0) return disabled;
29878
+ const blocked = disabled === void 0 ? EMPTY_MODEL_SET : disabled;
29879
+ const allowed = new Set(allow);
29880
+ let rows;
29881
+ try {
29882
+ rows = typeof catalogue === "function" ? catalogue() : catalogue;
29883
+ } catch {
29884
+ // A roster that cannot be read yet leaves the pack's own blacklist in charge
29885
+ // rather than blanking the picker.
29886
+ return disabled;
29887
+ }
29888
+ if (!Array.isArray(rows) || rows.length === 0) return disabled;
29889
+ const out = new Set();
29890
+ for (const row of rows) {
29891
+ const id = row === null || row === void 0 ? void 0 : row.id;
29892
+ if (typeof id !== "string" || id === "") continue;
29893
+ // Disabled when the lane forbids it, or when the pack already did.
29894
+ if (!allowed.has(id) || blocked.has(id)) out.add(id);
29895
+ }
29896
+ // Everything allowed: hand back the pack's own gate, which is what `size === 0`
29897
+ // means to the caller.
29898
+ return out.size === 0 ? disabled : out;
29899
+ }
29900
+
29901
+ // [xdpool-local] LANE_DISPLAY_NAME
29902
+ //
29903
+ // The picker's group names for the two lanes this plugin owns, matching
29904
+ // `src/channels.ts` exactly. The vendored upstream constants still call the CN
29905
+ // lane "CodeBuddy (腾讯)", which is the endpoint's original product name; a user
29906
+ // who signed in to WorkBuddy saw that name in the model picker while every card
29907
+ // in this plugin called it "WorkBuddy 国内版" (#119).
29908
+ //
29909
+ // Scoped to `providerInfo` on purpose: `CODEBUDDY.displayName` also feeds the
29910
+ // rate-limit copy, and renaming the constant would rewrite messages about a
29911
+ // product the user never installed.
29912
+ const LANE_DISPLAY_NAME = {
29913
+ buddy: "WorkBuddy 国内版",
29914
+ workbuddy: "WorkBuddy 国际版"
29915
+ };
29840
29916
  function allAccountsRateLimitedForModel(accounts, modelId, now = Date.now()) {
29841
29917
  if (modelId.length === 0) return void 0;
29842
29918
  let earliest;
@@ -32792,7 +32868,22 @@ function isQueueError(status, body) {
32792
32868
  return status === 400 && (body.includes("TM.00001041") || /peak\s+usage|try\s+again\s+after|peak\s+hours/i.test(body) || /high\s+demand|too\s+many\s+requests/i.test(body));
32793
32869
  }
32794
32870
  function isAuthError(status, body) {
32795
- if (status === 401 || status === 403) return true;
32871
+ // [xdpool-local] 403 is not auth for CodeArts.
32872
+ //
32873
+ // Every IAM rejection this gateway produces is measured to be 401 APIG.0301:
32874
+ // bad SK signature, truncated STS token, wrong AK, and a body rewritten after
32875
+ // signing all answer 401. A rejected User-Agent answers 403 TM.00000001, which
32876
+ // is a WAF verdict on a request header and says nothing about the credential.
32877
+ //
32878
+ // 403 can still be about the token (`APIG.0602 security token has expired` is
32879
+ // real), so the body decides. An unrecognised 403 falls through to the non-auth
32880
+ // path, which is the honest answer: the upstream refused without claiming an
32881
+ // auth failure.
32882
+ if (status === 401) return true;
32883
+ if (status === 403) {
32884
+ return body.includes("APIG.0602")
32885
+ || /invalid\s+token|token\s+expired|token\s+is\s+invalid|signature\s+fail|Unauthorized/i.test(body);
32886
+ }
32796
32887
  return body.includes("APIG.0602") || /invalid\s+token|token\s+expired|token\s+is\s+invalid/i.test(body);
32797
32888
  }
32798
32889
  function isSseQueueErrorCode(code) {
@@ -32819,7 +32910,31 @@ function errorDetail(body) {
32819
32910
  return body;
32820
32911
  }
32821
32912
  function httpErrorCode(status, body) {
32822
- if (status === 401 || status === 403) return "AUTH";
32913
+ // [xdpool-local] benefitNotFound — see tools/patch-pack-error-kinds.mjs
32914
+ //
32915
+ // CodeArts answers `InferHub.4004.200 benefit not found` when the account has
32916
+ // no entitlement for the model. The request carries `maas_type: benefit`
32917
+ // because the model is in CODEARTS_BENEFIT_FALLBACK, i.e. the plugin asked for
32918
+ // a benefit the ACCOUNT does not have — not a bad credential.
32919
+ //
32920
+ // Checked BEFORE the 401/403 → "AUTH" rule because that rule is what turned
32921
+ // this into "API 密钥无效" and sent users to re-authenticate over a permission
32922
+ // they simply do not hold (#118). Left as INVALID_REQUEST: terminal, not auth,
32923
+ // so the pool does not park a perfectly good account.
32924
+ {
32925
+ const probe = typeof body === "string" ? body : JSON.stringify(body ?? "");
32926
+ if (probe.includes("InferHub.4004.200") || probe.toLowerCase().includes("benefit not found")) {
32927
+ return "INVALID_REQUEST";
32928
+ }
32929
+ }
32930
+ // [xdpool-local] 403 is not auth — see isAuthError. The frontend renders AUTH
32931
+ // as "API 密钥无效", so routing a WAF 403 here produced a confident wrong
32932
+ // diagnosis. Only a 401, or a 403 whose body names the token, is AUTH.
32933
+ if (status === 401) return "AUTH";
32934
+ if (status === 403 && (String(body).includes("APIG.0602")
32935
+ || /invalid\s+token|token\s+expired|token\s+is\s+invalid|signature\s+fail|Unauthorized/i.test(String(body)))) {
32936
+ return "AUTH";
32937
+ }
32823
32938
  const detail = errorDetail(body);
32824
32939
  if (isQuotaExceededError(detail)) return QUOTA_EXCEEDED_CODE;
32825
32940
  if (status === 429) return "RATE_LIMIT";
@@ -32827,6 +32942,9 @@ function httpErrorCode(status, body) {
32827
32942
  if (isContextWindowExceededError(detail)) return CONTEXT_WINDOW_EXCEEDED_CODE;
32828
32943
  return "INVALID_REQUEST";
32829
32944
  }
32945
+ // [xdpool-local] A 200 body can carry the benefit refusal too (the upstream
32946
+ // answers 200 with an error frame), so the probe above is the only guard that
32947
+ // covers both transports — nothing to do here.
32830
32948
  if (status >= 500) return "SERVER";
32831
32949
  return `HTTP_${status}`;
32832
32950
  }
@@ -33251,6 +33369,17 @@ var CodeArtsAdapter = class extends LlmAdapter {
33251
33369
  extraSignedHeaders
33252
33370
  );
33253
33371
  const headers = new Headers(attributionHeaders());
33372
+ // [xdpool-local] Override the host USER-AGENT, or the gateway answers 403.
33373
+ //
33374
+ // attributionHeaders() stamps the DSH bot UA and snap-access rejects it
33375
+ // outright with 403 {error_code:TM.00000001}. Measured against the live
33376
+ // gateway with the SAME credential, body and endpoint: the harness UA gets
33377
+ // 403, no UA gets 200, an IDE-shaped UA gets 200 — so the UA alone decides,
33378
+ // and every CodeArts request failed with a message that reads like a bad key.
33379
+ //
33380
+ // Only the UA is replaced. The other attribution headers stay: they identify
33381
+ // the host for support and are not rejected.
33382
+ headers.set("user-agent", "CodeArts-Agent/1.0 (Windows NT 10.0; Win64; x64)");
33254
33383
  signed.forEach((value, key) => {
33255
33384
  if (key !== "content-type") headers.set(key, value);
33256
33385
  });
@@ -33339,6 +33468,28 @@ var CodeArtsAdapter = class extends LlmAdapter {
33339
33468
  const errorText = await response.text().catch(() => "");
33340
33469
  if (isAuthError(response.status, errorText) && !authRefreshed) {
33341
33470
  authRefreshed = true;
33471
+ // [xdpool-local] auth failure rotates the account, not just refresh it.
33472
+ //
33473
+ // This branch used to refresh and continue, which re-reads the SAME
33474
+ // account — so with two accounts in the pool, a credential the gateway
33475
+ // rejects for the first one failed the whole request while the second
33476
+ // would have worked. Every other failure class already rotates via
33477
+ // accountPool.getAvailableAccount; auth was the one exception.
33478
+ //
33479
+ // One shot per account: `rateLimitTried` holds the ids this request has
33480
+ // already spent, so a pool of N accounts gets at most N-1 extra
33481
+ // attempts and the loop cannot spin.
33482
+ if (this.options.accountPool) {
33483
+ const next = await this.options.accountPool.getAvailableAccount(
33484
+ "codearts", options.model, rateLimitTried,
33485
+ );
33486
+ if (next && !rateLimitTried.has(next.entry.id)) {
33487
+ rateLimitTried.add(next.entry.id);
33488
+ credential = next.credential;
33489
+ currentAccountId = next.entry.id;
33490
+ continue;
33491
+ }
33492
+ }
33342
33493
  await this.options.refresh();
33343
33494
  credential = await this.options.resolveCredential();
33344
33495
  if (credential === void 0 || !credential.access_key_id || !credential.secret_access_key || !credential.security_token) {
@@ -33400,7 +33551,20 @@ var CodeArtsAdapter = class extends LlmAdapter {
33400
33551
  const probe = await this.queryQueueStatus(credential, options.model, options.signal);
33401
33552
  if (probe === void 0 || probe.status === "working") {
33402
33553
  const code = httpErrorCode(response.status, errorText);
33403
- throw new LlmError2(`codearts: model request failed with HTTP ${response.status}`, code, { status: response.status });
33554
+ // [xdpool-local] error detail on the HTTP-status throw.
33555
+ //
33556
+ // "HTTP 403" alone cannot be diagnosed: the 403 in this report was a
33557
+ // WAF verdict on the User-Agent, and with no body in the message the
33558
+ // operator went looking for a credential problem that did not exist.
33559
+ // The body names the cause, truncated so an HTML error page cannot
33560
+ // flood the message.
33561
+ const failureDetail = errorDetail(errorText).slice(0, 200);
33562
+ throw new LlmError2(
33563
+ `codearts: model request failed with HTTP ${response.status}`
33564
+ + (failureDetail === "" ? "" : ` (${failureDetail})`),
33565
+ code,
33566
+ { status: response.status },
33567
+ );
33404
33568
  }
33405
33569
  }
33406
33570
  }
@@ -35128,7 +35292,8 @@ var BuddyAdapter = class _BuddyAdapter extends LlmAdapter2 {
35128
35292
  */
35129
35293
  providerInfo(provider) {
35130
35294
  const id = typeof provider === "string" && provider.length > 0 ? provider : this.product.id;
35131
- return { id, name: this.product.displayName };
35295
+ // [xdpool-local] The picker's group name follows this plugin's own naming.
35296
+ return { id, name: LANE_DISPLAY_NAME[id] ?? this.product.displayName };
35132
35297
  }
35133
35298
  /**
35134
35299
  * 模型列表:优先使用 /v3/config 动态拉取的远端列表,否则回退静态默认。
@@ -35298,7 +35463,7 @@ var BuddyAdapter = class _BuddyAdapter extends LlmAdapter2 {
35298
35463
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
35299
35464
  await this.ensureRemoteModels();
35300
35465
  const source = this.remoteModels ?? this.staticFallbackModels();
35301
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
35466
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => source);
35302
35467
  const listed = disabled === void 0 || disabled.size === 0 ? source : source.filter((model) => !disabled.has(model.id));
35303
35468
  return listed.map((model) => ({
35304
35469
  provider: this.product.id,
@@ -35455,7 +35620,26 @@ var BuddyAdapter = class _BuddyAdapter extends LlmAdapter2 {
35455
35620
  // its text rather than for claiming another client (measured 2026-10-28).
35456
35621
  for (const message of messages) {
35457
35622
  if ((message.role === "system" || message.role === "assistant") && typeof message.content === "string") {
35458
- message.content = message.content.replace(/powered by DeepSeek Harness/gi, "running on DeepSeek Harness").replace(/DeepSeek Harness Web GUI/gi, "DeepSeek Harness web interface").replace(/Relative paths resolve from the workspace root/gi, "Relative paths are resolved against the workspace root");
35623
+ message.content = message.content.replace(/powered by DeepSeek Harness/gi, "running on DeepSeek Harness").replace(/DeepSeek Harness Web GUI/gi, "DeepSeek Harness web interface").replace(/Relative paths resolve from the workspace root/gi, "Relative paths are resolved against the workspace root")
35624
+ // [xdpool-local] codexCliBanner — see tools/patch-pack-codex-banner.mjs
35625
+ //
35626
+ // Codex CLI 0.166 opens with a developer message the gate catalogued.
35627
+ // Measured (#112): the banner's first 184 chars pass, 185 (the same
35628
+ // text plus its newline) fail with 11128, and the same sentences sent
35629
+ // as three separate messages all pass — so the gate compares the first
35630
+ // PARAGRAPH as a unit, not a keyword list and not a length.
35631
+ //
35632
+ // Rewriting the opening CLAUSE is therefore enough, and it is the only
35633
+ // honest option: the rest of the 20 KB banner is ordinary prompt text
35634
+ // the model still needs. Meaning is preserved on purpose — this string
35635
+ // is also what the model reads, and mangling it to dodge a filter
35636
+ // trades a loud failure for a quiet one.
35637
+ //
35638
+ // The two spellings below are the ones Codex emits across its recent
35639
+ // releases; each keeps its own length and sentence shape.
35640
+ .replace(/You are a coding agent running in the Codex CLI, a terminal-based coding assistant/gi, "You are a coding agent running in this environment, a terminal-based coding assistant")
35641
+ .replace(/You are a coding agent running in the Codex CLI/gi, "You are a coding agent running in this environment")
35642
+ .replace(/Codex CLI is an open source project led by OpenAI/gi, "This coding agent is an open source project");
35459
35643
  }
35460
35644
  }
35461
35645
  const tools = options.tools?.map((tool) => ({
@@ -36799,7 +36983,7 @@ var LobsteraiAdapter = class extends LlmAdapter3 {
36799
36983
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
36800
36984
  await this.ensureRemoteModels();
36801
36985
  const source = this.remoteModels ?? this.staticFallbackModels();
36802
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
36986
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => source);
36803
36987
  const listed = disabled === void 0 || disabled.size === 0 ? source : source.filter((model) => !disabled.has(model.id));
36804
36988
  return listed.map((model) => ({
36805
36989
  provider: this.product.id,
@@ -37882,14 +38066,36 @@ function unwrapQoderEnvelopeStream(response, label) {
37882
38066
  if (classifyInner(inner) === "error") {
37883
38067
  let code;
37884
38068
  let message2 = inner;
38069
+ // [xdpool-local] benefitNotFound / pricingUrl — see
38070
+ // tools/patch-pack-error-kinds.mjs
38071
+ //
38072
+ // A refusal whose body is only a pricingUrl is upstream pointing at its
38073
+ // own pricing page: a QUOTA signal, not a generic model error. The old
38074
+ // fallback (message2 = the whole inner JSON) showed the user a bare URL
38075
+ // next to "(112/model_error)", saying nothing about quota (#118). The
38076
+ // URL moves to detail so it stays diagnosable.
38077
+ let pricingUrl;
38078
+ let hasMessage = false;
38079
+ try {
38080
+ const probe = JSON.parse(inner);
38081
+ if (typeof probe?.pricingUrl === "string") pricingUrl = probe.pricingUrl;
38082
+ hasMessage = typeof probe?.message === "string";
38083
+ } catch {
38084
+ }
37885
38085
  try {
37886
38086
  const parsed = JSON.parse(inner);
37887
38087
  if (parsed.code !== void 0) code = parsed.code;
37888
38088
  if (typeof parsed.message === "string") message2 = parsed.message;
37889
38089
  } catch {
37890
38090
  }
38091
+ const quotaRefusal = pricingUrl !== void 0 && !hasMessage;
37891
38092
  controller.enqueue(
37892
- encoder2.encode(`data: ${JSON.stringify({
38093
+ encoder2.encode(`data: ${JSON.stringify(quotaRefusal ? {
38094
+ code: QUOTA_EXCEEDED_CODE,
38095
+ message: "qoder: out of quota — upstream pointed at its pricing page",
38096
+ detail: pricingUrl,
38097
+ type: "model_error"
38098
+ } : {
37893
38099
  ...code === void 0 ? {} : { code },
37894
38100
  message: message2,
37895
38101
  type: "model_error"
@@ -38904,8 +39110,8 @@ var QoderAdapter = class extends LlmAdapter4 {
38904
39110
  }
38905
39111
  async listModels(_provider) {
38906
39112
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
38907
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
38908
39113
  const source = this.product.fallbackModels;
39114
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => source);
38909
39115
  const listed = disabled === void 0 || disabled.size === 0 ? source : source.filter((model) => !disabled.has(model.id));
38910
39116
  return listed.map((model) => ({
38911
39117
  provider: this.product.id,
@@ -40594,7 +40800,7 @@ var TraeAdapter = class extends LlmAdapter5 {
40594
40800
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
40595
40801
  await this.ensureRemoteModels();
40596
40802
  const source = this.listAllModels();
40597
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
40803
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => source);
40598
40804
  const listed = disabled === void 0 || disabled.size === 0 ? source : source.filter((model) => !disabled.has(model.id));
40599
40805
  return listed.map((model) => ({
40600
40806
  provider: this.product.id,
@@ -42023,7 +42229,7 @@ var ClineAdapter = class extends LlmAdapter6 {
42023
42229
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
42024
42230
  await this.ensureRemoteModels();
42025
42231
  const source = this.remoteModels ?? this.fallbackCatalog();
42026
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
42232
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => source);
42027
42233
  const listed = disabled === void 0 || disabled.size === 0 ? source : source.filter((model) => !disabled.has(model.id));
42028
42234
  return listed.map((model) => ({
42029
42235
  provider: this.product.id,
@@ -42619,7 +42825,7 @@ var LoomyAdapter = class extends LlmAdapter7 {
42619
42825
  async listModels(_provider) {
42620
42826
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
42621
42827
  const all = await this.loadModels();
42622
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
42828
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => all);
42623
42829
  const listed = disabled === void 0 || disabled.size === 0 ? all : all.filter((model) => !disabled.has(model.id));
42624
42830
  return listed.map((model) => ({
42625
42831
  provider: this.product.id,
@@ -43075,7 +43281,7 @@ var RaccoonAdapter = class extends LlmAdapter8 {
43075
43281
  async listModels(_provider) {
43076
43282
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
43077
43283
  const all = await this.loadModels();
43078
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
43284
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => all);
43079
43285
  const listed = disabled === void 0 || disabled.size === 0 ? all : all.filter((model) => !disabled.has(model.id));
43080
43286
  return listed.map((model) => ({
43081
43287
  provider: this.product.id,
@@ -54830,7 +55036,7 @@ var ZcodeAdapter = class extends LlmAdapter9 {
54830
55036
  if (!await this.ready()) return [];
54831
55037
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
54832
55038
  const all = await this.loadModels();
54833
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
55039
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => all);
54834
55040
  const listed = disabled === void 0 || disabled.size === 0 ? all : all.filter((model) => !disabled.has(model.id));
54835
55041
  return listed.map((model) => ({
54836
55042
  provider: this.product.id,
@@ -58624,7 +58830,7 @@ var GeminiAdapter = class extends LlmAdapter10 {
58624
58830
  async listModels(_provider) {
58625
58831
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
58626
58832
  const all = this.loadModels();
58627
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
58833
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => all);
58628
58834
  const listed = disabled === void 0 || disabled.size === 0 ? all : all.filter((model) => !disabled.has(model.id));
58629
58835
  return listed.map((model) => ({
58630
58836
  provider: this.product.id,
@@ -66419,7 +66625,7 @@ var MinimaxAdapter = class extends LlmAdapter11 {
66419
66625
  async listModels(_provider) {
66420
66626
  if (!await providerCatalogVisible(this.options.accountPool, this.product.id)) return [];
66421
66627
  const all = await this.loadModels();
66422
- const disabled = this.options.accountPool?.disabledModelsFor(this.product.id);
66628
+ const disabled = laneAllowedIds(this.options.accountPool?.disabledModelsFor(this.product.id), this.product.id, () => all);
66423
66629
  const listed = disabled === void 0 || disabled.size === 0 ? all : all.filter((model) => !disabled.has(model.id));
66424
66630
  return listed.map((model) => ({
66425
66631
  provider: this.product.id,