nexus-agents 10.2.0 → 11.0.0

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 (179) hide show
  1. package/README.md +4 -1
  2. package/dist/{ast-rule-runner-RI7ZJ4ZI.js → ast-rule-runner-3QRCP53C.js} +5 -5
  3. package/dist/{child-mcp-config-73BX4OTR.js → child-mcp-config-NWPUDUVE.js} +5 -5
  4. package/dist/{chunk-GAX75XCV.js → chunk-2BZXKNLN.js} +2 -2
  5. package/dist/{chunk-QG3VDSWD.js → chunk-2HYJTIDY.js} +3 -3
  6. package/dist/{chunk-OMSKBBL7.js → chunk-377L2ZEK.js} +18 -19
  7. package/dist/chunk-377L2ZEK.js.map +1 -0
  8. package/dist/{chunk-VLOPXV47.js → chunk-53XY7YJD.js} +7 -7
  9. package/dist/chunk-5CUI42NO.js +1046 -0
  10. package/dist/chunk-5CUI42NO.js.map +1 -0
  11. package/dist/{chunk-23QA6GQD.js → chunk-66BE4KF4.js} +7 -7
  12. package/dist/{chunk-TDUXUVUU.js → chunk-6LWUJOAS.js} +2 -2
  13. package/dist/{chunk-XDUTAUK3.js → chunk-7H3SOL4O.js} +65 -57
  14. package/dist/chunk-7H3SOL4O.js.map +1 -0
  15. package/dist/{chunk-JGY5HMWI.js → chunk-7HHXY7LM.js} +2 -2
  16. package/dist/{chunk-J44RKRGQ.js → chunk-AFJE7K6Q.js} +4 -4
  17. package/dist/{chunk-WD4DENPC.js → chunk-B3RAA47W.js} +3 -3
  18. package/dist/{chunk-TW6PJYTP.js → chunk-C73VZSC5.js} +1 -1
  19. package/dist/chunk-C73VZSC5.js.map +1 -0
  20. package/dist/{chunk-LWOX65CP.js → chunk-CH6IBWXH.js} +31 -31
  21. package/dist/chunk-CH6IBWXH.js.map +1 -0
  22. package/dist/{chunk-RIYFVDYN.js → chunk-CSDGNGAG.js} +2 -2
  23. package/dist/{chunk-KASBBKAQ.js → chunk-D33IH5VS.js} +54 -54
  24. package/dist/chunk-D33IH5VS.js.map +1 -0
  25. package/dist/{chunk-U37AITDA.js → chunk-DCPCO2XG.js} +2 -2
  26. package/dist/{chunk-SS53PZO6.js → chunk-EFZRQ67X.js} +5 -5
  27. package/dist/{chunk-WKFPKPEM.js → chunk-GPRYEKAA.js} +434 -124
  28. package/dist/chunk-GPRYEKAA.js.map +1 -0
  29. package/dist/{chunk-7EV3QAKO.js → chunk-HUYVIUF3.js} +2 -2
  30. package/dist/{chunk-V26YQQK4.js → chunk-I7VX7JWV.js} +2 -2
  31. package/dist/{chunk-LXYT2P2Y.js → chunk-IGYZQEKM.js} +3 -3
  32. package/dist/{chunk-XSAUVC6D.js → chunk-NLFCAEEK.js} +2 -2
  33. package/dist/{chunk-2TA6KTRF.js → chunk-OJ3PXTN3.js} +16 -18
  34. package/dist/{chunk-2TA6KTRF.js.map → chunk-OJ3PXTN3.js.map} +1 -1
  35. package/dist/{chunk-QRC3QLUQ.js → chunk-PY6HJQYC.js} +1086 -14
  36. package/dist/chunk-PY6HJQYC.js.map +1 -0
  37. package/dist/{chunk-QM5W3T3O.js → chunk-PZMODRBC.js} +2 -2
  38. package/dist/{chunk-GX5ZHZR2.js → chunk-QARJHIQM.js} +7 -7
  39. package/dist/{chunk-EJ5EBTAV.js → chunk-QTRPH2ZF.js} +2 -2
  40. package/dist/{chunk-FNHVTDHZ.js → chunk-R75NZRON.js} +3 -3
  41. package/dist/{chunk-UE7A2XHM.js → chunk-RUHKJC3X.js} +2 -2
  42. package/dist/{chunk-4JJI34RV.js → chunk-S6XQFO4A.js} +3 -3
  43. package/dist/{chunk-LP5ISXKM.js → chunk-SFWQ72ZS.js} +5 -5
  44. package/dist/{chunk-KLSNDPU6.js → chunk-SKM75Y7E.js} +17 -32
  45. package/dist/chunk-SKM75Y7E.js.map +1 -0
  46. package/dist/{chunk-D6E3LJGP.js → chunk-T4WTZTZY.js} +4 -4
  47. package/dist/{chunk-JPFRRNRR.js → chunk-U7HL7FGS.js} +2 -2
  48. package/dist/{chunk-SX2XWCGA.js → chunk-V6AJCRAU.js} +22 -7
  49. package/dist/chunk-V6AJCRAU.js.map +1 -0
  50. package/dist/{chunk-2DYCHHWW.js → chunk-VVMSE5LF.js} +4 -4
  51. package/dist/{chunk-QS5HGPCN.js → chunk-VZ7YZ2EF.js} +2 -2
  52. package/dist/{chunk-PXYSAG5B.js → chunk-WFMMJWMO.js} +2 -2
  53. package/dist/{chunk-FWQSOPBA.js → chunk-YOT3XEZM.js} +6 -6
  54. package/dist/{chunk-JUUGLXSN.js → chunk-YRZV6KXZ.js} +5 -5
  55. package/dist/{cli-auth-probe-A7ANEHJ7.js → cli-auth-probe-GUK3NXW3.js} +2 -2
  56. package/dist/{cli-circuit-breaker-62YOQQT3.js → cli-circuit-breaker-VWARWNGU.js} +5 -5
  57. package/dist/{cli-readiness-O6EOQV4L.js → cli-readiness-S23DWZCS.js} +9 -9
  58. package/dist/cli-server-gateway-DJXSHHXA.js +34 -0
  59. package/dist/cli.d.ts +1 -1
  60. package/dist/cli.js +80 -1215
  61. package/dist/cli.js.map +1 -1
  62. package/dist/{composite-router-YPZ3D5Y6.js → composite-router-3CBLBUGZ.js} +4 -4
  63. package/dist/{consensus-vote-RNQQUBXO.js → consensus-vote-JMWTJO4M.js} +21 -22
  64. package/dist/{consensus-vote-types-DexdhOdB.d.ts → consensus-vote-types-Ca0BY3kZ.d.ts} +5 -5
  65. package/dist/{context-retriever-HVPLM6DH.js → context-retriever-P6ZE6UXS.js} +11 -11
  66. package/dist/{doctor-deep-UZQTD65D.js → doctor-deep-HBIDPGWI.js} +5 -5
  67. package/dist/doctor-gateway-report-FWV7UN2Q.js +20 -0
  68. package/dist/{doctor-live-QFLT5SDB.js → doctor-live-676TWMP6.js} +18 -16
  69. package/dist/doctor-live-676TWMP6.js.map +1 -0
  70. package/dist/{expert-bridge-O3UZXLGB.js → expert-bridge-3VWOHLC7.js} +6 -6
  71. package/dist/factory-A44THDRG.js +31 -0
  72. package/dist/factory-YPJXDMN4.js +17 -0
  73. package/dist/{improvement-review-7IABFAU3.js → improvement-review-FIKPTCPE.js} +8 -8
  74. package/dist/index.d.ts +69 -77
  75. package/dist/index.js +65 -56
  76. package/dist/index.js.map +1 -1
  77. package/dist/{init-opencode-RYPBCM4P.js → init-opencode-YRHLGHIE.js} +7 -7
  78. package/dist/issue-triage-BLZHWC6U.js +20 -0
  79. package/dist/{learning-persistence-FB4U5AX2.js → learning-persistence-X24OOBYY.js} +3 -3
  80. package/dist/{model-config-helpers-QNV3KD2W.js → model-config-helpers-OQEZU2ZG.js} +4 -4
  81. package/dist/{openai-compat-adapter-GPZDIR3D.js → openai-compat-adapter-GRJA6RPZ.js} +7 -7
  82. package/dist/{outcome-store-adapter-WRONSTUD.js → outcome-store-adapter-7CKYWUZV.js} +4 -4
  83. package/dist/{pr-reviewer-helpers-7SMNNDFJ.js → pr-reviewer-helpers-LKHPRW3X.js} +6 -6
  84. package/dist/{registry-command-U7K6HIBK.js → registry-command-4LP4OSND.js} +4 -4
  85. package/dist/{repo-security-plan-LFWLVEL2.js → repo-security-plan-SOFUCHO4.js} +5 -5
  86. package/dist/research-helpers-synthesize-SXNAJWHX.js +16 -0
  87. package/dist/{routing-memory-OCIVXKOU.js → routing-memory-TWCXFPAD.js} +4 -4
  88. package/dist/{session-memory-4LMEWO3X.js → session-memory-YVT5M4AN.js} +5 -5
  89. package/dist/setup-config-JGHFR4P3.js +13 -0
  90. package/dist/{setup-custom-api-QEPUCHOX.js → setup-custom-api-EFAWNJ2D.js} +6 -6
  91. package/dist/setup-data-dir-Z4IQNMRC.js +34 -0
  92. package/dist/{tool-memory-EFGFXF65.js → tool-memory-5Y3HKHCB.js} +8 -8
  93. package/dist/{tool-memory-registry-adapters-FO6JVQSX.js → tool-memory-registry-adapters-IIORYBCC.js} +3 -3
  94. package/dist/unified-registry-IDUII5J7.js +35 -0
  95. package/dist/{weather-report-PMYQ3WBW.js → weather-report-KA5RT57Q.js} +4 -4
  96. package/dist/weather-report-KA5RT57Q.js.map +1 -0
  97. package/package.json +1 -1
  98. package/dist/chunk-KASBBKAQ.js.map +0 -1
  99. package/dist/chunk-KLSNDPU6.js.map +0 -1
  100. package/dist/chunk-LWOX65CP.js.map +0 -1
  101. package/dist/chunk-OMSKBBL7.js.map +0 -1
  102. package/dist/chunk-QRC3QLUQ.js.map +0 -1
  103. package/dist/chunk-SX2XWCGA.js.map +0 -1
  104. package/dist/chunk-TW6PJYTP.js.map +0 -1
  105. package/dist/chunk-UZJ6IPJR.js +0 -1057
  106. package/dist/chunk-UZJ6IPJR.js.map +0 -1
  107. package/dist/chunk-WKFPKPEM.js.map +0 -1
  108. package/dist/chunk-XDUTAUK3.js.map +0 -1
  109. package/dist/doctor-gateway-report-LRBPPJD4.js +0 -20
  110. package/dist/doctor-live-QFLT5SDB.js.map +0 -1
  111. package/dist/factory-KCKQQAEH.js +0 -31
  112. package/dist/factory-LUKUIB6C.js +0 -17
  113. package/dist/issue-triage-YBVJVAUU.js +0 -20
  114. package/dist/research-helpers-synthesize-X6MVAAKT.js +0 -16
  115. package/dist/setup-config-YNNNR4AE.js +0 -13
  116. package/dist/setup-data-dir-XM5DWH7R.js +0 -35
  117. package/dist/unified-registry-KLNC24HA.js +0 -36
  118. /package/dist/{ast-rule-runner-RI7ZJ4ZI.js.map → ast-rule-runner-3QRCP53C.js.map} +0 -0
  119. /package/dist/{child-mcp-config-73BX4OTR.js.map → child-mcp-config-NWPUDUVE.js.map} +0 -0
  120. /package/dist/{chunk-GAX75XCV.js.map → chunk-2BZXKNLN.js.map} +0 -0
  121. /package/dist/{chunk-QG3VDSWD.js.map → chunk-2HYJTIDY.js.map} +0 -0
  122. /package/dist/{chunk-VLOPXV47.js.map → chunk-53XY7YJD.js.map} +0 -0
  123. /package/dist/{chunk-23QA6GQD.js.map → chunk-66BE4KF4.js.map} +0 -0
  124. /package/dist/{chunk-TDUXUVUU.js.map → chunk-6LWUJOAS.js.map} +0 -0
  125. /package/dist/{chunk-JGY5HMWI.js.map → chunk-7HHXY7LM.js.map} +0 -0
  126. /package/dist/{chunk-J44RKRGQ.js.map → chunk-AFJE7K6Q.js.map} +0 -0
  127. /package/dist/{chunk-WD4DENPC.js.map → chunk-B3RAA47W.js.map} +0 -0
  128. /package/dist/{chunk-RIYFVDYN.js.map → chunk-CSDGNGAG.js.map} +0 -0
  129. /package/dist/{chunk-U37AITDA.js.map → chunk-DCPCO2XG.js.map} +0 -0
  130. /package/dist/{chunk-SS53PZO6.js.map → chunk-EFZRQ67X.js.map} +0 -0
  131. /package/dist/{chunk-7EV3QAKO.js.map → chunk-HUYVIUF3.js.map} +0 -0
  132. /package/dist/{chunk-V26YQQK4.js.map → chunk-I7VX7JWV.js.map} +0 -0
  133. /package/dist/{chunk-LXYT2P2Y.js.map → chunk-IGYZQEKM.js.map} +0 -0
  134. /package/dist/{chunk-XSAUVC6D.js.map → chunk-NLFCAEEK.js.map} +0 -0
  135. /package/dist/{chunk-QM5W3T3O.js.map → chunk-PZMODRBC.js.map} +0 -0
  136. /package/dist/{chunk-GX5ZHZR2.js.map → chunk-QARJHIQM.js.map} +0 -0
  137. /package/dist/{chunk-EJ5EBTAV.js.map → chunk-QTRPH2ZF.js.map} +0 -0
  138. /package/dist/{chunk-FNHVTDHZ.js.map → chunk-R75NZRON.js.map} +0 -0
  139. /package/dist/{chunk-UE7A2XHM.js.map → chunk-RUHKJC3X.js.map} +0 -0
  140. /package/dist/{chunk-4JJI34RV.js.map → chunk-S6XQFO4A.js.map} +0 -0
  141. /package/dist/{chunk-LP5ISXKM.js.map → chunk-SFWQ72ZS.js.map} +0 -0
  142. /package/dist/{chunk-D6E3LJGP.js.map → chunk-T4WTZTZY.js.map} +0 -0
  143. /package/dist/{chunk-JPFRRNRR.js.map → chunk-U7HL7FGS.js.map} +0 -0
  144. /package/dist/{chunk-2DYCHHWW.js.map → chunk-VVMSE5LF.js.map} +0 -0
  145. /package/dist/{chunk-QS5HGPCN.js.map → chunk-VZ7YZ2EF.js.map} +0 -0
  146. /package/dist/{chunk-PXYSAG5B.js.map → chunk-WFMMJWMO.js.map} +0 -0
  147. /package/dist/{chunk-FWQSOPBA.js.map → chunk-YOT3XEZM.js.map} +0 -0
  148. /package/dist/{chunk-JUUGLXSN.js.map → chunk-YRZV6KXZ.js.map} +0 -0
  149. /package/dist/{cli-auth-probe-A7ANEHJ7.js.map → cli-auth-probe-GUK3NXW3.js.map} +0 -0
  150. /package/dist/{cli-circuit-breaker-62YOQQT3.js.map → cli-circuit-breaker-VWARWNGU.js.map} +0 -0
  151. /package/dist/{cli-readiness-O6EOQV4L.js.map → cli-readiness-S23DWZCS.js.map} +0 -0
  152. /package/dist/{composite-router-YPZ3D5Y6.js.map → cli-server-gateway-DJXSHHXA.js.map} +0 -0
  153. /package/dist/{consensus-vote-RNQQUBXO.js.map → composite-router-3CBLBUGZ.js.map} +0 -0
  154. /package/dist/{context-retriever-HVPLM6DH.js.map → consensus-vote-JMWTJO4M.js.map} +0 -0
  155. /package/dist/{doctor-deep-UZQTD65D.js.map → context-retriever-P6ZE6UXS.js.map} +0 -0
  156. /package/dist/{doctor-gateway-report-LRBPPJD4.js.map → doctor-deep-HBIDPGWI.js.map} +0 -0
  157. /package/dist/{expert-bridge-O3UZXLGB.js.map → doctor-gateway-report-FWV7UN2Q.js.map} +0 -0
  158. /package/dist/{factory-KCKQQAEH.js.map → expert-bridge-3VWOHLC7.js.map} +0 -0
  159. /package/dist/{factory-LUKUIB6C.js.map → factory-A44THDRG.js.map} +0 -0
  160. /package/dist/{improvement-review-7IABFAU3.js.map → factory-YPJXDMN4.js.map} +0 -0
  161. /package/dist/{issue-triage-YBVJVAUU.js.map → improvement-review-FIKPTCPE.js.map} +0 -0
  162. /package/dist/{init-opencode-RYPBCM4P.js.map → init-opencode-YRHLGHIE.js.map} +0 -0
  163. /package/dist/{learning-persistence-FB4U5AX2.js.map → issue-triage-BLZHWC6U.js.map} +0 -0
  164. /package/dist/{model-config-helpers-QNV3KD2W.js.map → learning-persistence-X24OOBYY.js.map} +0 -0
  165. /package/dist/{openai-compat-adapter-GPZDIR3D.js.map → model-config-helpers-OQEZU2ZG.js.map} +0 -0
  166. /package/dist/{pr-reviewer-helpers-7SMNNDFJ.js.map → openai-compat-adapter-GRJA6RPZ.js.map} +0 -0
  167. /package/dist/{outcome-store-adapter-WRONSTUD.js.map → outcome-store-adapter-7CKYWUZV.js.map} +0 -0
  168. /package/dist/{repo-security-plan-LFWLVEL2.js.map → pr-reviewer-helpers-LKHPRW3X.js.map} +0 -0
  169. /package/dist/{registry-command-U7K6HIBK.js.map → registry-command-4LP4OSND.js.map} +0 -0
  170. /package/dist/{research-helpers-synthesize-X6MVAAKT.js.map → repo-security-plan-SOFUCHO4.js.map} +0 -0
  171. /package/dist/{routing-memory-OCIVXKOU.js.map → research-helpers-synthesize-SXNAJWHX.js.map} +0 -0
  172. /package/dist/{session-memory-4LMEWO3X.js.map → routing-memory-TWCXFPAD.js.map} +0 -0
  173. /package/dist/{setup-config-YNNNR4AE.js.map → session-memory-YVT5M4AN.js.map} +0 -0
  174. /package/dist/{setup-data-dir-XM5DWH7R.js.map → setup-config-JGHFR4P3.js.map} +0 -0
  175. /package/dist/{setup-custom-api-QEPUCHOX.js.map → setup-custom-api-EFAWNJ2D.js.map} +0 -0
  176. /package/dist/{tool-memory-EFGFXF65.js.map → setup-data-dir-Z4IQNMRC.js.map} +0 -0
  177. /package/dist/{tool-memory-registry-adapters-FO6JVQSX.js.map → tool-memory-5Y3HKHCB.js.map} +0 -0
  178. /package/dist/{unified-registry-KLNC24HA.js.map → tool-memory-registry-adapters-IIORYBCC.js.map} +0 -0
  179. /package/dist/{weather-report-PMYQ3WBW.js.map → unified-registry-IDUII5J7.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-command-catalog.ts","../src/cli-help-text.ts","../src/cli-types.ts","../src/cli-server-gateway.ts"],"sourcesContent":["/**\n * nexus-agents CLI command catalog (Issue #2135).\n *\n * Single source of truth for every top-level command: name, one-line\n * description, and the *audience* that cares about it. `renderHelp`\n * consumes this to produce tiered output:\n *\n * - Default `nexus-agents --help`: essential + advanced, grouped\n * - `nexus-agents --help --all`: everything, grouped\n *\n * Maintainer-audience commands (benchmarks, release tooling, deep\n * observability) are still fully functional — they just don't clutter\n * the default --help. `nexus-agents <cmd> --help` still works for all\n * of them.\n *\n * @module cli-command-catalog\n */\n\n/** Who the command is aimed at. Drives the default --help filter. */\nexport type CommandAudience = 'essential' | 'advanced' | 'maintainer' | 'internal';\n\n/** One entry per top-level command. */\nexport interface CommandCatalogEntry {\n readonly command: string;\n readonly description: string;\n readonly audience: CommandAudience;\n}\n\n/**\n * Hard cap on the `essential` audience band. Enforced by the `keeps the\n * essential tier small (<=12) so new users are not overwhelmed` test in\n * `cli-command-catalog.test.ts`.\n *\n * Rationale: the default `nexus-agents --help` lists every `essential` entry\n * up front. Past 12 it stops feeling curated — new users start scanning,\n * skipping, and missing the actually-onboarding-critical commands. If you\n * need a 13th, demote something else to `advanced` first.\n *\n * History (#2492): the cap has been tripped silently twice — first by `auth`\n * (deliberate, deserved promotion), second by `usage` (#2469, not reviewed\n * against the cap). The CI test catches it; this comment is the contract.\n */\nexport const ESSENTIAL_AUDIENCE_CAP = 12;\n\n/**\n * All top-level commands, in display order within their audience band.\n *\n * Audience rationale:\n * - **essential**: what a new user needs to install, configure, verify, and\n * run their first task. Capped at 12 entries (`ESSENTIAL_AUDIENCE_CAP`) —\n * see the cap's docstring for the policy. When proposing a 13th, demote\n * an existing entry to `advanced` first.\n * - **advanced**: useful day-to-day but not first-touch (session mgmt,\n * capability inspection, workflow scaffolding, auth token rotation).\n * Telemetry/operator-facing dashboards (e.g. `usage`,\n * `improvement-review`) belong here — operators reach for them after\n * they've been running tasks, not on first install.\n * - **maintainer**: benchmarks, release tooling, self-audits, deep\n * observability dashboards, dogfooding helpers.\n * - **internal**: dev/eval loops that aren't part of the product surface\n * (e2e-eval, routing-ab, memory-benchmark). Hidden from both default\n * `--help` AND `--help --all`. Still present for entrypoint extraction\n * (repo-index / entrypoints.yaml) because they're real CLI commands.\n */\nexport const COMMAND_CATALOG: readonly CommandCatalogEntry[] = [\n // ── Essential ────────────────────────────────────────────────────────────\n {\n command: '(default)',\n description: 'Start MCP server with stdio transport',\n audience: 'essential',\n },\n {\n command: 'hello',\n description: 'Show welcome message and quick start (no API keys needed)',\n audience: 'essential',\n },\n {\n command: 'setup',\n description: 'Configure CLI integration (MCP + .rules + data dirs)',\n audience: 'essential',\n },\n {\n command: 'verify',\n description: 'Check install health (sqlite, adapters, config)',\n audience: 'essential',\n },\n {\n command: 'doctor',\n description: 'Detailed health check; no model completions by default; --live probes models',\n audience: 'essential',\n },\n {\n command: 'config',\n description: 'Manage configuration (init, get, set, list, export, import)',\n audience: 'essential',\n },\n {\n command: 'orchestrate',\n description: 'Execute a task via CLI tools (standalone mode)',\n audience: 'essential',\n },\n {\n command: 'vote',\n // Default panel is 7 roles; `--quick` runs 3 (getVoterRoles in\n // mcp/tools/consensus-vote.ts). Prior drift: \"5-6 agents\" here, \"6 agents\"\n // in HELP_TEXT, \"6 agents by default\" in COMMAND_HELP — all wrong (#3209).\n description: 'Run consensus vote on a proposal (7 agents; --quick uses 3)',\n audience: 'essential',\n },\n {\n command: 'workflow',\n description: 'Manage and run workflow templates (list, run)',\n audience: 'essential',\n },\n {\n command: 'expert',\n description: 'Manage expert agents (list, create, execute)',\n audience: 'essential',\n },\n {\n command: 'research',\n description: 'Manage research registry (status, add, stats, refresh)',\n audience: 'essential',\n },\n\n // ── Advanced ─────────────────────────────────────────────────────────────\n {\n command: 'tour',\n description:\n 'Guided walkthrough of the four headline tools — no API keys, no quota (#2851). --non-interactive runs straight through.',\n audience: 'advanced',\n },\n {\n command: 'session',\n description: 'Manage session persistence (list, show, export, delete)',\n audience: 'advanced',\n },\n {\n command: 'auth',\n description:\n 'Manage authentication: init/show/rotate MCP tokens; status shows per-CLI auth state',\n audience: 'essential',\n },\n {\n command: 'login',\n description: '[deprecated alias] Soft alias of \"auth status\"; renamed in #2449',\n audience: 'maintainer',\n },\n {\n command: 'usage',\n description:\n 'Cost / usage / quality dashboard from per-call telemetry (#2469). --format=json for scripting.',\n audience: 'advanced',\n },\n {\n command: 'status',\n description: 'At-a-glance project health dashboard',\n audience: 'advanced',\n },\n {\n command: 'capabilities',\n description: 'Show model capabilities matrix',\n audience: 'advanced',\n },\n {\n command: 'mode',\n description: 'Inspect detected mode (server/orchestrator) + signals + reasoning (#3214)',\n audience: 'advanced',\n },\n {\n command: 'jobs',\n description:\n 'Async job-record maintenance (#6224): `prune` deletes terminal records past the 7-day retention window and marks abandoned pending records failed; --dry-run prints the counts only.',\n audience: 'advanced',\n },\n {\n command: 'registry',\n description: 'Inspect + refresh the dynamic model registry (doctor / refresh)',\n audience: 'advanced',\n },\n {\n command: 'migrate',\n description:\n 'Relocate homedir state (sessions, checkpoints, traces, runs, audit, pipeline, tasks) into <repo>/.nexus-agents/ for users adopting NEXUS_REPO_PREFERRED=1. Cross-repo state stays homedir. --dry-run for a no-op plan. Epic #2872.',\n audience: 'advanced',\n },\n {\n command: 'init',\n description:\n 'Initialize portable nexus-agents config in a repo. Flags: --portable (#2305/#2308/#2311), --install / --uninstall (#2311), --gitignore, --mcp-config, --opencode <path> (#2504), --force, --dry-run.',\n audience: 'advanced',\n },\n {\n command: 'review',\n description: 'Review a GitHub PR (dogfooding helper)',\n audience: 'advanced',\n },\n {\n command: 'scaffold',\n description: 'Generate project files from templates',\n audience: 'advanced',\n },\n {\n command: 'validate',\n description: 'Run unified validation (doctor + fitness + config)',\n audience: 'advanced',\n },\n {\n command: 'index',\n description: 'Generate and manage codebase index',\n audience: 'advanced',\n },\n {\n command: 'improvement-review',\n description:\n 'Observability-driven improvement loop (#2402). Surfaces threshold breaches; --file-issues opt-in.',\n audience: 'advanced',\n },\n {\n command: 'model-drift',\n description:\n 'Report models the registry does not know and registry models no source lists (#6625). --json; --file-issue opt-in.',\n audience: 'maintainer',\n },\n {\n command: 'auto-remediate',\n description:\n 'Run one auto-remediation cycle (#3540). OFF unless NEXUS_AUTO_REMEDIATE=audit|enforce; never auto-merges.',\n audience: 'maintainer',\n },\n {\n command: 'remediation-review',\n description:\n 'Review audit-mode selections: list · panel-judge --batch N [--quick] · sample --n 10 [--seed S] · mark --evaluator --sound|--unsound [--sample id] · sign-off --owner · readiness (human, panel and owner-sample judgments + soak-store alarm).',\n audience: 'maintainer',\n },\n\n // ── Maintainer (hidden by default) ───────────────────────────────────────\n {\n command: 'demo',\n description: 'API-free exploration mode (marketing/demo flow)',\n audience: 'maintainer',\n },\n {\n command: 'hooks',\n description: 'Claude CLI hook integration commands',\n audience: 'maintainer',\n },\n {\n command: 'routing-audit',\n description: 'Debug model routing decisions',\n audience: 'maintainer',\n },\n {\n command: 'fitness-audit',\n description: 'Run CLI orchestration fitness score audit',\n audience: 'maintainer',\n },\n {\n command: 'system-review',\n description: 'Automated system review (5-phase checklist)',\n audience: 'maintainer',\n },\n {\n command: 'sprint',\n description: 'Automated sprint planning from open issues',\n audience: 'maintainer',\n },\n {\n command: 'evaluate',\n description: 'Self-evaluation of codebase components',\n audience: 'maintainer',\n },\n {\n command: 'issue',\n description: 'Issue template validation and management',\n audience: 'maintainer',\n },\n {\n command: 'validation',\n description: 'Learning validation dashboard',\n audience: 'maintainer',\n },\n {\n command: 'learning-metrics',\n description: 'Aggregated learning metrics dashboard',\n audience: 'maintainer',\n },\n {\n command: 'visualize',\n description: 'Generate Mermaid diagrams and ASCII dashboards',\n audience: 'maintainer',\n },\n {\n command: 'health',\n description: 'Swarm health metrics dashboard',\n audience: 'maintainer',\n },\n {\n command: 'release-notes',\n description: 'Generate release notes from git commits',\n audience: 'maintainer',\n },\n {\n command: 'release-validate',\n description: 'Run expert swarm validation for releases',\n audience: 'maintainer',\n },\n {\n command: 'release-announce',\n description: 'Generate release announcements (blog, social)',\n audience: 'maintainer',\n },\n\n // ── Internal (hidden everywhere; here for extractor/index completeness) ──\n {\n command: 'server',\n // Synonym for the no-arg invocation — `nexus-agents` and\n // `nexus-agents server` both run `handleServerCommand`. Listed here for\n // extractor completeness; humans see `(default)` in --help.\n description: 'Start MCP server with stdio transport (explicit form)',\n audience: 'internal',\n },\n {\n command: 'e2e-eval',\n description: 'E2E evaluation scenario runner (dev loop)',\n audience: 'internal',\n },\n {\n command: 'memory-benchmark',\n description: 'Memory-system benchmark runner (dev loop)',\n audience: 'internal',\n },\n {\n command: 'memory-eval',\n description: 'Comparative memory evaluation benchmark (dev loop)',\n audience: 'internal',\n },\n {\n command: 'routing-ab',\n description: 'A/B comparison of routing strategies (dev loop)',\n audience: 'internal',\n },\n {\n command: 'scenario',\n description: 'Execute a named scenario from the testing framework',\n audience: 'internal',\n },\n {\n command: 'warm-up',\n description: 'Warm the model/adapter caches before a run',\n audience: 'internal',\n },\n];\n\n/**\n * Returns the catalog filtered for `--help` output.\n *\n * - `showAll: false` → essential + advanced (the default `--help` surface)\n * - `showAll: true` → essential + advanced + maintainer (`--help --all`)\n *\n * `internal` audience entries are **always excluded** from human-facing\n * output. They're still reachable via `COMMAND_CATALOG` for extractors that\n * need a complete inventory (repo-index, entrypoints.yaml).\n */\nexport function filterCatalog(showAll: boolean): readonly CommandCatalogEntry[] {\n const visible = COMMAND_CATALOG.filter((e) => e.audience !== 'internal');\n if (showAll) return visible;\n return visible.filter((e) => e.audience !== 'maintainer');\n}\n\n/**\n * Returns every real top-level command, including internal ones, but\n * excluding the `(default)` placeholder (no actual handler). Used by\n * entrypoint extractors and the repo-index generator — #2156.\n */\nexport function catalogForExtractors(): readonly CommandCatalogEntry[] {\n return COMMAND_CATALOG.filter((e) => e.command !== '(default)');\n}\n\n/**\n * Looks up the canonical one-line description for a command from the catalog\n * (the single source of truth — #3209). Returns `undefined` if the command is\n * not cataloged.\n *\n * Used by `cli-command-help.ts` so per-command help (`formatCommandHelp`,\n * `formatAllCommandsHelp`) does not keep a third independent copy of the\n * one-line summary. The richer per-command help (flags, examples) still lives\n * in `COMMAND_HELP`; only the one-liner is single-sourced here.\n */\nexport function getCommandDescription(command: string): string | undefined {\n return COMMAND_CATALOG.find((e) => e.command === command)?.description;\n}\n\n/** Groups entries by audience, preserving catalog order within each group. */\nexport function groupByAudience(\n entries: readonly CommandCatalogEntry[]\n): ReadonlyMap<CommandAudience, readonly CommandCatalogEntry[]> {\n const groups = new Map<CommandAudience, CommandCatalogEntry[]>();\n for (const entry of entries) {\n const existing = groups.get(entry.audience) ?? [];\n existing.push(entry);\n groups.set(entry.audience, existing);\n }\n return groups;\n}\n\nconst AUDIENCE_HEADINGS: Record<CommandAudience, string> = {\n essential: 'Essential — install, configure, run',\n advanced: 'Advanced — day-to-day extras',\n maintainer: 'Maintainer — benchmarks, releases, deep diagnostics',\n // Never rendered (filterCatalog strips internal before renderCommandsSection\n // iterates), but required by the Record<CommandAudience, string> contract.\n internal: 'Internal — dev/eval loops (hidden from --help)',\n};\n\n/**\n * Renders the COMMANDS section of `--help`, grouped and tiered.\n *\n * Output shape (indent-sensitive — consumed verbatim inside `COMMANDS:` block):\n *\n * ```\n * Essential — install, configure, run\n * hello Show welcome message...\n * setup Configure CLI integration...\n *\n * Advanced — day-to-day extras\n * ...\n * ```\n *\n * Trailing hint line (\"Run with --all…\") is appended only when `showAll=false`.\n */\nexport function renderCommandsSection(showAll: boolean): string {\n const filtered = filterCatalog(showAll);\n const groups = groupByAudience(filtered);\n const lines: string[] = [];\n const order: CommandAudience[] = showAll\n ? ['essential', 'advanced', 'maintainer']\n : ['essential', 'advanced'];\n for (const audience of order) {\n const entries = groups.get(audience);\n if (entries === undefined || entries.length === 0) continue;\n lines.push(` ${AUDIENCE_HEADINGS[audience]}`);\n for (const entry of entries) {\n lines.push(` ${entry.command.padEnd(16)} ${entry.description}`);\n }\n lines.push('');\n }\n if (!showAll) {\n lines.push(' Run with --all to show maintainer commands (benchmarks, release tooling).');\n }\n return lines.join('\\n').replace(/\\n+$/, '');\n}\n","/**\n * nexus-agents CLI Help Text\n *\n * Help documentation for the CLI commands and options.\n * Extracted from cli-types.ts to maintain file size limits.\n *\n * The COMMANDS list is NO LONGER hardcoded here (#3209). It is generated from\n * `COMMAND_CATALOG` in `cli-command-catalog.ts` — the single source of truth\n * for each command's one-line description — via `renderCommandsSection`. The\n * non-command sections (USAGE, OPTIONS, EXAMPLES) stay static in\n * `HELP_TEXT_FRAME`. `HELP_TEXT` is that frame with the full (`--all`)\n * catalog-derived COMMANDS block stitched in; `renderHelp({ all: false })`\n * stitches in the audience-filtered block instead.\n *\n * Do not reshape the top-level sections (USAGE / COMMANDS / OPTIONS /\n * EXAMPLES): `indexer/entrypoint-extractor.ts` loads this module by AST and\n * the catalog/help snapshot tests assert their presence. (Command names +\n * descriptions for the entrypoint index come from the catalog via\n * `catalogForExtractors()`, not from parsing this text — #2156.)\n *\n * @module cli-help-text\n */\n\nimport { renderCommandsSection } from './cli-command-catalog.js';\n\n/**\n * Placeholder token inside {@link HELP_TEXT_FRAME} that the renderers replace\n * with the catalog-derived COMMANDS block. Distinct from any real help content\n * so the single substitution is unambiguous.\n */\nconst COMMANDS_PLACEHOLDER = '__COMMANDS__';\n\n/**\n * Static help frame: everything except the COMMANDS list, which is a single\n * {@link COMMANDS_PLACEHOLDER} token filled at render time from the catalog.\n */\nconst HELP_TEXT_FRAME = `\nnexus-agents - Intelligent orchestration platform for AI coding tools\n\nUSAGE:\n nexus-agents [OPTIONS]\n nexus-agents [COMMAND] [SUBCOMMAND] [OPTIONS]\n\nCOMMANDS:\n${COMMANDS_PLACEHOLDER}\n\nOPTIONS:\n -h, --help Show this help message\n -v, --version Show version information\n --verbose Enable verbose output\n --interactive Start interactive REPL mode\n -m, --mode <mode> Server mode: server, orchestrator (default: server)\n - server: MCP server only (for Claude CLI integration)\n - orchestrator: CLI orchestrator (calls Gemini/Codex CLIs)\n\nFor command-specific options, run: nexus-agents <command> --help\n(For example: nexus-agents vote --help)\n\nEXAMPLES:\n nexus-agents hello Show welcome + quick start (no API keys needed)\n nexus-agents setup --interactive Run guided setup wizard\n nexus-agents verify Quick install check (run first)\n nexus-agents auth status Per-CLI auth state + login fix instructions\n nexus-agents doctor Detailed CLI/adapter health check\n nexus-agents orchestrate -t \"...\" Run a one-off task via the CLI orchestrator\n nexus-agents vote --quick -p \"X\" 3-agent consensus vote on proposal \"X\"\n nexus-agents --help --all Show every command (incl. maintainer tools)\n\nFor more information, visit: https://github.com/nexus-substrate/nexus-agents\n`.trim();\n\n/** Fills the COMMANDS placeholder in the frame with a catalog-derived block. */\nfunction composeHelp(commandsSection: string): string {\n return HELP_TEXT_FRAME.replace(COMMANDS_PLACEHOLDER, commandsSection);\n}\n\n/**\n * Full (`--all`) help text, with the COMMANDS list generated from\n * `COMMAND_CATALOG` (single source of truth — #3209). Equivalent to\n * `renderHelp({ all: true })`; exported for callers/tests that want the\n * canonical full view as a value.\n */\nexport const HELP_TEXT = composeHelp(renderCommandsSection(true));\n\n/**\n * Renders the top-level help output.\n *\n * @param opts.all - If true, returns the full view (includes maintainer\n * commands like benchmarks and release tooling). If false, returns a tiered\n * view that hides maintainer commands — surfaced via `--all` hint at the\n * bottom of the COMMANDS block. Both views derive the command list (and its\n * one-line descriptions) from `COMMAND_CATALOG`.\n */\nexport function renderHelp(opts: { all: boolean }): string {\n if (opts.all) return HELP_TEXT;\n return composeHelp(renderCommandsSection(false));\n}\n","/* eslint-disable max-lines -- canonical CLI types + parseArgs config, intentionally centralized */\n/**\n * nexus-agents CLI Types\n *\n * Type definitions and constants for the CLI.\n *\n * @module cli-types\n */\n\nimport type { ServerMode } from './cli/index.js';\nimport type {\n ErrorPolicy,\n VoteThreshold,\n VotingStrategy,\n} from './mcp/tools/consensus-vote-types.js';\nimport type { NoQuorumPolicy } from './cli/vote-types.js';\nimport type { VoteRecordPrBinding } from './audit/vote-record.js';\nimport type { CommandResult } from './core/command-result.js';\nimport { VOTE_TIMEOUTS } from './config/timeouts.js';\n\n// Re-export help text from extracted module for backward compatibility\nexport { HELP_TEXT } from './cli-help-text.js';\n\n/**\n * Exit codes for the CLI.\n */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n SERVER_START_FAILED: 1,\n SHUTDOWN_ERROR: 2,\n INVALID_ARGS: 3,\n /** Subcommand is stubbed / advertised but not implemented (#2727). */\n NOT_IMPLEMENTED: 4,\n} as const;\n\n/**\n * A {@link CommandResult} that also carries the process exit code the\n * dispatcher should terminate with (#3210).\n *\n * Handlers RETURN this instead of calling `process.exit` inline, and the\n * single `process.exit` lives at the dispatcher boundary (see `exitWith`).\n * This makes exit behavior unit-testable (assert the returned `exitCode`)\n * without mocking `process.exit`, and centralizes the one process-killing\n * call so its policy is consistent across commands.\n */\nexport interface CliExitResult extends CommandResult {\n /** The exit code the CLI process should terminate with. */\n readonly exitCode: number;\n}\n\n/**\n * Builds a {@link CliExitResult} from a raw exit code, deriving `success`\n * from the conventional `0 == success` mapping. Optional human-readable\n * `message` is preserved for callers/tests.\n */\nexport function cliExit(exitCode: number, message?: string): CliExitResult {\n return message === undefined\n ? { success: exitCode === EXIT_CODES.SUCCESS, exitCode }\n : { success: exitCode === EXIT_CODES.SUCCESS, exitCode, message };\n}\n\n/**\n * Maps a handler's `0|non-0` status to the canonical success/failure exit\n * codes (`SUCCESS` / `SERVER_START_FAILED`) used by the bulk of CLI\n * commands, then wraps it in a {@link CliExitResult}. Centralizes the\n * `exitCode === 0 ? SUCCESS : SERVER_START_FAILED` ternary that was\n * duplicated across every handler.\n */\nexport function cliExitFromStatus(status: number, message?: string): CliExitResult {\n return cliExit(\n status === EXIT_CODES.SUCCESS ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED,\n message\n );\n}\n\n/**\n * Explicit sentinel a handler RETURNS to signal \"I own my own process\n * lifecycle — do NOT force an exit at the dispatcher\" (#3942).\n *\n * Before #3942 this was conveyed by returning `undefined`/`void`, which\n * conflated *intentional* delegation (the MCP stdio server runs until its\n * transport closes, then exits itself) with an *accidentally dropped*\n * return on an error path. A missing return was not a compile error, so\n * `exitWith` would silently no-op and a non-zero exit code would be lost.\n *\n * By typing every handler as {@link CliHandlerResult} (a union that\n * excludes `undefined`/`void`), a handler that falls off the end without\n * returning is a TS2366 compile error (\"Function lacks ending return\n * statement…\"). Lifecycle-owning handlers RETURN this sentinel explicitly,\n * making delegation a deliberate, checked choice.\n *\n * Implemented as a branded const so it is a single unique value (not just\n * any object), and `exitWith` can match it by identity.\n */\nexport const LIFECYCLE_DELEGATED = {\n __lifecycleDelegated: true,\n} as const;\n\n/**\n * The type of {@link LIFECYCLE_DELEGATED}. A handler whose return type\n * includes this signals lifecycle delegation; see the sentinel docs.\n */\nexport type LifecycleDelegated = typeof LIFECYCLE_DELEGATED;\n\n/**\n * The exhaustive return contract for every CLI command handler dispatched\n * from `cli-commands.ts` (#3942). A handler EITHER returns a\n * {@link CliExitResult} (the dispatcher exits with its `exitCode`) OR the\n * {@link LIFECYCLE_DELEGATED} sentinel (the dispatcher does nothing because\n * the handler owns the process lifecycle). There is deliberately NO\n * `undefined`/`void` member: that is what makes a dropped return a compile\n * error rather than a silently-swallowed exit code.\n */\nexport type CliHandlerResult = CliExitResult | LifecycleDelegated;\n\n/**\n * Type guard distinguishing the {@link LIFECYCLE_DELEGATED} sentinel from a\n * {@link CliExitResult}. Used by `exitWith` to handle the handler-result\n * union exhaustively without a `void` fallthrough.\n *\n * Discriminates on the brand property rather than reference identity so the\n * guard is robust across module-boundary/test-mock copies of the sentinel\n * while remaining unambiguous (a `CliExitResult` never carries this brand).\n */\nexport function isLifecycleDelegated(result: CliHandlerResult): result is LifecycleDelegated {\n return (\n (result as Partial<LifecycleDelegated>).__lifecycleDelegated === true && !('exitCode' in result)\n );\n}\n\n/**\n * CLI command types that can be executed.\n */\nexport type CliCommand =\n | 'server'\n | 'help'\n | 'version'\n | 'hello'\n | 'config'\n | 'expert'\n | 'workflow'\n | 'doctor'\n | 'verify'\n | 'review'\n | 'routing-audit'\n | 'orchestrate'\n | 'system-review'\n | 'vote'\n | 'index'\n | 'research'\n | 'validation'\n | 'learning-metrics'\n | 'setup'\n | 'hooks'\n | 'demo'\n | 'sprint'\n | 'session'\n | 'evaluate'\n | 'issue'\n | 'fitness-audit'\n | 'release-notes'\n | 'release-validate'\n | 'release-announce'\n | 'scaffold'\n | 'visualize'\n | 'capabilities'\n | 'status'\n | 'memory-benchmark'\n | 'auth'\n | 'scenario'\n | 'warm-up'\n | 'e2e-eval'\n | 'routing-ab'\n | 'memory-eval'\n | 'health'\n | 'init'\n | 'validate'\n | 'registry'\n | 'login'\n | 'usage'\n | 'migrate'\n | 'tour'\n | 'improvement-review'\n | 'model-drift'\n | 'auto-remediate'\n | 'remediation-review'\n | 'mode'\n | 'jobs';\n\n/**\n * Parsed CLI arguments and command.\n */\nexport interface ParsedCliArgs {\n command: CliCommand;\n subcommand?: string;\n options: {\n help: boolean;\n version: boolean;\n verbose: boolean;\n interactive: boolean;\n // Tiered --help output (Issue #2135)\n all: boolean;\n mode: ServerMode;\n output?: string;\n force: boolean;\n format: string;\n input?: string;\n dryRun: boolean;\n banditStats: boolean;\n // Review command options\n setup: boolean;\n skipChecks: boolean;\n // Orchestrate command options (also used in orchestrator mode)\n task?: string;\n model?: string;\n maxTokens?: number;\n maxCostUsd?: number;\n engine?: 'router' | 'puppeteer';\n learn?: boolean;\n policyPath?: string;\n maxSteps?: number;\n // System review command options\n createIssue: boolean;\n fix: boolean;\n // Vote command options\n proposal?: string;\n /** File inlined into every voter proposal (--artifact-file). */\n artifactFile?: string;\n /** Legacy spelling of the bar; `strategy` wins when both are given (#6227). */\n threshold?: VoteThreshold;\n /** #6227 — `--strategy`, the tool's own enum, passed to the engine as the MCP tool passes it. */\n strategy?: VotingStrategy;\n /** #6227 — `--ratifies-pr <n>@<sha>`, already parsed into the record's binding shape. */\n ratifiesPr?: VoteRecordPrBinding;\n quick: boolean;\n timeoutMs?: number;\n /** #2630 — see `applyErrorPolicy`. */\n errorPolicy?: ErrorPolicy;\n /** #4135 — how the vote command maps a `no_quorum` decision. Default `fail`. */\n onNoQuorum?: NoQuorumPolicy;\n /** #4472 / #4941 — repeatable `--option`, the named alternatives to tally. */\n options?: string[];\n /** #6110 — `--project`, the project the panel judges (replaces `nexus-agents` in the prompts). */\n project?: string;\n // Learning-metrics and validation command options\n period?: string;\n export?: string;\n noTrends?: boolean;\n // Setup command options (Issue #363, #416, #1252, #1253, #1259, #1263)\n nonInteractive: boolean;\n skipMcp: boolean;\n skipRules: boolean;\n skipHooks: boolean;\n skipConfig: boolean;\n skipOpencode: boolean;\n skipGemini: boolean;\n skipCodex: boolean;\n scope?: 'user' | 'project';\n // Setup --custom-api for OpenAI-compatible gateway configuration (#2124)\n customApi?: string;\n customApiKey?: string;\n customModel?: string;\n // Demo command options\n mock: boolean;\n // Doctor command options (Issue #1031)\n deep: boolean;\n /**\n * Run the `serves` readiness level: a real completion per adapter (#4376).\n *\n * Opt-in because it spends generation quota. The default run proves\n * `installed` and `authenticated` only, and reports `serves` as\n * not-attempted rather than assuming it.\n */\n live: boolean;\n /** `doctor --gateway` (#6609): print the measured gateway section. */\n gateway: boolean;\n /** `doctor --probe` (#6609): one completion per gateway family; spends tokens. */\n probe: boolean;\n // Registry command options (#2179)\n json?: boolean;\n source?: string;\n /** model-drift `--file-issue` (#6625): open one issue per new model with `gh`. */\n fileIssue?: boolean;\n // init --portable command options (#2305)\n portable?: boolean;\n gitignore?: boolean;\n // init --portable --mcp-config flag (#2308)\n mcpConfig?: boolean;\n // init --portable --install / --uninstall flags (#2311)\n install?: boolean;\n uninstall?: boolean;\n // init --opencode <path> flag (#2504)\n opencode?: string;\n validate?: boolean;\n // remediation-review command options (#3765)\n evaluator?: string;\n owner?: string;\n note?: string;\n sound?: boolean;\n unsound?: boolean;\n batch?: string;\n n?: string;\n seed?: string;\n sample?: string;\n // improvement-review command options (#2444, #6636)\n 'file-issues'?: boolean;\n fileIssues?: boolean;\n 'lookback-days'?: string;\n lookbackDays?: string;\n 'min-sample-size'?: string;\n minSampleSize?: string;\n 'fitness-floor'?: string;\n fitnessFloor?: string;\n // session command options (#6693)\n limit?: string;\n markdown?: boolean;\n // usage command options (#6693)\n since?: string;\n until?: string;\n // validation command options (#6693)\n 'task-type'?: string;\n taskType?: string;\n 'min-sample'?: string;\n minSample?: string;\n // Subcommand flags the parser still rejected after #6705 (#6693 follow-up).\n /** `sprint --vote`, `research review|prioritize --vote`. */\n vote?: boolean;\n /** `research discover|review|prioritize|autofile --topic=<t>`. */\n topic?: string;\n /** `research status --status=<s>`. */\n status?: string;\n /** `research review --create-issues`. */\n createIssues?: boolean;\n /** `research autofile --max=<n>`. */\n max?: number;\n /** `research index --generate | --check`. */\n generate?: boolean;\n check?: boolean;\n /** `research index --validate --strict`, `release-validate --strict`. */\n strict?: boolean;\n /** `research index --silent`. */\n silent?: boolean;\n /** `research index --no-check-files`. */\n noCheckFiles?: boolean;\n /** `release-validate --skip <validator>` (repeatable). */\n skip?: string[];\n };\n positionals: string[];\n}\n\n/**\n * parseArgs configuration for the CLI.\n * (Source: Node.js 22.x util.parseArgs documentation)\n */\nexport const PARSE_ARGS_CONFIG = {\n options: {\n help: {\n type: 'boolean' as const,\n short: 'h',\n default: false,\n },\n version: {\n type: 'boolean' as const,\n short: 'v',\n default: false,\n },\n verbose: {\n type: 'boolean' as const,\n default: false,\n },\n interactive: {\n type: 'boolean' as const,\n default: false,\n },\n // Tiered --help output (Issue #2135): `--help --all` unhides maintainer commands\n all: {\n type: 'boolean' as const,\n default: false,\n },\n mode: {\n type: 'string' as const,\n short: 'm',\n default: 'server',\n },\n output: {\n type: 'string' as const,\n short: 'o',\n },\n force: {\n type: 'boolean' as const,\n short: 'f',\n default: false,\n },\n format: {\n type: 'string' as const,\n default: 'table',\n },\n input: {\n type: 'string' as const,\n short: 'i',\n },\n 'dry-run': {\n type: 'boolean' as const,\n default: false,\n },\n 'bandit-stats': {\n type: 'boolean' as const,\n default: false,\n },\n // Review command options\n setup: {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-checks': {\n type: 'boolean' as const,\n default: false,\n },\n // Orchestrate command options (also used in orchestrator mode)\n task: {\n type: 'string' as const,\n short: 't',\n },\n model: {\n type: 'string' as const,\n },\n 'max-tokens': {\n type: 'string' as const,\n },\n 'max-cost-usd': {\n type: 'string' as const,\n },\n // Orchestrate engine options (Issue #386)\n engine: {\n type: 'string' as const,\n default: 'router',\n },\n learn: {\n type: 'boolean' as const,\n default: false,\n },\n 'policy-path': {\n type: 'string' as const,\n },\n 'max-steps': {\n type: 'string' as const,\n },\n // System review command options\n 'create-issue': {\n type: 'boolean' as const,\n default: false,\n },\n fix: {\n type: 'boolean' as const,\n default: false,\n },\n // Vote command options\n proposal: {\n type: 'string' as const,\n short: 'p',\n },\n // Repeatable. No short letter: every free one is taken, and the two\n // collisions that already existed silently bound the wrong option (#4922).\n option: {\n type: 'string' as const,\n multiple: true as const,\n },\n // No `short`. `parseArgs` takes one options object for every command, so\n // a short letter is global: `-t` was already `task`, which won, and\n // `vote -t supermajority` silently ran a simple-majority vote. Long form\n // only — `cli-types.test.ts` pins that no two options share a letter.\n threshold: {\n type: 'string' as const,\n },\n // #6227 — the bar as the tool spells it. `threshold` is the legacy spelling;\n // the engine's `resolveStrategy` lets `strategy` win when both are given.\n strategy: {\n type: 'string' as const,\n },\n 'artifact-file': {\n type: 'string' as const,\n },\n // #6227 — `<pr>@<40-hex sha>`: binds the record to a governor-path PR for\n // `scripts/append-ratification-record.ts`. Validated in `buildVoteOptions`.\n 'ratifies-pr': {\n type: 'string' as const,\n },\n quick: {\n type: 'boolean' as const,\n short: 'q',\n default: false,\n },\n // #6236 — seconds, read from the same constant `vote --help` renders and\n // `runVote` falls back to. A hard-coded '90' here ran every seat at less\n // than a third of the #1640 budget while the help said 300.\n timeout: {\n type: 'string' as const,\n default: String(VOTE_TIMEOUTS.defaultMs / 1000),\n },\n // #2630 — error policy for the vote command.\n 'error-policy': {\n type: 'string' as const,\n },\n // #4135 — how the vote command maps a no_quorum decision (fail|exit2|retry).\n 'on-no-quorum': {\n type: 'string' as const,\n },\n // #6110 — the project the voter prompts name; derived from the cwd when absent.\n project: {\n type: 'string' as const,\n },\n // Learning-metrics command options\n // No `short` — `-p` is `proposal`, which was declared first and won. See\n // the note on `threshold`.\n period: {\n type: 'string' as const,\n },\n export: {\n type: 'string' as const,\n },\n 'no-trends': {\n type: 'boolean' as const,\n default: false,\n },\n // Setup command options (Issue #363)\n 'non-interactive': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-mcp': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-rules': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-hooks': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-config': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-opencode': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-gemini': {\n type: 'boolean' as const,\n default: false,\n },\n 'skip-codex': {\n type: 'boolean' as const,\n default: false,\n },\n scope: {\n type: 'string' as const,\n default: 'user',\n },\n // Setup --custom-api for OpenAI-compatible gateway configuration (#2124)\n 'custom-api': {\n type: 'string' as const,\n },\n 'custom-api-key': {\n type: 'string' as const,\n },\n 'custom-model': {\n type: 'string' as const,\n },\n // Demo command options\n mock: {\n type: 'boolean' as const,\n default: false,\n },\n // Doctor command options (Issue #1031)\n deep: {\n type: 'boolean' as const,\n default: false,\n },\n // Doctor live readiness probe (#4376)\n live: {\n type: 'boolean' as const,\n default: false,\n },\n // Doctor gateway section and opt-in completion probe (#6609)\n gateway: {\n type: 'boolean' as const,\n default: false,\n },\n probe: {\n type: 'boolean' as const,\n default: false,\n },\n // Registry command options (#2179)\n json: {\n type: 'boolean' as const,\n default: false,\n },\n // model-drift command option (#6625)\n 'file-issue': {\n type: 'boolean' as const,\n default: false,\n },\n source: {\n type: 'string' as const,\n },\n // init --portable command options (#2305)\n portable: {\n type: 'boolean' as const,\n default: false,\n },\n gitignore: {\n type: 'boolean' as const,\n default: false,\n },\n // init --portable --mcp-config flag (#2308)\n 'mcp-config': {\n type: 'boolean' as const,\n default: false,\n },\n // init --portable --install / --uninstall flags (#2311)\n install: {\n type: 'boolean' as const,\n default: false,\n },\n uninstall: {\n type: 'boolean' as const,\n default: false,\n },\n // improvement-review command options (#2444)\n 'lookback-days': {\n type: 'string' as const,\n },\n 'file-issues': {\n type: 'boolean' as const,\n default: false,\n },\n 'min-sample-size': {\n type: 'string' as const,\n },\n 'fitness-floor': {\n type: 'string' as const,\n },\n // init --opencode <path> flag (#2504)\n opencode: {\n type: 'string' as const,\n },\n validate: {\n type: 'boolean' as const,\n default: false,\n },\n // remediation-review command options (#3765)\n evaluator: {\n type: 'string' as const,\n },\n owner: {\n type: 'string' as const,\n },\n note: {\n type: 'string' as const,\n },\n sound: {\n type: 'boolean' as const,\n default: false,\n },\n unsound: {\n type: 'boolean' as const,\n default: false,\n },\n batch: { type: 'string' as const },\n n: { type: 'string' as const },\n seed: { type: 'string' as const },\n sample: { type: 'string' as const },\n // session command options (#6693)\n limit: {\n type: 'string' as const,\n },\n markdown: {\n type: 'boolean' as const,\n default: false,\n },\n // usage command options (#6693)\n since: {\n type: 'string' as const,\n },\n until: {\n type: 'string' as const,\n },\n // validation command options (#6693)\n 'task-type': {\n type: 'string' as const,\n },\n 'min-sample': {\n type: 'string' as const,\n },\n // #6693 follow-up — subcommand flags that usage text advertised and\n // handlers read, still rejected after #6705. Forwarded by\n // `buildSubcommandFlagOptions` (cli/subcommand-flag-options.ts). No short\n // letters: a short letter is global (see the note on `threshold`).\n vote: { type: 'boolean' as const, default: false },\n topic: { type: 'string' as const },\n status: { type: 'string' as const },\n 'create-issues': { type: 'boolean' as const, default: false },\n max: { type: 'string' as const },\n generate: { type: 'boolean' as const, default: false },\n check: { type: 'boolean' as const, default: false },\n strict: { type: 'boolean' as const, default: false },\n silent: { type: 'boolean' as const, default: false },\n 'no-check-files': { type: 'boolean' as const, default: false },\n skip: { type: 'string' as const, multiple: true as const },\n },\n allowPositionals: true,\n strict: true,\n} as const;\n\n/**\n * Every command name {@link isValidCommand} accepts. Exported so the parity\n * gate (`command-parity.test.ts`, #3212) can assert it stays consistent with\n * the real dispatch tables and `COMMAND_CATALOG`, rather than trusting the\n * `isValidCommand` predicate alone.\n */\nexport const VALID_COMMANDS: readonly CliCommand[] = [\n 'server',\n 'help',\n 'version',\n 'hello',\n 'config',\n 'expert',\n 'workflow',\n 'doctor',\n 'verify',\n 'review',\n 'routing-audit',\n 'orchestrate',\n 'system-review',\n 'vote',\n 'index',\n 'research',\n 'validation',\n 'learning-metrics',\n 'setup',\n 'hooks',\n 'demo',\n 'sprint',\n 'session',\n 'evaluate',\n 'issue',\n 'fitness-audit',\n 'release-notes',\n 'release-validate',\n 'release-announce',\n 'scaffold',\n 'visualize',\n 'capabilities',\n 'status',\n 'memory-benchmark',\n 'auth',\n 'scenario',\n 'warm-up',\n 'e2e-eval',\n 'routing-ab',\n 'memory-eval',\n 'health',\n 'init',\n 'validate',\n 'registry',\n 'login',\n 'usage',\n 'improvement-review',\n 'model-drift',\n 'migrate',\n 'tour',\n 'auto-remediate',\n 'remediation-review',\n 'mode',\n 'jobs',\n];\n\n/**\n * Checks if a string is a valid CLI command.\n */\nexport function isValidCommand(value: string): value is CliCommand {\n return (VALID_COMMANDS as readonly string[]).includes(value);\n}\n","/**\n * Gateway adapter bootstrap (#2502, child 2 of epic #2500).\n *\n * The OpenAI-compatible gateway adapter (`adapters/openai-compat-adapter.ts`,\n * #2468) was implemented but never wired into the runtime. This module\n * closes that loop: at MCP-server startup, when `NEXUS_OPENAI_COMPAT_URL`\n * + `NEXUS_OPENAI_COMPAT_KEY` are set, we discover the gateway's models\n * and produce a single `IModelAdapter` that orchestrator/expert tools can\n * use directly. In sandbox mode (#2501), we fail-fast on misconfiguration\n * because there's no human at a CLI prompt to recover.\n *\n * @module cli-server-gateway\n */\n\nimport type { ILogger, IModelAdapter } from './core/index.js';\nimport {\n readOpenAICompatEndpoint,\n readOpenAICompatEnv,\n buildOpenAICompatAdapters,\n} from './adapters/openai-compat-adapter.js';\nimport { createGatewayArmAdapter } from './adapters/gateway-arm-adapter.js';\nimport { discoverGatewayOnce } from './adapters/gateway-discovery.js';\nimport {\n GatewayHostRefusedError,\n type GatewayHostRefused,\n} from './adapters/gateway-host-status.js';\nimport { GatewayRediscovery, setGatewayRediscovery } from './adapters/gateway-rediscovery.js';\nimport { setGatewayCatalog } from './adapters/sdk/gateway-catalog.js';\nimport {\n logGatewaySlotMapping,\n resolveGatewayDefault,\n setGatewaySlotCatalog,\n} from './adapters/gateway-family-slots.js';\nimport { gatewayEndpointRejection } from './adapters/sdk/gateway-cost.js';\nimport { hostnameOf } from './adapters/sdk/gateway-env.js';\nimport type { IResilientAdapter } from './adapters/resilient-adapter-types.js';\nimport { getDefaultCliCircuitBreakerRegistry } from './cli-adapters/cli-circuit-breaker.js';\nimport { isEndpointArmId, type EndpointArmId } from './cli-adapters/types-core.js';\nimport { detectSandbox } from './config/sandbox-detection.js';\nimport { getGlobalRegistry } from './adapters/unified-registry.js';\nimport { parseBoolEnv } from './config/defaults-env.js';\nimport { EXIT_CODES } from './cli-types.js';\n\n/**\n * Wire ALL discovered gateway adapters — one per model the gateway serves\n * (#4040), so the voter path can round-robin roles across distinct models\n * (per-role diversity, all in-process).\n *\n * Behavioural matrix:\n *\n * | Sandbox | Env vars | Probe | Outcome |\n * | :------ | :------- | :------ | :--------------------------------------- |\n * | active | unset | n/a | exit(SERVER_START_FAILED) |\n * | active | set | fails | exit(SERVER_START_FAILED) with HTTP info |\n * | active | set | succeed | log + return every discovered adapter |\n * | inactive| unset | n/a | return undefined (CLI flow handles it) |\n * | inactive| set | fails | log warning + return undefined |\n * | inactive| set | succeed | log + return every discovered adapter |\n *\n * A gateway listing 0 models is treated as a failed probe. Which adapter a\n * tool uses by default is {@link resolveDefaultModelAdapter}'s decision, not\n * list order.\n */\nexport async function tryWireGatewayAdapters(\n logger: ILogger\n): Promise<readonly IModelAdapter[] | undefined> {\n return (await wireGatewayOnce(logger)).adapters;\n}\n\n/** One wiring attempt's adapters, and whether a later attempt could succeed. */\ninterface WiringOutcome {\n readonly adapters: readonly IModelAdapter[] | undefined;\n readonly retryable: boolean;\n}\n\n/**\n * One wiring attempt. `retryable` is true when a gateway is configured but\n * the probe failed for a reason that can clear on its own — unreachable,\n * error status, zero models — and false when retrying cannot help: not\n * configured, or refused by the private-address guard (allowing it is an env\n * change, which needs a restart). Lazy re-discovery (#6608) arms only on\n * `retryable`.\n */\nasync function wireGatewayOnce(logger: ILogger): Promise<WiringOutcome> {\n const sandboxActive = detectSandbox().active;\n const env = readOpenAICompatEnv();\n if (env === null) {\n handleMissingEnv(logger, sandboxActive);\n noticeCliSubprocessFallback(logger);\n return { adapters: undefined, retryable: false };\n }\n\n // The process's one probe (#4392): a lazy discovery that ran first is\n // reused, never repeated, and a later lazy call reuses this one.\n const result = await discoverGatewayOnce(logger);\n if (result === null) {\n // env-was-set guard; build contract allows it\n noticeCliSubprocessFallback(logger);\n return { adapters: undefined, retryable: false };\n }\n if (!result.ok && result.error instanceof GatewayHostRefusedError) {\n handleHostRefused(logger, sandboxActive, result.error.status);\n noticeCliSubprocessFallback(logger);\n return { adapters: undefined, retryable: false };\n }\n if (!result.ok) {\n handleProbeFailure(logger, sandboxActive, result.error.message);\n noticeCliSubprocessFallback(logger);\n return { adapters: undefined, retryable: true };\n }\n if (result.value.length === 0) {\n handleZeroModels(logger, sandboxActive);\n noticeCliSubprocessFallback(logger);\n return { adapters: undefined, retryable: true };\n }\n\n // Log the discovered model IDs at info level — operators want to confirm\n // the gateway's catalog matches what they configured upstream. The API\n // key never reaches logs (env-only read), and neither does the full base\n // URL — it can carry userinfo — only its host (#4392 increment 3).\n logger.info('OpenAI-compatible gateway wired', {\n host: hostnameOf(env.baseUrl),\n modelCount: result.value.length,\n models: result.value.map((a) => a.modelId),\n });\n return { adapters: result.value, retryable: false };\n}\n\n/**\n * One-time operator notice (#4255): whenever no in-process gateway ends up\n * wired — env unset, probe failed, or the gateway listed 0 models — voter\n * and consensus calls fall through to the CLI-subprocess round-robin path\n * (`voter-agents.ts` `getAvailableClis`). That path is slower (~90s wall\n * time observed) and depends on each CLI's own auth/quota, but nothing told\n * the operator a faster in-process option exists (#4040). Logged once per\n * process via {@link cliSubprocessFallbackNoticeLogged} so a busy startup\n * (or repeated calls in tests) can't spam it.\n */\nlet cliSubprocessFallbackNoticeLogged = false;\n\nfunction noticeCliSubprocessFallback(logger: ILogger): void {\n if (cliSubprocessFallbackNoticeLogged) return;\n cliSubprocessFallbackNoticeLogged = true;\n logger.info(\n 'No in-process gateway is configured, so voter/consensus calls will spawn CLI ' +\n \"subprocesses (slower per-vote startup, subject to each CLI's own auth/quota). \" +\n 'Set NEXUS_OPENAI_COMPAT_URL and NEXUS_OPENAI_COMPAT_KEY to route voters through ' +\n 'an OpenAI-compatible gateway in-process instead (lower latency, no subprocess spawn).'\n );\n}\n\n/** Test-only: reset the one-time notice guard so repeated tests can re-trigger it. */\nexport function _resetCliSubprocessFallbackNotice(): void {\n cliSubprocessFallbackNoticeLogged = false;\n}\n\n/**\n * The default model adapter. With a gateway configured (#2502/#4040) it is the\n * catalogue's ranked default, `resolveGatewayDefault` (#6651) — the same rule\n * the registry's unpinned default uses, so the two cannot name different\n * models, and listing order (arbitrary, #6606) does not decide it. When that\n * rule resolves nothing (no catalogue registered, or no chat model in it) the\n * primary gateway model is kept, as before. With no gateway it is the\n * CLI-registry default. The registry is typed structurally so this stays free\n * of the adapter-registry import.\n */\nexport function resolveDefaultModelAdapter(\n gatewayAdapters: readonly IModelAdapter[] | undefined,\n adapterRegistry: { getDefault(): IModelAdapter }\n): IModelAdapter {\n const primary = gatewayAdapters?.[0];\n if (primary === undefined) return adapterRegistry.getDefault();\n const ranked = resolveGatewayDefault();\n return ranked.kind === 'resolved' ? ranked.adapter : primary;\n}\n\n/**\n * Register the discovered gateway models as ONE `api:<endpoint>` arm in the\n * adapter registry (#4392 increment 2, step 2), in EVERY billing mode — the\n * arm is what the shared breaker, the `NEXUS_GATEWAY_COST` declaration and\n * (once #6291 widens the routing ids) routing key on. `registerApiArm` warns\n * when the arm's cost is undeclared. The per-model adapters keep flowing to\n * the voter tools unchanged; this adds the arm beside them.\n *\n * Returns the arm id, or `undefined` when nothing was registered: no gateway\n * (`adapters` undefined or empty — the named empty case, logged at debug), or\n * an `endpoint` that is not a valid endpoint id (the env schema already\n * reported it; a garbage arm id is never minted from it).\n */\nexport function registerGatewayArm(\n adapters: readonly IModelAdapter[] | undefined,\n endpoint: string,\n registry: {\n registerApiArm(arm: EndpointArmId, adapter: IResilientAdapter): void;\n getLogger(): ILogger;\n }\n): EndpointArmId | undefined {\n const logger = registry.getLogger();\n if (adapters === undefined || adapters.length === 0) {\n logger.debug('No gateway adapters discovered; no api: arm registered');\n return undefined;\n }\n const armId = `api:${endpoint}`;\n const rejection = gatewayEndpointRejection(endpoint);\n if (rejection !== undefined || !isEndpointArmId(armId)) {\n // Not echoed: the likely mistake is a pasted URL, which can carry a key.\n logger.warn('Gateway endpoint is not a valid gateway endpoint; no api: arm registered', {\n reason: rejection ?? 'not a valid endpoint id',\n });\n return undefined;\n }\n registry.registerApiArm(\n armId,\n createGatewayArmAdapter(armId, adapters, {\n circuitBreakerRegistry: getDefaultCliCircuitBreakerRegistry(),\n logger,\n })\n );\n // Publish only after registration succeeds. The new wrapper already retains\n // the catalogue, so replacing an earlier wrapper cannot erase its metadata.\n setGatewayCatalog(\n armId,\n adapters.map((a) => a.modelId)\n );\n logger.info('Gateway registered as one api: arm', { arm: armId, modelCount: adapters.length });\n return armId;\n}\n\n/**\n * The bootstrap entry (#4392 inc 2 step 2): discover the gateway\n * ({@link tryWireGatewayAdapters}), register its `api:<endpoint>` arm\n * ({@link registerGatewayArm}) under the operator's endpoint id, register the\n * family-slot catalogue (#6604), and hand the per-model adapters back for the\n * tools. One call, so `cli-server.ts` cannot\n * wire the adapters without the arm.\n */\nexport async function wireGateway(\n logger: ILogger,\n registry: Parameters<typeof registerGatewayArm>[2] = getGlobalRegistry()\n): Promise<readonly IModelAdapter[] | undefined> {\n const { adapters, retryable } = await wireGatewayOnce(logger);\n const endpoint = readOpenAICompatEndpoint(process.env, logger);\n const registerArms = (found: readonly IModelAdapter[] | undefined): void => {\n registerGatewayArm(found, endpoint, registry);\n // The server's private registry retains its historical 30-minute default.\n // Router arms live in the global registry, whose CLI timeouts stay per-complexity.\n // Independent wrappers share the endpoint breaker and are disposed by their owners.\n if (parseBoolEnv('NEXUS_ROUTE_GATEWAY_ARMS', false)) {\n const global = getGlobalRegistry();\n if (global !== registry) registerGatewayArm(found, endpoint, global);\n }\n };\n registerArms(adapters);\n registerFamilySlots(adapters, logger);\n if (!retryable) return adapters;\n // #6608: a gateway that was down at boot is retried lazily. The tools get\n // an empty live list (every reader treats empty as \"no gateway\"); the first\n // gateway-needing call after the backoff fills it in place and registers\n // the arm. Every registry adapter triggers it (#6659, see\n // gateway-rediscovery.ts), and the boot-time default re-detects onto the\n // gateway once it is found.\n const live: IModelAdapter[] = [];\n setGatewayRediscovery(\n new GatewayRediscovery({\n target: live,\n logger,\n discover: () => rediscoverGateway(logger),\n onDiscovered: (found) => {\n registerArms(found);\n registerFamilySlots(found, logger);\n },\n })\n );\n return live;\n}\n\n/**\n * #6604: the family-slot catalogue — each vendor CLI slot without an\n * available CLI resolves to a gateway model of its own family. None\n * registered (no gateway, or discovery failed) means no gateway.\n */\nfunction registerFamilySlots(\n adapters: readonly IModelAdapter[] | undefined,\n logger: ILogger\n): void {\n setGatewaySlotCatalog(adapters ?? []);\n logGatewaySlotMapping(logger);\n}\n\n/**\n * One lazy re-discovery attempt: the adapters; `undefined` (logged) when it\n * failed in a way that can clear; `'refused'` when the private-address guard\n * refused the host (#6659), logged with the same remedy as at boot and never\n * retried, since allowing it is an env change that needs a restart.\n */\nasync function rediscoverGateway(\n logger: ILogger\n): Promise<readonly IModelAdapter[] | 'refused' | undefined> {\n const result = await buildOpenAICompatAdapters(logger);\n if (result === null) return undefined;\n if (!result.ok && result.error instanceof GatewayHostRefusedError) {\n // Re-discovery is armed only outside sandbox mode (a failed boot probe\n // there exits), so this never takes the sandbox exit branch.\n handleHostRefused(logger, false, result.error.status);\n return 'refused';\n }\n if (!result.ok) {\n logger.warn('Gateway re-discovery failed; calls stay on CLI subprocesses', {\n error: result.error.message,\n });\n return undefined;\n }\n return result.value;\n}\n\nfunction handleMissingEnv(logger: ILogger, sandboxActive: boolean): void {\n if (sandboxActive) {\n logger.error(\n 'Sandbox mode active but NEXUS_OPENAI_COMPAT_URL / NEXUS_OPENAI_COMPAT_KEY are not set. ' +\n 'Configure the gateway in your launch env or opencode.json. ' +\n 'See docs/guides/SANDBOXED-USAGE.md.',\n new Error('Missing gateway configuration in sandbox mode')\n );\n process.exit(EXIT_CODES.SERVER_START_FAILED);\n }\n return undefined;\n}\n\nfunction handleProbeFailure(logger: ILogger, sandboxActive: boolean, reason: string): void {\n if (sandboxActive) {\n logger.error(\n 'Sandbox mode active and OpenAI-compatible gateway probe failed.',\n new Error(reason)\n );\n process.exit(EXIT_CODES.SERVER_START_FAILED);\n }\n logger.warn('OpenAI-compatible gateway probe failed; continuing with CLI adapters', {\n error: reason,\n });\n return undefined;\n}\n\n/**\n * The private-address guard refused the gateway host (#6608). The message\n * names the variable that allows it and says the gateway is not in use —\n * before this, the operator saw a generic probe-failure line.\n */\nfunction handleHostRefused(\n logger: ILogger,\n sandboxActive: boolean,\n status: GatewayHostRefused\n): void {\n const message =\n `Gateway host ${status.host} refused by the private-address guard: the in-process ` +\n 'gateway is NOT in use, and voter/consensus calls fall back to CLI subprocesses. ' +\n status.remedy;\n if (sandboxActive) {\n logger.error(message, new Error(status.reason));\n process.exit(EXIT_CODES.SERVER_START_FAILED);\n }\n logger.warn(message, { host: status.host, reason: status.reason });\n}\n\nfunction handleZeroModels(logger: ILogger, sandboxActive: boolean): void {\n if (sandboxActive) {\n logger.error(\n 'Sandbox mode active and gateway returned 0 models. Check upstream provider quotas / list filters.',\n new Error('Gateway discovered 0 models')\n );\n process.exit(EXIT_CODES.SERVER_START_FAILED);\n }\n logger.warn('OpenAI-compatible gateway returned 0 models; ignoring');\n return undefined;\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  generateHyphenId
3
- } from "./chunk-GAX75XCV.js";
3
+ } from "./chunk-2BZXKNLN.js";
4
4
  import {
5
5
  getDefaultCliCircuitBreakerRegistry
6
- } from "./chunk-SX2XWCGA.js";
6
+ } from "./chunk-V6AJCRAU.js";
7
7
  import {
8
8
  sanitizeOutput
9
- } from "./chunk-QM5W3T3O.js";
9
+ } from "./chunk-PZMODRBC.js";
10
10
  import {
11
11
  CLI_VERSION_REQUIREMENTS,
12
12
  DEFAULT_CAPABILITIES,
@@ -47,10 +47,10 @@ import {
47
47
  servesListedModel,
48
48
  unenforcedAccessModeRefusal,
49
49
  withEnforcedAccessMode
50
- } from "./chunk-WKFPKPEM.js";
50
+ } from "./chunk-GPRYEKAA.js";
51
51
  import {
52
52
  parseBoolValue
53
- } from "./chunk-LWOX65CP.js";
53
+ } from "./chunk-CH6IBWXH.js";
54
54
  import {
55
55
  CLI_SUBPROCESS_TIMEOUTS,
56
56
  CLI_TIMEOUTS,
@@ -290,7 +290,7 @@ var BaseCliAdapter = class {
290
290
  }
291
291
  /** Local CLI auth evidence from the canonical probe; makes no live API call. */
292
292
  async authStatus() {
293
- const { probeCli } = await import("./cli-auth-probe-A7ANEHJ7.js");
293
+ const { probeCli } = await import("./cli-auth-probe-GUK3NXW3.js");
294
294
  return probeCli(this.name);
295
295
  }
296
296
  /** Unmeasured by default; live opt-in delegates to the bounded completion probe. */
@@ -1960,4 +1960,4 @@ export {
1960
1960
  IN_FAMILY_FALLBACK_OPTION,
1961
1961
  ClaudeCliAdapter
1962
1962
  };
1963
- //# sourceMappingURL=chunk-23QA6GQD.js.map
1963
+ //# sourceMappingURL=chunk-66BE4KF4.js.map
@@ -7,7 +7,7 @@ import {
7
7
  getAdaptiveBonus,
8
8
  getOutcomeStore,
9
9
  hasMeasuredCategory
10
- } from "./chunk-WKFPKPEM.js";
10
+ } from "./chunk-GPRYEKAA.js";
11
11
  import {
12
12
  TASK_CATEGORIES
13
13
  } from "./chunk-4PN3UVZV.js";
@@ -150,4 +150,4 @@ export {
150
150
  runDeepDiagnostics,
151
151
  formatDeepDiagnostics
152
152
  };
153
- //# sourceMappingURL=chunk-TDUXUVUU.js.map
153
+ //# sourceMappingURL=chunk-6LWUJOAS.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-WDAND5YU.js";
6
6
  import {
7
7
  executeExpert
8
- } from "./chunk-GX5ZHZR2.js";
8
+ } from "./chunk-QARJHIQM.js";
9
9
  import {
10
10
  JobStatusSchema,
11
11
  RawFindingSchema,
@@ -58,11 +58,11 @@ import {
58
58
  updateStage,
59
59
  withFileLock,
60
60
  writeJobCancelled
61
- } from "./chunk-2TA6KTRF.js";
61
+ } from "./chunk-OJ3PXTN3.js";
62
62
  import {
63
63
  normalizeTopicToCanonical,
64
64
  synthesizeResearch
65
- } from "./chunk-FNHVTDHZ.js";
65
+ } from "./chunk-R75NZRON.js";
66
66
  import {
67
67
  IssueTriage,
68
68
  createAuditTrail,
@@ -71,13 +71,13 @@ import {
71
71
  createGraphAuditBridge,
72
72
  emitPipelinePolicyEvent,
73
73
  readActionRefusal
74
- } from "./chunk-SS53PZO6.js";
74
+ } from "./chunk-EFZRQ67X.js";
75
75
  import {
76
76
  sanitizeInput
77
- } from "./chunk-V26YQQK4.js";
77
+ } from "./chunk-I7VX7JWV.js";
78
78
  import {
79
79
  withPrerequisite
80
- } from "./chunk-J44RKRGQ.js";
80
+ } from "./chunk-AFJE7K6Q.js";
81
81
  import {
82
82
  NOOP_NOTIFIER,
83
83
  RateLimiter,
@@ -105,10 +105,10 @@ import {
105
105
  toolSuccess,
106
106
  withProgressHeartbeat,
107
107
  wrapToolWithTimeout
108
- } from "./chunk-LP5ISXKM.js";
108
+ } from "./chunk-SFWQ72ZS.js";
109
109
  import {
110
110
  generateSecurityPlan
111
- } from "./chunk-JGY5HMWI.js";
111
+ } from "./chunk-7HHXY7LM.js";
112
112
  import {
113
113
  analyzeGitHubRepo
114
114
  } from "./chunk-4GDMHCKX.js";
@@ -152,18 +152,18 @@ import {
152
152
  parseRegistry,
153
153
  sourceExistsInRegistry,
154
154
  summarizeContextForPrompt
155
- } from "./chunk-VLOPXV47.js";
155
+ } from "./chunk-53XY7YJD.js";
156
156
  import {
157
157
  REGISTRY_PATH,
158
158
  getProjectRoot,
159
159
  loadPapersRegistry,
160
160
  loadTechniquesRegistry,
161
161
  resolveRegistryRoot
162
- } from "./chunk-4JJI34RV.js";
162
+ } from "./chunk-S6XQFO4A.js";
163
163
  import {
164
164
  getTokenEnvVars,
165
165
  resolveToken
166
- } from "./chunk-7EV3QAKO.js";
166
+ } from "./chunk-HUYVIUF3.js";
167
167
  import {
168
168
  DEFAULT_RELEVANCE_CONFIG,
169
169
  MemoryImportance,
@@ -171,7 +171,7 @@ import {
171
171
  calculateTextJaccardSimilarity,
172
172
  getToolMemory,
173
173
  memoryTrustTierTag
174
- } from "./chunk-FWQSOPBA.js";
174
+ } from "./chunk-YOT3XEZM.js";
175
175
  import {
176
176
  EXTERNAL_CONTENT_TRUST_TIER,
177
177
  resolveContentTrustProvenance,
@@ -187,7 +187,7 @@ import {
187
187
  import {
188
188
  DEFAULT_TASK_TTL_MS,
189
189
  clampTaskTtl
190
- } from "./chunk-OMSKBBL7.js";
190
+ } from "./chunk-377L2ZEK.js";
191
191
  import {
192
192
  allOf,
193
193
  anyOf
@@ -196,37 +196,35 @@ import {
196
196
  VERSION,
197
197
  createRequestContext,
198
198
  measuredTrustTier
199
- } from "./chunk-WD4DENPC.js";
200
- import {
201
- EventTopics,
202
- createEvent,
203
- getGlobalEventBus,
204
- getGlobalRegistry
205
- } from "./chunk-UZJ6IPJR.js";
199
+ } from "./chunk-B3RAA47W.js";
206
200
  import {
207
201
  BWRAP_READ_ONLY_ARGS,
208
202
  CliDetectionCache,
203
+ EventTopics,
209
204
  createBwrapPreflight,
205
+ createEvent,
210
206
  extractRequestSystemPrompt,
211
207
  getAvailableClis,
208
+ getGlobalEventBus,
209
+ getGlobalRegistry,
212
210
  isAbsentSeat
213
- } from "./chunk-QRC3QLUQ.js";
211
+ } from "./chunk-PY6HJQYC.js";
214
212
  import {
215
213
  ensureGatewayDiscovered,
216
214
  getAvailabilityCache,
217
215
  getCliForModelId,
218
216
  resolveFallback
219
- } from "./chunk-LXYT2P2Y.js";
217
+ } from "./chunk-IGYZQEKM.js";
220
218
  import {
221
219
  DEFAULTS
222
- } from "./chunk-XSAUVC6D.js";
220
+ } from "./chunk-NLFCAEEK.js";
223
221
  import {
224
222
  DEFAULT_EXECUTION_MODE,
225
223
  DEFAULT_TOOL_RATE_LIMITS
226
224
  } from "./chunk-TYLE7Z2S.js";
227
225
  import {
228
226
  getNexusTmpDir
229
- } from "./chunk-JPFRRNRR.js";
227
+ } from "./chunk-U7HL7FGS.js";
230
228
  import {
231
229
  BaseAdapter,
232
230
  createStream,
@@ -234,10 +232,10 @@ import {
234
232
  parseGatewayExtraHeaders,
235
233
  requireApiKey,
236
234
  validateApiKeyPresence
237
- } from "./chunk-KLSNDPU6.js";
235
+ } from "./chunk-SKM75Y7E.js";
238
236
  import {
239
237
  createSessionMemory
240
- } from "./chunk-QS5HGPCN.js";
238
+ } from "./chunk-VZ7YZ2EF.js";
241
239
  import {
242
240
  TrustTierSchema
243
241
  } from "./chunk-CJKHQ6MV.js";
@@ -251,17 +249,17 @@ import {
251
249
  terminateProcessTree,
252
250
  trackProcessTree,
253
251
  withTimeout
254
- } from "./chunk-23QA6GQD.js";
252
+ } from "./chunk-66BE4KF4.js";
255
253
  import {
256
254
  generateHyphenId,
257
255
  generateUUID
258
- } from "./chunk-GAX75XCV.js";
256
+ } from "./chunk-2BZXKNLN.js";
259
257
  import {
260
258
  getDefaultCliCircuitBreakerRegistry
261
- } from "./chunk-SX2XWCGA.js";
259
+ } from "./chunk-V6AJCRAU.js";
262
260
  import {
263
261
  sanitizeErrorDetails
264
- } from "./chunk-QM5W3T3O.js";
262
+ } from "./chunk-PZMODRBC.js";
265
263
  import {
266
264
  ARCHITECTURE_KEYWORDS,
267
265
  AUTHORITY_TIERS,
@@ -351,6 +349,7 @@ import {
351
349
  isBanditInterceptFeature,
352
350
  isCliName,
353
351
  isDisabledSlotUnserved,
352
+ isEndpointArmId,
354
353
  isErr,
355
354
  isRateLimitLikeError,
356
355
  isTimeoutAbortReason,
@@ -371,7 +370,7 @@ import {
371
370
  resolveModelIdentitySync,
372
371
  resolveOutcomeCategory,
373
372
  resolveOwnerCli,
374
- routingArmDisplaySlot,
373
+ routingArmCliSlot,
375
374
  runInHeartbeatSession,
376
375
  selectStrategyByManifest,
377
376
  serializeValidatedRecord,
@@ -380,7 +379,7 @@ import {
380
379
  toExpertTaskAnalysisResult,
381
380
  truncateWithInfo,
382
381
  withStep
383
- } from "./chunk-WKFPKPEM.js";
382
+ } from "./chunk-GPRYEKAA.js";
384
383
  import {
385
384
  SUPPORTED_EXTENSIONS
386
385
  } from "./chunk-XBEKMUTO.js";
@@ -388,7 +387,7 @@ import {
388
387
  ensureLearningDir,
389
388
  getMetaOutcomesFile,
390
389
  isPersistenceEnabled
391
- } from "./chunk-UE7A2XHM.js";
390
+ } from "./chunk-RUHKJC3X.js";
392
391
  import {
393
392
  findRepoRoot,
394
393
  getActiveWorkspaceRoot,
@@ -398,7 +397,7 @@ import {
398
397
  nexusDataPathEnsure,
399
398
  parseBoolEnv,
400
399
  setActiveWorkspaceRoot
401
- } from "./chunk-LWOX65CP.js";
400
+ } from "./chunk-CH6IBWXH.js";
402
401
  import {
403
402
  AGENT_ROUTER_TIMEOUTS,
404
403
  API_TIMEOUTS,
@@ -607,6 +606,8 @@ var NexusEnvSchema = z.object({
607
606
  NEXUS_CUSTOM_API_SURFACE: z.string().refine((v) => ["", "chat", "responses"].includes(v.trim().toLowerCase()), {
608
607
  message: "Must be one of: responses, chat"
609
608
  }).optional(),
609
+ // #7151 OPTION B: endpoint router arms are opt-in in every billing mode.
610
+ NEXUS_ROUTE_GATEWAY_ARMS: boolLooseStr.optional(),
610
611
  // #6604: pin the gateway model a family slot (claude/codex/gemini) uses.
611
612
  // Any model id is legal here; the one reader (adapters/gateway-family-slots.ts)
612
613
  // validates it against the discovered catalogue and warns on a miss.
@@ -1152,7 +1153,7 @@ import { z as z3 } from "zod";
1152
1153
  var AdapterConfigSchema = z3.object({
1153
1154
  /** Provider identifier (e.g., 'anthropic', 'openai') */
1154
1155
  providerId: z3.string().min(1, "Provider ID is required"),
1155
- /** Model identifier (e.g., 'claude-sonnet-4', 'gpt-4o') */
1156
+ /** Model identifier (e.g., 'claude-sonnet-4', 'gpt-4o-2024-11-20') */
1156
1157
  modelId: z3.string().min(1, "Model ID is required"),
1157
1158
  /** API key for authentication (optional, may come from environment) */
1158
1159
  apiKey: z3.string().optional(),
@@ -29750,7 +29751,7 @@ function execIdFields(executionId) {
29750
29751
  async function populateUnifiedContextOnState(state, options) {
29751
29752
  const taskCandidate = state["task"];
29752
29753
  if (typeof taskCandidate !== "string" || taskCandidate === "") return;
29753
- const { getContextForTask: getContextForTask2, inferTaskCategory: inferTaskCategory2 } = await import("./context-retriever-HVPLM6DH.js");
29754
+ const { getContextForTask: getContextForTask2, inferTaskCategory: inferTaskCategory2 } = await import("./context-retriever-P6ZE6UXS.js");
29754
29755
  const category = inferTaskCategory2(taskCandidate);
29755
29756
  const executionId = options?.executionId;
29756
29757
  const execFields = execIdFields(executionId);
@@ -37175,18 +37176,25 @@ var DEFAULT_CAPABILITIES2 = {
37175
37176
  cost: 6
37176
37177
  };
37177
37178
  function mapCompositeDecisionToOutput(decision, estimatedTokens) {
37178
- const modelName = decision.model ?? cliNameToModel(routingArmDisplaySlot(decision.cliName));
37179
- const caps = MODEL_CAPABILITIES2[modelName] ?? DEFAULT_CAPABILITIES2;
37179
+ const slot = routingArmCliSlot(decision.cliName);
37180
+ const endpoint = slot === void 0 && isEndpointArmId(decision.cliName);
37181
+ const modelName = endpoint ? decision.adapter.getModelInfo().id : decision.model ?? (slot === void 0 ? decision.cliName : cliNameToModel(slot));
37182
+ const caps = endpoint ? decision.adapter.capabilities : MODEL_CAPABILITIES2[modelName] ?? DEFAULT_CAPABILITIES2;
37180
37183
  return {
37181
37184
  recommended_model: modelName,
37182
37185
  reasoning: decision.reason,
37183
37186
  capabilities: caps,
37184
37187
  estimated_tokens: estimatedTokens,
37185
- alternatives: decision.alternatives.slice(0, 3).map((alt) => describeAlternative(alt, decision, caps))
37188
+ // A decision has only the winner's adapter. Endpoint alternatives cannot
37189
+ // be resolved here, so omit them instead of inventing an OpenCode model.
37190
+ alternatives: decision.alternatives.flatMap((alt) => {
37191
+ const altSlot = routingArmCliSlot(alt);
37192
+ return altSlot === void 0 ? [] : [describeAlternative(alt, altSlot, decision, caps)];
37193
+ }).slice(0, 3)
37186
37194
  };
37187
37195
  }
37188
- function describeAlternative(alt, decision, bestCaps) {
37189
- const model = cliNameToModel(routingArmDisplaySlot(alt));
37196
+ function describeAlternative(alt, slot, decision, bestCaps) {
37197
+ const model = cliNameToModel(slot);
37190
37198
  const altCaps = MODEL_CAPABILITIES2[model] ?? DEFAULT_CAPABILITIES2;
37191
37199
  const ranked = decision.alternativeScores?.get(alt);
37192
37200
  if (ranked !== void 0) {
@@ -46252,7 +46260,7 @@ async function tryIssueTriage(task) {
46252
46260
  try {
46253
46261
  const issueMatch = task.match(/github\.com\/([^/]+\/[^/]+)\/issues\/(\d+)/);
46254
46262
  if (issueMatch === null) return null;
46255
- const { createIssueTriage } = await import("./issue-triage-YBVJVAUU.js");
46263
+ const { createIssueTriage } = await import("./issue-triage-BLZHWC6U.js");
46256
46264
  const triage = createIssueTriage();
46257
46265
  const owner = issueMatch[1] ?? "";
46258
46266
  const num2 = issueMatch[2] ?? "";
@@ -46280,7 +46288,7 @@ var VALID_TEMPLATES = /* @__PURE__ */ new Set([
46280
46288
  ]);
46281
46289
  async function classifyWithLLM(task) {
46282
46290
  try {
46283
- const { executeExpert: executeExpert2 } = await import("./expert-bridge-O3UZXLGB.js");
46291
+ const { executeExpert: executeExpert2 } = await import("./expert-bridge-3VWOHLC7.js");
46284
46292
  const prompt = [
46285
46293
  "Classify this task into exactly one pipeline template.",
46286
46294
  "Templates: dev (implementation/bug fix/refactor), research (investigate/evaluate/compare),",
@@ -46649,7 +46657,7 @@ function buildVotingInput(plan, config) {
46649
46657
  }
46650
46658
  async function executeSingleVote(plan, config, log) {
46651
46659
  try {
46652
- const { executeVoting } = await import("./consensus-vote-RNQQUBXO.js");
46660
+ const { executeVoting } = await import("./consensus-vote-JMWTJO4M.js");
46653
46661
  const input = buildVotingInput(plan, config);
46654
46662
  const result = await executeVoting(input, log);
46655
46663
  return parseVotingResult(result);
@@ -48168,8 +48176,8 @@ var memoryInitPromise = null;
48168
48176
  async function initPipelineMemory() {
48169
48177
  if (cachedMemory !== null) return cachedMemory;
48170
48178
  try {
48171
- const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-4LMEWO3X.js");
48172
- const { getLearningDir } = await import("./learning-persistence-FB4U5AX2.js");
48179
+ const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-YVT5M4AN.js");
48180
+ const { getLearningDir } = await import("./learning-persistence-X24OOBYY.js");
48173
48181
  const mem = createSessionMemory2(getLearningDir());
48174
48182
  mem.startSession(`pipeline-${String(getTimeProvider().now())}`);
48175
48183
  cachedMemory = {
@@ -48230,7 +48238,7 @@ function recordRoutingExperience(category, success, durationMs, tokensUsed = 0,
48230
48238
  callRecord(routingMemoryCache);
48231
48239
  return;
48232
48240
  }
48233
- routingMemoryInitPromise ??= import("./routing-memory-OCIVXKOU.js").then(({ createRoutingMemory }) => {
48241
+ routingMemoryInitPromise ??= import("./routing-memory-TWCXFPAD.js").then(({ createRoutingMemory }) => {
48234
48242
  routingMemoryCache ??= createRoutingMemory();
48235
48243
  return routingMemoryCache;
48236
48244
  }).catch((error) => {
@@ -48449,7 +48457,7 @@ function createVoteStage({ config, startStage }) {
48449
48457
  const strategy = config.votingStrategy ?? "higher_order";
48450
48458
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
48451
48459
  try {
48452
- const { executeVoting } = await import("./consensus-vote-RNQQUBXO.js");
48460
+ const { executeVoting } = await import("./consensus-vote-JMWTJO4M.js");
48453
48461
  const proposal = buildVoteProposal(plan, research);
48454
48462
  const votingResult = await executeVoting(
48455
48463
  {
@@ -49256,7 +49264,7 @@ ${text}` : "";
49256
49264
  }
49257
49265
  async function getWeatherContext() {
49258
49266
  try {
49259
- const { generateWeatherReport: generateWeatherReport2 } = await import("./weather-report-PMYQ3WBW.js");
49267
+ const { generateWeatherReport: generateWeatherReport2 } = await import("./weather-report-KA5RT57Q.js");
49260
49268
  const report = generateWeatherReport2({ includeAdaptive: true });
49261
49269
  const mappings = "recommendedMappings" in report ? report.recommendedMappings : [];
49262
49270
  if (!Array.isArray(mappings) || mappings.length === 0) return "";
@@ -49274,8 +49282,8 @@ ${lines}
49274
49282
  }
49275
49283
  async function getMemoryContext(task) {
49276
49284
  try {
49277
- const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-4LMEWO3X.js");
49278
- const { getLearningDir } = await import("./learning-persistence-FB4U5AX2.js");
49285
+ const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-YVT5M4AN.js");
49286
+ const { getLearningDir } = await import("./learning-persistence-X24OOBYY.js");
49279
49287
  const memory = createSessionMemory2(getLearningDir(), { maxLearningsInContext: 10 });
49280
49288
  const learnings = memory.searchLearnings(task.slice(0, 200));
49281
49289
  if (learnings.length === 0) return "";
@@ -49991,7 +49999,7 @@ async function searchCodebaseForTask(task) {
49991
49999
  }
49992
50000
  async function queryResearchRegistry(task) {
49993
50001
  try {
49994
- const { synthesizeResearch: synthesizeResearch2 } = await import("./research-helpers-synthesize-X6MVAAKT.js");
50002
+ const { synthesizeResearch: synthesizeResearch2 } = await import("./research-helpers-synthesize-SXNAJWHX.js");
49995
50003
  const topic = task.split(/[.!?\n]/).filter((s) => s.trim().length > 10)[0]?.trim();
49996
50004
  if (topic === void 0) return null;
49997
50005
  const result = await synthesizeResearch2(topic.slice(0, 50));
@@ -50062,7 +50070,7 @@ function createScanStageWrapper() {
50062
50070
  try {
50063
50071
  const slug = ctx.task.match(/([a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+)/)?.[1];
50064
50072
  if (slug !== void 0) {
50065
- const { generateSecurityPlan: generateSecurityPlan2 } = await import("./repo-security-plan-LFWLVEL2.js");
50073
+ const { generateSecurityPlan: generateSecurityPlan2 } = await import("./repo-security-plan-SOFUCHO4.js");
50066
50074
  const plan = await generateSecurityPlan2({ repo: slug, maxScanners: 10 });
50067
50075
  const recs = plan.recommendations.slice(0, 5).map((r) => `${r.priority}: ${r.displayName} (${r.category})`).join("; ");
50068
50076
  return output(PIPELINE_STATE_KEYS.FINDINGS, recs, getTimeProvider().now() - start, true);
@@ -53988,7 +53996,7 @@ var GitHubTaskTracker = class {
53988
53996
  cachedProvider = null;
53989
53997
  async getProvider() {
53990
53998
  if (this.cachedProvider !== null) return this.cachedProvider;
53991
- const { createScmProvider } = await import("./factory-LUKUIB6C.js");
53999
+ const { createScmProvider } = await import("./factory-YPJXDMN4.js");
53992
54000
  const result = await createScmProvider({ repo: this.config.repo ?? "" });
53993
54001
  if (!result.ok) throw new Error(`SCM provider error: ${result.error.message}`);
53994
54002
  this.cachedProvider = result.value;
@@ -55035,7 +55043,7 @@ function withCatalogueCaveat(report) {
55035
55043
  var GATEWAY_TRANSPORT = "gateway";
55036
55044
  var GATEWAY_API_ARM = "api:custom-openai";
55037
55045
  async function gatewaySource(apiArm) {
55038
- const { discoverModels, readOpenAICompatEnv } = await import("./openai-compat-adapter-GPZDIR3D.js");
55046
+ const { discoverModels, readOpenAICompatEnv } = await import("./openai-compat-adapter-GRJA6RPZ.js");
55039
55047
  const config = readOpenAICompatEnv();
55040
55048
  if (config !== null) {
55041
55049
  return {
@@ -55054,7 +55062,7 @@ async function gatewaySource(apiArm) {
55054
55062
  }
55055
55063
  async function defaultSources(includeOpenRouter, adaptersFactory) {
55056
55064
  const adapters = new Map(
55057
- adaptersFactory !== void 0 ? adaptersFactory() : (await import("./factory-KCKQQAEH.js")).createAllAdapters()
55065
+ adaptersFactory !== void 0 ? adaptersFactory() : (await import("./factory-A44THDRG.js")).createAllAdapters()
55058
55066
  );
55059
55067
  const apiArm = adapters.get(GATEWAY_API_ARM);
55060
55068
  adapters.delete(GATEWAY_API_ARM);
@@ -58411,4 +58419,4 @@ export {
58411
58419
  initializeSandbox,
58412
58420
  getSandboxMode
58413
58421
  };
58414
- //# sourceMappingURL=chunk-XDUTAUK3.js.map
58422
+ //# sourceMappingURL=chunk-7H3SOL4O.js.map