@shipit-ai/cli 1.169.0 → 1.170.0-pr13.00cc956

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 (413) hide show
  1. package/apis/json-schema/ClaudeCodeProxyConfig.yaml +20 -0
  2. package/apis/json-schema/FeatureFlags.yaml +5 -0
  3. package/apis/json-schema/LiteLLMProxyConfig.yaml +17 -0
  4. package/apis/json-schema/LiteLLMProxyRoutingMode.yaml +8 -0
  5. package/apis/json-schema/Settings.yaml +3 -0
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts +46 -0
  9. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts.map +1 -0
  10. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.js +12 -0
  11. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts +16 -0
  12. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts.map +1 -0
  13. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.js +34 -0
  14. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts +24 -0
  15. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts.map +1 -0
  16. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.js +52 -0
  17. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts +17 -0
  18. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts.map +1 -0
  19. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.js +33 -0
  20. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts +17 -0
  21. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts.map +1 -0
  22. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.js +33 -0
  23. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts +16 -0
  24. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts.map +1 -0
  25. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.js +33 -0
  26. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  27. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  28. package/dist/packages/core/src/domain/generated/output.d.ts +59 -0
  29. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  30. package/dist/packages/core/src/domain/generated/output.js +6 -0
  31. package/dist/packages/core/src/infrastructure/di/modules/services.module.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/di/modules/services.module.js +13 -0
  33. package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.js +12 -0
  35. package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.js +22 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +9 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +55 -0
  40. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts +14 -0
  41. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts.map +1 -0
  42. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.js +28 -0
  43. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts +15 -0
  44. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts.map +1 -0
  45. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.js +32 -0
  46. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  47. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +36 -5
  48. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
  49. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +7 -1
  50. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts +4 -1
  51. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  52. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +53 -0
  53. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  54. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +5 -0
  55. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts +4 -0
  56. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts.map +1 -0
  57. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.js +3 -0
  58. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts +78 -0
  59. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts.map +1 -0
  60. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.js +46 -0
  61. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts +29 -0
  62. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts.map +1 -0
  63. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.js +147 -0
  64. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts +11 -0
  65. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts.map +1 -0
  66. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.js +47 -0
  67. package/dist/src/presentation/web/app/actions/add-marketplace.d.ts +5 -0
  68. package/dist/src/presentation/web/app/actions/add-marketplace.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/actions/add-marketplace.js +11 -0
  70. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts +5 -0
  71. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts.map +1 -0
  72. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.js +11 -0
  73. package/dist/src/presentation/web/app/actions/install-plugin.d.ts +5 -0
  74. package/dist/src/presentation/web/app/actions/install-plugin.d.ts.map +1 -0
  75. package/dist/src/presentation/web/app/actions/install-plugin.js +11 -0
  76. package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts +5 -0
  77. package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts.map +1 -0
  78. package/dist/src/presentation/web/app/actions/toggle-plugin.js +11 -0
  79. package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts +5 -0
  80. package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts.map +1 -0
  81. package/dist/src/presentation/web/app/actions/uninstall-plugin.js +11 -0
  82. package/dist/src/presentation/web/app/plugins/page.d.ts +2 -0
  83. package/dist/src/presentation/web/app/plugins/page.d.ts.map +1 -0
  84. package/dist/src/presentation/web/app/plugins/page.js +23 -0
  85. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +1 -0
  87. package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts +9 -0
  88. package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts.map +1 -0
  89. package/dist/src/presentation/web/components/features/plugins/plugin-card.js +15 -0
  90. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts +17 -0
  91. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts.map +1 -0
  92. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.js +60 -0
  93. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts +11 -0
  94. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts.map +1 -0
  95. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.js +33 -0
  96. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts +18 -0
  97. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts.map +1 -0
  98. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.js +51 -0
  99. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts +6 -0
  100. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts.map +1 -0
  101. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.js +124 -0
  102. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts +12 -0
  103. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts.map +1 -0
  104. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.js +24 -0
  105. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +7 -0
  107. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  108. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +2 -0
  109. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts +6 -0
  110. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts.map +1 -0
  111. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.js +69 -0
  112. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts +16 -0
  113. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts.map +1 -0
  114. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.js +64 -0
  115. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts +6 -0
  116. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts.map +1 -0
  117. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.js +73 -0
  118. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts +15 -0
  119. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts.map +1 -0
  120. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.js +29 -0
  121. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  122. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -2
  123. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  124. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  125. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -1
  126. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +6 -2
  127. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
  128. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +23 -4
  129. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  130. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  131. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  132. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  133. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  134. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  135. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  136. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  137. package/dist/src/presentation/web/lib/feature-flags.js +6 -0
  138. package/dist/translations/ar/web.json +56 -2
  139. package/dist/translations/de/web.json +56 -2
  140. package/dist/translations/en/web.json +56 -2
  141. package/dist/translations/es/web.json +56 -2
  142. package/dist/translations/fr/web.json +56 -2
  143. package/dist/translations/he/web.json +56 -2
  144. package/dist/translations/pt/web.json +56 -2
  145. package/dist/translations/ru/web.json +56 -2
  146. package/dist/tsconfig.build.tsbuildinfo +1 -1
  147. package/package.json +1 -1
  148. package/web/.next/BUILD_ID +1 -1
  149. package/web/.next/app-path-routes-manifest.json +1 -0
  150. package/web/.next/build-manifest.json +3 -3
  151. package/web/.next/fallback-build-manifest.json +3 -3
  152. package/web/.next/prerender-manifest.json +3 -3
  153. package/web/.next/required-server-files.js +3 -3
  154. package/web/.next/required-server-files.json +3 -3
  155. package/web/.next/routes-manifest.json +6 -0
  156. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  157. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  160. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  161. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  162. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  163. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  164. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  166. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  167. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  169. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  170. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  172. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  173. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  174. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  175. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  176. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  177. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  178. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  179. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  180. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  181. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  182. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  184. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  185. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  186. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  187. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  188. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  189. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  190. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  191. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  192. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  193. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  194. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  195. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  196. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  197. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/_global-error.html +1 -1
  199. package/web/.next/server/app/_global-error.rsc +1 -1
  200. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  201. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  202. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  203. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  204. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  205. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  206. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  207. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  208. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  209. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  210. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  211. package/web/.next/server/app/api/graph-data/route.js +1 -1
  212. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  213. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js +1 -1
  214. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  215. package/web/.next/server/app/api/sessions-batch/route.js +1 -1
  216. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  217. package/web/.next/server/app/plugins/page/app-paths-manifest.json +3 -0
  218. package/web/.next/server/app/plugins/page/build-manifest.json +18 -0
  219. package/web/.next/server/app/plugins/page/next-font-manifest.json +10 -0
  220. package/web/.next/server/app/plugins/page/react-loadable-manifest.json +8 -0
  221. package/web/.next/server/app/plugins/page/server-reference-manifest.json +185 -0
  222. package/web/.next/server/app/plugins/page.js +17 -0
  223. package/web/.next/server/app/plugins/page.js.map +5 -0
  224. package/web/.next/server/app/plugins/page.js.nft.json +1 -0
  225. package/web/.next/server/app/plugins/page_client-reference-manifest.js +3 -0
  226. package/web/.next/server/app/settings/page/server-reference-manifest.json +34 -22
  227. package/web/.next/server/app/settings/page.js +1 -1
  228. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  229. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  230. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  231. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  232. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  233. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  234. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  235. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  237. package/web/.next/server/app/version/page.js.nft.json +1 -1
  238. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  239. package/web/.next/server/app-paths-manifest.json +1 -0
  240. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js +1 -1
  241. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
  242. package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js → [root-of-the-server]__07suer1._.js} +2 -2
  243. package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js → [root-of-the-server]__0sgzo7y._.js} +2 -2
  244. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  245. package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js → [root-of-the-server]__0uxlr84._.js} +2 -2
  246. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  247. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  248. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  249. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  251. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  252. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js +4 -0
  253. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js.map +1 -0
  254. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  255. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/{_04s_q5r._.js → 12k._sonner_dist_index_mjs_0-vmpk5._.js} +2 -2
  257. package/web/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js.map +1 -0
  258. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0rvrr1j._.js → [root-of-the-server]__0.5ojmt._.js} +2 -2
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -0
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js +3 -0
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js.map +1 -0
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js +3 -0
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  272. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  273. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  276. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  277. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  278. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  279. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  280. package/web/.next/server/chunks/ssr/{_00u~.41._.js → _03x4h9e._.js} +2 -2
  281. package/web/.next/server/chunks/ssr/_03x4h9e._.js.map +1 -0
  282. package/web/.next/server/chunks/ssr/{_0~0jkp_._.js → _05fk0a4._.js} +2 -2
  283. package/web/.next/server/chunks/ssr/_05fk0a4._.js.map +1 -0
  284. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  285. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  286. package/web/.next/server/chunks/ssr/_083k45~._.js +3 -0
  287. package/web/.next/server/chunks/ssr/_083k45~._.js.map +1 -0
  288. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  289. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  290. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  291. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  293. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  294. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  295. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  296. package/web/.next/server/chunks/ssr/_0i~-084._.js +3 -0
  297. package/web/.next/server/chunks/ssr/_0i~-084._.js.map +1 -0
  298. package/web/.next/server/chunks/ssr/{_0wor25i._.js → _0job75~._.js} +2 -2
  299. package/web/.next/server/chunks/ssr/{_0wor25i._.js.map → _0job75~._.js.map} +1 -1
  300. package/web/.next/server/chunks/ssr/_0jtr2u0._.js +3 -0
  301. package/web/.next/server/chunks/ssr/_0jtr2u0._.js.map +1 -0
  302. package/web/.next/server/chunks/ssr/_0kaec~c._.js +3 -0
  303. package/web/.next/server/chunks/ssr/_0kaec~c._.js.map +1 -0
  304. package/web/.next/server/chunks/ssr/_0o.xc6x._.js +3 -0
  305. package/web/.next/server/chunks/ssr/_0o.xc6x._.js.map +1 -0
  306. package/web/.next/server/chunks/ssr/{_0hw~zvl._.js → _0o_oaao._.js} +2 -2
  307. package/web/.next/server/chunks/ssr/_0o_oaao._.js.map +1 -0
  308. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  309. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  311. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/_0rcx2-c._.js +9 -0
  313. package/web/.next/server/chunks/ssr/_0rcx2-c._.js.map +1 -0
  314. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  315. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  316. package/web/.next/server/chunks/ssr/_0tcccbb._.js +1 -1
  317. package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -1
  318. package/web/.next/server/chunks/ssr/{_0pa1dkv._.js → _0u3d8.n._.js} +2 -2
  319. package/web/.next/server/chunks/ssr/_0u3d8.n._.js.map +1 -0
  320. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  321. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  322. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  323. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  324. package/web/.next/server/chunks/ssr/{_09r54oy._.js → _0ygafoy._.js} +2 -2
  325. package/web/.next/server/chunks/ssr/{_09r54oy._.js.map → _0ygafoy._.js.map} +1 -1
  326. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  327. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  328. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  329. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  330. package/web/.next/server/chunks/ssr/{_01qdxy2._.js → _0~b~4sr._.js} +2 -2
  331. package/web/.next/server/chunks/ssr/{_01qdxy2._.js.map → _0~b~4sr._.js.map} +1 -1
  332. package/web/.next/server/chunks/ssr/_10joy2y._.js +3 -0
  333. package/web/.next/server/chunks/ssr/_10joy2y._.js.map +1 -0
  334. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  335. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  336. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +3 -0
  337. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -0
  338. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  339. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  340. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  341. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  342. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  343. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  344. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  345. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  346. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js +1 -1
  347. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js.map +1 -1
  348. package/web/.next/server/middleware-build-manifest.js +3 -3
  349. package/web/.next/server/next-font-manifest.js +1 -1
  350. package/web/.next/server/next-font-manifest.json +3 -0
  351. package/web/.next/server/pages/500.html +1 -1
  352. package/web/.next/server/server-reference-manifest.js +1 -1
  353. package/web/.next/server/server-reference-manifest.json +187 -61
  354. package/web/.next/static/chunks/0.s8cxri-_s9l.js +1 -0
  355. package/web/.next/static/chunks/012cnd7koqv6d.js +7 -0
  356. package/web/.next/static/chunks/{0dq50gtgaj63f.js → 029s48ykt7mw9.js} +1 -1
  357. package/web/.next/static/chunks/{11vbir.u7_zf7.js → 03agfpdm4n_fn.js} +1 -1
  358. package/web/.next/static/chunks/05qti39qqsvzs.js +1 -0
  359. package/web/.next/static/chunks/{0fg~vc93spa9c.js → 07gal-~-zwagj.js} +1 -1
  360. package/web/.next/static/chunks/{0u_27fdqa2jeg.js → 0abfw8oib7e3t.js} +1 -1
  361. package/web/.next/static/chunks/{0in4l8mne5y~_.js → 0b2pi58fg3lt3.js} +1 -1
  362. package/web/.next/static/chunks/{121v1_d_dfk2k.js → 0boet02f0igne.js} +1 -1
  363. package/web/.next/static/chunks/0f80ru2bzs3v5.js +1 -0
  364. package/web/.next/static/chunks/{12axopx66pocj.js → 0ibyqd4oceukb.js} +2 -2
  365. package/web/.next/static/chunks/{0v~n9z6b639zm.js → 0jwq.mr-.ltps.js} +1 -1
  366. package/web/.next/static/chunks/0k8m.qcahm63g.js +1 -0
  367. package/web/.next/static/chunks/0kqqf5i.f1-nm.js +1 -0
  368. package/web/.next/static/chunks/0lc0x8kcu46ae.js +1 -0
  369. package/web/.next/static/chunks/{183ehj-b80a~o.js → 0nfd9bvcnbcgl.js} +1 -1
  370. package/web/.next/static/chunks/{1874_wt9rit96.js → 0o5siyl.hsy96.js} +1 -1
  371. package/web/.next/static/chunks/0s0432bko4hq9.js +1 -0
  372. package/web/.next/static/chunks/{0o33urrd3lk~u.js → 0skduwu0tu8qh.js} +1 -1
  373. package/web/.next/static/chunks/0ug478hm-8bog.js +5 -0
  374. package/web/.next/static/chunks/{0yibymrb2j05t.css → 0v7r7y~3e~oo6.css} +1 -1
  375. package/web/.next/static/chunks/{00m_fbc2z1gyi.js → 0~5~-wr7rq8b6.js} +3 -3
  376. package/web/.next/static/chunks/{09f2lesd_dd3~.js → 10gfhk-66cbtu.js} +1 -1
  377. package/web/.next/static/chunks/{0k0j7anrbg-of.js → 10lvozwidvzfo.js} +3 -3
  378. package/web/.next/static/chunks/10rtagfoabp3b.js +1 -0
  379. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js +0 -3
  380. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js.map +0 -1
  381. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +0 -1
  382. package/web/.next/server/chunks/ssr/_00u~.41._.js.map +0 -1
  383. package/web/.next/server/chunks/ssr/_04s_q5r._.js.map +0 -1
  384. package/web/.next/server/chunks/ssr/_0a_8rlj._.js +0 -3
  385. package/web/.next/server/chunks/ssr/_0a_8rlj._.js.map +0 -1
  386. package/web/.next/server/chunks/ssr/_0dy8.0k._.js +0 -3
  387. package/web/.next/server/chunks/ssr/_0dy8.0k._.js.map +0 -1
  388. package/web/.next/server/chunks/ssr/_0gdghcr._.js +0 -3
  389. package/web/.next/server/chunks/ssr/_0gdghcr._.js.map +0 -1
  390. package/web/.next/server/chunks/ssr/_0hw~zvl._.js.map +0 -1
  391. package/web/.next/server/chunks/ssr/_0l2~~pi._.js +0 -3
  392. package/web/.next/server/chunks/ssr/_0l2~~pi._.js.map +0 -1
  393. package/web/.next/server/chunks/ssr/_0n.magx._.js +0 -3
  394. package/web/.next/server/chunks/ssr/_0n.magx._.js.map +0 -1
  395. package/web/.next/server/chunks/ssr/_0pa1dkv._.js.map +0 -1
  396. package/web/.next/server/chunks/ssr/_0y8u4.e._.js +0 -9
  397. package/web/.next/server/chunks/ssr/_0y8u4.e._.js.map +0 -1
  398. package/web/.next/server/chunks/ssr/_0~0jkp_._.js.map +0 -1
  399. package/web/.next/static/chunks/0-ud~1jj7chzu.js +0 -7
  400. package/web/.next/static/chunks/0c0dau5pmseko.js +0 -1
  401. package/web/.next/static/chunks/0n3kuj7t_-jzp.js +0 -1
  402. package/web/.next/static/chunks/0pt-d18f7zxvv.js +0 -1
  403. package/web/.next/static/chunks/0xwh.0u-dexsl.js +0 -1
  404. package/web/.next/static/chunks/103xnw203o9k1.js +0 -1
  405. package/web/.next/static/chunks/12pd180jp8zu..js +0 -5
  406. package/web/.next/static/chunks/13fcwhkw7dle2.js +0 -1
  407. package/web/.next/static/chunks/13q1peb_t9vj8.js +0 -1
  408. /package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js.map → [root-of-the-server]__07suer1._.js.map} +0 -0
  409. /package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js.map → [root-of-the-server]__0sgzo7y._.js.map} +0 -0
  410. /package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js.map → [root-of-the-server]__0uxlr84._.js.map} +0 -0
  411. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → GeXKcODhEHBnDRVLMaAnW}/_buildManifest.js +0 -0
  412. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → GeXKcODhEHBnDRVLMaAnW}/_clientMiddlewareManifest.js +0 -0
  413. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → GeXKcODhEHBnDRVLMaAnW}/_ssgManifest.js +0 -0
@@ -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
@@ -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;AAiB1B,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,CA8S/D"}
@@ -16,6 +16,7 @@ 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';
19
20
  import { AgentRunStatus, SdlcLifecycle } from '../../../../domain/generated/output.js';
20
21
  import { initializeSettings } from '../../../services/settings.service.js';
21
22
  import { InitializeSettingsUseCase } from '../../../../application/use-cases/settings/initialize-settings.use-case.js';
@@ -183,6 +184,10 @@ export async function runWorker(args) {
183
184
  log(`Creating executor from pinned agent type: ${args.agentType}`);
184
185
  const factory = container.resolve('IAgentExecutorFactory');
185
186
  executor = factory.createExecutor(args.agentType, settings.agent);
187
+ // Update proxy config for direct factory calls (provider does this automatically)
188
+ if (executor instanceof ClaudeCodeExecutorService) {
189
+ executor.updateProxyConfig(settings.litellmProxy);
190
+ }
186
191
  }
187
192
  else {
188
193
  log('Creating executor from configured agent settings...');
@@ -0,0 +1,4 @@
1
+ export { PluginMarketplaceService } from './plugin-marketplace.service.js';
2
+ export { MarketplaceCatalogSchema, InstalledPluginSchema, InstalledPluginsListSchema, } from './plugin-marketplace.schema.js';
3
+ export { validatePluginId, validateMarketplaceName, validateMarketplaceUrl, validateScope, } from './plugin-marketplace.validators.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,GACd,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { PluginMarketplaceService } from './plugin-marketplace.service.js';
2
+ export { MarketplaceCatalogSchema, InstalledPluginSchema, InstalledPluginsListSchema, } from './plugin-marketplace.schema.js';
3
+ export { validatePluginId, validateMarketplaceName, validateMarketplaceUrl, validateScope, } from './plugin-marketplace.validators.js';
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Zod Schemas for Plugin Marketplace Data Validation
3
+ *
4
+ * Validates all external data boundaries:
5
+ * 1. LiteLLM proxy marketplace.json response
6
+ * 2. `claude plugin list --json` CLI output
7
+ *
8
+ * All data from external sources is untrusted. Strings are capped
9
+ * to prevent excessive memory use in UI rendering.
10
+ */
11
+ import { z } from 'zod';
12
+ declare const PluginEntrySchema: z.ZodObject<{
13
+ name: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
14
+ description: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<string, string>>;
15
+ version: z.ZodOptional<z.ZodString>;
16
+ source: z.ZodObject<{
17
+ source: z.ZodEnum<{
18
+ url: "url";
19
+ github: "github";
20
+ "git-subdir": "git-subdir";
21
+ }>;
22
+ repo: z.ZodOptional<z.ZodString>;
23
+ url: z.ZodOptional<z.ZodString>;
24
+ path: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strip>;
26
+ category: z.ZodOptional<z.ZodString>;
27
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ }, z.core.$strip>;
29
+ export declare const MarketplaceCatalogSchema: z.ZodObject<{
30
+ name: z.ZodString;
31
+ owner: z.ZodOptional<z.ZodObject<{
32
+ name: z.ZodString;
33
+ email: z.ZodString;
34
+ }, z.core.$strip>>;
35
+ plugins: z.ZodArray<z.ZodObject<{
36
+ name: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
37
+ description: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<string, string>>;
38
+ version: z.ZodOptional<z.ZodString>;
39
+ source: z.ZodObject<{
40
+ source: z.ZodEnum<{
41
+ url: "url";
42
+ github: "github";
43
+ "git-subdir": "git-subdir";
44
+ }>;
45
+ repo: z.ZodOptional<z.ZodString>;
46
+ url: z.ZodOptional<z.ZodString>;
47
+ path: z.ZodOptional<z.ZodString>;
48
+ }, z.core.$strip>;
49
+ category: z.ZodOptional<z.ZodString>;
50
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ }, z.core.$strip>>;
52
+ }, z.core.$strip>;
53
+ export declare const InstalledPluginSchema: z.ZodObject<{
54
+ id: z.ZodString;
55
+ scope: z.ZodEnum<{
56
+ user: "user";
57
+ project: "project";
58
+ local: "local";
59
+ }>;
60
+ version: z.ZodOptional<z.ZodString>;
61
+ enabled: z.ZodBoolean;
62
+ installedAt: z.ZodOptional<z.ZodString>;
63
+ }, z.core.$strip>;
64
+ export declare const InstalledPluginsListSchema: z.ZodArray<z.ZodObject<{
65
+ id: z.ZodString;
66
+ scope: z.ZodEnum<{
67
+ user: "user";
68
+ project: "project";
69
+ local: "local";
70
+ }>;
71
+ version: z.ZodOptional<z.ZodString>;
72
+ enabled: z.ZodBoolean;
73
+ installedAt: z.ZodOptional<z.ZodString>;
74
+ }, z.core.$strip>>;
75
+ export type MarketplaceCatalog = z.infer<typeof MarketplaceCatalogSchema>;
76
+ export type ValidatedPluginEntry = z.infer<typeof PluginEntrySchema>;
77
+ export {};
78
+ //# sourceMappingURL=plugin-marketplace.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-marketplace.schema.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;iBASnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;kBAAiC,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Zod Schemas for Plugin Marketplace Data Validation
3
+ *
4
+ * Validates all external data boundaries:
5
+ * 1. LiteLLM proxy marketplace.json response
6
+ * 2. `claude plugin list --json` CLI output
7
+ *
8
+ * All data from external sources is untrusted. Strings are capped
9
+ * to prevent excessive memory use in UI rendering.
10
+ */
11
+ import { z } from 'zod';
12
+ const PluginSourceSchema = z.object({
13
+ source: z.enum(['github', 'url', 'git-subdir']),
14
+ repo: z.string().optional(),
15
+ url: z.string().optional(),
16
+ path: z.string().optional(),
17
+ });
18
+ const PluginEntrySchema = z.object({
19
+ name: z.string().transform((s) => s.slice(0, 100)),
20
+ description: z
21
+ .string()
22
+ .default('')
23
+ .transform((s) => s.slice(0, 2000)),
24
+ version: z.string().optional(),
25
+ source: PluginSourceSchema,
26
+ category: z.string().optional(),
27
+ keywords: z.array(z.string()).optional(),
28
+ });
29
+ export const MarketplaceCatalogSchema = z.object({
30
+ name: z.string(),
31
+ owner: z
32
+ .object({
33
+ name: z.string(),
34
+ email: z.string(),
35
+ })
36
+ .optional(),
37
+ plugins: z.array(PluginEntrySchema),
38
+ });
39
+ export const InstalledPluginSchema = z.object({
40
+ id: z.string(),
41
+ scope: z.enum(['user', 'project', 'local']),
42
+ version: z.string().optional(),
43
+ enabled: z.boolean(),
44
+ installedAt: z.string().optional(),
45
+ });
46
+ export const InstalledPluginsListSchema = z.array(InstalledPluginSchema);
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Plugin Marketplace Service
3
+ *
4
+ * Implements IPluginMarketplaceService using:
5
+ * - Node 22+ native fetch for HTTP catalog retrieval from LiteLLM proxy
6
+ * - execFile-style subprocess calls to the `claude` CLI for plugin lifecycle
7
+ *
8
+ * This is the first HTTP client in the infrastructure layer.
9
+ * Pattern: AbortController timeout, redirect rejection, size limit, Zod validation.
10
+ *
11
+ * All subprocess arguments are validated via allowlist validators before passing
12
+ * to execFile. Arguments are always separate array elements (never concatenated).
13
+ */
14
+ import type { IPluginMarketplaceService, PluginMarketplaceEntry, InstalledPlugin, PluginOperationResult } from '../../../application/ports/output/services/plugin-marketplace.interface.js';
15
+ type SpawnCallback = (error: Error | null, stdout: string, stderr: string) => void;
16
+ type SpawnFunction = (cmd: string, args: string[], callback: SpawnCallback) => void;
17
+ export declare class PluginMarketplaceService implements IPluginMarketplaceService {
18
+ private readonly spawn;
19
+ constructor(spawn: SpawnFunction);
20
+ fetchCatalog(proxyBaseUrl: string, apiKey?: string): Promise<PluginMarketplaceEntry[]>;
21
+ listInstalled(): Promise<InstalledPlugin[]>;
22
+ installPlugin(pluginId: string, marketplace: string, scope?: string): Promise<PluginOperationResult>;
23
+ uninstallPlugin(pluginId: string, marketplace: string): Promise<PluginOperationResult>;
24
+ togglePlugin(pluginId: string, marketplace: string, enabled: boolean): Promise<PluginOperationResult>;
25
+ addMarketplace(url: string): Promise<PluginOperationResult>;
26
+ private execClaude;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=plugin-marketplace.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-marketplace.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACtB,MAAM,4EAA4E,CAAC;AAYpF,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AACnF,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAMpF,qBAAa,wBAAyB,YAAW,yBAAyB;IACxE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAE1B,KAAK,EAAE,aAAa;IAI1B,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAgDtF,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAsB3C,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;IAY3B,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAWtF,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC;IAY3B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAUjE,OAAO,CAAC,UAAU;CAanB"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Plugin Marketplace Service
3
+ *
4
+ * Implements IPluginMarketplaceService using:
5
+ * - Node 22+ native fetch for HTTP catalog retrieval from LiteLLM proxy
6
+ * - execFile-style subprocess calls to the `claude` CLI for plugin lifecycle
7
+ *
8
+ * This is the first HTTP client in the infrastructure layer.
9
+ * Pattern: AbortController timeout, redirect rejection, size limit, Zod validation.
10
+ *
11
+ * All subprocess arguments are validated via allowlist validators before passing
12
+ * to execFile. Arguments are always separate array elements (never concatenated).
13
+ */
14
+ import { MarketplaceCatalogSchema, InstalledPluginsListSchema, } from './plugin-marketplace.schema.js';
15
+ import { validatePluginId, validateMarketplaceName, validateMarketplaceUrl, validateScope, } from './plugin-marketplace.validators.js';
16
+ const FETCH_TIMEOUT_MS = 10_000;
17
+ const MAX_RESPONSE_SIZE = 5_000_000;
18
+ const CLAUDE_BINARY = process.platform === 'win32' ? 'claude.cmd' : 'claude';
19
+ export class PluginMarketplaceService {
20
+ spawn;
21
+ constructor(spawn) {
22
+ this.spawn = spawn;
23
+ }
24
+ async fetchCatalog(proxyBaseUrl, apiKey) {
25
+ try {
26
+ const url = validateMarketplaceUrl(proxyBaseUrl);
27
+ if (apiKey && url.protocol === 'http:') {
28
+ return [];
29
+ }
30
+ const catalogUrl = `${url.toString().replace(/\/$/, '')}/claude-code/marketplace.json`;
31
+ const headers = {};
32
+ if (apiKey) {
33
+ headers['Authorization'] = `Bearer ${apiKey}`;
34
+ }
35
+ const controller = new AbortController();
36
+ const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
37
+ try {
38
+ const res = await fetch(catalogUrl, {
39
+ signal: controller.signal,
40
+ redirect: 'error',
41
+ headers,
42
+ });
43
+ if (!res.ok) {
44
+ return [];
45
+ }
46
+ const text = await res.text();
47
+ if (text.length > MAX_RESPONSE_SIZE) {
48
+ return [];
49
+ }
50
+ const json = JSON.parse(text);
51
+ const parsed = MarketplaceCatalogSchema.safeParse(json);
52
+ if (!parsed.success) {
53
+ return [];
54
+ }
55
+ return parsed.data.plugins;
56
+ }
57
+ finally {
58
+ clearTimeout(timeout);
59
+ }
60
+ }
61
+ catch {
62
+ return [];
63
+ }
64
+ }
65
+ async listInstalled() {
66
+ return new Promise((resolve) => {
67
+ this.spawn(CLAUDE_BINARY, ['plugin', 'list', '--json'], (error, stdout) => {
68
+ if (error) {
69
+ resolve([]);
70
+ return;
71
+ }
72
+ try {
73
+ const json = JSON.parse(stdout);
74
+ const parsed = InstalledPluginsListSchema.safeParse(json);
75
+ if (parsed.success) {
76
+ resolve(parsed.data);
77
+ }
78
+ else {
79
+ resolve([]);
80
+ }
81
+ }
82
+ catch {
83
+ resolve([]);
84
+ }
85
+ });
86
+ });
87
+ }
88
+ async installPlugin(pluginId, marketplace, scope) {
89
+ try {
90
+ const validId = validatePluginId(pluginId);
91
+ const validMp = validateMarketplaceName(marketplace);
92
+ const validScope = scope ? validateScope(scope) : 'user';
93
+ const args = ['plugin', 'install', `${validId}@${validMp}`, '--scope', validScope];
94
+ return await this.execClaude(args);
95
+ }
96
+ catch (err) {
97
+ return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
98
+ }
99
+ }
100
+ async uninstallPlugin(pluginId, marketplace) {
101
+ try {
102
+ const validId = validatePluginId(pluginId);
103
+ const validMp = validateMarketplaceName(marketplace);
104
+ const args = ['plugin', 'uninstall', `${validId}@${validMp}`];
105
+ return await this.execClaude(args);
106
+ }
107
+ catch (err) {
108
+ return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
109
+ }
110
+ }
111
+ async togglePlugin(pluginId, marketplace, enabled) {
112
+ try {
113
+ const validId = validatePluginId(pluginId);
114
+ const validMp = validateMarketplaceName(marketplace);
115
+ const action = enabled ? 'enable' : 'disable';
116
+ const args = ['plugin', action, `${validId}@${validMp}`];
117
+ return await this.execClaude(args);
118
+ }
119
+ catch (err) {
120
+ return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
121
+ }
122
+ }
123
+ async addMarketplace(url) {
124
+ try {
125
+ const validUrl = validateMarketplaceUrl(url);
126
+ const args = ['plugin', 'marketplace', 'add', validUrl.toString()];
127
+ return await this.execClaude(args);
128
+ }
129
+ catch (err) {
130
+ return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
131
+ }
132
+ }
133
+ execClaude(args) {
134
+ return new Promise((resolve) => {
135
+ this.spawn(CLAUDE_BINARY, args, (error) => {
136
+ if (error) {
137
+ // Never expose raw subprocess stderr/error to the client.
138
+ // Generic message only — details are logged server-side.
139
+ resolve({ success: false, error: 'Plugin operation failed' });
140
+ }
141
+ else {
142
+ resolve({ success: true });
143
+ }
144
+ });
145
+ });
146
+ }
147
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Input Validators for Plugin Marketplace Operations
3
+ *
4
+ * Strict allowlist-based validation for all values that become subprocess
5
+ * arguments or HTTP request parameters. Defense-in-depth against injection.
6
+ */
7
+ export declare function validatePluginId(name: string): string;
8
+ export declare function validateMarketplaceUrl(urlString: string): URL;
9
+ export declare function validateMarketplaceName(name: string): string;
10
+ export declare function validateScope(scope: string): 'user' | 'project' | 'local';
11
+ //# sourceMappingURL=plugin-marketplace.validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-marketplace.validators.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAkB7D;AAKD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAKzE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Input Validators for Plugin Marketplace Operations
3
+ *
4
+ * Strict allowlist-based validation for all values that become subprocess
5
+ * arguments or HTTP request parameters. Defense-in-depth against injection.
6
+ */
7
+ const PLUGIN_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;
8
+ const MAX_PLUGIN_NAME_LENGTH = 100;
9
+ const VALID_SCOPES = ['user', 'project', 'local'];
10
+ const LOCALHOST_HOSTNAMES = new Set(['localhost', '127.0.0.1', '[::1]']);
11
+ export function validatePluginId(name) {
12
+ if (!name || name.length > MAX_PLUGIN_NAME_LENGTH || !PLUGIN_NAME_REGEX.test(name)) {
13
+ throw new Error(`Invalid plugin ID: must be 1-${MAX_PLUGIN_NAME_LENGTH} characters matching [a-zA-Z0-9_-]`);
14
+ }
15
+ return name;
16
+ }
17
+ export function validateMarketplaceUrl(urlString) {
18
+ let url;
19
+ try {
20
+ url = new URL(urlString);
21
+ }
22
+ catch {
23
+ throw new Error(`Invalid marketplace URL: ${urlString}`);
24
+ }
25
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
26
+ throw new Error(`Invalid URL scheme: ${url.protocol} (only http: and https: allowed)`);
27
+ }
28
+ const isLocalhost = LOCALHOST_HOSTNAMES.has(url.hostname);
29
+ if (url.protocol === 'http:' && !isLocalhost) {
30
+ throw new Error('HTTP is only allowed for localhost URLs. Use HTTPS for remote hosts.');
31
+ }
32
+ return url;
33
+ }
34
+ const MARKETPLACE_NAME_REGEX = /^[a-zA-Z0-9_\-.:/@]+$/;
35
+ const MAX_MARKETPLACE_NAME_LENGTH = 200;
36
+ export function validateMarketplaceName(name) {
37
+ if (!name || name.length > MAX_MARKETPLACE_NAME_LENGTH || !MARKETPLACE_NAME_REGEX.test(name)) {
38
+ throw new Error(`Invalid marketplace name: must be 1-${MAX_MARKETPLACE_NAME_LENGTH} characters matching [a-zA-Z0-9_-./:@]`);
39
+ }
40
+ return name;
41
+ }
42
+ export function validateScope(scope) {
43
+ if (!VALID_SCOPES.includes(scope)) {
44
+ throw new Error(`Invalid scope: ${scope} (must be one of: ${VALID_SCOPES.join(', ')})`);
45
+ }
46
+ return scope;
47
+ }
@@ -0,0 +1,5 @@
1
+ export declare function addMarketplaceAction(url: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=add-marketplace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-marketplace.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/add-marketplace.ts"],"names":[],"mappings":"AAKA,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
@@ -0,0 +1,11 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function addMarketplaceAction(url) {
4
+ try {
5
+ const useCase = resolve('AddMarketplaceUseCase');
6
+ return await useCase.execute({ url });
7
+ }
8
+ catch {
9
+ return { success: false, error: 'Failed to add marketplace' };
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ import type { FetchPluginCatalogResult } from '../../../../../packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.js';
2
+ export declare function fetchPluginCatalogAction(): Promise<FetchPluginCatalogResult & {
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=fetch-plugin-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-plugin-catalog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/fetch-plugin-catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6EAA6E,CAAC;AAE5H,wBAAsB,wBAAwB,IAAI,OAAO,CACvD,wBAAwB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAC9C,CAOA"}
@@ -0,0 +1,11 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function fetchPluginCatalogAction() {
4
+ try {
5
+ const useCase = resolve('FetchPluginCatalogUseCase');
6
+ return await useCase.execute();
7
+ }
8
+ catch {
9
+ return { plugins: [], installedPlugins: [], error: 'Failed to fetch plugin catalog' };
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ export declare function installPluginAction(pluginId: string, marketplace: string, scope?: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=install-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/install-plugin.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
@@ -0,0 +1,11 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function installPluginAction(pluginId, marketplace, scope) {
4
+ try {
5
+ const useCase = resolve('InstallPluginUseCase');
6
+ return await useCase.execute({ pluginId, marketplace, scope });
7
+ }
8
+ catch {
9
+ return { success: false, error: 'Failed to install plugin' };
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ export declare function togglePluginAction(pluginId: string, marketplace: string, enabled: boolean): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=toggle-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/toggle-plugin.ts"],"names":[],"mappings":"AAKA,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
@@ -0,0 +1,11 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function togglePluginAction(pluginId, marketplace, enabled) {
4
+ try {
5
+ const useCase = resolve('TogglePluginUseCase');
6
+ return await useCase.execute({ pluginId, marketplace, enabled });
7
+ }
8
+ catch {
9
+ return { success: false, error: 'Failed to toggle plugin' };
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ export declare function uninstallPluginAction(pluginId: string, marketplace: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=uninstall-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/uninstall-plugin.ts"],"names":[],"mappings":"AAKA,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
@@ -0,0 +1,11 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function uninstallPluginAction(pluginId, marketplace) {
4
+ try {
5
+ const useCase = resolve('UninstallPluginUseCase');
6
+ return await useCase.execute({ pluginId, marketplace });
7
+ }
8
+ catch {
9
+ return { success: false, error: 'Failed to uninstall plugin' };
10
+ }
11
+ }
@@ -0,0 +1,2 @@
1
+ export default function PluginsPage(): Promise<import("react/jsx-runtime").JSX.Element>;
2
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/plugins/page.tsx"],"names":[],"mappings":"AAOA,wBAA8B,WAAW,qDAkBxC"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { notFound } from 'next/navigation';
3
+ import { getFeatureFlags } from '../../lib/feature-flags.js';
4
+ import { PluginsPageClient } from '../../components/features/plugins/plugins-page-client.js';
5
+ import { resolve } from '../../lib/server-container.js';
6
+ import { AgentType } from '../../../../../packages/core/src/domain/generated/output.js';
7
+ export default async function PluginsPage() {
8
+ const flags = await getFeatureFlags();
9
+ if (!flags.plugins)
10
+ notFound();
11
+ let proxyConfigured = false;
12
+ let isClaudeCode = false;
13
+ try {
14
+ const useCase = resolve('LoadSettingsUseCase');
15
+ const settings = await useCase.execute();
16
+ proxyConfigured = !!(settings.litellmProxy?.baseUrl && settings.litellmProxy?.marketplaceEnabled);
17
+ isClaudeCode = settings.agent?.type === AgentType.ClaudeCode;
18
+ }
19
+ catch {
20
+ // Settings not available
21
+ }
22
+ return _jsx(PluginsPageClient, { proxyConfigured: proxyConfigured, isClaudeCode: isClaudeCode });
23
+ }