crosscheck-mcp 0.2.23 → 0.2.25

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.
@@ -517,7 +517,7 @@ function defaultTransient(kind) {
517
517
  var CREDIT_RE = /insufficient|no\s+credit|credits?|billing|quota|payment\s*required|exceeded your current quota|not\s+enough|fund|no active subscription|spend limit/i;
518
518
  function isCreditsFailure(status, bodyText) {
519
519
  if (status === 402) return true;
520
- if (status === 401 || status === 403 || status === 429 || status === 400) {
520
+ if (status === 401 || status === 403 || status === 400) {
521
521
  return CREDIT_RE.test(bodyText);
522
522
  }
523
523
  return false;
@@ -554,7 +554,7 @@ function httpFailureToProviderError(provider, status, bodyText, retryAfterS, mod
554
554
  if (status === 429) {
555
555
  return new ProviderError(
556
556
  "rate_limit",
557
- `${provider}: rate limited (HTTP 429). Detail: ${detail}`,
557
+ `${provider}: rate limited (HTTP 429) \u2014 retrying with backoff. Note that some providers word a rate limit as a balance problem; check your balance before topping up. Detail: ${detail}`,
558
558
  { status, ...retryAfterS !== void 0 ? { retryAfterS } : {} }
559
559
  );
560
560
  }
@@ -1322,10 +1322,20 @@ function fallbackModelsFor(env, provider) {
1322
1322
  if (pinned && pinned !== DEFAULT_MODELS[provider]) return [];
1323
1323
  return DEFAULT_FALLBACKS[provider] ?? [];
1324
1324
  }
1325
+ var DEFAULT_EXCLUDED_PROVIDERS = ["mistral", "groq"];
1326
+ function excludedProviders(env) {
1327
+ const parse = (v) => (v ?? "").split(",").map((x) => x.trim().toLowerCase()).filter((x) => x !== "");
1328
+ const excluded = new Set(
1329
+ parse(env["CROSSCHECK_EXCLUDE_PROVIDERS"]).length > 0 ? parse(env["CROSSCHECK_EXCLUDE_PROVIDERS"]) : DEFAULT_EXCLUDED_PROVIDERS
1330
+ );
1331
+ for (const name of parse(env["CROSSCHECK_ENABLE_PROVIDERS"])) excluded.delete(name);
1332
+ return excluded;
1333
+ }
1325
1334
  function buildProviders(opts) {
1326
1335
  const out = {};
1336
+ const excluded = excludedProviders(opts.env);
1327
1337
  const anthropicKey = opts.env["ANTHROPIC_API_KEY"];
1328
- if (anthropicKey) {
1338
+ if (anthropicKey && !excluded.has("anthropic")) {
1329
1339
  const model = opts.env["ANTHROPIC_MODEL"] ?? DEFAULT_MODELS.anthropic;
1330
1340
  out["anthropic"] = makeAnthropicProvider(model, anthropicKey, opts, fallbackModelsFor(opts.env, "anthropic"));
1331
1341
  }
@@ -1341,11 +1351,12 @@ function buildProviders(opts) {
1341
1351
  for (const s of openAiCompatSpec) {
1342
1352
  const apiKey = opts.env[s.keyEnv];
1343
1353
  if (!apiKey) continue;
1354
+ if (excluded.has(s.name)) continue;
1344
1355
  const model = opts.env[s.modelEnv] ?? s.defaultModel;
1345
1356
  out[s.name] = makeOpenAICompatibleProvider(s.name, model, apiKey, opts, fallbackModelsFor(opts.env, s.name));
1346
1357
  }
1347
1358
  const geminiKey = opts.env["GEMINI_API_KEY"];
1348
- if (geminiKey) {
1359
+ if (geminiKey && !excluded.has("gemini")) {
1349
1360
  const model = opts.env["GEMINI_MODEL"] ?? DEFAULT_MODELS.gemini;
1350
1361
  out["gemini"] = makeGeminiProvider(model, geminiKey, opts, fallbackModelsFor(opts.env, "gemini"));
1351
1362
  }
@@ -1411,7 +1422,7 @@ import { z } from "zod";
1411
1422
 
1412
1423
  // src/server-meta.ts
1413
1424
  var SERVER_NAME = "crosscheck-agent";
1414
- var SERVER_VERSION = true ? "0.2.23" : "0.0.0-dev";
1425
+ var SERVER_VERSION = true ? "0.2.25" : "0.0.0-dev";
1415
1426
 
1416
1427
  // src/tools/audit.ts
1417
1428
  import { readdirSync, readFileSync as readFileSync3, statSync } from "fs";
@@ -5150,11 +5161,20 @@ ${ctxBody}` });
5150
5161
  });
5151
5162
  };
5152
5163
  const onAnswer = opts.onAnswer;
5153
- const workerCall = onAnswer ? async (p) => {
5164
+ const onPanelistStart = opts.onPanelistStart;
5165
+ const workerCall = onAnswer || onPanelistStart ? async (p) => {
5166
+ if (onPanelistStart) {
5167
+ try {
5168
+ onPanelistStart(p.name, p.model);
5169
+ } catch {
5170
+ }
5171
+ }
5154
5172
  const answer = await dispatchOne(p);
5155
- try {
5156
- onAnswer(answer, p.name);
5157
- } catch {
5173
+ if (onAnswer) {
5174
+ try {
5175
+ onAnswer(answer, p.name);
5176
+ } catch {
5177
+ }
5158
5178
  }
5159
5179
  return answer;
5160
5180
  } : dispatchOne;
@@ -9452,6 +9472,12 @@ ${prior.body}` });
9452
9472
  content: `This is round ${rnd} of ${maxRounds}. Reply for this round.`
9453
9473
  });
9454
9474
  for (const p of selected) {
9475
+ if (opts.onPanelistStart) {
9476
+ try {
9477
+ opts.onPanelistStart(p.name, p.model, rnd);
9478
+ } catch {
9479
+ }
9480
+ }
9455
9481
  const entry = await callPanelist(p, roundMessages);
9456
9482
  const withRound = { ...entry, round: rnd };
9457
9483
  transcript.push(withRound);
@@ -11901,7 +11927,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
11901
11927
  var DEFAULT_PACKAGE = "crosscheck-cli";
11902
11928
  var FETCH_TIMEOUT_MS = 3e3;
11903
11929
  function engineVersion() {
11904
- return true ? "0.2.23" : "0.0.0-dev";
11930
+ return true ? "0.2.25" : "0.0.0-dev";
11905
11931
  }
11906
11932
  function defaultUpdateCachePath() {
11907
11933
  const base = process.env["CROSSCHECK_DATA_DIR"] || path9.join(os.homedir() || os.tmpdir(), ".crosscheck");