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.
@@ -2161,6 +2161,11 @@ Reasoning upgrade (Fable 5):
2161
2161
  - 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.
2162
2162
  - 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.
2163
2163
 
2164
+ 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):
2165
+ - 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 })\`.
2166
+ - 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".
2167
+ - A result with a "super_mode" block confirms it ran; show the panel it used.
2168
+
2164
2169
  Spend visibility:
2165
2170
  - 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.
2166
2171
  - "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.
@@ -2174,7 +2179,7 @@ var import_zod = require("zod");
2174
2179
  // src/server-meta.ts
2175
2180
  init_cjs_shims();
2176
2181
  var SERVER_NAME = "crosscheck-agent";
2177
- var SERVER_VERSION = true ? "0.2.6" : "0.0.0-dev";
2182
+ var SERVER_VERSION = true ? "0.2.7" : "0.0.0-dev";
2178
2183
 
2179
2184
  // src/tools/audit.ts
2180
2185
  init_cjs_shims();
@@ -5053,6 +5058,34 @@ async function pickAutoPanel(storage, purpose, n, providers, allowlist) {
5053
5058
  return { providers: ranked.slice(0, Math.max(1, n)), coldStart: true };
5054
5059
  }
5055
5060
 
5061
+ // src/core/super-mode.ts
5062
+ init_cjs_shims();
5063
+ var SUPER_MODELS = {
5064
+ anthropic: UPGRADE_MODEL,
5065
+ // "claude-fable-5"
5066
+ openai: CO_REASON_MODEL,
5067
+ // "gpt-5.6"
5068
+ xai: DEFAULT_MODELS["xai"],
5069
+ // already the default — no-op retarget
5070
+ gemini: DEFAULT_MODELS["gemini"],
5071
+ // already the default — no-op retarget
5072
+ kimi: DEFAULT_MODELS["kimi"]
5073
+ // already the default — no-op retarget
5074
+ };
5075
+ var SUPER_PROVIDER_NAMES = Object.keys(SUPER_MODELS);
5076
+ function isSuperRequested(args) {
5077
+ return args["super"] === true;
5078
+ }
5079
+ function retargetForSuper(p) {
5080
+ const model = SUPER_MODELS[p.name];
5081
+ return model ? retargetProvider(p, model) : p;
5082
+ }
5083
+ var SUPER_BUDGET_MULTIPLIER = 3;
5084
+ var SUPER_BUDGET_CEILING = 16e3;
5085
+ function superBudget(base) {
5086
+ return Math.min(base * SUPER_BUDGET_MULTIPLIER, SUPER_BUDGET_CEILING);
5087
+ }
5088
+
5056
5089
  // src/core/session-memory.ts
5057
5090
  init_cjs_shims();
5058
5091
  var SESSION_MEMORY_DEFAULT_LIMIT = 50;
@@ -5643,11 +5676,12 @@ async function runConfer(args, opts) {
5643
5676
  const question = typeof args["question"] === "string" ? args["question"] : String(args["question"] ?? "");
5644
5677
  const context = typeof args["context"] === "string" ? args["context"] : "";
5645
5678
  const autoPanel = Boolean(args["auto_panel"]);
5679
+ const superRequested = isSuperRequested(args);
5646
5680
  const callerProvidersRaw = args["providers"];
5647
5681
  const callerSuppliedProviders = Array.isArray(callerProvidersRaw) && callerProvidersRaw.length > 0;
5648
5682
  let resolvedProviders = callerProvidersRaw;
5649
5683
  let autoPanelMeta = null;
5650
- if (autoPanel && !callerSuppliedProviders && opts.storage) {
5684
+ if (autoPanel && !callerSuppliedProviders && !superRequested && opts.storage) {
5651
5685
  const autoNRaw = Number(args["auto_panel_n"]);
5652
5686
  const autoN = Number.isFinite(autoNRaw) && autoNRaw > 0 ? Math.trunc(autoNRaw) : AUTO_PANEL_DEFAULT_N;
5653
5687
  const picked = await pickAutoPanel(
@@ -5667,6 +5701,9 @@ async function runConfer(args, opts) {
5667
5701
  };
5668
5702
  }
5669
5703
  }
5704
+ if (superRequested && !callerSuppliedProviders) {
5705
+ resolvedProviders = SUPER_PROVIDER_NAMES;
5706
+ }
5670
5707
  let { selected, unknown: unknownNames, blocked } = resolveProviders(
5671
5708
  resolvedProviders,
5672
5709
  opts.providers,
@@ -5684,8 +5721,11 @@ async function runConfer(args, opts) {
5684
5721
  }
5685
5722
  return { tool: "confer", error: "no active providers have API keys in .env" };
5686
5723
  }
5724
+ if (superRequested) {
5725
+ selected = selected.map(retargetForSuper);
5726
+ }
5687
5727
  let cheapModePanelMeta = null;
5688
- if (opts.ctx?.cheap_mode === true && !callerSuppliedProviders && selected.length > 1) {
5728
+ if (opts.ctx?.cheap_mode === true && !callerSuppliedProviders && !superRequested && selected.length > 1) {
5689
5729
  if (!opts.pricing) {
5690
5730
  cheapModePanelMeta = {
5691
5731
  before: selected.length,
@@ -5762,7 +5802,7 @@ ${ctxBody}` });
5762
5802
  if (injectMem && opts.storage && sessionId) {
5763
5803
  await injectSessionMemoryInline(messages, opts.storage, sessionId);
5764
5804
  }
5765
- const maxTokens = opts.maxTokens ?? 4096;
5805
+ const maxTokens = superRequested ? superBudget(opts.maxTokens ?? 4096) : opts.maxTokens ?? 4096;
5766
5806
  const earlyStop = Boolean(args["early_stop"]);
5767
5807
  const earlyStopThresholdRaw = Number(args["early_stop_threshold"]);
5768
5808
  const earlyStopThreshold = Number.isFinite(earlyStopThresholdRaw) ? earlyStopThresholdRaw : 0.7;
@@ -5883,6 +5923,13 @@ ${ctxBody}` });
5883
5923
  }
5884
5924
  if (unknownNames.length > 0) result["skipped_unknown_providers"] = unknownNames;
5885
5925
  if (blocked.length > 0) result["blocked_by_allowlist"] = blocked;
5926
+ if (superRequested) {
5927
+ result["super_mode"] = {
5928
+ applied: true,
5929
+ panel: selected.map((p) => ({ provider: p.name, model: p.model })),
5930
+ max_tokens: maxTokens
5931
+ };
5932
+ }
5886
5933
  const allCallEnvelopes = [
5887
5934
  ...sanitized,
5888
5935
  ...extraAnswers.map((a) => a)
@@ -9146,6 +9193,7 @@ var ROLE_TURN_SCHEMA = {
9146
9193
  async function runCoordinate(args, opts) {
9147
9194
  const callStartedWall = import_node_perf_hooks7.performance.now();
9148
9195
  const callStartedCpu = process.cpuUsage();
9196
+ const superRequested = isSuperRequested(args);
9149
9197
  const requestedWorkerTools = Array.isArray(args["worker_tools"]) ? args["worker_tools"].filter(
9150
9198
  (t) => typeof t === "string"
9151
9199
  ) : [];
@@ -9161,6 +9209,13 @@ async function runCoordinate(args, opts) {
9161
9209
  const workerToolsNeedsBridge = acceptedWorkerTools.length > 0 && !opts.innerCallers;
9162
9210
  const needsBridge = DEFERRED_OPTS3.some((k) => Boolean(args[k])) || workerToolsNeedsBridge;
9163
9211
  if (needsBridge) {
9212
+ if (superRequested) {
9213
+ return errorEnvelope7(
9214
+ "COORDINATE_SUPER_NOT_NATIVE",
9215
+ "super mode requested but worker_tools needs the Python bridge",
9216
+ "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."
9217
+ );
9218
+ }
9164
9219
  if (opts.bridge && opts.bridge.toolNames.has("coordinate")) {
9165
9220
  return await deferCoordinate(args, opts.bridge);
9166
9221
  }
@@ -9174,8 +9229,11 @@ async function runCoordinate(args, opts) {
9174
9229
  const canary = untrusted ? mintCanary() : null;
9175
9230
  const topic = typeof args["topic"] === "string" ? args["topic"] : String(args["topic"] ?? "");
9176
9231
  const context = typeof args["context"] === "string" ? args["context"] : "";
9232
+ const callerProvidersRaw = args["providers"];
9233
+ const callerSuppliedProviders = Array.isArray(callerProvidersRaw) && callerProvidersRaw.length > 0;
9234
+ const resolvedProviders = superRequested && !callerSuppliedProviders ? SUPER_PROVIDER_NAMES : callerProvidersRaw;
9177
9235
  const { selected, unknown: unknownNames, blocked } = resolveProviders4(
9178
- args["providers"],
9236
+ resolvedProviders,
9179
9237
  opts.providers,
9180
9238
  opts.allowlist ?? null
9181
9239
  );
@@ -9202,9 +9260,10 @@ async function runCoordinate(args, opts) {
9202
9260
  const synthName = typeof args["synthesizer"] === "string" && args["synthesizer"] ? args["synthesizer"] : typeof args["moderator"] === "string" && args["moderator"] ? args["moderator"] : opts.moderator ?? "anthropic";
9203
9261
  const proposer = opts.providers[proposerName.toLowerCase()] ?? selected[0];
9204
9262
  const synth = opts.providers[synthName.toLowerCase()] ?? proposer;
9205
- const upgradeRequested = isUpgradeRequested(args);
9263
+ const proposerForCall = superRequested ? retargetForSuper(proposer) : proposer;
9264
+ const upgradeRequested = isUpgradeRequested(args) || superRequested;
9206
9265
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
9207
- const synthForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : synth;
9266
+ const synthForCall = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : superRequested ? retargetForSuper(synth) : synth;
9208
9267
  let critics = [];
9209
9268
  if (Array.isArray(args["critics"])) {
9210
9269
  for (const n of args["critics"]) {
@@ -9227,7 +9286,10 @@ async function runCoordinate(args, opts) {
9227
9286
  available_now: Object.keys(opts.providers).sort()
9228
9287
  };
9229
9288
  }
9230
- const maxTokens = opts.maxTokens ?? 4096;
9289
+ if (superRequested) {
9290
+ critics = critics.map(retargetForSuper);
9291
+ }
9292
+ const maxTokens = superRequested ? superBudget(opts.maxTokens ?? 4096) : opts.maxTokens ?? 4096;
9231
9293
  let topicBlock = `TOPIC: ${topic}`;
9232
9294
  if (context) {
9233
9295
  const ctxBlock = untrusted ? wrapUntrusted(context, canary) : context;
@@ -9305,7 +9367,7 @@ ${UNTRUSTED_SYSTEM_NOTE}`;
9305
9367
  { role: "system", content: propSystem },
9306
9368
  { role: "user", content: topicBlock }
9307
9369
  ];
9308
- const propResult = await runRoleTurn(proposer, propMessages, ROLE_TURN_SCHEMA);
9370
+ const propResult = await runRoleTurn(proposerForCall, propMessages, ROLE_TURN_SCHEMA);
9309
9371
  const proposalObj = propResult.obj;
9310
9372
  const proposalAns = propResult.answer;
9311
9373
  const proposalRender = formatRoleTurn(
@@ -9429,6 +9491,17 @@ ${critiqueBlock}`
9429
9491
  result["suggested_upgrade"] = buildSuggestedUpgrade("coordinate", assessment);
9430
9492
  }
9431
9493
  }
9494
+ if (superRequested) {
9495
+ result["super_mode"] = {
9496
+ applied: true,
9497
+ panel: [
9498
+ { provider: proposerForCall.name, model: proposerForCall.model },
9499
+ ...critics.map((p) => ({ provider: p.name, model: p.model })),
9500
+ { provider: synthForCall.name, model: synthForCall.model }
9501
+ ],
9502
+ max_tokens: maxTokens
9503
+ };
9504
+ }
9432
9505
  const allCallEnvelopes = [
9433
9506
  scannedProposal,
9434
9507
  ...scannedCritiques,
@@ -9841,6 +9914,7 @@ var DEFERRED_OPTS4 = [
9841
9914
  async function runDebate(args, opts) {
9842
9915
  const callStartedWall = import_node_perf_hooks9.performance.now();
9843
9916
  const callStartedCpu = process.cpuUsage();
9917
+ const superRequested = isSuperRequested(args);
9844
9918
  const extraAnswers = [];
9845
9919
  const requestedWorkerTools = Array.isArray(args["worker_tools"]) ? args["worker_tools"].filter(
9846
9920
  (t) => typeof t === "string"
@@ -9857,6 +9931,13 @@ async function runDebate(args, opts) {
9857
9931
  const workerToolsNeedsBridge = acceptedWorkerTools.length > 0 && !opts.innerCallers;
9858
9932
  const needsBridge = DEFERRED_OPTS4.some((k) => Boolean(args[k])) || workerToolsNeedsBridge;
9859
9933
  if (needsBridge) {
9934
+ if (superRequested) {
9935
+ return errorEnvelope9(
9936
+ "DEBATE_SUPER_NOT_NATIVE",
9937
+ "super mode requested but worker_tools needs the Python bridge",
9938
+ "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."
9939
+ );
9940
+ }
9860
9941
  if (opts.bridge && opts.bridge.toolNames.has("debate")) {
9861
9942
  return await deferDebate(args, opts.bridge);
9862
9943
  }
@@ -9885,7 +9966,7 @@ async function runDebate(args, opts) {
9885
9966
  const callerSuppliedProviders = Array.isArray(callerProvidersRaw) && callerProvidersRaw.length > 0;
9886
9967
  let resolvedProviders = callerProvidersRaw;
9887
9968
  let autoPanelMeta = null;
9888
- if (autoPanel && !callerSuppliedProviders && opts.storage) {
9969
+ if (autoPanel && !callerSuppliedProviders && !superRequested && opts.storage) {
9889
9970
  const autoNRaw = Number(args["auto_panel_n"]);
9890
9971
  const autoN = Number.isFinite(autoNRaw) && autoNRaw > 0 ? Math.trunc(autoNRaw) : AUTO_PANEL_DEFAULT_N;
9891
9972
  const picked = await pickAutoPanel(
@@ -9905,7 +9986,10 @@ async function runDebate(args, opts) {
9905
9986
  };
9906
9987
  }
9907
9988
  }
9908
- const { selected, unknown: unknownNames, blocked } = resolveProviders6(
9989
+ if (superRequested && !callerSuppliedProviders) {
9990
+ resolvedProviders = SUPER_PROVIDER_NAMES;
9991
+ }
9992
+ let { selected, unknown: unknownNames, blocked } = resolveProviders6(
9909
9993
  resolvedProviders,
9910
9994
  opts.providers,
9911
9995
  opts.allowlist ?? null
@@ -9929,7 +10013,10 @@ async function runDebate(args, opts) {
9929
10013
  available_now: Object.keys(opts.providers).sort()
9930
10014
  };
9931
10015
  }
9932
- const maxTokens = opts.maxTokens ?? 4096;
10016
+ if (superRequested) {
10017
+ selected = selected.map(retargetForSuper);
10018
+ }
10019
+ const maxTokens = superRequested ? superBudget(opts.maxTokens ?? 4096) : opts.maxTokens ?? 4096;
9933
10020
  let memBlock = "";
9934
10021
  if (Boolean(args["inject_session_memory"]) && opts.storage && sessionId) {
9935
10022
  memBlock = await renderSessionMemoryBlock(opts.storage, sessionId);
@@ -9970,7 +10057,7 @@ async function runDebate(args, opts) {
9970
10057
  let agreementBlock = null;
9971
10058
  const moderatorName = typeof args["moderator"] === "string" && args["moderator"] ? args["moderator"] : opts.moderator ?? "anthropic";
9972
10059
  const moderator = opts.providers[moderatorName.toLowerCase()] ?? selected[0];
9973
- const upgradeRequested = isUpgradeRequested(args);
10060
+ const upgradeRequested = isUpgradeRequested(args) || superRequested;
9974
10061
  const upgraded = upgradeRequested && opts.providers["anthropic"] !== void 0;
9975
10062
  for (let rnd = 1; rnd <= maxRounds; rnd++) {
9976
10063
  const roundMessages = [
@@ -10041,7 +10128,7 @@ ${prior}` });
10041
10128
  let personaMeta = null;
10042
10129
  let coReasoned = false;
10043
10130
  if (moderator) {
10044
- const synthProvider = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : moderator;
10131
+ const synthProvider = upgraded ? retargetProvider(opts.providers["anthropic"], UPGRADE_MODEL) : superRequested ? retargetForSuper(moderator) : moderator;
10045
10132
  const condensed = transcript.map(
10046
10133
  (e) => `[${e.provider} \u2014 round ${e.round}]
10047
10134
  ${e.response ?? "(error)"}`
@@ -10176,6 +10263,13 @@ ${condensed}`
10176
10263
  }
10177
10264
  if (unknownNames.length > 0) result["skipped_unknown_providers"] = unknownNames;
10178
10265
  if (blocked.length > 0) result["blocked_by_allowlist"] = blocked;
10266
+ if (superRequested) {
10267
+ result["super_mode"] = {
10268
+ applied: true,
10269
+ panel: selected.map((p) => ({ provider: p.name, model: p.model })),
10270
+ max_tokens: maxTokens
10271
+ };
10272
+ }
10179
10273
  const allCallEnvelopes = [
10180
10274
  ...transcript,
10181
10275
  ...extraAnswers
@@ -11222,6 +11316,7 @@ Return: (1) the plan as numbered steps, (2) risks, (3) alternatives considered.`
11222
11316
  if (args["reasoning"] !== void 0) debateArgs["reasoning"] = args["reasoning"];
11223
11317
  if (args["upgrade"] !== void 0) debateArgs["upgrade"] = args["upgrade"];
11224
11318
  if (args["model"] !== void 0) debateArgs["model"] = args["model"];
11319
+ if (args["super"] !== void 0) debateArgs["super"] = args["super"];
11225
11320
  const result = await runDebate(debateArgs, opts);
11226
11321
  if (result["suggested_upgrade"] && typeof result["suggested_upgrade"] === "object") {
11227
11322
  const su = result["suggested_upgrade"];
@@ -12372,7 +12467,7 @@ var CHECK_INTERVAL_SECONDS = 3 * 24 * 60 * 60;
12372
12467
  var DEFAULT_PACKAGE = "crosscheck-cli";
12373
12468
  var FETCH_TIMEOUT_MS = 3e3;
12374
12469
  function engineVersion() {
12375
- return true ? "0.2.6" : "0.0.0-dev";
12470
+ return true ? "0.2.7" : "0.0.0-dev";
12376
12471
  }
12377
12472
  function defaultUpdateCachePath() {
12378
12473
  const base = process.env["CROSSCHECK_DATA_DIR"] || import_node_path13.default.join(import_node_os2.default.homedir() || import_node_os2.default.tmpdir(), ".crosscheck");
@@ -12729,6 +12824,7 @@ async function runTriangulate(args, opts) {
12729
12824
  if (args["reasoning"] !== void 0) coordArgs["reasoning"] = args["reasoning"];
12730
12825
  if (args["upgrade"] !== void 0) coordArgs["upgrade"] = args["upgrade"];
12731
12826
  if (args["model"] !== void 0) coordArgs["model"] = args["model"];
12827
+ if (args["super"] !== void 0) coordArgs["super"] = args["super"];
12732
12828
  const coord = await runCoordinate(coordArgs, opts);
12733
12829
  if (typeof coord["error"] === "string") return coord;
12734
12830
  const synth = coord["synthesis_structured"] ?? {};
@@ -12779,7 +12875,8 @@ async function runTriangulate(args, opts) {
12779
12875
  "blocked_by_allowlist",
12780
12876
  "skipped_unknown_providers",
12781
12877
  "reasoning_upgrade",
12782
- "suggested_upgrade"
12878
+ "suggested_upgrade",
12879
+ "super_mode"
12783
12880
  ]) {
12784
12881
  if (k in coord) result[k] = coord[k];
12785
12882
  }
@@ -13692,7 +13789,8 @@ function planTool(providers, allowlist, bridge) {
13692
13789
  mode: { type: "string", enum: ["fast", "thorough"] },
13693
13790
  max_rounds: { type: "integer", minimum: 1 },
13694
13791
  early_stop: { type: "boolean" },
13695
- early_stop_threshold: { type: "number", minimum: 0, maximum: 1 }
13792
+ early_stop_threshold: { type: "number", minimum: 0, maximum: 1 },
13793
+ super: { type: "boolean" }
13696
13794
  },
13697
13795
  required: ["goal"]
13698
13796
  },
@@ -13716,7 +13814,8 @@ function triangulateTool(providers, allowlist, bridge) {
13716
13814
  context: { type: "string" },
13717
13815
  providers: { type: "array", items: { type: "string" } },
13718
13816
  session_id: { type: "string" },
13719
- untrusted_input: { type: "boolean" }
13817
+ untrusted_input: { type: "boolean" },
13818
+ super: { type: "boolean" }
13720
13819
  },
13721
13820
  required: ["question"]
13722
13821
  },
@@ -13784,7 +13883,8 @@ function debateTool(providers, allowlist, bridge, innerCallers, storage, pricing
13784
13883
  auto_panel: { type: "boolean" },
13785
13884
  auto_panel_n: { type: "integer" },
13786
13885
  inject_session_memory: { type: "boolean" },
13787
- worker_tools: { type: "array", items: { type: "string" } }
13886
+ worker_tools: { type: "array", items: { type: "string" } },
13887
+ super: { type: "boolean" }
13788
13888
  },
13789
13889
  required: ["topic"]
13790
13890
  },
@@ -13833,7 +13933,8 @@ function conferTool(providers, allowlist, bridge, moderator, pricing, storage, i
13833
13933
  inject_session_memory: { type: "boolean" },
13834
13934
  auto_panel: { type: "boolean" },
13835
13935
  auto_panel_n: { type: "integer" },
13836
- worker_tools: { type: "array", items: { type: "string" } }
13936
+ worker_tools: { type: "array", items: { type: "string" } },
13937
+ super: { type: "boolean" }
13837
13938
  },
13838
13939
  required: ["question"]
13839
13940
  },