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.
@@ -30,6 +30,11 @@ var pricing_default = {
30
30
  completion_per_1k: 0.075,
31
31
  cached_per_1k: 15e-4
32
32
  },
33
+ "claude-opus-5-5": {
34
+ prompt_per_1k: 4e-3,
35
+ completion_per_1k: 0.02,
36
+ cached_per_1k: 2e-4
37
+ },
33
38
  "claude-opus-5": {
34
39
  prompt_per_1k: 5e-3,
35
40
  completion_per_1k: 0.025,
@@ -72,10 +77,40 @@ var pricing_default = {
72
77
  }
73
78
  },
74
79
  openai: {
80
+ "gpt-6-astra": {
81
+ prompt_per_1k: 0.01,
82
+ completion_per_1k: 0.05,
83
+ cached_per_1k: 1e-3
84
+ },
85
+ "gpt-6-sol": {
86
+ prompt_per_1k: 2e-3,
87
+ completion_per_1k: 0.01,
88
+ cached_per_1k: 2e-4
89
+ },
90
+ "gpt-6-luna": {
91
+ prompt_per_1k: 1e-4,
92
+ completion_per_1k: 5e-4,
93
+ cached_per_1k: 1e-5
94
+ },
95
+ "gpt-5.6-sol": {
96
+ prompt_per_1k: 4e-3,
97
+ completion_per_1k: 0.02,
98
+ cached_per_1k: 4e-4
99
+ },
100
+ "gpt-5.6-terra": {
101
+ prompt_per_1k: 2e-3,
102
+ completion_per_1k: 0.012,
103
+ cached_per_1k: 2e-4
104
+ },
105
+ "gpt-5.6-luna": {
106
+ prompt_per_1k: 2e-4,
107
+ completion_per_1k: 12e-4,
108
+ cached_per_1k: 2e-5
109
+ },
75
110
  "gpt-5.6": {
76
- prompt_per_1k: 5e-3,
77
- completion_per_1k: 0.03,
78
- cached_per_1k: 5e-4
111
+ prompt_per_1k: 4e-3,
112
+ completion_per_1k: 0.02,
113
+ cached_per_1k: 4e-4
79
114
  },
80
115
  "gpt-5.5": {
81
116
  prompt_per_1k: 5e-3,
@@ -88,9 +123,14 @@ var pricing_default = {
88
123
  cached_per_1k: 125e-6
89
124
  },
90
125
  "gpt-5-mini": {
91
- prompt_per_1k: 5e-4,
92
- completion_per_1k: 15e-4,
93
- cached_per_1k: 25e-5
126
+ prompt_per_1k: 25e-5,
127
+ completion_per_1k: 2e-3,
128
+ cached_per_1k: 25e-6
129
+ },
130
+ "gpt-5-nano": {
131
+ prompt_per_1k: 5e-5,
132
+ completion_per_1k: 4e-4,
133
+ cached_per_1k: 5e-6
94
134
  },
95
135
  "gpt-4o": {
96
136
  prompt_per_1k: 25e-4,
@@ -113,19 +153,14 @@ var pricing_default = {
113
153
  cached_per_1k: 15e-4
114
154
  },
115
155
  o3: {
116
- prompt_per_1k: 0.01,
117
- completion_per_1k: 0.04,
118
- cached_per_1k: 5e-3
156
+ prompt_per_1k: 2e-3,
157
+ completion_per_1k: 8e-3,
158
+ cached_per_1k: 5e-4
119
159
  },
120
160
  "o3-mini": {
121
161
  prompt_per_1k: 11e-4,
122
162
  completion_per_1k: 44e-4,
123
163
  cached_per_1k: 55e-5
124
- },
125
- "gpt-6-astra": {
126
- prompt_per_1k: 0.01,
127
- completion_per_1k: 0.05,
128
- cached_per_1k: 1e-3
129
164
  }
130
165
  },
131
166
  xai: {
@@ -359,7 +394,12 @@ import { readFileSync } from "fs";
359
394
  function modelPricing(pricing, provider, model) {
360
395
  const block = pricing[provider];
361
396
  if (!block || typeof block !== "object" || Array.isArray(block)) return null;
362
- const entry = block[model];
397
+ const table = block;
398
+ let entry = table[model];
399
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
400
+ const best = Object.keys(table).filter((k) => model.startsWith(k)).sort((a, b) => b.length - a.length)[0];
401
+ entry = best !== void 0 ? table[best] : void 0;
402
+ }
363
403
  if (!entry || typeof entry !== "object" || Array.isArray(entry)) return null;
364
404
  const e = entry;
365
405
  return {
@@ -716,6 +756,14 @@ async function acquireRateLimit(provider, deps) {
716
756
  // src/providers/anthropic.ts
717
757
  var ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
718
758
  var ANTHROPIC_VERSION_HEADER = "2023-06-01";
759
+ var ADAPTIVE_THINKING_PREFIXES = [
760
+ "claude-fable-5",
761
+ "claude-opus-5-5"
762
+ ];
763
+ function rejectsDisabledThinking(model) {
764
+ const m = model.toLowerCase();
765
+ return ADAPTIVE_THINKING_PREFIXES.some((p) => m.startsWith(p));
766
+ }
719
767
  var ANTHROPIC_STRUCTURED_TOOL_NAME = "structured_output";
720
768
  function applyPromptCaching(body, env = process.env) {
721
769
  const flag = (env["CROSSCHECK_ANTHROPIC_PROMPT_CACHE"] ?? "").trim();
@@ -760,7 +808,7 @@ function buildAnthropicRequest(opts) {
760
808
  }
761
809
  applyPromptCaching(body);
762
810
  if (isReasoningModel("anthropic", opts.model)) {
763
- if (opts.model.toLowerCase().startsWith("claude-fable-5")) {
811
+ if (rejectsDisabledThinking(opts.model)) {
764
812
  body.thinking = { type: "adaptive" };
765
813
  body.output_config = { effort: "low" };
766
814
  } else {
@@ -1280,8 +1328,8 @@ async function sendOpenAICompatible(args) {
1280
1328
 
1281
1329
  // src/providers/registry.ts
1282
1330
  var DEFAULT_MODELS = {
1283
- anthropic: "claude-opus-5",
1284
- openai: "gpt-5.6-sol",
1331
+ anthropic: "claude-opus-5-5",
1332
+ openai: "gpt-6-sol",
1285
1333
  xai: "grok-4-latest",
1286
1334
  mistral: "mistral-large-latest",
1287
1335
  groq: "llama-3.3-70b-versatile",
@@ -1297,7 +1345,12 @@ var DEFAULT_FALLBACKS = {
1297
1345
  // about.
1298
1346
  openai: ["gpt-5"],
1299
1347
  // 3.8 Flash is recent enough that some projects won't have it yet.
1300
- gemini: ["gemini-3.1-pro-preview"]
1348
+ gemini: ["gemini-3.1-pro-preview"],
1349
+ // Opus 5.5 is new enough that an account could still be waiting on it.
1350
+ // Opus 5 is the same family one step back — and this chain is consulted
1351
+ // ONLY for a model-access failure, never for a bad key or a rate limit,
1352
+ // so it can't quietly downgrade anyone who simply hit a 429.
1353
+ anthropic: ["claude-opus-5"]
1301
1354
  };
1302
1355
  var MODEL_ENV_VARS = {
1303
1356
  anthropic: "ANTHROPIC_MODEL",
@@ -1422,7 +1475,7 @@ import { z } from "zod";
1422
1475
 
1423
1476
  // src/server-meta.ts
1424
1477
  var SERVER_NAME = "crosscheck-agent";
1425
- var SERVER_VERSION = true ? "0.2.25" : "0.0.0-dev";
1478
+ var SERVER_VERSION = true ? "0.2.27" : "0.0.0-dev";
1426
1479
 
1427
1480
  // src/tools/audit.ts
1428
1481
  import { readdirSync, readFileSync as readFileSync3, statSync } from "fs";
@@ -2996,13 +3049,25 @@ function numberOrNull(v) {
2996
3049
  import { performance as performance2 } from "perf_hooks";
2997
3050
 
2998
3051
  // src/core/co-reason.ts
2999
- var CO_REASON_MODEL = "gpt-5.6-sol";
3052
+ var CO_REASON_MODEL = "gpt-6-sol";
3053
+ var CO_REASON_ALTERNATE = "gpt-6-astra";
3054
+ var LABELS = {
3055
+ "gpt-6-sol": "GPT-6 Sol",
3056
+ "gpt-6-astra": "GPT-6 Astra",
3057
+ "gpt-5.6-sol": "GPT-5.6 Sol"
3058
+ };
3059
+ function coReasonLabel(model) {
3060
+ return LABELS[model] ?? model;
3061
+ }
3062
+ var CO_REASON_LABEL = coReasonLabel(CO_REASON_MODEL);
3000
3063
  var CO_REASON_PROVIDER = "openai";
3001
- var CO_REASON_LABEL = "GPT-5.6";
3002
- function pickCoReasoner(providers, upgradeRequested) {
3064
+ function pickCoReasoner(providers, upgradeRequested, openAiSeatModel) {
3003
3065
  if (!upgradeRequested) return null;
3004
3066
  const base = providers[CO_REASON_PROVIDER];
3005
- return base ? retargetProvider(base, CO_REASON_MODEL) : null;
3067
+ if (!base) return null;
3068
+ const seat = openAiSeatModel ?? base.model;
3069
+ const model = seat === CO_REASON_MODEL ? CO_REASON_ALTERNATE : CO_REASON_MODEL;
3070
+ return retargetProvider(base, model);
3006
3071
  }
3007
3072
  async function coReasonThenInject(opts) {
3008
3073
  const { provider, messages, maxTokens } = opts;
@@ -3228,7 +3293,7 @@ function buildSuggestedUpgrade(toolName, assessment) {
3228
3293
  model: UPGRADE_MODEL,
3229
3294
  label: UPGRADE_LABEL,
3230
3295
  reason: assessment.reason,
3231
- 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.`
3296
+ 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.`
3232
3297
  };
3233
3298
  }
3234
3299
 
@@ -3531,8 +3596,9 @@ ${rubricText}`;
3531
3596
  const upgradeRequested = isUpgradeRequested(args);
3532
3597
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
3533
3598
  const auditorForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : auditor;
3599
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
3534
3600
  const coReason = await coReasonThenInject({
3535
- provider: pickCoReasoner(opts.providers, upgradeRequested),
3601
+ provider: coProvider,
3536
3602
  messages: msgs,
3537
3603
  maxTokens: 2048,
3538
3604
  purpose: "audit-coreason"
@@ -3616,7 +3682,7 @@ ${rubricText}`;
3616
3682
  model: UPGRADE_MODEL,
3617
3683
  label: UPGRADE_LABEL,
3618
3684
  seat: "auditor",
3619
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
3685
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
3620
3686
  };
3621
3687
  } else if (upgradeRequested) {
3622
3688
  result["reasoning_upgrade"] = {
@@ -4347,8 +4413,12 @@ var SUPER_MODELS = {
4347
4413
  // Fable 5.1 verified present on the account; 5 as the fallback for accounts
4348
4414
  // that haven't been granted 5.1 yet.
4349
4415
  anthropic: ["claude-fable-5-1", UPGRADE_MODEL],
4350
- // Astra when it exists; gpt-5.6 until then. See the note above.
4351
- openai: ["gpt-6-astra", CO_REASON_MODEL],
4416
+ // Astra is live (verified against the account's model list 2026-09-23).
4417
+ // The fallback is named explicitly rather than reusing CO_REASON_MODEL:
4418
+ // that constant means "OpenAI's top reasoning model" for the max-reasoning
4419
+ // co-reasoner, which is a different question from "what should super fall
4420
+ // back to". Sharing the symbol silently coupled two unrelated decisions.
4421
+ openai: ["gpt-6-astra", "gpt-6-sol"],
4352
4422
  // Explicitly left as-is per product decision. Note grok-4-latest is not in
4353
4423
  // xAI's published model list, but it resolves in practice — real panel calls
4354
4424
  // on it succeeded as recently as 2026-08-30 — so it is an unlisted alias
@@ -7329,8 +7399,9 @@ ${recombineSys}` : recombineSys },
7329
7399
  provider: synthProvider.name
7330
7400
  } }
7331
7401
  );
7402
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
7332
7403
  const coReason = await coReasonThenInject({
7333
- provider: pickCoReasoner(opts.providers, upgradeRequested),
7404
+ provider: coProvider,
7334
7405
  messages: recMsgs,
7335
7406
  maxTokens,
7336
7407
  purpose: "orchestrate-coreason"
@@ -7389,7 +7460,7 @@ ${recombineSys}` : recombineSys },
7389
7460
  model: UPGRADE_MODEL,
7390
7461
  label: UPGRADE_LABEL,
7391
7462
  seat: "recombine/synthesis",
7392
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
7463
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
7393
7464
  };
7394
7465
  } else if (upgradeRequested) {
7395
7466
  result["reasoning_upgrade"] = {
@@ -8735,8 +8806,9 @@ CRITIQUES:
8735
8806
  ${critiqueBlock}`
8736
8807
  }
8737
8808
  ];
8809
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
8738
8810
  const coReason = await coReasonThenInject({
8739
- provider: pickCoReasoner(opts.providers, upgradeRequested),
8811
+ provider: coProvider,
8740
8812
  messages: synthMessages,
8741
8813
  maxTokens,
8742
8814
  purpose: "coordinate-coreason"
@@ -8800,7 +8872,7 @@ ${critiqueBlock}`
8800
8872
  model: superRequested ? superPrimary("anthropic") ?? UPGRADE_MODEL : UPGRADE_MODEL,
8801
8873
  label: UPGRADE_LABEL,
8802
8874
  seat: "synthesizer",
8803
- ...coReasonAns ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
8875
+ ...coReasonAns ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
8804
8876
  };
8805
8877
  } else if (upgradeRequested) {
8806
8878
  result["reasoning_upgrade"] = {
@@ -9522,6 +9594,7 @@ ${prior.body}` });
9522
9594
  let synthesisErrors = [];
9523
9595
  let personaMeta = null;
9524
9596
  let coReasoned = false;
9597
+ let coReasonerModel = null;
9525
9598
  if (moderator) {
9526
9599
  const synthProvider = superRequested && opts.providers["anthropic"] ? retargetForSuper(opts.providers["anthropic"]) : upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : moderator;
9527
9600
  const condensed = buildModeratorTranscript(transcript);
@@ -9549,13 +9622,16 @@ TRANSCRIPT:
9549
9622
  ${condensed}`
9550
9623
  }
9551
9624
  ];
9625
+ const openAiSeat = selected.find((p) => p.name === "openai")?.model;
9626
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested, openAiSeat);
9552
9627
  const coReason = await coReasonThenInject({
9553
- provider: pickCoReasoner(opts.providers, upgradeRequested),
9628
+ provider: coProvider,
9554
9629
  messages: synthMessages,
9555
9630
  maxTokens,
9556
9631
  purpose: "debate-coreason"
9557
9632
  });
9558
9633
  synthMessages = coReason.messages;
9634
+ coReasonerModel = coProvider?.model ?? null;
9559
9635
  if (coReason.answer) extraAnswers.push(coReason.answer);
9560
9636
  coReasoned = coReason.answer !== null;
9561
9637
  if (structuredOpt) {
@@ -9614,7 +9690,7 @@ ${condensed}`
9614
9690
  model: superRequested ? superPrimary("anthropic") ?? UPGRADE_MODEL : UPGRADE_MODEL,
9615
9691
  label: UPGRADE_LABEL,
9616
9692
  seat: "moderator synthesis",
9617
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
9693
+ ...coReasoned && coReasonerModel ? { co_reasoner: { model: coReasonerModel, label: coReasonLabel(coReasonerModel) } } : {}
9618
9694
  };
9619
9695
  } else if (upgradeRequested) {
9620
9696
  result["reasoning_upgrade"] = {
@@ -11638,7 +11714,7 @@ Re-emit the FULL solution. No commentary.`
11638
11714
  model: UPGRADE_MODEL,
11639
11715
  label: UPGRADE_LABEL,
11640
11716
  seat: "solver",
11641
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
11717
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
11642
11718
  };
11643
11719
  } else if (upgradeRequested) {
11644
11720
  result["reasoning_upgrade"] = {
@@ -11927,7 +12003,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
11927
12003
  var DEFAULT_PACKAGE = "crosscheck-cli";
11928
12004
  var FETCH_TIMEOUT_MS = 3e3;
11929
12005
  function engineVersion() {
11930
- return true ? "0.2.25" : "0.0.0-dev";
12006
+ return true ? "0.2.27" : "0.0.0-dev";
11931
12007
  }
11932
12008
  function defaultUpdateCachePath() {
11933
12009
  const base = process.env["CROSSCHECK_DATA_DIR"] || path9.join(os.homedir() || os.tmpdir(), ".crosscheck");