github-router 0.3.285 → 0.3.288

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.
Files changed (87) hide show
  1. package/README.md +8 -5
  2. package/dist/{attribution-settings-B8M2fvhz.js → attribution-settings-CofaqSzw.js} +44 -17
  3. package/dist/attribution-settings-CofaqSzw.js.map +1 -0
  4. package/dist/{auth-VUL2Zxvw.js → auth-DG4vh8-F.js} +3 -3
  5. package/dist/{auth-VUL2Zxvw.js.map → auth-DG4vh8-F.js.map} +1 -1
  6. package/dist/browser-ext/manifest.json +1 -1
  7. package/dist/{check-usage-CcLdFPGr.js → check-usage-BqN7mBYv.js} +4 -4
  8. package/dist/{check-usage-CcLdFPGr.js.map → check-usage-BqN7mBYv.js.map} +1 -1
  9. package/dist/{claude-e-JIQGhR.js → claude-CoZKRNB8.js} +21 -16
  10. package/dist/claude-CoZKRNB8.js.map +1 -0
  11. package/dist/{codex-DSnVZ9oK.js → codex-y2OyLIdv.js} +5 -5
  12. package/dist/{codex-DSnVZ9oK.js.map → codex-y2OyLIdv.js.map} +1 -1
  13. package/dist/{debug-CtzYWxpJ.js → debug-B5TjPTTH.js} +2 -2
  14. package/dist/{debug-CtzYWxpJ.js.map → debug-B5TjPTTH.js.map} +1 -1
  15. package/dist/engine-B5nVGH4b.js +2 -0
  16. package/dist/{gate-discovery-BCFwLm0q.js → gate-discovery-LQZ-enJa.js} +5 -5
  17. package/dist/{gate-discovery-BCFwLm0q.js.map → gate-discovery-LQZ-enJa.js.map} +1 -1
  18. package/dist/{get-copilot-usage-B-EDAqQb.js → get-copilot-usage-BjA0nyGR.js} +2 -2
  19. package/dist/{get-copilot-usage-B-EDAqQb.js.map → get-copilot-usage-BjA0nyGR.js.map} +1 -1
  20. package/dist/{internal-artifact-open-Dj5Nlq0L.js → internal-artifact-open-BskmUpnb.js} +2 -2
  21. package/dist/{internal-artifact-open-Dj5Nlq0L.js.map → internal-artifact-open-BskmUpnb.js.map} +1 -1
  22. package/dist/{internal-first-mate-guard-DOgFVki5.js → internal-first-mate-guard-5XEHMaqy.js} +3 -3
  23. package/dist/{internal-first-mate-guard-DOgFVki5.js.map → internal-first-mate-guard-5XEHMaqy.js.map} +1 -1
  24. package/dist/{internal-first-mate-guard-B7p4NttK.js → internal-first-mate-guard-DHDQ6hFz.js} +1 -1
  25. package/dist/{internal-plan-review-DRFHET_B.js → internal-plan-review-BUuMx4ku.js} +3 -3
  26. package/dist/{internal-plan-review-DRFHET_B.js.map → internal-plan-review-BUuMx4ku.js.map} +1 -1
  27. package/dist/{internal-prompt-submit-f1LR2P2G.js → internal-prompt-submit-CQQ15xdO.js} +4 -4
  28. package/dist/{internal-prompt-submit-f1LR2P2G.js.map → internal-prompt-submit-CQQ15xdO.js.map} +1 -1
  29. package/dist/{internal-session-bind-DhZhxJ3T.js → internal-session-bind-D04W2yWI.js} +2 -2
  30. package/dist/{internal-session-bind-DhZhxJ3T.js.map → internal-session-bind-D04W2yWI.js.map} +1 -1
  31. package/dist/{internal-stop-hook-Cf-7w3RH.js → internal-stop-hook-DSbaDb_m.js} +5 -5
  32. package/dist/{internal-stop-hook-Cf-7w3RH.js.map → internal-stop-hook-DSbaDb_m.js.map} +1 -1
  33. package/dist/{internal-stop-review-BBsLcbPG.js → internal-stop-review-CdByyJLc.js} +2 -2
  34. package/dist/{internal-stop-review-BBsLcbPG.js.map → internal-stop-review-CdByyJLc.js.map} +1 -1
  35. package/dist/{internal-worker-guard-CKgYFiFO.js → internal-worker-guard-BIPN6Rv9.js} +2 -2
  36. package/dist/{internal-worker-guard-CKgYFiFO.js.map → internal-worker-guard-BIPN6Rv9.js.map} +1 -1
  37. package/dist/{internal-workspace-header-OYgHEnFt.js → internal-workspace-header-BKqejstG.js} +2 -2
  38. package/dist/{internal-workspace-header-OYgHEnFt.js.map → internal-workspace-header-BKqejstG.js.map} +1 -1
  39. package/dist/lifecycle-BTodQvn4.js +2 -0
  40. package/dist/lifecycle-C7JYNz-F.js +2 -0
  41. package/dist/{lifecycle-B7CHqKlF.js → lifecycle-DbM29FLK.js} +2 -2
  42. package/dist/{lifecycle-B7CHqKlF.js.map → lifecycle-DbM29FLK.js.map} +1 -1
  43. package/dist/{lifecycle-D-rL81tT.js → lifecycle-SXaWssN9.js} +2 -2
  44. package/dist/{lifecycle-D-rL81tT.js.map → lifecycle-SXaWssN9.js.map} +1 -1
  45. package/dist/main.js +17 -17
  46. package/dist/{mcp-workspace-header-ucs2SDST.js → mcp-workspace-header-DRCCWlOi.js} +2 -2
  47. package/dist/{mcp-workspace-header-ucs2SDST.js.map → mcp-workspace-header-DRCCWlOi.js.map} +1 -1
  48. package/dist/{models-C16mBK2M.js → models-Dz8d_SnI.js} +3 -3
  49. package/dist/{models-C16mBK2M.js.map → models-Dz8d_SnI.js.map} +1 -1
  50. package/dist/{orchestration-CtM6FYNx.js → orchestration-BrJwZxMN.js} +2 -2
  51. package/dist/{orchestration-CtM6FYNx.js.map → orchestration-BrJwZxMN.js.map} +1 -1
  52. package/dist/paths-CTr59UC6.js +2 -0
  53. package/dist/{paths-wLC0InjX.js → paths-D7_SAaIQ.js} +4 -4
  54. package/dist/{paths-wLC0InjX.js.map → paths-D7_SAaIQ.js.map} +1 -1
  55. package/dist/{peer-mcp-personas-V6stFvpq.js → peer-mcp-personas-B5Wp6wIn.js} +150 -36
  56. package/dist/peer-mcp-personas-B5Wp6wIn.js.map +1 -0
  57. package/dist/{plan-review-hook-Lf9ISdF6.js → plan-review-hook-CVZsG9MZ.js} +3 -3
  58. package/dist/{plan-review-hook-Lf9ISdF6.js.map → plan-review-hook-CVZsG9MZ.js.map} +1 -1
  59. package/dist/{prompt-submit-hook-BlijaOn7.js → prompt-submit-hook-BW92FX2D.js} +3 -3
  60. package/dist/{prompt-submit-hook-BlijaOn7.js.map → prompt-submit-hook-BW92FX2D.js.map} +1 -1
  61. package/dist/{provision-BpL6gZIt.js → provision-CUqPki1z.js} +4 -4
  62. package/dist/{provision-BpL6gZIt.js.map → provision-CUqPki1z.js.map} +1 -1
  63. package/dist/{self-invocation-CKMjcA5F.js → self-invocation-CP_SOkrr.js} +2 -2
  64. package/dist/{self-invocation-CKMjcA5F.js.map → self-invocation-CP_SOkrr.js.map} +1 -1
  65. package/dist/{serve-CXUf7RtJ.js → serve-BASqoXb3.js} +37 -24
  66. package/dist/serve-BASqoXb3.js.map +1 -0
  67. package/dist/{server-setup-Bppjt9xO.js → server-setup-D5hilphf.js} +15 -13
  68. package/dist/{server-setup-Bppjt9xO.js.map → server-setup-D5hilphf.js.map} +1 -1
  69. package/dist/{start-C1-jrHfU.js → start-Rfim4TeF.js} +3 -3
  70. package/dist/{start-C1-jrHfU.js.map → start-Rfim4TeF.js.map} +1 -1
  71. package/dist/{stop-gate-hook-DgJ6sW8N.js → stop-gate-hook-DriRc9xN.js} +3 -3
  72. package/dist/{stop-gate-hook-DgJ6sW8N.js.map → stop-gate-hook-DriRc9xN.js.map} +1 -1
  73. package/dist/{stop-gate-policy-DG5yYWGn.js → stop-gate-policy-DMPanpoR.js} +2 -2
  74. package/dist/{stop-gate-policy-DG5yYWGn.js.map → stop-gate-policy-DMPanpoR.js.map} +1 -1
  75. package/dist/{token-CnlB0884.js → token-BGCjZwtj.js} +2 -2
  76. package/dist/{token-CnlB0884.js.map → token-BGCjZwtj.js.map} +1 -1
  77. package/dist/{worker-dispatch-zW8Zi69V.js → worker-dispatch-BCTMyNE-.js} +2 -2
  78. package/dist/{worker-dispatch-zW8Zi69V.js.map → worker-dispatch-BCTMyNE-.js.map} +1 -1
  79. package/package.json +1 -1
  80. package/dist/attribution-settings-B8M2fvhz.js.map +0 -1
  81. package/dist/claude-e-JIQGhR.js.map +0 -1
  82. package/dist/engine-DMveEa9x.js +0 -2
  83. package/dist/lifecycle-CbmHMMSD.js +0 -2
  84. package/dist/lifecycle-DTcZwa7U.js +0 -2
  85. package/dist/paths-CV9K7Xqm.js +0 -2
  86. package/dist/peer-mcp-personas-V6stFvpq.js.map +0 -1
  87. package/dist/serve-CXUf7RtJ.js.map +0 -1
@@ -1,14 +1,14 @@
1
1
  import { n as explicitPackageRoot } from "./package-root-B-osctCk.js";
2
2
  import { t as getPackageVersion } from "./version-C8x2hQrZ.js";
3
- import { t as PATHS } from "./paths-wLC0InjX.js";
4
- import { A as state, C as GITHUB_GRAPHQL_URL, D as githubAgentGraphQLHeaders, E as copilotVersion, O as githubAgentHeaders, S as GITHUB_API_BASE_URL, T as copilotHeaders, b as sanitizeTransportText, d as resolveModel, f as sleep$2, g as HTTPError, h as isAllowedCopilotHost, i as tryRefreshAndRetry, v as classifyTransportError, w as copilotBaseUrl, x as withTransientRetry, y as fetchWithTransientRetry } from "./token-CnlB0884.js";
3
+ import { t as PATHS } from "./paths-D7_SAaIQ.js";
4
+ import { A as state, C as GITHUB_GRAPHQL_URL, D as githubAgentGraphQLHeaders, E as copilotVersion, O as githubAgentHeaders, S as GITHUB_API_BASE_URL, T as copilotHeaders, b as sanitizeTransportText, d as resolveModel, f as sleep$2, g as HTTPError, h as isAllowedCopilotHost, i as tryRefreshAndRetry, v as classifyTransportError, w as copilotBaseUrl, x as withTransientRetry, y as fetchWithTransientRetry } from "./token-BGCjZwtj.js";
5
5
  import { a as resolveExecutable, c as runManagedExeCapture, i as parseIntEnv, l as spawnTaskkillBestEffort, r as parseBoolEnv } from "./exec-y8C_MU8A.js";
6
- import { i as registerExitHandlers$1, n as getInstanceUuid, r as recordWorkerRepo, t as WorktreeRegistry } from "./lifecycle-B7CHqKlF.js";
7
- import { t as MCP_WORKSPACE_HEADER } from "./mcp-workspace-header-ucs2SDST.js";
6
+ import { i as registerExitHandlers$1, n as getInstanceUuid, r as recordWorkerRepo, t as WorktreeRegistry } from "./lifecycle-DbM29FLK.js";
7
+ import { t as MCP_WORKSPACE_HEADER } from "./mcp-workspace-header-DRCCWlOi.js";
8
8
  import { n as ArtifactError, r as applyInsecureTls, t as ArtifactClient } from "./client-CQMfroGV.js";
9
- import { n as isPidAlive$1, r as registerColbertExitHandlers, s as trackChild, t as getColbertInstanceUuid } from "./lifecycle-D-rL81tT.js";
10
- import { f as resolveSealedGate, m as runGateChecks, p as sealedGateIds } from "./stop-gate-hook-DgJ6sW8N.js";
11
- import { t as liveExec } from "./orchestration-CtM6FYNx.js";
9
+ import { n as isPidAlive$1, r as registerColbertExitHandlers, s as trackChild, t as getColbertInstanceUuid } from "./lifecycle-SXaWssN9.js";
10
+ import { f as resolveSealedGate, m as runGateChecks, p as sealedGateIds } from "./stop-gate-hook-DriRc9xN.js";
11
+ import { t as liveExec } from "./orchestration-BrJwZxMN.js";
12
12
  import { createRequire } from "node:module";
13
13
  import consola from "consola";
14
14
  import { chmodSync, closeSync, constants, cpSync, existsSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync, writeSync } from "node:fs";
@@ -995,6 +995,9 @@ function enumProp$1(values, description) {
995
995
  };
996
996
  }
997
997
  //#endregion
998
+ //#region src/lib/gemini-review-model.ts
999
+ const GEMINI_REVIEW_DEFAULT_MODEL = "gemini-3.1-pro-preview";
1000
+ //#endregion
998
1001
  //#region src/lib/fleet/mesh-egress-agent.ts
999
1002
  /**
1000
1003
  * Runtime-aware "route this fetch through the mesh loopback egress proxy" for a
@@ -18914,7 +18917,7 @@ function logAudit$1(record) {
18914
18917
  try {
18915
18918
  const fs = await import("node:fs/promises");
18916
18919
  const path = await import("node:path");
18917
- const { PATHS } = await import("./paths-CV9K7Xqm.js");
18920
+ const { PATHS } = await import("./paths-CTr59UC6.js");
18918
18921
  const dir = path.join(PATHS.APP_DIR, "browser-mcp");
18919
18922
  await fs.mkdir(dir, { recursive: true });
18920
18923
  const line = JSON.stringify({
@@ -23916,6 +23919,10 @@ const FALLBACK_TOKEN_PRICES = Object.freeze({
23916
23919
  "gemini-3.1-pro-preview": {
23917
23920
  in: 200,
23918
23921
  out: 1200
23922
+ },
23923
+ "gemini-3.7-flash": {
23924
+ in: 75,
23925
+ out: 375
23919
23926
  }
23920
23927
  });
23921
23928
  /**
@@ -23976,6 +23983,22 @@ function catalogTokenPrices(modelId) {
23976
23983
  * takes ~0.9s. That figure is deliberately NOT surfaced to the model, because a
23977
23984
  * second speed axis invites optimising a routing choice that policy already
23978
23985
  * settles (see the decorrelation note below).
23986
+ *
23987
+ * `gemini-3.7-flash` and the re-measured `gemini-3.1-pro-preview` (2026-08-13,
23988
+ * n=5, one untimed warmup rep) used the script's newer `GH_ROUTER_BENCH_STREAM=1`
23989
+ * mode, which splits wall-clock into TTFT and a decode-phase rate excluding the
23990
+ * first delta's own time+tokens. This row still records the SAME metric family
23991
+ * as every other row here (total tokens / total wall-clock, i.e. the script's
23992
+ * "total tok/s" column) — NOT the new decode-phase figure — so the table stays
23993
+ * internally comparable across rows measured at different times. The decode
23994
+ * figure is materially different and worth knowing for routing decisions that
23995
+ * care about steady-state throughput specifically: at matched effort,
23996
+ * `gemini-3.7-flash` decodes at ~275-315 tok/s (Google's own ~340 tok/s
23997
+ * Artificial Analysis figure, roughly confirmed once TTFT is excluded) against
23998
+ * `gpt-5.6-terra`'s ~135-190 tok/s decode — gemini-3.7-flash is the faster
23999
+ * decoder, but its ~1.1-1.7s TTFT (vs terra's ~0.9-1.0s) drags its TOTAL rate
24000
+ * below terra's on short responses, which is exactly why this row uses total,
24001
+ * not decode, to stay consistent with its neighbors.
23979
24002
  */
23980
24003
  const INDICATIVE_TOKENS_PER_SECOND = Object.freeze({
23981
24004
  "gpt-5.6-luna": 120,
@@ -23988,9 +24011,10 @@ const INDICATIVE_TOKENS_PER_SECOND = Object.freeze({
23988
24011
  "gpt-5.6-sol": 75,
23989
24012
  "grok-4.5": 70,
23990
24013
  "gpt-5.5": 65,
24014
+ "gemini-3.7-flash": 91,
23991
24015
  "gemini-3.6-flash": 45,
23992
24016
  "gemini-3.5-flash": 40,
23993
- "gemini-3.1-pro-preview": 25
24017
+ "gemini-3.1-pro-preview": 33
23994
24018
  });
23995
24019
  /** Returns the approximate, indicative output speed when it was measured. */
23996
24020
  function indicativeTokensPerSecond(modelId) {
@@ -27013,6 +27037,7 @@ function shimDefaultsToXhigh(id) {
27013
27037
  * live tool list would be a silent regression (the snippet would name
27014
27038
  * a tool the live catalog doesn't expose).
27015
27039
  */
27040
+ const REVIEW_FAST_DEFAULT_MODEL = "gemini-3.7-flash";
27016
27041
  /**
27017
27042
  * Gate for the `stand_in` tool.
27018
27043
  *
@@ -27021,9 +27046,8 @@ function shimDefaultsToXhigh(id) {
27021
27046
  * - an OpenAI frontier model (`gpt-5.6-sol`, else `gpt-5.5` — see
27022
27047
  * `resolveOpenAiFrontier`)
27023
27048
  * - `claude-opus-5` (stand_in's Anthropic slot)
27024
- * - any `gemini-3.X.*pro` (gemini_critic's model family — matches the
27025
- * same regex `geminiAvailable()` uses, so the gate stays in sync if
27026
- * the GA slug renames `gemini-3.1-pro-preview` → `gemini-3.1-pro`)
27049
+ * - the preferred Gemini reviewer model (`gemini-3.1-pro-preview`, falling
27050
+ * back to `gemini-3.7-flash` after the preview's 2026-09-01 removal)
27027
27051
  *
27028
27052
  * If any one is missing, `stand_in` is dropped from `tools/list` AND
27029
27053
  * fails `tools/call` with -32601 (mirroring the `worker` capability's
@@ -27032,10 +27056,47 @@ function shimDefaultsToXhigh(id) {
27032
27056
  * `claude-opus-5` is a single-segment slug (dotted == dashed), so the
27033
27057
  * catalog probe matches Copilot's actual id shape directly.
27034
27058
  */
27035
- function geminiAvailable(source = state) {
27059
+ /**
27060
+ * Any live-catalog model matching Google's `gemini-3.x-pro` family, excluding
27061
+ * the two known literals — catches a GA rename of the preview slug (e.g.
27062
+ * `gemini-3.1-pro-preview` -> `gemini-3.1-pro`) so a vendor rename doesn't
27063
+ * silently downgrade every Gemini-gated resolver to the flash fallback while a
27064
+ * real pro-tier successor is actually present in the catalog. This is the
27065
+ * same regex the removed `geminiAvailable()` used, for the same reason —
27066
+ * losing it here was a real regression caught in review, not a deliberate
27067
+ * simplification.
27068
+ */
27069
+ function findGeminiProGaRename(models) {
27070
+ return models.find((m) => /^gemini-3\..*pro/i.test(m.id) && m.id !== "gemini-3.1-pro-preview" && m.id !== "gemini-3.7-flash")?.id;
27071
+ }
27072
+ function resolveGeminiReviewModel(source = state) {
27036
27073
  const models = source.models?.data;
27037
- if (!models) return false;
27038
- return models.some((m) => /^gemini-3\..*pro/i.test(m.id));
27074
+ if (!models) return void 0;
27075
+ if (models.some((m) => m.id === "gemini-3.1-pro-preview")) return GEMINI_REVIEW_DEFAULT_MODEL;
27076
+ const gaRename = findGeminiProGaRename(models);
27077
+ if (gaRename) return gaRename;
27078
+ if (models.some((m) => m.id === "gemini-3.7-flash")) return REVIEW_FAST_DEFAULT_MODEL;
27079
+ }
27080
+ /**
27081
+ * Gemini review candidates in preference order, for resolvers that ALSO need
27082
+ * `firstPresentInCatalog`'s `requireToolCalls`/`minContextTokens` enforcement
27083
+ * (`resolveGeminiReviewModel()` only checks id presence, not those capability
27084
+ * flags). Mirrors `resolveGeminiReviewModel()`'s own preference order: the
27085
+ * known preview id, then a GA rename of it, then the flash fallback — kept as
27086
+ * a shared helper so `reviewerModel()`/`brainstormModel()` can't drift from
27087
+ * `resolveGeminiReviewModel()`'s GA-rename handling the way the hardcoded
27088
+ * per-resolver chains did before this was extracted.
27089
+ */
27090
+ function geminiReviewChainCandidates() {
27091
+ const gaRename = findGeminiProGaRename(state.models?.data ?? []);
27092
+ return [
27093
+ GEMINI_REVIEW_DEFAULT_MODEL,
27094
+ ...gaRename ? [gaRename] : [],
27095
+ REVIEW_FAST_DEFAULT_MODEL
27096
+ ];
27097
+ }
27098
+ function geminiAvailable(source = state) {
27099
+ return resolveGeminiReviewModel(source) != null;
27039
27100
  }
27040
27101
  /**
27041
27102
  * First id in `chain` that is present in the live catalog. With
@@ -27107,7 +27168,7 @@ function nativeSubagentModel() {
27107
27168
  * was one model checking its own output. Not merely the same lab: the same
27108
27169
  * model. Two independent blind audits flagged it, and the repo already applies
27109
27170
  * the opposite rule one layer down, where `worker-review` runs
27110
- * `REVIEW_DEFAULT_MODEL` precisely so the reviewer's lab is decorrelated from the
27171
+ * `GEMINI_REVIEW_DEFAULT_MODEL` precisely so the reviewer's lab is decorrelated from the
27111
27172
  * producer's.
27112
27173
  *
27113
27174
  * The Anthropic lead and the OpenAI-frontier `implementer` are the two producers
@@ -27115,7 +27176,7 @@ function nativeSubagentModel() {
27115
27176
  * frontier remains the fallback: a same-lab reviewer still beats no reviewer.
27116
27177
  */
27117
27178
  function reviewerModel() {
27118
- return firstPresentInCatalog([REVIEW_DEFAULT_MODEL, ...OPENAI_FRONTIER_MODELS], { requireToolCalls: true });
27179
+ return firstPresentInCatalog([...geminiReviewChainCandidates(), ...OPENAI_FRONTIER_MODELS], { requireToolCalls: true });
27119
27180
  }
27120
27181
  /** Model for `brainstorm`. Absent → inherits the lead's model.
27121
27182
  *
@@ -27124,7 +27185,7 @@ function reviewerModel() {
27124
27185
  * `implementer`/`reviewer`, so a same-lab brainstormer would mostly restate
27125
27186
  * what the lead already thought of. */
27126
27187
  function brainstormModel() {
27127
- return firstPresentInCatalog([REVIEW_DEFAULT_MODEL, ...OPENAI_FRONTIER_MODELS], { requireToolCalls: true });
27188
+ return firstPresentInCatalog([...geminiReviewChainCandidates(), ...OPENAI_FRONTIER_MODELS], { requireToolCalls: true });
27128
27189
  }
27129
27190
  /** Model for `scribe`. Absent → inherits the lead's model.
27130
27191
  *
@@ -27146,18 +27207,24 @@ function scribeModel() {
27146
27207
  * impostor wearing the cheap agent's name.
27147
27208
  *
27148
27209
  * `gpt-5.6-luna` leads because it is the cheapest 1M-context model in the
27149
- * catalog; `gemini-3.6-flash` remains the cross-vendor fallback so an OpenAI-side
27210
+ * catalog; `gemini-3.7-flash` remains the cross-vendor fallback so an OpenAI-side
27150
27211
  * outage does not remove the scout. Both entries must continue advertising at
27151
27212
  * least 1M context so Claude Code's `[1m]` accounting remains honest if an
27152
27213
  * upstream catalog entry shrinks.
27153
27214
  *
27215
+ * The fallback moved off `gemini-3.6-flash` on 2026-08-13: `gemini-3.7-flash`
27216
+ * is strictly better on every axis this chain cares about — half the price
27217
+ * (75/375 vs 150/750 per 1M), materially faster (measured tool-call p50 ~1.2s
27218
+ * against 3.6's ~2.6s), same 1M window, same vendor, so the cross-vendor
27219
+ * property the fallback exists for is preserved.
27220
+ *
27154
27221
  * This chain deliberately uses literal ids rather than `EXPLORE_DEFAULT_MODEL`:
27155
27222
  * the explore worker default and scout's cross-vendor fallback are independent
27156
27223
  * policies, so retuning one must not silently collapse the other. There is no
27157
27224
  * 400K last resort. On a catalog carrying neither chain member, `scout` is
27158
27225
  * dropped rather than inheriting the lead or presenting a narrower-context agent.
27159
27226
  */
27160
- const SCOUT_MODEL_CHAIN = Object.freeze(["gpt-5.6-luna", "gemini-3.6-flash"]);
27227
+ const SCOUT_MODEL_CHAIN = Object.freeze(["gpt-5.6-luna", "gemini-3.7-flash"]);
27161
27228
  function scoutModel() {
27162
27229
  return firstPresentInCatalog(SCOUT_MODEL_CHAIN, {
27163
27230
  requireToolCalls: true,
@@ -27172,7 +27239,17 @@ function scoutModel() {
27172
27239
  * well-specified, mechanical changes at a lower tier. Both entries are 1M+;
27173
27240
  * their different speed and effort properties stay out of shared claims. */
27174
27241
  function implementerFastModel() {
27175
- return firstPresentInCatalog(["gpt-5.6-terra", REVIEW_DEFAULT_MODEL], {
27242
+ return firstPresentInCatalog(["gpt-5.6-terra", GEMINI_REVIEW_DEFAULT_MODEL], {
27243
+ requireToolCalls: true,
27244
+ minContextTokens: ONE_M_TOKENS
27245
+ });
27246
+ }
27247
+ /** Model for `reviewer-fast` — the cheaper Google review tier. Absent → the
27248
+ * agent is dropped. Single-entry by design: inheriting the lead or falling
27249
+ * across labs would defeat both its cost purpose and its decorrelation from
27250
+ * the OpenAI-backed implementer. */
27251
+ function reviewerFastModel() {
27252
+ return firstPresentInCatalog([REVIEW_FAST_DEFAULT_MODEL], {
27176
27253
  requireToolCalls: true,
27177
27254
  minContextTokens: ONE_M_TOKENS
27178
27255
  });
@@ -27473,6 +27550,7 @@ function resolveOpusCriticModel() {
27473
27550
  }
27474
27551
  function activePersonas() {
27475
27552
  return PERSONAS_READ.filter((p) => !p.requiresGeminiCatalog || geminiAvailable()).map((p) => {
27553
+ if (p.requiresGeminiCatalog) return resolveGeminiPersona(p, resolveGeminiReviewModel());
27476
27554
  if (p.toolNameHttp !== "opus_critic") return p;
27477
27555
  const model = resolveOpusCriticModel();
27478
27556
  const allowedEfforts = model === "claude-opus-5" ? [
@@ -32927,7 +33005,7 @@ function appendPlanReminder(messages, planState) {
32927
33005
  * gemini-3.1-pro-preview is pinned to `high` because the model rejects
32928
33006
  * `xhigh` at the wire with a Copilot 400. `high` is the realistic ceiling.
32929
33007
  */
32930
- const STAND_IN_MODELS = Object.freeze([
33008
+ const STAND_IN_MODELS_BASE = Object.freeze([
32931
33009
  {
32932
33010
  key: "gpt-5.6-sol",
32933
33011
  model: "gpt-5.6-sol",
@@ -32947,6 +33025,13 @@ const STAND_IN_MODELS = Object.freeze([
32947
33025
  effort: "high"
32948
33026
  }
32949
33027
  ]);
33028
+ function standInModels() {
33029
+ const geminiModel = resolveGeminiReviewModel();
33030
+ return STAND_IN_MODELS_BASE.map((config) => config.key === "gemini-3.1-pro-preview" ? {
33031
+ ...config,
33032
+ model: geminiModel ?? "gemini-3.7-flash"
33033
+ } : config);
33034
+ }
32950
33035
  const SYSTEM_PROMPT_R1 = `You are one of three frontier reasoning models the user has authorized to stand in for them on a bounded decision while they are unavailable. Your task: pick the best option from those provided.
32951
33036
 
32952
33037
  Respond with ONLY a single JSON object — no prose, no markdown fences, no preamble. Schema:
@@ -32998,7 +33083,7 @@ const RETRY_PROMPT_SUFFIX = `\n\nYour previous response was not valid JSON match
32998
33083
  async function runStandIn(input, signal) {
32999
33084
  const validIds = new Set(input.options.map((o) => o.id));
33000
33085
  const r1UserText = buildRound1UserText(input);
33001
- const r1 = await Promise.all(STAND_IN_MODELS.map((cfg) => callAndParse(cfg, SYSTEM_PROMPT_R1, r1UserText, validIds, signal)));
33086
+ const r1 = await Promise.all(standInModels().map((cfg) => callAndParse(cfg, SYSTEM_PROMPT_R1, r1UserText, validIds, signal)));
33002
33087
  const successfulR1 = r1.filter((r) => isVote(r.vote));
33003
33088
  const nmiR1 = gapAbstainVerdict(successfulR1, r1, null);
33004
33089
  if (nmiR1) return nmiR1;
@@ -33018,7 +33103,7 @@ async function runStandIn(input, signal) {
33018
33103
  notes: `Only ${successfulR1.length} of 3 models returned a parseable round-1 vote; insufficient signal to run round 2.`
33019
33104
  }, r1, null);
33020
33105
  const r2UserTextBase = buildRound2UserTextBase(input, r1);
33021
- const r2 = await Promise.all(STAND_IN_MODELS.map((cfg) => callAndParse(cfg, SYSTEM_PROMPT_R2, r2UserTextBase + `\n\nYou are ${cfg.key}. Reconsider and vote.`, validIds, signal)));
33106
+ const r2 = await Promise.all(standInModels().map((cfg) => callAndParse(cfg, SYSTEM_PROMPT_R2, r2UserTextBase + `\n\nYou are ${cfg.key}. Reconsider and vote.`, validIds, signal)));
33022
33107
  const successfulR2 = r2.filter((r) => isVote(r.vote));
33023
33108
  if (successfulR2.length < 2) return withDerivedNotes({
33024
33109
  verdict: "no_consensus",
@@ -33195,7 +33280,7 @@ function aggregateVotes(results) {
33195
33280
  topCount = count;
33196
33281
  topSumConfidence = sumConfidence;
33197
33282
  }
33198
- const total = STAND_IN_MODELS.length;
33283
+ const total = standInModels().length;
33199
33284
  if (topChoice && topCount === total) return {
33200
33285
  verdict: "consensus",
33201
33286
  winner: topChoice,
@@ -33246,7 +33331,7 @@ function gapAbstainVerdict(successful, r1, r2) {
33246
33331
  const gapVotes = successful.filter((r) => r.vote.choice === null && r.vote.needMoreInfo);
33247
33332
  if (gapVotes.length < 2) return null;
33248
33333
  const gaps = gapVotes.map((r) => `- ${r.key}: ${r.vote.needMoreInfo}`).join("\n");
33249
- const header = gapVotes.length === STAND_IN_MODELS.length ? "All three models reported they need more context to decide:" : `${gapVotes.length} of 3 models reported they need more context to decide:`;
33334
+ const header = gapVotes.length === standInModels().length ? "All three models reported they need more context to decide:" : `${gapVotes.length} of 3 models reported they need more context to decide:`;
33250
33335
  return withDerivedNotes({
33251
33336
  verdict: "need_more_info",
33252
33337
  recommendation: null,
@@ -33262,7 +33347,7 @@ function gapAbstainVerdict(successful, r1, r2) {
33262
33347
  */
33263
33348
  function freshestVotes(r1, r2) {
33264
33349
  const out = [];
33265
- for (const cfg of STAND_IN_MODELS) {
33350
+ for (const cfg of standInModels()) {
33266
33351
  const r2Entry = r2?.find((r) => r.key === cfg.key);
33267
33352
  const r1Entry = r1.find((r) => r.key === cfg.key);
33268
33353
  const vote = r2Entry && isVote(r2Entry.vote) ? r2Entry.vote : r1Entry && isVote(r1Entry.vote) ? r1Entry.vote : null;
@@ -33300,7 +33385,7 @@ function withDerivedNotes(result, r1, r2) {
33300
33385
  }
33301
33386
  function voteRecord(r1, r2) {
33302
33387
  const record = {};
33303
- for (const cfg of STAND_IN_MODELS) {
33388
+ for (const cfg of standInModels()) {
33304
33389
  const r1Entry = r1.find((r) => r.key === cfg.key);
33305
33390
  const r2Entry = r2?.find((r) => r.key === cfg.key) ?? null;
33306
33391
  record[cfg.key] = {
@@ -34529,7 +34614,7 @@ const PERSONAS_READ = Object.freeze([
34529
34614
  {
34530
34615
  agentName: "gemini-critic",
34531
34616
  toolNameHttp: "gemini_critic",
34532
- model: "gemini-3.1-pro-preview",
34617
+ model: GEMINI_REVIEW_DEFAULT_MODEL,
34533
34618
  endpoint: "/v1/chat/completions",
34534
34619
  description: "Adversarial third-lab critic backed by gemini-3.1-pro-preview (Google), strong on formal reasoning, invariants, proofs, and cross-checking another critic's conclusion. It reviews plans, designs, mathematical arguments, and large artifacts for assumption gaps or invariant failures, then returns a focused critique or no-material-objection style verdict. Use when codex_critic's result needs an independent lab check or when the artifact hinges on formal correctness. Not for line-level diff review, use gemini_reviewer or codex_reviewer; pass the artifact and constraints verbatim.",
34535
34620
  baseInstructions: GEMINI_CRITIC_BASE,
@@ -34565,7 +34650,7 @@ const PERSONAS_READ = Object.freeze([
34565
34650
  {
34566
34651
  agentName: "gemini-reviewer",
34567
34652
  toolNameHttp: "gemini_reviewer",
34568
- model: "gemini-3.1-pro-preview",
34653
+ model: GEMINI_REVIEW_DEFAULT_MODEL,
34569
34654
  endpoint: "/v1/chat/completions",
34570
34655
  description: "Line-level code reviewer backed by gemini-3.1-pro-preview (Google), providing second-lab coverage that catches a different slice of concrete-code defects than codex_reviewer. It reviews diffs, files, or function bodies and returns severity-ranked findings with file:line citations and suggested fixes. Use alongside codex_reviewer when a non-trivial diff benefits from cross-lab code-review coverage, especially around invariants or edge cases. Not for architecture or product-design review, use codex_critic or gemini_critic; pass the code artifact verbatim.",
34571
34656
  baseInstructions: GEMINI_REVIEWER_BASE,
@@ -34734,15 +34819,16 @@ function buildPeerAwarenessSnippet(opts) {
34734
34819
  const powerBrowseAvailable = opts.browseAvailable && opts.powerBrowseAvailable === true;
34735
34820
  const criticList = ["`codex_critic` (gpt-5.6-sol)", "`codex_reviewer` (gpt-5.3-codex)"];
34736
34821
  if (opts.geminiAvailable) {
34737
- criticList.push("`gemini_reviewer` (gemini-3.1-pro, line-level code review)");
34738
- criticList.push("`gemini_critic` (gemini-3.1-pro)");
34822
+ const geminiModel = opts.geminiModel ?? "gemini-3.1-pro-preview";
34823
+ criticList.push(`\`gemini_reviewer\` (${geminiModel}, line-level code review)`);
34824
+ criticList.push(`\`gemini_critic\` (${geminiModel})`);
34739
34825
  }
34740
34826
  criticList.push("`opus_critic` (Opus 5)");
34741
34827
  const codexCliClause = opts.codexCli ? " `mcp__codex-cli__codex` dispatches to `codex-implementer` (gpt-5.3-codex with workspace-write) for end-to-end coding tasks." : "";
34742
34828
  const para2Parts = [`\`mcp__${searchKey}__code\` is the one-stop code search (no extra model call). Its DEFAULT mode (or \`mode:"semantic"\`) ranks by MEANING via ColBERT over a per-workspace index, the first thing to reach for on intent/concept questions ("where is retry/backoff handled", "how does auth work"); when that index isn't ready it transparently falls back to lexical (the response \`source\` says which engine ran). Forced modes cover the rest: \`lexical\` (BM25F-ranked + tree-sitter, best for exact symbols), \`exact\`, \`regex\`, \`complete\` (exhaustive set), \`ast_pattern\`+\`ast_lang\` for multi-line AST shapes, \`scan\` for a whole-workspace symbol outline, \`multiline\` for cross-line regex. Multiple queries can run in a single turn. The index covers code-shaped files; for unstructured files (logs, \`.csv\`, \`.env*\`, config-only wiring), \`grep\`/\`glob\` still apply.`];
34743
34829
  if (opts.workerToolsAvailable) para2Parts.push(`\`worker-*\` are background Agent subagents (subagent_type) that run the matching worker in its own context and deliver the result as a completion notification, so a long run never blocks the turn: \`worker-explore\` (read-only research), \`worker-review\` (reads the code to verify a change or claim), \`worker-plan\` (ordered implementation plan), \`worker-implement\` (edit/write/bash; ALWAYS runs in an isolated git worktree and returns the diff via a saved patch file; for in-place edits use the \`implementer\` subagent), \`worker-test\` (independent test author; also always worktree-isolated)${opts.browseAvailable ? ", `worker-browse` (autonomous browser agent driving a real browser)" : ""}. The raw \`mcp__${workersKey}__*\` tools they call are guarded (a direct main-thread call is redirected to the matching agent); Workers themselves have \`code_search\`.`);
34744
34830
  const catchAllClause = opts.generalPurposeFastAvailable === false ? "" : " Catch-all on a fast, economical non-lead model for work no specialist fits: `general-purpose-fast`.";
34745
- para2Parts.push(`Native subagents (Task), each in its own context so heavy work never fills yours: \`implementer\` (coding changes needing judgment or with ambiguous scope)${opts.implementerFastAvailable === false ? "" : ", `implementer-fast` (well-specified, mechanical coding changes)"}, \`reviewer\` (something exists and you want it assessed, including reproducing and root-causing a failure), \`brainstorm\` (you do not yet know which approach to take)${opts.scoutAvailable === false ? "" : ", `scout` (find or understand something in the repo, cheap)"}, \`scribe\` (docs and ADRs that trail the code).${catchAllClause}`);
34831
+ para2Parts.push(`Native subagents (Task), each in its own context so heavy work never fills yours: \`implementer\` (coding changes needing judgment or with ambiguous scope)${opts.implementerFastAvailable === false ? "" : ", `implementer-fast` (well-specified, mechanical coding changes)"}, \`reviewer\` (something exists and you want it assessed, including reproducing and root-causing a failure)${opts.reviewerFastAvailable === false ? "" : ", `reviewer-fast` (lower-stakes assessment on a cheaper cross-lab model)"}, \`brainstorm\` (you do not yet know which approach to take)${opts.scoutAvailable === false ? "" : ", `scout` (find or understand something in the repo, cheap)"}, \`scribe\` (docs and ADRs that trail the code).${catchAllClause}`);
34746
34832
  if (opts.workerToolsAvailable) para2Parts.push(`For a bounded, well-scoped implementation, prefer the \`implementer\` subagent over \`worker-implement\`; reach for \`worker-implement\` only when you specifically need git-worktree isolation, parallel variants, or a throwaway experiment.`);
34747
34833
  if (opts.workerToolsAvailable) para2Parts.push(`\`mcp__${orchestrateKey}__decompose\` composes an open-ended ask into a typed, VERIFIED workflow IR (a strong driver decorrelated by a cross-lab critic, so the decompose step isn't a single point of failure), and \`mcp__${orchestrateKey}__run_workflow\` executes that IR through a frozen kernel delivering max(orchestrated, baseline) over a sealed executable gate, so it never ships worse than a plain single-model run. \`mcp__${orchestrateKey}__verify_workflow\` checks an IR's floor invariants before you run it, and \`mcp__${orchestrateKey}__attest_step\` audits that a finished run's producers were each checked by a different lab. They suit non-trivial, role-separated asks; a trivial ask does not need them.`);
34748
34834
  else para2Parts.push(`\`mcp__${orchestrateKey}__verify_workflow\` statically checks a workflow IR's floor invariants and \`mcp__${orchestrateKey}__attest_step\` audits a run's cross-lab lineage (the \`decompose\`/\`run_workflow\` composer + kernel need the worker backend, unavailable here).`);
@@ -34787,6 +34873,7 @@ function buildPeerAwarenessSummary(opts) {
34787
34873
  renderNative("implementer"),
34788
34874
  opts.implementerFastAvailable === false ? void 0 : renderNative("implementer-fast"),
34789
34875
  renderNative("reviewer"),
34876
+ opts.reviewerFastAvailable === false ? void 0 : renderNative("reviewer-fast"),
34790
34877
  renderNative("brainstorm"),
34791
34878
  opts.scoutAvailable === false ? void 0 : renderNative("scout"),
34792
34879
  renderNative("scribe"),
@@ -34807,11 +34894,38 @@ function buildPeerAwarenessSummary(opts) {
34807
34894
  lines.push(`Each tool's own description carries when to use it and when not. The full per-tool inventory (models, gating, workers, skills) is in the "Peer review and advisor" section of your CLAUDE.md project instructions.`);
34808
34895
  return lines.join("\n");
34809
34896
  }
34897
+ /**
34898
+ * Applies the resolved Gemini review model to a persona requiring the Gemini
34899
+ * catalog: swaps `.model` and rewrites every literal occurrence of the
34900
+ * default id in `.description` so the two never disagree about which model
34901
+ * actually backs the tool. A mismatch here is user-visible — `tools/list`
34902
+ * would advertise "backed by gemini-3.1-pro-preview" while dispatch actually
34903
+ * ran the flash fallback — so every call site that resolves a
34904
+ * `requiresGeminiCatalog` persona MUST go through this helper rather than
34905
+ * setting `.model` directly (a prior draft of this fix did exactly that in
34906
+ * `routes/mcp/handler.ts`'s `activePersonas()` and left the description
34907
+ * stale). Relies on every `requiresGeminiCatalog` persona's description
34908
+ * literally containing `GEMINI_REVIEW_DEFAULT_MODEL`'s exact string — true
34909
+ * for both current entries (gemini-critic, gemini-reviewer); keep it true for
34910
+ * any future one, or `replaceAll` silently no-ops.
34911
+ */
34912
+ function resolveGeminiPersona(p, geminiModel) {
34913
+ const model = geminiModel ?? "gemini-3.1-pro-preview";
34914
+ return {
34915
+ ...p,
34916
+ model,
34917
+ description: p.description.replaceAll(GEMINI_REVIEW_DEFAULT_MODEL, model)
34918
+ };
34919
+ }
34810
34920
  /** Convenience: every persona that should be registered for the given mode. */
34811
34921
  function personasFor(opts) {
34812
34922
  const result = [];
34813
34923
  for (const p of PERSONAS_READ) {
34814
- if (p.requiresGeminiCatalog && !opts.geminiAvailable) continue;
34924
+ if (p.requiresGeminiCatalog) {
34925
+ if (!opts.geminiAvailable) continue;
34926
+ result.push(resolveGeminiPersona(p, opts.geminiModel));
34927
+ continue;
34928
+ }
34815
34929
  result.push(p);
34816
34930
  }
34817
34931
  if (opts.codexCli) for (const p of PERSONAS_WRITE) result.push(p);
@@ -35997,6 +36111,6 @@ function enumerateInjectedMcpToolNames(groupKeys, opts = {}) {
35997
36111
  return [...new Set(names)];
35998
36112
  }
35999
36113
  //#endregion
36000
- export { handleMcpDelete as $, resolveLeadSlugArg as $t, satisfiesMinVersion as A, hasSupportedBrowserInstalled as At, rememberThinkingHistoryRepair as B, collapsePathKeys as Bt, availableToolCommands as C, resolveMcpToolTimeoutMs as Ct, vscodeRipgrepPath as D, readResponseBodyCapped as Dt, toolbeltSkipSet as E, MAX_RESPONSE_BODY_BYTES as Et, injectAdvisorTool as F, warmTreeSitterPool as Ft, isControllerClosedError as G, DEFAULT_CODEX_MODEL as Gt, repairRejectedThinkingHistory as H, BUDGET_SMALL_FAST_CATALOG_ID as Ht, isAdvisorRequested as I, provisionTreeSitterAssets as It, relayAnthropicStream as J, UPSTREAM_FETCH_TIMEOUT_MS as Jt, logStreamError as K, DEFAULT_CODEX_MODEL_FALLBACKS as Kt, resolveAdvisorEffort as L, CONDENSED_OPERATING_SEQUENCE as Lt, ADVISOR_INTERNAL_TOOL_NAME as M, provisionAndIndexColbert as Mt, ADVISOR_TOOL_INSTRUCTIONS as N, extractTarGzMember as Nt, TOOLBELT_TOOLS$1 as O, parseJsonOrDiagnose as Ot, buildAdvisorStream as P, extractZipMember as Pt, clampEffort as Q, pickClaudeDefault as Qt, resolveAdvisorModel as R, DEFINITION_OF_GREATNESS as Rt, buildEnv as S, warnOnTokenPriceDrift as St, toolbeltEnabled as T, createChatCompletions as Tt, buildAnthropicErrorEvent as U, BUDGET_SMALL_FAST_SLUG as Ut, repairKnownThinkingHistory as V, toolbeltPathOverride as Vt, buildOpenAIErrorEvent as W, DEFAULT_CLAUDE_MODEL_FALLBACKS as Wt, UNKNOWN_EFFORT_ANCHOR as X, generateRandomPort as Xt, EFFORT_ORDER as Y, UPSTREAM_INACTIVITY_TIMEOUT_MS as Yt, bucketEffort as Z, isBudgetClaudeLead as Zt, appendPlanReminder as _, shimDefaultsToXhigh as _t, buildPeerAwarenessSnippet as a, withInstallLock as an, browserCompoundToolsEnabled as at, resolveWorkerRunOpts as b, getTokenCount as bt, personasFor as c, geminiAvailable as ct, EXPLORE_DEFAULT_MODEL as d, nativeSubagentModel as dt, upstreamAllowH2 as en, handleMcpPost as et, EXPLORE_DEFAULT_THINKING as f, reviewerModel as ft, TEST_DEFAULT_MODEL as g, workerToolsEnabled as gt, REVIEW_DEFAULT_MODEL as h, standInToolEnabled as ht, buildAgentPrompt as i, withOneMSuffixForLead as in, browseAgentEnabled as it, searchWeb as j, colbertDegradedWarning as jt, assetFor as k, provisionBrowserAssets as kt, BROWSE_DEFAULT_MODEL as l, generalPurposeFastModel as lt, PLAN_DEFAULT_MODEL as m, scribeModel as mt, MCP_GROUPS as n, classifyMessagesRoute as nn, artifactToolsEnabled as nt, buildPeerAwarenessSummary as o, browserToolsEnabled as ot, IMPLEMENT_DEFAULT_MODEL as p, scoutModel as pt, readIteratorWithTimeout as q, DEFAULT_PORT as qt, assertMcpToolSurfaceConsistent as r, withOneMSuffix as rn, brainstormModel as rt, enumerateInjectedMcpToolNames as s, fleetToolsEnabled as st, GROUP_META as t, upstreamMaxConnections as tn, agentToolsEnabled as tt, DEFAULT_MODEL_CHAIN as u, implementerFastModel as ut, resolveDefaultModel as v, countTokens as vt, buildToolbeltAwareness as w, createResponses as wt, runWorkerAgent as x, assembleResponsesPayload as xt, resolveModeDefaults as y, createMessages as yt, formatThinkingRepairDecline as z, shouldUseInsecureTls as zt };
36114
+ export { handleMcpDelete as $, generateRandomPort as $t, satisfiesMinVersion as A, readResponseBodyCapped as At, rememberThinkingHistoryRepair as B, CONDENSED_OPERATING_SEQUENCE as Bt, availableToolCommands as C, getTokenCount as Ct, vscodeRipgrepPath as D, createResponses as Dt, toolbeltSkipSet as E, resolveMcpToolTimeoutMs as Et, injectAdvisorTool as F, provisionAndIndexColbert as Ft, isControllerClosedError as G, BUDGET_SMALL_FAST_CATALOG_ID as Gt, repairRejectedThinkingHistory as H, shouldUseInsecureTls as Ht, isAdvisorRequested as I, extractTarGzMember as It, relayAnthropicStream as J, DEFAULT_CODEX_MODEL as Jt, logStreamError as K, BUDGET_SMALL_FAST_SLUG as Kt, resolveAdvisorEffort as L, extractZipMember as Lt, ADVISOR_INTERNAL_TOOL_NAME as M, provisionBrowserAssets as Mt, ADVISOR_TOOL_INSTRUCTIONS as N, hasSupportedBrowserInstalled as Nt, TOOLBELT_TOOLS$1 as O, createChatCompletions as Ot, buildAdvisorStream as P, colbertDegradedWarning as Pt, clampEffort as Q, UPSTREAM_INACTIVITY_TIMEOUT_MS as Qt, resolveAdvisorModel as R, warmTreeSitterPool as Rt, buildEnv as S, createMessages as St, toolbeltEnabled as T, warnOnTokenPriceDrift as Tt, buildAnthropicErrorEvent as U, collapsePathKeys as Ut, repairKnownThinkingHistory as V, DEFINITION_OF_GREATNESS as Vt, buildOpenAIErrorEvent as W, toolbeltPathOverride as Wt, UNKNOWN_EFFORT_ANCHOR as X, DEFAULT_PORT as Xt, EFFORT_ORDER as Y, DEFAULT_CODEX_MODEL_FALLBACKS as Yt, bucketEffort as Z, UPSTREAM_FETCH_TIMEOUT_MS as Zt, appendPlanReminder as _, scribeModel as _t, buildPeerAwarenessSnippet as a, classifyMessagesRoute as an, browseAgentEnabled as at, resolveWorkerRunOpts as b, shimDefaultsToXhigh as bt, personasFor as c, withInstallLock as cn, fleetToolsEnabled as ct, EXPLORE_DEFAULT_MODEL as d, implementerFastModel as dt, isBudgetClaudeLead as en, handleMcpPost as et, EXPLORE_DEFAULT_THINKING as f, nativeSubagentModel as ft, TEST_DEFAULT_MODEL as g, scoutModel as gt, REVIEW_DEFAULT_MODEL as h, reviewerModel as ht, buildAgentPrompt as i, upstreamMaxConnections as in, brainstormModel as it, searchWeb as j, parseJsonOrDiagnose as jt, assetFor as k, MAX_RESPONSE_BODY_BYTES as kt, BROWSE_DEFAULT_MODEL as l, geminiAvailable as lt, PLAN_DEFAULT_MODEL as m, reviewerFastModel as mt, MCP_GROUPS as n, resolveLeadSlugArg as nn, agentToolsEnabled as nt, buildPeerAwarenessSummary as o, withOneMSuffix as on, browserCompoundToolsEnabled as ot, IMPLEMENT_DEFAULT_MODEL as p, resolveGeminiReviewModel as pt, readIteratorWithTimeout as q, DEFAULT_CLAUDE_MODEL_FALLBACKS as qt, assertMcpToolSurfaceConsistent as r, upstreamAllowH2 as rn, artifactToolsEnabled as rt, enumerateInjectedMcpToolNames as s, withOneMSuffixForLead as sn, browserToolsEnabled as st, GROUP_META as t, pickClaudeDefault as tn, REVIEW_FAST_DEFAULT_MODEL as tt, DEFAULT_MODEL_CHAIN as u, generalPurposeFastModel as ut, resolveDefaultModel as v, standInToolEnabled as vt, buildToolbeltAwareness as w, assembleResponsesPayload as wt, runWorkerAgent as x, countTokens as xt, resolveModeDefaults as y, workerToolsEnabled as yt, formatThinkingRepairDecline as z, provisionTreeSitterAssets as zt };
36001
36115
 
36002
- //# sourceMappingURL=peer-mcp-personas-V6stFvpq.js.map
36116
+ //# sourceMappingURL=peer-mcp-personas-B5Wp6wIn.js.map