@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.
- package/apis/json-schema/FeatureFlags.yaml +5 -0
- package/apis/json-schema/LiteLLMProxyConfig.yaml +14 -0
- package/apis/json-schema/Settings.yaml +3 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts +46 -0
- package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.js +12 -0
- package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts +16 -0
- package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.js +34 -0
- package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts +24 -0
- package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.js +52 -0
- package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts +17 -0
- package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.js +33 -0
- package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts +17 -0
- package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.js +33 -0
- package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts +16 -0
- package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.js +33 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +25 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/modules/services.module.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/modules/services.module.js +13 -0
- package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.js +12 -0
- package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.js +22 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +4 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +18 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts +14 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.js +28 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts +4 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.js +3 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts +78 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.js +46 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts +29 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.js +147 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts +11 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.js +47 -0
- package/dist/src/presentation/web/app/actions/add-marketplace.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/add-marketplace.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/add-marketplace.js +11 -0
- package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.js +11 -0
- package/dist/src/presentation/web/app/actions/install-plugin.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/install-plugin.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/install-plugin.js +11 -0
- package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/toggle-plugin.js +11 -0
- package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/uninstall-plugin.js +11 -0
- package/dist/src/presentation/web/app/plugins/page.d.ts +2 -0
- package/dist/src/presentation/web/app/plugins/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/plugins/page.js +23 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts +9 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-card.js +15 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts +17 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.js +60 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts +11 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.js +33 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.js +51 -0
- package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts +6 -0
- package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugins-page-client.js +115 -0
- package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.js +24 -0
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +5 -0
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +2 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts +6 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.js +76 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts +15 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.js +29 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +4 -2
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
- package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.js +6 -0
- package/dist/translations/ar/web.json +39 -2
- package/dist/translations/de/web.json +39 -2
- package/dist/translations/en/web.json +39 -2
- package/dist/translations/es/web.json +39 -2
- package/dist/translations/fr/web.json +39 -2
- package/dist/translations/he/web.json +39 -2
- package/dist/translations/pt/web.json +39 -2
- package/dist/translations/ru/web.json +39 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +3 -3
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/api/sessions-batch/route.js +1 -1
- package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
- package/web/.next/server/app/plugins/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/plugins/page/build-manifest.json +18 -0
- package/web/.next/server/app/plugins/page/next-font-manifest.json +10 -0
- package/web/.next/server/app/plugins/page/react-loadable-manifest.json +8 -0
- package/web/.next/server/app/plugins/page/server-reference-manifest.json +185 -0
- package/web/.next/server/app/plugins/page.js +17 -0
- package/web/.next/server/app/plugins/page.js.map +5 -0
- package/web/.next/server/app/plugins/page.js.nft.json +1 -0
- package/web/.next/server/app/plugins/page_client-reference-manifest.js +3 -0
- package/web/.next/server/app/settings/page/server-reference-manifest.json +34 -22
- package/web/.next/server/app/settings/page.js +1 -1
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js → [root-of-the-server]__07suer1._.js} +2 -2
- package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js → [root-of-the-server]__0sgzo7y._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js → [root-of-the-server]__0uxlr84._.js} +2 -2
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
- package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
- package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js +4 -0
- package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js.map +1 -0
- package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
- package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_04s_q5r._.js → 12k._sonner_dist_index_mjs_0-vmpk5._.js} +2 -2
- package/web/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__0rvrr1j._.js → [root-of-the-server]__0.5ojmt._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0~v1~b9._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0~v1~b9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_01qdxy2._.js → _0.ra89t._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_01qdxy2._.js.map → _0.ra89t._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
- package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_00u~.41._.js → _03x4h9e._.js} +2 -2
- package/web/.next/server/chunks/ssr/_03x4h9e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_0~0jkp_._.js → _05fk0a4._.js} +2 -2
- package/web/.next/server/chunks/ssr/_05fk0a4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
- package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0wor25i._.js → _069ybyi._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0wor25i._.js.map → _069ybyi._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_083k45~._.js +3 -0
- package/web/.next/server/chunks/ssr/_083k45~._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0_17.-n._.js +3 -0
- package/web/.next/server/chunks/ssr/_0_17.-n._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
- package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
- package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
- package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0i~-084._.js +3 -0
- package/web/.next/server/chunks/ssr/_0i~-084._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0kt18~b._.js +3 -0
- package/web/.next/server/chunks/ssr/_0kt18~b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_0hw~zvl._.js → _0o_oaao._.js} +2 -2
- package/web/.next/server/chunks/ssr/_0o_oaao._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
- package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
- package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0rcx2-c._.js +9 -0
- package/web/.next/server/chunks/ssr/_0rcx2-c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
- package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0tcccbb._.js +1 -1
- package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0pa1dkv._.js → _0u3d8.n._.js} +2 -2
- package/web/.next/server/chunks/ssr/_0u3d8.n._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
- package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
- package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_09r54oy._.js → _0ygafoy._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_09r54oy._.js.map → _0ygafoy._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
- package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
- package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_10joy2y._.js +3 -0
- package/web/.next/server/chunks/ssr/_10joy2y._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
- package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_12uy.45._.js +3 -0
- package/web/.next/server/chunks/ssr/_12uy.45._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/server/next-font-manifest.json +3 -0
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +187 -61
- package/web/.next/static/chunks/{0dq50gtgaj63f.js → 01zrwm.x3kpdo.js} +1 -1
- package/web/.next/static/chunks/{12axopx66pocj.js → 024vi1xxw5ccj.js} +1 -1
- package/web/.next/static/chunks/{00m_fbc2z1gyi.js → 043zp6fpfaz07.js} +3 -3
- package/web/.next/static/chunks/{0fg~vc93spa9c.js → 07gal-~-zwagj.js} +1 -1
- package/web/.next/static/chunks/{1874_wt9rit96.js → 09lcrhxslt-u8.js} +1 -1
- package/web/.next/static/chunks/0aq9-lg.5r.nk.js +5 -0
- package/web/.next/static/chunks/{0in4l8mne5y~_.js → 0b2pi58fg3lt3.js} +1 -1
- package/web/.next/static/chunks/0dprl~vdhvhk7.js +1 -0
- package/web/.next/static/chunks/{11vbir.u7_zf7.js → 0e.8n42~fpeqa.js} +1 -1
- package/web/.next/static/chunks/0jt5jzg88skg5.js +1 -0
- package/web/.next/static/chunks/{0v~n9z6b639zm.js → 0jwq.mr-.ltps.js} +1 -1
- package/web/.next/static/chunks/0k8m.qcahm63g.js +1 -0
- package/web/.next/static/chunks/0lc0x8kcu46ae.js +1 -0
- package/web/.next/static/chunks/{121v1_d_dfk2k.js → 0lwuepa24tqxy.js} +1 -1
- package/web/.next/static/chunks/0lz-oq74e_ciu.js +1 -0
- package/web/.next/static/chunks/0nkujbu62z1jl.js +7 -0
- package/web/.next/static/chunks/{0u_27fdqa2jeg.js → 0rb5cx51f5u8h.js} +1 -1
- package/web/.next/static/chunks/0tdbctvrma.oi.js +1 -0
- package/web/.next/static/chunks/{0yibymrb2j05t.css → 0v7r7y~3e~oo6.css} +1 -1
- package/web/.next/static/chunks/{0k0j7anrbg-of.js → 0vq.b40jzhi7r.js} +1 -1
- package/web/.next/static/chunks/0wd.i4f822qoa.js +1 -0
- package/web/.next/static/chunks/{183ehj-b80a~o.js → 0xo.hi4px83w2.js} +1 -1
- package/web/.next/static/chunks/{09f2lesd_dd3~.js → 0xzs6jdtkmbic.js} +1 -1
- package/web/.next/static/chunks/{0o33urrd3lk~u.js → 0~4c6tnw7xnnl.js} +1 -1
- package/web/.next/static/chunks/16jgc8hqxrp.u.js +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_00u~.41._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_04s_q5r._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0a_8rlj._.js +0 -3
- package/web/.next/server/chunks/ssr/_0a_8rlj._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0dy8.0k._.js +0 -3
- package/web/.next/server/chunks/ssr/_0dy8.0k._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0gdghcr._.js +0 -3
- package/web/.next/server/chunks/ssr/_0gdghcr._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0hw~zvl._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0l2~~pi._.js +0 -3
- package/web/.next/server/chunks/ssr/_0l2~~pi._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0n.magx._.js +0 -3
- package/web/.next/server/chunks/ssr/_0n.magx._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0pa1dkv._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0y8u4.e._.js +0 -9
- package/web/.next/server/chunks/ssr/_0y8u4.e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0~0jkp_._.js.map +0 -1
- package/web/.next/static/chunks/0-ud~1jj7chzu.js +0 -7
- package/web/.next/static/chunks/0c0dau5pmseko.js +0 -1
- package/web/.next/static/chunks/0inayq2zzadja.js +0 -1
- package/web/.next/static/chunks/0n3kuj7t_-jzp.js +0 -1
- package/web/.next/static/chunks/0pt-d18f7zxvv.js +0 -1
- package/web/.next/static/chunks/0xwh.0u-dexsl.js +0 -1
- package/web/.next/static/chunks/103xnw203o9k1.js +0 -1
- package/web/.next/static/chunks/12pd180jp8zu..js +0 -5
- package/web/.next/static/chunks/13fcwhkw7dle2.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js.map → [root-of-the-server]__07suer1._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js.map → [root-of-the-server]__0sgzo7y._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js.map → [root-of-the-server]__0uxlr84._.js.map} +0 -0
- /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → kDUolP-Zj2jCRleGJJGX0}/_buildManifest.js +0 -0
- /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → kDUolP-Zj2jCRleGJJGX0}/_clientMiddlewareManifest.js +0 -0
- /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;
|
|
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;
|
|
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
|
}
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts
CHANGED
|
@@ -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;
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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"}
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|