github-router 0.3.316 → 0.3.317

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 (98) hide show
  1. package/dist/{aic-ledger-BS47yb_C.js → aic-ledger-DY03LbBM.js} +2 -2
  2. package/dist/{aic-ledger-BS47yb_C.js.map → aic-ledger-DY03LbBM.js.map} +1 -1
  3. package/dist/{attribution-settings-jcsSeVur.js → attribution-settings-D6dAkP4e.js} +8 -8
  4. package/dist/{attribution-settings-jcsSeVur.js.map → attribution-settings-D6dAkP4e.js.map} +1 -1
  5. package/dist/{auth-JfxL9q7z.js → auth-Iun7ftd8.js} +3 -3
  6. package/dist/{auth-JfxL9q7z.js.map → auth-Iun7ftd8.js.map} +1 -1
  7. package/dist/browser-ext/manifest.json +1 -1
  8. package/dist/{check-usage-DXUEQzt_.js → check-usage-1c-0z3iy.js} +4 -4
  9. package/dist/{check-usage-DXUEQzt_.js.map → check-usage-1c-0z3iy.js.map} +1 -1
  10. package/dist/{claude-CJ4Nd2_3.js → claude-aZ6OaFP5.js} +92 -28
  11. package/dist/claude-aZ6OaFP5.js.map +1 -0
  12. package/dist/{codex-CwuLqNZF.js → codex-PTdWu7er.js} +5 -5
  13. package/dist/{codex-CwuLqNZF.js.map → codex-PTdWu7er.js.map} +1 -1
  14. package/dist/{copilot-discount-IbXR5A28.js → copilot-discount-C3jx9Q-o.js} +2 -2
  15. package/dist/{copilot-discount-IbXR5A28.js.map → copilot-discount-C3jx9Q-o.js.map} +1 -1
  16. package/dist/{debug-CA7pg8V9.js → debug-CDyXUPcC.js} +2 -2
  17. package/dist/{debug-CA7pg8V9.js.map → debug-CDyXUPcC.js.map} +1 -1
  18. package/dist/engine-D5GNXylB.js +2 -0
  19. package/dist/{gate-discovery-z04ywOzB.js → gate-discovery-B17pvgE0.js} +5 -5
  20. package/dist/{gate-discovery-z04ywOzB.js.map → gate-discovery-B17pvgE0.js.map} +1 -1
  21. package/dist/{get-copilot-usage-BMD_cJNT.js → get-copilot-usage-BWCAzmSc.js} +2 -2
  22. package/dist/{get-copilot-usage-BMD_cJNT.js.map → get-copilot-usage-BWCAzmSc.js.map} +1 -1
  23. package/dist/hooks.mjs +124 -117
  24. package/dist/hooks.sha256 +1 -1
  25. package/dist/{internal-aic-status-BN0xRLSF.js → internal-aic-status-BiblmImt.js} +13 -6
  26. package/dist/{internal-aic-status-BN0xRLSF.js.map → internal-aic-status-BiblmImt.js.map} +1 -1
  27. package/dist/{internal-artifact-open-B3stUu74.js → internal-artifact-open-CA1trJ15.js} +2 -2
  28. package/dist/{internal-artifact-open-B3stUu74.js.map → internal-artifact-open-CA1trJ15.js.map} +1 -1
  29. package/dist/{internal-fast-dispatch-guard-CAwYj_Yz.js → internal-fast-dispatch-guard-CZ4BZuAG.js} +2 -2
  30. package/dist/{internal-fast-dispatch-guard-CAwYj_Yz.js.map → internal-fast-dispatch-guard-CZ4BZuAG.js.map} +1 -1
  31. package/dist/{internal-fast-dispatch-guard-2QjUlhqO.js → internal-fast-dispatch-guard-D5kozMpo.js} +1 -1
  32. package/dist/{internal-first-mate-guard-VgnHBp0s.js → internal-first-mate-guard-B_or0eN3.js} +1 -1
  33. package/dist/{internal-first-mate-guard-B0rbLb0L.js → internal-first-mate-guard-CiFH6X1H.js} +3 -3
  34. package/dist/{internal-first-mate-guard-B0rbLb0L.js.map → internal-first-mate-guard-CiFH6X1H.js.map} +1 -1
  35. package/dist/{internal-max-dispatch-guard-Bz7a2Ntf.js → internal-max-dispatch-guard-BGOHRYRt.js} +1 -1
  36. package/dist/{internal-max-dispatch-guard-BNqQ2wMc.js → internal-max-dispatch-guard-CnBZxo5l.js} +2 -2
  37. package/dist/{internal-max-dispatch-guard-BNqQ2wMc.js.map → internal-max-dispatch-guard-CnBZxo5l.js.map} +1 -1
  38. package/dist/{internal-plan-review-QUvNZmMR.js → internal-plan-review-C73snnD8.js} +3 -3
  39. package/dist/{internal-plan-review-QUvNZmMR.js.map → internal-plan-review-C73snnD8.js.map} +1 -1
  40. package/dist/{internal-prompt-submit-fj5ccft_.js → internal-prompt-submit-dov4UvBo.js} +4 -4
  41. package/dist/{internal-prompt-submit-fj5ccft_.js.map → internal-prompt-submit-dov4UvBo.js.map} +1 -1
  42. package/dist/{internal-session-bind-0Hmak8PR.js → internal-session-bind-C3hrb9rP.js} +2 -2
  43. package/dist/{internal-session-bind-0Hmak8PR.js.map → internal-session-bind-C3hrb9rP.js.map} +1 -1
  44. package/dist/{internal-stop-hook-UN1JHtjj.js → internal-stop-hook-DZ6CCP4C.js} +5 -5
  45. package/dist/{internal-stop-hook-UN1JHtjj.js.map → internal-stop-hook-DZ6CCP4C.js.map} +1 -1
  46. package/dist/{internal-stop-review-8v2llYDB.js → internal-stop-review-MBVYtrYS.js} +2 -2
  47. package/dist/{internal-stop-review-8v2llYDB.js.map → internal-stop-review-MBVYtrYS.js.map} +1 -1
  48. package/dist/{internal-worker-guard-BI4Pl0Ew.js → internal-worker-guard-dxGawAY3.js} +2 -2
  49. package/dist/{internal-worker-guard-BI4Pl0Ew.js.map → internal-worker-guard-dxGawAY3.js.map} +1 -1
  50. package/dist/{internal-workspace-header-kg9FoNXK.js → internal-workspace-header-_aEXOz5q.js} +2 -2
  51. package/dist/{internal-workspace-header-kg9FoNXK.js.map → internal-workspace-header-_aEXOz5q.js.map} +1 -1
  52. package/dist/{lifecycle-IwotwedG.js → lifecycle-CJB2BwSJ.js} +2 -2
  53. package/dist/{lifecycle-IwotwedG.js.map → lifecycle-CJB2BwSJ.js.map} +1 -1
  54. package/dist/lifecycle-D0KsoSqz.js +2 -0
  55. package/dist/lifecycle-DimEguJO.js +2 -0
  56. package/dist/{lifecycle-Cx1wVrLb.js → lifecycle-_BE0SnNs.js} +2 -2
  57. package/dist/{lifecycle-Cx1wVrLb.js.map → lifecycle-_BE0SnNs.js.map} +1 -1
  58. package/dist/main.js +20 -20
  59. package/dist/{mcp-workspace-header-BYgWioLH.js → mcp-workspace-header-mXRLE8kg.js} +2 -2
  60. package/dist/{mcp-workspace-header-BYgWioLH.js.map → mcp-workspace-header-mXRLE8kg.js.map} +1 -1
  61. package/dist/{models-CVzyU5mJ.js → models-CSFIVxAH.js} +3 -3
  62. package/dist/{models-CVzyU5mJ.js.map → models-CSFIVxAH.js.map} +1 -1
  63. package/dist/{orchestration-Dc3mO0G3.js → orchestration-B8kypXcZ.js} +2 -2
  64. package/dist/{orchestration-Dc3mO0G3.js.map → orchestration-B8kypXcZ.js.map} +1 -1
  65. package/dist/{paths-CMxlQEfQ.js → paths-CHBAj_t9.js} +36 -4
  66. package/dist/{paths-CMxlQEfQ.js.map → paths-CHBAj_t9.js.map} +1 -1
  67. package/dist/paths-eHoOwFzZ.js +2 -0
  68. package/dist/{peer-mcp-personas-CQ-0Piyr.js → peer-mcp-personas-CRMVuMVF.js} +37 -18
  69. package/dist/{peer-mcp-personas-CQ-0Piyr.js.map → peer-mcp-personas-CRMVuMVF.js.map} +1 -1
  70. package/dist/{plan-review-hook-BIMwWkh6.js → plan-review-hook-BMmw7wxR.js} +3 -3
  71. package/dist/{plan-review-hook-BIMwWkh6.js.map → plan-review-hook-BMmw7wxR.js.map} +1 -1
  72. package/dist/{prompt-submit-hook-BcFpjHXg.js → prompt-submit-hook-CGgT5m4Q.js} +3 -3
  73. package/dist/{prompt-submit-hook-BcFpjHXg.js.map → prompt-submit-hook-CGgT5m4Q.js.map} +1 -1
  74. package/dist/{provision-_R7ZMygj.js → provision-Bn8-NDp7.js} +4 -4
  75. package/dist/{provision-_R7ZMygj.js.map → provision-Bn8-NDp7.js.map} +1 -1
  76. package/dist/{self-invocation-cRl4RqfW.js → self-invocation-DahN1gw9.js} +2 -2
  77. package/dist/{self-invocation-cRl4RqfW.js.map → self-invocation-DahN1gw9.js.map} +1 -1
  78. package/dist/{serve-DU66K5kv.js → serve-CX4Ifk5p.js} +12 -12
  79. package/dist/{serve-DU66K5kv.js.map → serve-CX4Ifk5p.js.map} +1 -1
  80. package/dist/{server-setup-iLG8LrfL.js → server-setup-0PaS4m2B.js} +98 -48
  81. package/dist/server-setup-0PaS4m2B.js.map +1 -0
  82. package/dist/{start-DQTcm0o_.js → start-Bz_559ua.js} +3 -3
  83. package/dist/{start-DQTcm0o_.js.map → start-Bz_559ua.js.map} +1 -1
  84. package/dist/{stop-gate-hook-BUCxa5Kc.js → stop-gate-hook-D7N759TG.js} +72 -4
  85. package/dist/{stop-gate-hook-BUCxa5Kc.js.map → stop-gate-hook-D7N759TG.js.map} +1 -1
  86. package/dist/{stop-gate-policy--bpyxxXU.js → stop-gate-policy-C0gt04R0.js} +2 -2
  87. package/dist/{stop-gate-policy--bpyxxXU.js.map → stop-gate-policy-C0gt04R0.js.map} +1 -1
  88. package/dist/{token-C1gthnbV.js → token-86uk6y4P.js} +2 -2
  89. package/dist/{token-C1gthnbV.js.map → token-86uk6y4P.js.map} +1 -1
  90. package/dist/{worker-dispatch-DMIdrlsF.js → worker-dispatch-B-OA7tvU.js} +2 -2
  91. package/dist/{worker-dispatch-DMIdrlsF.js.map → worker-dispatch-B-OA7tvU.js.map} +1 -1
  92. package/package.json +1 -1
  93. package/dist/claude-CJ4Nd2_3.js.map +0 -1
  94. package/dist/engine-DwrxceOS.js +0 -2
  95. package/dist/lifecycle-BpqAyaAj.js +0 -2
  96. package/dist/lifecycle-CL2WiyeQ.js +0 -2
  97. package/dist/paths-BXXCVFvA.js +0 -2
  98. package/dist/server-setup-iLG8LrfL.js.map +0 -1
@@ -1,13 +1,13 @@
1
- import { $ as EFFORT_ORDER, $t as parseJsonOrDiagnose, An as oneMContextDisabled, B as resolveAdvisorEffort, Bn as CHEAP_PROFILE_MODELS, Bt as getTextTokenCount, Cn as isBudgetClaudeLead, D as toolbeltEnabled, Dn as upstreamMaxConnections, En as upstreamAllowH2, F as ADVISOR_TOOL_INSTRUCTIONS, Fn as CHEAPEST_PROFILE_NATIVE_AGENT_NAMES, G as repairKnownThinkingHistory, Gn as withInstallLock, H as resolveCheapestAdvisorModel, Ht as getTokenizerFromModel, I as FAST_ADVISOR_TOOL_INSTRUCTIONS, J as buildOpenAIErrorEvent, Jt as resolveMcpToolTimeoutMs, K as repairRejectedThinkingHistory, Kt as assembleResponsesPayload, L as buildAdvisorStream, Lt as shimDefaultsToXhigh, Mn as withOneMSuffixForLead, N as searchWeb, Nn as CHEAPEST_PROFILE_ADVISOR_CLIENT_MODEL, On as classifyMessagesRoute, P as ADVISOR_INTERNAL_TOOL_NAME, Pn as CHEAPEST_PROFILE_MODELS, Q as relayAnthropicStream, Qt as readResponseBodyCapped, R as injectAdvisorTool, Rn as CHEAPEST_PROFILE_SUBAGENT_CONTEXT_TOKENS, Rt as countTokens, Sn as generateRandomPort, U as formatThinkingRepairDecline, Ut as findLaunchBySecret, V as resolveAdvisorModel, Vn as CHEAP_PROFILE_NATIVE_AGENT_NAMES, Vt as getTokenCount, W as rememberThinkingHistoryRepair, Wn as CHEAP_PROFILE_SUBAGENT_CONTEXT_TOKENS, X as logStreamError, Xt as createChatCompletions, Y as isControllerClosedError, Yt as createResponses, Z as readIteratorWithTimeout, Zt as MAX_RESPONSE_BODY_BYTES, at as agentToolsEnabled, bn as UPSTREAM_FETCH_TIMEOUT_MS, cn as provisionTreeSitterAssets, en as normalizeOpenAIUsage, et as UNKNOWN_EFFORT_ANCHOR, hn as BUDGET_SMALL_FAST_SLUG, i as assertMcpToolSurfaceConsistent, it as handleMcpPost, jn as withOneMSuffix, kn as catalogAdvertises1M, nt as clampEffort, pn as toolbeltPathOverride, q as buildAnthropicErrorEvent, qt as warnOnTokenPriceDrift, rt as handleMcpDelete, tt as bucketEffort, xn as UPSTREAM_INACTIVITY_TIMEOUT_MS, z as isAdvisorRequested, zn as CHEAP_PROFILE_ADVISOR_CLIENT_MODEL, zt as createMessages } from "./peer-mcp-personas-CQ-0Piyr.js";
1
+ import { $ as EFFORT_ORDER, $t as parseJsonOrDiagnose, An as oneMContextDisabled, B as resolveAdvisorEffort, Bn as CHEAP_PROFILE_MODELS, Bt as getTextTokenCount, Cn as isBudgetClaudeLead, D as toolbeltEnabled, Dn as upstreamMaxConnections, En as upstreamAllowH2, F as ADVISOR_TOOL_INSTRUCTIONS, Fn as CHEAPEST_PROFILE_NATIVE_AGENT_NAMES, G as repairKnownThinkingHistory, Gn as withInstallLock, H as resolveCheapestAdvisorModel, Ht as getTokenizerFromModel, I as FAST_ADVISOR_TOOL_INSTRUCTIONS, J as buildOpenAIErrorEvent, Jt as resolveMcpToolTimeoutMs, K as repairRejectedThinkingHistory, Kt as assembleResponsesPayload, L as buildAdvisorStream, Lt as shimDefaultsToXhigh, Mn as withOneMSuffixForLead, N as searchWeb, Nn as CHEAPEST_PROFILE_ADVISOR_CLIENT_MODEL, On as classifyMessagesRoute, P as ADVISOR_INTERNAL_TOOL_NAME, Pn as CHEAPEST_PROFILE_MODELS, Q as relayAnthropicStream, Qt as readResponseBodyCapped, R as injectAdvisorTool, Rn as CHEAPEST_PROFILE_SUBAGENT_CONTEXT_TOKENS, Rt as countTokens, Sn as generateRandomPort, U as formatThinkingRepairDecline, Ut as findLaunchBySecret, V as resolveAdvisorModel, Vn as CHEAP_PROFILE_NATIVE_AGENT_NAMES, Vt as getTokenCount, W as rememberThinkingHistoryRepair, Wn as CHEAP_PROFILE_SUBAGENT_CONTEXT_TOKENS, X as logStreamError, Xt as createChatCompletions, Y as isControllerClosedError, Yt as createResponses, Z as readIteratorWithTimeout, Zt as MAX_RESPONSE_BODY_BYTES, at as agentToolsEnabled, bn as UPSTREAM_FETCH_TIMEOUT_MS, cn as provisionTreeSitterAssets, en as normalizeOpenAIUsage, et as UNKNOWN_EFFORT_ANCHOR, hn as BUDGET_SMALL_FAST_SLUG, i as assertMcpToolSurfaceConsistent, it as handleMcpPost, jn as withOneMSuffix, kn as catalogAdvertises1M, nt as clampEffort, pn as toolbeltPathOverride, q as buildAnthropicErrorEvent, qt as warnOnTokenPriceDrift, rt as handleMcpDelete, tt as bucketEffort, xn as UPSTREAM_INACTIVITY_TIMEOUT_MS, z as isAdvisorRequested, zn as CHEAP_PROFILE_ADVISOR_CLIENT_MODEL, zt as createMessages } from "./peer-mcp-personas-CRMVuMVF.js";
2
2
  import { t as getPackageVersion } from "./version-C8x2hQrZ.js";
3
- import { i as ensurePaths, t as PATHS } from "./paths-CMxlQEfQ.js";
3
+ import { i as ensurePaths, t as PATHS } from "./paths-CHBAj_t9.js";
4
4
  import { t as state } from "./state-BlMpEFAt.js";
5
- import { T as copilotHeaders, _ as forwardError, a as cacheCopilotVersion, c as filterBetaHeader, d as resolveModel, f as sleep, g as HTTPError, i as tryRefreshAndRetry, l as isNullish, n as setupGitHubAgentToken, o as cacheModels, r as setupGitHubToken, s as cacheVSCodeVersion, t as setupCopilotToken, w as copilotBaseUrl, y as fetchWithTransientRetry } from "./token-C1gthnbV.js";
6
- import { t as getCopilotUsage } from "./get-copilot-usage-BMD_cJNT.js";
5
+ import { T as copilotHeaders, _ as forwardError, a as cacheCopilotVersion, c as filterBetaHeader, d as resolveModel, f as sleep, g as HTTPError, i as tryRefreshAndRetry, l as isNullish, n as setupGitHubAgentToken, o as cacheModels, r as setupGitHubToken, s as cacheVSCodeVersion, t as setupCopilotToken, w as copilotBaseUrl, y as fetchWithTransientRetry } from "./token-86uk6y4P.js";
6
+ import { t as getCopilotUsage } from "./get-copilot-usage-BWCAzmSc.js";
7
7
  import { c as runCommandVoid, i as parseBoolEnv, o as resolveExecutable, r as killManagedTree, s as runCommandCapture } from "./exec-COUT4QsS.js";
8
8
  import { c as FAST_PROFILE_MODELS, l as FAST_PROFILE_NATIVE_AGENT_NAMES, r as FAST_PROFILE_ADVISOR_MODEL } from "./fast-profile-contract-_DhIWank.js";
9
9
  import { A as normalizeTrailingOneMSuffix, a as MAX_PROFILE_NATIVE_AGENT_NAMES, d as maxAdvisorPinIsValid, h as maxOpusModel, i as MAX_PROFILE_MODELS, j as stripTrailingOneMSuffix, k as fastEndpointForModel, l as maxAdvisorEffortForModel, n as MAX_PROFILE_ALLOWED_LEAD_MODEL_IDS, t as MAX_PROFILE_ADVISOR_INSTRUCTIONS, u as maxAdvisorModelFromPin, y as validateMaxProfilePrerequisites } from "./max-profile-contract-Bl7I_EOC.js";
10
- import { c as recordAic, d as extractCopilotUsage, f as formatAic, i as extractAndRecordAic, p as nanoAiuToCredits } from "./aic-ledger-BS47yb_C.js";
10
+ import { c as recordAic, d as extractCopilotUsage, f as formatAic, i as extractAndRecordAic, p as nanoAiuToCredits } from "./aic-ledger-DY03LbBM.js";
11
11
  import consola from "consola";
12
12
  import fs, { existsSync } from "node:fs";
13
13
  import path from "node:path";
@@ -1284,6 +1284,17 @@ async function renameSettingsWithRetry(temp, target) {
1284
1284
  await fs$1.rm(temp, { force: true }).catch(() => {});
1285
1285
  throw lastError;
1286
1286
  }
1287
+ /**
1288
+ * Profiles whose sessions run router-provided surfaces only. On these
1289
+ * launches a user-curated `modelPicker` in the (per-launch, disposable)
1290
+ * mirror is overwritten with the router rows rather than preserved: the
1291
+ * mirror is a snapshot copy, so the operator's real settings are never
1292
+ * touched, but a stale standard `[1m]` picker must not survive into a
1293
+ * 200K session's `/model` UI.
1294
+ */
1295
+ function routerWinsPicker(profile) {
1296
+ return profile === "fast" || profile === "cheap" || profile === "cheap1m" || profile === "cheapest";
1297
+ }
1287
1298
  function modelIdsFromExistingPicker(value) {
1288
1299
  if (!value || typeof value !== "object" || Array.isArray(value)) return [];
1289
1300
  const options = value.options;
@@ -1308,11 +1319,16 @@ async function injectModelPickerSettingsFile(settingsPath, profile) {
1308
1319
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error(`settings.json at ${settingsPath} is not a JSON object; refusing to overwrite`);
1309
1320
  existing = parsed;
1310
1321
  }
1311
- if ("modelPicker" in existing) return {
1312
- written: false,
1313
- reason: "user-set",
1314
- models: modelIdsFromExistingPicker(existing.modelPicker)
1315
- };
1322
+ let overwroteUserPicker = false;
1323
+ if ("modelPicker" in existing) {
1324
+ if (!routerWinsPicker(profile)) return {
1325
+ written: false,
1326
+ reason: "user-set",
1327
+ models: modelIdsFromExistingPicker(existing.modelPicker)
1328
+ };
1329
+ overwroteUserPicker = true;
1330
+ delete existing.modelPicker;
1331
+ }
1316
1332
  if (options.length === 0) return {
1317
1333
  written: false,
1318
1334
  reason: "no-models",
@@ -1337,6 +1353,7 @@ async function injectModelPickerSettingsFile(settingsPath, profile) {
1337
1353
  }
1338
1354
  return {
1339
1355
  written: true,
1356
+ ...overwroteUserPicker ? { reason: "router-overwrite" } : {},
1340
1357
  models: options.map((option) => option.model)
1341
1358
  };
1342
1359
  }
@@ -2196,7 +2213,7 @@ function collectToolFieldKeys(body) {
2196
2213
  //#endregion
2197
2214
  //#region package.json
2198
2215
  var name = "github-router";
2199
- var version = "0.3.316";
2216
+ var version = "0.3.317";
2200
2217
  //#endregion
2201
2218
  //#region src/lib/approval.ts
2202
2219
  const awaitApproval = async () => {
@@ -5028,7 +5045,9 @@ async function handleNonClaudeResponses(c, opts) {
5028
5045
  return stream;
5029
5046
  }
5030
5047
  const payload = parsedToResponsesPayload(parsed);
5031
- const anthropic = responsesResponseToAnthropicMessage(await createResponses(payload, opts.model?.requestHeaders, void 0, true), opts.modelId);
5048
+ const result = await createResponses(payload, opts.model?.requestHeaders, void 0, true);
5049
+ extractAndRecordAic(opts.modelId, result);
5050
+ const anthropic = responsesResponseToAnthropicMessage(result, opts.modelId);
5032
5051
  const usage = anthropic.usage;
5033
5052
  logRequest({
5034
5053
  method: "POST",
@@ -5084,7 +5103,9 @@ async function handleNonClaudeChat(c, opts) {
5084
5103
  return stream;
5085
5104
  }
5086
5105
  const payload = parsedToChatPayload(parsed);
5087
- const anthropic = chatResponseToAnthropicMessage(await createChatCompletions(payload, opts.model?.requestHeaders, void 0, true), opts.modelId);
5106
+ const result = await createChatCompletions(payload, opts.model?.requestHeaders, void 0, true);
5107
+ extractAndRecordAic(opts.modelId, result);
5108
+ const anthropic = chatResponseToAnthropicMessage(result, opts.modelId);
5088
5109
  const usage = anthropic.usage;
5089
5110
  logRequest({
5090
5111
  method: "POST",
@@ -5248,16 +5269,37 @@ Object.freeze([MAX_LUNA_HIGH_ALIAS_ID, MAX_LUNA_MAX_ALIAS_ID]);
5248
5269
  //#endregion
5249
5270
  //#region src/lib/fast-request-preprocess.ts
5250
5271
  const cheapFamily = (profileId) => profileId === "cheap" || profileId === "cheap1m" || profileId === "cheapest";
5272
+ const pinnedProfile = (profileId) => profileId === "fast" || cheapFamily(profileId);
5273
+ /**
5274
+ * Profiles whose every selectable `/model` row must stay at Claude Code's
5275
+ * 200K DEFAULT context window (bare id, no `[1m]` accounting bracket).
5276
+ * `fast` keeps 1M on lead and subagents by design; `cheap1m` keeps 1M on
5277
+ * the lead only (its subagents are bare-by-construction).
5278
+ */
5279
+ const bareEnforcedProfile = (profileId) => profileId === "cheap" || profileId === "cheapest";
5280
+ function explicitEffortOf(value) {
5281
+ return typeof value === "string" && value.trim() !== "" ? value : void 0;
5282
+ }
5251
5283
  /**
5252
5284
  * Apply authenticated fast/cheap-profile model and effort policy before
5253
5285
  * ordinary model resolution. Synthetic aliases are refused outside an
5254
- * authenticated fast, cheap, or cheapest launch, so raw/BYO traffic cannot
5255
- * opt itself into private profile semantics. The cheap family (including
5256
- * cheapest) shares fast's effort mapping (same model-to-effort rows, just
5257
- * bare subagent slugs at the wiring layer), so this preprocess is shared.
5286
+ * authenticated pinned launch, so raw/BYO traffic cannot opt itself into
5287
+ * private profile semantics. The cheap family (including cheapest) shares
5288
+ * fast's effort mapping (same model-to-effort rows, just bare subagent
5289
+ * slugs at the wiring layer), so this preprocess is shared.
5258
5290
  * Note the reviewer differs: fast reviews on Sonnet 5/xhigh while cheap
5259
5291
  * reviews on Luna/max and cheapest reviews on Gemini/high — all rows exist
5260
5292
  * here, so each profile's reviewer resolves to its fixed effort.
5293
+ *
5294
+ * Pinned-profile isolation (fast/cheap/cheap1m/cheapest): only
5295
+ * router-provided models are accepted (anything else is `rejectedModel`).
5296
+ * Context: cheap/cheapest traffic is stripped to the bare 200K id;
5297
+ * cheap1m subagent traffic is stripped while its lead keeps 1M; fast
5298
+ * keeps 1M on both. Effort: picker changes apply to the lead session
5299
+ * only — lead requests keep an explicit `output_config.effort` when
5300
+ * present and fall back to the fixed mapping otherwise, while subagent
5301
+ * traffic (`x-claude-code-agent-id`) always receives its fixed
5302
+ * per-model effort.
5261
5303
  */
5262
5304
  function preprocessFastRequest(rawBody, launch, subagentRequest = false) {
5263
5305
  if (launch?.profileId === "max") return preprocessMaxRequest(rawBody, launch, subagentRequest);
@@ -5294,23 +5336,30 @@ function preprocessFastRequest(rawBody, launch, subagentRequest = false) {
5294
5336
  modified: false
5295
5337
  };
5296
5338
  const { base: bare } = stripTrailingOneMSuffix(originalModel);
5297
- let effort;
5339
+ const profileId = launch?.profileId;
5340
+ const stripBracket = bareEnforcedProfile(profileId) || profileId === "cheap1m" && subagentRequest;
5341
+ const leadCallerControlled = pinnedProfile(profileId) && !subagentRequest;
5342
+ let fixedEffort;
5298
5343
  if (alias) {
5299
- effort = alias.absentEffortDefault;
5344
+ fixedEffort = alias.absentEffortDefault;
5300
5345
  parsed.model = canonicalizeAliasModel(originalModel);
5301
- } else if (bare === "gpt-5.6-luna") effort = "max";
5302
- else if (bare === "gpt-5.6-sol") effort = "high";
5303
- else if (bare === "grok-4.6") effort = "medium";
5304
- else if (bare === "gemini-3.8-flash") effort = "high";
5305
- else if (bare === "claude-sonnet-5") effort = "xhigh";
5306
- else if (bare === "claude-opus-5") effort = "high";
5307
- if (!effort && !alias) return {
5346
+ } else if (bare === "gpt-5.6-luna") fixedEffort = "max";
5347
+ else if (bare === "gpt-5.6-sol") fixedEffort = "high";
5348
+ else if (bare === "grok-4.6") fixedEffort = "medium";
5349
+ else if (bare === "gemini-3.8-flash") fixedEffort = "high";
5350
+ else if (bare === "claude-sonnet-5") fixedEffort = "xhigh";
5351
+ else if (bare === "claude-opus-5") fixedEffort = "high";
5352
+ if (!fixedEffort && !alias) return {
5308
5353
  body: rawBody,
5309
5354
  originalModel,
5310
5355
  modified: false,
5311
5356
  rejectedModel: originalModel
5312
5357
  };
5358
+ if (stripBracket && typeof parsed.model === "string") parsed.model = stripTrailingOneMSuffix(parsed.model).base;
5359
+ else if (stripBracket) parsed.model = bare;
5313
5360
  const outputConfig = parsed.output_config && typeof parsed.output_config === "object" ? parsed.output_config : {};
5361
+ const explicitEffort = explicitEffortOf(outputConfig.effort);
5362
+ const effort = leadCallerControlled && explicitEffort ? explicitEffort : fixedEffort;
5314
5363
  parsed.output_config = {
5315
5364
  ...outputConfig,
5316
5365
  effort
@@ -7513,22 +7562,23 @@ function getClaudeCodeEnvVars(serverUrl, model, launchProfileId = "standard", pi
7513
7562
  const isFastProfile = launchProfileId === "fast";
7514
7563
  const isMaxProfile = launchProfileId === "max";
7515
7564
  const isCheapProfile = launchProfileId === "cheap" || launchProfileId === "cheap1m" || launchProfileId === "cheapest";
7565
+ const routerWinsTiers = isFastProfile || isCheapProfile;
7516
7566
  const smallFastModel = isMaxProfile ? MAX_LUNA_HIGH_ALIAS_ID : isFastProfile ? LUNA_HAIKU_ALIAS_ID : isCheapProfile ? LUNA_HAIKU_ALIAS_ID : isBudgetClaudeLead(model) && (state.models?.data?.some((m) => m.id === "claude-haiku-4.5") ?? false) ? BUDGET_SMALL_FAST_SLUG : "claude-sonnet-5";
7517
- if (process.env.ANTHROPIC_SMALL_FAST_MODEL === void 0) vars.ANTHROPIC_SMALL_FAST_MODEL = (isFastProfile || isMaxProfile) && !isCheapProfile ? oneMSuffixForAlias(smallFastModel) : smallFastModel;
7567
+ if (process.env.ANTHROPIC_SMALL_FAST_MODEL === void 0 || routerWinsTiers) vars.ANTHROPIC_SMALL_FAST_MODEL = (isFastProfile || isMaxProfile) && !isCheapProfile ? oneMSuffixForAlias(smallFastModel) : smallFastModel;
7518
7568
  const seedTierRow = (modelKey, nameKey, bareSlug) => {
7519
7569
  if (process.env[modelKey] !== void 0) return;
7520
7570
  vars[modelKey] = withOneMSuffixForLead(bareSlug);
7521
7571
  if (process.env[nameKey] === void 0) vars[nameKey] = bareSlug;
7522
7572
  };
7523
- const seedFastAliasTierRow = (modelKey, nameKey, aliasId, displayName) => {
7524
- if (process.env[modelKey] !== void 0) return;
7573
+ const seedFastAliasTierRow = (modelKey, nameKey, aliasId, displayName, force = false) => {
7574
+ if (!force && process.env[modelKey] !== void 0) return;
7525
7575
  vars[modelKey] = oneMSuffixForAlias(aliasId);
7526
- if (process.env[nameKey] === void 0) vars[nameKey] = displayName;
7576
+ if (force || process.env[nameKey] === void 0) vars[nameKey] = displayName;
7527
7577
  };
7528
- const seedCheapAliasTierRow = (modelKey, nameKey, aliasId, displayName) => {
7529
- if (process.env[modelKey] !== void 0) return;
7578
+ const seedCheapAliasTierRow = (modelKey, nameKey, aliasId, displayName, force = false) => {
7579
+ if (!force && process.env[modelKey] !== void 0) return;
7530
7580
  vars[modelKey] = aliasId;
7531
- if (process.env[nameKey] === void 0) vars[nameKey] = displayName;
7581
+ if (force || process.env[nameKey] === void 0) vars[nameKey] = displayName;
7532
7582
  };
7533
7583
  if (isMaxProfile) {
7534
7584
  const seedMaxRow = (modelKey, nameKey, id) => {
@@ -7544,26 +7594,26 @@ function getClaudeCodeEnvVars(serverUrl, model, launchProfileId = "standard", pi
7544
7594
  if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME = "GPT-5.6 Sol";
7545
7595
  }
7546
7596
  } else if (isCheapProfile) {
7547
- seedCheapAliasTierRow("ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", LUNA_SONNET_ALIAS_ID, "GPT-5.6 Luna (xhigh)");
7548
- seedCheapAliasTierRow("ANTHROPIC_DEFAULT_HAIKU_MODEL", "ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME", LUNA_HAIKU_ALIAS_ID, "GPT-5.6 Luna (high)");
7597
+ seedCheapAliasTierRow("ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", LUNA_SONNET_ALIAS_ID, "GPT-5.6 Luna (xhigh)", routerWinsTiers);
7598
+ seedCheapAliasTierRow("ANTHROPIC_DEFAULT_HAIKU_MODEL", "ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME", LUNA_HAIKU_ALIAS_ID, "GPT-5.6 Luna (high)", routerWinsTiers);
7549
7599
  const cheapAliasCapabilities = "effort,xhigh_effort,max_effort,thinking,adaptive_thinking,interleaved_thinking";
7550
- if (process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES = cheapAliasCapabilities;
7551
- if (process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES = cheapAliasCapabilities;
7552
- if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION === void 0) {
7600
+ if (routerWinsTiers || process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES = cheapAliasCapabilities;
7601
+ if (routerWinsTiers || process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES = cheapAliasCapabilities;
7602
+ if (routerWinsTiers || process.env.ANTHROPIC_CUSTOM_MODEL_OPTION === void 0) {
7553
7603
  vars.ANTHROPIC_CUSTOM_MODEL_OPTION = LUNA_DRIVER_ALIAS_ID;
7554
- if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME = "GPT-5.6 Luna (max)";
7555
- if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES = cheapAliasCapabilities;
7604
+ if (routerWinsTiers || process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME = "GPT-5.6 Luna (max)";
7605
+ if (routerWinsTiers || process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES = cheapAliasCapabilities;
7556
7606
  }
7557
7607
  } else if (isFastProfile) {
7558
- seedFastAliasTierRow("ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", LUNA_SONNET_ALIAS_ID, "GPT-5.6 Luna (xhigh)");
7559
- seedFastAliasTierRow("ANTHROPIC_DEFAULT_HAIKU_MODEL", "ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME", LUNA_HAIKU_ALIAS_ID, "GPT-5.6 Luna (high)");
7608
+ seedFastAliasTierRow("ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", LUNA_SONNET_ALIAS_ID, "GPT-5.6 Luna (xhigh)", routerWinsTiers);
7609
+ seedFastAliasTierRow("ANTHROPIC_DEFAULT_HAIKU_MODEL", "ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME", LUNA_HAIKU_ALIAS_ID, "GPT-5.6 Luna (high)", routerWinsTiers);
7560
7610
  const fastAliasCapabilities = "effort,xhigh_effort,max_effort,thinking,adaptive_thinking,interleaved_thinking";
7561
- if (process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES = fastAliasCapabilities;
7562
- if (process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES = fastAliasCapabilities;
7563
- if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION === void 0) {
7611
+ if (routerWinsTiers || process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES = fastAliasCapabilities;
7612
+ if (routerWinsTiers || process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES = fastAliasCapabilities;
7613
+ if (routerWinsTiers || process.env.ANTHROPIC_CUSTOM_MODEL_OPTION === void 0) {
7564
7614
  vars.ANTHROPIC_CUSTOM_MODEL_OPTION = oneMSuffixForAlias(LUNA_DRIVER_ALIAS_ID);
7565
- if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME = "GPT-5.6 Luna (max)";
7566
- if (process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES = fastAliasCapabilities;
7615
+ if (routerWinsTiers || process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME = "GPT-5.6 Luna (max)";
7616
+ if (routerWinsTiers || process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES === void 0) vars.ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES = fastAliasCapabilities;
7567
7617
  }
7568
7618
  } else {
7569
7619
  seedTierRow("ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", "claude-sonnet-5");
@@ -7662,4 +7712,4 @@ function getCodexEnvVars(serverUrl) {
7662
7712
  //#endregion
7663
7713
  export { validateMaxProfileLaunch as C, updateClaude as E, validateFastProfilePrerequisites as S, checkClaudeVersion as T, profileDescriptor as _, sharedServerArgs as a, validateCheapProfilePrerequisites as b, stopKeepAwake as c, enableFileLogging as d, LUNA_SCOUT_ALIAS_ID as f, formatFastPrerequisiteFailure as g, formatCheapestPrerequisiteFailure as h, setupAndServe as i, injectModelPickerSettingsFile as l, formatCheapPrerequisiteFailure as m, getCodexEnvVars as n, LAUNCH_SECRET_HEADER as o, formatCheap1mPrerequisiteFailure as p, parseSharedArgs as r, startKeepAwake as s, getClaudeCodeEnvVars as t, listModelsForEndpoint as u, resolveLaunchProfile as v, runSelfUpdate as w, validateCheapestProfilePrerequisites as x, validateCheap1mProfilePrerequisites as y };
7664
7714
 
7665
- //# sourceMappingURL=server-setup-iLG8LrfL.js.map
7715
+ //# sourceMappingURL=server-setup-0PaS4m2B.js.map