@shipit-ai/cli 1.169.0 → 1.170.0-pr13.d3605b0
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 +41 -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 +44 -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 +72 -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/{_0wor25i._.js → _02g0xyh._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0wor25i._.js.map → _02g0xyh._.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/_0kaec~c._.js +3 -0
- package/web/.next/server/chunks/ssr/_0kaec~c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_01qdxy2._.js → _0mdgz5u._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_01qdxy2._.js.map → _0mdgz5u._.js.map} +1 -1
- 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/_0rqycsg._.js +3 -0
- package/web/.next/server/chunks/ssr/_0rqycsg._.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/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/{12axopx66pocj.js → 056k4f_cj86_m.js} +2 -2
- package/web/.next/static/chunks/{0k0j7anrbg-of.js → 05_pa1uvg8ndq.js} +3 -3
- package/web/.next/static/chunks/{0fg~vc93spa9c.js → 07gal-~-zwagj.js} +1 -1
- package/web/.next/static/chunks/{0in4l8mne5y~_.js → 0b2pi58fg3lt3.js} +1 -1
- package/web/.next/static/chunks/{0o33urrd3lk~u.js → 0dbuetfm_wux5.js} +1 -1
- package/web/.next/static/chunks/{1874_wt9rit96.js → 0dq~u_3-zgq73.js} +1 -1
- package/web/.next/static/chunks/{00m_fbc2z1gyi.js → 0f1m9w6~4f-.w.js} +3 -3
- package/web/.next/static/chunks/{0u_27fdqa2jeg.js → 0i~5fqskcb~~p.js} +1 -1
- 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/0kjqz.9e9sou2.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/0nnltbyg963sg.js +1 -0
- package/web/.next/static/chunks/0pik.2.wvg.el.js +1 -0
- package/web/.next/static/chunks/0r05-2~73nsxp.js +1 -0
- 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/{0dq50gtgaj63f.js → 0wcqsl6fpljkf.js} +1 -1
- package/web/.next/static/chunks/10rtagfoabp3b.js +1 -0
- package/web/.next/static/chunks/112xn3.b2hrmh.js +1 -0
- package/web/.next/static/chunks/{11vbir.u7_zf7.js → 13mkca.j8w.7_.js} +1 -1
- package/web/.next/static/chunks/{121v1_d_dfk2k.js → 14ulzux4y._m-.js} +1 -1
- 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/09f2lesd_dd3~.js +0 -1
- 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 → W6C3cWcub-2kZuXP7c21j}/_buildManifest.js +0 -0
- /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → W6C3cWcub-2kZuXP7c21j}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → W6C3cWcub-2kZuXP7c21j}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { LiteLLMProxyRoutingSection } from './litellm-proxy-routing-section.js';
|
|
2
|
+
import { createDefaultSettings } from '../../../../../../packages/core/src/domain/factories/settings-defaults.factory.js';
|
|
3
|
+
import { LiteLLMProxyRoutingMode } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
4
|
+
const baseSettings = {
|
|
5
|
+
...createDefaultSettings(),
|
|
6
|
+
litellmProxy: {
|
|
7
|
+
baseUrl: 'http://localhost:4000',
|
|
8
|
+
apiKey: 'sk-litellm-proxy-key-1234',
|
|
9
|
+
marketplaceEnabled: true,
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
const meta = {
|
|
13
|
+
title: 'Features/Settings/LiteLLMProxyRoutingSection',
|
|
14
|
+
component: LiteLLMProxyRoutingSection,
|
|
15
|
+
tags: ['autodocs'],
|
|
16
|
+
parameters: {
|
|
17
|
+
layout: 'padded',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export default meta;
|
|
21
|
+
export const DirectMode = {
|
|
22
|
+
args: {
|
|
23
|
+
settings: {
|
|
24
|
+
...baseSettings,
|
|
25
|
+
litellmProxy: {
|
|
26
|
+
...baseSettings.litellmProxy,
|
|
27
|
+
claudeCode: {
|
|
28
|
+
routingMode: LiteLLMProxyRoutingMode.direct,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export const ProxyMode = {
|
|
35
|
+
args: {
|
|
36
|
+
settings: {
|
|
37
|
+
...baseSettings,
|
|
38
|
+
litellmProxy: {
|
|
39
|
+
...baseSettings.litellmProxy,
|
|
40
|
+
claudeCode: {
|
|
41
|
+
routingMode: LiteLLMProxyRoutingMode.proxy,
|
|
42
|
+
customHeaders: 'x-litellm-customer-id: user-123\nx-litellm-tags: project:acme',
|
|
43
|
+
sonnetModel: 'claude-sonnet-4-6',
|
|
44
|
+
haikuModel: 'claude-haiku-4-5',
|
|
45
|
+
opusModel: 'claude-opus-4-6',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
export const PassthroughMode = {
|
|
52
|
+
args: {
|
|
53
|
+
settings: {
|
|
54
|
+
...baseSettings,
|
|
55
|
+
litellmProxy: {
|
|
56
|
+
...baseSettings.litellmProxy,
|
|
57
|
+
claudeCode: {
|
|
58
|
+
routingMode: LiteLLMProxyRoutingMode.passthrough,
|
|
59
|
+
sonnetModel: 'claude-sonnet-4-6',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Settings } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
export interface LiteLLMProxySettingsSectionProps {
|
|
3
|
+
settings: Settings;
|
|
4
|
+
}
|
|
5
|
+
export declare function LiteLLMProxySettingsSection({ settings }: LiteLLMProxySettingsSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=litellm-proxy-settings-section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litellm-proxy-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/litellm-proxy-settings-section.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAKxE,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE,gCAAgC,2CA+HzF"}
|
package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useTransition } from 'react';
|
|
4
|
+
import { Server, CheckCircle2, XCircle } from 'lucide-react';
|
|
5
|
+
import { toast } from 'sonner';
|
|
6
|
+
import { useTranslation } from 'react-i18next';
|
|
7
|
+
import { updateSettingsAction } from '../../../app/actions/update-settings.js';
|
|
8
|
+
import { addMarketplaceAction } from '../../../app/actions/add-marketplace.js';
|
|
9
|
+
import { SettingsSection, SettingsRow } from './settings-section-utils.js';
|
|
10
|
+
import { Input } from '../../ui/input.js';
|
|
11
|
+
import { Button } from '../../ui/button.js';
|
|
12
|
+
export function LiteLLMProxySettingsSection({ settings }) {
|
|
13
|
+
const { t } = useTranslation('web');
|
|
14
|
+
const [, startTransition] = useTransition();
|
|
15
|
+
const [baseUrl, setBaseUrl] = useState(settings.litellmProxy?.baseUrl ?? '');
|
|
16
|
+
const [apiKey, setApiKey] = useState(settings.litellmProxy?.apiKey ?? '');
|
|
17
|
+
const [testStatus, setTestStatus] = useState('idle');
|
|
18
|
+
const [isTesting, setIsTesting] = useState(false);
|
|
19
|
+
const originalBaseUrl = settings.litellmProxy?.baseUrl ?? '';
|
|
20
|
+
const originalApiKey = settings.litellmProxy?.apiKey ?? '';
|
|
21
|
+
function save(payload) {
|
|
22
|
+
startTransition(async () => {
|
|
23
|
+
const result = await updateSettingsAction(payload);
|
|
24
|
+
if (!result.success) {
|
|
25
|
+
toast.error(result.error ?? t('settings.failedToSave'));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function buildPayload(overrides) {
|
|
30
|
+
const url = overrides?.baseUrl ?? baseUrl;
|
|
31
|
+
return {
|
|
32
|
+
litellmProxy: {
|
|
33
|
+
baseUrl: url,
|
|
34
|
+
apiKey: overrides?.apiKey ?? apiKey,
|
|
35
|
+
marketplaceEnabled: !!url,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function handleTestConnection() {
|
|
40
|
+
if (!baseUrl)
|
|
41
|
+
return;
|
|
42
|
+
setIsTesting(true);
|
|
43
|
+
setTestStatus('idle');
|
|
44
|
+
try {
|
|
45
|
+
const marketplaceUrl = `${baseUrl.replace(/\/+$/, '')}/claude-code/marketplace.json`;
|
|
46
|
+
const result = await addMarketplaceAction(marketplaceUrl);
|
|
47
|
+
setTestStatus(result.success ? 'success' : 'failed');
|
|
48
|
+
if (result.success) {
|
|
49
|
+
toast.success(t('settings.litellmProxy.testSuccess'));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
toast.error(t('settings.litellmProxy.testFailed'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
setTestStatus('failed');
|
|
57
|
+
toast.error(t('settings.litellmProxy.testFailed'));
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
setIsTesting(false);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return (_jsxs(SettingsSection, { icon: Server, title: t('settings.litellmProxy.title'), description: t('settings.litellmProxy.description'), testId: "litellm-proxy-settings-section", tooltip: t('settings.litellmProxy.hint'), children: [_jsx(SettingsRow, { label: t('settings.litellmProxy.baseUrl'), description: t('settings.litellmProxy.baseUrlDescription'), tooltip: "The base URL of your LiteLLM proxy server. This is used to fetch the plugin marketplace catalog and route model requests.", htmlFor: "litellm-proxy-url", children: _jsx(Input, { id: "litellm-proxy-url", "data-testid": "litellm-proxy-url-input", type: "text", placeholder: "http://localhost:4000", value: baseUrl, onChange: (e) => {
|
|
64
|
+
setBaseUrl(e.target.value);
|
|
65
|
+
setTestStatus('idle');
|
|
66
|
+
}, onBlur: () => {
|
|
67
|
+
if (baseUrl !== originalBaseUrl)
|
|
68
|
+
save(buildPayload({ baseUrl }));
|
|
69
|
+
}, className: "w-64 text-xs" }) }), _jsx(SettingsRow, { label: t('settings.litellmProxy.apiKey'), description: t('settings.litellmProxy.apiKeyDescription'), tooltip: "A virtual API key for authenticating with the LiteLLM proxy. Stored locally alongside other agent credentials.", htmlFor: "litellm-api-key", children: _jsx(Input, { id: "litellm-api-key", "data-testid": "litellm-api-key-input", type: "password", placeholder: "sk-...", value: apiKey, onChange: (e) => setApiKey(e.target.value), onBlur: () => {
|
|
70
|
+
if (apiKey !== originalApiKey)
|
|
71
|
+
save(buildPayload({ apiKey }));
|
|
72
|
+
}, className: "w-64 text-xs" }) }), _jsx(SettingsRow, { label: t('settings.litellmProxy.testConnection'), tooltip: "Attempt to connect to the proxy and fetch the marketplace catalog to verify the configuration is correct.", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", "data-testid": "litellm-test-connection-btn", disabled: !baseUrl || isTesting, onClick: handleTestConnection, className: "cursor-pointer text-xs", children: isTesting ? t('settings.saving') : t('settings.litellmProxy.testConnection') }), testStatus === 'success' && (_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-500", "data-testid": "litellm-test-success" })), testStatus === 'failed' && (_jsx(XCircle, { className: "text-destructive h-4 w-4", "data-testid": "litellm-test-failed" }))] }) })] }));
|
|
73
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { LiteLLMProxySettingsSection } from './litellm-proxy-settings-section.js';
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof LiteLLMProxySettingsSection;
|
|
6
|
+
tags: string[];
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const Default: Story;
|
|
14
|
+
export declare const Configured: Story;
|
|
15
|
+
//# sourceMappingURL=litellm-proxy-settings-section.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litellm-proxy-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAK/E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { LiteLLMProxySettingsSection } from './litellm-proxy-settings-section.js';
|
|
2
|
+
import { createDefaultSettings } from '../../../../../../packages/core/src/domain/factories/settings-defaults.factory.js';
|
|
3
|
+
const baseSettings = createDefaultSettings();
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Features/Settings/LiteLLMProxySettingsSection',
|
|
6
|
+
component: LiteLLMProxySettingsSection,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'padded',
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
export default meta;
|
|
13
|
+
export const Default = {
|
|
14
|
+
args: {
|
|
15
|
+
settings: baseSettings,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
export const Configured = {
|
|
19
|
+
args: {
|
|
20
|
+
settings: {
|
|
21
|
+
...baseSettings,
|
|
22
|
+
litellmProxy: {
|
|
23
|
+
baseUrl: 'http://localhost:4000',
|
|
24
|
+
apiKey: 'sk-litellm-proxy-key-1234',
|
|
25
|
+
marketplaceEnabled: true,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAkBzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,EAAE,uBAAuB,2CA+JzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
|
-
import { Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Timer, MessageSquare, LayoutGrid, LayoutList, } from 'lucide-react';
|
|
4
|
+
import { Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Timer, MessageSquare, LayoutGrid, LayoutList, Server, } from 'lucide-react';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { cn } from '../../../lib/utils.js';
|
|
7
7
|
import { AgentSettingsSection } from './agent-settings-section.js';
|
|
@@ -14,6 +14,8 @@ import { FeatureFlagsSettingsSection } from './feature-flags-settings-section.js
|
|
|
14
14
|
import { InteractiveAgentSettingsSection } from './interactive-agent-settings-section.js';
|
|
15
15
|
import { FabLayoutSettingsSection } from './fab-layout-settings-section.js';
|
|
16
16
|
import { DatabaseSettingsSection } from './database-settings-section.js';
|
|
17
|
+
import { LiteLLMProxySettingsSection } from './litellm-proxy-settings-section.js';
|
|
18
|
+
import { LiteLLMProxyRoutingSection } from './litellm-proxy-routing-section.js';
|
|
17
19
|
const SECTIONS = [
|
|
18
20
|
{ id: 'agent', labelKey: 'settings.sections.agent', icon: Bot },
|
|
19
21
|
{ id: 'environment', labelKey: 'settings.sections.environment', icon: Terminal },
|
|
@@ -25,6 +27,7 @@ const SECTIONS = [
|
|
|
25
27
|
{ id: 'interactive-agent', labelKey: 'settings.sections.chat', icon: MessageSquare },
|
|
26
28
|
{ id: 'fab-layout', labelKey: 'settings.sections.layout', icon: LayoutGrid },
|
|
27
29
|
{ id: 'database', labelKey: 'settings.sections.database', icon: Database },
|
|
30
|
+
{ id: 'litellm-proxy', labelKey: 'settings.sections.proxy', icon: Server },
|
|
28
31
|
];
|
|
29
32
|
const TABS = [{ id: 'all', labelKey: 'settings.sections.all', icon: LayoutList }, ...SECTIONS];
|
|
30
33
|
export function SettingsPageClient({ settings, shipitAiHome, dbFileSize, availableTerminals, availableEditors, availableShells, }) {
|
|
@@ -56,5 +59,5 @@ export function SettingsPageClient({ settings, shipitAiHome, dbFileSize, availab
|
|
|
56
59
|
return (_jsxs("button", { type: "button", onClick: () => setActiveTab(tab.id), className: cn('flex cursor-pointer items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-bold transition-all', isActive
|
|
57
60
|
? 'bg-muted text-primary shadow-sm ring-1 ring-slate-200/70 dark:ring-slate-700/50'
|
|
58
61
|
: 'text-muted-foreground hover:text-foreground hover:bg-accent/50'), children: [_jsx(TabIcon, { className: "h-3 w-3" }), _jsx("span", { className: "hidden sm:inline", children: t(tab.labelKey) })] }, tab.id));
|
|
59
|
-
}) })] }), _jsxs("div", { className: "flex flex-col gap-3", children: [(activeTab === 'all' || activeTab === 'agent') && (_jsx("div", { id: "section-agent", className: "scroll-mt-18 rounded-lg", children: _jsx(AgentSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'environment') && (_jsx("div", { id: "section-environment", className: "scroll-mt-18 rounded-lg", children: _jsx(EnvironmentSettingsSection, { settings: settings, availableEditors: availableEditors, availableShells: availableShells, availableTerminals: availableTerminals }) })), (activeTab === 'all' || activeTab === 'workflow') && (_jsx("div", { id: "section-workflow", className: "scroll-mt-18 rounded-lg", children: _jsx(WorkflowSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'ci') && (_jsx("div", { id: "section-ci", className: "scroll-mt-18 rounded-lg", children: _jsx(CiSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'stage-timeouts') && (_jsx("div", { id: "section-stage-timeouts", className: "scroll-mt-18 rounded-lg", children: _jsx(StageTimeoutsSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'notifications') && (_jsx("div", { id: "section-notifications", className: "scroll-mt-18 rounded-lg", children: _jsx(NotificationSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'feature-flags') && (_jsx("div", { id: "section-feature-flags", className: "scroll-mt-18 rounded-lg", children: _jsx(FeatureFlagsSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'interactive-agent') && (_jsx("div", { id: "section-interactive-agent", className: "scroll-mt-18 rounded-lg", children: _jsx(InteractiveAgentSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'fab-layout') && (_jsx("div", { id: "section-fab-layout", className: "scroll-mt-18 rounded-lg", children: _jsx(FabLayoutSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'database') && (_jsx("div", { id: "section-database", className: "scroll-mt-18 rounded-lg", children: _jsx(DatabaseSettingsSection, { shipitAiHome: shipitAiHome, dbFileSize: dbFileSize }) }))] })] }));
|
|
62
|
+
}) })] }), _jsxs("div", { className: "flex flex-col gap-3", children: [(activeTab === 'all' || activeTab === 'agent') && (_jsx("div", { id: "section-agent", className: "scroll-mt-18 rounded-lg", children: _jsx(AgentSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'environment') && (_jsx("div", { id: "section-environment", className: "scroll-mt-18 rounded-lg", children: _jsx(EnvironmentSettingsSection, { settings: settings, availableEditors: availableEditors, availableShells: availableShells, availableTerminals: availableTerminals }) })), (activeTab === 'all' || activeTab === 'workflow') && (_jsx("div", { id: "section-workflow", className: "scroll-mt-18 rounded-lg", children: _jsx(WorkflowSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'ci') && (_jsx("div", { id: "section-ci", className: "scroll-mt-18 rounded-lg", children: _jsx(CiSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'stage-timeouts') && (_jsx("div", { id: "section-stage-timeouts", className: "scroll-mt-18 rounded-lg", children: _jsx(StageTimeoutsSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'notifications') && (_jsx("div", { id: "section-notifications", className: "scroll-mt-18 rounded-lg", children: _jsx(NotificationSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'feature-flags') && (_jsx("div", { id: "section-feature-flags", className: "scroll-mt-18 rounded-lg", children: _jsx(FeatureFlagsSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'interactive-agent') && (_jsx("div", { id: "section-interactive-agent", className: "scroll-mt-18 rounded-lg", children: _jsx(InteractiveAgentSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'fab-layout') && (_jsx("div", { id: "section-fab-layout", className: "scroll-mt-18 rounded-lg", children: _jsx(FabLayoutSettingsSection, { settings: settings }) })), (activeTab === 'all' || activeTab === 'database') && (_jsx("div", { id: "section-database", className: "scroll-mt-18 rounded-lg", children: _jsx(DatabaseSettingsSection, { shipitAiHome: shipitAiHome, dbFileSize: dbFileSize }) })), (activeTab === 'all' || activeTab === 'litellm-proxy') && (_jsxs("div", { id: "section-litellm-proxy", className: "scroll-mt-18 rounded-lg", children: [_jsx(LiteLLMProxySettingsSection, { settings: settings }), settings.litellmProxy?.baseUrl ? (_jsx(LiteLLMProxyRoutingSection, { settings: settings })) : null] }))] })] }));
|
|
60
63
|
}
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAsBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,aAAa,EAAE,KAW3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAiB,SAAS,
|
|
1
|
+
{"version":3,"file":"skills-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAiB,SAAS,EAAe,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAeD,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,qBAAqB,2CAqHjE"}
|
|
@@ -24,6 +24,7 @@ function computeCategoryCounts(skills) {
|
|
|
24
24
|
export function SkillsPageClient({ skills }) {
|
|
25
25
|
const [searchQuery, setSearchQuery] = useState('');
|
|
26
26
|
const [activeCategory, setActiveCategory] = useState(null);
|
|
27
|
+
const [sourceFilter, setSourceFilter] = useState(null);
|
|
27
28
|
const [selectedSkill, setSelectedSkill] = useState(null);
|
|
28
29
|
const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);
|
|
29
30
|
const filteredSkills = useMemo(() => {
|
|
@@ -31,6 +32,8 @@ export function SkillsPageClient({ skills }) {
|
|
|
31
32
|
return skills.filter((skill) => {
|
|
32
33
|
if (activeCategory && skill.category !== activeCategory)
|
|
33
34
|
return false;
|
|
35
|
+
if (sourceFilter && skill.source !== sourceFilter)
|
|
36
|
+
return false;
|
|
34
37
|
if (query) {
|
|
35
38
|
const matchesName = skill.name.toLowerCase().includes(query);
|
|
36
39
|
const matchesDescription = skill.description.toLowerCase().includes(query);
|
|
@@ -39,14 +42,15 @@ export function SkillsPageClient({ skills }) {
|
|
|
39
42
|
}
|
|
40
43
|
return true;
|
|
41
44
|
});
|
|
42
|
-
}, [skills, searchQuery, activeCategory]);
|
|
45
|
+
}, [skills, searchQuery, activeCategory, sourceFilter]);
|
|
43
46
|
const clearFilters = () => {
|
|
44
47
|
setSearchQuery('');
|
|
45
48
|
setActiveCategory(null);
|
|
49
|
+
setSourceFilter(null);
|
|
46
50
|
};
|
|
47
51
|
// No skills installed at all
|
|
48
52
|
if (skills.length === 0) {
|
|
49
53
|
return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: "Skills", description: "Claude Code skills installed in this project" }), _jsx(EmptyState, { icon: _jsx(Puzzle, { className: "size-10" }), title: "No skills found", description: "No Claude Code skills are installed. Add skills to .claude/skills/ to get started." })] }));
|
|
50
54
|
}
|
|
51
|
-
return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: "Skills", description: "Claude Code skills installed in this project" }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search skills...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9" })] }), _jsx(CategoryFilter, { activeCategory: activeCategory, onCategoryChange: setActiveCategory, counts: categoryCounts }), filteredSkills.length > 0 ? (_jsx(SkillList, { skills: filteredSkills, onSkillSelect: setSelectedSkill })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: "No matching skills", description: "No skills match your current search and filter criteria.", action: _jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear filters" }) })), _jsx(SkillDetailDrawer, { skill: selectedSkill, onClose: () => setSelectedSkill(null) })] }));
|
|
55
|
+
return (_jsxs("div", { className: "flex flex-col gap-8 p-8", children: [_jsx(PageHeader, { eyebrow: "Developer Portal", title: "Skills", description: "Claude Code skills installed in this project" }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search skills...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9" })] }), _jsx(CategoryFilter, { activeCategory: activeCategory, onCategoryChange: setActiveCategory, counts: categoryCounts }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: sourceFilter === null ? 'default' : 'outline', size: "sm", onClick: () => setSourceFilter(null), children: "All Sources" }), _jsx(Button, { variant: sourceFilter === 'project' ? 'default' : 'outline', size: "sm", onClick: () => setSourceFilter('project'), children: "Project" }), _jsx(Button, { variant: sourceFilter === 'global' ? 'default' : 'outline', size: "sm", onClick: () => setSourceFilter('global'), children: "Global" })] }), filteredSkills.length > 0 ? (_jsx(SkillList, { skills: filteredSkills, onSkillSelect: setSelectedSkill })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: "No matching skills", description: "No skills match your current search and filter criteria.", action: _jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear filters" }) })), _jsx(SkillDetailDrawer, { skill: selectedSkill, onClose: () => setSelectedSkill(null) })] }));
|
|
52
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;AAEhG,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAqLvF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useCallback } from 'react';
|
|
4
|
-
import { Wrench } from 'lucide-react';
|
|
3
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
4
|
+
import { Wrench, Search } from 'lucide-react';
|
|
5
5
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from '../../ui/tabs.js';
|
|
6
|
+
import { Input } from '../../ui/input.js';
|
|
7
|
+
import { Button } from '../../ui/button.js';
|
|
6
8
|
import { cn } from '../../../lib/utils.js';
|
|
7
9
|
import { ToolCard } from './tool-card.js';
|
|
8
10
|
const TAB_FILTER = {
|
|
@@ -15,6 +17,8 @@ const TAB_FILTER = {
|
|
|
15
17
|
export function ToolsPageClient({ tools: initialTools, className }) {
|
|
16
18
|
const [tools, setTools] = useState(initialTools);
|
|
17
19
|
const [activeTab, setActiveTab] = useState('all');
|
|
20
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
21
|
+
const [statusFilter, setStatusFilter] = useState(null);
|
|
18
22
|
const refreshTools = useCallback(async () => {
|
|
19
23
|
try {
|
|
20
24
|
const res = await fetch('/api/tools');
|
|
@@ -27,9 +31,24 @@ export function ToolsPageClient({ tools: initialTools, className }) {
|
|
|
27
31
|
// Silently ignore refresh errors; user can re-navigate to refresh
|
|
28
32
|
}
|
|
29
33
|
}, []);
|
|
30
|
-
const filtered =
|
|
34
|
+
const filtered = useMemo(() => {
|
|
35
|
+
const query = searchQuery.toLowerCase();
|
|
36
|
+
return tools.filter((tool) => {
|
|
37
|
+
if (!TAB_FILTER[activeTab](tool))
|
|
38
|
+
return false;
|
|
39
|
+
if (statusFilter && tool.status.status !== statusFilter)
|
|
40
|
+
return false;
|
|
41
|
+
if (query) {
|
|
42
|
+
const matchesName = tool.name.toLowerCase().includes(query);
|
|
43
|
+
const matchesSummary = tool.summary.toLowerCase().includes(query);
|
|
44
|
+
if (!matchesName && !matchesSummary)
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
}, [tools, activeTab, searchQuery, statusFilter]);
|
|
31
50
|
const installedCount = tools.filter((t) => t.status.status === 'available').length;
|
|
32
|
-
return (_jsxs("div", { "data-testid": "tools-page-client", className: cn('space-y-8', className), children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase", children: "Developer Portal" }) }), _jsxs("div", { className: "flex items-baseline gap-3", children: [_jsx("h1", { className: "text-foreground text-3xl font-black tracking-tight", children: "Tools" }), _jsxs("span", { className: "text-muted-foreground text-sm font-medium", children: [installedCount, " of ", tools.length, " installed"] })] })] }), _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), "data-testid": "tools-page-tabs", children: [_jsxs(TabsList, { "data-editorial": "true", className: "bg-card editorial-shadow h-10 p-1", children: [_jsx(TabsTrigger, { value: "all", "data-testid": "tools-tab-all", className: "cursor-pointer px-4 text-xs font-bold", children: "All" }), _jsx(TabsTrigger, { value: "ide", "data-testid": "tools-tab-ide", className: "cursor-pointer px-4 text-xs font-bold", children: "IDEs" }), _jsx(TabsTrigger, { value: "cli-agent", "data-testid": "tools-tab-cli-agent", className: "cursor-pointer px-4 text-xs font-bold", children: "CLI Agents" }), _jsx(TabsTrigger, { value: "vcs", "data-testid": "tools-tab-vcs", className: "cursor-pointer px-4 text-xs font-bold", children: "Version Control" }), _jsx(TabsTrigger, { value: "terminal", "data-testid": "tools-tab-terminal", className: "cursor-pointer px-4 text-xs font-bold", children: "Terminals" })] }), _jsx(TabsContent, { value: activeTab, className: "mt-6", children: filtered.length === 0 ? (_jsxs("div", { "data-testid": "tools-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-16 text-center", children: [_jsx(Wrench, { className: "mb-3 h-8 w-8 opacity-20" }), _jsx("p", { className: "text-sm", children: "No tools in this category." })] })) : (_jsx("div", { "data-testid": "tools-page-grid",
|
|
51
|
+
return (_jsxs("div", { "data-testid": "tools-page-client", className: cn('space-y-8', className), children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase", children: "Developer Portal" }) }), _jsxs("div", { className: "flex items-baseline gap-3", children: [_jsx("h1", { className: "text-foreground text-3xl font-black tracking-tight", children: "Tools" }), _jsxs("span", { className: "text-muted-foreground text-sm font-medium", children: [installedCount, " of ", tools.length, " installed"] })] })] }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search tools...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9", "data-testid": "tool-search" })] }), _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), "data-testid": "tools-page-tabs", children: [_jsxs(TabsList, { "data-editorial": "true", className: "bg-card editorial-shadow h-10 p-1", children: [_jsx(TabsTrigger, { value: "all", "data-testid": "tools-tab-all", className: "cursor-pointer px-4 text-xs font-bold", children: "All" }), _jsx(TabsTrigger, { value: "ide", "data-testid": "tools-tab-ide", className: "cursor-pointer px-4 text-xs font-bold", children: "IDEs" }), _jsx(TabsTrigger, { value: "cli-agent", "data-testid": "tools-tab-cli-agent", className: "cursor-pointer px-4 text-xs font-bold", children: "CLI Agents" }), _jsx(TabsTrigger, { value: "vcs", "data-testid": "tools-tab-vcs", className: "cursor-pointer px-4 text-xs font-bold", children: "Version Control" }), _jsx(TabsTrigger, { value: "terminal", "data-testid": "tools-tab-terminal", className: "cursor-pointer px-4 text-xs font-bold", children: "Terminals" })] }), _jsxs("div", { className: "mt-4 flex flex-wrap gap-2", "data-testid": "tools-status-filter", children: [_jsx(Button, { variant: statusFilter === null ? 'default' : 'outline', size: "sm", onClick: () => setStatusFilter(null), children: "All" }), _jsx(Button, { variant: statusFilter === 'available' ? 'default' : 'outline', size: "sm", onClick: () => setStatusFilter('available'), children: "Installed" }), _jsx(Button, { variant: statusFilter === 'missing' ? 'default' : 'outline', size: "sm", onClick: () => setStatusFilter('missing'), children: "Not Installed" })] }), _jsx(TabsContent, { value: activeTab, className: "mt-6", children: filtered.length === 0 ? (_jsxs("div", { "data-testid": "tools-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-16 text-center", children: [_jsx(Wrench, { className: "mb-3 h-8 w-8 opacity-20" }), _jsx("p", { className: "text-sm", children: "No tools in this category." })] })) : (_jsx("div", { "data-testid": "tools-page-grid",
|
|
33
52
|
// Editorial density: 3 columns max so cards stay wide enough to
|
|
34
53
|
// give the Stitch "magazine" feel. Previously xl:grid-cols-4 which
|
|
35
54
|
// squeezed cards and reduced background-vs-card contrast.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,GACf,EAAE,eAAe,2CA8RjB"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { usePathname } from 'next/navigation';
|
|
5
|
-
import { Home, Moon, Sun, Volume2, VolumeOff, Zap, ZapOff, Wrench, Puzzle, Settings, } from 'lucide-react';
|
|
5
|
+
import { Home, Moon, Sun, Volume2, VolumeOff, Zap, ZapOff, Wrench, Puzzle, Blocks, Settings, } from 'lucide-react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
7
|
import { Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarMenu, SidebarMenuItem, SidebarMenuButton, useSidebar, } from '../../ui/sidebar.js';
|
|
8
8
|
import { ScrollArea } from '../../ui/scroll-area.js';
|
|
@@ -60,7 +60,7 @@ export function AppSidebar({ features, featureFlags, onFeatureClick, }) {
|
|
|
60
60
|
.filter((g) => g.items.length > 0),
|
|
61
61
|
}));
|
|
62
62
|
}, [features, t]);
|
|
63
|
-
return (_jsxs(Sidebar, { "data-testid": "app-sidebar", "data-no-drawer-close": true, collapsible: "icon", side: i18n.dir() === 'rtl' ? 'right' : 'left', children: [_jsx(SidebarHeader, { children: _jsxs(SidebarMenu, { children: [_jsx(SidebarMenuItem, { children: _jsxs("div", { className: "flex h-10 items-center px-2 group-data-[collapsible=icon]:justify-center", children: [_jsx(ShipitAiLogo, { className: "drop-shadow-[0_0_4px_rgba(34,211,238,0.4)]", size: 32, variant: versionData.isDev ? 'dev' : 'default', isOpen: Boolean(showExpanded && expandedVisible) }), showExpanded && expandedVisible ? (_jsx(VersionBadge, { version: versionData.version, branch: versionData.branch || undefined, commitHash: versionData.commitHash || undefined, isDev: versionData.isDev, packageName: versionData.packageName, description: versionData.description, instancePath: versionData.instancePath || undefined })) : null] }) }), _jsx(SidebarNavItem, { icon: Home, label: t('navigation.controlCenter'), href: "/", active: pathname === '/' }), _jsx(SidebarNavItem, { icon: Wrench, label: t('navigation.tools'), href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: t('navigation.skills'), href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: t('navigation.settings'), href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsx("div", { className: [
|
|
63
|
+
return (_jsxs(Sidebar, { "data-testid": "app-sidebar", "data-no-drawer-close": true, collapsible: "icon", side: i18n.dir() === 'rtl' ? 'right' : 'left', children: [_jsx(SidebarHeader, { children: _jsxs(SidebarMenu, { children: [_jsx(SidebarMenuItem, { children: _jsxs("div", { className: "flex h-10 items-center px-2 group-data-[collapsible=icon]:justify-center", children: [_jsx(ShipitAiLogo, { className: "drop-shadow-[0_0_4px_rgba(34,211,238,0.4)]", size: 32, variant: versionData.isDev ? 'dev' : 'default', isOpen: Boolean(showExpanded && expandedVisible) }), showExpanded && expandedVisible ? (_jsx(VersionBadge, { version: versionData.version, branch: versionData.branch || undefined, commitHash: versionData.commitHash || undefined, isDev: versionData.isDev, packageName: versionData.packageName, description: versionData.description, instancePath: versionData.instancePath || undefined })) : null] }) }), _jsx(SidebarNavItem, { icon: Home, label: t('navigation.controlCenter'), href: "/", active: pathname === '/' }), _jsx(SidebarNavItem, { icon: Wrench, label: t('navigation.tools'), href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: t('navigation.skills'), href: "/skills", active: pathname === '/skills' })) : null, featureFlags.plugins ? (_jsx(SidebarNavItem, { icon: Blocks, label: t('navigation.plugins'), href: "/plugins", active: pathname === '/plugins' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: t('navigation.settings'), href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsx("div", { className: [
|
|
64
64
|
'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',
|
|
65
65
|
'[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
|
|
66
66
|
expandedVisible ? 'opacity-100' : 'opacity-0',
|
package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiB3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA+DnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAIlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KA6BrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAmElC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/feature-flags-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-flags-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/feature-flags-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAe7D,UAAU,yBAAyB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,yBAAyB,2CAElF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAEnD"}
|
|
@@ -13,6 +13,7 @@ export interface FeatureFlagsState {
|
|
|
13
13
|
adoptBranch: boolean;
|
|
14
14
|
gitRebaseSync: boolean;
|
|
15
15
|
reactFileManager: boolean;
|
|
16
|
+
plugins: boolean;
|
|
16
17
|
}
|
|
17
18
|
export declare function getFeatureFlags(): Promise<FeatureFlagsState>;
|
|
18
19
|
/**
|
|
@@ -27,5 +28,6 @@ export declare const featureFlags: {
|
|
|
27
28
|
readonly adoptBranch: boolean;
|
|
28
29
|
readonly gitRebaseSync: boolean;
|
|
29
30
|
readonly reactFileManager: boolean;
|
|
31
|
+
readonly plugins: boolean;
|
|
30
32
|
};
|
|
31
33
|
//# sourceMappingURL=feature-flags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/feature-flags.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/feature-flags.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA+BlE;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;CAyBf,CAAC"}
|
|
@@ -19,6 +19,7 @@ const ENV_FALLBACK_FLAGS = {
|
|
|
19
19
|
adoptBranch: () => false,
|
|
20
20
|
gitRebaseSync: () => false,
|
|
21
21
|
reactFileManager: () => isEnabled(process.env.NEXT_PUBLIC_FLAG_REACT_FILE_MANAGER),
|
|
22
|
+
plugins: () => false,
|
|
22
23
|
};
|
|
23
24
|
export async function getFeatureFlags() {
|
|
24
25
|
try {
|
|
@@ -34,6 +35,7 @@ export async function getFeatureFlags() {
|
|
|
34
35
|
adoptBranch: flags.adoptBranch,
|
|
35
36
|
gitRebaseSync: flags.gitRebaseSync,
|
|
36
37
|
reactFileManager: flags.reactFileManager,
|
|
38
|
+
plugins: flags.plugins,
|
|
37
39
|
};
|
|
38
40
|
}
|
|
39
41
|
}
|
|
@@ -48,6 +50,7 @@ export async function getFeatureFlags() {
|
|
|
48
50
|
adoptBranch: ENV_FALLBACK_FLAGS.adoptBranch(),
|
|
49
51
|
gitRebaseSync: ENV_FALLBACK_FLAGS.gitRebaseSync(),
|
|
50
52
|
reactFileManager: ENV_FALLBACK_FLAGS.reactFileManager(),
|
|
53
|
+
plugins: ENV_FALLBACK_FLAGS.plugins(),
|
|
51
54
|
};
|
|
52
55
|
}
|
|
53
56
|
/**
|
|
@@ -76,4 +79,7 @@ export const featureFlags = {
|
|
|
76
79
|
get reactFileManager() {
|
|
77
80
|
return ENV_FALLBACK_FLAGS.reactFileManager();
|
|
78
81
|
},
|
|
82
|
+
get plugins() {
|
|
83
|
+
return ENV_FALLBACK_FLAGS.plugins();
|
|
84
|
+
},
|
|
79
85
|
};
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
"flags": "العلامات",
|
|
17
17
|
"chat": "المحادثة",
|
|
18
18
|
"layout": "التخطيط",
|
|
19
|
-
"database": "قاعدة البيانات"
|
|
19
|
+
"database": "قاعدة البيانات",
|
|
20
|
+
"proxy": "وكيل LiteLLM"
|
|
20
21
|
},
|
|
21
22
|
"language": {
|
|
22
23
|
"title": "اللغة",
|
|
@@ -209,8 +210,41 @@
|
|
|
209
210
|
"gitRebaseSyncDescription": "تمكين عمليات إعادة التأسيس على main ومزامنة main",
|
|
210
211
|
"reactFileManager": "مدير ملفات React",
|
|
211
212
|
"reactFileManagerDescription": "استخدام مدير ملفات React المدمج بدلاً من منتقي مجلدات نظام التشغيل الأصلي",
|
|
213
|
+
"plugins": "Plugins Marketplace",
|
|
214
|
+
"pluginsDescription": "Enable the Claude Code plugins marketplace browser",
|
|
212
215
|
"hint": "ميزات تجريبية لا تزال قيد التطوير. قم بتمكينها على مسؤوليتك — قد تتغير أو تُزال في الإصدارات المستقبلية. وضع التصحيح يضيف تسجيلًا مفصلاً مفيدًا لاستكشاف الأخطاء."
|
|
213
216
|
},
|
|
217
|
+
"litellmProxy": {
|
|
218
|
+
"title": "LiteLLM Proxy",
|
|
219
|
+
"description": "Configure connection to a LiteLLM proxy for plugin marketplace access",
|
|
220
|
+
"baseUrl": "Proxy URL",
|
|
221
|
+
"baseUrlDescription": "Base URL of your LiteLLM proxy (e.g., http://localhost:4000)",
|
|
222
|
+
"apiKey": "API Key",
|
|
223
|
+
"apiKeyDescription": "Virtual API key for LiteLLM proxy authentication",
|
|
224
|
+
"marketplaceEnabled": "Enable Marketplace",
|
|
225
|
+
"marketplaceEnabledDescription": "Use this proxy for the plugin marketplace catalog",
|
|
226
|
+
"hint": "Connect to a LiteLLM proxy to browse and install Claude Code plugins from your organization's curated marketplace.",
|
|
227
|
+
"testConnection": "Test Connection",
|
|
228
|
+
"testSuccess": "Connection successful",
|
|
229
|
+
"testFailed": "Connection failed",
|
|
230
|
+
"routing": {
|
|
231
|
+
"title": "Proxy Routing (Claude Code)",
|
|
232
|
+
"description": "Configure how Claude Code routes API traffic through LiteLLM",
|
|
233
|
+
"hint": "Control whether Claude Code uses the LiteLLM proxy for API requests. Supports full proxy routing, passthrough for Max/BYOK subscriptions, and model overrides.",
|
|
234
|
+
"mode": "Routing Mode",
|
|
235
|
+
"modeDescription": "How Claude Code routes API traffic",
|
|
236
|
+
"modeDirect": "Direct (own subscription)",
|
|
237
|
+
"modeProxy": "Proxy (full routing)",
|
|
238
|
+
"modePassthrough": "Passthrough (Max/BYOK)",
|
|
239
|
+
"passthroughHelp": "Passthrough mode requires the LiteLLM proxy to have forward_client_headers_to_llm_api or forward_llm_provider_auth_headers enabled.",
|
|
240
|
+
"customHeaders": "Custom Headers",
|
|
241
|
+
"customHeadersDescription": "Newline-separated headers for cost attribution (e.g., x-litellm-customer-id: user-123)",
|
|
242
|
+
"sonnetModel": "Sonnet Model Override",
|
|
243
|
+
"haikuModel": "Haiku Model Override",
|
|
244
|
+
"opusModel": "Opus Model Override",
|
|
245
|
+
"modelOverrideDescription": "Override the default model routed through LiteLLM"
|
|
246
|
+
}
|
|
247
|
+
},
|
|
214
248
|
"interactiveAgent": {
|
|
215
249
|
"title": "الوكيل التفاعلي",
|
|
216
250
|
"description": "إعدادات علامة المحادثة لجلسات الوكيل التفاعلية لكل ميزة",
|
|
@@ -251,7 +285,8 @@
|
|
|
251
285
|
"settings": "الإعدادات",
|
|
252
286
|
"sessions": "الجلسات",
|
|
253
287
|
"tools": "الأدوات",
|
|
254
|
-
"skills": "المهارات"
|
|
288
|
+
"skills": "المهارات",
|
|
289
|
+
"plugins": "Plugins"
|
|
255
290
|
},
|
|
256
291
|
"sidebar": {
|
|
257
292
|
"features": "الميزات",
|
|
@@ -612,6 +647,25 @@
|
|
|
612
647
|
"viewServerLogs": "عرض سجلات الخادم",
|
|
613
648
|
"toggleSidebar": "تبديل الشريط الجانبي"
|
|
614
649
|
},
|
|
650
|
+
"plugins": {
|
|
651
|
+
"title": "Plugins",
|
|
652
|
+
"search": "Search",
|
|
653
|
+
"searchPlaceholder": "Search plugins...",
|
|
654
|
+
"emptyState": "No plugins found",
|
|
655
|
+
"noProxy": "No LiteLLM proxy configured. Go to Settings to set up your proxy URL.",
|
|
656
|
+
"wrongAgent": "Plugin marketplace is only available for Claude Code agent type.",
|
|
657
|
+
"install": "Install",
|
|
658
|
+
"uninstall": "Uninstall",
|
|
659
|
+
"enable": "Enable",
|
|
660
|
+
"disable": "Disable",
|
|
661
|
+
"installed": "Installed",
|
|
662
|
+
"notInstalled": "Not Installed",
|
|
663
|
+
"allCategories": "All Categories",
|
|
664
|
+
"version": "Version",
|
|
665
|
+
"source": "Source",
|
|
666
|
+
"category": "Category",
|
|
667
|
+
"clearFilters": "Clear filters"
|
|
668
|
+
},
|
|
615
669
|
"feature": {
|
|
616
670
|
"create": {
|
|
617
671
|
"permissionMode": "الأذونات",
|