crosscheck-mcp 0.2.12 → 0.2.14

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.
@@ -1266,8 +1266,21 @@ function isCreditsFailure(status, bodyText) {
1266
1266
  }
1267
1267
  return false;
1268
1268
  }
1269
- function httpFailureToProviderError(provider, status, bodyText, retryAfterS) {
1269
+ var MODEL_ACCESS_RE = /model_not_found|does not have access to model|does not exist|model[\s_]not[\s_]found|invalid model|unknown model|unsupported model/i;
1270
+ function isModelAccessFailure(status, bodyText) {
1271
+ if (status < 400 || status >= 500) return false;
1272
+ return MODEL_ACCESS_RE.test(bodyText);
1273
+ }
1274
+ function httpFailureToProviderError(provider, status, bodyText, retryAfterS, model) {
1270
1275
  const detail = bodyText.slice(0, 512);
1276
+ if (isModelAccessFailure(status, bodyText)) {
1277
+ const modelRef = model ? `"${model}"` : "the configured model";
1278
+ return new ProviderError(
1279
+ "client",
1280
+ `${provider}: your account/project doesn't have access to ${modelRef} (HTTP ${status}). This is a model-access problem, not a key problem \u2014 your ${provider} API key is fine, ${modelRef} just isn't enabled for this account/project. Fix: run \`crosscheck models set ${provider} <a-model-you-have-access-to>\` (or set ${provider.toUpperCase()}_MODEL in your .env until that's available). Detail: ${detail}`,
1281
+ { status }
1282
+ );
1283
+ }
1271
1284
  if (isCreditsFailure(status, bodyText)) {
1272
1285
  return new ProviderError(
1273
1286
  "auth",
@@ -1605,7 +1618,7 @@ async function sendAnthropic(args) {
1605
1618
  return { text, attempts: 1, usage: applyPricing(usage, args.pricing) };
1606
1619
  }
1607
1620
  const bodyText = await respLike.text().catch(() => "");
1608
- throw httpFailureToProviderError("anthropic", status, bodyText, parseRetryAfter(respLike));
1621
+ throw httpFailureToProviderError("anthropic", status, bodyText, parseRetryAfter(respLike), args.model);
1609
1622
  };
1610
1623
  await acquireRateLimit("anthropic", args.signal ? { signal: args.signal } : void 0);
1611
1624
  return sendWithRetry(attemptOnce, resolveRetryConfig(), args.signal);
@@ -1784,7 +1797,7 @@ async function sendGemini(args) {
1784
1797
  return { text, attempts: 1, usage: applyPricing2(usage, args.pricing) };
1785
1798
  }
1786
1799
  const bodyText = await respLike.text().catch(() => "");
1787
- throw httpFailureToProviderError("gemini", status, bodyText, parseRetryAfter(respLike));
1800
+ throw httpFailureToProviderError("gemini", status, bodyText, parseRetryAfter(respLike), args.model);
1788
1801
  };
1789
1802
  await acquireRateLimit("gemini", args.signal ? { signal: args.signal } : void 0);
1790
1803
  return sendWithRetry(attemptOnce, resolveRetryConfig(), args.signal);
@@ -1958,7 +1971,7 @@ async function sendOpenAICompatible(args) {
1958
1971
  return { text, attempts: 1, usage: applyPricing3(usage, args.pricing) };
1959
1972
  }
1960
1973
  const bodyText = await respLike.text().catch(() => "");
1961
- throw httpFailureToProviderError(args.provider, status, bodyText, parseRetryAfter(respLike));
1974
+ throw httpFailureToProviderError(args.provider, status, bodyText, parseRetryAfter(respLike), args.model);
1962
1975
  };
1963
1976
  await acquireRateLimit(args.provider, args.signal ? { signal: args.signal } : void 0);
1964
1977
  return sendWithRetry(attemptOnce, resolveRetryConfig(), args.signal);
@@ -1967,7 +1980,10 @@ async function sendOpenAICompatible(args) {
1967
1980
  // src/providers/registry.ts
1968
1981
  var DEFAULT_MODELS = {
1969
1982
  anthropic: "claude-opus-5",
1970
- openai: "gpt-5.5",
1983
+ // gpt-5.5 is not enabled on every OpenAI account/project (some are still
1984
+ // capped at gpt-5) — gpt-5 is the safer, more broadly available default
1985
+ // until a user/org explicitly opts into 5.5 via `crosscheck models set`.
1986
+ openai: "gpt-5",
1971
1987
  xai: "grok-4-latest",
1972
1988
  mistral: "mistral-large-latest",
1973
1989
  groq: "llama-3.3-70b-versatile",
@@ -1976,6 +1992,28 @@ var DEFAULT_MODELS = {
1976
1992
  kimi: "kimi-k3",
1977
1993
  qwen: "qwen3.8-max"
1978
1994
  };
1995
+ var MODEL_ENV_VARS = {
1996
+ anthropic: "ANTHROPIC_MODEL",
1997
+ openai: "OPENAI_MODEL",
1998
+ xai: "XAI_MODEL",
1999
+ mistral: "MISTRAL_MODEL",
2000
+ groq: "GROQ_MODEL",
2001
+ deepseek: "DEEPSEEK_MODEL",
2002
+ gemini: "GEMINI_MODEL",
2003
+ kimi: "KIMI_MODEL",
2004
+ qwen: "QWEN_MODEL"
2005
+ };
2006
+ function detectStalePins(env) {
2007
+ const out = [];
2008
+ for (const [provider, envVar] of Object.entries(MODEL_ENV_VARS)) {
2009
+ const pinned = env[envVar];
2010
+ const current = DEFAULT_MODELS[provider];
2011
+ if (pinned && current && pinned !== current) {
2012
+ out.push({ provider, envVar, pinned, current });
2013
+ }
2014
+ }
2015
+ return out;
2016
+ }
1979
2017
  function buildProviders(opts) {
1980
2018
  const out = {};
1981
2019
  const anthropicKey = opts.env["ANTHROPIC_API_KEY"];
@@ -2191,7 +2229,7 @@ var import_zod = require("zod");
2191
2229
  // src/server-meta.ts
2192
2230
  init_cjs_shims();
2193
2231
  var SERVER_NAME = "crosscheck-agent";
2194
- var SERVER_VERSION = true ? "0.2.12" : "0.0.0-dev";
2232
+ var SERVER_VERSION = true ? "0.2.14" : "0.0.0-dev";
2195
2233
 
2196
2234
  // src/tools/audit.ts
2197
2235
  init_cjs_shims();
@@ -12485,7 +12523,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
12485
12523
  var DEFAULT_PACKAGE = "crosscheck-cli";
12486
12524
  var FETCH_TIMEOUT_MS = 3e3;
12487
12525
  function engineVersion() {
12488
- return true ? "0.2.12" : "0.0.0-dev";
12526
+ return true ? "0.2.14" : "0.0.0-dev";
12489
12527
  }
12490
12528
  function defaultUpdateCachePath() {
12491
12529
  const base = process.env["CROSSCHECK_DATA_DIR"] || import_node_path13.default.join(import_node_os2.default.homedir() || import_node_os2.default.tmpdir(), ".crosscheck");
@@ -14779,6 +14817,13 @@ async function main() {
14779
14817
  if (Object.keys(providers).length > 0) {
14780
14818
  process.stderr.write(
14781
14819
  `crosscheck-agent: native providers loaded: ${Object.keys(providers).sort().join(", ")}
14820
+ `
14821
+ );
14822
+ }
14823
+ for (const stale of detectStalePins(process.env)) {
14824
+ if (!(stale.provider in providers)) continue;
14825
+ process.stderr.write(
14826
+ `crosscheck-agent: ${stale.provider} is pinned to "${stale.pinned}" via ${stale.envVar}, but the current default is "${stale.current}". If that wasn't intentional, update or remove ${stale.envVar} in your .env.
14782
14827
  `
14783
14828
  );
14784
14829
  }