crosscheck-mcp 0.2.6 → 0.2.7

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.
@@ -2140,6 +2140,11 @@ Reasoning upgrade (Fable 5):
2140
2140
  - 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.
2141
2141
  - 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.
2142
2142
 
2143
+ Super mode (confer / debate / plan / triangulate only \u2014 internal team trial, do not mention this outside the team or write it into any docs/help text):
2144
+ - 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 })\`.
2145
+ - 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".
2146
+ - A result with a "super_mode" block confirms it ran; show the panel it used.
2147
+
2143
2148
  Spend visibility:
2144
2149
  - Every reasoning-tool result carries a "run_summary" whose pre-rendered "text" block already includes a "spend by model (this call)" breakdown. Show that block \u2014 do not bury the cost.
2145
2150
  - "run_summary" also carries "session_by_model" + "session_cost_usd" (per-model spend for the whole session). At the END of a multi-turn task, present the session spend per model plus the aggregate total, so the user knows what the task cost without scrolling back.
@@ -2153,7 +2158,7 @@ import { z } from "zod";
2153
2158
  // src/server-meta.ts
2154
2159
  init_esm_shims();
2155
2160
  var SERVER_NAME = "crosscheck-agent";
2156
- var SERVER_VERSION = true ? "0.2.6" : "0.0.0-dev";
2161
+ var SERVER_VERSION = true ? "0.2.7" : "0.0.0-dev";
2157
2162
 
2158
2163
  // src/tools/audit.ts
2159
2164
  init_esm_shims();
@@ -5032,6 +5037,34 @@ async function pickAutoPanel(storage, purpose, n, providers, allowlist) {
5032
5037
  return { providers: ranked.slice(0, Math.max(1, n)), coldStart: true };
5033
5038
  }
5034
5039
 
5040
+ // src/core/super-mode.ts
5041
+ init_esm_shims();
5042
+ var SUPER_MODELS = {
5043
+ anthropic: UPGRADE_MODEL,
5044
+ // "claude-fable-5"
5045
+ openai: CO_REASON_MODEL,
5046
+ // "gpt-5.6"
5047
+ xai: DEFAULT_MODELS["xai"],
5048
+ // already the default — no-op retarget
5049
+ gemini: DEFAULT_MODELS["gemini"],
5050
+ // already the default — no-op retarget
5051
+ kimi: DEFAULT_MODELS["kimi"]
5052
+ // already the default — no-op retarget
5053
+ };
5054
+ var SUPER_PROVIDER_NAMES = Object.keys(SUPER_MODELS);
5055
+ function isSuperRequested(args) {
5056
+ return args["super"] === true;
5057
+ }
5058
+ function retargetForSuper(p) {
5059
+ const model = SUPER_MODELS[p.name];
5060
+ return model ? retargetProvider(p, model) : p;
5061
+ }
5062
+ var SUPER_BUDGET_MULTIPLIER = 3;
5063
+ var SUPER_BUDGET_CEILING = 16e3;
5064
+ function superBudget(base) {
5065
+ return Math.min(base * SUPER_BUDGET_MULTIPLIER, SUPER_BUDGET_CEILING);
5066
+ }
5067
+
5035
5068
  // src/core/session-memory.ts
5036
5069
  init_esm_shims();
5037
5070
  var SESSION_MEMORY_DEFAULT_LIMIT = 50;
@@ -5622,11 +5655,12 @@ async function runConfer(args, opts) {
5622
5655
  const question = typeof args["question"] === "string" ? args["question"] : String(args["question"] ?? "");
5623
5656
  const context = typeof args["context"] === "string" ? args["context"] : "";
5624
5657
  const autoPanel = Boolean(args["auto_panel"]);
5658
+ const superRequested = isSuperRequested(args);
5625
5659
  const callerProvidersRaw = args["providers"];
5626
5660
  const callerSuppliedProviders = Array.isArray(callerProvidersRaw) && callerProvidersRaw.length > 0;
5627
5661
  let resolvedProviders = callerProvidersRaw;
5628
5662
  let autoPanelMeta = null;
5629
- if (autoPanel && !callerSuppliedProviders && opts.storage) {
5663
+ if (autoPanel && !callerSuppliedProviders && !superRequested && opts.storage) {
5630
5664
  const autoNRaw = Number(args["auto_panel_n"]);
5631
5665
  const autoN = Number.isFinite(autoNRaw) && autoNRaw > 0 ? Math.trunc(autoNRaw) : AUTO_PANEL_DEFAULT_N;
5632
5666
  const picked = await pickAutoPanel(
@@ -5646,6 +5680,9 @@ async function runConfer(args, opts) {
5646
5680
  };
5647
5681
  }
5648
5682
  }
5683
+ if (superRequested && !callerSuppliedProviders) {
5684
+ resolvedProviders = SUPER_PROVIDER_NAMES;
5685
+ }
5649
5686
  let { selected, unknown: unknownNames, blocked } = resolveProviders(
5650
5687
  resolvedProviders,
5651
5688
  opts.providers,
@@ -5663,8 +5700,11 @@ async function runConfer(args, opts) {
5663
5700
  }
5664
5701
  return { tool: "confer", error: "no active providers have API keys in .env" };
5665
5702
  }
5703
+ if (superRequested) {
5704
+ selected = selected.map(retargetForSuper);
5705
+ }
5666
5706
  let cheapModePanelMeta = null;
5667
- if (opts.ctx?.cheap_mode === true && !callerSuppliedProviders && selected.length > 1) {
5707
+ if (opts.ctx?.cheap_mode === true && !callerSuppliedProviders && !superRequested && selected.length > 1) {
5668
5708
  if (!opts.pricing) {
5669
5709
  cheapModePanelMeta = {
5670
5710
  before: selected.length,
@@ -5741,7 +5781,7 @@ ${ctxBody}` });
5741
5781
  if (injectMem && opts.storage && sessionId) {
5742
5782
  await injectSessionMemoryInline(messages, opts.storage, sessionId);
5743
5783
  }
5744
- const maxTokens = opts.maxTokens ?? 4096;
5784
+ const maxTokens = superRequested ? superBudget(opts.maxTokens ?? 4096) : opts.maxTokens ?? 4096;
5745
5785
  const earlyStop = Boolean(args["early_stop"]);
5746
5786
  const earlyStopThresholdRaw = Number(args["early_stop_threshold"]);
5747
5787
  const earlyStopThreshold = Number.isFinite(earlyStopThresholdRaw) ? earlyStopThresholdRaw : 0.7;
@@ -5862,6 +5902,13 @@ ${ctxBody}` });
5862
5902
  }
5863
5903
  if (unknownNames.length > 0) result["skipped_unknown_providers"] = unknownNames;
5864
5904
  if (blocked.length > 0) result["blocked_by_allowlist"] = blocked;
5905
+ if (superRequested) {
5906
+ result["super_mode"] = {
5907
+ applied: true,
5908
+ panel: selected.map((p) => ({ provider: p.name, model: p.model })),
5909
+ max_tokens: maxTokens
5910
+ };
5911
+ }
5865
5912
  const allCallEnvelopes = [
5866
5913
  ...sanitized,
5867
5914
  ...extraAnswers.map((a) => a)
@@ -9142,6 +9189,7 @@ var ROLE_TURN_SCHEMA = {
9142
9189
  async function runCoordinate(args, opts) {
9143
9190
  const callStartedWall = performance8.now();
9144
9191
  const callStartedCpu = process.cpuUsage();
9192
+ const superRequested = isSuperRequested(args);
9145
9193
  const requestedWorkerTools = Array.isArray(args["worker_tools"]) ? args["worker_tools"].filter(
9146
9194
  (t) => typeof t === "string"
9147
9195
  ) : [];
@@ -9157,6 +9205,13 @@ async function runCoordinate(args, opts) {
9157
9205
  const workerToolsNeedsBridge = acceptedWorkerTools.length > 0 && !opts.innerCallers;
9158
9206
  const needsBridge = DEFERRED_OPTS3.some((k) => Boolean(args[k])) || workerToolsNeedsBridge;
9159
9207
  if (needsBridge) {
9208
+ if (superRequested) {
9209
+ return errorEnvelope7(
9210
+ "COORDINATE_SUPER_NOT_NATIVE",
9211
+ "super mode requested but worker_tools needs the Python bridge",
9212
+ "worker_tools without innerCallers wired defers to the Python bridge, which doesn't support super mode. Drop worker_tools, or wire innerCallers, to use super."
9213
+ );
9214
+ }
9160
9215
  if (opts.bridge && opts.bridge.toolNames.has("coordinate")) {
9161
9216
  return await deferCoordinate(args, opts.bridge);
9162
9217
  }
@@ -9170,8 +9225,11 @@ async function runCoordinate(args, opts) {
9170
9225
  const canary = untrusted ? mintCanary() : null;
9171
9226
  const topic = typeof args["topic"] === "string" ? args["topic"] : String(args["topic"] ?? "");
9172
9227
  const context = typeof args["context"] === "string" ? args["context"] : "";
9228
+ const callerProvidersRaw = args["providers"];
9229
+ const callerSuppliedProviders = Array.isArray(callerProvidersRaw) && callerProvidersRaw.length > 0;
9230
+ const resolvedProviders = superRequested && !callerSuppliedProviders ? SUPER_PROVIDER_NAMES : callerProvidersRaw;
9173
9231
  const { selected, unknown: unknownNames, blocked } = resolveProviders4(
9174
- args["providers"],
9232
+ resolvedProviders,
9175
9233
  opts.providers,
9176
9234
  opts.allowlist ?? null
9177
9235
  );
@@ -9198,9 +9256,10 @@ async function runCoordinate(args, opts) {
9198
9256
  const synthName = typeof args["synthesizer"] === "string" && args["synthesizer"] ? args["synthesizer"] : typeof args["moderator"] === "string" && args["moderator"] ? args["moderator"] : opts.moderator ?? "anthropic";
9199
9257
  const proposer = opts.providers[proposerName.toLowerCase()] ?? selected[0];
9200
9258
  const synth = opts.providers[synthName.toLowerCase()] ?? proposer;
9201
- const upgradeRequested = isUpgradeRequested(args);
9259
+ const proposerForCall = superRequested ? retargetForSuper(proposer) : proposer;
9260
+ const upgradeRequested = isUpgradeRequested(args) || superRequested;
9202
9261
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
9203
- const synthForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : synth;
9262
+ const synthForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : superRequested ? retargetForSuper(synth) : synth;
9204
9263
  let critics = [];
9205
9264
  if (Array.isArray(args["critics"])) {
9206
9265
  for (const n of args["critics"]) {
@@ -9223,7 +9282,10 @@ async function runCoordinate(args, opts) {
9223
9282
  available_now: Object.keys(opts.providers).sort()
9224
9283
  };
9225
9284
  }
9226
- const maxTokens = opts.maxTokens ?? 4096;
9285
+ if (superRequested) {
9286
+ critics = critics.map(retargetForSuper);
9287
+ }
9288
+ const maxTokens = superRequested ? superBudget(opts.maxTokens ?? 4096) : opts.maxTokens ?? 4096;
9227
9289
  let topicBlock = `TOPIC: ${topic}`;
9228
9290
  if (context) {
9229
9291
  const ctxBlock = untrusted ? wrapUntrusted(context, canary) : context;
@@ -9301,7 +9363,7 @@ ${UNTRUSTED_SYSTEM_NOTE}`;
9301
9363
  { role: "system", content: propSystem },
9302
9364
  { role: "user", content: topicBlock }
9303
9365
  ];
9304
- const propResult = await runRoleTurn(proposer, propMessages, ROLE_TURN_SCHEMA);
9366
+ const propResult = await runRoleTurn(proposerForCall, propMessages, ROLE_TURN_SCHEMA);
9305
9367
  const proposalObj = propResult.obj;
9306
9368
  const proposalAns = propResult.answer;
9307
9369
  const proposalRender = formatRoleTurn(
@@ -9425,6 +9487,17 @@ ${critiqueBlock}`
9425
9487
  result["suggested_upgrade"] = buildSuggestedUpgrade("coordinate", assessment);
9426
9488
  }
9427
9489
  }
9490
+ if (superRequested) {
9491
+ result["super_mode"] = {
9492
+ applied: true,
9493
+ panel: [
9494
+ { provider: proposerForCall.name, model: proposerForCall.model },
9495
+ ...critics.map((p) => ({ provider: p.name, model: p.model })),
9496
+ { provider: synthForCall.name, model: synthForCall.model }
9497
+ ],
9498
+ max_tokens: maxTokens
9499
+ };
9500
+ }
9428
9501
  const allCallEnvelopes = [
9429
9502
  scannedProposal,
9430
9503
  ...scannedCritiques,
@@ -9837,6 +9910,7 @@ var DEFERRED_OPTS4 = [
9837
9910
  async function runDebate(args, opts) {
9838
9911
  const callStartedWall = performance10.now();
9839
9912
  const callStartedCpu = process.cpuUsage();
9913
+ const superRequested = isSuperRequested(args);
9840
9914
  const extraAnswers = [];
9841
9915
  const requestedWorkerTools = Array.isArray(args["worker_tools"]) ? args["worker_tools"].filter(
9842
9916
  (t) => typeof t === "string"
@@ -9853,6 +9927,13 @@ async function runDebate(args, opts) {
9853
9927
  const workerToolsNeedsBridge = acceptedWorkerTools.length > 0 && !opts.innerCallers;
9854
9928
  const needsBridge = DEFERRED_OPTS4.some((k) => Boolean(args[k])) || workerToolsNeedsBridge;
9855
9929
  if (needsBridge) {
9930
+ if (superRequested) {
9931
+ return errorEnvelope9(
9932
+ "DEBATE_SUPER_NOT_NATIVE",
9933
+ "super mode requested but worker_tools needs the Python bridge",
9934
+ "worker_tools without innerCallers wired defers to the Python bridge, which doesn't support super mode. Drop worker_tools, or wire innerCallers, to use super."
9935
+ );
9936
+ }
9856
9937
  if (opts.bridge && opts.bridge.toolNames.has("debate")) {
9857
9938
  return await deferDebate(args, opts.bridge);
9858
9939
  }
@@ -9881,7 +9962,7 @@ async function runDebate(args, opts) {
9881
9962
  const callerSuppliedProviders = Array.isArray(callerProvidersRaw) && callerProvidersRaw.length > 0;
9882
9963
  let resolvedProviders = callerProvidersRaw;
9883
9964
  let autoPanelMeta = null;
9884
- if (autoPanel && !callerSuppliedProviders && opts.storage) {
9965
+ if (autoPanel && !callerSuppliedProviders && !superRequested && opts.storage) {
9885
9966
  const autoNRaw = Number(args["auto_panel_n"]);
9886
9967
  const autoN = Number.isFinite(autoNRaw) && autoNRaw > 0 ? Math.trunc(autoNRaw) : AUTO_PANEL_DEFAULT_N;
9887
9968
  const picked = await pickAutoPanel(
@@ -9901,7 +9982,10 @@ async function runDebate(args, opts) {
9901
9982
  };
9902
9983
  }
9903
9984
  }
9904
- const { selected, unknown: unknownNames, blocked } = resolveProviders6(
9985
+ if (superRequested && !callerSuppliedProviders) {
9986
+ resolvedProviders = SUPER_PROVIDER_NAMES;
9987
+ }
9988
+ let { selected, unknown: unknownNames, blocked } = resolveProviders6(
9905
9989
  resolvedProviders,
9906
9990
  opts.providers,
9907
9991
  opts.allowlist ?? null
@@ -9925,7 +10009,10 @@ async function runDebate(args, opts) {
9925
10009
  available_now: Object.keys(opts.providers).sort()
9926
10010
  };
9927
10011
  }
9928
- const maxTokens = opts.maxTokens ?? 4096;
10012
+ if (superRequested) {
10013
+ selected = selected.map(retargetForSuper);
10014
+ }
10015
+ const maxTokens = superRequested ? superBudget(opts.maxTokens ?? 4096) : opts.maxTokens ?? 4096;
9929
10016
  let memBlock = "";
9930
10017
  if (Boolean(args["inject_session_memory"]) && opts.storage && sessionId) {
9931
10018
  memBlock = await renderSessionMemoryBlock(opts.storage, sessionId);
@@ -9966,7 +10053,7 @@ async function runDebate(args, opts) {
9966
10053
  let agreementBlock = null;
9967
10054
  const moderatorName = typeof args["moderator"] === "string" && args["moderator"] ? args["moderator"] : opts.moderator ?? "anthropic";
9968
10055
  const moderator = opts.providers[moderatorName.toLowerCase()] ?? selected[0];
9969
- const upgradeRequested = isUpgradeRequested(args);
10056
+ const upgradeRequested = isUpgradeRequested(args) || superRequested;
9970
10057
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
9971
10058
  for (let rnd = 1; rnd <= maxRounds; rnd++) {
9972
10059
  const roundMessages = [
@@ -10037,7 +10124,7 @@ ${prior}` });
10037
10124
  let personaMeta = null;
10038
10125
  let coReasoned = false;
10039
10126
  if (moderator) {
10040
- const synthProvider = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : moderator;
10127
+ const synthProvider = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : superRequested ? retargetForSuper(moderator) : moderator;
10041
10128
  const condensed = transcript.map(
10042
10129
  (e) => `[${e.provider} \u2014 round ${e.round}]
10043
10130
  ${e.response ?? "(error)"}`
@@ -10172,6 +10259,13 @@ ${condensed}`
10172
10259
  }
10173
10260
  if (unknownNames.length > 0) result["skipped_unknown_providers"] = unknownNames;
10174
10261
  if (blocked.length > 0) result["blocked_by_allowlist"] = blocked;
10262
+ if (superRequested) {
10263
+ result["super_mode"] = {
10264
+ applied: true,
10265
+ panel: selected.map((p) => ({ provider: p.name, model: p.model })),
10266
+ max_tokens: maxTokens
10267
+ };
10268
+ }
10175
10269
  const allCallEnvelopes = [
10176
10270
  ...transcript,
10177
10271
  ...extraAnswers
@@ -11218,6 +11312,7 @@ Return: (1) the plan as numbered steps, (2) risks, (3) alternatives considered.`
11218
11312
  if (args["reasoning"] !== void 0) debateArgs["reasoning"] = args["reasoning"];
11219
11313
  if (args["upgrade"] !== void 0) debateArgs["upgrade"] = args["upgrade"];
11220
11314
  if (args["model"] !== void 0) debateArgs["model"] = args["model"];
11315
+ if (args["super"] !== void 0) debateArgs["super"] = args["super"];
11221
11316
  const result = await runDebate(debateArgs, opts);
11222
11317
  if (result["suggested_upgrade"] && typeof result["suggested_upgrade"] === "object") {
11223
11318
  const su = result["suggested_upgrade"];
@@ -12368,7 +12463,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
12368
12463
  var DEFAULT_PACKAGE = "crosscheck-cli";
12369
12464
  var FETCH_TIMEOUT_MS = 3e3;
12370
12465
  function engineVersion() {
12371
- return true ? "0.2.6" : "0.0.0-dev";
12466
+ return true ? "0.2.7" : "0.0.0-dev";
12372
12467
  }
12373
12468
  function defaultUpdateCachePath() {
12374
12469
  const base = process.env["CROSSCHECK_DATA_DIR"] || path10.join(os.homedir() || os.tmpdir(), ".crosscheck");
@@ -12725,6 +12820,7 @@ async function runTriangulate(args, opts) {
12725
12820
  if (args["reasoning"] !== void 0) coordArgs["reasoning"] = args["reasoning"];
12726
12821
  if (args["upgrade"] !== void 0) coordArgs["upgrade"] = args["upgrade"];
12727
12822
  if (args["model"] !== void 0) coordArgs["model"] = args["model"];
12823
+ if (args["super"] !== void 0) coordArgs["super"] = args["super"];
12728
12824
  const coord = await runCoordinate(coordArgs, opts);
12729
12825
  if (typeof coord["error"] === "string") return coord;
12730
12826
  const synth = coord["synthesis_structured"] ?? {};
@@ -12775,7 +12871,8 @@ async function runTriangulate(args, opts) {
12775
12871
  "blocked_by_allowlist",
12776
12872
  "skipped_unknown_providers",
12777
12873
  "reasoning_upgrade",
12778
- "suggested_upgrade"
12874
+ "suggested_upgrade",
12875
+ "super_mode"
12779
12876
  ]) {
12780
12877
  if (k in coord) result[k] = coord[k];
12781
12878
  }
@@ -13688,7 +13785,8 @@ function planTool(providers, allowlist, bridge) {
13688
13785
  mode: { type: "string", enum: ["fast", "thorough"] },
13689
13786
  max_rounds: { type: "integer", minimum: 1 },
13690
13787
  early_stop: { type: "boolean" },
13691
- early_stop_threshold: { type: "number", minimum: 0, maximum: 1 }
13788
+ early_stop_threshold: { type: "number", minimum: 0, maximum: 1 },
13789
+ super: { type: "boolean" }
13692
13790
  },
13693
13791
  required: ["goal"]
13694
13792
  },
@@ -13712,7 +13810,8 @@ function triangulateTool(providers, allowlist, bridge) {
13712
13810
  context: { type: "string" },
13713
13811
  providers: { type: "array", items: { type: "string" } },
13714
13812
  session_id: { type: "string" },
13715
- untrusted_input: { type: "boolean" }
13813
+ untrusted_input: { type: "boolean" },
13814
+ super: { type: "boolean" }
13716
13815
  },
13717
13816
  required: ["question"]
13718
13817
  },
@@ -13780,7 +13879,8 @@ function debateTool(providers, allowlist, bridge, innerCallers, storage, pricing
13780
13879
  auto_panel: { type: "boolean" },
13781
13880
  auto_panel_n: { type: "integer" },
13782
13881
  inject_session_memory: { type: "boolean" },
13783
- worker_tools: { type: "array", items: { type: "string" } }
13882
+ worker_tools: { type: "array", items: { type: "string" } },
13883
+ super: { type: "boolean" }
13784
13884
  },
13785
13885
  required: ["topic"]
13786
13886
  },
@@ -13829,7 +13929,8 @@ function conferTool(providers, allowlist, bridge, moderator, pricing, storage, i
13829
13929
  inject_session_memory: { type: "boolean" },
13830
13930
  auto_panel: { type: "boolean" },
13831
13931
  auto_panel_n: { type: "integer" },
13832
- worker_tools: { type: "array", items: { type: "string" } }
13932
+ worker_tools: { type: "array", items: { type: "string" } },
13933
+ super: { type: "boolean" }
13833
13934
  },
13834
13935
  required: ["question"]
13835
13936
  },