github-router 0.3.175 → 0.3.177

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.
package/dist/main.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { $ as isAdvisorRequested, $t as cacheModels, A as liveExec, At as hasSupportedBrowserInstalled, Bt as DEFAULT_CODEX_MODEL_FALLBACKS, C as fileReviewDebounce, Ct as pickEndpoint, D as stopGateEnabledForRepo, Dt as readResponseBodyCapped, E as repoRoot, Et as MAX_RESPONSE_BODY_BYTES, Ft as ArtifactClient, G as vscodeRipgrepPath, Gt as pickClaudeDefault, H as buildToolbeltAwareness, Ht as UPSTREAM_FETCH_TIMEOUT_MS, It as collapsePathKeys, J as searchWeb, Jt as setupCopilotToken, K as TOOLBELT_TOOLS, Kt as getPackageVersion, Lt as toolbeltPathOverride, Mt as extractTarGzMember, Nt as extractZipMember, O as stopReviewStateDir, Ot as parseJsonOrDiagnose, Pt as shouldUseInsecureTls, Q as injectAdvisorTool, Qt as cacheCopilotVersion, Rt as DEFAULT_CLAUDE_MODEL_FALLBACKS, S as fileLastPromptStore, St as resolveMcpToolTimeoutMs, T as repoFingerprint, Tt as createChatCompletions, U as toolbeltEnabled, Ut as UPSTREAM_INACTIVITY_TIMEOUT_MS, V as availableToolCommands, Vt as DEFAULT_PORT, W as toolbeltSkipSet, Wt as generateRandomPort, X as ADVISOR_TOOL_INSTRUCTIONS, Xt as setupGitHubToken, Y as ADVISOR_INTERNAL_TOOL_NAME, Yt as setupGitHubAgentToken, Z as buildAdvisorStream, Zt as tryRefreshAndRetry, _ as stopGateId, _t as workerToolsEnabled, a as buildPeerAwarenessSnippet, an as sleep, at as relayAnthropicStream, b as fileBaselineStore, bt as getTokenCount, c as buildArtifactOpenHookCommand, cn as HTTPError, ct as agentToolsEnabled, d as captureLaunchBaseline, dn as copilotBaseUrl, dt as browserCompoundToolsEnabled, en as cacheVSCodeVersion, et as buildAnthropicErrorEvent, f as decideStopHook, fn as copilotHeaders, ft as browserToolsEnabled, g as stopGateDisabled, gt as standInToolEnabled, h as launchBaselineKey, ht as implementerSubagentModel, i as buildAgentPrompt, in as resolveModel, it as readIteratorWithTimeout, j as resolveSealedGate, jt as provisionAndIndexColbert, k as trustRepo, kt as provisionBrowserAssets, l as buildSessionBindHookCommand, ln as forwardError, lt as artifactToolsEnabled, m as injectStopHookIntoSettingsFile, mn as state, mt as geminiAvailable, n as MCP_GROUPS, nn as isNullish, nt as isControllerClosedError, o as buildPeerAwarenessSummary, on as getModels, ot as handleMcpDelete, p as fileBlockBudget, pn as githubHeaders, pt as fleetToolsEnabled, q as assetFor, qt as withInstallLock, r as assertMcpToolSurfaceConsistent, rn as resolveCodexModel, rt as logStreamError, s as personasFor, sn as fetchWithTransientRetry, st as handleMcpPost, t as GROUP_META, tn as filterBetaHeader, tt as buildOpenAIErrorEvent, u as buildStopHookCommand, un as GITHUB_API_BASE_URL, ut as browseAgentEnabled, v as stopGatePlanMode, vt as countTokens, w as isSubagentContext, wt as createResponses, x as fileFindingsStore, xt as assembleResponsesPayload, y as stopReviewEnabled, yt as createMessages, zt as DEFAULT_CODEX_MODEL } from "./peer-mcp-personas-BCGYWok0.js";
3
- import { a as removeOwnClaudeConfigMirror, i as isUnderClaudeConfigMirror, l as writeArtifactCredsToMirror, n as ensureClaudeConfigMirror, r as ensurePaths, t as PATHS, u as writeRuntimeFileSecure } from "./paths-CTlT1nTo.js";
4
- import { c as killManagedTree, d as runCommandCapture, f as runCommandVoid, l as parseBoolEnv, s as killChildProcessTree, u as resolveExecutable } from "./lifecycle-ChPBRt6K.js";
5
- import { a as sweepRegistry } from "./lifecycle-BUXxiltc.js";
2
+ import { $ as isAdvisorRequested, $t as cacheCopilotVersion, A as liveExec, At as provisionBrowserAssets, Bt as DEFAULT_CODEX_MODEL, C as fileReviewDebounce, Ct as resolveMcpToolTimeoutMs, D as stopGateEnabledForRepo, Dt as MAX_RESPONSE_BODY_BYTES, E as repoRoot, Et as createChatCompletions, Ft as shouldUseInsecureTls, G as vscodeRipgrepPath, Gt as generateRandomPort, H as buildToolbeltAwareness, Ht as DEFAULT_PORT, It as ArtifactClient, J as searchWeb, Jt as withInstallLock, K as TOOLBELT_TOOLS, Kt as pickClaudeDefault, Lt as collapsePathKeys, Mt as provisionAndIndexColbert, Nt as extractTarGzMember, O as stopReviewStateDir, Ot as readResponseBodyCapped, Pt as extractZipMember, Q as injectAdvisorTool, Qt as tryRefreshAndRetry, Rt as toolbeltPathOverride, S as fileLastPromptStore, St as assembleResponsesPayload, T as repoFingerprint, Tt as createResponses, U as toolbeltEnabled, Ut as UPSTREAM_FETCH_TIMEOUT_MS, V as availableToolCommands, Vt as DEFAULT_CODEX_MODEL_FALLBACKS, W as toolbeltSkipSet, Wt as UPSTREAM_INACTIVITY_TIMEOUT_MS, X as ADVISOR_TOOL_INSTRUCTIONS, Xt as setupGitHubAgentToken, Y as ADVISOR_INTERNAL_TOOL_NAME, Yt as setupCopilotToken, Z as buildAdvisorStream, Zt as setupGitHubToken, _ as stopGateId, _t as workerToolsEnabled, a as buildPeerAwarenessSnippet, an as resolveModel, at as relayAnthropicStream, b as fileBaselineStore, bt as createMessages, c as buildArtifactOpenHookCommand, cn as fetchWithTransientRetry, ct as agentToolsEnabled, d as captureLaunchBaseline, dn as GITHUB_API_BASE_URL, dt as browserCompoundToolsEnabled, en as cacheModels, et as buildAnthropicErrorEvent, f as decideStopHook, fn as copilotBaseUrl, ft as browserToolsEnabled, g as stopGateDisabled, gt as standInToolEnabled, h as launchBaselineKey, hn as state, ht as nativeSubagentModel, i as buildAgentPrompt, in as resolveCodexModel, it as readIteratorWithTimeout, j as resolveSealedGate, jt as hasSupportedBrowserInstalled, k as trustRepo, kt as parseJsonOrDiagnose, l as buildSessionBindHookCommand, ln as HTTPError, lt as artifactToolsEnabled, m as injectStopHookIntoSettingsFile, mn as githubHeaders, mt as geminiAvailable, n as MCP_GROUPS, nn as filterBetaHeader, nt as isControllerClosedError, o as buildPeerAwarenessSummary, on as sleep, ot as handleMcpDelete, p as fileBlockBudget, pn as copilotHeaders, pt as fleetToolsEnabled, q as assetFor, qt as getPackageVersion, r as assertMcpToolSurfaceConsistent, rn as isNullish, rt as logStreamError, s as personasFor, sn as getModels, st as handleMcpPost, t as GROUP_META, tn as cacheVSCodeVersion, tt as buildOpenAIErrorEvent, u as buildStopHookCommand, un as forwardError, ut as browseAgentEnabled, v as stopGatePlanMode, vt as shimDefaultsToXhigh, w as isSubagentContext, wt as pickEndpoint, x as fileFindingsStore, xt as getTokenCount, y as stopReviewEnabled, yt as countTokens, zt as DEFAULT_CLAUDE_MODEL_FALLBACKS } from "./peer-mcp-personas-BtQi-dF-.js";
3
+ import { a as isUnderClaudeConfigMirror, d as writeRuntimeFileSecure, i as ensurePaths, o as removeOwnClaudeConfigMirror, r as ensureClaudeConfigMirror, t as PATHS, u as writeArtifactCredsToMirror } from "./paths-BZPgxKUl.js";
4
+ import { c as killManagedTree, d as runCommandCapture, f as runCommandVoid, l as parseBoolEnv, s as killChildProcessTree, u as resolveExecutable } from "./lifecycle-DrDEjx_c.js";
5
+ import { a as sweepRegistry } from "./lifecycle-Dvr3pGGG.js";
6
6
  import { defineCommand, runMain } from "citty";
7
7
  import consola from "consola";
8
8
  import { createHash, randomBytes, randomUUID } from "node:crypto";
@@ -1137,16 +1137,16 @@ function buildCoordinatorAgent(opts) {
1137
1137
  "",
1138
1138
  "The lead's brief will include an artifact (plan, design, diff, or code) and a goal (e.g. 'review before exit-plan', 'review the commit I just made', 'cross-check codex-critic's verdict'). Pick the right peers for the artifact type:",
1139
1139
  "",
1140
- "- **Plan / design / architecture choice** → fan out to `codex-critic` (gpt-5.5, strongest reasoning, cross-lab)" + (opts.geminiAvailable ? " AND `gemini-critic` (third-lab triangulation, strong on formal reasoning) in parallel" : "") + ". codex-reviewer is the wrong tool for plans (it's a code-specialist, not an architecture critic).",
1140
+ "- **Plan / design / architecture choice** → fan out to `codex-critic` (gpt-5.6-sol, strongest reasoning, cross-lab)" + (opts.geminiAvailable ? " AND `gemini-critic` (third-lab triangulation, strong on formal reasoning) in parallel" : "") + ". codex-reviewer is the wrong tool for plans (it's a code-specialist, not an architecture critic).",
1141
1141
  "- **Concrete diff or single file** → fan out to `codex-reviewer` (gpt-5.3-codex, line-level code specialist, fastest at ~16s)" + (opts.geminiAvailable ? " AND `gemini-reviewer` (gemini-3.1-pro, second-lab line-level review)" : "") + (opts.geminiAvailable ? " AND `gemini-critic` for cross-lab triangulation" : "") + ". For very small changes (<20 lines), one `codex-reviewer` call is enough.",
1142
- "- **Large artifact** → the only peers that take a large artifact WHOLE are `codex-critic` (gpt-5.5, ≈922K-token input window) and `opus-critic` (Opus-4.7-1M, ≈936K-token input on enterprise catalogs; ≈168K otherwise). Route the full artifact to those for cross-lab coverage. `codex-reviewer` (≈272K) and `gemini-critic` (≈136K) have small windows — see Decomposition below: never summarize or downsize the request to squeeze a large artifact into a small-window peer.",
1142
+ "- **Large artifact** → the only peers that take a large artifact WHOLE are `codex-critic` (gpt-5.6-sol, ≈1M-token input window) and `opus-critic` (Opus-4.7-1M, ≈936K-token input on enterprise catalogs; ≈168K otherwise). Route the full artifact to those for cross-lab coverage. `codex-reviewer` (≈272K) and `gemini-critic` (≈136K) have small windows — see Decomposition below: never summarize or downsize the request to squeeze a large artifact into a small-window peer.",
1143
1143
  "- **Formal reasoning, proofs, or invariants** → prefer `gemini-critic`" + (opts.geminiAvailable ? " (gemini-3.1-pro, strong on math and formally-stated properties)" : " (NOT REGISTERED in this session — gemini-3.x not in catalog)") + ".",
1144
1144
  "- **Tie-breaker after codex-critic has weighed in** → call `gemini-critic`" + (opts.geminiAvailable ? "" : " (NOT REGISTERED in this session)") + " or `opus-critic` with the artifact AND codex-critic's verdict for cross-check.",
1145
1145
  "- **Fast sanity check** → `opus-critic` (~22s, same lab as lead but fresh context — catches confabulation and motivated reasoning).",
1146
1146
  "",
1147
1147
  "## Decomposition for large artifacts",
1148
1148
  "",
1149
- "Route by the peer's real PROMPT WINDOW (input tokens): `codex-critic` gpt-5.5922K · `opus-critic` Opus-4.7-1M ≈936K (enterprise catalogs; ≈168K otherwise) · `codex-reviewer` gpt-5.3-codex ≈272K · `gemini-critic` gemini-3.1-pro ≈136K. The proxy REJECTS (with an actionable message) any single call whose brief exceeds the target peer's window — it will NOT silently truncate, because dropping lines from a review artifact is worse than a clear error. So: send the full artifact only to peers whose window fits it (large artifacts → `codex-critic` and/or `opus-critic`). When a peer's window is too small (commonly `gemini-critic` at ≈136K, or `codex-reviewer` at ≈272K), do NOT summarize or downsize the request to include it — either skip that peer, or split the artifact into 2-4 logical batches BY CONCERN (not by raw size — semantic batches give better per-batch reviews) that each fit, and call in parallel. Use the big-window peers for the whole and reserve a small-window peer like gemini for the concerns it can actually hold. The proxy's MCP cap allows up to 8 in-flight calls. Aggregate findings yourself before reporting back. (Separately, on the JSON transport a per-effort `predictedTooLong` byte cap still guards the ~60s tools/call timeout for non-SSE clients; Claude Code uses SSE, which streams with heartbeats and isn't subject to that cap.)",
1149
+ "Route by the peer's real PROMPT WINDOW (input tokens): `codex-critic` gpt-5.6-sol1M · `opus-critic` Opus-4.7-1M ≈936K (enterprise catalogs; ≈168K otherwise) · `codex-reviewer` gpt-5.3-codex ≈272K · `gemini-critic` gemini-3.1-pro ≈136K. The proxy REJECTS (with an actionable message) any single call whose brief exceeds the target peer's window — it will NOT silently truncate, because dropping lines from a review artifact is worse than a clear error. So: send the full artifact only to peers whose window fits it (large artifacts → `codex-critic` and/or `opus-critic`). When a peer's window is too small (commonly `gemini-critic` at ≈136K, or `codex-reviewer` at ≈272K), do NOT summarize or downsize the request to include it — either skip that peer, or split the artifact into 2-4 logical batches BY CONCERN (not by raw size — semantic batches give better per-batch reviews) that each fit, and call in parallel. Use the big-window peers for the whole and reserve a small-window peer like gemini for the concerns it can actually hold. The proxy's MCP cap allows up to 8 in-flight calls. Aggregate findings yourself before reporting back. (Separately, on the JSON transport a per-effort `predictedTooLong` byte cap still guards the ~60s tools/call timeout for non-SSE clients; Claude Code uses SSE, which streams with heartbeats and isn't subject to that cap.)",
1150
1150
  "",
1151
1151
  "## Aggregation contract",
1152
1152
  "",
@@ -1205,10 +1205,22 @@ function buildPeerAgentDefinitions(opts) {
1205
1205
  codexCli: opts.codexCli,
1206
1206
  geminiAvailable: opts.geminiAvailable
1207
1207
  });
1208
- if (opts.implementerModel && opts.implementerModel.length > 0) out.implementer = {
1209
- description: "Bounded implementation subagent running gpt-5.5 (strong non-Claude coder, high reasoning). Use for well-scoped coding tasks — edits, small features, fixes — you want implemented in an integrated subagent. Model is overridable at spawn.",
1208
+ const nativeModel = opts.nativeSubagentModel && opts.nativeSubagentModel.length > 0 ? opts.nativeSubagentModel : void 0;
1209
+ const modelField = nativeModel ? { model: nativeModel } : {};
1210
+ out.implementer = {
1211
+ description: nativeModel ? `Bounded implementation subagent running ${nativeModel} (strong non-Claude coder, maximum reasoning). Use proactively for well-scoped coding tasks — edits, small features, fixes — to keep the lead's context focused; runs in its own context. Model is overridable at spawn.` : `Bounded implementation subagent (native tools, runs on the lead's model in its own context). Use proactively for well-scoped coding tasks — edits, small features, fixes — to keep the lead's context focused. Model is overridable at spawn.`,
1210
1212
  prompt: "You are a bounded implementation subagent for well-scoped coding tasks. Implement the requested change surgically, matching the surrounding code style and minimizing unrelated churn. Use the dedicated Edit/Write/Read tools for file changes and Grep/Glob for search; reserve Bash for running builds, tests, and git — do not shell out (sed/awk/python/here-docs) to read or edit files. Verify with the project's build or tests where applicable. Do the work yourself — do not spawn further subagents. Report exactly what changed and any risks.",
1211
- model: opts.implementerModel
1213
+ ...modelField
1214
+ };
1215
+ out.debugger = {
1216
+ description: nativeModel ? `Root-cause & debugging subagent running ${nativeModel} at maximum reasoning. Use proactively for reproducing a bug end to end, isolating the true root cause, and proposing a minimal fix — investigation-heavy work best kept off the lead's context; runs in its own context. Model is overridable at spawn.` : `Root-cause & debugging subagent (native tools, runs on the lead's model in its own context). Use proactively for reproducing a bug end to end, isolating the true root cause, and proposing a minimal fix — kept off the lead's context. Model is overridable at spawn.`,
1217
+ prompt: "You are a root-cause debugging subagent. Reproduce the failure end to end first — as close to how a real user hits it as you can — before theorizing. Form hypotheses and test them against the actual code and runtime: read the code, run the repro with Bash, and add temporary instrumentation only if needed (remove it after). Identify the true root cause, not a symptom; if a fix is in scope, make it minimal and verify the repro now passes. Use the dedicated Edit/Write/Read tools for file changes and Grep/Glob for search; reserve Bash for running repros, tests, and git — do not shell out (sed/awk/python/here-docs) to read or edit files. Do the work yourself — do not spawn further subagents. Report the root cause with evidence, the fix (if any), and any residual risks.",
1218
+ ...modelField
1219
+ };
1220
+ out["qa-engineer"] = {
1221
+ description: nativeModel ? `Review, testing & QA subagent running ${nativeModel} at maximum reasoning. Use proactively to review a change for correctness, author and run tests that try to break it, and give a severity-ranked go/no-go while keeping the lead's context focused; runs in its own context. Model is overridable at spawn.` : `Review, testing & QA subagent (native tools, runs on the lead's model in its own context). Use proactively to review a change for correctness, author and run tests that try to break it, and give a severity-ranked go/no-go. Model is overridable at spawn.`,
1222
+ prompt: "You are a review, testing, and QA subagent. Verify correctness against the ACTUAL code by reading it — never assume. Where the change warrants it, author tests that try to BREAK the implementation (edge cases, error paths, and the acceptance criteria as executable checks), then run them and report which pass and which fail; do NOT modify production code just to make tests pass. Use the dedicated Edit/Write/Read tools for file changes and Grep/Glob for search; reserve Bash for running builds, tests, and git — do not shell out (sed/awk/python/here-docs) to read or edit files. Do the work yourself — do not spawn further subagents. Report severity-ranked findings with `file:line` citations and end with a clear go/no-go.",
1223
+ ...modelField
1212
1224
  };
1213
1225
  if (opts.workerToolsAvailable) {
1214
1226
  const workersKey = workersKeyOf(opts.groupKeys);
@@ -1506,7 +1518,7 @@ async function writePeerMcpRuntimeFiles(serverUrl, opts) {
1506
1518
  groupKeys: opts.groupKeys,
1507
1519
  workerToolsAvailable: opts.workerToolsAvailable,
1508
1520
  browseAvailable: opts.browseAvailable,
1509
- implementerModel: opts.implementerModel,
1521
+ nativeSubagentModel: opts.nativeSubagentModel,
1510
1522
  nonce,
1511
1523
  codexHome
1512
1524
  });
@@ -1787,7 +1799,7 @@ async function callMcpTool(opts) {
1787
1799
  };
1788
1800
  }
1789
1801
  /**
1790
- * One non-streaming gpt-5.5 (or any model id) inference via `/v1/responses`.
1802
+ * One non-streaming gpt-5.6-sol (or any model id) inference via `/v1/responses`.
1791
1803
  * Returns the assistant text (possibly empty). Throws on transport/HTTP/parse
1792
1804
  * failure. `effort` maps to the Responses `reasoning.effort` knob.
1793
1805
  */
@@ -2556,7 +2568,7 @@ async function discoverGateCommands(cwd, opts) {
2556
2568
  if (files.length === 0) return null;
2557
2569
  let result;
2558
2570
  try {
2559
- const { runWorkerAgent } = await import("./engine-cUomEg92.js");
2571
+ const { runWorkerAgent } = await import("./engine-DOOYh35O.js");
2560
2572
  result = await runWorkerAgent({
2561
2573
  mode: "explore",
2562
2574
  workspace: root,
@@ -2622,14 +2634,14 @@ function decidePromptSubmit(input) {
2622
2634
  * concluding. Mirrors the v1 advisory tone: additive, never blocking.
2623
2635
  */
2624
2636
  const PROMPT_SEARCH_TIP = "TIP (advisory): when this task needs code context, search lexical + semantic in parallel — one `mcp__search__code` call with mode:\"lexical\" and one with mode:\"semantic\", issued in the same turn — before concluding.";
2625
- /** System prompt for the single gpt-5.5 scope/goal inference. Steers a SHORT,
2637
+ /** System prompt for the single gpt-5.6-sol scope/goal inference. Steers a SHORT,
2626
2638
  * user-derived (not invented) advisory note grounded in the search results. */
2627
2639
  const PROMPT_SCOPE_SYSTEM = "You are a scoping assistant for a coding agent about to act on a user's request. You are given the user's request and the results of a lexical + semantic code search over the relevant repository. Produce a SHORT advisory note (<= 120 words), plain text only:\n1. SCOPE: one line — is this trivial, focused (one area), or large/cross-cutting — grounded in what the search surfaced (reference the most relevant file(s) by name).\n2. GOAL: restate the user's OWN ask as a single measurable objective, in THEIR terms. Do NOT invent new requirements or acceptance criteria beyond what they asked.\n3. Only if the task is large/cross-cutting, add a final line: \"Consider /gh-research first to saturate understanding, then /gh-orchestrate to compose a floor-raising workflow.\" Omit it for a focused or trivial task.\nThis is advisory — the agent decides whether to follow it. Be concrete and concise; no preamble.";
2628
2640
  /** Max chars of each search-result blob fed into the scope inference. */
2629
2641
  const SEARCH_CONTEXT_CAP = 6 * 1024;
2630
2642
  /** Wrap the prior-turn review findings in an explicitly NON-AUTHORITATIVE frame. */
2631
2643
  function framePendingFindings(findings) {
2632
- return "ADVISORY — independent review of your PREVIOUS change (NON-AUTHORITATIVE): an independent gpt-5.5 reviewer flagged the following. Evaluate each on its merits — fix the real ones, and ignore any wrong one with a one-line reason. You are NOT obligated to act on these.\n" + findings.trim();
2644
+ return "ADVISORY — independent review of your PREVIOUS change (NON-AUTHORITATIVE): an independent gpt-5.6-sol reviewer flagged the following. Evaluate each on its merits — fix the real ones, and ignore any wrong one with a one-line reason. You are NOT obligated to act on these.\n" + findings.trim();
2633
2645
  }
2634
2646
  function joinSections(sections) {
2635
2647
  return sections.map((s) => s.trim()).filter((s) => s.length > 0).join("\n\n");
@@ -2643,7 +2655,7 @@ function joinSections(sections) {
2643
2655
  * - subagent/teammate -> empty (top-level only, like v1).
2644
2656
  * - findings -> always surfaced (+ cleared) regardless of triviality.
2645
2657
  * - trivial prompt -> findings only (no search tip, no model call).
2646
- * - substantive prompt -> static search tip + parallel lexical+semantic search -> ONE gpt-5.5 call
2658
+ * - substantive prompt -> static search tip + parallel lexical+semantic search -> ONE gpt-5.6-sol call
2647
2659
  * -> grounded scope/goal note. Fail-open to PROMPT_STEER_GOAL.
2648
2660
  * - steerEnabled=false -> findings only (no goal/tip).
2649
2661
  */
@@ -4716,7 +4728,7 @@ function initProxyFromEnv() {
4716
4728
  //#endregion
4717
4729
  //#region package.json
4718
4730
  var name = "github-router";
4719
- var version$1 = "0.3.175";
4731
+ var version$1 = "0.3.177";
4720
4732
 
4721
4733
  //#endregion
4722
4734
  //#region src/lib/approval.ts
@@ -5799,13 +5811,21 @@ function parseDisableParallelToolUse(toolChoice) {
5799
5811
  if (!toolChoice || typeof toolChoice !== "object") return void 0;
5800
5812
  return toolChoice.disable_parallel_tool_use === true ? false : void 0;
5801
5813
  }
5802
- /** Default absent Anthropic `thinking` to high effort, clamped by the model.
5803
- * Returns undefined for a model that advertises NO `reasoning_effort` allowlist
5804
- * such a model may not support reasoning at all, so forcing an effort could
5805
- * 400; leaving it unset preserves the pre-default safe behavior for that case. */
5814
+ /** Default absent Anthropic `thinking` to an effort, clamped by the model.
5815
+ * OpenAI-frontier shim models (gpt-5.6-sol/gpt-5.5) default to xhigh so the
5816
+ * native gpt-5.6-sol subagents (implementer/debugger/qa-engineer) and any
5817
+ * `-m gpt-5.6-sol` main-loop session reason at max when the client sends no
5818
+ * `thinking` block; every other shim model stays high. The
5819
+ * `supported.includes("xhigh")` guard makes the intent explicit rather than
5820
+ * trusting clampEffort to silently degrade. Opt out with
5821
+ * `GH_ROUTER_DISABLE_FRONTIER_XHIGH_DEFAULT=1`. Returns undefined for a model
5822
+ * that advertises NO `reasoning_effort` allowlist (may not support reasoning;
5823
+ * forcing an effort could 400). Note: an explicit client `thinking` budget is
5824
+ * handled by parseReasoningEffort and is NOT affected by this default. */
5806
5825
  function defaultReasoningEffort(model) {
5807
5826
  const supported = model?.capabilities?.supports?.reasoning_effort;
5808
- return Array.isArray(supported) && supported.length > 0 ? clampEffort("high", supported) : void 0;
5827
+ if (!(Array.isArray(supported) && supported.length > 0)) return void 0;
5828
+ return clampEffort(parseBoolEnv(process.env.GH_ROUTER_DISABLE_FRONTIER_XHIGH_DEFAULT) !== true && model?.id != null && shimDefaultsToXhigh(model.id) && supported.includes("xhigh") ? "xhigh" : "high", supported);
5809
5829
  }
5810
5830
  /**
5811
5831
  * Map Anthropic `thinking` to a Responses reasoning effort, clamped to the
@@ -8062,6 +8082,10 @@ function parseSharedArgs(args) {
8062
8082
  * 1M/400k window, never overflows). See `seedGatewayModelCache`.
8063
8083
  */
8064
8084
  const NATIVE_NON_CLAUDE_MODELS = [
8085
+ {
8086
+ id: "gpt-5.6-sol",
8087
+ displayName: "GPT-5.6 Sol"
8088
+ },
8065
8089
  {
8066
8090
  id: "gpt-5.5",
8067
8091
  displayName: "GPT-5.5"
@@ -8495,7 +8519,7 @@ const claude = defineCommand({
8495
8519
  groupKeys,
8496
8520
  workerToolsAvailable: workerToolsEnabled(),
8497
8521
  browseAvailable: browseAgentEnabled(),
8498
- implementerModel: implementerSubagentModel()
8522
+ nativeSubagentModel: nativeSubagentModel()
8499
8523
  });
8500
8524
  state.peerMcpNonce = runtime.nonce;
8501
8525
  envVars.GH_ROUTER_HOOK_MCP_URL = serverUrl;
@@ -8692,7 +8716,6 @@ const claude = defineCommand({
8692
8716
  powerBrowseAvailable: state.powerBrowseEnabled,
8693
8717
  fleetAvailable: fleetToolsEnabled(),
8694
8718
  agentToolsAvailable: agentToolsEnabled(),
8695
- implementerAvailable: implementerSubagentModel() != null,
8696
8719
  groupKeys
8697
8720
  });
8698
8721
  peerAwarenessSnippet = peerSnippet;
@@ -8784,13 +8807,10 @@ const codex = defineCommand({
8784
8807
  if (codexModel !== requestedModel) consola.info(`Model "${requestedModel}" resolved to "${codexModel}"`);
8785
8808
  if (usingDefault && state.models) {
8786
8809
  const inCache = (id) => state.models?.data.some((m) => m.id === id) ?? false;
8787
- if (!inCache(codexModel)) for (const fallback of DEFAULT_CODEX_MODEL_FALLBACKS) {
8788
- const resolved = resolveCodexModel(fallback);
8789
- if (inCache(resolved)) {
8790
- consola.info(`Default model "${codexModel}" not in your Copilot model list; falling back to "${resolved}".`);
8791
- codexModel = resolved;
8792
- break;
8793
- }
8810
+ const firstPresent = [DEFAULT_CODEX_MODEL, ...DEFAULT_CODEX_MODEL_FALLBACKS].map((id) => resolveModel(id)).find((id) => inCache(id));
8811
+ if (firstPresent) {
8812
+ if (firstPresent !== codexModel) consola.info(`Default model "${DEFAULT_CODEX_MODEL}" not in your Copilot model list; falling back to "${firstPresent}".`);
8813
+ codexModel = firstPresent;
8794
8814
  }
8795
8815
  }
8796
8816
  const modelEntry = state.models?.data.find((m) => m.id === codexModel);
@@ -8955,7 +8975,7 @@ const internalPromptSubmit = defineCommand({
8955
8975
  },
8956
8976
  infer: (system, user, signal) => callInference({
8957
8977
  serverUrl: runtime.serverUrl,
8958
- model: "gpt-5.5",
8978
+ model: "gpt-5.6-sol",
8959
8979
  instructions: system,
8960
8980
  input: user,
8961
8981
  effort: "low",
@@ -9688,7 +9708,7 @@ THE DIFF:
9688
9708
  const internalStopReview = defineCommand({
9689
9709
  meta: {
9690
9710
  name: "internal-stop-review",
9691
- description: "Internal: the detached, advisory background reviewer. Reads a JSON payload on stdin, runs a read-only gpt-5.5 review of the working tree against the user's ask, and writes advisory findings for the next prompt to surface. Never blocks anything."
9711
+ description: "Internal: the detached, advisory background reviewer. Reads a JSON payload on stdin, runs a read-only gpt-5.6-sol review of the working tree against the user's ask, and writes advisory findings for the next prompt to surface. Never blocks anything."
9692
9712
  },
9693
9713
  async run() {
9694
9714
  try {
@@ -9717,7 +9737,7 @@ const internalStopReview = defineCommand({
9717
9737
  transcriptPath: typeof payload.transcript_path === "string" ? payload.transcript_path : ""
9718
9738
  }),
9719
9739
  workspace: cwd,
9720
- model: "gpt-5.5",
9740
+ model: "gpt-5.6-sol",
9721
9741
  thinking: "high"
9722
9742
  },
9723
9743
  timeoutMs: REVIEW_TIMEOUT_MS