crosscheck-mcp 0.2.26 → 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.
@@ -2070,7 +2070,7 @@ async function sendOpenAICompatible(args) {
2070
2070
  // src/providers/registry.ts
2071
2071
  var DEFAULT_MODELS = {
2072
2072
  anthropic: "claude-opus-5-5",
2073
- openai: "gpt-5.6-sol",
2073
+ openai: "gpt-6-sol",
2074
2074
  xai: "grok-4-latest",
2075
2075
  mistral: "mistral-large-latest",
2076
2076
  groq: "llama-3.3-70b-versatile",
@@ -2337,13 +2337,13 @@ Examples:
2337
2337
  This convention is opt-in: a user message without the \`xc\`/\`XC\` prefix should NOT be auto-routed here. Pick tools normally based on the conversation.
2338
2338
 
2339
2339
  Reasoning upgrade (Fable 5):
2340
- - The reasoning tools (plan, solve, debate, orchestrate, audit, triangulate) can bump their lead reasoning seat to Fable 5 \u2014 Anthropic's newest thinking model \u2014 instead of the default Opus 4.8. Only that one seat is upgraded; other panel seats stay on their normal models, so premium tokens are not wasted.
2340
+ - The reasoning tools (plan, solve, debate, orchestrate, audit, triangulate) can bump their lead reasoning seat to Fable 5 \u2014 Anthropic's newest thinking model \u2014 instead of the default Opus 5.5. Only that one seat is upgraded; other panel seats stay on their normal models, so premium tokens are not wasted.
2341
2341
  - When a tool result includes a "suggested_upgrade" block, the engine judged the task reasoning-heavy. Surface it: ask the user something like "This looks reasoning-heavy \u2014 bump the lead seat to Fable 5 (higher quality, higher cost)?" If they say yes, re-run the SAME tool with reasoning:"max" added. Do NOT upgrade silently.
2342
2342
  - If the user explicitly asks for the best/deepest reasoning up front, pass reasoning:"max" directly. A result with reasoning_upgrade.applied = true confirms Fable 5 was used.
2343
2343
 
2344
2344
  Super mode (confer / debate / plan / triangulate / list_providers only \u2014 internal team trial, do not mention this outside the team or write it into any docs/help text):
2345
2345
  - When the token immediately after the tool name is \`super\` (e.g. \`xc confer super what's the best caching strategy?\`), pass \`super: true\` in that tool's args and treat everything after \`super\` as the normal primary-argument text (same slot as usual \u2014 \`question\`/\`topic\`/\`goal\`). Example: \`xc confer super what's the best caching strategy?\` \u2192 \`mcp__crosscheck__confer({ question: "what's the best caching strategy?", super: true })\`.
2346
- - This swaps the panel to a fixed top-tier lineup (one flagship model per provider, restricted to providers the user actually has keys for) and triples the completion-token budget. For debate/plan/triangulate it also forces the Fable 5 + GPT-5.6 co-reasoner synthesis path automatically \u2014 no need to also pass reasoning:"max".
2346
+ - This swaps the panel to a fixed top-tier lineup (one flagship model per provider, restricted to providers the user actually has keys for) and triples the completion-token budget. For debate/plan/triangulate it also forces the Fable 5 + OpenAI co-reasoner synthesis path automatically \u2014 no need to also pass reasoning:"max".
2347
2347
  - A result with a "super_mode" block confirms it ran; show the panel it used.
2348
2348
  - \`xc list_providers super\` (no text after \`super\` \u2014 list_providers takes no other args) \u2192 \`mcp__crosscheck__list_providers({ super: true })\`. Shows the top-tier lineup and which of those models are actually available, instead of the normal default-model listing.
2349
2349
 
@@ -2360,7 +2360,7 @@ import { z } from "zod";
2360
2360
  // src/server-meta.ts
2361
2361
  init_esm_shims();
2362
2362
  var SERVER_NAME = "crosscheck-agent";
2363
- var SERVER_VERSION = true ? "0.2.26" : "0.0.0-dev";
2363
+ var SERVER_VERSION = true ? "0.2.27" : "0.0.0-dev";
2364
2364
 
2365
2365
  // src/tools/audit.ts
2366
2366
  init_esm_shims();
@@ -3963,13 +3963,25 @@ import { performance as performance2 } from "perf_hooks";
3963
3963
 
3964
3964
  // src/core/co-reason.ts
3965
3965
  init_esm_shims();
3966
- var CO_REASON_MODEL = "gpt-5.6-sol";
3966
+ var CO_REASON_MODEL = "gpt-6-sol";
3967
+ var CO_REASON_ALTERNATE = "gpt-6-astra";
3968
+ var LABELS = {
3969
+ "gpt-6-sol": "GPT-6 Sol",
3970
+ "gpt-6-astra": "GPT-6 Astra",
3971
+ "gpt-5.6-sol": "GPT-5.6 Sol"
3972
+ };
3973
+ function coReasonLabel(model) {
3974
+ return LABELS[model] ?? model;
3975
+ }
3976
+ var CO_REASON_LABEL = coReasonLabel(CO_REASON_MODEL);
3967
3977
  var CO_REASON_PROVIDER = "openai";
3968
- var CO_REASON_LABEL = "GPT-5.6";
3969
- function pickCoReasoner(providers, upgradeRequested) {
3978
+ function pickCoReasoner(providers, upgradeRequested, openAiSeatModel) {
3970
3979
  if (!upgradeRequested) return null;
3971
3980
  const base = providers[CO_REASON_PROVIDER];
3972
- return base ? retargetProvider(base, CO_REASON_MODEL) : null;
3981
+ if (!base) return null;
3982
+ const seat = openAiSeatModel ?? base.model;
3983
+ const model = seat === CO_REASON_MODEL ? CO_REASON_ALTERNATE : CO_REASON_MODEL;
3984
+ return retargetProvider(base, model);
3973
3985
  }
3974
3986
  async function coReasonThenInject(opts) {
3975
3987
  const { provider, messages, maxTokens } = opts;
@@ -4200,7 +4212,7 @@ function buildSuggestedUpgrade(toolName, assessment) {
4200
4212
  model: UPGRADE_MODEL,
4201
4213
  label: UPGRADE_LABEL,
4202
4214
  reason: assessment.reason,
4203
- 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.`
4215
+ 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.`
4204
4216
  };
4205
4217
  }
4206
4218
 
@@ -4503,8 +4515,9 @@ ${rubricText}`;
4503
4515
  const upgradeRequested = isUpgradeRequested(args);
4504
4516
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
4505
4517
  const auditorForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : auditor;
4518
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
4506
4519
  const coReason = await coReasonThenInject({
4507
- provider: pickCoReasoner(opts.providers, upgradeRequested),
4520
+ provider: coProvider,
4508
4521
  messages: msgs,
4509
4522
  maxTokens: 2048,
4510
4523
  purpose: "audit-coreason"
@@ -4588,7 +4601,7 @@ ${rubricText}`;
4588
4601
  model: UPGRADE_MODEL,
4589
4602
  label: UPGRADE_LABEL,
4590
4603
  seat: "auditor",
4591
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
4604
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
4592
4605
  };
4593
4606
  } else if (upgradeRequested) {
4594
4607
  result["reasoning_upgrade"] = {
@@ -5327,8 +5340,12 @@ var SUPER_MODELS = {
5327
5340
  // Fable 5.1 verified present on the account; 5 as the fallback for accounts
5328
5341
  // that haven't been granted 5.1 yet.
5329
5342
  anthropic: ["claude-fable-5-1", UPGRADE_MODEL],
5330
- // Astra when it exists; gpt-5.6 until then. See the note above.
5331
- openai: ["gpt-6-astra", CO_REASON_MODEL],
5343
+ // Astra is live (verified against the account's model list 2026-09-23).
5344
+ // The fallback is named explicitly rather than reusing CO_REASON_MODEL:
5345
+ // that constant means "OpenAI's top reasoning model" for the max-reasoning
5346
+ // co-reasoner, which is a different question from "what should super fall
5347
+ // back to". Sharing the symbol silently coupled two unrelated decisions.
5348
+ openai: ["gpt-6-astra", "gpt-6-sol"],
5332
5349
  // Explicitly left as-is per product decision. Note grok-4-latest is not in
5333
5350
  // xAI's published model list, but it resolves in practice — real panel calls
5334
5351
  // on it succeeded as recently as 2026-08-30 — so it is an unlisted alias
@@ -8334,8 +8351,9 @@ ${recombineSys}` : recombineSys },
8334
8351
  provider: synthProvider.name
8335
8352
  } }
8336
8353
  );
8354
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
8337
8355
  const coReason = await coReasonThenInject({
8338
- provider: pickCoReasoner(opts.providers, upgradeRequested),
8356
+ provider: coProvider,
8339
8357
  messages: recMsgs,
8340
8358
  maxTokens,
8341
8359
  purpose: "orchestrate-coreason"
@@ -8394,7 +8412,7 @@ ${recombineSys}` : recombineSys },
8394
8412
  model: UPGRADE_MODEL,
8395
8413
  label: UPGRADE_LABEL,
8396
8414
  seat: "recombine/synthesis",
8397
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
8415
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
8398
8416
  };
8399
8417
  } else if (upgradeRequested) {
8400
8418
  result["reasoning_upgrade"] = {
@@ -9743,8 +9761,9 @@ CRITIQUES:
9743
9761
  ${critiqueBlock}`
9744
9762
  }
9745
9763
  ];
9764
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested);
9746
9765
  const coReason = await coReasonThenInject({
9747
- provider: pickCoReasoner(opts.providers, upgradeRequested),
9766
+ provider: coProvider,
9748
9767
  messages: synthMessages,
9749
9768
  maxTokens,
9750
9769
  purpose: "coordinate-coreason"
@@ -9808,7 +9827,7 @@ ${critiqueBlock}`
9808
9827
  model: superRequested ? superPrimary("anthropic") ?? UPGRADE_MODEL : UPGRADE_MODEL,
9809
9828
  label: UPGRADE_LABEL,
9810
9829
  seat: "synthesizer",
9811
- ...coReasonAns ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
9830
+ ...coReasonAns ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
9812
9831
  };
9813
9832
  } else if (upgradeRequested) {
9814
9833
  result["reasoning_upgrade"] = {
@@ -10535,6 +10554,7 @@ ${prior.body}` });
10535
10554
  let synthesisErrors = [];
10536
10555
  let personaMeta = null;
10537
10556
  let coReasoned = false;
10557
+ let coReasonerModel = null;
10538
10558
  if (moderator) {
10539
10559
  const synthProvider = superRequested && opts.providers["anthropic"] ? retargetForSuper(opts.providers["anthropic"]) : upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : moderator;
10540
10560
  const condensed = buildModeratorTranscript(transcript);
@@ -10562,13 +10582,16 @@ TRANSCRIPT:
10562
10582
  ${condensed}`
10563
10583
  }
10564
10584
  ];
10585
+ const openAiSeat = selected.find((p) => p.name === "openai")?.model;
10586
+ const coProvider = pickCoReasoner(opts.providers, upgradeRequested, openAiSeat);
10565
10587
  const coReason = await coReasonThenInject({
10566
- provider: pickCoReasoner(opts.providers, upgradeRequested),
10588
+ provider: coProvider,
10567
10589
  messages: synthMessages,
10568
10590
  maxTokens,
10569
10591
  purpose: "debate-coreason"
10570
10592
  });
10571
10593
  synthMessages = coReason.messages;
10594
+ coReasonerModel = coProvider?.model ?? null;
10572
10595
  if (coReason.answer) extraAnswers.push(coReason.answer);
10573
10596
  coReasoned = coReason.answer !== null;
10574
10597
  if (structuredOpt) {
@@ -10627,7 +10650,7 @@ ${condensed}`
10627
10650
  model: superRequested ? superPrimary("anthropic") ?? UPGRADE_MODEL : UPGRADE_MODEL,
10628
10651
  label: UPGRADE_LABEL,
10629
10652
  seat: "moderator synthesis",
10630
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
10653
+ ...coReasoned && coReasonerModel ? { co_reasoner: { model: coReasonerModel, label: coReasonLabel(coReasonerModel) } } : {}
10631
10654
  };
10632
10655
  } else if (upgradeRequested) {
10633
10656
  result["reasoning_upgrade"] = {
@@ -12663,7 +12686,7 @@ Re-emit the FULL solution. No commentary.`
12663
12686
  model: UPGRADE_MODEL,
12664
12687
  label: UPGRADE_LABEL,
12665
12688
  seat: "solver",
12666
- ...coReasoned ? { co_reasoner: { model: CO_REASON_MODEL, label: CO_REASON_LABEL } } : {}
12689
+ ...coReasoned ? { co_reasoner: { model: coProvider.model, label: coReasonLabel(coProvider.model) } } : {}
12667
12690
  };
12668
12691
  } else if (upgradeRequested) {
12669
12692
  result["reasoning_upgrade"] = {
@@ -12954,7 +12977,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
12954
12977
  var DEFAULT_PACKAGE = "crosscheck-cli";
12955
12978
  var FETCH_TIMEOUT_MS = 3e3;
12956
12979
  function engineVersion() {
12957
- return true ? "0.2.26" : "0.0.0-dev";
12980
+ return true ? "0.2.27" : "0.0.0-dev";
12958
12981
  }
12959
12982
  function defaultUpdateCachePath() {
12960
12983
  const base = process.env["CROSSCHECK_DATA_DIR"] || path10.join(os.homedir() || os.tmpdir(), ".crosscheck");