crosscheck-mcp 0.2.17 → 0.2.18

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.
@@ -1320,7 +1320,7 @@ import { z } from "zod";
1320
1320
 
1321
1321
  // src/server-meta.ts
1322
1322
  var SERVER_NAME = "crosscheck-agent";
1323
- var SERVER_VERSION = true ? "0.2.17" : "0.0.0-dev";
1323
+ var SERVER_VERSION = true ? "0.2.18" : "0.0.0-dev";
1324
1324
 
1325
1325
  // src/tools/audit.ts
1326
1326
  import { readdirSync, readFileSync as readFileSync3, statSync } from "fs";
@@ -10099,11 +10099,13 @@ function runListProviders(args, opts) {
10099
10099
  const providers = [];
10100
10100
  for (const name of names) {
10101
10101
  const prov = opts.providers[name];
10102
+ const superChain = superRequested ? superChainFor(name) : [];
10102
10103
  providers.push({
10103
10104
  name,
10104
10105
  available: prov !== void 0,
10105
10106
  active: active.has(name),
10106
- model: superRequested ? SUPER_MODELS[name] : prov ? prov.model : null
10107
+ model: superRequested ? superPrimary(name) ?? null : prov ? prov.model : null,
10108
+ ...superChain.length > 1 ? { fallbacks: superChain.slice(1) } : {}
10107
10109
  });
10108
10110
  }
10109
10111
  const result = {
@@ -10115,6 +10117,80 @@ function runListProviders(args, opts) {
10115
10117
  return result;
10116
10118
  }
10117
10119
 
10120
+ // src/tools/models.ts
10121
+ var KNOWN_PROVIDERS7 = [
10122
+ "anthropic",
10123
+ "openai",
10124
+ "xai",
10125
+ "gemini",
10126
+ "mistral",
10127
+ "groq",
10128
+ "deepseek",
10129
+ "kimi",
10130
+ "qwen"
10131
+ ];
10132
+ var PICKER_URL = "https://crosscheckagent.com/account/models";
10133
+ var SUPER_ENV_VARS2 = {
10134
+ anthropic: "ANTHROPIC_SUPER_MODEL",
10135
+ openai: "OPENAI_SUPER_MODEL",
10136
+ xai: "XAI_SUPER_MODEL",
10137
+ gemini: "GEMINI_SUPER_MODEL",
10138
+ kimi: "KIMI_SUPER_MODEL",
10139
+ qwen: "QWEN_SUPER_MODEL",
10140
+ mistral: "MISTRAL_SUPER_MODEL",
10141
+ groq: "GROQ_SUPER_MODEL",
10142
+ deepseek: "DEEPSEEK_SUPER_MODEL"
10143
+ };
10144
+ var MODEL_ENV_VARS2 = {
10145
+ anthropic: "ANTHROPIC_MODEL",
10146
+ openai: "OPENAI_MODEL",
10147
+ xai: "XAI_MODEL",
10148
+ gemini: "GEMINI_MODEL",
10149
+ kimi: "KIMI_MODEL",
10150
+ qwen: "QWEN_MODEL",
10151
+ mistral: "MISTRAL_MODEL",
10152
+ groq: "GROQ_MODEL",
10153
+ deepseek: "DEEPSEEK_MODEL"
10154
+ };
10155
+ function runModels(args, opts) {
10156
+ const env = opts.env ?? process.env;
10157
+ const active = new Set(opts.activeProviders ?? Object.keys(opts.providers));
10158
+ const onlySuper = isSuperRequested(args);
10159
+ const names = onlySuper ? SUPER_PROVIDER_NAMES : KNOWN_PROVIDERS7;
10160
+ const rows = [];
10161
+ for (const name of names) {
10162
+ const prov = opts.providers[name];
10163
+ const conferModel = prov ? prov.model : null;
10164
+ const conferPinned = Boolean(MODEL_ENV_VARS2[name] && env[MODEL_ENV_VARS2[name]]);
10165
+ const conferSource = !prov ? "unconfigured" : conferPinned ? "preference" : "default";
10166
+ const superVar = SUPER_ENV_VARS2[name];
10167
+ const superPinned = Boolean(superVar && env[superVar]);
10168
+ const chain = superChainFor(name, env);
10169
+ rows.push({
10170
+ provider: name,
10171
+ available: prov !== void 0,
10172
+ active: active.has(name),
10173
+ confer: conferModel,
10174
+ confer_source: conferSource,
10175
+ super: superPrimary(name, env) ?? null,
10176
+ super_source: superPinned ? "preference" : chain.length > 0 ? "default" : "unconfigured",
10177
+ ...chain.length > 1 ? { super_fallbacks: chain.slice(1) } : {}
10178
+ });
10179
+ }
10180
+ const pinned = rows.filter(
10181
+ (r) => r.confer_source === "preference" || r.super_source === "preference"
10182
+ ).length;
10183
+ return {
10184
+ tool: "models",
10185
+ providers: rows,
10186
+ ...onlySuper ? { super_mode: true } : {},
10187
+ pinned_count: pinned,
10188
+ // Read-only by design — say so, and say where selection actually happens,
10189
+ // rather than leaving someone to guess why nothing changed.
10190
+ 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.`
10191
+ };
10192
+ }
10193
+
10118
10194
  // src/tools/pick.ts
10119
10195
  import { performance as performance11 } from "perf_hooks";
10120
10196
  var PICK_SCORES_SCHEMA = {
@@ -10434,7 +10510,7 @@ function resolveProviders7(names, available, allowlist) {
10434
10510
  }
10435
10511
  return out;
10436
10512
  }
10437
- var KNOWN_PROVIDERS7 = [
10513
+ var KNOWN_PROVIDERS8 = [
10438
10514
  "anthropic",
10439
10515
  "openai",
10440
10516
  "xai",
@@ -10448,7 +10524,7 @@ function unknownProviderError6(unknownNames, available) {
10448
10524
  const typos = [];
10449
10525
  for (const n of unknownNames) {
10450
10526
  const key = n.trim().toLowerCase();
10451
- if (KNOWN_PROVIDERS7.includes(key)) notRegistered.push(n);
10527
+ if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
10452
10528
  else typos.push(n);
10453
10529
  }
10454
10530
  return {
@@ -11597,7 +11673,7 @@ function resolveProviders8(names, available, allowlist) {
11597
11673
  }
11598
11674
  return out;
11599
11675
  }
11600
- var KNOWN_PROVIDERS8 = [
11676
+ var KNOWN_PROVIDERS9 = [
11601
11677
  "anthropic",
11602
11678
  "openai",
11603
11679
  "xai",
@@ -11611,7 +11687,7 @@ function unknownProviderError7(unknownNames, available) {
11611
11687
  const typos = [];
11612
11688
  for (const n of unknownNames) {
11613
11689
  const key = n.trim().toLowerCase();
11614
- if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
11690
+ if (KNOWN_PROVIDERS9.includes(key)) notRegistered.push(n);
11615
11691
  else typos.push(n);
11616
11692
  }
11617
11693
  return {
@@ -11661,7 +11737,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
11661
11737
  var DEFAULT_PACKAGE = "crosscheck-cli";
11662
11738
  var FETCH_TIMEOUT_MS = 3e3;
11663
11739
  function engineVersion() {
11664
- return true ? "0.2.17" : "0.0.0-dev";
11740
+ return true ? "0.2.18" : "0.0.0-dev";
11665
11741
  }
11666
11742
  function defaultUpdateCachePath() {
11667
11743
  const base = process.env["CROSSCHECK_DATA_DIR"] || path9.join(os.homedir() || os.tmpdir(), ".crosscheck");
@@ -12254,7 +12330,15 @@ var HELP_CATALOG = [
12254
12330
  primaryArg: "(none)",
12255
12331
  summary: "Show configured providers, their default models, and active status.",
12256
12332
  example: "xc list_providers",
12257
- detail: "Lists every provider Crosscheck knows about, which have keys configured, each one's default model, and whether it's active in the panel."
12333
+ 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`."
12334
+ },
12335
+ {
12336
+ name: "models",
12337
+ category: "Operations",
12338
+ primaryArg: "(none)",
12339
+ summary: "Where to choose which model each provider uses, per panel.",
12340
+ example: "xc models \xB7 xc models super:true",
12341
+ 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."
12258
12342
  },
12259
12343
  {
12260
12344
  name: "recommend_panel",
@@ -12522,6 +12606,7 @@ function registerCoreTools(opts = {}) {
12522
12606
  o.repoRoot
12523
12607
  ),
12524
12608
  listProvidersTool(o.providers ?? {}, o.activeProviders ?? null, o.moderatorDefault ?? "anthropic"),
12609
+ modelsTool(o.providers ?? {}, o.activeProviders ?? null),
12525
12610
  recallTool(o.storage, o.bridge),
12526
12611
  sessionMemoryTool(o.storage, o.bridge),
12527
12612
  scoreboardTool(o.storage, o.bridge, o.eventsPath),
@@ -12937,6 +13022,20 @@ function listProvidersTool(providers, activeProviders, moderatorDefault) {
12937
13022
  })
12938
13023
  };
12939
13024
  }
13025
+ function modelsTool(providers, activeProviders) {
13026
+ return {
13027
+ name: "models",
13028
+ 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.",
13029
+ inputSchema: {
13030
+ type: "object",
13031
+ additionalProperties: true,
13032
+ properties: {
13033
+ super: { type: "boolean", description: "Narrow the listing to the super lineup." }
13034
+ }
13035
+ },
13036
+ handler: async (args) => runModels(args, { providers, activeProviders })
13037
+ };
13038
+ }
12940
13039
  function reviewTool(providers, allowlist, bridge, storage, breakers, transcriptsDir, repoRoot) {
12941
13040
  return {
12942
13041
  name: "review",