@shipit-ai/cli 1.171.0 → 1.172.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 (214) hide show
  1. package/apis/json-schema/CodexCliProxyConfig.yaml +8 -0
  2. package/apis/json-schema/GeminiCliProxyConfig.yaml +8 -0
  3. package/apis/json-schema/LiteLLMProxyConfig.yaml +6 -0
  4. package/dist/packages/core/src/domain/generated/output.d.ts +26 -0
  5. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +26 -1
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-litellm-proxy-multi-agent.d.ts +12 -0
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-litellm-proxy-multi-agent.d.ts.map +1 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-litellm-proxy-multi-agent.js +20 -0
  12. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +7 -3
  14. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +8 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts +3 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.js +20 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts +3 -1
  20. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +23 -1
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +8 -0
  24. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts.map +1 -1
  25. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.js +79 -7
  26. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts +10 -3
  27. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts.map +1 -1
  28. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.js +87 -13
  29. package/dist/translations/ar/web.json +6 -1
  30. package/dist/translations/de/web.json +6 -1
  31. package/dist/translations/en/web.json +6 -1
  32. package/dist/translations/es/web.json +6 -1
  33. package/dist/translations/fr/web.json +6 -1
  34. package/dist/translations/he/web.json +6 -1
  35. package/dist/translations/pt/web.json +6 -1
  36. package/dist/translations/ru/web.json +6 -1
  37. package/dist/tsconfig.build.tsbuildinfo +1 -1
  38. package/package.json +1 -1
  39. package/web/.next/BUILD_ID +1 -1
  40. package/web/.next/build-manifest.json +3 -3
  41. package/web/.next/fallback-build-manifest.json +3 -3
  42. package/web/.next/prerender-manifest.json +3 -3
  43. package/web/.next/required-server-files.js +2 -2
  44. package/web/.next/required-server-files.json +2 -2
  45. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  46. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  49. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  52. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  58. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  61. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  64. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  67. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  70. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  79. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  85. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/_global-error.html +1 -1
  88. package/web/.next/server/app/_global-error.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  92. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  93. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  95. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  96. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/plugins/page/server-reference-manifest.json +15 -15
  98. package/web/.next/server/app/plugins/page.js.nft.json +1 -1
  99. package/web/.next/server/app/plugins/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/settings/page/server-reference-manifest.json +12 -12
  101. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  102. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  104. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  105. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  107. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  108. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  110. package/web/.next/server/app/version/page.js.nft.json +1 -1
  111. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
  113. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  114. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  115. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  117. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  119. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0un-3~2.js +1 -1
  121. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  122. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__11-~i9u._.js +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  143. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  145. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  149. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  151. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  153. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/{_11hrdyl._.js → _0ik5uly._.js} +2 -2
  155. package/web/.next/server/chunks/ssr/{_11hrdyl._.js.map → _0ik5uly._.js.map} +1 -1
  156. package/web/.next/server/chunks/ssr/_0o.xc6x._.js +1 -1
  157. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  158. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/{_0q4ou83._.js → _0pqw.55._.js} +2 -2
  160. package/web/.next/server/chunks/ssr/{_0q4ou83._.js.map → _0pqw.55._.js.map} +1 -1
  161. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  162. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  164. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/_0u3d8.n._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  168. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  172. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  174. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/_10joy2y._.js +1 -1
  176. package/web/.next/server/chunks/ssr/_10joy2y._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  178. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/{_0h_81zd._.js → _13o1d1i._.js} +2 -2
  180. package/web/.next/server/chunks/ssr/{_0h_81zd._.js.map → _13o1d1i._.js.map} +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +1 -1
  182. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  186. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  188. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  190. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  191. package/web/.next/server/middleware-build-manifest.js +3 -3
  192. package/web/.next/server/pages/500.html +1 -1
  193. package/web/.next/server/server-reference-manifest.js +1 -1
  194. package/web/.next/server/server-reference-manifest.json +55 -55
  195. package/web/.next/static/chunks/02e5.-kk~ag_i.js +1 -0
  196. package/web/.next/static/chunks/{0-glbn-_j79ge.js → 07e~pkh4ikdtq.js} +1 -1
  197. package/web/.next/static/chunks/0aom-74j.wtkt.js +1 -0
  198. package/web/.next/static/chunks/{0jpdu~hr9yant.js → 0aworyfo5xz3f.js} +1 -1
  199. package/web/.next/static/chunks/{0s1uxv-vz4g~..js → 0ddwj6.~yj.u5.js} +1 -1
  200. package/web/.next/static/chunks/{0nry24zef5x6d.js → 0m0hb2m1lgy.r.js} +1 -1
  201. package/web/.next/static/chunks/{0mmo8sojp2la5.js → 0prk~fhfyg~yg.js} +1 -1
  202. package/web/.next/static/chunks/{02z512ozs7al_.js → 0q.xmdro9u05g.js} +1 -1
  203. package/web/.next/static/chunks/{0x4yi7ly9kwn5.js → 0rd5nu5ru3gje.js} +1 -1
  204. package/web/.next/static/chunks/{017xamyz033tm.js → 0rm13o3bvc9o..js} +1 -1
  205. package/web/.next/static/chunks/{0eemg.2by.~76.js → 0uz.~ob1qtjhj.js} +1 -1
  206. package/web/.next/static/chunks/0vb84wrbin-ef.js +1 -0
  207. package/web/.next/static/chunks/{161s7._zxasc0.js → 100y4~jpwu8~t.js} +3 -3
  208. package/web/.next/static/chunks/{11f-uj04jrom-.js → 16678zkd7o7-z.js} +1 -1
  209. package/web/.next/static/chunks/01tzmtex7umeb.js +0 -1
  210. package/web/.next/static/chunks/0cx16obgb~.zq.js +0 -1
  211. package/web/.next/static/chunks/12lj54j~w8~13.js +0 -1
  212. /package/web/.next/static/{FNmgUvRV-pz0hqn250ePU → hWgOeXuQ6p-VoJvFXhk5g}/_buildManifest.js +0 -0
  213. /package/web/.next/static/{FNmgUvRV-pz0hqn250ePU → hWgOeXuQ6p-VoJvFXhk5g}/_clientMiddlewareManifest.js +0 -0
  214. /package/web/.next/static/{FNmgUvRV-pz0hqn250ePU → hWgOeXuQ6p-VoJvFXhk5g}/_ssgManifest.js +0 -0
@@ -10,11 +10,47 @@ import { SettingsSection, SettingsRow } from './settings-section-utils.js';
10
10
  import { Input } from '../../ui/input.js';
11
11
  import { Textarea } from '../../ui/textarea.js';
12
12
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
13
+ /** Agent types that support env-var-based proxy routing (Tier 1) */
14
+ const TIER1_AGENTS = new Set(['claude-code', 'gemini-cli', 'codex-cli']);
15
+ /** Agent types that need documentation-only panels (Tier 2) */
16
+ const TIER2_AGENTS = new Set(['cursor', 'copilot-cli']);
17
+ /** Get the per-agent proxy config key for building payloads */
18
+ function agentConfigKey(agentType) {
19
+ switch (agentType) {
20
+ case 'claude-code':
21
+ return 'claudeCode';
22
+ case 'gemini-cli':
23
+ return 'geminiCli';
24
+ case 'codex-cli':
25
+ return 'codexCli';
26
+ default:
27
+ return null;
28
+ }
29
+ }
30
+ /** Get the current routing mode for the active agent */
31
+ function getRoutingMode(settings) {
32
+ const agentType = settings.agent.type;
33
+ switch (agentType) {
34
+ case 'claude-code':
35
+ return settings.litellmProxy?.claudeCode?.routingMode ?? LiteLLMProxyRoutingMode.direct;
36
+ case 'gemini-cli':
37
+ return settings.litellmProxy?.geminiCli?.routingMode ?? LiteLLMProxyRoutingMode.direct;
38
+ case 'codex-cli':
39
+ return settings.litellmProxy?.codexCli?.routingMode ?? LiteLLMProxyRoutingMode.direct;
40
+ default:
41
+ return LiteLLMProxyRoutingMode.direct;
42
+ }
43
+ }
44
+ /** Whether this agent supports passthrough mode */
45
+ function supportsPassthrough(agentType) {
46
+ return agentType === 'claude-code';
47
+ }
13
48
  export function LiteLLMProxyRoutingSection({ settings }) {
14
49
  const { t } = useTranslation('web');
15
50
  const [, startTransition] = useTransition();
51
+ const agentType = settings.agent.type;
16
52
  const cc = settings.litellmProxy?.claudeCode;
17
- const [routingMode, setRoutingMode] = useState(cc?.routingMode ?? LiteLLMProxyRoutingMode.direct);
53
+ const [routingMode, setRoutingMode] = useState(getRoutingMode(settings));
18
54
  const [customHeaders, setCustomHeaders] = useState(cc?.customHeaders ?? '');
19
55
  const [sonnetModel, setSonnetModel] = useState(cc?.sonnetModel ?? '');
20
56
  const [haikuModel, setHaikuModel] = useState(cc?.haikuModel ?? '');
@@ -24,6 +60,10 @@ export function LiteLLMProxyRoutingSection({ settings }) {
24
60
  const originalHaikuModel = cc?.haikuModel ?? '';
25
61
  const originalOpusModel = cc?.opusModel ?? '';
26
62
  const showProxyFields = routingMode !== LiteLLMProxyRoutingMode.direct;
63
+ const isTier1 = TIER1_AGENTS.has(agentType);
64
+ const isTier2 = TIER2_AGENTS.has(agentType);
65
+ const proxyUrl = settings.litellmProxy?.baseUrl ?? '';
66
+ const proxyApiKey = settings.litellmProxy?.apiKey ?? '';
27
67
  function save(payload) {
28
68
  startTransition(async () => {
29
69
  const result = await updateSettingsAction(payload);
@@ -33,14 +73,27 @@ export function LiteLLMProxyRoutingSection({ settings }) {
33
73
  });
34
74
  }
35
75
  function buildPayload(overrides) {
76
+ const key = agentConfigKey(agentType);
77
+ if (!key)
78
+ return {};
79
+ if (agentType === 'claude-code') {
80
+ return {
81
+ litellmProxy: {
82
+ claudeCode: {
83
+ routingMode: overrides?.routingMode ?? routingMode,
84
+ customHeaders: overrides?.customHeaders ?? customHeaders,
85
+ sonnetModel: overrides?.sonnetModel ?? sonnetModel,
86
+ haikuModel: overrides?.haikuModel ?? haikuModel,
87
+ opusModel: overrides?.opusModel ?? opusModel,
88
+ },
89
+ },
90
+ };
91
+ }
92
+ // Gemini CLI and Codex CLI: only routingMode
36
93
  return {
37
94
  litellmProxy: {
38
- claudeCode: {
95
+ [key]: {
39
96
  routingMode: overrides?.routingMode ?? routingMode,
40
- customHeaders: overrides?.customHeaders ?? customHeaders,
41
- sonnetModel: overrides?.sonnetModel ?? sonnetModel,
42
- haikuModel: overrides?.haikuModel ?? haikuModel,
43
- opusModel: overrides?.opusModel ?? opusModel,
44
97
  },
45
98
  },
46
99
  };
@@ -49,7 +102,26 @@ export function LiteLLMProxyRoutingSection({ settings }) {
49
102
  setRoutingMode(value);
50
103
  save(buildPayload({ routingMode: value }));
51
104
  }
52
- return (_jsxs(SettingsSection, { icon: Route, title: t('settings.litellmProxy.routing.title'), description: t('settings.litellmProxy.routing.description'), testId: "litellm-proxy-routing-section", tooltip: t('settings.litellmProxy.routing.hint'), children: [_jsx(SettingsRow, { label: t('settings.litellmProxy.routing.mode'), description: t('settings.litellmProxy.routing.modeDescription'), htmlFor: "litellm-routing-mode", children: _jsxs(Select, { value: routingMode, onValueChange: handleModeChange, children: [_jsx(SelectTrigger, { id: "litellm-routing-mode", "data-testid": "litellm-routing-mode-select", className: "w-48 text-xs", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: LiteLLMProxyRoutingMode.direct, children: t('settings.litellmProxy.routing.modeDirect') }), _jsx(SelectItem, { value: LiteLLMProxyRoutingMode.proxy, children: t('settings.litellmProxy.routing.modeProxy') }), _jsx(SelectItem, { value: LiteLLMProxyRoutingMode.passthrough, children: t('settings.litellmProxy.routing.modePassthrough') })] })] }) }), routingMode === LiteLLMProxyRoutingMode.passthrough && (_jsx(SettingsRow, { label: "", description: t('settings.litellmProxy.routing.passthroughHelp'), children: _jsx("span", {}) })), showProxyFields ? (_jsxs(_Fragment, { children: [_jsx(SettingsRow, { label: t('settings.litellmProxy.routing.customHeaders'), description: t('settings.litellmProxy.routing.customHeadersDescription'), htmlFor: "litellm-custom-headers", children: _jsx(Textarea, { id: "litellm-custom-headers", "data-testid": "litellm-custom-headers-input", placeholder: 'x-litellm-customer-id: my-user\nx-litellm-tags: project:acme', value: customHeaders, onChange: (e) => setCustomHeaders(e.target.value), onBlur: () => {
105
+ // Unsupported agent type
106
+ if (!isTier1 && !isTier2) {
107
+ return (_jsx(SettingsSection, { icon: Route, title: t('settings.litellmProxy.routing.title'), description: t('settings.litellmProxy.routing.description'), testId: "litellm-proxy-routing-section", tooltip: t('settings.litellmProxy.routing.hint'), children: _jsx(SettingsRow, { label: "", description: t('settings.litellmProxy.routing.notSupported'), children: _jsx("span", {}) }) }));
108
+ }
109
+ // Tier 2: Documentation-only panels
110
+ if (isTier2) {
111
+ const isCursor = agentType === 'cursor';
112
+ const displayUrl = proxyUrl
113
+ ? isCursor
114
+ ? `${proxyUrl.replace(/\/+$/, '')}/cursor`
115
+ : proxyUrl
116
+ : '';
117
+ return (_jsx(SettingsSection, { icon: Route, title: t('settings.litellmProxy.routing.title'), description: t('settings.litellmProxy.routing.description'), testId: "litellm-proxy-routing-section", tooltip: t('settings.litellmProxy.routing.hint'), children: _jsx(SettingsRow, { label: isCursor
118
+ ? t('settings.litellmProxy.routing.cursorInstructions')
119
+ : t('settings.litellmProxy.routing.copilotInstructions'), description: isCursor
120
+ ? t('settings.litellmProxy.routing.cursorDescription')
121
+ : t('settings.litellmProxy.routing.copilotDescription'), children: _jsxs("div", { className: "w-64 space-y-2", children: [_jsx("code", { className: "bg-muted block rounded px-2 py-1 text-xs break-all", children: displayUrl }), isCursor && proxyApiKey ? (_jsx("code", { className: "bg-muted block rounded px-2 py-1 text-xs break-all", children: proxyApiKey })) : null] }) }) }));
122
+ }
123
+ // Tier 1: Env-var-based proxy routing (Claude Code, Gemini CLI, Codex CLI)
124
+ return (_jsxs(SettingsSection, { icon: Route, title: t('settings.litellmProxy.routing.title'), description: t('settings.litellmProxy.routing.description'), testId: "litellm-proxy-routing-section", tooltip: t('settings.litellmProxy.routing.hint'), children: [_jsx(SettingsRow, { label: t('settings.litellmProxy.routing.mode'), description: t('settings.litellmProxy.routing.modeDescription'), htmlFor: "litellm-routing-mode", children: _jsxs(Select, { value: routingMode, onValueChange: handleModeChange, children: [_jsx(SelectTrigger, { id: "litellm-routing-mode", "data-testid": "litellm-routing-mode-select", className: "w-48 text-xs", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: LiteLLMProxyRoutingMode.direct, children: t('settings.litellmProxy.routing.modeDirect') }), _jsx(SelectItem, { value: LiteLLMProxyRoutingMode.proxy, children: t('settings.litellmProxy.routing.modeProxy') }), supportsPassthrough(agentType) && (_jsx(SelectItem, { value: LiteLLMProxyRoutingMode.passthrough, children: t('settings.litellmProxy.routing.modePassthrough') }))] })] }) }), routingMode === LiteLLMProxyRoutingMode.passthrough && (_jsx(SettingsRow, { label: "", description: t('settings.litellmProxy.routing.passthroughHelp'), children: _jsx("span", {}) })), showProxyFields && agentType === 'claude-code' ? (_jsxs(_Fragment, { children: [_jsx(SettingsRow, { label: t('settings.litellmProxy.routing.customHeaders'), description: t('settings.litellmProxy.routing.customHeadersDescription'), htmlFor: "litellm-custom-headers", children: _jsx(Textarea, { id: "litellm-custom-headers", "data-testid": "litellm-custom-headers-input", placeholder: 'x-litellm-customer-id: my-user\nx-litellm-tags: project:acme', value: customHeaders, onChange: (e) => setCustomHeaders(e.target.value), onBlur: () => {
53
125
  if (customHeaders !== originalCustomHeaders) {
54
126
  save(buildPayload({ customHeaders }));
55
127
  }
@@ -10,7 +10,14 @@ declare const meta: {
10
10
  };
11
11
  export default meta;
12
12
  type Story = StoryObj<typeof meta>;
13
- export declare const DirectMode: Story;
14
- export declare const ProxyMode: Story;
15
- export declare const PassthroughMode: Story;
13
+ export declare const ClaudeCodeDirect: Story;
14
+ export declare const ClaudeCodeProxy: Story;
15
+ export declare const ClaudeCodePassthrough: Story;
16
+ export declare const GeminiCliDirect: Story;
17
+ export declare const GeminiCliProxy: Story;
18
+ export declare const CodexCliDirect: Story;
19
+ export declare const CodexCliProxy: Story;
20
+ export declare const CursorDocs: Story;
21
+ export declare const CopilotDocs: Story;
22
+ export declare const UnsupportedAgent: Story;
16
23
  //# sourceMappingURL=litellm-proxy-routing-section.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"litellm-proxy-routing-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAa7E,QAAA,MAAM,IAAI;;;;;;;CAOyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAgBvB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC"}
1
+ {"version":3,"file":"litellm-proxy-routing-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAa7E,QAAA,MAAM,IAAI;;;;;;;CAOyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAInC,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAe7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAWnC,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAW5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,KAW5B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAW3B,CAAC;AAIF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAIF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC"}
@@ -18,47 +18,121 @@ const meta = {
18
18
  },
19
19
  };
20
20
  export default meta;
21
- export const DirectMode = {
21
+ // --- Claude Code (Tier 1, full features) ---
22
+ export const ClaudeCodeDirect = {
22
23
  args: {
23
24
  settings: {
24
25
  ...baseSettings,
26
+ agent: { ...baseSettings.agent, type: 'claude-code' },
25
27
  litellmProxy: {
26
28
  ...baseSettings.litellmProxy,
27
- claudeCode: {
28
- routingMode: LiteLLMProxyRoutingMode.direct,
29
- },
29
+ claudeCode: { routingMode: LiteLLMProxyRoutingMode.direct },
30
30
  },
31
31
  },
32
32
  },
33
33
  };
34
- export const ProxyMode = {
34
+ export const ClaudeCodeProxy = {
35
35
  args: {
36
36
  settings: {
37
37
  ...baseSettings,
38
+ agent: { ...baseSettings.agent, type: 'claude-code' },
38
39
  litellmProxy: {
39
40
  ...baseSettings.litellmProxy,
40
41
  claudeCode: {
41
42
  routingMode: LiteLLMProxyRoutingMode.proxy,
42
- customHeaders: 'x-litellm-customer-id: user-123\nx-litellm-tags: project:acme',
43
+ customHeaders: 'x-litellm-customer-id: user-123',
43
44
  sonnetModel: 'claude-sonnet-4-6',
44
- haikuModel: 'claude-haiku-4-5',
45
- opusModel: 'claude-opus-4-6',
46
45
  },
47
46
  },
48
47
  },
49
48
  },
50
49
  };
51
- export const PassthroughMode = {
50
+ export const ClaudeCodePassthrough = {
52
51
  args: {
53
52
  settings: {
54
53
  ...baseSettings,
54
+ agent: { ...baseSettings.agent, type: 'claude-code' },
55
55
  litellmProxy: {
56
56
  ...baseSettings.litellmProxy,
57
- claudeCode: {
58
- routingMode: LiteLLMProxyRoutingMode.passthrough,
59
- sonnetModel: 'claude-sonnet-4-6',
60
- },
57
+ claudeCode: { routingMode: LiteLLMProxyRoutingMode.passthrough },
58
+ },
59
+ },
60
+ },
61
+ };
62
+ // --- Gemini CLI (Tier 1, direct/proxy only) ---
63
+ export const GeminiCliDirect = {
64
+ args: {
65
+ settings: {
66
+ ...baseSettings,
67
+ agent: { ...baseSettings.agent, type: 'gemini-cli' },
68
+ litellmProxy: {
69
+ ...baseSettings.litellmProxy,
70
+ geminiCli: { routingMode: LiteLLMProxyRoutingMode.direct },
71
+ },
72
+ },
73
+ },
74
+ };
75
+ export const GeminiCliProxy = {
76
+ args: {
77
+ settings: {
78
+ ...baseSettings,
79
+ agent: { ...baseSettings.agent, type: 'gemini-cli' },
80
+ litellmProxy: {
81
+ ...baseSettings.litellmProxy,
82
+ geminiCli: { routingMode: LiteLLMProxyRoutingMode.proxy },
61
83
  },
62
84
  },
63
85
  },
64
86
  };
87
+ // --- Codex CLI (Tier 1, direct/proxy only) ---
88
+ export const CodexCliDirect = {
89
+ args: {
90
+ settings: {
91
+ ...baseSettings,
92
+ agent: { ...baseSettings.agent, type: 'codex-cli' },
93
+ litellmProxy: {
94
+ ...baseSettings.litellmProxy,
95
+ codexCli: { routingMode: LiteLLMProxyRoutingMode.direct },
96
+ },
97
+ },
98
+ },
99
+ };
100
+ export const CodexCliProxy = {
101
+ args: {
102
+ settings: {
103
+ ...baseSettings,
104
+ agent: { ...baseSettings.agent, type: 'codex-cli' },
105
+ litellmProxy: {
106
+ ...baseSettings.litellmProxy,
107
+ codexCli: { routingMode: LiteLLMProxyRoutingMode.proxy },
108
+ },
109
+ },
110
+ },
111
+ };
112
+ // --- Cursor (Tier 2, documentation panel) ---
113
+ export const CursorDocs = {
114
+ args: {
115
+ settings: {
116
+ ...baseSettings,
117
+ agent: { ...baseSettings.agent, type: 'cursor' },
118
+ },
119
+ },
120
+ };
121
+ // --- Copilot CLI (Tier 2, documentation panel) ---
122
+ export const CopilotDocs = {
123
+ args: {
124
+ settings: {
125
+ ...baseSettings,
126
+ agent: { ...baseSettings.agent, type: 'copilot-cli' },
127
+ },
128
+ },
129
+ };
130
+ // --- Unsupported agent ---
131
+ export const UnsupportedAgent = {
132
+ args: {
133
+ settings: {
134
+ ...baseSettings,
135
+ agent: { ...baseSettings.agent, type: 'rovo-dev' },
136
+ },
137
+ },
138
+ };
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {
@@ -228,7 +228,12 @@
228
228
  "sonnetModel": "Sonnet Model Override",
229
229
  "haikuModel": "Haiku Model Override",
230
230
  "opusModel": "Opus Model Override",
231
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
231
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
232
+ "notSupported": "Proxy routing is not supported for this agent type.",
233
+ "cursorInstructions": "Cursor Setup Instructions",
234
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
235
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
236
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
232
237
  }
233
238
  },
234
239
  "interactiveAgent": {
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {
@@ -242,7 +242,12 @@
242
242
  "sonnetModel": "Sonnet Model Override",
243
243
  "haikuModel": "Haiku Model Override",
244
244
  "opusModel": "Opus Model Override",
245
- "modelOverrideDescription": "Override the default model routed through LiteLLM"
245
+ "modelOverrideDescription": "Override the default model routed through LiteLLM",
246
+ "notSupported": "Proxy routing is not supported for this agent type.",
247
+ "cursorInstructions": "Cursor Setup Instructions",
248
+ "cursorDescription": "Add these values to Cursor Settings > Models > Override OpenAI Base URL and API Key. Only Ask and Plan modes support custom API keys — Agent mode does not.",
249
+ "copilotInstructions": "GitHub Copilot Setup Instructions",
250
+ "copilotDescription": "Add this to your VS Code settings.json under github.copilot.advanced: { \"debug.overrideProxyUrl\": \"<url>\", \"debug.testOverrideProxyUrl\": \"<url>\" }. These are undocumented debug settings."
246
251
  }
247
252
  },
248
253
  "interactiveAgent": {