@shipit-ai/cli 1.170.0 → 1.171.0-pr14.3081ed1

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 (265) hide show
  1. package/apis/json-schema/ClaudeCodeProxyConfig.yaml +20 -0
  2. package/apis/json-schema/CodexCliProxyConfig.yaml +8 -0
  3. package/apis/json-schema/GeminiCliProxyConfig.yaml +8 -0
  4. package/apis/json-schema/LiteLLMProxyConfig.yaml +10 -1
  5. package/apis/json-schema/LiteLLMProxyRoutingMode.yaml +8 -0
  6. package/dist/packages/core/src/domain/generated/output.d.ts +61 -1
  7. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  8. package/dist/packages/core/src/domain/generated/output.js +6 -0
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +7 -0
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +63 -1
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts +15 -0
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts.map +1 -0
  14. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.js +32 -0
  15. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-litellm-proxy-multi-agent.d.ts +12 -0
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-litellm-proxy-multi-agent.d.ts.map +1 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-litellm-proxy-multi-agent.js +20 -0
  18. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +40 -5
  20. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +15 -1
  22. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts +4 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +53 -0
  25. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts +3 -1
  26. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.js +20 -1
  28. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts +3 -1
  29. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +23 -1
  31. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +13 -0
  33. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.js +11 -2
  35. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -1
  37. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts +6 -0
  38. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts.map +1 -0
  39. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.js +141 -0
  40. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts +23 -0
  41. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts.map +1 -0
  42. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.js +138 -0
  43. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.js +5 -8
  45. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +2 -1
  47. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +6 -2
  49. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +23 -4
  51. package/dist/translations/ar/web.json +23 -1
  52. package/dist/translations/de/web.json +23 -1
  53. package/dist/translations/en/web.json +23 -1
  54. package/dist/translations/es/web.json +23 -1
  55. package/dist/translations/fr/web.json +23 -1
  56. package/dist/translations/he/web.json +23 -1
  57. package/dist/translations/pt/web.json +23 -1
  58. package/dist/translations/ru/web.json +23 -1
  59. package/dist/tsconfig.build.tsbuildinfo +1 -1
  60. package/package.json +1 -1
  61. package/web/.next/BUILD_ID +1 -1
  62. package/web/.next/build-manifest.json +3 -3
  63. package/web/.next/fallback-build-manifest.json +3 -3
  64. package/web/.next/prerender-manifest.json +3 -3
  65. package/web/.next/required-server-files.js +3 -3
  66. package/web/.next/required-server-files.json +3 -3
  67. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  68. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  71. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  74. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  83. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  89. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  90. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  92. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  95. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  98. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  101. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  102. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  104. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  107. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/_global-error.html +1 -1
  110. package/web/.next/server/app/_global-error.rsc +1 -1
  111. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  112. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  114. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  115. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  116. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  117. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  118. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  120. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  121. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  122. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  123. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  124. package/web/.next/server/app/plugins/page/server-reference-manifest.json +15 -15
  125. package/web/.next/server/app/plugins/page.js.nft.json +1 -1
  126. package/web/.next/server/app/plugins/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/settings/page/server-reference-manifest.json +12 -12
  128. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  129. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  131. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  132. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  134. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  135. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  137. package/web/.next/server/app/version/page.js.nft.json +1 -1
  138. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  139. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js +1 -1
  140. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
  141. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  142. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  143. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  145. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  147. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  149. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0~v1~b9._.js → [root-of-the-server]__0dec29w._.js} +2 -2
  156. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0~v1~b9._.js.map → [root-of-the-server]__0dec29w._.js.map} +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__0n~o-g-._.js +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__122xqm6._.js +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  172. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  174. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/_083k45~._.js +1 -1
  176. package/web/.next/server/chunks/ssr/_083k45~._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  178. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/{_0_17.-n._.js → _0_x3lcq._.js} +2 -2
  182. package/web/.next/server/chunks/ssr/{_0_17.-n._.js.map → _0_x3lcq._.js.map} +1 -1
  183. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  184. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  186. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/_0kaec~c._.js +3 -0
  188. package/web/.next/server/chunks/ssr/_0kaec~c._.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/{_0kt18~b._.js → _0o.xc6x._.js} +2 -2
  190. package/web/.next/server/chunks/ssr/_0o.xc6x._.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  192. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  194. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  196. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  197. package/web/.next/server/chunks/ssr/_0tcccbb._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/_0u3d8.n._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_0u3d8.n._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  202. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  204. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/{_0.ra89t._.js → _0y..nje._.js} +2 -2
  206. package/web/.next/server/chunks/ssr/{_0.ra89t._.js.map → _0y..nje._.js.map} +1 -1
  207. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  210. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  211. package/web/.next/server/chunks/ssr/_10joy2y._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_10joy2y._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/{_069ybyi._.js → _11m08b.._.js} +2 -2
  216. package/web/.next/server/chunks/ssr/{_069ybyi._.js.map → _11m08b.._.js.map} +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_0y11iiz._.js +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +1 -1
  219. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js.map +1 -1
  230. package/web/.next/server/middleware-build-manifest.js +3 -3
  231. package/web/.next/server/pages/500.html +1 -1
  232. package/web/.next/server/server-reference-manifest.js +1 -1
  233. package/web/.next/server/server-reference-manifest.json +55 -55
  234. package/web/.next/static/chunks/0.s8cxri-_s9l.js +1 -0
  235. package/web/.next/static/chunks/{043zp6fpfaz07.js → 00mndm-cn62yi.js} +3 -3
  236. package/web/.next/static/chunks/{0nkujbu62z1jl.js → 012cnd7koqv6d.js} +1 -1
  237. package/web/.next/static/chunks/{024vi1xxw5ccj.js → 035n_7q_le4_v.js} +1 -1
  238. package/web/.next/static/chunks/{0xzs6jdtkmbic.js → 07aeattmn3qad.js} +1 -1
  239. package/web/.next/static/chunks/{01zrwm.x3kpdo.js → 09vtz93hrh9ru.js} +1 -1
  240. package/web/.next/static/chunks/0_.6p9uetny3..js +1 -0
  241. package/web/.next/static/chunks/0eba7~6fg9qwe.js +1 -0
  242. package/web/.next/static/chunks/{0vq.b40jzhi7r.js → 0fb1~43ysebxc.js} +3 -3
  243. package/web/.next/static/chunks/0inayq2zzadja.js +1 -0
  244. package/web/.next/static/chunks/{0e.8n42~fpeqa.js → 0lwx2r2l9mn3q.js} +1 -1
  245. package/web/.next/static/chunks/{0rb5cx51f5u8h.js → 0n0qvdfoakb9_.js} +1 -1
  246. package/web/.next/static/chunks/{0xo.hi4px83w2.js → 0nfd9bvcnbcgl.js} +1 -1
  247. package/web/.next/static/chunks/0ug478hm-8bog.js +5 -0
  248. package/web/.next/static/chunks/{09lcrhxslt-u8.js → 0v017jaetwb46.js} +1 -1
  249. package/web/.next/static/chunks/{0lwuepa24tqxy.js → 0y_0lrrna5~-o.js} +1 -1
  250. package/web/.next/static/chunks/{16jgc8hqxrp.u.js → 10l0-vy04a9o9.js} +1 -1
  251. package/web/.next/static/chunks/10rtagfoabp3b.js +1 -0
  252. package/web/.next/static/chunks/{0dprl~vdhvhk7.js → 11ixt-oeur1~m.js} +1 -1
  253. package/web/.next/static/chunks/{0~4c6tnw7xnnl.js → 184ao3jr5r8j8.js} +1 -1
  254. package/web/.next/server/chunks/ssr/_0kt18~b._.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/_12uy.45._.js +0 -3
  256. package/web/.next/server/chunks/ssr/_12uy.45._.js.map +0 -1
  257. package/web/.next/static/chunks/0aq9-lg.5r.nk.js +0 -5
  258. package/web/.next/static/chunks/0jt5jzg88skg5.js +0 -1
  259. package/web/.next/static/chunks/0lz-oq74e_ciu.js +0 -1
  260. package/web/.next/static/chunks/0tdbctvrma.oi.js +0 -1
  261. package/web/.next/static/chunks/0wd.i4f822qoa.js +0 -1
  262. package/web/.next/static/chunks/13q1peb_t9vj8.js +0 -1
  263. /package/web/.next/static/{kDUolP-Zj2jCRleGJJGX0 → W7ndKq72I0JMM72IDtikE}/_buildManifest.js +0 -0
  264. /package/web/.next/static/{kDUolP-Zj2jCRleGJJGX0 → W7ndKq72I0JMM72IDtikE}/_clientMiddlewareManifest.js +0 -0
  265. /package/web/.next/static/{kDUolP-Zj2jCRleGJJGX0 → W7ndKq72I0JMM72IDtikE}/_ssgManifest.js +0 -0
@@ -8,7 +8,7 @@
8
8
  * Uses constructor dependency injection for the spawn function
9
9
  * to enable testability without mocking node:child_process directly.
10
10
  */
11
- import type { AgentType, AgentFeature } from '../../../../../domain/generated/output.js';
11
+ import type { AgentType, AgentFeature, LiteLLMProxyConfig } from '../../../../../domain/generated/output.js';
12
12
  import type { AgentExecutionOptions, AgentExecutionResult, AgentExecutionStreamEvent } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
13
13
  import type { SpawnFunction } from '../types.js';
14
14
  import { ExecutorBase } from './executor-base.js';
@@ -18,7 +18,10 @@ import { ExecutorBase } from './executor-base.js';
18
18
  */
19
19
  export declare class ClaudeCodeExecutorService extends ExecutorBase {
20
20
  readonly agentType: AgentType;
21
+ private proxyConfig?;
21
22
  constructor(spawn: SpawnFunction);
23
+ updateProxyConfig(config?: LiteLLMProxyConfig): void;
24
+ protected buildSpawnEnv(): Record<string, string | undefined>;
22
25
  execute(prompt: string, options?: AgentExecutionOptions): Promise<AgentExecutionResult>;
23
26
  executeStream(prompt: string, options?: AgentExecutionOptions): AsyncIterable<AgentExecutionStreamEvent>;
24
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEb,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAEpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWlD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;gBAE/C,KAAK,EAAE,aAAa;IAI1B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4FtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA6D3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IA0CtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IA4BjB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IA6BvB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,eAAe;CAkExB"}
1
+ {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEZ,kBAAkB,EACnB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAEpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWlD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAC3D,OAAO,CAAC,WAAW,CAAC,CAAqB;gBAE7B,KAAK,EAAE,aAAa;IAIhC,iBAAiB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI;cAIjC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAkDhE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4FtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA6D3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IA0CtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IA4BjB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IA6BvB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,eAAe;CAkExB"}
@@ -8,6 +8,7 @@
8
8
  * Uses constructor dependency injection for the spawn function
9
9
  * to enable testability without mocking node:child_process directly.
10
10
  */
11
+ import { LiteLLMProxyRoutingMode } from '../../../../../domain/generated/output.js';
11
12
  import { ExecutorBase } from './executor-base.js';
12
13
  /** Features supported by Claude Code CLI */
13
14
  const SUPPORTED_FEATURES = new Set([
@@ -23,9 +24,61 @@ const SUPPORTED_FEATURES = new Set([
23
24
  */
24
25
  export class ClaudeCodeExecutorService extends ExecutorBase {
25
26
  agentType = 'claude-code';
27
+ proxyConfig;
26
28
  constructor(spawn) {
27
29
  super(spawn);
28
30
  }
31
+ updateProxyConfig(config) {
32
+ this.proxyConfig = config;
33
+ }
34
+ buildSpawnEnv() {
35
+ const env = super.buildSpawnEnv();
36
+ const cc = this.proxyConfig?.claudeCode;
37
+ if (!cc || !this.proxyConfig?.baseUrl)
38
+ return env;
39
+ const mode = cc.routingMode ?? LiteLLMProxyRoutingMode.direct;
40
+ if (mode === LiteLLMProxyRoutingMode.direct)
41
+ return env;
42
+ // Guard against unrecognized routing modes (DB corruption, future enum additions)
43
+ if (mode !== LiteLLMProxyRoutingMode.proxy && mode !== LiteLLMProxyRoutingMode.passthrough) {
44
+ this.log(`WARNING: Unknown LiteLLM routing mode "${mode}", falling back to direct mode`);
45
+ return env;
46
+ }
47
+ // Both proxy and passthrough set BASE_URL
48
+ env.ANTHROPIC_BASE_URL = this.proxyConfig.baseUrl;
49
+ if (mode === LiteLLMProxyRoutingMode.proxy) {
50
+ if (this.proxyConfig.apiKey) {
51
+ env.ANTHROPIC_AUTH_TOKEN = this.proxyConfig.apiKey;
52
+ }
53
+ if (cc.customHeaders) {
54
+ env.ANTHROPIC_CUSTOM_HEADERS = cc.customHeaders;
55
+ }
56
+ }
57
+ else {
58
+ // passthrough mode
59
+ const headers = [];
60
+ if (this.proxyConfig.apiKey) {
61
+ headers.push(`x-litellm-api-key: Bearer ${this.proxyConfig.apiKey}`);
62
+ }
63
+ else {
64
+ this.log('WARNING: Passthrough mode active but no proxy API key configured — proxy may reject requests');
65
+ }
66
+ if (cc.customHeaders) {
67
+ headers.push(cc.customHeaders);
68
+ }
69
+ if (headers.length) {
70
+ env.ANTHROPIC_CUSTOM_HEADERS = headers.join('\n');
71
+ }
72
+ }
73
+ // Model overrides (both proxy and passthrough)
74
+ if (cc.sonnetModel)
75
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = cc.sonnetModel;
76
+ if (cc.haikuModel)
77
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = cc.haikuModel;
78
+ if (cc.opusModel)
79
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = cc.opusModel;
80
+ return env;
81
+ }
29
82
  async execute(prompt, options) {
30
83
  this.silent = options?.silent ?? false;
31
84
  // Use stream-json so we get real-time events in the worker log
@@ -7,7 +7,7 @@
7
7
  * Uses constructor dependency injection for the spawn function
8
8
  * to enable testability without mocking node:child_process directly.
9
9
  */
10
- import type { AgentType, AgentFeature, AgentConfig } from '../../../../../domain/generated/output.js';
10
+ import type { AgentType, AgentFeature, AgentConfig, LiteLLMProxyConfig } from '../../../../../domain/generated/output.js';
11
11
  import type { AgentExecutionOptions, AgentExecutionResult, AgentExecutionStreamEvent } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
12
12
  import type { SpawnFunction } from '../types.js';
13
13
  import { ExecutorBase } from './executor-base.js';
@@ -18,7 +18,9 @@ import { ExecutorBase } from './executor-base.js';
18
18
  export declare class CodexCliExecutorService extends ExecutorBase {
19
19
  readonly agentType: AgentType;
20
20
  private readonly authConfig?;
21
+ private proxyConfig?;
21
22
  constructor(spawn: SpawnFunction, authConfig?: AgentConfig);
23
+ updateProxyConfig(config?: LiteLLMProxyConfig): void;
22
24
  supportsFeature(feature: AgentFeature): boolean;
23
25
  execute(prompt: string, options?: AgentExecutionOptions): Promise<AgentExecutionResult>;
24
26
  executeStream(prompt: string, options?: AgentExecutionOptions): AsyncIterable<AgentExecutionStreamEvent>;
@@ -1 +1 @@
1
- {"version":3,"file":"codex-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EAEZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAEpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsBlD;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA4B;IAEzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAc;gBAE9B,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,WAAW;IAK1D,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuItF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAoM3C;;;;OAIG;IACH,wDAAwD;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAyC;IAEnF,OAAO,CAAC,cAAc;IAkJtB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;cA+BE,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAQtE;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAU/B"}
1
+ {"version":3,"file":"codex-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EAEX,kBAAkB,EACnB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAEpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsBlD;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA4B;IAEzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAc;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAqB;gBAE7B,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,WAAW;IAK1D,iBAAiB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAIpD,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuItF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAoM3C;;;;OAIG;IACH,wDAAwD;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAyC;IAEnF,OAAO,CAAC,cAAc;IAkJtB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;cA+BE,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IA2BtE;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAU/B"}
@@ -10,6 +10,7 @@
10
10
  import * as fs from 'node:fs';
11
11
  import * as os from 'node:os';
12
12
  import * as path from 'node:path';
13
+ import { LiteLLMProxyRoutingMode } from '../../../../../domain/generated/output.js';
13
14
  import { ExecutorBase } from './executor-base.js';
14
15
  /** Features supported by Codex CLI */
15
16
  const SUPPORTED_FEATURES = new Set([
@@ -36,10 +37,14 @@ const FATAL_STDERR_PATTERNS = [
36
37
  export class CodexCliExecutorService extends ExecutorBase {
37
38
  agentType = 'codex-cli';
38
39
  authConfig;
40
+ proxyConfig;
39
41
  constructor(spawn, authConfig) {
40
42
  super(spawn);
41
43
  this.authConfig = authConfig;
42
44
  }
45
+ updateProxyConfig(config) {
46
+ this.proxyConfig = config;
47
+ }
43
48
  supportsFeature(feature) {
44
49
  return SUPPORTED_FEATURES.has(feature);
45
50
  }
@@ -491,8 +496,22 @@ export class CodexCliExecutorService extends ExecutorBase {
491
496
  }
492
497
  buildSpawnEnv() {
493
498
  const env = super.buildSpawnEnv();
499
+ // Proxy mode: use OPENAI_BASE_URL + OPENAI_API_KEY (not CODEX_API_KEY)
500
+ const cx = this.proxyConfig?.codexCli;
501
+ if (cx?.routingMode === LiteLLMProxyRoutingMode.proxy && this.proxyConfig?.baseUrl) {
502
+ env.OPENAI_BASE_URL = this.proxyConfig.baseUrl;
503
+ if (this.proxyConfig.apiKey) {
504
+ env.OPENAI_API_KEY = this.proxyConfig.apiKey;
505
+ }
506
+ return env;
507
+ }
508
+ // Guard against unrecognized routing modes
509
+ if (cx?.routingMode && cx.routingMode !== LiteLLMProxyRoutingMode.direct) {
510
+ this.log(`WARNING: Unsupported routing mode "${cx.routingMode}" for Codex CLI, falling back to direct`);
511
+ }
512
+ // Direct mode: existing authConfig token injection
494
513
  if (this.authConfig?.authMethod === 'token' && this.authConfig.token) {
495
- return { ...env, CODEX_API_KEY: this.authConfig.token };
514
+ env.CODEX_API_KEY = this.authConfig.token;
496
515
  }
497
516
  return env;
498
517
  }
@@ -7,7 +7,7 @@
7
7
  * Uses constructor dependency injection for the spawn function
8
8
  * to enable testability without mocking node:child_process directly.
9
9
  */
10
- import type { AgentType, AgentFeature, AgentConfig } from '../../../../../domain/generated/output.js';
10
+ import type { AgentType, AgentFeature, AgentConfig, LiteLLMProxyConfig } from '../../../../../domain/generated/output.js';
11
11
  import type { AgentExecutionOptions, AgentExecutionResult, AgentExecutionStreamEvent } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
12
12
  import type { SpawnFunction } from '../types.js';
13
13
  import { ExecutorBase } from './executor-base.js';
@@ -18,7 +18,9 @@ import { ExecutorBase } from './executor-base.js';
18
18
  export declare class GeminiCliExecutorService extends ExecutorBase {
19
19
  readonly agentType: AgentType;
20
20
  private readonly authConfig?;
21
+ private proxyConfig?;
21
22
  constructor(spawn: SpawnFunction, authConfig?: AgentConfig);
23
+ updateProxyConfig(config?: LiteLLMProxyConfig): void;
22
24
  supportsFeature(feature: AgentFeature): boolean;
23
25
  execute(prompt: string, options?: AgentExecutionOptions): Promise<AgentExecutionResult>;
24
26
  executeStream(prompt: string, options?: AgentExecutionOptions): AsyncIterable<AgentExecutionStreamEvent>;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EAEZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,YAAY;IACxD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA6B;IAE1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAc;gBAE9B,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,WAAW;IAK1D,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsFtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAgF3C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI3C;IAEF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,SAAS;cAyBE,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAOvE"}
1
+ {"version":3,"file":"gemini-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EAEX,kBAAkB,EACnB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,YAAY;IACxD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA6B;IAE1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAc;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAqB;gBAE7B,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,WAAW;IAK1D,iBAAiB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAIpD,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsFtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAgF3C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI3C;IAEF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,SAAS;cAyBE,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CA8BvE"}
@@ -7,6 +7,7 @@
7
7
  * Uses constructor dependency injection for the spawn function
8
8
  * to enable testability without mocking node:child_process directly.
9
9
  */
10
+ import { LiteLLMProxyRoutingMode } from '../../../../../domain/generated/output.js';
10
11
  import { ExecutorBase } from './executor-base.js';
11
12
  /** Features supported by Gemini CLI */
12
13
  const SUPPORTED_FEATURES = new Set(['session-resume', 'streaming', 'tool-scoping']);
@@ -17,10 +18,14 @@ const SUPPORTED_FEATURES = new Set(['session-resume', 'streaming', 'tool-scoping
17
18
  export class GeminiCliExecutorService extends ExecutorBase {
18
19
  agentType = 'gemini-cli';
19
20
  authConfig;
21
+ proxyConfig;
20
22
  constructor(spawn, authConfig) {
21
23
  super(spawn);
22
24
  this.authConfig = authConfig;
23
25
  }
26
+ updateProxyConfig(config) {
27
+ this.proxyConfig = config;
28
+ }
24
29
  supportsFeature(feature) {
25
30
  return SUPPORTED_FEATURES.has(feature);
26
31
  }
@@ -279,8 +284,25 @@ export class GeminiCliExecutorService extends ExecutorBase {
279
284
  }
280
285
  buildSpawnEnv() {
281
286
  const env = super.buildSpawnEnv();
287
+ // Proxy mode takes precedence — never leak user's personal key to proxy
288
+ const gc = this.proxyConfig?.geminiCli;
289
+ if (gc?.routingMode === LiteLLMProxyRoutingMode.proxy && this.proxyConfig?.baseUrl) {
290
+ env.GOOGLE_GEMINI_BASE_URL = this.proxyConfig.baseUrl;
291
+ if (this.proxyConfig.apiKey) {
292
+ env.GEMINI_API_KEY = this.proxyConfig.apiKey;
293
+ }
294
+ else {
295
+ this.log('WARNING: Proxy mode active but no proxy API key configured — proxy may reject requests');
296
+ }
297
+ return env;
298
+ }
299
+ // Guard against unrecognized routing modes
300
+ if (gc?.routingMode && gc.routingMode !== LiteLLMProxyRoutingMode.direct) {
301
+ this.log(`WARNING: Unsupported routing mode "${gc.routingMode}" for Gemini CLI, falling back to direct`);
302
+ }
303
+ // Direct mode: existing authConfig token injection
282
304
  if (this.authConfig?.authMethod === 'token' && this.authConfig.token) {
283
- return { ...env, GEMINI_API_KEY: this.authConfig.token };
305
+ env.GEMINI_API_KEY = this.authConfig.token;
284
306
  }
285
307
  return env;
286
308
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAgB1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyF1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0S/D"}
1
+ {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAmB1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyF1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkT/D"}
@@ -16,6 +16,9 @@ import { initializeContainer, container } from '../../../di/container.js';
16
16
  import { createFeatureAgentGraph } from './feature-agent-graph.js';
17
17
  import { createFastFeatureAgentGraph } from './fast-feature-agent-graph.js';
18
18
  import { createCheckpointer } from '../common/checkpointer.js';
19
+ import { ClaudeCodeExecutorService } from '../../../services/agents/common/executors/claude-code-executor.service.js';
20
+ import { GeminiCliExecutorService } from '../../../services/agents/common/executors/gemini-cli-executor.service.js';
21
+ import { CodexCliExecutorService } from '../../../services/agents/common/executors/codex-cli-executor.service.js';
19
22
  import { AgentRunStatus, SdlcLifecycle } from '../../../../domain/generated/output.js';
20
23
  import { initializeSettings } from '../../../services/settings.service.js';
21
24
  import { InitializeSettingsUseCase } from '../../../../application/use-cases/settings/initialize-settings.use-case.js';
@@ -183,6 +186,16 @@ export async function runWorker(args) {
183
186
  log(`Creating executor from pinned agent type: ${args.agentType}`);
184
187
  const factory = container.resolve('IAgentExecutorFactory');
185
188
  executor = factory.createExecutor(args.agentType, settings.agent);
189
+ // Update proxy config for direct factory calls (provider does this automatically)
190
+ if (executor instanceof ClaudeCodeExecutorService) {
191
+ executor.updateProxyConfig(settings.litellmProxy);
192
+ }
193
+ else if (executor instanceof GeminiCliExecutorService) {
194
+ executor.updateProxyConfig(settings.litellmProxy);
195
+ }
196
+ else if (executor instanceof CodexCliExecutorService) {
197
+ executor.updateProxyConfig(settings.litellmProxy);
198
+ }
186
199
  }
187
200
  else {
188
201
  log('Creating executor from configured agent settings...');
@@ -1 +1 @@
1
- {"version":3,"file":"plugins-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/plugins/plugins-page-client.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,sBAAsB,2CA0M1F"}
1
+ {"version":3,"file":"plugins-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/plugins/plugins-page-client.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,sBAAsB,2CAiP1F"}
@@ -19,6 +19,7 @@ export function PluginsPageClient({ proxyConfigured, isClaudeCode }) {
19
19
  const [, startTransition] = useTransition();
20
20
  const [searchQuery, setSearchQuery] = useState('');
21
21
  const [activeCategory, setActiveCategory] = useState(null);
22
+ const [statusFilter, setStatusFilter] = useState(null);
22
23
  const [selectedPlugin, setSelectedPlugin] = useState(null);
23
24
  const [plugins, setPlugins] = useState([]);
24
25
  const [installedPlugins, setInstalledPlugins] = useState([]);
@@ -47,6 +48,13 @@ export function PluginsPageClient({ proxyConfigured, isClaudeCode }) {
47
48
  return plugins.filter((p) => {
48
49
  if (activeCategory && p.category !== activeCategory)
49
50
  return false;
51
+ if (statusFilter) {
52
+ const isInstalled = !!installedPlugins.find((ip) => ip.id.startsWith(`${p.name}@`));
53
+ if (statusFilter === 'installed' && !isInstalled)
54
+ return false;
55
+ if (statusFilter === 'not-installed' && isInstalled)
56
+ return false;
57
+ }
50
58
  if (query) {
51
59
  const matchesName = p.name.toLowerCase().includes(query);
52
60
  const matchesDescription = p.description.toLowerCase().includes(query);
@@ -55,7 +63,7 @@ export function PluginsPageClient({ proxyConfigured, isClaudeCode }) {
55
63
  }
56
64
  return true;
57
65
  });
58
- }, [plugins, searchQuery, activeCategory]);
66
+ }, [plugins, searchQuery, activeCategory, statusFilter, installedPlugins]);
59
67
  const getInstalled = (pluginName) => installedPlugins.find((ip) => ip.id.startsWith(`${pluginName}@`));
60
68
  const handleInstall = (pluginName) => {
61
69
  startTransition(async () => {
@@ -108,8 +116,9 @@ export function PluginsPageClient({ proxyConfigured, isClaudeCode }) {
108
116
  if (plugins.length === 0) {
109
117
  return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: t('plugins.title') }), _jsx(EmptyState, { icon: _jsx(Blocks, { className: "size-10" }), title: t('plugins.emptyState') })] }));
110
118
  }
111
- return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: t('plugins.title') }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: t('plugins.searchPlaceholder'), value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9", "data-testid": "plugin-search" })] }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: activeCategory === null ? 'default' : 'outline', size: "sm", onClick: () => setActiveCategory(null), children: t('plugins.allCategories') }), categories.map((cat) => (_jsx(Button, { variant: activeCategory === cat ? 'default' : 'outline', size: "sm", onClick: () => setActiveCategory(cat === activeCategory ? null : cat), children: cat }, cat)))] }), filteredPlugins.length > 0 ? (_jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: filteredPlugins.map((plugin) => (_jsx(PluginCard, { plugin: plugin, installed: getInstalled(plugin.name), onSelect: setSelectedPlugin, onToggle: handleToggle }, plugin.name))) })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: t('plugins.emptyState'), action: _jsx(Button, { variant: "outline", onClick: () => {
119
+ return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: t('plugins.title') }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: t('plugins.searchPlaceholder'), value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9", "data-testid": "plugin-search" })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-4", children: [_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: activeCategory === null ? 'default' : 'outline', size: "sm", onClick: () => setActiveCategory(null), children: t('plugins.allCategories') }), categories.map((cat) => (_jsx(Button, { variant: activeCategory === cat ? 'default' : 'outline', size: "sm", onClick: () => setActiveCategory(cat === activeCategory ? null : cat), children: cat }, cat)))] }), _jsx("div", { className: "bg-border h-6 w-px" }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: statusFilter === null ? 'default' : 'outline', size: "sm", onClick: () => setStatusFilter(null), children: "All Status" }), _jsx(Button, { variant: statusFilter === 'installed' ? 'default' : 'outline', size: "sm", onClick: () => setStatusFilter(statusFilter === 'installed' ? null : 'installed'), children: t('plugins.installed') }), _jsx(Button, { variant: statusFilter === 'not-installed' ? 'default' : 'outline', size: "sm", onClick: () => setStatusFilter(statusFilter === 'not-installed' ? null : 'not-installed'), children: t('plugins.notInstalled') })] })] }), filteredPlugins.length > 0 ? (_jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: filteredPlugins.map((plugin) => (_jsx(PluginCard, { plugin: plugin, installed: getInstalled(plugin.name), onSelect: setSelectedPlugin, onToggle: handleToggle }, plugin.name))) })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: t('plugins.emptyState'), action: _jsx(Button, { variant: "outline", onClick: () => {
112
120
  setSearchQuery('');
113
121
  setActiveCategory(null);
122
+ setStatusFilter(null);
114
123
  }, children: t('plugins.clearFilters') }) })), _jsx(PluginDetailDrawer, { plugin: selectedPlugin, installed: selectedPlugin ? getInstalled(selectedPlugin.name) : undefined, open: !!selectedPlugin, onClose: () => setSelectedPlugin(null), onInstall: handleInstall, onUninstall: handleUninstall })] }));
115
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,yCAAyC,CAAC;AAGtF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE,gCAAgC,2CA6IzF"}
1
+ {"version":3,"file":"feature-flags-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,yCAAyC,CAAC;AAGtF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE,gCAAgC,2CAkJzF"}
@@ -56,7 +56,9 @@ export function FeatureFlagsSettingsSection({ settings }) {
56
56
  const newFlags = { ...flags, reactFileManager: v };
57
57
  setFlags(newFlags);
58
58
  save({ featureFlags: newFlags });
59
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.plugins'), description: t('settings.featureFlags.pluginsDescription'), tooltip: "Enables the Plugins page for browsing and managing Claude Code plugins from a LiteLLM marketplace.", id: "flag-plugins", testId: "switch-flag-plugins", checked: flags.plugins, onChange: (v) => {
59
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.plugins'), description: settings.litellmProxy?.baseUrl
60
+ ? t('settings.featureFlags.pluginsDescription')
61
+ : `${t('settings.featureFlags.pluginsDescription')} — ${t('plugins.noProxy')}`, tooltip: "Enables the Plugins page for browsing and managing Claude Code plugins from a LiteLLM marketplace. Requires a LiteLLM proxy URL to be configured.", id: "flag-plugins", testId: "switch-flag-plugins", checked: flags.plugins, disabled: !settings.litellmProxy?.baseUrl, onChange: (v) => {
60
62
  const newFlags = { ...flags, plugins: v };
61
63
  setFlags(newFlags);
62
64
  save({ featureFlags: newFlags });
@@ -0,0 +1,6 @@
1
+ import type { Settings } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ export interface LiteLLMProxyRoutingSectionProps {
3
+ settings: Settings;
4
+ }
5
+ export declare function LiteLLMProxyRoutingSection({ settings }: LiteLLMProxyRoutingSectionProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=litellm-proxy-routing-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"litellm-proxy-routing-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/litellm-proxy-routing-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAaxE,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAyCD,wBAAgB,0BAA0B,CAAC,EAAE,QAAQ,EAAE,EAAE,+BAA+B,2CAuQvF"}
@@ -0,0 +1,141 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useTransition } from 'react';
4
+ import { Route } from 'lucide-react';
5
+ import { toast } from 'sonner';
6
+ import { useTranslation } from 'react-i18next';
7
+ import { updateSettingsAction } from '../../../app/actions/update-settings.js';
8
+ import { LiteLLMProxyRoutingMode } from '../../../../../../packages/core/src/domain/generated/output.js';
9
+ import { SettingsSection, SettingsRow } from './settings-section-utils.js';
10
+ import { Input } from '../../ui/input.js';
11
+ import { Textarea } from '../../ui/textarea.js';
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
+ }
48
+ export function LiteLLMProxyRoutingSection({ settings }) {
49
+ const { t } = useTranslation('web');
50
+ const [, startTransition] = useTransition();
51
+ const agentType = settings.agent.type;
52
+ const cc = settings.litellmProxy?.claudeCode;
53
+ const [routingMode, setRoutingMode] = useState(getRoutingMode(settings));
54
+ const [customHeaders, setCustomHeaders] = useState(cc?.customHeaders ?? '');
55
+ const [sonnetModel, setSonnetModel] = useState(cc?.sonnetModel ?? '');
56
+ const [haikuModel, setHaikuModel] = useState(cc?.haikuModel ?? '');
57
+ const [opusModel, setOpusModel] = useState(cc?.opusModel ?? '');
58
+ const originalCustomHeaders = cc?.customHeaders ?? '';
59
+ const originalSonnetModel = cc?.sonnetModel ?? '';
60
+ const originalHaikuModel = cc?.haikuModel ?? '';
61
+ const originalOpusModel = cc?.opusModel ?? '';
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 ?? '';
67
+ function save(payload) {
68
+ startTransition(async () => {
69
+ const result = await updateSettingsAction(payload);
70
+ if (!result.success) {
71
+ toast.error(result.error ?? t('settings.failedToSave'));
72
+ }
73
+ });
74
+ }
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
93
+ return {
94
+ litellmProxy: {
95
+ [key]: {
96
+ routingMode: overrides?.routingMode ?? routingMode,
97
+ },
98
+ },
99
+ };
100
+ }
101
+ function handleModeChange(value) {
102
+ setRoutingMode(value);
103
+ save(buildPayload({ routingMode: value }));
104
+ }
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: () => {
125
+ if (customHeaders !== originalCustomHeaders) {
126
+ save(buildPayload({ customHeaders }));
127
+ }
128
+ }, rows: 3, className: "w-64 text-xs" }) }), _jsx(SettingsRow, { label: t('settings.litellmProxy.routing.sonnetModel'), description: t('settings.litellmProxy.routing.modelOverrideDescription'), htmlFor: "litellm-sonnet-model", children: _jsx(Input, { id: "litellm-sonnet-model", "data-testid": "litellm-sonnet-model-input", type: "text", placeholder: "claude-sonnet-4-6", value: sonnetModel, onChange: (e) => setSonnetModel(e.target.value), onBlur: () => {
129
+ if (sonnetModel !== originalSonnetModel) {
130
+ save(buildPayload({ sonnetModel }));
131
+ }
132
+ }, className: "w-64 text-xs" }) }), _jsx(SettingsRow, { label: t('settings.litellmProxy.routing.haikuModel'), htmlFor: "litellm-haiku-model", children: _jsx(Input, { id: "litellm-haiku-model", "data-testid": "litellm-haiku-model-input", type: "text", placeholder: "claude-haiku-4-5", value: haikuModel, onChange: (e) => setHaikuModel(e.target.value), onBlur: () => {
133
+ if (haikuModel !== originalHaikuModel) {
134
+ save(buildPayload({ haikuModel }));
135
+ }
136
+ }, className: "w-64 text-xs" }) }), _jsx(SettingsRow, { label: t('settings.litellmProxy.routing.opusModel'), htmlFor: "litellm-opus-model", children: _jsx(Input, { id: "litellm-opus-model", "data-testid": "litellm-opus-model-input", type: "text", placeholder: "claude-opus-4-6", value: opusModel, onChange: (e) => setOpusModel(e.target.value), onBlur: () => {
137
+ if (opusModel !== originalOpusModel) {
138
+ save(buildPayload({ opusModel }));
139
+ }
140
+ }, className: "w-64 text-xs" }) })] })) : null] }));
141
+ }
@@ -0,0 +1,23 @@
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ import { LiteLLMProxyRoutingSection } from './litellm-proxy-routing-section.js';
3
+ declare const meta: {
4
+ title: string;
5
+ component: typeof LiteLLMProxyRoutingSection;
6
+ tags: string[];
7
+ parameters: {
8
+ layout: string;
9
+ };
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof meta>;
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;
23
+ //# sourceMappingURL=litellm-proxy-routing-section.stories.d.ts.map
@@ -0,0 +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;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"}