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.
@@ -2015,18 +2015,24 @@ async function sendOpenAICompatible(args) {
2015
2015
  // src/providers/registry.ts
2016
2016
  var DEFAULT_MODELS = {
2017
2017
  anthropic: "claude-opus-5",
2018
- // gpt-5.5 is not enabled on every OpenAI account/project (some are still
2019
- // capped at gpt-5) — gpt-5 is the safer, more broadly available default
2020
- // until a user/org explicitly opts into 5.5 via `crosscheck models set`.
2021
- openai: "gpt-5",
2018
+ openai: "gpt-5.6-sol",
2022
2019
  xai: "grok-4-latest",
2023
2020
  mistral: "mistral-large-latest",
2024
2021
  groq: "llama-3.3-70b-versatile",
2025
2022
  deepseek: "deepseek-chat",
2026
- gemini: "gemini-3.1-pro-preview",
2023
+ gemini: "gemini-3.8-flash",
2027
2024
  kimi: "kimi-k3",
2028
2025
  qwen: "qwen3.8-max"
2029
2026
  };
2027
+ var DEFAULT_FALLBACKS = {
2028
+ // gpt-5.6 requires a billing-enabled account and is excluded from the free
2029
+ // tier, so gpt-5 remains the broadly-available floor. One hop, not a
2030
+ // ladder — an intermediate 5.5 step would just be another model to reason
2031
+ // about.
2032
+ openai: ["gpt-5"],
2033
+ // 3.8 Flash is recent enough that some projects won't have it yet.
2034
+ gemini: ["gemini-3.1-pro-preview"]
2035
+ };
2030
2036
  var MODEL_ENV_VARS = {
2031
2037
  anthropic: "ANTHROPIC_MODEL",
2032
2038
  openai: "OPENAI_MODEL",
@@ -2055,7 +2061,11 @@ function parseFallbackModels(raw) {
2055
2061
  }
2056
2062
  function fallbackModelsFor(env, provider) {
2057
2063
  const envVar = MODEL_ENV_VARS[provider];
2058
- return envVar ? parseFallbackModels(env[`${envVar}_FALLBACKS`]) : [];
2064
+ const fromEnv = envVar ? parseFallbackModels(env[`${envVar}_FALLBACKS`]) : [];
2065
+ if (fromEnv.length > 0) return fromEnv;
2066
+ const pinned = envVar ? env[envVar] : void 0;
2067
+ if (pinned && pinned !== DEFAULT_MODELS[provider]) return [];
2068
+ return DEFAULT_FALLBACKS[provider] ?? [];
2059
2069
  }
2060
2070
  function buildProviders(opts) {
2061
2071
  const out = {};
@@ -2219,6 +2229,7 @@ var ROUTABLE_TOOLS = [
2219
2229
  "explain",
2220
2230
  // Operations
2221
2231
  "list_providers",
2232
+ "models",
2222
2233
  "recommend_panel",
2223
2234
  "delegate",
2224
2235
  "bench",
@@ -2275,7 +2286,7 @@ var import_zod = require("zod");
2275
2286
  // src/server-meta.ts
2276
2287
  init_cjs_shims();
2277
2288
  var SERVER_NAME = "crosscheck-agent";
2278
- var SERVER_VERSION = true ? "0.2.17" : "0.0.0-dev";
2289
+ var SERVER_VERSION = true ? "0.2.19" : "0.0.0-dev";
2279
2290
 
2280
2291
  // src/tools/audit.ts
2281
2292
  init_cjs_shims();
@@ -3874,7 +3885,7 @@ var import_node_perf_hooks = require("perf_hooks");
3874
3885
 
3875
3886
  // src/core/co-reason.ts
3876
3887
  init_cjs_shims();
3877
- var CO_REASON_MODEL = "gpt-5.6";
3888
+ var CO_REASON_MODEL = "gpt-5.6-sol";
3878
3889
  var CO_REASON_PROVIDER = "openai";
3879
3890
  var CO_REASON_LABEL = "GPT-5.6";
3880
3891
  function pickCoReasoner(providers, upgradeRequested) {
@@ -5245,8 +5256,10 @@ var SUPER_MODELS = {
5245
5256
  // on it succeeded as recently as 2026-08-30 — so it is an unlisted alias
5246
5257
  // rather than a dead id.
5247
5258
  xai: [DEFAULT_MODELS["xai"]],
5248
- // 3.8 Flash verified present; the previous default as fallback.
5249
- gemini: ["gemini-3.8-flash", DEFAULT_MODELS["gemini"]],
5259
+ // 3.8 Flash is now BOTH the everyday default and the super pick for Gemini,
5260
+ // so this can no longer borrow DEFAULT_MODELS as its fallback — that would
5261
+ // repeat the same model and retry one that just failed. Named explicitly.
5262
+ gemini: ["gemini-3.8-flash", "gemini-3.1-pro-preview"],
5250
5263
  kimi: [DEFAULT_MODELS["kimi"]],
5251
5264
  qwen: [DEFAULT_MODELS["qwen"]]
5252
5265
  };
@@ -11112,11 +11125,13 @@ function runListProviders(args, opts) {
11112
11125
  const providers = [];
11113
11126
  for (const name of names) {
11114
11127
  const prov = opts.providers[name];
11128
+ const superChain = superRequested ? superChainFor(name) : [];
11115
11129
  providers.push({
11116
11130
  name,
11117
11131
  available: prov !== void 0,
11118
11132
  active: active.has(name),
11119
- model: superRequested ? SUPER_MODELS[name] : prov ? prov.model : null
11133
+ model: superRequested ? superPrimary(name) ?? null : prov ? prov.model : null,
11134
+ ...superChain.length > 1 ? { fallbacks: superChain.slice(1) } : {}
11120
11135
  });
11121
11136
  }
11122
11137
  const result = {
@@ -11128,6 +11143,81 @@ function runListProviders(args, opts) {
11128
11143
  return result;
11129
11144
  }
11130
11145
 
11146
+ // src/tools/models.ts
11147
+ init_cjs_shims();
11148
+ var KNOWN_PROVIDERS7 = [
11149
+ "anthropic",
11150
+ "openai",
11151
+ "xai",
11152
+ "gemini",
11153
+ "mistral",
11154
+ "groq",
11155
+ "deepseek",
11156
+ "kimi",
11157
+ "qwen"
11158
+ ];
11159
+ var PICKER_URL = "https://crosscheckagent.com/account/models";
11160
+ var SUPER_ENV_VARS2 = {
11161
+ anthropic: "ANTHROPIC_SUPER_MODEL",
11162
+ openai: "OPENAI_SUPER_MODEL",
11163
+ xai: "XAI_SUPER_MODEL",
11164
+ gemini: "GEMINI_SUPER_MODEL",
11165
+ kimi: "KIMI_SUPER_MODEL",
11166
+ qwen: "QWEN_SUPER_MODEL",
11167
+ mistral: "MISTRAL_SUPER_MODEL",
11168
+ groq: "GROQ_SUPER_MODEL",
11169
+ deepseek: "DEEPSEEK_SUPER_MODEL"
11170
+ };
11171
+ var MODEL_ENV_VARS2 = {
11172
+ anthropic: "ANTHROPIC_MODEL",
11173
+ openai: "OPENAI_MODEL",
11174
+ xai: "XAI_MODEL",
11175
+ gemini: "GEMINI_MODEL",
11176
+ kimi: "KIMI_MODEL",
11177
+ qwen: "QWEN_MODEL",
11178
+ mistral: "MISTRAL_MODEL",
11179
+ groq: "GROQ_MODEL",
11180
+ deepseek: "DEEPSEEK_MODEL"
11181
+ };
11182
+ function runModels(args, opts) {
11183
+ const env = opts.env ?? process.env;
11184
+ const active = new Set(opts.activeProviders ?? Object.keys(opts.providers));
11185
+ const onlySuper = isSuperRequested(args);
11186
+ const names = onlySuper ? SUPER_PROVIDER_NAMES : KNOWN_PROVIDERS7;
11187
+ const rows = [];
11188
+ for (const name of names) {
11189
+ const prov = opts.providers[name];
11190
+ const conferModel = prov ? prov.model : null;
11191
+ const conferPinned = Boolean(MODEL_ENV_VARS2[name] && env[MODEL_ENV_VARS2[name]]);
11192
+ const conferSource = !prov ? "unconfigured" : conferPinned ? "preference" : "default";
11193
+ const superVar = SUPER_ENV_VARS2[name];
11194
+ const superPinned = Boolean(superVar && env[superVar]);
11195
+ const chain = superChainFor(name, env);
11196
+ rows.push({
11197
+ provider: name,
11198
+ available: prov !== void 0,
11199
+ active: active.has(name),
11200
+ confer: conferModel,
11201
+ confer_source: conferSource,
11202
+ super: superPrimary(name, env) ?? null,
11203
+ super_source: superPinned ? "preference" : chain.length > 0 ? "default" : "unconfigured",
11204
+ ...chain.length > 1 ? { super_fallbacks: chain.slice(1) } : {}
11205
+ });
11206
+ }
11207
+ const pinned = rows.filter(
11208
+ (r) => r.confer_source === "preference" || r.super_source === "preference"
11209
+ ).length;
11210
+ return {
11211
+ tool: "models",
11212
+ providers: rows,
11213
+ ...onlySuper ? { super_mode: true } : {},
11214
+ pinned_count: pinned,
11215
+ // Read-only by design — say so, and say where selection actually happens,
11216
+ // rather than leaving someone to guess why nothing changed.
11217
+ 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.`
11218
+ };
11219
+ }
11220
+
11131
11221
  // src/tools/pick.ts
11132
11222
  init_cjs_shims();
11133
11223
  var import_node_perf_hooks10 = require("perf_hooks");
@@ -11448,7 +11538,7 @@ function resolveProviders7(names, available, allowlist) {
11448
11538
  }
11449
11539
  return out;
11450
11540
  }
11451
- var KNOWN_PROVIDERS7 = [
11541
+ var KNOWN_PROVIDERS8 = [
11452
11542
  "anthropic",
11453
11543
  "openai",
11454
11544
  "xai",
@@ -11462,7 +11552,7 @@ function unknownProviderError6(unknownNames, available) {
11462
11552
  const typos = [];
11463
11553
  for (const n of unknownNames) {
11464
11554
  const key = n.trim().toLowerCase();
11465
- if (KNOWN_PROVIDERS7.includes(key)) notRegistered.push(n);
11555
+ if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
11466
11556
  else typos.push(n);
11467
11557
  }
11468
11558
  return {
@@ -12618,7 +12708,7 @@ function resolveProviders8(names, available, allowlist) {
12618
12708
  }
12619
12709
  return out;
12620
12710
  }
12621
- var KNOWN_PROVIDERS8 = [
12711
+ var KNOWN_PROVIDERS9 = [
12622
12712
  "anthropic",
12623
12713
  "openai",
12624
12714
  "xai",
@@ -12632,7 +12722,7 @@ function unknownProviderError7(unknownNames, available) {
12632
12722
  const typos = [];
12633
12723
  for (const n of unknownNames) {
12634
12724
  const key = n.trim().toLowerCase();
12635
- if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
12725
+ if (KNOWN_PROVIDERS9.includes(key)) notRegistered.push(n);
12636
12726
  else typos.push(n);
12637
12727
  }
12638
12728
  return {
@@ -12684,7 +12774,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
12684
12774
  var DEFAULT_PACKAGE = "crosscheck-cli";
12685
12775
  var FETCH_TIMEOUT_MS = 3e3;
12686
12776
  function engineVersion() {
12687
- return true ? "0.2.17" : "0.0.0-dev";
12777
+ return true ? "0.2.19" : "0.0.0-dev";
12688
12778
  }
12689
12779
  function defaultUpdateCachePath() {
12690
12780
  const base = process.env["CROSSCHECK_DATA_DIR"] || import_node_path13.default.join(import_node_os2.default.homedir() || import_node_os2.default.tmpdir(), ".crosscheck");
@@ -13279,7 +13369,15 @@ var HELP_CATALOG = [
13279
13369
  primaryArg: "(none)",
13280
13370
  summary: "Show configured providers, their default models, and active status.",
13281
13371
  example: "xc list_providers",
13282
- detail: "Lists every provider Crosscheck knows about, which have keys configured, each one's default model, and whether it's active in the panel."
13372
+ 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`."
13373
+ },
13374
+ {
13375
+ name: "models",
13376
+ category: "Operations",
13377
+ primaryArg: "(none)",
13378
+ summary: "Where to choose which model each provider uses, per panel.",
13379
+ example: "xc models \xB7 xc models super:true",
13380
+ 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."
13283
13381
  },
13284
13382
  {
13285
13383
  name: "recommend_panel",
@@ -13547,6 +13645,7 @@ function registerCoreTools(opts = {}) {
13547
13645
  o.repoRoot
13548
13646
  ),
13549
13647
  listProvidersTool(o.providers ?? {}, o.activeProviders ?? null, o.moderatorDefault ?? "anthropic"),
13648
+ modelsTool(o.providers ?? {}, o.activeProviders ?? null),
13550
13649
  recallTool(o.storage, o.bridge),
13551
13650
  sessionMemoryTool(o.storage, o.bridge),
13552
13651
  scoreboardTool(o.storage, o.bridge, o.eventsPath),
@@ -13962,6 +14061,20 @@ function listProvidersTool(providers, activeProviders, moderatorDefault) {
13962
14061
  })
13963
14062
  };
13964
14063
  }
14064
+ function modelsTool(providers, activeProviders) {
14065
+ return {
14066
+ name: "models",
14067
+ 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.",
14068
+ inputSchema: {
14069
+ type: "object",
14070
+ additionalProperties: true,
14071
+ properties: {
14072
+ super: { type: "boolean", description: "Narrow the listing to the super lineup." }
14073
+ }
14074
+ },
14075
+ handler: async (args) => runModels(args, { providers, activeProviders })
14076
+ };
14077
+ }
13965
14078
  function reviewTool(providers, allowlist, bridge, storage, breakers, transcriptsDir, repoRoot) {
13966
14079
  return {
13967
14080
  name: "review",