@shipit-ai/cli 1.169.0 → 1.170.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +5 -0
  2. package/apis/json-schema/LiteLLMProxyConfig.yaml +14 -0
  3. package/apis/json-schema/Settings.yaml +3 -0
  4. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  5. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts +46 -0
  7. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.js +12 -0
  9. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts +16 -0
  10. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.js +34 -0
  12. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts +24 -0
  13. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.js +52 -0
  15. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts +17 -0
  16. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.js +33 -0
  18. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts +17 -0
  19. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts.map +1 -0
  20. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.js +33 -0
  21. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts +16 -0
  22. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts.map +1 -0
  23. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.js +33 -0
  24. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  25. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  26. package/dist/packages/core/src/domain/generated/output.d.ts +25 -0
  27. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/di/modules/services.module.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/di/modules/services.module.js +13 -0
  30. package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.js +12 -0
  32. package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.js +22 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +4 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +18 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts +14 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts.map +1 -0
  39. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.js +28 -0
  40. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts +4 -0
  41. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts.map +1 -0
  42. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.js +3 -0
  43. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts +78 -0
  44. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts.map +1 -0
  45. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.js +46 -0
  46. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts +29 -0
  47. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts.map +1 -0
  48. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.js +147 -0
  49. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts +11 -0
  50. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts.map +1 -0
  51. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.js +47 -0
  52. package/dist/src/presentation/web/app/actions/add-marketplace.d.ts +5 -0
  53. package/dist/src/presentation/web/app/actions/add-marketplace.d.ts.map +1 -0
  54. package/dist/src/presentation/web/app/actions/add-marketplace.js +11 -0
  55. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts +5 -0
  56. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts.map +1 -0
  57. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.js +11 -0
  58. package/dist/src/presentation/web/app/actions/install-plugin.d.ts +5 -0
  59. package/dist/src/presentation/web/app/actions/install-plugin.d.ts.map +1 -0
  60. package/dist/src/presentation/web/app/actions/install-plugin.js +11 -0
  61. package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts +5 -0
  62. package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts.map +1 -0
  63. package/dist/src/presentation/web/app/actions/toggle-plugin.js +11 -0
  64. package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts +5 -0
  65. package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts.map +1 -0
  66. package/dist/src/presentation/web/app/actions/uninstall-plugin.js +11 -0
  67. package/dist/src/presentation/web/app/plugins/page.d.ts +2 -0
  68. package/dist/src/presentation/web/app/plugins/page.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/plugins/page.js +23 -0
  70. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +1 -0
  72. package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts +9 -0
  73. package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts.map +1 -0
  74. package/dist/src/presentation/web/components/features/plugins/plugin-card.js +15 -0
  75. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts +17 -0
  76. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts.map +1 -0
  77. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.js +60 -0
  78. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts +11 -0
  79. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts.map +1 -0
  80. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.js +33 -0
  81. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts +18 -0
  82. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts.map +1 -0
  83. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.js +51 -0
  84. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts +6 -0
  85. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts.map +1 -0
  86. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.js +115 -0
  87. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts +12 -0
  88. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts.map +1 -0
  89. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.js +24 -0
  90. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  91. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +5 -0
  92. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +2 -0
  94. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts +6 -0
  95. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts.map +1 -0
  96. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.js +76 -0
  97. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts +15 -0
  98. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts.map +1 -0
  99. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.js +29 -0
  100. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  101. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +4 -2
  102. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  103. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  104. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  106. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  108. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  109. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  110. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  111. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  112. package/dist/src/presentation/web/lib/feature-flags.js +6 -0
  113. package/dist/translations/ar/web.json +39 -2
  114. package/dist/translations/de/web.json +39 -2
  115. package/dist/translations/en/web.json +39 -2
  116. package/dist/translations/es/web.json +39 -2
  117. package/dist/translations/fr/web.json +39 -2
  118. package/dist/translations/he/web.json +39 -2
  119. package/dist/translations/pt/web.json +39 -2
  120. package/dist/translations/ru/web.json +39 -2
  121. package/dist/tsconfig.build.tsbuildinfo +1 -1
  122. package/package.json +1 -1
  123. package/web/.next/BUILD_ID +1 -1
  124. package/web/.next/app-path-routes-manifest.json +1 -0
  125. package/web/.next/build-manifest.json +3 -3
  126. package/web/.next/fallback-build-manifest.json +3 -3
  127. package/web/.next/prerender-manifest.json +3 -3
  128. package/web/.next/required-server-files.js +2 -2
  129. package/web/.next/required-server-files.json +2 -2
  130. package/web/.next/routes-manifest.json +6 -0
  131. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  132. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  133. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  135. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  136. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  138. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  141. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  142. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  143. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  144. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  145. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  147. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  148. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  150. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  153. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  154. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  156. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  157. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  159. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  160. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  161. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  162. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  163. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  164. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  165. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  166. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  168. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  169. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  170. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  171. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  172. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  173. package/web/.next/server/app/_global-error.html +1 -1
  174. package/web/.next/server/app/_global-error.rsc +1 -1
  175. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  176. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  177. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  178. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  179. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  180. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  181. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  182. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  184. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  185. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  186. package/web/.next/server/app/api/graph-data/route.js +1 -1
  187. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  188. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js +1 -1
  189. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  190. package/web/.next/server/app/api/sessions-batch/route.js +1 -1
  191. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  192. package/web/.next/server/app/plugins/page/app-paths-manifest.json +3 -0
  193. package/web/.next/server/app/plugins/page/build-manifest.json +18 -0
  194. package/web/.next/server/app/plugins/page/next-font-manifest.json +10 -0
  195. package/web/.next/server/app/plugins/page/react-loadable-manifest.json +8 -0
  196. package/web/.next/server/app/plugins/page/server-reference-manifest.json +185 -0
  197. package/web/.next/server/app/plugins/page.js +17 -0
  198. package/web/.next/server/app/plugins/page.js.map +5 -0
  199. package/web/.next/server/app/plugins/page.js.nft.json +1 -0
  200. package/web/.next/server/app/plugins/page_client-reference-manifest.js +3 -0
  201. package/web/.next/server/app/settings/page/server-reference-manifest.json +34 -22
  202. package/web/.next/server/app/settings/page.js +1 -1
  203. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  204. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  205. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  206. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  207. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  208. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  209. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  210. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  211. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  212. package/web/.next/server/app/version/page.js.nft.json +1 -1
  213. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  214. package/web/.next/server/app-paths-manifest.json +1 -0
  215. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
  216. package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js → [root-of-the-server]__07suer1._.js} +2 -2
  217. package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js → [root-of-the-server]__0sgzo7y._.js} +2 -2
  218. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  219. package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js → [root-of-the-server]__0uxlr84._.js} +2 -2
  220. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  221. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  223. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  225. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js +4 -0
  227. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js.map +1 -0
  228. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  229. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/{_04s_q5r._.js → 12k._sonner_dist_index_mjs_0-vmpk5._.js} +2 -2
  231. package/web/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0rvrr1j._.js → [root-of-the-server]__0.5ojmt._.js} +2 -2
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -0
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js +3 -0
  235. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js.map +1 -0
  236. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  237. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  239. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  241. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  243. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  246. package/web/.next/server/chunks/ssr/[root-of-the-server]__0~v1~b9._.js +3 -0
  247. package/web/.next/server/chunks/ssr/[root-of-the-server]__0~v1~b9._.js.map +1 -0
  248. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  251. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  252. package/web/.next/server/chunks/ssr/{_01qdxy2._.js → _0.ra89t._.js} +2 -2
  253. package/web/.next/server/chunks/ssr/{_01qdxy2._.js.map → _0.ra89t._.js.map} +1 -1
  254. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  255. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/{_00u~.41._.js → _03x4h9e._.js} +2 -2
  257. package/web/.next/server/chunks/ssr/_03x4h9e._.js.map +1 -0
  258. package/web/.next/server/chunks/ssr/{_0~0jkp_._.js → _05fk0a4._.js} +2 -2
  259. package/web/.next/server/chunks/ssr/_05fk0a4._.js.map +1 -0
  260. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  261. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  262. package/web/.next/server/chunks/ssr/{_0wor25i._.js → _069ybyi._.js} +2 -2
  263. package/web/.next/server/chunks/ssr/{_0wor25i._.js.map → _069ybyi._.js.map} +1 -1
  264. package/web/.next/server/chunks/ssr/_083k45~._.js +3 -0
  265. package/web/.next/server/chunks/ssr/_083k45~._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/_0_17.-n._.js +3 -0
  267. package/web/.next/server/chunks/ssr/_0_17.-n._.js.map +1 -0
  268. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  269. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  271. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  272. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  273. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  275. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  276. package/web/.next/server/chunks/ssr/_0i~-084._.js +3 -0
  277. package/web/.next/server/chunks/ssr/_0i~-084._.js.map +1 -0
  278. package/web/.next/server/chunks/ssr/_0kt18~b._.js +3 -0
  279. package/web/.next/server/chunks/ssr/_0kt18~b._.js.map +1 -0
  280. package/web/.next/server/chunks/ssr/{_0hw~zvl._.js → _0o_oaao._.js} +2 -2
  281. package/web/.next/server/chunks/ssr/_0o_oaao._.js.map +1 -0
  282. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  283. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  284. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  285. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  286. package/web/.next/server/chunks/ssr/_0rcx2-c._.js +9 -0
  287. package/web/.next/server/chunks/ssr/_0rcx2-c._.js.map +1 -0
  288. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  289. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  290. package/web/.next/server/chunks/ssr/_0tcccbb._.js +1 -1
  291. package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/{_0pa1dkv._.js → _0u3d8.n._.js} +2 -2
  293. package/web/.next/server/chunks/ssr/_0u3d8.n._.js.map +1 -0
  294. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  295. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  296. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  297. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/{_09r54oy._.js → _0ygafoy._.js} +2 -2
  299. package/web/.next/server/chunks/ssr/{_09r54oy._.js.map → _0ygafoy._.js.map} +1 -1
  300. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  301. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  302. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  303. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/_10joy2y._.js +3 -0
  305. package/web/.next/server/chunks/ssr/_10joy2y._.js.map +1 -0
  306. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  307. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/_12uy.45._.js +3 -0
  309. package/web/.next/server/chunks/ssr/_12uy.45._.js.map +1 -0
  310. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +3 -0
  311. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -0
  312. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  315. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  316. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  317. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  318. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  319. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  320. package/web/.next/server/middleware-build-manifest.js +3 -3
  321. package/web/.next/server/next-font-manifest.js +1 -1
  322. package/web/.next/server/next-font-manifest.json +3 -0
  323. package/web/.next/server/pages/500.html +1 -1
  324. package/web/.next/server/server-reference-manifest.js +1 -1
  325. package/web/.next/server/server-reference-manifest.json +187 -61
  326. package/web/.next/static/chunks/{0dq50gtgaj63f.js → 01zrwm.x3kpdo.js} +1 -1
  327. package/web/.next/static/chunks/{12axopx66pocj.js → 024vi1xxw5ccj.js} +1 -1
  328. package/web/.next/static/chunks/{00m_fbc2z1gyi.js → 043zp6fpfaz07.js} +3 -3
  329. package/web/.next/static/chunks/{0fg~vc93spa9c.js → 07gal-~-zwagj.js} +1 -1
  330. package/web/.next/static/chunks/{1874_wt9rit96.js → 09lcrhxslt-u8.js} +1 -1
  331. package/web/.next/static/chunks/0aq9-lg.5r.nk.js +5 -0
  332. package/web/.next/static/chunks/{0in4l8mne5y~_.js → 0b2pi58fg3lt3.js} +1 -1
  333. package/web/.next/static/chunks/0dprl~vdhvhk7.js +1 -0
  334. package/web/.next/static/chunks/{11vbir.u7_zf7.js → 0e.8n42~fpeqa.js} +1 -1
  335. package/web/.next/static/chunks/0jt5jzg88skg5.js +1 -0
  336. package/web/.next/static/chunks/{0v~n9z6b639zm.js → 0jwq.mr-.ltps.js} +1 -1
  337. package/web/.next/static/chunks/0k8m.qcahm63g.js +1 -0
  338. package/web/.next/static/chunks/0lc0x8kcu46ae.js +1 -0
  339. package/web/.next/static/chunks/{121v1_d_dfk2k.js → 0lwuepa24tqxy.js} +1 -1
  340. package/web/.next/static/chunks/0lz-oq74e_ciu.js +1 -0
  341. package/web/.next/static/chunks/0nkujbu62z1jl.js +7 -0
  342. package/web/.next/static/chunks/{0u_27fdqa2jeg.js → 0rb5cx51f5u8h.js} +1 -1
  343. package/web/.next/static/chunks/0tdbctvrma.oi.js +1 -0
  344. package/web/.next/static/chunks/{0yibymrb2j05t.css → 0v7r7y~3e~oo6.css} +1 -1
  345. package/web/.next/static/chunks/{0k0j7anrbg-of.js → 0vq.b40jzhi7r.js} +1 -1
  346. package/web/.next/static/chunks/0wd.i4f822qoa.js +1 -0
  347. package/web/.next/static/chunks/{183ehj-b80a~o.js → 0xo.hi4px83w2.js} +1 -1
  348. package/web/.next/static/chunks/{09f2lesd_dd3~.js → 0xzs6jdtkmbic.js} +1 -1
  349. package/web/.next/static/chunks/{0o33urrd3lk~u.js → 0~4c6tnw7xnnl.js} +1 -1
  350. package/web/.next/static/chunks/16jgc8hqxrp.u.js +1 -0
  351. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js +0 -3
  352. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js.map +0 -1
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +0 -1
  354. package/web/.next/server/chunks/ssr/_00u~.41._.js.map +0 -1
  355. package/web/.next/server/chunks/ssr/_04s_q5r._.js.map +0 -1
  356. package/web/.next/server/chunks/ssr/_0a_8rlj._.js +0 -3
  357. package/web/.next/server/chunks/ssr/_0a_8rlj._.js.map +0 -1
  358. package/web/.next/server/chunks/ssr/_0dy8.0k._.js +0 -3
  359. package/web/.next/server/chunks/ssr/_0dy8.0k._.js.map +0 -1
  360. package/web/.next/server/chunks/ssr/_0gdghcr._.js +0 -3
  361. package/web/.next/server/chunks/ssr/_0gdghcr._.js.map +0 -1
  362. package/web/.next/server/chunks/ssr/_0hw~zvl._.js.map +0 -1
  363. package/web/.next/server/chunks/ssr/_0l2~~pi._.js +0 -3
  364. package/web/.next/server/chunks/ssr/_0l2~~pi._.js.map +0 -1
  365. package/web/.next/server/chunks/ssr/_0n.magx._.js +0 -3
  366. package/web/.next/server/chunks/ssr/_0n.magx._.js.map +0 -1
  367. package/web/.next/server/chunks/ssr/_0pa1dkv._.js.map +0 -1
  368. package/web/.next/server/chunks/ssr/_0y8u4.e._.js +0 -9
  369. package/web/.next/server/chunks/ssr/_0y8u4.e._.js.map +0 -1
  370. package/web/.next/server/chunks/ssr/_0~0jkp_._.js.map +0 -1
  371. package/web/.next/static/chunks/0-ud~1jj7chzu.js +0 -7
  372. package/web/.next/static/chunks/0c0dau5pmseko.js +0 -1
  373. package/web/.next/static/chunks/0inayq2zzadja.js +0 -1
  374. package/web/.next/static/chunks/0n3kuj7t_-jzp.js +0 -1
  375. package/web/.next/static/chunks/0pt-d18f7zxvv.js +0 -1
  376. package/web/.next/static/chunks/0xwh.0u-dexsl.js +0 -1
  377. package/web/.next/static/chunks/103xnw203o9k1.js +0 -1
  378. package/web/.next/static/chunks/12pd180jp8zu..js +0 -5
  379. package/web/.next/static/chunks/13fcwhkw7dle2.js +0 -1
  380. /package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js.map → [root-of-the-server]__07suer1._.js.map} +0 -0
  381. /package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js.map → [root-of-the-server]__0sgzo7y._.js.map} +0 -0
  382. /package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js.map → [root-of-the-server]__0uxlr84._.js.map} +0 -0
  383. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → kDUolP-Zj2jCRleGJJGX0}/_buildManifest.js +0 -0
  384. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → kDUolP-Zj2jCRleGJJGX0}/_clientMiddlewareManifest.js +0 -0
  385. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → kDUolP-Zj2jCRleGJJGX0}/_ssgManifest.js +0 -0
@@ -19,6 +19,8 @@ import { FileSystemService } from '../../services/filesystem/filesystem.service.
19
19
  import { ToolMetadataServiceImpl } from '../../services/tool-installer/tool-metadata.service.js';
20
20
  import { EnvironmentDetectorServiceImpl } from '../../services/environment-detector.service.js';
21
21
  import { SettingsReaderService } from '../../services/settings-reader.service.js';
22
+ import { execFile } from 'node:child_process';
23
+ import { PluginMarketplaceService } from '../../services/plugin-marketplace/plugin-marketplace.service.js';
22
24
  /**
23
25
  * Register business services (singletons and factories).
24
26
  */
@@ -75,4 +77,15 @@ export function registerServicesModule(container, db) {
75
77
  container.registerSingleton('IFileSystemService', FileSystemService);
76
78
  container.registerSingleton('IToolMetadataService', ToolMetadataServiceImpl);
77
79
  container.registerSingleton('ISettingsReader', SettingsReaderService);
80
+ // PluginMarketplaceService — uses execFile for subprocess calls
81
+ container.register('IPluginMarketplaceService', {
82
+ useFactory: () => {
83
+ const spawnCb = (cmd, args, callback) => {
84
+ execFile(cmd, args, { timeout: 30_000, ...(process.platform === 'win32' ? { windowsHide: true } : {}) }, (error, stdout, stderr) => {
85
+ callback(error, stdout ?? '', stderr ?? '');
86
+ });
87
+ };
88
+ return new PluginMarketplaceService(spawnCb);
89
+ },
90
+ });
78
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-cases.module.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/di/modules/use-cases.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAqEpD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CA0E3E"}
1
+ {"version":3,"file":"use-cases.module.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/di/modules/use-cases.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA4EpD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAiF3E"}
@@ -5,6 +5,12 @@ import { UpdateSettingsUseCase } from '../../../application/use-cases/settings/u
5
5
  import { CompleteOnboardingUseCase } from '../../../application/use-cases/settings/complete-onboarding.use-case.js';
6
6
  import { CompleteWebOnboardingUseCase } from '../../../application/use-cases/settings/complete-web-onboarding.use-case.js';
7
7
  import { DetectEnvironmentDefaultsUseCase } from '../../../application/use-cases/settings/detect-environment-defaults.use-case.js';
8
+ // Plugin marketplace use cases
9
+ import { FetchPluginCatalogUseCase } from '../../../application/use-cases/plugins/fetch-plugin-catalog.use-case.js';
10
+ import { InstallPluginUseCase } from '../../../application/use-cases/plugins/install-plugin.use-case.js';
11
+ import { UninstallPluginUseCase } from '../../../application/use-cases/plugins/uninstall-plugin.use-case.js';
12
+ import { TogglePluginUseCase } from '../../../application/use-cases/plugins/toggle-plugin.use-case.js';
13
+ import { AddMarketplaceUseCase } from '../../../application/use-cases/plugins/add-marketplace.use-case.js';
8
14
  // Agent use cases
9
15
  import { ConfigureAgentUseCase } from '../../../application/use-cases/agents/configure-agent.use-case.js';
10
16
  import { ValidateAgentAuthUseCase } from '../../../application/use-cases/agents/validate-agent-auth.use-case.js';
@@ -124,6 +130,12 @@ export function registerUseCasesModule(container) {
124
130
  container.registerSingleton(SyncRepositoryMainUseCase);
125
131
  // Upgrade
126
132
  container.registerSingleton(UpgradeCliUseCase);
133
+ // Plugin marketplace
134
+ container.registerSingleton(FetchPluginCatalogUseCase);
135
+ container.registerSingleton(InstallPluginUseCase);
136
+ container.registerSingleton(UninstallPluginUseCase);
137
+ container.registerSingleton(TogglePluginUseCase);
138
+ container.registerSingleton(AddMarketplaceUseCase);
127
139
  // Conflict resolution
128
140
  container.registerSingleton(ConflictResolutionService);
129
141
  container.register('ConflictResolutionService', {
@@ -1 +1 @@
1
- {"version":3,"file":"web-tokens.module.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/di/modules/web-tokens.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAwDpD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAkH5E"}
1
+ {"version":3,"file":"web-tokens.module.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/di/modules/web-tokens.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA+DpD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAmI5E"}
@@ -38,6 +38,12 @@ import { SyncRepositoryMainUseCase } from '../../../application/use-cases/reposi
38
38
  import { LoadSettingsUseCase } from '../../../application/use-cases/settings/load-settings.use-case.js';
39
39
  import { UpdateSettingsUseCase } from '../../../application/use-cases/settings/update-settings.use-case.js';
40
40
  import { CompleteWebOnboardingUseCase } from '../../../application/use-cases/settings/complete-web-onboarding.use-case.js';
41
+ // Plugin marketplace use cases
42
+ import { FetchPluginCatalogUseCase } from '../../../application/use-cases/plugins/fetch-plugin-catalog.use-case.js';
43
+ import { InstallPluginUseCase } from '../../../application/use-cases/plugins/install-plugin.use-case.js';
44
+ import { UninstallPluginUseCase } from '../../../application/use-cases/plugins/uninstall-plugin.use-case.js';
45
+ import { TogglePluginUseCase } from '../../../application/use-cases/plugins/toggle-plugin.use-case.js';
46
+ import { AddMarketplaceUseCase } from '../../../application/use-cases/plugins/add-marketplace.use-case.js';
41
47
  // Upgrade use case
42
48
  import { UpgradeCliUseCase } from '../../../application/use-cases/upgrade/upgrade-cli.use-case.js';
43
49
  // Interactive session use cases
@@ -159,4 +165,20 @@ export function registerWebTokensModule(container) {
159
165
  container.register('GetInteractiveChatStateUseCase', {
160
166
  useFactory: (c) => c.resolve(GetInteractiveChatStateUseCase),
161
167
  });
168
+ // Plugin marketplace
169
+ container.register('FetchPluginCatalogUseCase', {
170
+ useFactory: (c) => c.resolve(FetchPluginCatalogUseCase),
171
+ });
172
+ container.register('InstallPluginUseCase', {
173
+ useFactory: (c) => c.resolve(InstallPluginUseCase),
174
+ });
175
+ container.register('UninstallPluginUseCase', {
176
+ useFactory: (c) => c.resolve(UninstallPluginUseCase),
177
+ });
178
+ container.register('TogglePluginUseCase', {
179
+ useFactory: (c) => c.resolve(TogglePluginUseCase),
180
+ });
181
+ container.register('AddMarketplaceUseCase', {
182
+ useFactory: (c) => c.resolve(AddMarketplaceUseCase),
183
+ });
162
184
  }
@@ -78,6 +78,10 @@ export interface SettingsRow {
78
78
  feature_flag_adopt_branch: number;
79
79
  feature_flag_git_rebase_sync: number;
80
80
  feature_flag_react_file_manager: number;
81
+ feature_flag_plugins: number;
82
+ litellm_proxy_base_url: string | null;
83
+ litellm_proxy_api_key: string | null;
84
+ litellm_proxy_marketplace_enabled: number;
81
85
  interactive_agent_enabled: number;
82
86
  interactive_agent_auto_timeout_minutes: number;
83
87
  interactive_agent_max_concurrent_sessions: number;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AASvE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAInB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB,EAAE,MAAM,CAAC;IAGhC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAGhC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4BAA4B,EAAE,MAAM,CAAC;IAGrC,iCAAiC,EAAE,MAAM,CAAC;IAG1C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IAGzB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGtC,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/C,mBAAmB,EAAE,MAAM,CAAC;IAG5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,MAAM,CAAC;IAClC,mCAAmC,EAAE,MAAM,CAAC;IAG5C,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,4BAA4B,EAAE,MAAM,CAAC;IACrC,+BAA+B,EAAE,MAAM,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAE7B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,iCAAiC,EAAE,MAAM,CAAC;IAE1C,yBAAyB,EAAE,MAAM,CAAC;IAClC,sCAAsC,EAAE,MAAM,CAAC;IAC/C,yCAAyC,EAAE,MAAM,CAAC;IAGlD,0BAA0B,EAAE,MAAM,CAAC;IAGnC,oBAAoB,EAAE,MAAM,CAAC;IAG7B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CA6H1D;AA0DD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,CA2HvD"}
@@ -99,6 +99,11 @@ export function toDatabase(settings) {
99
99
  feature_flag_adopt_branch: settings.featureFlags?.adoptBranch ? 1 : 0,
100
100
  feature_flag_git_rebase_sync: settings.featureFlags?.gitRebaseSync ? 1 : 0,
101
101
  feature_flag_react_file_manager: settings.featureFlags?.reactFileManager ? 1 : 0,
102
+ feature_flag_plugins: settings.featureFlags?.plugins ? 1 : 0,
103
+ // LiteLLMProxyConfig (string fields nullable, boolean → 0/1)
104
+ litellm_proxy_base_url: settings.litellmProxy?.baseUrl ?? null,
105
+ litellm_proxy_api_key: settings.litellmProxy?.apiKey ?? null,
106
+ litellm_proxy_marketplace_enabled: settings.litellmProxy?.marketplaceEnabled ? 1 : 0,
102
107
  // InteractiveAgentConfig (boolean → 0/1, integer fields; defaults applied here)
103
108
  interactive_agent_enabled: (settings.interactiveAgent?.enabled ?? true) ? 1 : 0,
104
109
  interactive_agent_auto_timeout_minutes: settings.interactiveAgent?.autoTimeoutMinutes ?? 15,
@@ -263,7 +268,20 @@ export function fromDatabase(row) {
263
268
  adoptBranch: row.feature_flag_adopt_branch === 1,
264
269
  gitRebaseSync: row.feature_flag_git_rebase_sync === 1,
265
270
  reactFileManager: row.feature_flag_react_file_manager === 1,
271
+ plugins: row.feature_flag_plugins === 1,
266
272
  },
273
+ // LiteLLMProxyConfig (TEXT → string, INTEGER 0/1 → boolean)
274
+ ...(row.litellm_proxy_base_url != null ||
275
+ row.litellm_proxy_api_key != null ||
276
+ row.litellm_proxy_marketplace_enabled
277
+ ? {
278
+ litellmProxy: {
279
+ baseUrl: row.litellm_proxy_base_url ?? undefined,
280
+ apiKey: row.litellm_proxy_api_key ?? undefined,
281
+ marketplaceEnabled: row.litellm_proxy_marketplace_enabled === 1,
282
+ },
283
+ }
284
+ : {}),
267
285
  // InteractiveAgentConfig (INTEGER 0/1 → boolean, integer → number)
268
286
  interactiveAgent: {
269
287
  enabled: (row.interactive_agent_enabled ?? 1) !== 0,
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Migration 054: Add LiteLLM proxy configuration and plugins feature flag.
3
+ *
4
+ * Columns (settings table):
5
+ * - litellm_proxy_base_url TEXT (default NULL)
6
+ * - litellm_proxy_api_key TEXT (default NULL)
7
+ * - litellm_proxy_marketplace_enabled INTEGER (default 0)
8
+ * - feature_flag_plugins INTEGER (default 0)
9
+ */
10
+ import type { MigrationParams } from 'umzug';
11
+ import type Database from 'better-sqlite3';
12
+ export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
13
+ export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
14
+ //# sourceMappingURL=054-add-litellm-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"054-add-litellm-proxy.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Migration 054: Add LiteLLM proxy configuration and plugins feature flag.
3
+ *
4
+ * Columns (settings table):
5
+ * - litellm_proxy_base_url TEXT (default NULL)
6
+ * - litellm_proxy_api_key TEXT (default NULL)
7
+ * - litellm_proxy_marketplace_enabled INTEGER (default 0)
8
+ * - feature_flag_plugins INTEGER (default 0)
9
+ */
10
+ export async function up({ context: db }) {
11
+ const columns = db.pragma('table_info(settings)');
12
+ const names = new Set(columns.map((c) => c.name));
13
+ if (!names.has('litellm_proxy_base_url')) {
14
+ db.exec('ALTER TABLE settings ADD COLUMN litellm_proxy_base_url TEXT');
15
+ }
16
+ if (!names.has('litellm_proxy_api_key')) {
17
+ db.exec('ALTER TABLE settings ADD COLUMN litellm_proxy_api_key TEXT');
18
+ }
19
+ if (!names.has('litellm_proxy_marketplace_enabled')) {
20
+ db.exec('ALTER TABLE settings ADD COLUMN litellm_proxy_marketplace_enabled INTEGER DEFAULT 0');
21
+ }
22
+ if (!names.has('feature_flag_plugins')) {
23
+ db.exec('ALTER TABLE settings ADD COLUMN feature_flag_plugins INTEGER DEFAULT 0');
24
+ }
25
+ }
26
+ export async function down({ context: db }) {
27
+ void db;
28
+ }
@@ -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"}