@solidxai/core-ui 0.1.7-beta.8 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +215 -0
  2. package/dist/components/auth/SolidLogin.js +1 -1
  3. package/dist/components/auth/SolidLogin.js.map +1 -1
  4. package/dist/components/auth/SolidLogin.tsx +2 -2
  5. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  6. package/dist/components/common/GeneralSettings.js +79 -45
  7. package/dist/components/common/GeneralSettings.js.map +1 -1
  8. package/dist/components/common/GeneralSettings.tsx +94 -45
  9. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +33 -7
  10. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  11. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +132 -40
  12. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  13. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +373 -55
  14. package/dist/components/core/chatter/SolidChatter.d.ts +2 -1
  15. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  16. package/dist/components/core/chatter/SolidChatter.js +2 -2
  17. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  18. package/dist/components/core/chatter/SolidChatter.tsx +2 -1
  19. package/dist/components/core/chatter/SolidChatterHeader.d.ts +1 -0
  20. package/dist/components/core/chatter/SolidChatterHeader.d.ts.map +1 -1
  21. package/dist/components/core/chatter/SolidChatterHeader.js +3 -3
  22. package/dist/components/core/chatter/SolidChatterHeader.js.map +1 -1
  23. package/dist/components/core/chatter/SolidChatterHeader.tsx +4 -3
  24. package/dist/components/core/chatter/SolidMessageComposer.d.ts +2 -1
  25. package/dist/components/core/chatter/SolidMessageComposer.d.ts.map +1 -1
  26. package/dist/components/core/chatter/SolidMessageComposer.js +3 -1
  27. package/dist/components/core/chatter/SolidMessageComposer.js.map +1 -1
  28. package/dist/components/core/chatter/SolidMessageComposer.tsx +3 -1
  29. package/dist/components/core/common/SolidViewLayoutManager.d.ts +17 -0
  30. package/dist/components/core/common/SolidViewLayoutManager.d.ts.map +1 -1
  31. package/dist/components/core/common/SolidViewLayoutManager.js +58 -1
  32. package/dist/components/core/common/SolidViewLayoutManager.js.map +1 -1
  33. package/dist/components/core/common/SolidViewLayoutManager.ts +43 -2
  34. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts +3 -0
  35. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts.map +1 -0
  36. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js +92 -0
  37. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js.map +1 -0
  38. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.tsx +68 -0
  39. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts +3 -0
  40. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts.map +1 -0
  41. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js +87 -0
  42. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js.map +1 -0
  43. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.tsx +70 -0
  44. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts +3 -0
  45. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts.map +1 -0
  46. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js +111 -0
  47. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js.map +1 -0
  48. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.tsx +122 -0
  49. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts +3 -0
  50. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts.map +1 -0
  51. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js +10 -0
  52. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js.map +1 -0
  53. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.tsx +21 -0
  54. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts +8 -0
  55. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts.map +1 -0
  56. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js +62 -0
  57. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js.map +1 -0
  58. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.tsx +27 -0
  59. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts +3 -0
  60. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts.map +1 -0
  61. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js +8 -0
  62. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js.map +1 -0
  63. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.tsx +15 -0
  64. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts +3 -0
  65. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts.map +1 -0
  66. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js +158 -0
  67. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js.map +1 -0
  68. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.tsx +185 -0
  69. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts +17 -0
  70. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts.map +1 -0
  71. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js +52 -0
  72. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js.map +1 -0
  73. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.tsx +83 -0
  74. package/dist/components/core/locales/SolidChatterLocaleTabView.d.ts.map +1 -1
  75. package/dist/components/core/locales/SolidChatterLocaleTabView.js +7 -5
  76. package/dist/components/core/locales/SolidChatterLocaleTabView.js.map +1 -1
  77. package/dist/components/core/locales/SolidChatterLocaleTabView.tsx +3 -0
  78. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.css +38 -0
  79. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts +1 -0
  80. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts.map +1 -1
  81. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js +4 -3
  82. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js.map +1 -1
  83. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.tsx +13 -3
  84. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts +2 -1
  85. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
  86. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +6 -5
  87. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
  88. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +6 -7
  89. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  90. package/dist/components/core/users/CreateUser.js +89 -35
  91. package/dist/components/core/users/CreateUser.js.map +1 -1
  92. package/dist/components/core/users/CreateUser.tsx +291 -165
  93. package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
  94. package/dist/components/layout/SolidAiStudioLayout.js +123 -8
  95. package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
  96. package/dist/components/layout/SolidAiStudioLayout.tsx +70 -6
  97. package/dist/components/shad-cn-ui/SolidTabs.d.ts +2 -1
  98. package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -1
  99. package/dist/components/shad-cn-ui/SolidTabs.js +5 -5
  100. package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -1
  101. package/dist/components/shad-cn-ui/SolidTabs.tsx +6 -0
  102. package/dist/helpers/registry.d.ts.map +1 -1
  103. package/dist/helpers/registry.js +10 -6
  104. package/dist/helpers/registry.js.map +1 -1
  105. package/dist/helpers/registry.ts +11 -7
  106. package/dist/index.d.ts +3 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +3 -0
  109. package/dist/index.js.map +1 -1
  110. package/dist/index.ts +11 -0
  111. package/dist/redux/api/apiKeyApi.d.ts +8 -1
  112. package/dist/redux/api/apiKeyApi.d.ts.map +1 -1
  113. package/dist/redux/api/apiKeyApi.js +12 -1
  114. package/dist/redux/api/apiKeyApi.js.map +1 -1
  115. package/dist/redux/api/apiKeyApi.ts +9 -0
  116. package/dist/redux/store/defaultStoreConfig.d.ts +16 -1
  117. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  118. package/dist/redux/store/defaultStoreConfig.js +3 -1
  119. package/dist/redux/store/defaultStoreConfig.js.map +1 -1
  120. package/dist/redux/store/defaultStoreConfig.ts +3 -1
  121. package/dist/routes/guards/GuestGuard.d.ts +2 -0
  122. package/dist/routes/guards/GuestGuard.d.ts.map +1 -0
  123. package/dist/routes/guards/GuestGuard.js +18 -0
  124. package/dist/routes/guards/GuestGuard.js.map +1 -0
  125. package/dist/routes/guards/GuestGuard.tsx +20 -0
  126. package/dist/routes/solidRoutes.d.ts.map +1 -1
  127. package/dist/routes/solidRoutes.js +2 -1
  128. package/dist/routes/solidRoutes.js.map +1 -1
  129. package/dist/routes/solidRoutes.tsx +2 -1
  130. package/dist/types/solid-core.d.ts +1 -0
  131. package/package.json +1 -1
@@ -1,6 +1,8 @@
1
1
  import { useFormik } from 'formik';
2
2
  import { useCallback, useEffect, useState } from 'react'
3
3
  import { CancelButton } from './CancelButton';
4
+ import { ApiKeysTab } from '../core/users/ApiKeysTab';
5
+ import { useSession } from '../../hooks/useSession';
4
6
  import { SolidButton, SolidDivider, SolidInput, SolidSegmentedControl, SolidSwitch, SolidTabGroup, SolidTextarea } from '../shad-cn-ui';
5
7
  import { usePathname } from "../../hooks/usePathname";
6
8
  import SolidLogo from '../../resources/images/SolidXLogo.svg'
@@ -11,7 +13,7 @@ import { useDropzone } from 'react-dropzone';
11
13
  import { SettingDropzoneActivePlaceholder } from './SolidSettings/SettingDropzoneActivePlaceholder';
12
14
  import { SolidUploadedImage } from './SolidSettings/SolidUploadedImage';
13
15
  import { SettingsImageRemoveButton } from './SolidSettings/SettingsImageRemoveButton';
14
- import { AiModelConfigTab, ModelConfig } from './SolidSettings/LlmSettings/AiModelConfigTab';
16
+ import { ModelConfigTab, ProvidersTab, ModelBehavior, ModelEntry, SolidAiConfig, ensureBuiltInProviders } from './SolidSettings/LlmSettings/AiModelConfigTab';
15
17
  import { useDispatch, useSelector } from 'react-redux';
16
18
  import { ERROR_MESSAGES } from '../../constants/error-messages';
17
19
  import { useBulkUpdateSolidSettingsMutation, useLazyGetSolidSettingsQuery } from '../../redux/api/solidSettingsApi';
@@ -20,6 +22,7 @@ import { showToast } from '../../redux/features/toastSlice';
20
22
 
21
23
 
22
24
  export const GeneralSettings = () => {
25
+ const { data: session } = useSession();
23
26
  const [appLogoPreview, setAppLogoPreview] = useState<string | null>(null);
24
27
  const [companyLogoPreview, setCompanyLogoPreview] = useState<string | null>(null);
25
28
  const [authScreenRightBackgroundImagePreview, setAuthScreenRightBackgroundImagePreview] = useState<string | null>(null);
@@ -66,10 +69,23 @@ export const GeneralSettings = () => {
66
69
  authScreenRightBackgroundImage: solidSettingsData?.data?.authScreenRightBackgroundImage ?? null,
67
70
  authScreenLeftBackgroundImage: solidSettingsData?.data?.authScreenLeftBackgroundImage ?? null,
68
71
  authScreenCenterBackgroundImage: solidSettingsData?.data?.authScreenCenterBackgroundImage ?? null,
69
- solidXGenAiCodeBuilderConfig: solidSettingsData?.data?.solidXGenAiCodeBuilderConfig ?? {
70
- fastModel: { provider: "", availableProviders: [] },
71
- defaultProvider: { provider: "", availableProviders: [] },
72
- }
72
+ solidXGenAiCodeBuilderConfig: (() => {
73
+ const defaultAiConfig: SolidAiConfig = {
74
+ models: {
75
+ default: { providerId: "", model: "", behavior: { streaming: false, custom: "" } },
76
+ fast: { providerId: "", model: "", behavior: { streaming: false, custom: "" } },
77
+ },
78
+ providers: {},
79
+ };
80
+ const raw = solidSettingsData?.data?.solidXGenAiCodeBuilderConfig;
81
+ if (!raw) return defaultAiConfig;
82
+ try {
83
+ const parsed = typeof raw === "string" ? JSON.parse(raw) : raw;
84
+ return (parsed && typeof parsed === "object" ? parsed : defaultAiConfig) as SolidAiConfig;
85
+ } catch {
86
+ return defaultAiConfig;
87
+ }
88
+ })(),
73
89
  // llmProvider: solidSettingsData?.data?.llmProvider ?? null,
74
90
  // llModelName: solidSettingsData?.data?.llModelName ?? null,
75
91
  // llmProviderApiKey: solidSettingsData?.data?.llmProviderApiKey ?? null,
@@ -339,11 +355,8 @@ export const GeneralSettings = () => {
339
355
 
340
356
 
341
357
 
342
- const handleModelConfigChange = (modelType: "fastModel" | "defaultProvider", config: ModelConfig) => {
343
- formik.setFieldValue("solidXGenAiCodeBuilderConfig", {
344
- ...formik.values.solidXGenAiCodeBuilderConfig,
345
- [modelType]: config,
346
- });
358
+ const handleAiConfigChange = (newConfig: SolidAiConfig) => {
359
+ formik.setFieldValue("solidXGenAiCodeBuilderConfig", newConfig);
347
360
  };
348
361
 
349
362
 
@@ -995,10 +1008,14 @@ export const GeneralSettings = () => {
995
1008
  }
996
1009
  {pathname.includes("ai-settings") &&
997
1010
  <AiSettingsSection
998
- fastModelConfig={formik.values.solidXGenAiCodeBuilderConfig.fastModel ?? { provider: "", availableProviders: [] }}
999
- intelligentModelConfig={formik.values.solidXGenAiCodeBuilderConfig.defaultProvider ?? { provider: "", availableProviders: [] }}
1000
- onFastModelChange={(config) => handleModelConfigChange("fastModel", config)}
1001
- onIntelligentModelChange={(config) => handleModelConfigChange("defaultProvider", config)}
1011
+ aiConfig={formik.values.solidXGenAiCodeBuilderConfig as SolidAiConfig}
1012
+ onAiConfigChange={handleAiConfigChange}
1013
+ />
1014
+ }
1015
+ {pathname.includes("api-keys") && session?.user?.id &&
1016
+ <ApiKeysTab
1017
+ userId={session.user.id}
1018
+ canCreate={session?.user?.isAllowedToGenerateApiKeys ?? false}
1002
1019
  />
1003
1020
  }
1004
1021
  </div>
@@ -1009,48 +1026,80 @@ export const GeneralSettings = () => {
1009
1026
  )
1010
1027
  }
1011
1028
 
1012
- const AI_TABS = [
1013
- { key: "fastModel" as const, label: "Fast Model", title: "Fast Model" },
1014
- { key: "defaultProvider" as const, label: "Intelligent Model", title: "Intelligent Model (Reasoning & tool use)" },
1015
- ];
1016
-
1017
1029
  interface AiSettingsSectionProps {
1018
- fastModelConfig: ModelConfig;
1019
- intelligentModelConfig: ModelConfig;
1020
- onFastModelChange: (config: ModelConfig) => void;
1021
- onIntelligentModelChange: (config: ModelConfig) => void;
1030
+ aiConfig: SolidAiConfig;
1031
+ onAiConfigChange: (config: SolidAiConfig) => void;
1022
1032
  }
1023
1033
 
1024
- const AiSettingsSection = ({ fastModelConfig, intelligentModelConfig, onFastModelChange, onIntelligentModelChange }: AiSettingsSectionProps) => {
1025
- const [activeTab, setActiveTab] = useState<"fastModel" | "defaultProvider">("fastModel");
1026
-
1027
- const tabItems = AI_TABS.map((tab) => {
1028
- const config = tab.key === "fastModel" ? fastModelConfig : intelligentModelConfig;
1029
- const onChange = tab.key === "fastModel" ? onFastModelChange : onIntelligentModelChange;
1030
- return {
1031
- value: tab.key,
1032
- label: tab.label,
1033
- content: (
1034
- <div className="space-y-4">
1035
- <p className="solid-settings-subheading">
1036
- {tab.title}
1037
- </p>
1038
- <AiModelConfigTab config={config} onChange={onChange} />
1039
- </div>
1040
- ),
1041
- };
1042
- });
1034
+ const DEFAULT_BEHAVIOR: ModelBehavior = { streaming: false, custom: "" };
1035
+ const DEFAULT_MODEL_ENTRY: ModelEntry = { providerId: "", model: "", behavior: DEFAULT_BEHAVIOR };
1036
+
1037
+ const AiSettingsSection = ({ aiConfig, onAiConfigChange }: AiSettingsSectionProps) => {
1038
+ const [activeTab, setActiveTab] = useState<"providers" | "default" | "fast">("providers");
1039
+ const [showAddProvider, setShowAddProvider] = useState(false);
1040
+
1041
+ const providers = ensureBuiltInProviders(aiConfig.providers ?? {});
1042
+
1043
+ const tabItems = [
1044
+ {
1045
+ value: "providers" as const,
1046
+ label: "Providers",
1047
+ content: (
1048
+ <ProvidersTab
1049
+ providers={providers}
1050
+ onProvidersChange={(newProviders) => {
1051
+ onAiConfigChange({ ...aiConfig, providers: newProviders });
1052
+ }}
1053
+ showAddModal={showAddProvider}
1054
+ onAddModalClose={() => setShowAddProvider(false)}
1055
+ />
1056
+ ),
1057
+ },
1058
+ {
1059
+ value: "default" as const,
1060
+ label: "Intelligent Model",
1061
+ content: (
1062
+ <ModelConfigTab
1063
+ modelEntry={aiConfig.models?.default ?? DEFAULT_MODEL_ENTRY}
1064
+ providers={providers}
1065
+ onModelEntryChange={(entry) => {
1066
+ onAiConfigChange({ ...aiConfig, models: { ...aiConfig.models, default: entry } });
1067
+ }}
1068
+ />
1069
+ ),
1070
+ },
1071
+ {
1072
+ value: "fast" as const,
1073
+ label: "Fast Model",
1074
+ content: (
1075
+ <ModelConfigTab
1076
+ modelEntry={aiConfig.models?.fast ?? DEFAULT_MODEL_ENTRY}
1077
+ providers={providers}
1078
+ onModelEntryChange={(entry) => {
1079
+ onAiConfigChange({ ...aiConfig, models: { ...aiConfig.models, fast: entry } });
1080
+ }}
1081
+ />
1082
+ ),
1083
+ },
1084
+ ];
1043
1085
 
1044
1086
  return (
1045
- <div className="space-y-4">
1046
- <p className="solid-settings-heading">
1087
+ <div>
1088
+ <p className="solid-settings-heading" style={{ marginBottom: "1rem" }}>
1047
1089
  AI Model Configuration
1048
1090
  </p>
1049
1091
  <SolidTabGroup
1050
1092
  tabs={tabItems}
1051
1093
  value={activeTab}
1052
- onValueChange={(value) => setActiveTab(value as "fastModel" | "defaultProvider")}
1094
+ onValueChange={(value) => setActiveTab(value as "providers" | "default" | "fast")}
1053
1095
  tabPosition="left"
1096
+ extra={
1097
+ activeTab === "providers" ? (
1098
+ <SolidButton size="sm" onClick={() => setShowAddProvider(true)}>
1099
+ Add
1100
+ </SolidButton>
1101
+ ) : undefined
1102
+ }
1054
1103
  />
1055
1104
  </div>
1056
1105
  );
@@ -1,11 +1,37 @@
1
- export interface ModelConfig {
2
- provider: string;
3
- availableProviders: any[];
1
+ export interface ModelBehavior {
2
+ streaming: boolean;
3
+ custom: string;
4
4
  }
5
- interface Props {
6
- config: ModelConfig;
7
- onChange: (config: ModelConfig) => void;
5
+ export interface ProviderEntry {
6
+ type: string;
7
+ apiKey: string;
8
+ baseUrl?: string;
8
9
  }
9
- export declare const AiModelConfigTab: ({ config, onChange }: Props) => import("react/jsx-runtime").JSX.Element;
10
+ export interface ModelEntry {
11
+ providerId: string;
12
+ model: string;
13
+ behavior: ModelBehavior;
14
+ }
15
+ export interface SolidAiConfig {
16
+ models: {
17
+ default: ModelEntry;
18
+ fast: ModelEntry;
19
+ };
20
+ providers: Record<string, ProviderEntry>;
21
+ }
22
+ export declare const ensureBuiltInProviders: (providers: Record<string, ProviderEntry>) => Record<string, ProviderEntry>;
23
+ interface ProvidersTabProps {
24
+ providers: Record<string, ProviderEntry>;
25
+ onProvidersChange: (providers: Record<string, ProviderEntry>) => void;
26
+ showAddModal?: boolean;
27
+ onAddModalClose?: () => void;
28
+ }
29
+ export declare const ProvidersTab: ({ providers, onProvidersChange, showAddModal, onAddModalClose }: ProvidersTabProps) => import("react/jsx-runtime").JSX.Element;
30
+ interface ModelConfigTabProps {
31
+ modelEntry: ModelEntry;
32
+ providers: Record<string, ProviderEntry>;
33
+ onModelEntryChange: (entry: ModelEntry) => void;
34
+ }
35
+ export declare const ModelConfigTab: ({ modelEntry, providers, onModelEntryChange }: ModelConfigTabProps) => import("react/jsx-runtime").JSX.Element;
10
36
  export {};
11
37
  //# sourceMappingURL=AiModelConfigTab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiModelConfigTab.d.ts","sourceRoot":"","sources":["../../../../../src/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B;AAED,UAAU,KAAK;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CACzC;AAOD,eAAO,MAAM,gBAAgB,yBAA0B,KAAK,4CAwD3D,CAAC"}
1
+ {"version":3,"file":"AiModelConfigTab.d.ts","sourceRoot":"","sources":["../../../../../src/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,OAAO,EAAE,UAAU,CAAC;QACpB,IAAI,EAAE,UAAU,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAmBD,eAAO,MAAM,sBAAsB,cAAe,OAAO,MAAM,EAAE,aAAa,CAAC,KAAG,OAAO,MAAM,EAAE,aAAa,CAG5G,CAAC;AA+KH,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,IAAI,CAAC;IACtE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,oEAAqE,iBAAiB,4CA+E9G,CAAC;AAIF,UAAU,mBAAmB;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,kBAAkB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACjD;AAED,eAAO,MAAM,cAAc,kDAAmD,mBAAmB,4CA8DhG,CAAC"}
@@ -9,52 +9,144 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
- if (ar || !(i in from)) {
15
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
- ar[i] = from[i];
17
- }
18
- }
19
- return to.concat(ar || Array.prototype.slice.call(from));
20
- };
21
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
22
- import { SolidSelect } from "../../../shad-cn-ui";
23
- import { OpenAiProviderComponent } from "./OpenAiProviderComponent";
24
- import { AnthropicProviderComponent } from "./AnthropicProviderComponent";
25
- var PROVIDER_OPTIONS = [
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
+ import React, { useState } from "react";
14
+ import { SolidButton, SolidDialog, SolidDialogBody, SolidDialogFooter, SolidDialogHeader, SolidDialogTitle, SolidInput, SolidSelect, SolidSwitch, SolidTextarea, } from "../../../shad-cn-ui";
15
+ var PROVIDER_TYPE_OPTIONS = [
26
16
  { label: "OpenAI", value: "openai" },
27
17
  { label: "Anthropic", value: "anthropic" },
18
+ { label: "OpenAI Compatible", value: "openai-compatible" },
19
+ { label: "Anthropic Compatible", value: "anthropic-compatible" },
28
20
  ];
29
- export var AiModelConfigTab = function (_a) {
30
- var _b;
31
- var config = _a.config, onChange = _a.onChange;
32
- var profiles = (_b = config.availableProviders) !== null && _b !== void 0 ? _b : [];
33
- var provider = config.provider;
34
- var handleProviderSelect = function (value) {
35
- var exists = profiles.some(function (p) { return p.provider === value; });
36
- var newProfiles = exists
37
- ? profiles
38
- : __spreadArray(__spreadArray([], profiles, true), [{ id: Date.now().toString(), provider: value }], false);
39
- onChange(__assign(__assign({}, config), { provider: value, availableProviders: newProfiles }));
40
- };
41
- var handleProfileUpdate = function (key, value) {
42
- var _a;
43
- var updatedProfiles;
44
- if (profiles.some(function (p) { return p.provider === provider; })) {
45
- updatedProfiles = profiles.map(function (p) {
46
- var _a;
47
- return p.provider === provider ? __assign(__assign({}, p), (_a = {}, _a[key] = value, _a)) : p;
48
- });
21
+ var COMPATIBLE_TYPES = ["openai-compatible", "anthropic-compatible"];
22
+ var BUILT_IN_TYPES = ["openai", "anthropic"];
23
+ var DEFAULT_BUILT_IN_PROVIDERS = {
24
+ openai: { type: "openai", apiKey: "" },
25
+ anthropic: { type: "anthropic", apiKey: "" },
26
+ };
27
+ export var ensureBuiltInProviders = function (providers) { return (__assign(__assign({}, DEFAULT_BUILT_IN_PROVIDERS), providers)); };
28
+ var cardStyle = {
29
+ border: "1px solid var(--solid-border-color, #e2e8f0)",
30
+ borderRadius: "0.5rem",
31
+ padding: "1.25rem",
32
+ background: "var(--solid-card-bg, var(--solid-surface-bg, transparent))",
33
+ };
34
+ var ProviderModal = function (_a) {
35
+ var _b, _c, _d, _e;
36
+ var visible = _a.visible, onHide = _a.onHide, providers = _a.providers, onProvidersChange = _a.onProvidersChange, editKey = _a.editKey;
37
+ var isEdit = !!editKey;
38
+ var existingEntry = isEdit ? providers[editKey] : null;
39
+ var _f = useState((_b = existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.type) !== null && _b !== void 0 ? _b : ""), providerType = _f[0], setProviderType = _f[1];
40
+ var _g = useState(editKey && !BUILT_IN_TYPES.includes(editKey) ? editKey : ""), providerName = _g[0], setProviderName = _g[1];
41
+ var _h = useState((_c = existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.baseUrl) !== null && _c !== void 0 ? _c : ""), providerBaseUrl = _h[0], setProviderBaseUrl = _h[1];
42
+ var _j = useState((_d = existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.apiKey) !== null && _d !== void 0 ? _d : ""), providerApiKey = _j[0], setProviderApiKey = _j[1];
43
+ var isCompatible = COMPATIBLE_TYPES.includes(providerType);
44
+ // Reset state when modal opens with new data
45
+ React.useEffect(function () {
46
+ var _a, _b, _c;
47
+ if (visible) {
48
+ var entry = editKey ? providers[editKey] : null;
49
+ setProviderType((_a = entry === null || entry === void 0 ? void 0 : entry.type) !== null && _a !== void 0 ? _a : "");
50
+ setProviderName(editKey && !BUILT_IN_TYPES.includes(editKey) ? editKey : "");
51
+ setProviderBaseUrl((_b = entry === null || entry === void 0 ? void 0 : entry.baseUrl) !== null && _b !== void 0 ? _b : "");
52
+ setProviderApiKey((_c = entry === null || entry === void 0 ? void 0 : entry.apiKey) !== null && _c !== void 0 ? _c : "");
53
+ }
54
+ }, [visible, editKey]);
55
+ // In add mode, only show compatible types (built-ins are always pre-added)
56
+ // In edit mode, show all types but lock the value
57
+ var typeOptions = isEdit
58
+ ? PROVIDER_TYPE_OPTIONS
59
+ : PROVIDER_TYPE_OPTIONS.filter(function (opt) { return COMPATIBLE_TYPES.includes(opt.value); });
60
+ var handleSave = function () {
61
+ if (!providerType)
62
+ return;
63
+ var key;
64
+ var entry = { type: providerType, apiKey: providerApiKey };
65
+ if (isCompatible) {
66
+ if (!providerName.trim())
67
+ return;
68
+ key = providerName.trim();
69
+ entry.baseUrl = providerBaseUrl;
49
70
  }
50
71
  else {
51
- updatedProfiles = __spreadArray(__spreadArray([], profiles, true), [
52
- (_a = { id: Date.now().toString(), provider: provider }, _a[key] = value, _a),
53
- ], false);
72
+ key = providerType;
54
73
  }
55
- onChange(__assign(__assign({}, config), { availableProviders: updatedProfiles }));
74
+ // In add mode, don't overwrite existing
75
+ if (!isEdit && providers[key])
76
+ return;
77
+ var next = __assign({}, providers);
78
+ // If editing and key changed (shouldn't happen for built-in), remove old
79
+ if (isEdit && editKey !== key) {
80
+ delete next[editKey];
81
+ }
82
+ next[key] = entry;
83
+ onProvidersChange(next);
84
+ onHide();
85
+ };
86
+ var handleRemove = function () {
87
+ if (!editKey)
88
+ return;
89
+ var next = __assign({}, providers);
90
+ delete next[editKey];
91
+ onProvidersChange(next);
92
+ onHide();
93
+ };
94
+ var canSave = providerType && (isCompatible ? providerName.trim() : true);
95
+ return (_jsxs(SolidDialog, { open: visible, onOpenChange: function (open) { return !open && onHide(); }, style: { width: "500px" }, children: [_jsx(SolidDialogHeader, { children: _jsx(SolidDialogTitle, { children: isEdit
96
+ ? "Edit Provider \u2014 ".concat(BUILT_IN_TYPES.includes(editKey) ? (_e = PROVIDER_TYPE_OPTIONS.find(function (o) { return o.value === editKey; })) === null || _e === void 0 ? void 0 : _e.label : editKey)
97
+ : "Add Provider" }) }), _jsx(SolidDialogBody, { children: _jsxs("div", { className: "flex flex-column gap-3", children: [!(isEdit && BUILT_IN_TYPES.includes(editKey)) && (_jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "Provider Type" }), _jsx(SolidSelect, { className: "w-full", value: providerType, options: typeOptions, onChange: function (e) {
98
+ setProviderType(e.value);
99
+ if (!isEdit) {
100
+ setProviderName("");
101
+ setProviderBaseUrl("");
102
+ }
103
+ }, placeholder: "Select Provider Type", disabled: isEdit })] })), isCompatible && (_jsxs(_Fragment, { children: [!isEdit && (_jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "Name (unique identifier)" }), _jsx(SolidInput, { placeholder: "e.g. openrouter, together-ai", value: providerName, onChange: function (e) { return setProviderName(e.target.value); }, className: "w-full" })] })), _jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "Base URL" }), _jsx(SolidInput, { placeholder: "https://openrouter.ai/api/v1", value: providerBaseUrl, onChange: function (e) { return setProviderBaseUrl(e.target.value); }, className: "w-full" })] })] })), _jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "API Key" }), _jsx(SolidInput, { type: "password", value: providerApiKey, onChange: function (e) { return setProviderApiKey(e.target.value); }, className: "w-full" })] })] }) }), _jsx(SolidDialogFooter, { children: _jsxs("div", { className: "flex justify-content-between w-full", children: [_jsx("div", { children: isEdit && !BUILT_IN_TYPES.includes(editKey) && (_jsx(SolidButton, { variant: "ghost", onClick: handleRemove, style: { color: "var(--solid-danger-color, #ef4444)" }, children: "Remove" })) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(SolidButton, { variant: "outline", onClick: onHide, children: "Cancel" }), _jsx(SolidButton, { onClick: handleSave, disabled: !canSave, children: isEdit ? "Save" : "Add" })] })] }) })] }));
104
+ };
105
+ export var ProvidersTab = function (_a) {
106
+ var providers = _a.providers, onProvidersChange = _a.onProvidersChange, showAddModal = _a.showAddModal, onAddModalClose = _a.onAddModalClose;
107
+ var _b = useState(null), editKey = _b[0], setEditKey = _b[1];
108
+ var _c = useState(false), modalVisible = _c[0], setModalVisible = _c[1];
109
+ // Ensure built-in providers are always present
110
+ var allProviders = ensureBuiltInProviders(providers);
111
+ // Open modal when parent triggers add
112
+ React.useEffect(function () {
113
+ if (showAddModal) {
114
+ setEditKey(null);
115
+ setModalVisible(true);
116
+ }
117
+ }, [showAddModal]);
118
+ var providerEntries = Object.entries(allProviders);
119
+ var handleRowClick = function (key) {
120
+ setEditKey(key);
121
+ setModalVisible(true);
56
122
  };
57
- var currentProfile = profiles.find(function (p) { return p.provider === provider; }) || null;
58
- return (_jsxs("div", { className: "ai-model-config-tab", children: [_jsxs("div", { className: "flex flex-column gap-2", children: [_jsx("label", { className: "form-field-label", children: "Provider" }), _jsx(SolidSelect, { className: "w-full", value: provider, options: PROVIDER_OPTIONS, onChange: function (e) { return handleProviderSelect(e.value); }, placeholder: "Select Provider" })] }), provider === "openai" && (_jsx(OpenAiProviderComponent, { profile: currentProfile, onUpdate: handleProfileUpdate })), provider === "anthropic" && (_jsx(AnthropicProviderComponent, { profile: currentProfile, onUpdate: handleProfileUpdate }))] }));
123
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "solid-simple-table", children: _jsxs("table", { style: { width: "100%" }, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: { textAlign: "left", padding: "0.75rem 1rem" }, children: "Name" }), _jsx("th", { style: { textAlign: "left", padding: "0.75rem 1rem" }, children: "Type" }), _jsx("th", { style: { textAlign: "left", padding: "0.75rem 1rem" }, children: "API Key" }), _jsx("th", { style: { textAlign: "left", padding: "0.75rem 1rem" }, children: "Base URL" })] }) }), _jsxs("tbody", { children: [providerEntries.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: 4, style: { textAlign: "center", padding: "2rem 1rem", opacity: 0.5 }, children: "No providers configured." }) })), providerEntries.map(function (_a) {
124
+ var _b, _c;
125
+ var key = _a[0], entry = _a[1];
126
+ var typeLabel = (_c = (_b = PROVIDER_TYPE_OPTIONS.find(function (o) { return o.value === entry.type; })) === null || _b === void 0 ? void 0 : _b.label) !== null && _c !== void 0 ? _c : entry.type;
127
+ var isBuiltIn = BUILT_IN_TYPES.includes(key);
128
+ var displayName = isBuiltIn ? typeLabel : key;
129
+ var maskedKey = entry.apiKey ? "\u2022".repeat(Math.min(entry.apiKey.length, 8)) : "-";
130
+ return (_jsxs("tr", { onClick: function () { return handleRowClick(key); }, style: { cursor: "pointer" }, className: "solid-table-row-hover", children: [_jsx("td", { style: { padding: "0.75rem 1rem", fontWeight: 500 }, children: displayName }), _jsx("td", { style: { padding: "0.75rem 1rem" }, children: typeLabel }), _jsx("td", { style: { padding: "0.75rem 1rem" }, children: maskedKey }), _jsx("td", { style: { padding: "0.75rem 1rem" }, children: entry.baseUrl || "-" })] }, key));
131
+ })] })] }) }), _jsx(ProviderModal, { visible: modalVisible, onHide: function () {
132
+ setModalVisible(false);
133
+ setEditKey(null);
134
+ onAddModalClose === null || onAddModalClose === void 0 ? void 0 : onAddModalClose();
135
+ }, providers: allProviders, onProvidersChange: onProvidersChange, editKey: editKey })] }));
136
+ };
137
+ export var ModelConfigTab = function (_a) {
138
+ var modelEntry = _a.modelEntry, providers = _a.providers, onModelEntryChange = _a.onModelEntryChange;
139
+ var providerOptions = Object.entries(providers).map(function (_a) {
140
+ var _b, _c;
141
+ var key = _a[0], entry = _a[1];
142
+ var typeLabel = (_c = (_b = PROVIDER_TYPE_OPTIONS.find(function (o) { return o.value === entry.type; })) === null || _b === void 0 ? void 0 : _b.label) !== null && _c !== void 0 ? _c : entry.type;
143
+ var label = BUILT_IN_TYPES.includes(key) ? typeLabel : "".concat(key, " (").concat(typeLabel, ")");
144
+ return { label: label, value: key };
145
+ });
146
+ return (_jsxs("div", { className: "flex flex-column gap-4", children: [_jsxs("div", { style: __assign(__assign({}, cardStyle), { width: "50%" }), children: [_jsx("p", { className: "solid-settings-subheading", children: "Model Config" }), _jsxs("div", { className: "flex flex-column gap-3 mt-3", children: [_jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "Provider" }), _jsx(SolidSelect, { className: "w-full", value: modelEntry.providerId, options: providerOptions, onChange: function (e) { return onModelEntryChange(__assign(__assign({}, modelEntry), { providerId: e.value })); }, placeholder: "Select Provider" })] }), _jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "Model" }), _jsx(SolidInput, { placeholder: "e.g. gpt-4o-mini", value: modelEntry.model || "", onChange: function (e) { return onModelEntryChange(__assign(__assign({}, modelEntry), { model: e.target.value })); }, className: "w-full" })] })] })] }), _jsxs("div", { style: __assign(__assign({}, cardStyle), { width: "50%" }), children: [_jsx("p", { className: "solid-settings-subheading", children: "Behavior" }), _jsxs("div", { className: "flex flex-column gap-3 mt-3", children: [_jsxs("div", { className: "flex align-items-center gap-2", children: [_jsx(SolidSwitch, { checked: modelEntry.behavior.streaming, onChange: function (val) {
147
+ return onModelEntryChange(__assign(__assign({}, modelEntry), { behavior: __assign(__assign({}, modelEntry.behavior), { streaming: val }) }));
148
+ } }), _jsx("label", { className: "form-field-label", style: { marginBottom: 0 }, children: "Streaming" })] }), _jsxs("div", { children: [_jsx("label", { className: "form-field-label", children: "Custom Params (JSON)" }), _jsx(SolidTextarea, { value: modelEntry.behavior.custom, onChange: function (e) {
149
+ return onModelEntryChange(__assign(__assign({}, modelEntry), { behavior: __assign(__assign({}, modelEntry.behavior), { custom: e.target.value }) }));
150
+ }, placeholder: '{ "temperature": 0.7, "maxTokens": 1000 }', rows: 4, className: "w-full" })] })] })] })] }));
59
151
  };
60
152
  //# sourceMappingURL=AiModelConfigTab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiModelConfigTab.js","sourceRoot":"","sources":["../../../../../src/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx"],"names":[],"mappings":"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","sourcesContent":["import { SolidSelect } from \"../../../shad-cn-ui\";\nimport { OpenAiProviderComponent } from \"./OpenAiProviderComponent\";\nimport { AnthropicProviderComponent } from \"./AnthropicProviderComponent\";\n\nexport interface ModelConfig {\n provider: string;\n availableProviders: any[];\n}\n\ninterface Props {\n config: ModelConfig;\n onChange: (config: ModelConfig) => void;\n}\n\nconst PROVIDER_OPTIONS = [\n { label: \"OpenAI\", value: \"openai\" },\n { label: \"Anthropic\", value: \"anthropic\" },\n];\n\nexport const AiModelConfigTab = ({ config, onChange }: Props) => {\n const profiles = config.availableProviders ?? [];\n const provider = config.provider;\n\n const handleProviderSelect = (value: string) => {\n const exists = profiles.some((p: any) => p.provider === value);\n const newProfiles = exists\n ? profiles\n : [...profiles, { id: Date.now().toString(), provider: value }];\n onChange({ ...config, provider: value, availableProviders: newProfiles });\n };\n\n const handleProfileUpdate = (key: string, value: string) => {\n let updatedProfiles: any[];\n if (profiles.some((p: any) => p.provider === provider)) {\n updatedProfiles = profiles.map((p: any) =>\n p.provider === provider ? { ...p, [key]: value } : p\n );\n } else {\n updatedProfiles = [\n ...profiles,\n { id: Date.now().toString(), provider, [key]: value },\n ];\n }\n onChange({ ...config, availableProviders: updatedProfiles });\n };\n\n const currentProfile =\n profiles.find((p: any) => p.provider === provider) || null;\n\n return (\n <div className=\"ai-model-config-tab\">\n <div className=\"flex flex-column gap-2\">\n <label className=\"form-field-label\">Provider</label>\n <SolidSelect\n className=\"w-full\"\n value={provider}\n options={PROVIDER_OPTIONS}\n onChange={(e) => handleProviderSelect(e.value)}\n placeholder=\"Select Provider\"\n />\n </div>\n {provider === \"openai\" && (\n <OpenAiProviderComponent\n profile={currentProfile}\n onUpdate={handleProfileUpdate}\n />\n )}\n {provider === \"anthropic\" && (\n <AnthropicProviderComponent\n profile={currentProfile}\n onUpdate={handleProfileUpdate}\n />\n )}\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"AiModelConfigTab.js","sourceRoot":"","sources":["../../../../../src/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from \"react\";\nimport {\n SolidButton,\n SolidDialog,\n SolidDialogBody,\n SolidDialogFooter,\n SolidDialogHeader,\n SolidDialogTitle,\n SolidInput,\n SolidSelect,\n SolidSwitch,\n SolidTextarea,\n} from \"../../../shad-cn-ui\";\n\n\nexport interface ModelBehavior {\n streaming: boolean;\n custom: string;\n}\n\nexport interface ProviderEntry {\n type: string;\n apiKey: string;\n baseUrl?: string;\n}\n\nexport interface ModelEntry {\n providerId: string;\n model: string;\n behavior: ModelBehavior;\n}\n\nexport interface SolidAiConfig {\n models: {\n default: ModelEntry;\n fast: ModelEntry;\n };\n providers: Record<string, ProviderEntry>;\n}\n\n\nconst PROVIDER_TYPE_OPTIONS = [\n { label: \"OpenAI\", value: \"openai\" },\n { label: \"Anthropic\", value: \"anthropic\" },\n { label: \"OpenAI Compatible\", value: \"openai-compatible\" },\n { label: \"Anthropic Compatible\", value: \"anthropic-compatible\" },\n];\n\nconst COMPATIBLE_TYPES = [\"openai-compatible\", \"anthropic-compatible\"];\n\nconst BUILT_IN_TYPES = [\"openai\", \"anthropic\"];\n\nconst DEFAULT_BUILT_IN_PROVIDERS: Record<string, ProviderEntry> = {\n openai: { type: \"openai\", apiKey: \"\" },\n anthropic: { type: \"anthropic\", apiKey: \"\" },\n};\n\nexport const ensureBuiltInProviders = (providers: Record<string, ProviderEntry>): Record<string, ProviderEntry> => ({\n ...DEFAULT_BUILT_IN_PROVIDERS,\n ...providers,\n});\n\nconst cardStyle: React.CSSProperties = {\n border: \"1px solid var(--solid-border-color, #e2e8f0)\",\n borderRadius: \"0.5rem\",\n padding: \"1.25rem\",\n background: \"var(--solid-card-bg, var(--solid-surface-bg, transparent))\",\n};\n\n\ninterface ProviderModalProps {\n visible: boolean;\n onHide: () => void;\n providers: Record<string, ProviderEntry>;\n onProvidersChange: (providers: Record<string, ProviderEntry>) => void;\n editKey?: string | null; // null = add mode, string = edit mode\n}\n\nconst ProviderModal = ({ visible, onHide, providers, onProvidersChange, editKey }: ProviderModalProps) => {\n const isEdit = !!editKey;\n const existingEntry = isEdit ? providers[editKey] : null;\n\n const [providerType, setProviderType] = useState(existingEntry?.type ?? \"\");\n const [providerName, setProviderName] = useState(editKey && !BUILT_IN_TYPES.includes(editKey) ? editKey : \"\");\n const [providerBaseUrl, setProviderBaseUrl] = useState(existingEntry?.baseUrl ?? \"\");\n const [providerApiKey, setProviderApiKey] = useState(existingEntry?.apiKey ?? \"\");\n\n const isCompatible = COMPATIBLE_TYPES.includes(providerType);\n\n // Reset state when modal opens with new data\n React.useEffect(() => {\n if (visible) {\n const entry = editKey ? providers[editKey] : null;\n setProviderType(entry?.type ?? \"\");\n setProviderName(editKey && !BUILT_IN_TYPES.includes(editKey) ? editKey : \"\");\n setProviderBaseUrl(entry?.baseUrl ?? \"\");\n setProviderApiKey(entry?.apiKey ?? \"\");\n }\n }, [visible, editKey]);\n\n // In add mode, only show compatible types (built-ins are always pre-added)\n // In edit mode, show all types but lock the value\n const typeOptions = isEdit\n ? PROVIDER_TYPE_OPTIONS\n : PROVIDER_TYPE_OPTIONS.filter((opt) => COMPATIBLE_TYPES.includes(opt.value));\n\n const handleSave = () => {\n if (!providerType) return;\n\n let key: string;\n const entry: ProviderEntry = { type: providerType, apiKey: providerApiKey };\n\n if (isCompatible) {\n if (!providerName.trim()) return;\n key = providerName.trim();\n entry.baseUrl = providerBaseUrl;\n } else {\n key = providerType;\n }\n\n // In add mode, don't overwrite existing\n if (!isEdit && providers[key]) return;\n\n const next = { ...providers };\n\n // If editing and key changed (shouldn't happen for built-in), remove old\n if (isEdit && editKey !== key) {\n delete next[editKey!];\n }\n\n next[key] = entry;\n onProvidersChange(next);\n onHide();\n };\n\n const handleRemove = () => {\n if (!editKey) return;\n const next = { ...providers };\n delete next[editKey];\n onProvidersChange(next);\n onHide();\n };\n\n const canSave = providerType && (isCompatible ? providerName.trim() : true);\n\n return (\n <SolidDialog open={visible} onOpenChange={(open) => !open && onHide()} style={{ width: \"500px\" }}>\n <SolidDialogHeader>\n <SolidDialogTitle>\n {isEdit\n ? `Edit Provider — ${BUILT_IN_TYPES.includes(editKey!) ? PROVIDER_TYPE_OPTIONS.find((o) => o.value === editKey)?.label : editKey}`\n : \"Add Provider\"}\n </SolidDialogTitle>\n </SolidDialogHeader>\n <SolidDialogBody>\n <div className=\"flex flex-column gap-3\">\n {!(isEdit && BUILT_IN_TYPES.includes(editKey!)) && (\n <div>\n <label className=\"form-field-label\">Provider Type</label>\n <SolidSelect\n className=\"w-full\"\n value={providerType}\n options={typeOptions}\n onChange={(e) => {\n setProviderType(e.value);\n if (!isEdit) {\n setProviderName(\"\");\n setProviderBaseUrl(\"\");\n }\n }}\n placeholder=\"Select Provider Type\"\n disabled={isEdit}\n />\n </div>\n )}\n {isCompatible && (\n <>\n {!isEdit && (\n <div>\n <label className=\"form-field-label\">Name (unique identifier)</label>\n <SolidInput\n placeholder=\"e.g. openrouter, together-ai\"\n value={providerName}\n onChange={(e) => setProviderName(e.target.value)}\n className=\"w-full\"\n />\n </div>\n )}\n <div>\n <label className=\"form-field-label\">Base URL</label>\n <SolidInput\n placeholder=\"https://openrouter.ai/api/v1\"\n value={providerBaseUrl}\n onChange={(e) => setProviderBaseUrl(e.target.value)}\n className=\"w-full\"\n />\n </div>\n </>\n )}\n <div>\n <label className=\"form-field-label\">API Key</label>\n <SolidInput\n type=\"password\"\n value={providerApiKey}\n onChange={(e) => setProviderApiKey(e.target.value)}\n className=\"w-full\"\n />\n </div>\n </div>\n </SolidDialogBody>\n <SolidDialogFooter>\n <div className=\"flex justify-content-between w-full\">\n <div>\n {isEdit && !BUILT_IN_TYPES.includes(editKey!) && (\n <SolidButton variant=\"ghost\" onClick={handleRemove} style={{ color: \"var(--solid-danger-color, #ef4444)\" }}>\n Remove\n </SolidButton>\n )}\n </div>\n <div className=\"flex gap-2\">\n <SolidButton variant=\"outline\" onClick={onHide}>\n Cancel\n </SolidButton>\n <SolidButton onClick={handleSave} disabled={!canSave}>\n {isEdit ? \"Save\" : \"Add\"}\n </SolidButton>\n </div>\n </div>\n </SolidDialogFooter>\n </SolidDialog>\n );\n};\n\n// --- Providers Tab (List View) ---\n\ninterface ProvidersTabProps {\n providers: Record<string, ProviderEntry>;\n onProvidersChange: (providers: Record<string, ProviderEntry>) => void;\n showAddModal?: boolean;\n onAddModalClose?: () => void;\n}\n\nexport const ProvidersTab = ({ providers, onProvidersChange, showAddModal, onAddModalClose }: ProvidersTabProps) => {\n const [editKey, setEditKey] = useState<string | null>(null);\n const [modalVisible, setModalVisible] = useState(false);\n\n // Ensure built-in providers are always present\n const allProviders = ensureBuiltInProviders(providers);\n\n // Open modal when parent triggers add\n React.useEffect(() => {\n if (showAddModal) {\n setEditKey(null);\n setModalVisible(true);\n }\n }, [showAddModal]);\n\n const providerEntries = Object.entries(allProviders);\n\n const handleRowClick = (key: string) => {\n setEditKey(key);\n setModalVisible(true);\n };\n\n return (\n <>\n <div className=\"solid-simple-table\">\n <table style={{ width: \"100%\" }}>\n <thead>\n <tr>\n <th style={{ textAlign: \"left\", padding: \"0.75rem 1rem\" }}>Name</th>\n <th style={{ textAlign: \"left\", padding: \"0.75rem 1rem\" }}>Type</th>\n <th style={{ textAlign: \"left\", padding: \"0.75rem 1rem\" }}>API Key</th>\n <th style={{ textAlign: \"left\", padding: \"0.75rem 1rem\" }}>Base URL</th>\n </tr>\n </thead>\n <tbody>\n {providerEntries.length === 0 && (\n <tr>\n <td colSpan={4} style={{ textAlign: \"center\", padding: \"2rem 1rem\", opacity: 0.5 }}>\n No providers configured.\n </td>\n </tr>\n )}\n {providerEntries.map(([key, entry]) => {\n const typeLabel = PROVIDER_TYPE_OPTIONS.find((o) => o.value === entry.type)?.label ?? entry.type;\n const isBuiltIn = BUILT_IN_TYPES.includes(key);\n const displayName = isBuiltIn ? typeLabel : key;\n const maskedKey = entry.apiKey ? \"\\u2022\".repeat(Math.min(entry.apiKey.length, 8)) : \"-\";\n\n return (\n <tr\n key={key}\n onClick={() => handleRowClick(key)}\n style={{ cursor: \"pointer\" }}\n className=\"solid-table-row-hover\"\n >\n <td style={{ padding: \"0.75rem 1rem\", fontWeight: 500 }}>{displayName}</td>\n <td style={{ padding: \"0.75rem 1rem\" }}>{typeLabel}</td>\n <td style={{ padding: \"0.75rem 1rem\" }}>{maskedKey}</td>\n <td style={{ padding: \"0.75rem 1rem\" }}>{entry.baseUrl || \"-\"}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n <ProviderModal\n visible={modalVisible}\n onHide={() => {\n setModalVisible(false);\n setEditKey(null);\n onAddModalClose?.();\n }}\n providers={allProviders}\n onProvidersChange={onProvidersChange}\n editKey={editKey}\n />\n </>\n );\n};\n\n// --- Model Config Tab (used for Intelligent Model & Fast Model) ---\n\ninterface ModelConfigTabProps {\n modelEntry: ModelEntry;\n providers: Record<string, ProviderEntry>;\n onModelEntryChange: (entry: ModelEntry) => void;\n}\n\nexport const ModelConfigTab = ({ modelEntry, providers, onModelEntryChange }: ModelConfigTabProps) => {\n const providerOptions = Object.entries(providers).map(([key, entry]) => {\n const typeLabel = PROVIDER_TYPE_OPTIONS.find((o) => o.value === entry.type)?.label ?? entry.type;\n const label = BUILT_IN_TYPES.includes(key) ? typeLabel : `${key} (${typeLabel})`;\n return { label, value: key };\n });\n\n return (\n <div className=\"flex flex-column gap-4\">\n <div style={{ ...cardStyle, width: \"50%\" }}>\n <p className=\"solid-settings-subheading\">Model Config</p>\n <div className=\"flex flex-column gap-3 mt-3\">\n <div>\n <label className=\"form-field-label\">Provider</label>\n <SolidSelect\n className=\"w-full\"\n value={modelEntry.providerId}\n options={providerOptions}\n onChange={(e) => onModelEntryChange({ ...modelEntry, providerId: e.value })}\n placeholder=\"Select Provider\"\n />\n </div>\n <div>\n <label className=\"form-field-label\">Model</label>\n <SolidInput\n placeholder=\"e.g. gpt-4o-mini\"\n value={modelEntry.model || \"\"}\n onChange={(e) => onModelEntryChange({ ...modelEntry, model: e.target.value })}\n className=\"w-full\"\n />\n </div>\n </div>\n </div>\n\n <div style={{ ...cardStyle, width: \"50%\" }}>\n <p className=\"solid-settings-subheading\">Behavior</p>\n <div className=\"flex flex-column gap-3 mt-3\">\n <div className=\"flex align-items-center gap-2\">\n <SolidSwitch\n checked={modelEntry.behavior.streaming}\n onChange={(val) =>\n onModelEntryChange({ ...modelEntry, behavior: { ...modelEntry.behavior, streaming: val } })\n }\n />\n <label className=\"form-field-label\" style={{ marginBottom: 0 }}>Streaming</label>\n </div>\n <div>\n <label className=\"form-field-label\">Custom Params (JSON)</label>\n <SolidTextarea\n value={modelEntry.behavior.custom}\n onChange={(e) =>\n onModelEntryChange({ ...modelEntry, behavior: { ...modelEntry.behavior, custom: e.target.value } })\n }\n placeholder='{ \"temperature\": 0.7, \"maxTokens\": 1000 }'\n rows={4}\n className=\"w-full\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n"]}