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.
- package/dist/browser-ext.cjs +128 -17
- package/dist/browser-ext.cjs.map +1 -1
- package/dist/browser-ext.js +128 -17
- package/dist/browser-ext.js.map +1 -1
- package/dist/node-stdio.cjs +130 -17
- package/dist/node-stdio.cjs.map +1 -1
- package/dist/node-stdio.js +130 -17
- package/dist/node-stdio.js.map +1 -1
- package/package.json +1 -1
package/dist/browser-ext.cjs
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
|
4285
|
-
|
|
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 ?
|
|
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
|
|
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 (
|
|
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
|
|
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 (
|
|
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.
|
|
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",
|