@shipit-ai/cli 1.169.0 → 1.170.0-pr13.00cc956
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/json-schema/ClaudeCodeProxyConfig.yaml +20 -0
- package/apis/json-schema/FeatureFlags.yaml +5 -0
- package/apis/json-schema/LiteLLMProxyConfig.yaml +17 -0
- package/apis/json-schema/LiteLLMProxyRoutingMode.yaml +8 -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 +59 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +6 -0
- 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 +9 -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 +55 -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/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.js +32 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +36 -5
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +7 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts +4 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +53 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +5 -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 +124 -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 +7 -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-routing-section.d.ts +6 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.js +69 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts +16 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.js +64 -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 +73 -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 +5 -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/features/skills/skills-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/skills/skills-page-client.js +6 -2
- package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tools-page-client.js +23 -4
- 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 +56 -2
- package/dist/translations/de/web.json +56 -2
- package/dist/translations/en/web.json +56 -2
- package/dist/translations/es/web.json +56 -2
- package/dist/translations/fr/web.json +56 -2
- package/dist/translations/he/web.json +56 -2
- package/dist/translations/pt/web.json +56 -2
- package/dist/translations/ru/web.json +56 -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 +3 -3
- package/web/.next/required-server-files.json +3 -3
- 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 +1 -1
- 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]__0dec29w._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js.map +1 -0
- 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]__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/_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/_083k45~._.js +3 -0
- package/web/.next/server/chunks/ssr/_083k45~._.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/{_0wor25i._.js → _0job75~._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0wor25i._.js.map → _0job75~._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0jtr2u0._.js +3 -0
- package/web/.next/server/chunks/ssr/_0jtr2u0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0kaec~c._.js +3 -0
- package/web/.next/server/chunks/ssr/_0kaec~c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0o.xc6x._.js +3 -0
- package/web/.next/server/chunks/ssr/_0o.xc6x._.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/{_01qdxy2._.js → _0~b~4sr._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_01qdxy2._.js.map → _0~b~4sr._.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/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/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.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/0.s8cxri-_s9l.js +1 -0
- package/web/.next/static/chunks/012cnd7koqv6d.js +7 -0
- package/web/.next/static/chunks/{0dq50gtgaj63f.js → 029s48ykt7mw9.js} +1 -1
- package/web/.next/static/chunks/{11vbir.u7_zf7.js → 03agfpdm4n_fn.js} +1 -1
- package/web/.next/static/chunks/05qti39qqsvzs.js +1 -0
- package/web/.next/static/chunks/{0fg~vc93spa9c.js → 07gal-~-zwagj.js} +1 -1
- package/web/.next/static/chunks/{0u_27fdqa2jeg.js → 0abfw8oib7e3t.js} +1 -1
- package/web/.next/static/chunks/{0in4l8mne5y~_.js → 0b2pi58fg3lt3.js} +1 -1
- package/web/.next/static/chunks/{121v1_d_dfk2k.js → 0boet02f0igne.js} +1 -1
- package/web/.next/static/chunks/0f80ru2bzs3v5.js +1 -0
- package/web/.next/static/chunks/{12axopx66pocj.js → 0ibyqd4oceukb.js} +2 -2
- 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/0kqqf5i.f1-nm.js +1 -0
- package/web/.next/static/chunks/0lc0x8kcu46ae.js +1 -0
- package/web/.next/static/chunks/{183ehj-b80a~o.js → 0nfd9bvcnbcgl.js} +1 -1
- package/web/.next/static/chunks/{1874_wt9rit96.js → 0o5siyl.hsy96.js} +1 -1
- package/web/.next/static/chunks/0s0432bko4hq9.js +1 -0
- package/web/.next/static/chunks/{0o33urrd3lk~u.js → 0skduwu0tu8qh.js} +1 -1
- package/web/.next/static/chunks/0ug478hm-8bog.js +5 -0
- package/web/.next/static/chunks/{0yibymrb2j05t.css → 0v7r7y~3e~oo6.css} +1 -1
- package/web/.next/static/chunks/{00m_fbc2z1gyi.js → 0~5~-wr7rq8b6.js} +3 -3
- package/web/.next/static/chunks/{09f2lesd_dd3~.js → 10gfhk-66cbtu.js} +1 -1
- package/web/.next/static/chunks/{0k0j7anrbg-of.js → 10lvozwidvzfo.js} +3 -3
- package/web/.next/static/chunks/10rtagfoabp3b.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/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/static/chunks/13q1peb_t9vj8.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 → GeXKcODhEHBnDRVLMaAnW}/_buildManifest.js +0 -0
- /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → GeXKcODhEHBnDRVLMaAnW}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → GeXKcODhEHBnDRVLMaAnW}/_ssgManifest.js +0 -0
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* Uses constructor dependency injection for the spawn function
|
|
9
9
|
* to enable testability without mocking node:child_process directly.
|
|
10
10
|
*/
|
|
11
|
+
import { LiteLLMProxyRoutingMode } from '../../../../../domain/generated/output.js';
|
|
11
12
|
import { ExecutorBase } from './executor-base.js';
|
|
12
13
|
/** Features supported by Claude Code CLI */
|
|
13
14
|
const SUPPORTED_FEATURES = new Set([
|
|
@@ -23,9 +24,61 @@ const SUPPORTED_FEATURES = new Set([
|
|
|
23
24
|
*/
|
|
24
25
|
export class ClaudeCodeExecutorService extends ExecutorBase {
|
|
25
26
|
agentType = 'claude-code';
|
|
27
|
+
proxyConfig;
|
|
26
28
|
constructor(spawn) {
|
|
27
29
|
super(spawn);
|
|
28
30
|
}
|
|
31
|
+
updateProxyConfig(config) {
|
|
32
|
+
this.proxyConfig = config;
|
|
33
|
+
}
|
|
34
|
+
buildSpawnEnv() {
|
|
35
|
+
const env = super.buildSpawnEnv();
|
|
36
|
+
const cc = this.proxyConfig?.claudeCode;
|
|
37
|
+
if (!cc || !this.proxyConfig?.baseUrl)
|
|
38
|
+
return env;
|
|
39
|
+
const mode = cc.routingMode ?? LiteLLMProxyRoutingMode.direct;
|
|
40
|
+
if (mode === LiteLLMProxyRoutingMode.direct)
|
|
41
|
+
return env;
|
|
42
|
+
// Guard against unrecognized routing modes (DB corruption, future enum additions)
|
|
43
|
+
if (mode !== LiteLLMProxyRoutingMode.proxy && mode !== LiteLLMProxyRoutingMode.passthrough) {
|
|
44
|
+
this.log(`WARNING: Unknown LiteLLM routing mode "${mode}", falling back to direct mode`);
|
|
45
|
+
return env;
|
|
46
|
+
}
|
|
47
|
+
// Both proxy and passthrough set BASE_URL
|
|
48
|
+
env.ANTHROPIC_BASE_URL = this.proxyConfig.baseUrl;
|
|
49
|
+
if (mode === LiteLLMProxyRoutingMode.proxy) {
|
|
50
|
+
if (this.proxyConfig.apiKey) {
|
|
51
|
+
env.ANTHROPIC_AUTH_TOKEN = this.proxyConfig.apiKey;
|
|
52
|
+
}
|
|
53
|
+
if (cc.customHeaders) {
|
|
54
|
+
env.ANTHROPIC_CUSTOM_HEADERS = cc.customHeaders;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// passthrough mode
|
|
59
|
+
const headers = [];
|
|
60
|
+
if (this.proxyConfig.apiKey) {
|
|
61
|
+
headers.push(`x-litellm-api-key: Bearer ${this.proxyConfig.apiKey}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.log('WARNING: Passthrough mode active but no proxy API key configured — proxy may reject requests');
|
|
65
|
+
}
|
|
66
|
+
if (cc.customHeaders) {
|
|
67
|
+
headers.push(cc.customHeaders);
|
|
68
|
+
}
|
|
69
|
+
if (headers.length) {
|
|
70
|
+
env.ANTHROPIC_CUSTOM_HEADERS = headers.join('\n');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Model overrides (both proxy and passthrough)
|
|
74
|
+
if (cc.sonnetModel)
|
|
75
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = cc.sonnetModel;
|
|
76
|
+
if (cc.haikuModel)
|
|
77
|
+
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = cc.haikuModel;
|
|
78
|
+
if (cc.opusModel)
|
|
79
|
+
env.ANTHROPIC_DEFAULT_OPUS_MODEL = cc.opusModel;
|
|
80
|
+
return env;
|
|
81
|
+
}
|
|
29
82
|
async execute(prompt, options) {
|
|
30
83
|
this.silent = options?.silent ?? false;
|
|
31
84
|
// Use stream-json so we get real-time events in the worker log
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAiB1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyF1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8S/D"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js
CHANGED
|
@@ -16,6 +16,7 @@ import { initializeContainer, container } from '../../../di/container.js';
|
|
|
16
16
|
import { createFeatureAgentGraph } from './feature-agent-graph.js';
|
|
17
17
|
import { createFastFeatureAgentGraph } from './fast-feature-agent-graph.js';
|
|
18
18
|
import { createCheckpointer } from '../common/checkpointer.js';
|
|
19
|
+
import { ClaudeCodeExecutorService } from '../../../services/agents/common/executors/claude-code-executor.service.js';
|
|
19
20
|
import { AgentRunStatus, SdlcLifecycle } from '../../../../domain/generated/output.js';
|
|
20
21
|
import { initializeSettings } from '../../../services/settings.service.js';
|
|
21
22
|
import { InitializeSettingsUseCase } from '../../../../application/use-cases/settings/initialize-settings.use-case.js';
|
|
@@ -183,6 +184,10 @@ export async function runWorker(args) {
|
|
|
183
184
|
log(`Creating executor from pinned agent type: ${args.agentType}`);
|
|
184
185
|
const factory = container.resolve('IAgentExecutorFactory');
|
|
185
186
|
executor = factory.createExecutor(args.agentType, settings.agent);
|
|
187
|
+
// Update proxy config for direct factory calls (provider does this automatically)
|
|
188
|
+
if (executor instanceof ClaudeCodeExecutorService) {
|
|
189
|
+
executor.updateProxyConfig(settings.litellmProxy);
|
|
190
|
+
}
|
|
186
191
|
}
|
|
187
192
|
else {
|
|
188
193
|
log('Creating executor from configured agent settings...');
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { PluginMarketplaceService } from './plugin-marketplace.service.js';
|
|
2
|
+
export { MarketplaceCatalogSchema, InstalledPluginSchema, InstalledPluginsListSchema, } from './plugin-marketplace.schema.js';
|
|
3
|
+
export { validatePluginId, validateMarketplaceName, validateMarketplaceUrl, validateScope, } from './plugin-marketplace.validators.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,GACd,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { PluginMarketplaceService } from './plugin-marketplace.service.js';
|
|
2
|
+
export { MarketplaceCatalogSchema, InstalledPluginSchema, InstalledPluginsListSchema, } from './plugin-marketplace.schema.js';
|
|
3
|
+
export { validatePluginId, validateMarketplaceName, validateMarketplaceUrl, validateScope, } from './plugin-marketplace.validators.js';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod Schemas for Plugin Marketplace Data Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates all external data boundaries:
|
|
5
|
+
* 1. LiteLLM proxy marketplace.json response
|
|
6
|
+
* 2. `claude plugin list --json` CLI output
|
|
7
|
+
*
|
|
8
|
+
* All data from external sources is untrusted. Strings are capped
|
|
9
|
+
* to prevent excessive memory use in UI rendering.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
declare const PluginEntrySchema: z.ZodObject<{
|
|
13
|
+
name: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
14
|
+
description: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<string, string>>;
|
|
15
|
+
version: z.ZodOptional<z.ZodString>;
|
|
16
|
+
source: z.ZodObject<{
|
|
17
|
+
source: z.ZodEnum<{
|
|
18
|
+
url: "url";
|
|
19
|
+
github: "github";
|
|
20
|
+
"git-subdir": "git-subdir";
|
|
21
|
+
}>;
|
|
22
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
23
|
+
url: z.ZodOptional<z.ZodString>;
|
|
24
|
+
path: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
category: z.ZodOptional<z.ZodString>;
|
|
27
|
+
keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export declare const MarketplaceCatalogSchema: z.ZodObject<{
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
owner: z.ZodOptional<z.ZodObject<{
|
|
32
|
+
name: z.ZodString;
|
|
33
|
+
email: z.ZodString;
|
|
34
|
+
}, z.core.$strip>>;
|
|
35
|
+
plugins: z.ZodArray<z.ZodObject<{
|
|
36
|
+
name: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
37
|
+
description: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<string, string>>;
|
|
38
|
+
version: z.ZodOptional<z.ZodString>;
|
|
39
|
+
source: z.ZodObject<{
|
|
40
|
+
source: z.ZodEnum<{
|
|
41
|
+
url: "url";
|
|
42
|
+
github: "github";
|
|
43
|
+
"git-subdir": "git-subdir";
|
|
44
|
+
}>;
|
|
45
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
46
|
+
url: z.ZodOptional<z.ZodString>;
|
|
47
|
+
path: z.ZodOptional<z.ZodString>;
|
|
48
|
+
}, z.core.$strip>;
|
|
49
|
+
category: z.ZodOptional<z.ZodString>;
|
|
50
|
+
keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
51
|
+
}, z.core.$strip>>;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
export declare const InstalledPluginSchema: z.ZodObject<{
|
|
54
|
+
id: z.ZodString;
|
|
55
|
+
scope: z.ZodEnum<{
|
|
56
|
+
user: "user";
|
|
57
|
+
project: "project";
|
|
58
|
+
local: "local";
|
|
59
|
+
}>;
|
|
60
|
+
version: z.ZodOptional<z.ZodString>;
|
|
61
|
+
enabled: z.ZodBoolean;
|
|
62
|
+
installedAt: z.ZodOptional<z.ZodString>;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
export declare const InstalledPluginsListSchema: z.ZodArray<z.ZodObject<{
|
|
65
|
+
id: z.ZodString;
|
|
66
|
+
scope: z.ZodEnum<{
|
|
67
|
+
user: "user";
|
|
68
|
+
project: "project";
|
|
69
|
+
local: "local";
|
|
70
|
+
}>;
|
|
71
|
+
version: z.ZodOptional<z.ZodString>;
|
|
72
|
+
enabled: z.ZodBoolean;
|
|
73
|
+
installedAt: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>>;
|
|
75
|
+
export type MarketplaceCatalog = z.infer<typeof MarketplaceCatalogSchema>;
|
|
76
|
+
export type ValidatedPluginEntry = z.infer<typeof PluginEntrySchema>;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=plugin-marketplace.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-marketplace.schema.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;iBASnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;kBAAiC,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod Schemas for Plugin Marketplace Data Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates all external data boundaries:
|
|
5
|
+
* 1. LiteLLM proxy marketplace.json response
|
|
6
|
+
* 2. `claude plugin list --json` CLI output
|
|
7
|
+
*
|
|
8
|
+
* All data from external sources is untrusted. Strings are capped
|
|
9
|
+
* to prevent excessive memory use in UI rendering.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
const PluginSourceSchema = z.object({
|
|
13
|
+
source: z.enum(['github', 'url', 'git-subdir']),
|
|
14
|
+
repo: z.string().optional(),
|
|
15
|
+
url: z.string().optional(),
|
|
16
|
+
path: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
const PluginEntrySchema = z.object({
|
|
19
|
+
name: z.string().transform((s) => s.slice(0, 100)),
|
|
20
|
+
description: z
|
|
21
|
+
.string()
|
|
22
|
+
.default('')
|
|
23
|
+
.transform((s) => s.slice(0, 2000)),
|
|
24
|
+
version: z.string().optional(),
|
|
25
|
+
source: PluginSourceSchema,
|
|
26
|
+
category: z.string().optional(),
|
|
27
|
+
keywords: z.array(z.string()).optional(),
|
|
28
|
+
});
|
|
29
|
+
export const MarketplaceCatalogSchema = z.object({
|
|
30
|
+
name: z.string(),
|
|
31
|
+
owner: z
|
|
32
|
+
.object({
|
|
33
|
+
name: z.string(),
|
|
34
|
+
email: z.string(),
|
|
35
|
+
})
|
|
36
|
+
.optional(),
|
|
37
|
+
plugins: z.array(PluginEntrySchema),
|
|
38
|
+
});
|
|
39
|
+
export const InstalledPluginSchema = z.object({
|
|
40
|
+
id: z.string(),
|
|
41
|
+
scope: z.enum(['user', 'project', 'local']),
|
|
42
|
+
version: z.string().optional(),
|
|
43
|
+
enabled: z.boolean(),
|
|
44
|
+
installedAt: z.string().optional(),
|
|
45
|
+
});
|
|
46
|
+
export const InstalledPluginsListSchema = z.array(InstalledPluginSchema);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Marketplace Service
|
|
3
|
+
*
|
|
4
|
+
* Implements IPluginMarketplaceService using:
|
|
5
|
+
* - Node 22+ native fetch for HTTP catalog retrieval from LiteLLM proxy
|
|
6
|
+
* - execFile-style subprocess calls to the `claude` CLI for plugin lifecycle
|
|
7
|
+
*
|
|
8
|
+
* This is the first HTTP client in the infrastructure layer.
|
|
9
|
+
* Pattern: AbortController timeout, redirect rejection, size limit, Zod validation.
|
|
10
|
+
*
|
|
11
|
+
* All subprocess arguments are validated via allowlist validators before passing
|
|
12
|
+
* to execFile. Arguments are always separate array elements (never concatenated).
|
|
13
|
+
*/
|
|
14
|
+
import type { IPluginMarketplaceService, PluginMarketplaceEntry, InstalledPlugin, PluginOperationResult } from '../../../application/ports/output/services/plugin-marketplace.interface.js';
|
|
15
|
+
type SpawnCallback = (error: Error | null, stdout: string, stderr: string) => void;
|
|
16
|
+
type SpawnFunction = (cmd: string, args: string[], callback: SpawnCallback) => void;
|
|
17
|
+
export declare class PluginMarketplaceService implements IPluginMarketplaceService {
|
|
18
|
+
private readonly spawn;
|
|
19
|
+
constructor(spawn: SpawnFunction);
|
|
20
|
+
fetchCatalog(proxyBaseUrl: string, apiKey?: string): Promise<PluginMarketplaceEntry[]>;
|
|
21
|
+
listInstalled(): Promise<InstalledPlugin[]>;
|
|
22
|
+
installPlugin(pluginId: string, marketplace: string, scope?: string): Promise<PluginOperationResult>;
|
|
23
|
+
uninstallPlugin(pluginId: string, marketplace: string): Promise<PluginOperationResult>;
|
|
24
|
+
togglePlugin(pluginId: string, marketplace: string, enabled: boolean): Promise<PluginOperationResult>;
|
|
25
|
+
addMarketplace(url: string): Promise<PluginOperationResult>;
|
|
26
|
+
private execClaude;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=plugin-marketplace.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-marketplace.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACtB,MAAM,4EAA4E,CAAC;AAYpF,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AACnF,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAMpF,qBAAa,wBAAyB,YAAW,yBAAyB;IACxE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAE1B,KAAK,EAAE,aAAa;IAI1B,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAgDtF,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAsB3C,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;IAY3B,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAWtF,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC;IAY3B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAUjE,OAAO,CAAC,UAAU;CAanB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Marketplace Service
|
|
3
|
+
*
|
|
4
|
+
* Implements IPluginMarketplaceService using:
|
|
5
|
+
* - Node 22+ native fetch for HTTP catalog retrieval from LiteLLM proxy
|
|
6
|
+
* - execFile-style subprocess calls to the `claude` CLI for plugin lifecycle
|
|
7
|
+
*
|
|
8
|
+
* This is the first HTTP client in the infrastructure layer.
|
|
9
|
+
* Pattern: AbortController timeout, redirect rejection, size limit, Zod validation.
|
|
10
|
+
*
|
|
11
|
+
* All subprocess arguments are validated via allowlist validators before passing
|
|
12
|
+
* to execFile. Arguments are always separate array elements (never concatenated).
|
|
13
|
+
*/
|
|
14
|
+
import { MarketplaceCatalogSchema, InstalledPluginsListSchema, } from './plugin-marketplace.schema.js';
|
|
15
|
+
import { validatePluginId, validateMarketplaceName, validateMarketplaceUrl, validateScope, } from './plugin-marketplace.validators.js';
|
|
16
|
+
const FETCH_TIMEOUT_MS = 10_000;
|
|
17
|
+
const MAX_RESPONSE_SIZE = 5_000_000;
|
|
18
|
+
const CLAUDE_BINARY = process.platform === 'win32' ? 'claude.cmd' : 'claude';
|
|
19
|
+
export class PluginMarketplaceService {
|
|
20
|
+
spawn;
|
|
21
|
+
constructor(spawn) {
|
|
22
|
+
this.spawn = spawn;
|
|
23
|
+
}
|
|
24
|
+
async fetchCatalog(proxyBaseUrl, apiKey) {
|
|
25
|
+
try {
|
|
26
|
+
const url = validateMarketplaceUrl(proxyBaseUrl);
|
|
27
|
+
if (apiKey && url.protocol === 'http:') {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const catalogUrl = `${url.toString().replace(/\/$/, '')}/claude-code/marketplace.json`;
|
|
31
|
+
const headers = {};
|
|
32
|
+
if (apiKey) {
|
|
33
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
34
|
+
}
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch(catalogUrl, {
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
redirect: 'error',
|
|
41
|
+
headers,
|
|
42
|
+
});
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const text = await res.text();
|
|
47
|
+
if (text.length > MAX_RESPONSE_SIZE) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
const json = JSON.parse(text);
|
|
51
|
+
const parsed = MarketplaceCatalogSchema.safeParse(json);
|
|
52
|
+
if (!parsed.success) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
return parsed.data.plugins;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
clearTimeout(timeout);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async listInstalled() {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
this.spawn(CLAUDE_BINARY, ['plugin', 'list', '--json'], (error, stdout) => {
|
|
68
|
+
if (error) {
|
|
69
|
+
resolve([]);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const json = JSON.parse(stdout);
|
|
74
|
+
const parsed = InstalledPluginsListSchema.safeParse(json);
|
|
75
|
+
if (parsed.success) {
|
|
76
|
+
resolve(parsed.data);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
resolve([]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
resolve([]);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async installPlugin(pluginId, marketplace, scope) {
|
|
89
|
+
try {
|
|
90
|
+
const validId = validatePluginId(pluginId);
|
|
91
|
+
const validMp = validateMarketplaceName(marketplace);
|
|
92
|
+
const validScope = scope ? validateScope(scope) : 'user';
|
|
93
|
+
const args = ['plugin', 'install', `${validId}@${validMp}`, '--scope', validScope];
|
|
94
|
+
return await this.execClaude(args);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async uninstallPlugin(pluginId, marketplace) {
|
|
101
|
+
try {
|
|
102
|
+
const validId = validatePluginId(pluginId);
|
|
103
|
+
const validMp = validateMarketplaceName(marketplace);
|
|
104
|
+
const args = ['plugin', 'uninstall', `${validId}@${validMp}`];
|
|
105
|
+
return await this.execClaude(args);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async togglePlugin(pluginId, marketplace, enabled) {
|
|
112
|
+
try {
|
|
113
|
+
const validId = validatePluginId(pluginId);
|
|
114
|
+
const validMp = validateMarketplaceName(marketplace);
|
|
115
|
+
const action = enabled ? 'enable' : 'disable';
|
|
116
|
+
const args = ['plugin', action, `${validId}@${validMp}`];
|
|
117
|
+
return await this.execClaude(args);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async addMarketplace(url) {
|
|
124
|
+
try {
|
|
125
|
+
const validUrl = validateMarketplaceUrl(url);
|
|
126
|
+
const args = ['plugin', 'marketplace', 'add', validUrl.toString()];
|
|
127
|
+
return await this.execClaude(args);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return { success: false, error: err instanceof Error ? err.message : 'Validation failed' };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
execClaude(args) {
|
|
134
|
+
return new Promise((resolve) => {
|
|
135
|
+
this.spawn(CLAUDE_BINARY, args, (error) => {
|
|
136
|
+
if (error) {
|
|
137
|
+
// Never expose raw subprocess stderr/error to the client.
|
|
138
|
+
// Generic message only — details are logged server-side.
|
|
139
|
+
resolve({ success: false, error: 'Plugin operation failed' });
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
resolve({ success: true });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Validators for Plugin Marketplace Operations
|
|
3
|
+
*
|
|
4
|
+
* Strict allowlist-based validation for all values that become subprocess
|
|
5
|
+
* arguments or HTTP request parameters. Defense-in-depth against injection.
|
|
6
|
+
*/
|
|
7
|
+
export declare function validatePluginId(name: string): string;
|
|
8
|
+
export declare function validateMarketplaceUrl(urlString: string): URL;
|
|
9
|
+
export declare function validateMarketplaceName(name: string): string;
|
|
10
|
+
export declare function validateScope(scope: string): 'user' | 'project' | 'local';
|
|
11
|
+
//# sourceMappingURL=plugin-marketplace.validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-marketplace.validators.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAkB7D;AAKD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAKzE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Validators for Plugin Marketplace Operations
|
|
3
|
+
*
|
|
4
|
+
* Strict allowlist-based validation for all values that become subprocess
|
|
5
|
+
* arguments or HTTP request parameters. Defense-in-depth against injection.
|
|
6
|
+
*/
|
|
7
|
+
const PLUGIN_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;
|
|
8
|
+
const MAX_PLUGIN_NAME_LENGTH = 100;
|
|
9
|
+
const VALID_SCOPES = ['user', 'project', 'local'];
|
|
10
|
+
const LOCALHOST_HOSTNAMES = new Set(['localhost', '127.0.0.1', '[::1]']);
|
|
11
|
+
export function validatePluginId(name) {
|
|
12
|
+
if (!name || name.length > MAX_PLUGIN_NAME_LENGTH || !PLUGIN_NAME_REGEX.test(name)) {
|
|
13
|
+
throw new Error(`Invalid plugin ID: must be 1-${MAX_PLUGIN_NAME_LENGTH} characters matching [a-zA-Z0-9_-]`);
|
|
14
|
+
}
|
|
15
|
+
return name;
|
|
16
|
+
}
|
|
17
|
+
export function validateMarketplaceUrl(urlString) {
|
|
18
|
+
let url;
|
|
19
|
+
try {
|
|
20
|
+
url = new URL(urlString);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error(`Invalid marketplace URL: ${urlString}`);
|
|
24
|
+
}
|
|
25
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
26
|
+
throw new Error(`Invalid URL scheme: ${url.protocol} (only http: and https: allowed)`);
|
|
27
|
+
}
|
|
28
|
+
const isLocalhost = LOCALHOST_HOSTNAMES.has(url.hostname);
|
|
29
|
+
if (url.protocol === 'http:' && !isLocalhost) {
|
|
30
|
+
throw new Error('HTTP is only allowed for localhost URLs. Use HTTPS for remote hosts.');
|
|
31
|
+
}
|
|
32
|
+
return url;
|
|
33
|
+
}
|
|
34
|
+
const MARKETPLACE_NAME_REGEX = /^[a-zA-Z0-9_\-.:/@]+$/;
|
|
35
|
+
const MAX_MARKETPLACE_NAME_LENGTH = 200;
|
|
36
|
+
export function validateMarketplaceName(name) {
|
|
37
|
+
if (!name || name.length > MAX_MARKETPLACE_NAME_LENGTH || !MARKETPLACE_NAME_REGEX.test(name)) {
|
|
38
|
+
throw new Error(`Invalid marketplace name: must be 1-${MAX_MARKETPLACE_NAME_LENGTH} characters matching [a-zA-Z0-9_-./:@]`);
|
|
39
|
+
}
|
|
40
|
+
return name;
|
|
41
|
+
}
|
|
42
|
+
export function validateScope(scope) {
|
|
43
|
+
if (!VALID_SCOPES.includes(scope)) {
|
|
44
|
+
throw new Error(`Invalid scope: ${scope} (must be one of: ${VALID_SCOPES.join(', ')})`);
|
|
45
|
+
}
|
|
46
|
+
return scope;
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-marketplace.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/add-marketplace.ts"],"names":[],"mappings":"AAKA,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function addMarketplaceAction(url) {
|
|
4
|
+
try {
|
|
5
|
+
const useCase = resolve('AddMarketplaceUseCase');
|
|
6
|
+
return await useCase.execute({ url });
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { success: false, error: 'Failed to add marketplace' };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FetchPluginCatalogResult } from '../../../../../packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.js';
|
|
2
|
+
export declare function fetchPluginCatalogAction(): Promise<FetchPluginCatalogResult & {
|
|
3
|
+
error?: string;
|
|
4
|
+
}>;
|
|
5
|
+
//# sourceMappingURL=fetch-plugin-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-plugin-catalog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/fetch-plugin-catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6EAA6E,CAAC;AAE5H,wBAAsB,wBAAwB,IAAI,OAAO,CACvD,wBAAwB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAC9C,CAOA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function fetchPluginCatalogAction() {
|
|
4
|
+
try {
|
|
5
|
+
const useCase = resolve('FetchPluginCatalogUseCase');
|
|
6
|
+
return await useCase.execute();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { plugins: [], installedPlugins: [], error: 'Failed to fetch plugin catalog' };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/install-plugin.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function installPluginAction(pluginId, marketplace, scope) {
|
|
4
|
+
try {
|
|
5
|
+
const useCase = resolve('InstallPluginUseCase');
|
|
6
|
+
return await useCase.execute({ pluginId, marketplace, scope });
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { success: false, error: 'Failed to install plugin' };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/toggle-plugin.ts"],"names":[],"mappings":"AAKA,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function togglePluginAction(pluginId, marketplace, enabled) {
|
|
4
|
+
try {
|
|
5
|
+
const useCase = resolve('TogglePluginUseCase');
|
|
6
|
+
return await useCase.execute({ pluginId, marketplace, enabled });
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { success: false, error: 'Failed to toggle plugin' };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall-plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/uninstall-plugin.ts"],"names":[],"mappings":"AAKA,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function uninstallPluginAction(pluginId, marketplace) {
|
|
4
|
+
try {
|
|
5
|
+
const useCase = resolve('UninstallPluginUseCase');
|
|
6
|
+
return await useCase.execute({ pluginId, marketplace });
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { success: false, error: 'Failed to uninstall plugin' };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/plugins/page.tsx"],"names":[],"mappings":"AAOA,wBAA8B,WAAW,qDAkBxC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { notFound } from 'next/navigation';
|
|
3
|
+
import { getFeatureFlags } from '../../lib/feature-flags.js';
|
|
4
|
+
import { PluginsPageClient } from '../../components/features/plugins/plugins-page-client.js';
|
|
5
|
+
import { resolve } from '../../lib/server-container.js';
|
|
6
|
+
import { AgentType } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
7
|
+
export default async function PluginsPage() {
|
|
8
|
+
const flags = await getFeatureFlags();
|
|
9
|
+
if (!flags.plugins)
|
|
10
|
+
notFound();
|
|
11
|
+
let proxyConfigured = false;
|
|
12
|
+
let isClaudeCode = false;
|
|
13
|
+
try {
|
|
14
|
+
const useCase = resolve('LoadSettingsUseCase');
|
|
15
|
+
const settings = await useCase.execute();
|
|
16
|
+
proxyConfigured = !!(settings.litellmProxy?.baseUrl && settings.litellmProxy?.marketplaceEnabled);
|
|
17
|
+
isClaudeCode = settings.agent?.type === AgentType.ClaudeCode;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Settings not available
|
|
21
|
+
}
|
|
22
|
+
return _jsx(PluginsPageClient, { proxyConfigured: proxyConfigured, isClaudeCode: isClaudeCode });
|
|
23
|
+
}
|