crosscheck-mcp 0.2.17 → 0.2.19

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.
@@ -1233,18 +1233,24 @@ async function sendOpenAICompatible(args) {
1233
1233
  // src/providers/registry.ts
1234
1234
  var DEFAULT_MODELS = {
1235
1235
  anthropic: "claude-opus-5",
1236
- // gpt-5.5 is not enabled on every OpenAI account/project (some are still
1237
- // capped at gpt-5) — gpt-5 is the safer, more broadly available default
1238
- // until a user/org explicitly opts into 5.5 via `crosscheck models set`.
1239
- openai: "gpt-5",
1236
+ openai: "gpt-5.6-sol",
1240
1237
  xai: "grok-4-latest",
1241
1238
  mistral: "mistral-large-latest",
1242
1239
  groq: "llama-3.3-70b-versatile",
1243
1240
  deepseek: "deepseek-chat",
1244
- gemini: "gemini-3.1-pro-preview",
1241
+ gemini: "gemini-3.8-flash",
1245
1242
  kimi: "kimi-k3",
1246
1243
  qwen: "qwen3.8-max"
1247
1244
  };
1245
+ var DEFAULT_FALLBACKS = {
1246
+ // gpt-5.6 requires a billing-enabled account and is excluded from the free
1247
+ // tier, so gpt-5 remains the broadly-available floor. One hop, not a
1248
+ // ladder — an intermediate 5.5 step would just be another model to reason
1249
+ // about.
1250
+ openai: ["gpt-5"],
1251
+ // 3.8 Flash is recent enough that some projects won't have it yet.
1252
+ gemini: ["gemini-3.1-pro-preview"]
1253
+ };
1248
1254
  var MODEL_ENV_VARS = {
1249
1255
  anthropic: "ANTHROPIC_MODEL",
1250
1256
  openai: "OPENAI_MODEL",
@@ -1262,7 +1268,11 @@ function parseFallbackModels(raw) {
1262
1268
  }
1263
1269
  function fallbackModelsFor(env, provider) {
1264
1270
  const envVar = MODEL_ENV_VARS[provider];
1265
- return envVar ? parseFallbackModels(env[`${envVar}_FALLBACKS`]) : [];
1271
+ const fromEnv = envVar ? parseFallbackModels(env[`${envVar}_FALLBACKS`]) : [];
1272
+ if (fromEnv.length > 0) return fromEnv;
1273
+ const pinned = envVar ? env[envVar] : void 0;
1274
+ if (pinned && pinned !== DEFAULT_MODELS[provider]) return [];
1275
+ return DEFAULT_FALLBACKS[provider] ?? [];
1266
1276
  }
1267
1277
  function buildProviders(opts) {
1268
1278
  const out = {};
@@ -1353,7 +1363,7 @@ var import_zod = require("zod");
1353
1363
 
1354
1364
  // src/server-meta.ts
1355
1365
  var SERVER_NAME = "crosscheck-agent";
1356
- var SERVER_VERSION = true ? "0.2.17" : "0.0.0-dev";
1366
+ var SERVER_VERSION = true ? "0.2.19" : "0.0.0-dev";
1357
1367
 
1358
1368
  // src/tools/audit.ts
1359
1369
  var import_node_fs4 = require("fs");
@@ -2923,7 +2933,7 @@ function numberOrNull(v) {
2923
2933
  var import_node_perf_hooks = require("perf_hooks");
2924
2934
 
2925
2935
  // src/core/co-reason.ts
2926
- var CO_REASON_MODEL = "gpt-5.6";
2936
+ var CO_REASON_MODEL = "gpt-5.6-sol";
2927
2937
  var CO_REASON_PROVIDER = "openai";
2928
2938
  var CO_REASON_LABEL = "GPT-5.6";
2929
2939
  function pickCoReasoner(providers, upgradeRequested) {
@@ -4281,8 +4291,10 @@ var SUPER_MODELS = {
4281
4291
  // on it succeeded as recently as 2026-08-30 — so it is an unlisted alias
4282
4292
  // rather than a dead id.
4283
4293
  xai: [DEFAULT_MODELS["xai"]],
4284
- // 3.8 Flash verified present; the previous default as fallback.
4285
- gemini: ["gemini-3.8-flash", DEFAULT_MODELS["gemini"]],
4294
+ // 3.8 Flash is now BOTH the everyday default and the super pick for Gemini,
4295
+ // so this can no longer borrow DEFAULT_MODELS as its fallback — that would
4296
+ // repeat the same model and retry one that just failed. Named explicitly.
4297
+ gemini: ["gemini-3.8-flash", "gemini-3.1-pro-preview"],
4286
4298
  kimi: [DEFAULT_MODELS["kimi"]],
4287
4299
  qwen: [DEFAULT_MODELS["qwen"]]
4288
4300
  };
@@ -10115,11 +10127,13 @@ function runListProviders(args, opts) {
10115
10127
  const providers = [];
10116
10128
  for (const name of names) {
10117
10129
  const prov = opts.providers[name];
10130
+ const superChain = superRequested ? superChainFor(name) : [];
10118
10131
  providers.push({
10119
10132
  name,
10120
10133
  available: prov !== void 0,
10121
10134
  active: active.has(name),
10122
- model: superRequested ? SUPER_MODELS[name] : prov ? prov.model : null
10135
+ model: superRequested ? superPrimary(name) ?? null : prov ? prov.model : null,
10136
+ ...superChain.length > 1 ? { fallbacks: superChain.slice(1) } : {}
10123
10137
  });
10124
10138
  }
10125
10139
  const result = {
@@ -10131,6 +10145,80 @@ function runListProviders(args, opts) {
10131
10145
  return result;
10132
10146
  }
10133
10147
 
10148
+ // src/tools/models.ts
10149
+ var KNOWN_PROVIDERS7 = [
10150
+ "anthropic",
10151
+ "openai",
10152
+ "xai",
10153
+ "gemini",
10154
+ "mistral",
10155
+ "groq",
10156
+ "deepseek",
10157
+ "kimi",
10158
+ "qwen"
10159
+ ];
10160
+ var PICKER_URL = "https://crosscheckagent.com/account/models";
10161
+ var SUPER_ENV_VARS2 = {
10162
+ anthropic: "ANTHROPIC_SUPER_MODEL",
10163
+ openai: "OPENAI_SUPER_MODEL",
10164
+ xai: "XAI_SUPER_MODEL",
10165
+ gemini: "GEMINI_SUPER_MODEL",
10166
+ kimi: "KIMI_SUPER_MODEL",
10167
+ qwen: "QWEN_SUPER_MODEL",
10168
+ mistral: "MISTRAL_SUPER_MODEL",
10169
+ groq: "GROQ_SUPER_MODEL",
10170
+ deepseek: "DEEPSEEK_SUPER_MODEL"
10171
+ };
10172
+ var MODEL_ENV_VARS2 = {
10173
+ anthropic: "ANTHROPIC_MODEL",
10174
+ openai: "OPENAI_MODEL",
10175
+ xai: "XAI_MODEL",
10176
+ gemini: "GEMINI_MODEL",
10177
+ kimi: "KIMI_MODEL",
10178
+ qwen: "QWEN_MODEL",
10179
+ mistral: "MISTRAL_MODEL",
10180
+ groq: "GROQ_MODEL",
10181
+ deepseek: "DEEPSEEK_MODEL"
10182
+ };
10183
+ function runModels(args, opts) {
10184
+ const env = opts.env ?? process.env;
10185
+ const active = new Set(opts.activeProviders ?? Object.keys(opts.providers));
10186
+ const onlySuper = isSuperRequested(args);
10187
+ const names = onlySuper ? SUPER_PROVIDER_NAMES : KNOWN_PROVIDERS7;
10188
+ const rows = [];
10189
+ for (const name of names) {
10190
+ const prov = opts.providers[name];
10191
+ const conferModel = prov ? prov.model : null;
10192
+ const conferPinned = Boolean(MODEL_ENV_VARS2[name] && env[MODEL_ENV_VARS2[name]]);
10193
+ const conferSource = !prov ? "unconfigured" : conferPinned ? "preference" : "default";
10194
+ const superVar = SUPER_ENV_VARS2[name];
10195
+ const superPinned = Boolean(superVar && env[superVar]);
10196
+ const chain = superChainFor(name, env);
10197
+ rows.push({
10198
+ provider: name,
10199
+ available: prov !== void 0,
10200
+ active: active.has(name),
10201
+ confer: conferModel,
10202
+ confer_source: conferSource,
10203
+ super: superPrimary(name, env) ?? null,
10204
+ super_source: superPinned ? "preference" : chain.length > 0 ? "default" : "unconfigured",
10205
+ ...chain.length > 1 ? { super_fallbacks: chain.slice(1) } : {}
10206
+ });
10207
+ }
10208
+ const pinned = rows.filter(
10209
+ (r) => r.confer_source === "preference" || r.super_source === "preference"
10210
+ ).length;
10211
+ return {
10212
+ tool: "models",
10213
+ providers: rows,
10214
+ ...onlySuper ? { super_mode: true } : {},
10215
+ pinned_count: pinned,
10216
+ // Read-only by design — say so, and say where selection actually happens,
10217
+ // rather than leaving someone to guess why nothing changed.
10218
+ how_to_change: `This is read-only. Choose models at ${PICKER_URL} \u2014 a dropdown per provider, with separate tabs for \`confer\` and \`confer super\` \u2014 then run \`crosscheck models sync\`, or restart the MCP server. In the terminal, \`crosscheck models set <provider> <model>\` pins one and \`crosscheck models fallback <provider> <model>\` greenlights a fallback (tried ONLY when the pinned model is inaccessible, never for a bad key, a rate limit, or a 500). Terminal commands edit the confer set only; picking a separate super lineup is browser-only for now.`
10219
+ };
10220
+ }
10221
+
10134
10222
  // src/tools/pick.ts
10135
10223
  var import_node_perf_hooks10 = require("perf_hooks");
10136
10224
  var PICK_SCORES_SCHEMA = {
@@ -10450,7 +10538,7 @@ function resolveProviders7(names, available, allowlist) {
10450
10538
  }
10451
10539
  return out;
10452
10540
  }
10453
- var KNOWN_PROVIDERS7 = [
10541
+ var KNOWN_PROVIDERS8 = [
10454
10542
  "anthropic",
10455
10543
  "openai",
10456
10544
  "xai",
@@ -10464,7 +10552,7 @@ function unknownProviderError6(unknownNames, available) {
10464
10552
  const typos = [];
10465
10553
  for (const n of unknownNames) {
10466
10554
  const key = n.trim().toLowerCase();
10467
- if (KNOWN_PROVIDERS7.includes(key)) notRegistered.push(n);
10555
+ if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
10468
10556
  else typos.push(n);
10469
10557
  }
10470
10558
  return {
@@ -11613,7 +11701,7 @@ function resolveProviders8(names, available, allowlist) {
11613
11701
  }
11614
11702
  return out;
11615
11703
  }
11616
- var KNOWN_PROVIDERS8 = [
11704
+ var KNOWN_PROVIDERS9 = [
11617
11705
  "anthropic",
11618
11706
  "openai",
11619
11707
  "xai",
@@ -11627,7 +11715,7 @@ function unknownProviderError7(unknownNames, available) {
11627
11715
  const typos = [];
11628
11716
  for (const n of unknownNames) {
11629
11717
  const key = n.trim().toLowerCase();
11630
- if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
11718
+ if (KNOWN_PROVIDERS9.includes(key)) notRegistered.push(n);
11631
11719
  else typos.push(n);
11632
11720
  }
11633
11721
  return {
@@ -11677,7 +11765,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
11677
11765
  var DEFAULT_PACKAGE = "crosscheck-cli";
11678
11766
  var FETCH_TIMEOUT_MS = 3e3;
11679
11767
  function engineVersion() {
11680
- return true ? "0.2.17" : "0.0.0-dev";
11768
+ return true ? "0.2.19" : "0.0.0-dev";
11681
11769
  }
11682
11770
  function defaultUpdateCachePath() {
11683
11771
  const base = process.env["CROSSCHECK_DATA_DIR"] || import_node_path12.default.join(import_node_os2.default.homedir() || import_node_os2.default.tmpdir(), ".crosscheck");
@@ -12270,7 +12358,15 @@ var HELP_CATALOG = [
12270
12358
  primaryArg: "(none)",
12271
12359
  summary: "Show configured providers, their default models, and active status.",
12272
12360
  example: "xc list_providers",
12273
- detail: "Lists every provider Crosscheck knows about, which have keys configured, each one's default model, and whether it's active in the panel."
12361
+ detail: "Lists every provider Crosscheck knows about, which have keys configured, each one's default model, and whether it's active in the panel. For what each provider will actually RUN on each panel, and how to change it, use `xc models`."
12362
+ },
12363
+ {
12364
+ name: "models",
12365
+ category: "Operations",
12366
+ primaryArg: "(none)",
12367
+ summary: "Where to choose which model each provider uses, per panel.",
12368
+ example: "xc models \xB7 xc models super:true",
12369
+ detail: "Every provider has a default model, and `super` has its own flagship lineup. Both are defaults you can change, per provider, per machine.\n\nEasiest in the browser: crosscheckagent.com/account/models. A dropdown per provider, with separate tabs for `confer` (the everyday panel, also used by debate/audit/plan) and `confer super` (the flagship lineup). The blank option names the engine's own default, so leaving a row alone tells you what you're getting. Save, then run `crosscheck models sync` in your terminal \u2014 or just restart the MCP server.\n\nFrom the terminal: `crosscheck models list` shows what this machine will actually use and why (env var, your preference, org policy, or default); `crosscheck models set <provider> <model>` pins one; `crosscheck models fallback <provider> <model>` greenlights a fallback, tried ONLY if the pinned model comes back inaccessible \u2014 never for a bad key, a rate limit, or a 500, since a different model wouldn't fix those.\n\nTwo things that catch people out. Leaving a provider blank in the super tab means 'inherit my confer choice', not 'reset to default'. And the terminal commands edit the confer set only \u2014 choosing a separate lineup for super is browser-only for now."
12274
12370
  },
12275
12371
  {
12276
12372
  name: "recommend_panel",
@@ -12538,6 +12634,7 @@ function registerCoreTools(opts = {}) {
12538
12634
  o.repoRoot
12539
12635
  ),
12540
12636
  listProvidersTool(o.providers ?? {}, o.activeProviders ?? null, o.moderatorDefault ?? "anthropic"),
12637
+ modelsTool(o.providers ?? {}, o.activeProviders ?? null),
12541
12638
  recallTool(o.storage, o.bridge),
12542
12639
  sessionMemoryTool(o.storage, o.bridge),
12543
12640
  scoreboardTool(o.storage, o.bridge, o.eventsPath),
@@ -12953,6 +13050,20 @@ function listProvidersTool(providers, activeProviders, moderatorDefault) {
12953
13050
  })
12954
13051
  };
12955
13052
  }
13053
+ function modelsTool(providers, activeProviders) {
13054
+ return {
13055
+ name: "models",
13056
+ description: "Show which model each provider will use, for BOTH panels \u2014 plain confer and `super` \u2014 with where each choice came from (your preference or the engine default), plus where to change them. Read-only; selection happens in the browser or the CLI.",
13057
+ inputSchema: {
13058
+ type: "object",
13059
+ additionalProperties: true,
13060
+ properties: {
13061
+ super: { type: "boolean", description: "Narrow the listing to the super lineup." }
13062
+ }
13063
+ },
13064
+ handler: async (args) => runModels(args, { providers, activeProviders })
13065
+ };
13066
+ }
12956
13067
  function reviewTool(providers, allowlist, bridge, storage, breakers, transcriptsDir, repoRoot) {
12957
13068
  return {
12958
13069
  name: "review",