github-router 0.3.292 → 0.3.295

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 (93) hide show
  1. package/dist/{attribution-settings-CpLUCi8R.js → attribution-settings-pkIop1NU.js} +69 -30
  2. package/dist/attribution-settings-pkIop1NU.js.map +1 -0
  3. package/dist/{auth-BwUHopJz.js → auth-CluG5e-l.js} +3 -3
  4. package/dist/{auth-BwUHopJz.js.map → auth-CluG5e-l.js.map} +1 -1
  5. package/dist/browser-ext/manifest.json +1 -1
  6. package/dist/{check-usage-BTda5753.js → check-usage-iOzfnKJe.js} +4 -4
  7. package/dist/{check-usage-BTda5753.js.map → check-usage-iOzfnKJe.js.map} +1 -1
  8. package/dist/{claude-_DYGKCw8.js → claude-DNmxk-Rm.js} +162 -42
  9. package/dist/claude-DNmxk-Rm.js.map +1 -0
  10. package/dist/{codex-rTJ8jW5G.js → codex-Dl4gpHn-.js} +5 -5
  11. package/dist/{codex-rTJ8jW5G.js.map → codex-Dl4gpHn-.js.map} +1 -1
  12. package/dist/{debug-B3UrZTHQ.js → debug-DsEwleGg.js} +2 -2
  13. package/dist/{debug-B3UrZTHQ.js.map → debug-DsEwleGg.js.map} +1 -1
  14. package/dist/engine-XnluJUs6.js +2 -0
  15. package/dist/{gate-discovery-Bjar5dgv.js → gate-discovery-WcduofL4.js} +5 -5
  16. package/dist/{gate-discovery-Bjar5dgv.js.map → gate-discovery-WcduofL4.js.map} +1 -1
  17. package/dist/{get-copilot-usage-CRrf1ZSC.js → get-copilot-usage-B7Z4XVWj.js} +2 -2
  18. package/dist/{get-copilot-usage-CRrf1ZSC.js.map → get-copilot-usage-B7Z4XVWj.js.map} +1 -1
  19. package/dist/hooks.mjs +180 -3
  20. package/dist/hooks.sha256 +1 -1
  21. package/dist/{internal-artifact-open-BsEQRvDi.js → internal-artifact-open-D6tKMg8v.js} +2 -2
  22. package/dist/{internal-artifact-open-BsEQRvDi.js.map → internal-artifact-open-D6tKMg8v.js.map} +1 -1
  23. package/dist/internal-fast-dispatch-guard-CPlCrTlU.js +2 -0
  24. package/dist/internal-fast-dispatch-guard-Xyu17k9X.js +187 -0
  25. package/dist/internal-fast-dispatch-guard-Xyu17k9X.js.map +1 -0
  26. package/dist/{internal-first-mate-guard-CVFFJriA.js → internal-first-mate-guard-C9BV7J4U.js} +3 -3
  27. package/dist/{internal-first-mate-guard-CVFFJriA.js.map → internal-first-mate-guard-C9BV7J4U.js.map} +1 -1
  28. package/dist/{internal-first-mate-guard-DJdX6t48.js → internal-first-mate-guard-WJApyc8j.js} +1 -1
  29. package/dist/{internal-plan-review-8TKDLco6.js → internal-plan-review-t3PuNfuL.js} +3 -3
  30. package/dist/{internal-plan-review-8TKDLco6.js.map → internal-plan-review-t3PuNfuL.js.map} +1 -1
  31. package/dist/{internal-prompt-submit-Da7pxqua.js → internal-prompt-submit-C3KovHQG.js} +4 -4
  32. package/dist/{internal-prompt-submit-Da7pxqua.js.map → internal-prompt-submit-C3KovHQG.js.map} +1 -1
  33. package/dist/{internal-session-bind-BOFytA1f.js → internal-session-bind-d2uoja8I.js} +2 -2
  34. package/dist/{internal-session-bind-BOFytA1f.js.map → internal-session-bind-d2uoja8I.js.map} +1 -1
  35. package/dist/{internal-stop-hook-DrX2xlj0.js → internal-stop-hook-DJFtGCsE.js} +5 -5
  36. package/dist/{internal-stop-hook-DrX2xlj0.js.map → internal-stop-hook-DJFtGCsE.js.map} +1 -1
  37. package/dist/{internal-stop-review-CdouacHL.js → internal-stop-review-YtDUGXpX.js} +2 -2
  38. package/dist/{internal-stop-review-CdouacHL.js.map → internal-stop-review-YtDUGXpX.js.map} +1 -1
  39. package/dist/{internal-worker-guard-Bx-itoP8.js → internal-worker-guard-CdkeS9PN.js} +2 -2
  40. package/dist/{internal-worker-guard-Bx-itoP8.js.map → internal-worker-guard-CdkeS9PN.js.map} +1 -1
  41. package/dist/{internal-workspace-header-8WT0iB5K.js → internal-workspace-header-tuBXJV22.js} +2 -2
  42. package/dist/{internal-workspace-header-8WT0iB5K.js.map → internal-workspace-header-tuBXJV22.js.map} +1 -1
  43. package/dist/{lifecycle-nuOHfwgj.js → lifecycle-Bg6doY3-.js} +2 -2
  44. package/dist/{lifecycle-nuOHfwgj.js.map → lifecycle-Bg6doY3-.js.map} +1 -1
  45. package/dist/lifecycle-CGLt1cJQ.js +2 -0
  46. package/dist/{lifecycle-LeSfa7wH.js → lifecycle-CM9eTzvk.js} +2 -2
  47. package/dist/{lifecycle-LeSfa7wH.js.map → lifecycle-CM9eTzvk.js.map} +1 -1
  48. package/dist/lifecycle-DoUwpVDB.js +2 -0
  49. package/dist/main.js +19 -18
  50. package/dist/main.js.map +1 -1
  51. package/dist/{mcp-workspace-header-q34H_4wL.js → mcp-workspace-header-dERl2YTT.js} +2 -2
  52. package/dist/{mcp-workspace-header-q34H_4wL.js.map → mcp-workspace-header-dERl2YTT.js.map} +1 -1
  53. package/dist/{models-hhJcrZhr.js → models-DZ4hYsR7.js} +3 -3
  54. package/dist/{models-hhJcrZhr.js.map → models-DZ4hYsR7.js.map} +1 -1
  55. package/dist/{orchestration-pzbrKkgD.js → orchestration-BiGCEwbH.js} +2 -2
  56. package/dist/{orchestration-pzbrKkgD.js.map → orchestration-BiGCEwbH.js.map} +1 -1
  57. package/dist/{paths-BH4J7slC.js → paths-Ci485qSJ.js} +4 -4
  58. package/dist/{paths-BH4J7slC.js.map → paths-Ci485qSJ.js.map} +1 -1
  59. package/dist/paths-GD7bgGGy.js +2 -0
  60. package/dist/{peer-mcp-personas-CHbl6MwM.js → peer-mcp-personas-BwNtC8jt.js} +411 -84
  61. package/dist/peer-mcp-personas-BwNtC8jt.js.map +1 -0
  62. package/dist/{plan-review-hook-CfcanA7_.js → plan-review-hook-DuW0pSoM.js} +3 -3
  63. package/dist/{plan-review-hook-CfcanA7_.js.map → plan-review-hook-DuW0pSoM.js.map} +1 -1
  64. package/dist/{prompt-submit-hook-Bqf9ORgb.js → prompt-submit-hook-IMl7ssfr.js} +3 -3
  65. package/dist/{prompt-submit-hook-Bqf9ORgb.js.map → prompt-submit-hook-IMl7ssfr.js.map} +1 -1
  66. package/dist/{provision-BYFd9nPK.js → provision-DeNqzvSM.js} +4 -4
  67. package/dist/{provision-BYFd9nPK.js.map → provision-DeNqzvSM.js.map} +1 -1
  68. package/dist/{self-invocation-DhO1Z8iD.js → self-invocation-DAB_od0C.js} +2 -2
  69. package/dist/{self-invocation-DhO1Z8iD.js.map → self-invocation-DAB_od0C.js.map} +1 -1
  70. package/dist/{serve-BWMxDLnD.js → serve-BS5EmCpM.js} +12 -12
  71. package/dist/{serve-BWMxDLnD.js.map → serve-BS5EmCpM.js.map} +1 -1
  72. package/dist/{server-setup-CqlaZukJ.js → server-setup-DsGJnJ_O.js} +398 -283
  73. package/dist/server-setup-DsGJnJ_O.js.map +1 -0
  74. package/dist/{start-5MgGT4IF.js → start-vJdt2MiM.js} +3 -3
  75. package/dist/{start-5MgGT4IF.js.map → start-vJdt2MiM.js.map} +1 -1
  76. package/dist/{stop-gate-hook-BiBp5aGm.js → stop-gate-hook-DQnh_KfI.js} +3 -3
  77. package/dist/{stop-gate-hook-BiBp5aGm.js.map → stop-gate-hook-DQnh_KfI.js.map} +1 -1
  78. package/dist/{stop-gate-policy-BGd6b5hR.js → stop-gate-policy-DMr3KVmw.js} +2 -2
  79. package/dist/{stop-gate-policy-BGd6b5hR.js.map → stop-gate-policy-DMr3KVmw.js.map} +1 -1
  80. package/dist/{token-8drORhXg.js → token-BtJhjXXu.js} +54 -7
  81. package/dist/token-BtJhjXXu.js.map +1 -0
  82. package/dist/{worker-dispatch-D5fGroNr.js → worker-dispatch-BEHkTbnH.js} +2 -2
  83. package/dist/{worker-dispatch-D5fGroNr.js.map → worker-dispatch-BEHkTbnH.js.map} +1 -1
  84. package/package.json +1 -1
  85. package/dist/attribution-settings-CpLUCi8R.js.map +0 -1
  86. package/dist/claude-_DYGKCw8.js.map +0 -1
  87. package/dist/engine-C9axTIu7.js +0 -2
  88. package/dist/lifecycle-C8fOsQke.js +0 -2
  89. package/dist/lifecycle-D4Yc1aap.js +0 -2
  90. package/dist/paths-DJZoXfAS.js +0 -2
  91. package/dist/peer-mcp-personas-CHbl6MwM.js.map +0 -1
  92. package/dist/server-setup-CqlaZukJ.js.map +0 -1
  93. package/dist/token-8drORhXg.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { i as ensurePaths, t as PATHS } from "./paths-BH4J7slC.js";
2
- import { A as state, r as setupGitHubToken } from "./token-8drORhXg.js";
1
+ import { i as ensurePaths, t as PATHS } from "./paths-Ci485qSJ.js";
2
+ import { A as state, r as setupGitHubToken } from "./token-BtJhjXXu.js";
3
3
  import { defineCommand } from "citty";
4
4
  import consola from "consola";
5
5
  //#region src/auth.ts
@@ -41,4 +41,4 @@ const auth = defineCommand({
41
41
  //#endregion
42
42
  export { auth };
43
43
 
44
- //# sourceMappingURL=auth-BwUHopJz.js.map
44
+ //# sourceMappingURL=auth-CluG5e-l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-BwUHopJz.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { state } from \"./lib/state\"\nimport { setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n}\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run GitHub auth flow without running the server\",\n },\n args: {\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub token on auth\",\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":";;;;;AAcA,eAAsB,QAAQ,SAAwC;CACpE,IAAI,QAAQ,SAAS;EACnB,QAAQ,QAAQ;EAChB,QAAQ,KAAK,yBAAyB;CACxC;CAEA,MAAM,YAAY,QAAQ;CAE1B,MAAM,YAAY;CAClB,MAAM,iBAAiB,EAAE,OAAO,KAAK,CAAC;CACtC,QAAQ,QAAQ,2BAA2B,MAAM,iBAAiB;AACpE;AAEA,MAAa,OAAO,cAAc;CAChC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;EACf;EACA,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;EACf;CACF;CACA,IAAI,EAAE,QAAQ;EACZ,OAAO,QAAQ;GACb,SAAS,KAAK;GACd,WAAW,KAAK;EAClB,CAAC;CACH;AACF,CAAC"}
1
+ {"version":3,"file":"auth-CluG5e-l.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { state } from \"./lib/state\"\nimport { setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n}\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run GitHub auth flow without running the server\",\n },\n args: {\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub token on auth\",\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":";;;;;AAcA,eAAsB,QAAQ,SAAwC;CACpE,IAAI,QAAQ,SAAS;EACnB,QAAQ,QAAQ;EAChB,QAAQ,KAAK,yBAAyB;CACxC;CAEA,MAAM,YAAY,QAAQ;CAE1B,MAAM,YAAY;CAClB,MAAM,iBAAiB,EAAE,OAAO,KAAK,CAAC;CACtC,QAAQ,QAAQ,2BAA2B,MAAM,iBAAiB;AACpE;AAEA,MAAa,OAAO,cAAc;CAChC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;EACf;EACA,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;EACf;CACF;CACA,IAAI,EAAE,QAAQ;EACZ,OAAO,QAAQ;GACb,SAAS,KAAK;GACd,WAAW,KAAK;EAClB,CAAC;CACH;AACF,CAAC"}
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "name": "github-router browser bridge",
4
4
  "short_name": "gh-router-browser",
5
- "version": "0.3.292",
5
+ "version": "0.3.295",
6
6
  "description": "Bridge between Claude (via github-router /mcp) and the browser. Implements tab control, navigation, clicks, form fill, downloads, screenshots, devtools eval. Blocks navigation to chrome://settings.",
7
7
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqJElxuBlonBS3TVW9FJN0mGTtShB3L1hoaYf6k39SOr1ogGYmF90EjRxy1i21k9wQQjPf26bcBu/9X67KrQjQV0uB38CaNukgiSeoLjfptN811u+PJHx6BP+jx3Qa6/3VenNPxHC8WEU0GXql8QSjIHEyCwKb6fMASXOK94JyB5Ywov2x8mt/+9ncqBBBMVzf6r5Sagy4PL1XnryLsuADD/vOEkPet8wXgH/Oj7v5tTsQQZ7U1JT51PoDs2BFnXc5v3TkVgZwd32k3ONh+nkDw1Hof+4zwUGOyJE6eMrlYzRlKM4Qxdf9JpavQvqfieAbTRWcyKeclnHeoIfE7cDBQIDAQAB",
8
8
  "background": {
@@ -1,6 +1,6 @@
1
- import { i as ensurePaths } from "./paths-BH4J7slC.js";
2
- import { r as setupGitHubToken } from "./token-8drORhXg.js";
3
- import { t as getCopilotUsage } from "./get-copilot-usage-CRrf1ZSC.js";
1
+ import { i as ensurePaths } from "./paths-Ci485qSJ.js";
2
+ import { r as setupGitHubToken } from "./token-BtJhjXXu.js";
3
+ import { t as getCopilotUsage } from "./get-copilot-usage-B7Z4XVWj.js";
4
4
  import { defineCommand } from "citty";
5
5
  import consola from "consola";
6
6
  //#region src/check-usage.ts
@@ -40,4 +40,4 @@ const checkUsage = defineCommand({
40
40
  //#endregion
41
41
  export { checkUsage };
42
42
 
43
- //# sourceMappingURL=check-usage-BTda5753.js.map
43
+ //# sourceMappingURL=check-usage-iOzfnKJe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-usage-BTda5753.js","names":[],"sources":["../src/check-usage.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { ensurePaths } from \"./lib/paths\"\nimport { setupGitHubToken } from \"./lib/token\"\nimport {\n getCopilotUsage,\n type QuotaDetail,\n} from \"./services/github/get-copilot-usage\"\n\nexport const checkUsage = defineCommand({\n meta: {\n name: \"check-usage\",\n description: \"Show current GitHub Copilot usage/quota information\",\n },\n async run() {\n await ensurePaths()\n await setupGitHubToken()\n try {\n const usage = await getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed =\n premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap) return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota(\"Chat\", usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n \"Completions\",\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n } catch (err) {\n consola.error(\"Failed to fetch Copilot usage:\", err)\n process.exit(1)\n }\n },\n})\n"],"mappings":";;;;;;AAUA,MAAa,aAAa,cAAc;CACtC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,MAAM;EACV,MAAM,YAAY;EAClB,MAAM,iBAAiB;EACvB,IAAI;GACF,MAAM,QAAQ,MAAM,gBAAgB;GACpC,MAAM,UAAU,MAAM,gBAAgB;GACtC,MAAM,eAAe,QAAQ;GAC7B,MAAM,cAAc,eAAe,QAAQ;GAC3C,MAAM,qBACJ,eAAe,IAAK,cAAc,eAAgB,MAAM;GAC1D,MAAM,0BAA0B,QAAQ;GAGxC,SAAS,eAAe,MAAc,MAA+B;IACnE,IAAI,CAAC,MAAM,OAAO,GAAG,KAAK;IAC1B,MAAM,QAAQ,KAAK;IACnB,MAAM,OAAO,QAAQ,KAAK;IAC1B,MAAM,cAAc,QAAQ,IAAK,OAAO,QAAS,MAAM;IACvD,MAAM,mBAAmB,KAAK;IAC9B,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,SAAS,YAAY,QAAQ,CAAC,EAAE,UAAU,iBAAiB,QAAQ,CAAC,EAAE;GACzG;GAEA,MAAM,cAAc,YAAY,YAAY,GAAG,aAAa,SAAS,mBAAmB,QAAQ,CAAC,EAAE,UAAU,wBAAwB,QAAQ,CAAC,EAAE;GAChJ,MAAM,WAAW,eAAe,QAAQ,MAAM,gBAAgB,IAAI;GAClE,MAAM,kBAAkB,eACtB,eACA,MAAM,gBAAgB,WACxB;GAEA,QAAQ,IACN,wBAAwB,MAAM,aAAa,mBACtB,MAAM,iBAAiB,iBAEnC,YAAY,MACZ,SAAS,MACT,iBACX;EACF,SAAS,KAAK;GACZ,QAAQ,MAAM,kCAAkC,GAAG;GACnD,QAAQ,KAAK,CAAC;EAChB;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"check-usage-iOzfnKJe.js","names":[],"sources":["../src/check-usage.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { ensurePaths } from \"./lib/paths\"\nimport { setupGitHubToken } from \"./lib/token\"\nimport {\n getCopilotUsage,\n type QuotaDetail,\n} from \"./services/github/get-copilot-usage\"\n\nexport const checkUsage = defineCommand({\n meta: {\n name: \"check-usage\",\n description: \"Show current GitHub Copilot usage/quota information\",\n },\n async run() {\n await ensurePaths()\n await setupGitHubToken()\n try {\n const usage = await getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed =\n premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap) return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota(\"Chat\", usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n \"Completions\",\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n } catch (err) {\n consola.error(\"Failed to fetch Copilot usage:\", err)\n process.exit(1)\n }\n },\n})\n"],"mappings":";;;;;;AAUA,MAAa,aAAa,cAAc;CACtC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,MAAM;EACV,MAAM,YAAY;EAClB,MAAM,iBAAiB;EACvB,IAAI;GACF,MAAM,QAAQ,MAAM,gBAAgB;GACpC,MAAM,UAAU,MAAM,gBAAgB;GACtC,MAAM,eAAe,QAAQ;GAC7B,MAAM,cAAc,eAAe,QAAQ;GAC3C,MAAM,qBACJ,eAAe,IAAK,cAAc,eAAgB,MAAM;GAC1D,MAAM,0BAA0B,QAAQ;GAGxC,SAAS,eAAe,MAAc,MAA+B;IACnE,IAAI,CAAC,MAAM,OAAO,GAAG,KAAK;IAC1B,MAAM,QAAQ,KAAK;IACnB,MAAM,OAAO,QAAQ,KAAK;IAC1B,MAAM,cAAc,QAAQ,IAAK,OAAO,QAAS,MAAM;IACvD,MAAM,mBAAmB,KAAK;IAC9B,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,SAAS,YAAY,QAAQ,CAAC,EAAE,UAAU,iBAAiB,QAAQ,CAAC,EAAE;GACzG;GAEA,MAAM,cAAc,YAAY,YAAY,GAAG,aAAa,SAAS,mBAAmB,QAAQ,CAAC,EAAE,UAAU,wBAAwB,QAAQ,CAAC,EAAE;GAChJ,MAAM,WAAW,eAAe,QAAQ,MAAM,gBAAgB,IAAI;GAClE,MAAM,kBAAkB,eACtB,eACA,MAAM,gBAAgB,WACxB;GAEA,QAAQ,IACN,wBAAwB,MAAM,aAAa,mBACtB,MAAM,iBAAiB,iBAEnC,YAAY,MACZ,SAAS,MACT,iBACX;EACF,SAAS,KAAK;GACZ,QAAQ,MAAM,kCAAkC,GAAG;GACnD,QAAQ,KAAK,CAAC;EAChB;CACF;AACF,CAAC"}
@@ -1,26 +1,41 @@
1
- import { Ct as reviewerFastModel, Dt as standInToolEnabled, E as toolbeltEnabled, Et as scribeModel, Ft as unregisterLaunch, Gt as provisionBrowserAssets, Jt as provisionAndIndexColbert, Ot as workerToolsEnabled, Pt as registerLaunch, St as resolveGeminiReviewModel, T as buildToolbeltAwareness, Tt as scoutModel, Zt as warmTreeSitterPool, _t as fleetToolsEnabled, at as FAST_SCOUT_EFFORT, bt as implementerFastModel, ct as brainstormModel, dt as browserToolsEnabled, ft as fastImplementerModel, gt as fastScoutModel, hn as resolveLeadSlugArg, ht as fastReviewerModel, it as FAST_REVIEWER_EFFORT, lt as browseAgentEnabled, mn as pickClaudeDefault, mt as fastPlannerModel, o as buildPeerAwarenessSnippet, on as DEFAULT_CLAUDE_MODEL_FALLBACKS, ot as agentToolsEnabled, pn as isBudgetClaudeLead, pt as fastOracleModel, qt as colbertDegradedWarning, r as agentNamesForToolAllowlist, rt as FAST_PLANNER_EFFORT, s as buildPeerAwarenessSummary, st as artifactToolsEnabled, tn as shouldUseInsecureTls, ut as browserCompoundToolsEnabled, vt as geminiAvailable, w as availableToolCommands, wt as reviewerModel, xt as nativeSubagentModel, yt as generalPurposeFastModel } from "./peer-mcp-personas-CHbl6MwM.js";
2
- import { o as removeOwnClaudeConfigMirror, r as ensureClaudeConfigMirror, t as PATHS, u as writeArtifactCredsToMirror } from "./paths-BH4J7slC.js";
3
- import { A as state, d as resolveModel } from "./token-8drORhXg.js";
1
+ import { An as isBudgetClaudeLead, At as workerToolsEnabled, Bt as profileDescriptor, Cn as DEFAULT_CLAUDE_MODEL_FALLBACKS, Ct as nativeSubagentModel, Dt as scoutModel, E as toolbeltEnabled, Et as reviewerModel, Mn as resolveLeadSlugArg, Mt as LUNA_DRIVER_ALIAS_ID, Ot as scribeModel, Qt as unregisterLaunch, St as implementerFastModel, T as buildToolbeltAwareness, Tt as reviewerFastModel, Ut as validateFastProfilePrerequisites, Vt as resolveLaunchProfile, Zt as registerLaunch, _t as fastReviewerModel, at as FAST_REVIEWER_EFFORT, bt as geminiAvailable, cn as provisionBrowserAssets, ct as artifactToolsEnabled, dn as provisionAndIndexColbert, dt as browserCompoundToolsEnabled, ft as browserToolsEnabled, gt as fastPlannerModel, ht as fastOracleModel, it as FAST_PLANNER_EFFORT, jn as pickClaudeDefault, kt as standInToolEnabled, lt as brainstormModel, mn as warmTreeSitterPool, mt as fastImplementerModel, o as buildPeerAwarenessSnippet, ot as FAST_SCOUT_EFFORT, pt as fastCriticModel, r as agentNamesForToolAllowlist, rt as FAST_CRITIC_EFFORT, s as buildPeerAwarenessSummary, st as agentToolsEnabled, un as colbertDegradedWarning, ut as browseAgentEnabled, vn as shouldUseInsecureTls, vt as fastScoutModel, w as availableToolCommands, wt as resolveGeminiReviewModel, xt as generalPurposeFastModel, yt as fleetToolsEnabled, zt as formatFastPrerequisiteFailure } from "./peer-mcp-personas-BwNtC8jt.js";
2
+ import { o as removeOwnClaudeConfigMirror, r as ensureClaudeConfigMirror, t as PATHS, u as writeArtifactCredsToMirror } from "./paths-Ci485qSJ.js";
3
+ import { A as state, d as resolveModel } from "./token-BtJhjXXu.js";
4
4
  import { r as parseBoolEnv } from "./exec-y8C_MU8A.js";
5
- import { _ as validateFastProfilePrerequisites, a as sharedServerArgs, b as updateClaude, c as stopKeepAwake, d as LUNA_DRIVER_ALIAS_ID, g as resolveLaunchProfile, h as profileDescriptor, i as setupAndServe, l as listModelsForEndpoint, m as formatFastPrerequisiteFailure, o as LAUNCH_SECRET_HEADER, r as parseSharedArgs, s as startKeepAwake, t as getClaudeCodeEnvVars, u as enableFileLogging, v as runSelfUpdate, y as checkClaudeVersion } from "./server-setup-CqlaZukJ.js";
6
- import { n as hookLauncherDegradedWarning, r as resolveSelfInvocation } from "./self-invocation-DhO1Z8iD.js";
7
- import { i as launchChild, r as getCodexVersion, t as provisionToolbelt } from "./provision-BYFd9nPK.js";
8
- import { i as captureLaunchBaseline, l as stopGateDisabled, n as buildSessionBindHookCommand, r as buildStopHookCommand, s as injectStopHookIntoSettingsFile, t as buildArtifactOpenHookCommand, u as stopGateId } from "./stop-gate-hook-BiBp5aGm.js";
9
- import { t as liveExec } from "./orchestration-pzbrKkgD.js";
10
- import { c as repoRoot, d as trustRepo, l as stopGateEnabledForRepo, s as repoFingerprint, t as fileBaselineStore } from "./stop-gate-policy-BGd6b5hR.js";
11
- import { l as guardToolMatcher, n as activeDispatchModes, r as buildWorkerGuardHookCommand } from "./worker-dispatch-D5fGroNr.js";
12
- import { _ as injectPeerMcpIntoMirror, a as appendPeerAwarenessToMirroredClaudeMd, b as workersKeyOf, c as prependArtifactPanelDirectiveToMirroredClaudeMd, i as OPERATING_DEFAULTS_DIGEST, l as prependOperatingDefaultsToMirroredClaudeMd, m as planModeAllowRules, n as INJECTED_SKILLS, o as appendToolbeltAwarenessToMirroredClaudeMd, p as injectAllowRules, r as writeInjectedSkill, s as buildOperatingDefaultsDirective, t as injectAttributionSuppressionIntoSettingsFile, u as prependStyleDirectiveToMirroredClaudeMd, v as resolveCodexCliBackend, x as writePeerMcpRuntimeFiles, y as resolveGroupKeysFromMirror } from "./attribution-settings-CpLUCi8R.js";
5
+ import { a as sharedServerArgs, c as stopKeepAwake, d as runSelfUpdate, f as checkClaudeVersion, i as setupAndServe, l as listModelsForEndpoint, o as LAUNCH_SECRET_HEADER, p as updateClaude, r as parseSharedArgs, s as startKeepAwake, t as getClaudeCodeEnvVars, u as enableFileLogging } from "./server-setup-DsGJnJ_O.js";
6
+ import { n as hookLauncherDegradedWarning, r as resolveSelfInvocation } from "./self-invocation-DAB_od0C.js";
7
+ import { i as launchChild, r as getCodexVersion, t as provisionToolbelt } from "./provision-DeNqzvSM.js";
8
+ import { i as captureLaunchBaseline, l as stopGateDisabled, n as buildSessionBindHookCommand, r as buildStopHookCommand, s as injectStopHookIntoSettingsFile, t as buildArtifactOpenHookCommand, u as stopGateId } from "./stop-gate-hook-DQnh_KfI.js";
9
+ import { t as liveExec } from "./orchestration-BiGCEwbH.js";
10
+ import { c as repoRoot, d as trustRepo, l as stopGateEnabledForRepo, s as repoFingerprint, t as fileBaselineStore } from "./stop-gate-policy-DMr3KVmw.js";
11
+ import { l as guardToolMatcher, n as activeDispatchModes, r as buildWorkerGuardHookCommand } from "./worker-dispatch-BEHkTbnH.js";
12
+ import { _ as injectPeerMcpIntoMirror, a as appendPeerAwarenessToMirroredClaudeMd, b as workersKeyOf, c as prependArtifactPanelDirectiveToMirroredClaudeMd, i as OPERATING_DEFAULTS_DIGEST, l as prependOperatingDefaultsToMirroredClaudeMd, m as planModeAllowRules, n as INJECTED_SKILLS, o as appendToolbeltAwarenessToMirroredClaudeMd, p as injectAllowRules, r as writeInjectedSkill, s as buildOperatingDefaultsDirective, t as injectAttributionSuppressionIntoSettingsFile, u as prependStyleDirectiveToMirroredClaudeMd, v as resolveCodexCliBackend, x as writePeerMcpRuntimeFiles, y as resolveGroupKeysFromMirror } from "./attribution-settings-pkIop1NU.js";
13
13
  import { r as hookMcpRuntimeFromEnv } from "./hook-mcp-client-DBvm9608.js";
14
- import { i as planReviewEnabled, t as buildPlanReviewHookCommand } from "./plan-review-hook-CfcanA7_.js";
15
- import { a as checksForDescriptor, i as writeDiscoveredGate, n as readDiscoveredGate, o as descriptorHash, r as sourcesHash, s as parseGateDescriptor, t as discoverGateCommands } from "./gate-discovery-Bjar5dgv.js";
16
- import { t as buildPromptSubmitHookCommand } from "./prompt-submit-hook-Bqf9ORgb.js";
17
- import { i as assertShapingInstalled, n as buildFirstMateGuardHookCommand, t as FIRST_MATE_GUARD_MATCHER } from "./internal-first-mate-guard-CVFFJriA.js";
14
+ import { i as planReviewEnabled, t as buildPlanReviewHookCommand } from "./plan-review-hook-DuW0pSoM.js";
15
+ import { a as checksForDescriptor, i as writeDiscoveredGate, n as readDiscoveredGate, o as descriptorHash, r as sourcesHash, s as parseGateDescriptor, t as discoverGateCommands } from "./gate-discovery-WcduofL4.js";
16
+ import { t as buildPromptSubmitHookCommand } from "./prompt-submit-hook-IMl7ssfr.js";
17
+ import { i as assertShapingInstalled, n as buildFirstMateGuardHookCommand, t as FIRST_MATE_GUARD_MATCHER } from "./internal-first-mate-guard-C9BV7J4U.js";
18
+ import { r as FAST_DISPATCH_TOOL_MATCHER, t as buildFastDispatchGuardHookCommand } from "./internal-fast-dispatch-guard-Xyu17k9X.js";
18
19
  import { defineCommand } from "citty";
19
20
  import consola from "consola";
20
21
  import path from "node:path";
21
22
  import { randomBytes } from "node:crypto";
22
23
  import { tmpdir } from "node:os";
23
24
  import process from "node:process";
25
+ //#region src/lib/orchestration/fast-dispatch-hook.ts
26
+ /** Sentinel preserved through claude.ts's optional codex-MCP catch. */
27
+ var FastDispatchGuardInstallError = class extends Error {
28
+ constructor(message) {
29
+ super(message);
30
+ this.name = "FastDispatchGuardInstallError";
31
+ }
32
+ };
33
+ /** Assert fast launches never spawn without their native dispatch ACL. */
34
+ function assertFastDispatchGuardInstalled(fastProfile, installationSucceeded) {
35
+ if (fastProfile && !installationSucceeded) throw new FastDispatchGuardInstallError("fast profile requires the native Task/Agent ACL hook, but it could not be installed; refusing to start an unguarded fast session.");
36
+ }
37
+ /** This module is intentionally stateless; callers own launch cleanup. */
38
+ //#endregion
24
39
  //#region src/lib/injected-skills/artifact-review-skill.ts
25
40
  const ARTIFACT_REVIEW_SKILL = {
26
41
  name: "gh-artifact-review",
@@ -94,6 +109,29 @@ To let the human act on the artifact (not just comment), emit declarative contro
94
109
  `
95
110
  };
96
111
  //#endregion
112
+ //#region src/lib/fast-launch-cleanup.ts
113
+ function createFastLaunchCleanup(deps) {
114
+ let cleanupPromise;
115
+ return () => {
116
+ if (cleanupPromise) return cleanupPromise;
117
+ cleanupPromise = (async () => {
118
+ try {
119
+ await deps.server?.close(true);
120
+ } catch {}
121
+ try {
122
+ await deps.stopKeepAwake();
123
+ } catch {}
124
+ if (deps.runtimeCleanup) try {
125
+ await deps.runtimeCleanup();
126
+ } catch {}
127
+ try {
128
+ await deps.removeMirror();
129
+ } catch {}
130
+ })();
131
+ return cleanupPromise;
132
+ };
133
+ }
134
+ //#endregion
97
135
  //#region src/claude.ts
98
136
  function isFirstMateSkillName(name) {
99
137
  return name === "gh-first-mate" || name === "gh-first-mate-scaffold" || name === "gh-first-mate-operate" || name === "gh-first-mate-conduct";
@@ -214,6 +252,12 @@ const claude = defineCommand({
214
252
  process.exit(1);
215
253
  }
216
254
  const parsed = parseSharedArgs(args);
255
+ const requestedLaunchProfileId = resolveLaunchProfile(args.model);
256
+ const codexMcpEnabled = args["codex-mcp"] !== false;
257
+ if (requestedLaunchProfileId === "fast" && !codexMcpEnabled) {
258
+ process.stderr.write(`github-router claude -m fast requires codex MCP wiring for its native roster and dispatch ACL; remove --no-codex-mcp or choose a standard model.\n`);
259
+ process.exit(1);
260
+ }
217
261
  if (args.stealth) {
218
262
  parsed.extendedBetas = false;
219
263
  consola.info("Stealth mode: VS Code-only beta filtering. Leverage features disabled.");
@@ -247,24 +291,52 @@ const claude = defineCommand({
247
291
  process.exit(1);
248
292
  }
249
293
  runSelfUpdate({ selfUpdate: args["self-update"] !== false });
294
+ const cleanupPreMirrorFailure = createFastLaunchCleanup({
295
+ server,
296
+ stopKeepAwake,
297
+ removeMirror: removeOwnClaudeConfigMirror
298
+ });
250
299
  try {
251
300
  await ensureClaudeConfigMirror();
252
301
  } catch (err) {
253
302
  consola.error(`Failed to provision CLAUDE_CONFIG_DIR mirror: ${err instanceof Error ? err.message : String(err)}. Spawned Claude Code would not be able to authenticate.`);
303
+ await cleanupPreMirrorFailure();
254
304
  process.exit(1);
255
305
  }
256
306
  enableFileLogging();
307
+ let fastRuntimeCleanup;
308
+ let fastLaunchId;
309
+ let fastCleanupPromise;
310
+ const disposeFastRuntime = async () => {
311
+ if (!fastRuntimeCleanup) return;
312
+ fastCleanupPromise ??= fastRuntimeCleanup();
313
+ await fastCleanupPromise;
314
+ };
315
+ const resetFastRuntimeOwnership = () => {
316
+ fastRuntimeCleanup = void 0;
317
+ fastLaunchId = void 0;
318
+ };
319
+ const cleanupFastLaunch = createFastLaunchCleanup({
320
+ server,
321
+ stopKeepAwake,
322
+ removeMirror: removeOwnClaudeConfigMirror,
323
+ runtimeCleanup: async () => {
324
+ if (fastRuntimeCleanup) await fastRuntimeCleanup();
325
+ }
326
+ });
327
+ const fastFatal = async (message) => {
328
+ consola.error(message);
329
+ process.stderr.write(`${message}\n`);
330
+ await cleanupFastLaunch();
331
+ process.exit(1);
332
+ throw new Error("process.exit returned unexpectedly");
333
+ };
257
334
  const usingDefault = !args.model?.trim();
258
335
  const requestedSlug = resolveLeadSlugArg(args.model);
259
336
  const launchProfileId = resolveLaunchProfile(args.model);
260
337
  if (launchProfileId === "fast") {
261
338
  const prereqCheck = validateFastProfilePrerequisites(state.models);
262
- if (!prereqCheck.ok) {
263
- const message = formatFastPrerequisiteFailure(prereqCheck.missing);
264
- consola.error(message);
265
- process.stderr.write(`${message}\n`);
266
- process.exit(1);
267
- }
339
+ if (!prereqCheck.ok) await fastFatal(formatFastPrerequisiteFailure(prereqCheck.missing));
268
340
  }
269
341
  let chosenSlug = launchProfileId === "fast" ? requestedSlug.endsWith("[1m]") ? `${LUNA_DRIVER_ALIAS_ID}[1m]` : LUNA_DRIVER_ALIAS_ID : requestedSlug;
270
342
  let resolvedSlug = launchProfileId === "fast" ? resolveModel(requestedSlug) : resolveModel(chosenSlug);
@@ -312,12 +384,13 @@ const claude = defineCommand({
312
384
  let onShutdown = baseShutdown;
313
385
  let peerAwarenessSnippet;
314
386
  let peerAwarenessSummary;
315
- let fastRuntimeWired = launchProfileId !== "fast";
387
+ let fastWiringComplete = launchProfileId !== "fast";
316
388
  const nativeAgentModels = launchProfileId === "fast" ? {
317
389
  scout: fastScoutModel(),
318
390
  implementer: fastImplementerModel(),
319
391
  reviewer: fastReviewerModel(),
320
- planner: fastPlannerModel()
392
+ planner: fastPlannerModel(),
393
+ critic: fastCriticModel()
321
394
  } : {
322
395
  implementer: nativeSubagentModel(),
323
396
  "implementer-fast": implementerFastModel(),
@@ -336,7 +409,6 @@ const claude = defineCommand({
336
409
  budgetLead: isBudgetClaudeLead(chosenSlug),
337
410
  profile: launchProfileId
338
411
  };
339
- const codexMcpEnabled = args["codex-mcp"] !== false;
340
412
  const selfInvocation = await resolveSelfInvocation();
341
413
  {
342
414
  const warning = hookLauncherDegradedWarning(selfInvocation);
@@ -365,7 +437,7 @@ const claude = defineCommand({
365
437
  if (!isFastProfile && fleetToolsEnabled()) enabledGroups.push("fleet");
366
438
  if (!isFastProfile && agentToolsEnabled()) enabledGroups.push("first-mate");
367
439
  const { keys: groupKeys, skipped: skippedGroups } = await resolveGroupKeysFromMirror(enabledGroups);
368
- if (isFastProfile && fastOracleModel() == null) throw new Error("fast profile prerequisite drift: exact claude-opus-5 Oracle no longer resolves");
440
+ if (isFastProfile && (fastOracleModel() == null || fastCriticModel() == null)) throw new Error("fast profile prerequisite drift: exact Oracle or critic model no longer resolves");
369
441
  const runtime = await writePeerMcpRuntimeFiles(serverUrl, {
370
442
  codexCli: backend === "cli",
371
443
  selfInvocation,
@@ -388,13 +460,15 @@ const claude = defineCommand({
388
460
  ...isFastProfile ? {
389
461
  fastProfile: true,
390
462
  plannerModel: nativeAgentModels.planner,
463
+ criticModel: nativeAgentModels.critic,
391
464
  scoutEffort: FAST_SCOUT_EFFORT,
392
465
  implementerEffort: "max",
393
466
  reviewerEffort: FAST_REVIEWER_EFFORT,
394
- plannerEffort: FAST_PLANNER_EFFORT
467
+ plannerEffort: FAST_PLANNER_EFFORT,
468
+ criticEffort: FAST_CRITIC_EFFORT
395
469
  } : {}
396
470
  });
397
- fastRuntimeWired = true;
471
+ if (isFastProfile) fastRuntimeCleanup = runtime.cleanup;
398
472
  const launchSecret = randomBytes(32).toString("hex");
399
473
  const launchEntry = registerLaunch({
400
474
  profileId: launchProfileId,
@@ -403,27 +477,60 @@ const claude = defineCommand({
403
477
  allowedGroups: fastDescriptor.allowedGroups,
404
478
  allowedPersonas: fastDescriptor.personaAllowlist
405
479
  });
480
+ if (isFastProfile) fastLaunchId = launchEntry.launchId;
406
481
  envVars.ANTHROPIC_CUSTOM_HEADERS = envVars.ANTHROPIC_CUSTOM_HEADERS ? `${envVars.ANTHROPIC_CUSTOM_HEADERS}\n${LAUNCH_SECRET_HEADER}: ${launchSecret}` : `${LAUNCH_SECRET_HEADER}: ${launchSecret}`;
407
482
  envVars.GH_ROUTER_HOOK_MCP_URL = serverUrl;
408
483
  envVars.GH_ROUTER_HOOK_NONCE = runtime.nonce;
409
- onShutdown = async () => {
484
+ onShutdown = isFastProfile ? async () => {
485
+ try {
486
+ unregisterLaunch(launchEntry.launchId);
487
+ } finally {
488
+ try {
489
+ await runtime.cleanup();
490
+ } finally {
491
+ resetFastRuntimeOwnership();
492
+ await baseShutdown();
493
+ }
494
+ }
495
+ } : async () => {
410
496
  unregisterLaunch(launchEntry.launchId);
411
497
  await runtime.cleanup();
412
498
  await baseShutdown();
413
499
  };
414
- const injected = await injectPeerMcpIntoMirror(serverUrl, {
415
- codexCli: backend === "cli",
416
- selfInvocation,
417
- geminiAvailable: geminiModelsAvailable,
418
- groupKeys,
419
- nonce: runtime.nonce
420
- });
421
- if (!injected.ok) {
500
+ let subagentVisibility;
501
+ let injected;
502
+ if (isFastProfile) {
422
503
  extraArgs.push("--mcp-config", runtime.mcpConfigPath);
423
504
  if (args["codex-mcp-only"] === true) extraArgs.push("--strict-mcp-config");
424
- } else if (args["codex-mcp-only"] === true) consola.warn("--codex-mcp-only has no effect when peer MCP is wired via the mirrored .claude.json (the user's existing user-scope MCPs in the snapshot are still visible). Pass --no-codex-mcp to skip peer-MCP wiring entirely.");
505
+ subagentVisibility = "role-scoped (lead via --mcp-config; subagents via inline mcpServers)";
506
+ } else {
507
+ injected = await injectPeerMcpIntoMirror(serverUrl, {
508
+ codexCli: backend === "cli",
509
+ selfInvocation,
510
+ geminiAvailable: geminiModelsAvailable,
511
+ groupKeys,
512
+ nonce: runtime.nonce
513
+ });
514
+ if (!injected.ok) {
515
+ extraArgs.push("--mcp-config", runtime.mcpConfigPath);
516
+ if (args["codex-mcp-only"] === true) extraArgs.push("--strict-mcp-config");
517
+ } else if (args["codex-mcp-only"] === true) consola.warn("--codex-mcp-only has no effect when peer MCP is wired via the mirrored .claude.json (the user's existing user-scope MCPs in the snapshot are still visible). Pass --no-codex-mcp to skip peer-MCP wiring entirely.");
518
+ subagentVisibility = injected.ok ? `subagent-visible (mirrored mcpServers: [${injected.serversAdded.join(", ")}])` : `subagent-INVISIBLE (collision on user-side mcpServers: [${injected.conflictingServers.join(", ")}]; parent-only via --mcp-config)`;
519
+ }
520
+ if (isFastProfile) {
521
+ let fastGuardInstalled = false;
522
+ try {
523
+ const settingsPath = path.join(PATHS.CLAUDE_CONFIG_DIR, "settings.json");
524
+ const guardCommand = buildFastDispatchGuardHookCommand(selfInvocation);
525
+ await injectStopHookIntoSettingsFile(settingsPath, guardCommand, "PreToolUse", 10, FAST_DISPATCH_TOOL_MATCHER);
526
+ fastGuardInstalled = true;
527
+ } catch (err) {
528
+ consola.error(`Could not register the fast native dispatch ACL hook: ${String(err)}`);
529
+ }
530
+ assertFastDispatchGuardInstalled(true, fastGuardInstalled);
531
+ fastWiringComplete = true;
532
+ }
425
533
  const personaNames = runtime.personas.map((p) => p.agentName).join(", ");
426
- const subagentVisibility = injected.ok ? `subagent-visible (mirrored mcpServers: [${injected.serversAdded.join(", ")}])` : `subagent-INVISIBLE (collision on user-side mcpServers: [${injected.conflictingServers.join(", ")}]; parent-only via --mcp-config)`;
427
534
  const skippedNote = skippedGroups.length > 0 ? ` WARNING: groups [${skippedGroups.join(", ")}] skipped — both the bare and \`gh-router-<group>\` keys collide with your own mcpServers; those tools are unavailable this session (rename the user-side server to re-enable).` : "";
428
535
  process.stderr.write(`Peer MCP wired (backend=${backend}, personas=[${personaNames}], subagent .md files=${runtime.agentMdPaths.length}, ${subagentVisibility}).${skippedNote}\n`);
429
536
  const sessionCwd = process.cwd();
@@ -443,14 +550,14 @@ const claude = defineCommand({
443
550
  }
444
551
  try {
445
552
  const settingsPath = path.join(PATHS.CLAUDE_CONFIG_DIR, "settings.json");
446
- const injectedServerKeys = injected.ok ? injected.serversAdded : [...Object.values(groupKeys).filter((k) => Boolean(k)), ...backend === "cli" ? ["codex-cli"] : []];
553
+ const injectedServerKeys = injected?.ok ? injected.serversAdded : [...Object.values(groupKeys).filter((k) => Boolean(k)), ...backend === "cli" ? ["codex-cli"] : []];
447
554
  const res = await injectAllowRules(settingsPath, planModeAllowRules(injectedServerKeys));
448
555
  if (res.added.length) consola.debug(`Auto-approved for plan mode: ${res.added.join(", ")}`);
449
556
  } catch (err) {
450
557
  consola.warn(`Could not auto-approve injected tools: ${String(err)}`);
451
558
  }
452
559
  if (workerSkillsActive) {
453
- if (!injected.ok) consola.warn("Workers non-blocking guard NOT registered: subagent MCP injection fell back to parent-only (--mcp-config), so worker-* dispatchers cannot reach the workers server. Raw (blocking) worker tools remain usable on the main thread this session.");
560
+ if (!injected?.ok) consola.warn("Workers non-blocking guard NOT registered: subagent MCP injection fell back to parent-only (--mcp-config), so worker-* dispatchers cannot reach the workers server. Raw (blocking) worker tools remain usable on the main thread this session.");
454
561
  else if (process.env.GH_ROUTER_DISABLE_WORKER_GUARD === "1") consola.info("Workers non-blocking guard disabled via GH_ROUTER_DISABLE_WORKER_GUARD=1 — raw mcp__workers__* is callable on the main thread (blocking); the worker-* background agents remain the steered, non-blocking default.");
455
562
  else try {
456
563
  const settingsPath = path.join(PATHS.CLAUDE_CONFIG_DIR, "settings.json");
@@ -625,6 +732,7 @@ const claude = defineCommand({
625
732
  fleetAvailable: fleetToolsEnabled(),
626
733
  agentToolsAvailable: agentToolsEnabled(),
627
734
  ...nativeAvailability,
735
+ profile: launchProfileId,
628
736
  groupKeys
629
737
  });
630
738
  peerAwarenessSnippet = peerSnippet;
@@ -635,6 +743,7 @@ const claude = defineCommand({
635
743
  fleetAvailable: fleetToolsEnabled(),
636
744
  agentToolsAvailable: agentToolsEnabled(),
637
745
  ...nativeAvailability,
746
+ profile: launchProfileId,
638
747
  nativeAgentModels,
639
748
  groupKeys
640
749
  });
@@ -649,13 +758,24 @@ const claude = defineCommand({
649
758
  consola.warn(`Style-directive CLAUDE.md prepend failed: ${err instanceof Error ? err.message : String(err)}`);
650
759
  }
651
760
  } catch (err) {
761
+ if (launchProfileId === "fast") {
762
+ if (fastLaunchId) unregisterLaunch(fastLaunchId);
763
+ await disposeFastRuntime().catch(() => {});
764
+ await server.close(true).catch(() => {});
765
+ await baseShutdown().catch(() => {});
766
+ resetFastRuntimeOwnership();
767
+ const message = `Fast profile wiring failed; refusing to launch an unguarded session: ${err instanceof Error ? err.message : String(err)}`;
768
+ consola.error(message);
769
+ process.stderr.write(`${message}\n`);
770
+ process.exit(1);
771
+ }
652
772
  consola.warn(`Peer MCP wiring failed (claude will launch without it): ${err instanceof Error ? err.message : String(err)}`);
653
773
  }
654
774
  extraArgs.push("--append-system-prompt", peerAwarenessSnippet && peerAwarenessSummary ? `${OPERATING_DEFAULTS_DIGEST}\n\n${peerAwarenessSummary}` : OPERATING_DEFAULTS_DIGEST);
655
775
  try {
656
776
  await prependOperatingDefaultsToMirroredClaudeMd(buildOperatingDefaultsDirective({
657
777
  ...nativeAvailability,
658
- fastRuntimeAvailable: fastRuntimeWired
778
+ fastRuntimeAvailable: fastWiringComplete
659
779
  }));
660
780
  } catch (err) {
661
781
  consola.warn(`Operating-defaults CLAUDE.md prepend failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -677,4 +797,4 @@ const claude = defineCommand({
677
797
  //#endregion
678
798
  export { claude };
679
799
 
680
- //# sourceMappingURL=claude-_DYGKCw8.js.map
800
+ //# sourceMappingURL=claude-DNmxk-Rm.js.map