crosscheck-mcp 0.2.25 → 0.2.27

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.
@@ -63,6 +63,11 @@ var pricing_default = {
63
63
  completion_per_1k: 0.075,
64
64
  cached_per_1k: 15e-4
65
65
  },
66
+ "claude-opus-5-5": {
67
+ prompt_per_1k: 4e-3,
68
+ completion_per_1k: 0.02,
69
+ cached_per_1k: 2e-4
70
+ },
66
71
  "claude-opus-5": {
67
72
  prompt_per_1k: 5e-3,
68
73
  completion_per_1k: 0.025,
@@ -105,10 +110,40 @@ var pricing_default = {
105
110
  }
106
111
  },
107
112
  openai: {
113
+ "gpt-6-astra": {
114
+ prompt_per_1k: 0.01,
115
+ completion_per_1k: 0.05,
116
+ cached_per_1k: 1e-3
117
+ },
118
+ "gpt-6-sol": {
119
+ prompt_per_1k: 2e-3,
120
+ completion_per_1k: 0.01,
121
+ cached_per_1k: 2e-4
122
+ },
123
+ "gpt-6-luna": {
124
+ prompt_per_1k: 1e-4,
125
+ completion_per_1k: 5e-4,
126
+ cached_per_1k: 1e-5
127
+ },
128
+ "gpt-5.6-sol": {
129
+ prompt_per_1k: 4e-3,
130
+ completion_per_1k: 0.02,
131
+ cached_per_1k: 4e-4
132
+ },
133
+ "gpt-5.6-terra": {
134
+ prompt_per_1k: 2e-3,
135
+ completion_per_1k: 0.012,
136
+ cached_per_1k: 2e-4
137
+ },
138
+ "gpt-5.6-luna": {
139
+ prompt_per_1k: 2e-4,
140
+ completion_per_1k: 12e-4,
141
+ cached_per_1k: 2e-5
142
+ },
108
143
  "gpt-5.6": {
109
- prompt_per_1k: 5e-3,
110
- completion_per_1k: 0.03,
111
- cached_per_1k: 5e-4
144
+ prompt_per_1k: 4e-3,
145
+ completion_per_1k: 0.02,
146
+ cached_per_1k: 4e-4
112
147
  },
113
148
  "gpt-5.5": {
114
149
  prompt_per_1k: 5e-3,
@@ -121,9 +156,14 @@ var pricing_default = {
121
156
  cached_per_1k: 125e-6
122
157
  },
123
158
  "gpt-5-mini": {
124
- prompt_per_1k: 5e-4,
125
- completion_per_1k: 15e-4,
126
- cached_per_1k: 25e-5
159
+ prompt_per_1k: 25e-5,
160
+ completion_per_1k: 2e-3,
161
+ cached_per_1k: 25e-6
162
+ },
163
+ "gpt-5-nano": {
164
+ prompt_per_1k: 5e-5,
165
+ completion_per_1k: 4e-4,
166
+ cached_per_1k: 5e-6
127
167
  },
128
168
  "gpt-4o": {
129
169
  prompt_per_1k: 25e-4,
@@ -146,19 +186,14 @@ var pricing_default = {
146
186
  cached_per_1k: 15e-4
147
187
  },
148
188
  o3: {
149
- prompt_per_1k: 0.01,
150
- completion_per_1k: 0.04,
151
- cached_per_1k: 5e-3
189
+ prompt_per_1k: 2e-3,
190
+ completion_per_1k: 8e-3,
191
+ cached_per_1k: 5e-4
152
192
  },
153
193
  "o3-mini": {
154
194
  prompt_per_1k: 11e-4,
155
195
  completion_per_1k: 44e-4,
156
196
  cached_per_1k: 55e-5
157
- },
158
- "gpt-6-astra": {
159
- prompt_per_1k: 0.01,
160
- completion_per_1k: 0.05,
161
- cached_per_1k: 1e-3
162
197
  }
163
198
  },
164
199
  xai: {
@@ -392,7 +427,12 @@ var import_node_fs = require("fs");
392
427
  function modelPricing(pricing, provider, model) {
393
428
  const block = pricing[provider];
394
429
  if (!block || typeof block !== "object" || Array.isArray(block)) return null;
395
- const entry = block[model];
430
+ const table = block;
431
+ let entry = table[model];
432
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
433
+ const best = Object.keys(table).filter((k) => model.startsWith(k)).sort((a, b) => b.length - a.length)[0];
434
+ entry = best !== void 0 ? table[best] : void 0;
435
+ }
396
436
  if (!entry || typeof entry !== "object" || Array.isArray(entry)) return null;
397
437
  const e = entry;
398
438
  return {
@@ -749,6 +789,14 @@ async function acquireRateLimit(provider, deps) {
749
789
  // src/providers/anthropic.ts
750
790
  var ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
751
791
  var ANTHROPIC_VERSION_HEADER = "2023-06-01";
792
+ var ADAPTIVE_THINKING_PREFIXES = [
793
+ "claude-fable-5",
794
+ "claude-opus-5-5"
795
+ ];
796
+ function rejectsDisabledThinking(model) {
797
+ const m = model.toLowerCase();
798
+ return ADAPTIVE_THINKING_PREFIXES.some((p) => m.startsWith(p));
799
+ }
752
800
  var ANTHROPIC_STRUCTURED_TOOL_NAME = "structured_output";
753
801
  function applyPromptCaching(body, env = process.env) {
754
802
  const flag = (env["CROSSCHECK_ANTHROPIC_PROMPT_CACHE"] ?? "").trim();
@@ -793,7 +841,7 @@ function buildAnthropicRequest(opts) {
793
841
  }
794
842
  applyPromptCaching(body);
795
843
  if (isReasoningModel("anthropic", opts.model)) {
796
- if (opts.model.toLowerCase().startsWith("claude-fable-5")) {
844
+ if (rejectsDisabledThinking(opts.model)) {
797
845
  body.thinking = { type: "adaptive" };
798
846
  body.output_config = { effort: "low" };
799
847
  } else {
@@ -1313,8 +1361,8 @@ async function sendOpenAICompatible(args) {
1313
1361
 
1314
1362
  // src/providers/registry.ts
1315
1363
  var DEFAULT_MODELS = {
1316
- anthropic: "claude-opus-5",
1317
- openai: "gpt-5.6-sol",
1364
+ anthropic: "claude-opus-5-5",
1365
+ openai: "gpt-6-sol",
1318
1366
  xai: "grok-4-latest",
1319
1367
  mistral: "mistral-large-latest",
1320
1368
  groq: "llama-3.3-70b-versatile",
@@ -1330,7 +1378,12 @@ var DEFAULT_FALLBACKS = {
1330
1378
  // about.
1331
1379
  openai: ["gpt-5"],
1332
1380
  // 3.8 Flash is recent enough that some projects won't have it yet.
1333
- gemini: ["gemini-3.1-pro-preview"]
1381
+ gemini: ["gemini-3.1-pro-preview"],
1382
+ // Opus 5.5 is new enough that an account could still be waiting on it.
1383
+ // Opus 5 is the same family one step back — and this chain is consulted
1384
+ // ONLY for a model-access failure, never for a bad key or a rate limit,
1385
+ // so it can't quietly downgrade anyone who simply hit a 429.
1386
+ anthropic: ["claude-opus-5"]
1334
1387
  };
1335
1388
  var MODEL_ENV_VARS = {
1336
1389
  anthropic: "ANTHROPIC_MODEL",
@@ -1455,7 +1508,7 @@ var import_zod = require("zod");
1455
1508
 
1456
1509
  // src/server-meta.ts
1457
1510
  var SERVER_NAME = "crosscheck-agent";
1458
- var SERVER_VERSION = true ? "0.2.25" : "0.0.0-dev";
1511
+ var SERVER_VERSION = true ? "0.2.27" : "0.0.0-dev";
1459
1512
 
1460
1513
  // src/tools/audit.ts
1461
1514
  var import_node_fs4 = require("fs");
@@ -3029,13 +3082,25 @@ function numberOrNull(v) {
3029
3082
  var import_node_perf_hooks = require("perf_hooks");
3030
3083
 
3031
3084
  // src/core/co-reason.ts
3032
- var CO_REASON_MODEL = "gpt-5.6-sol";
3085
+ var CO_REASON_MODEL = "gpt-6-sol";
3086
+ var CO_REASON_ALTERNATE = "gpt-6-astra";
3087
+ var LABELS = {
3088
+ "gpt-6-sol": "GPT-6 Sol",
3089
+ "gpt-6-astra": "GPT-6 Astra",
3090
+ "gpt-5.6-sol": "GPT-5.6 Sol"
3091
+ };
3092
+ function coReasonLabel(model) {
3093
+ return LABELS[model] ?? model;
3094
+ }
3095
+ var CO_REASON_LABEL = coReasonLabel(CO_REASON_MODEL);
3033
3096
  var CO_REASON_PROVIDER = "openai";
3034
- var CO_REASON_LABEL = "GPT-5.6";
3035
- function pickCoReasoner(providers, upgradeRequested) {
3097
+ function pickCoReasoner(providers, upgradeRequested, openAiSeatModel) {
3036
3098
  if (!upgradeRequested) return null;
3037
3099
  const base = providers[CO_REASON_PROVIDER];
3038
- return base ? retargetProvider(base, CO_REASON_MODEL) : null;
3100
+ if (!base) return null;
3101
+ const seat = openAiSeatModel ?? base.model;
3102
+ const model = seat === CO_REASON_MODEL ? CO_REASON_ALTERNATE : CO_REASON_MODEL;
3103
+ return retargetProvider(base, model);
3039
3104
  }
3040
3105
  async function coReasonThenInject(opts) {
3041
3106
  const { provider, messages, maxTokens } = opts;
@@ -3261,7 +3326,7 @@ function buildSuggestedUpgrade(toolName, assessment) {
3261
3326
  model: UPGRADE_MODEL,
3262
3327
  label: UPGRADE_LABEL,
3263
3328
  reason: assessment.reason,
3264
- how: `re-run \`${toolName}\` with reasoning:"max" (or upgrade:true) to route the lead reasoning seat to ${UPGRADE_LABEL}, and \u2014 when an OpenAI key is configured \u2014 add a GPT-5.6 second-opinion pass that ${UPGRADE_LABEL} weighs before finalizing. Other panel seats stay on their normal models.`
3329
+ how: `re-run \`${toolName}\` with reasoning:"max" (or upgrade:true) to route the lead reasoning seat to ${UPGRADE_LABEL}, and \u2014 when an OpenAI key is configured \u2014 add an OpenAI second-opinion pass that ${UPGRADE_LABEL} weighs before finalizing (the result names which model ran). Other panel seats stay on their normal models.`
3265
3330
  };
3266
3331
  }
3267
3332
 
@@ -3564,8 +3629,9 @@ ${rubricText}`;
3564
3629
  const upgradeRequested = isUpgradeRequested(args);
3565
3630
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
3566
3631
  const auditorForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : auditor;
3632
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
3567
3633
  const coReason = await coReasonThenInject({
3568
- provider: pickCoReasoner(opts.providers, upgradeRequested),
3634
+ provider: coProvider,
3569
3635
  messages: msgs,
3570
3636
  maxTokens: 2048,
3571
3637
  purpose: "audit-coreason"
@@ -3649,7 +3715,7 @@ ${rubricText}`;
3649
3715
  model: UPGRADE_MODEL,
3650
3716
  label: UPGRADE_LABEL,
3651
3717
  seat: "auditor",
3652
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
3718
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
3653
3719
  };
3654
3720
  } else if (upgradeRequested) {
3655
3721
  result["reasoning_upgrade"] = {
@@ -4380,8 +4446,12 @@ var SUPER_MODELS = {
4380
4446
  // Fable 5.1 verified present on the account; 5 as the fallback for accounts
4381
4447
  // that haven't been granted 5.1 yet.
4382
4448
  anthropic: ["claude-fable-5-1", UPGRADE_MODEL],
4383
- // Astra when it exists; gpt-5.6 until then. See the note above.
4384
- openai: ["gpt-6-astra", CO_REASON_MODEL],
4449
+ // Astra is live (verified against the account's model list 2026-09-23).
4450
+ // The fallback is named explicitly rather than reusing CO_REASON_MODEL:
4451
+ // that constant means "OpenAI's top reasoning model" for the max-reasoning
4452
+ // co-reasoner, which is a different question from "what should super fall
4453
+ // back to". Sharing the symbol silently coupled two unrelated decisions.
4454
+ openai: ["gpt-6-astra", "gpt-6-sol"],
4385
4455
  // Explicitly left as-is per product decision. Note grok-4-latest is not in
4386
4456
  // xAI's published model list, but it resolves in practice — real panel calls
4387
4457
  // on it succeeded as recently as 2026-08-30 — so it is an unlisted alias
@@ -7345,8 +7415,9 @@ ${recombineSys}` : recombineSys },
7345
7415
  provider: synthProvider.name
7346
7416
  } }
7347
7417
  );
7418
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
7348
7419
  const coReason = await coReasonThenInject({
7349
- provider: pickCoReasoner(opts.providers, upgradeRequested),
7420
+ provider: coProvider,
7350
7421
  messages: recMsgs,
7351
7422
  maxTokens,
7352
7423
  purpose: "orchestrate-coreason"
@@ -7405,7 +7476,7 @@ ${recombineSys}` : recombineSys },
7405
7476
  model: UPGRADE_MODEL,
7406
7477
  label: UPGRADE_LABEL,
7407
7478
  seat: "recombine/synthesis",
7408
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
7479
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
7409
7480
  };
7410
7481
  } else if (upgradeRequested) {
7411
7482
  result["reasoning_upgrade"] = {
@@ -8751,8 +8822,9 @@ CRITIQUES:
8751
8822
  ${critiqueBlock}`
8752
8823
  }
8753
8824
  ];
8825
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
8754
8826
  const coReason = await coReasonThenInject({
8755
- provider: pickCoReasoner(opts.providers, upgradeRequested),
8827
+ provider: coProvider,
8756
8828
  messages: synthMessages,
8757
8829
  maxTokens,
8758
8830
  purpose: "coordinate-coreason"
@@ -8816,7 +8888,7 @@ ${critiqueBlock}`
8816
8888
  model: superRequested ? superPrimary("anthropic") ?? UPGRADE_MODEL : UPGRADE_MODEL,
8817
8889
  label: UPGRADE_LABEL,
8818
8890
  seat: "synthesizer",
8819
- ...coReasonAns ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
8891
+ ...coReasonAns ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
8820
8892
  };
8821
8893
  } else if (upgradeRequested) {
8822
8894
  result["reasoning_upgrade"] = {
@@ -9538,6 +9610,7 @@ ${prior.body}` });
9538
9610
  let synthesisErrors = [];
9539
9611
  let personaMeta = null;
9540
9612
  let coReasoned = false;
9613
+ let coReasonerModel = null;
9541
9614
  if (moderator) {
9542
9615
  const synthProvider = superRequested && opts.providers["anthropic"] ? retargetForSuper(opts.providers["anthropic"]) : upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : moderator;
9543
9616
  const condensed = buildModeratorTranscript(transcript);
@@ -9565,13 +9638,16 @@ TRANSCRIPT:
9565
9638
  ${condensed}`
9566
9639
  }
9567
9640
  ];
9641
+ const openAiSeat = selected.find((p) => p.name === "openai")?.model;
9642
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested, openAiSeat);
9568
9643
  const coReason = await coReasonThenInject({
9569
- provider: pickCoReasoner(opts.providers, upgradeRequested),
9644
+ provider: coProvider,
9570
9645
  messages: synthMessages,
9571
9646
  maxTokens,
9572
9647
  purpose: "debate-coreason"
9573
9648
  });
9574
9649
  synthMessages = coReason.messages;
9650
+ coReasonerModel = coProvider?.model ?? null;
9575
9651
  if (coReason.answer) extraAnswers.push(coReason.answer);
9576
9652
  coReasoned = coReason.answer !== null;
9577
9653
  if (structuredOpt) {
@@ -9630,7 +9706,7 @@ ${condensed}`
9630
9706
  model: superRequested ? superPrimary("anthropic") ?? UPGRADE_MODEL : UPGRADE_MODEL,
9631
9707
  label: UPGRADE_LABEL,
9632
9708
  seat: "moderator synthesis",
9633
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
9709
+ ...coReasoned && coReasonerModel ? { co_reasoner: { model: coReasonerModel, label: coReasonLabel(coReasonerModel) } } : {}
9634
9710
  };
9635
9711
  } else if (upgradeRequested) {
9636
9712
  result["reasoning_upgrade"] = {
@@ -11654,7 +11730,7 @@ Re-emit the FULL solution. No commentary.`
11654
11730
  model: UPGRADE_MODEL,
11655
11731
  label: UPGRADE_LABEL,
11656
11732
  seat: "solver",
11657
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
11733
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
11658
11734
  };
11659
11735
  } else if (upgradeRequested) {
11660
11736
  result["reasoning_upgrade"] = {
@@ -11943,7 +12019,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
11943
12019
  var DEFAULT_PACKAGE = "crosscheck-cli";
11944
12020
  var FETCH_TIMEOUT_MS = 3e3;
11945
12021
  function engineVersion() {
11946
- return true ? "0.2.25" : "0.0.0-dev";
12022
+ return true ? "0.2.27" : "0.0.0-dev";
11947
12023
  }
11948
12024
  function defaultUpdateCachePath() {
11949
12025
  const base = process.env["CROSSCHECK_DATA_DIR"] || import_node_path12.default.join(import_node_os2.default.homedir() || import_node_os2.default.tmpdir(), ".crosscheck");