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.
@@ -2198,6 +2198,7 @@ var ROUTABLE_TOOLS = [
2198
2198
  "explain",
2199
2199
  // Operations
2200
2200
  "list_providers",
2201
+ "models",
2201
2202
  "recommend_panel",
2202
2203
  "delegate",
2203
2204
  "bench",
@@ -2254,7 +2255,7 @@ import { z } from "zod";
2254
2255
  // src/server-meta.ts
2255
2256
  init_esm_shims();
2256
2257
  var SERVER_NAME = "crosscheck-agent";
2257
- var SERVER_VERSION = true ? "0.2.17" : "0.0.0-dev";
2258
+ var SERVER_VERSION = true ? "0.2.18" : "0.0.0-dev";
2258
2259
 
2259
2260
  // src/tools/audit.ts
2260
2261
  init_esm_shims();
@@ -11108,11 +11109,13 @@ function runListProviders(args, opts) {
11108
11109
  const providers = [];
11109
11110
  for (const name of names) {
11110
11111
  const prov = opts.providers[name];
11112
+ const superChain = superRequested ? superChainFor(name) : [];
11111
11113
  providers.push({
11112
11114
  name,
11113
11115
  available: prov !== void 0,
11114
11116
  active: active.has(name),
11115
- model: superRequested ? SUPER_MODELS[name] : prov ? prov.model : null
11117
+ model: superRequested ? superPrimary(name) ?? null : prov ? prov.model : null,
11118
+ ...superChain.length > 1 ? { fallbacks: superChain.slice(1) } : {}
11116
11119
  });
11117
11120
  }
11118
11121
  const result = {
@@ -11124,6 +11127,81 @@ function runListProviders(args, opts) {
11124
11127
  return result;
11125
11128
  }
11126
11129
 
11130
+ // src/tools/models.ts
11131
+ init_esm_shims();
11132
+ var KNOWN_PROVIDERS7 = [
11133
+ "anthropic",
11134
+ "openai",
11135
+ "xai",
11136
+ "gemini",
11137
+ "mistral",
11138
+ "groq",
11139
+ "deepseek",
11140
+ "kimi",
11141
+ "qwen"
11142
+ ];
11143
+ var PICKER_URL = "https://crosscheckagent.com/account/models";
11144
+ var SUPER_ENV_VARS2 = {
11145
+ anthropic: "ANTHROPIC_SUPER_MODEL",
11146
+ openai: "OPENAI_SUPER_MODEL",
11147
+ xai: "XAI_SUPER_MODEL",
11148
+ gemini: "GEMINI_SUPER_MODEL",
11149
+ kimi: "KIMI_SUPER_MODEL",
11150
+ qwen: "QWEN_SUPER_MODEL",
11151
+ mistral: "MISTRAL_SUPER_MODEL",
11152
+ groq: "GROQ_SUPER_MODEL",
11153
+ deepseek: "DEEPSEEK_SUPER_MODEL"
11154
+ };
11155
+ var MODEL_ENV_VARS2 = {
11156
+ anthropic: "ANTHROPIC_MODEL",
11157
+ openai: "OPENAI_MODEL",
11158
+ xai: "XAI_MODEL",
11159
+ gemini: "GEMINI_MODEL",
11160
+ kimi: "KIMI_MODEL",
11161
+ qwen: "QWEN_MODEL",
11162
+ mistral: "MISTRAL_MODEL",
11163
+ groq: "GROQ_MODEL",
11164
+ deepseek: "DEEPSEEK_MODEL"
11165
+ };
11166
+ function runModels(args, opts) {
11167
+ const env = opts.env ?? process.env;
11168
+ const active = new Set(opts.activeProviders ?? Object.keys(opts.providers));
11169
+ const onlySuper = isSuperRequested(args);
11170
+ const names = onlySuper ? SUPER_PROVIDER_NAMES : KNOWN_PROVIDERS7;
11171
+ const rows = [];
11172
+ for (const name of names) {
11173
+ const prov = opts.providers[name];
11174
+ const conferModel = prov ? prov.model : null;
11175
+ const conferPinned = Boolean(MODEL_ENV_VARS2[name] && env[MODEL_ENV_VARS2[name]]);
11176
+ const conferSource = !prov ? "unconfigured" : conferPinned ? "preference" : "default";
11177
+ const superVar = SUPER_ENV_VARS2[name];
11178
+ const superPinned = Boolean(superVar && env[superVar]);
11179
+ const chain = superChainFor(name, env);
11180
+ rows.push({
11181
+ provider: name,
11182
+ available: prov !== void 0,
11183
+ active: active.has(name),
11184
+ confer: conferModel,
11185
+ confer_source: conferSource,
11186
+ super: superPrimary(name, env) ?? null,
11187
+ super_source: superPinned ? "preference" : chain.length > 0 ? "default" : "unconfigured",
11188
+ ...chain.length > 1 ? { super_fallbacks: chain.slice(1) } : {}
11189
+ });
11190
+ }
11191
+ const pinned = rows.filter(
11192
+ (r) => r.confer_source === "preference" || r.super_source === "preference"
11193
+ ).length;
11194
+ return {
11195
+ tool: "models",
11196
+ providers: rows,
11197
+ ...onlySuper ? { super_mode: true } : {},
11198
+ pinned_count: pinned,
11199
+ // Read-only by design — say so, and say where selection actually happens,
11200
+ // rather than leaving someone to guess why nothing changed.
11201
+ 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.`
11202
+ };
11203
+ }
11204
+
11127
11205
  // src/tools/pick.ts
11128
11206
  init_esm_shims();
11129
11207
  import { performance as performance11 } from "perf_hooks";
@@ -11444,7 +11522,7 @@ function resolveProviders7(names, available, allowlist) {
11444
11522
  }
11445
11523
  return out;
11446
11524
  }
11447
- var KNOWN_PROVIDERS7 = [
11525
+ var KNOWN_PROVIDERS8 = [
11448
11526
  "anthropic",
11449
11527
  "openai",
11450
11528
  "xai",
@@ -11458,7 +11536,7 @@ function unknownProviderError6(unknownNames, available) {
11458
11536
  const typos = [];
11459
11537
  for (const n of unknownNames) {
11460
11538
  const key = n.trim().toLowerCase();
11461
- if (KNOWN_PROVIDERS7.includes(key)) notRegistered.push(n);
11539
+ if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
11462
11540
  else typos.push(n);
11463
11541
  }
11464
11542
  return {
@@ -12614,7 +12692,7 @@ function resolveProviders8(names, available, allowlist) {
12614
12692
  }
12615
12693
  return out;
12616
12694
  }
12617
- var KNOWN_PROVIDERS8 = [
12695
+ var KNOWN_PROVIDERS9 = [
12618
12696
  "anthropic",
12619
12697
  "openai",
12620
12698
  "xai",
@@ -12628,7 +12706,7 @@ function unknownProviderError7(unknownNames, available) {
12628
12706
  const typos = [];
12629
12707
  for (const n of unknownNames) {
12630
12708
  const key = n.trim().toLowerCase();
12631
- if (KNOWN_PROVIDERS8.includes(key)) notRegistered.push(n);
12709
+ if (KNOWN_PROVIDERS9.includes(key)) notRegistered.push(n);
12632
12710
  else typos.push(n);
12633
12711
  }
12634
12712
  return {
@@ -12680,7 +12758,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
12680
12758
  var DEFAULT_PACKAGE = "crosscheck-cli";
12681
12759
  var FETCH_TIMEOUT_MS = 3e3;
12682
12760
  function engineVersion() {
12683
- return true ? "0.2.17" : "0.0.0-dev";
12761
+ return true ? "0.2.18" : "0.0.0-dev";
12684
12762
  }
12685
12763
  function defaultUpdateCachePath() {
12686
12764
  const base = process.env["CROSSCHECK_DATA_DIR"] || path10.join(os.homedir() || os.tmpdir(), ".crosscheck");
@@ -13275,7 +13353,15 @@ var HELP_CATALOG = [
13275
13353
  primaryArg: "(none)",
13276
13354
  summary: "Show configured providers, their default models, and active status.",
13277
13355
  example: "xc list_providers",
13278
- detail: "Lists every provider Crosscheck knows about, which have keys configured, each one's default model, and whether it's active in the panel."
13356
+ 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`."
13357
+ },
13358
+ {
13359
+ name: "models",
13360
+ category: "Operations",
13361
+ primaryArg: "(none)",
13362
+ summary: "Where to choose which model each provider uses, per panel.",
13363
+ example: "xc models \xB7 xc models super:true",
13364
+ 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."
13279
13365
  },
13280
13366
  {
13281
13367
  name: "recommend_panel",
@@ -13543,6 +13629,7 @@ function registerCoreTools(opts = {}) {
13543
13629
  o.repoRoot
13544
13630
  ),
13545
13631
  listProvidersTool(o.providers ?? {}, o.activeProviders ?? null, o.moderatorDefault ?? "anthropic"),
13632
+ modelsTool(o.providers ?? {}, o.activeProviders ?? null),
13546
13633
  recallTool(o.storage, o.bridge),
13547
13634
  sessionMemoryTool(o.storage, o.bridge),
13548
13635
  scoreboardTool(o.storage, o.bridge, o.eventsPath),
@@ -13958,6 +14045,20 @@ function listProvidersTool(providers, activeProviders, moderatorDefault) {
13958
14045
  })
13959
14046
  };
13960
14047
  }
14048
+ function modelsTool(providers, activeProviders) {
14049
+ return {
14050
+ name: "models",
14051
+ 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.",
14052
+ inputSchema: {
14053
+ type: "object",
14054
+ additionalProperties: true,
14055
+ properties: {
14056
+ super: { type: "boolean", description: "Narrow the listing to the super lineup." }
14057
+ }
14058
+ },
14059
+ handler: async (args) => runModels(args, { providers, activeProviders })
14060
+ };
14061
+ }
13961
14062
  function reviewTool(providers, allowlist, bridge, storage, breakers, transcriptsDir, repoRoot) {
13962
14063
  return {
13963
14064
  name: "review",