diff --git a/src/ChatView.tsx b/src/ChatView.tsx index daacc9a..21e9d92 100644 --- a/src/ChatView.tsx +++ b/src/ChatView.tsx @@ -57,8 +57,15 @@ export class ChatView extends ItemView { } async render() { + // 确保容器元素存在 + const containerElement = this.containerEl.children[1] + if (!containerElement || !(containerElement instanceof HTMLElement)) { + console.error('ChatView: Container element not found or invalid') + return + } + if (!this.root) { - this.root = createRoot(this.containerEl.children[1]) + this.root = createRoot(containerElement) } const queryClient = new QueryClient({ @@ -92,7 +99,7 @@ export class ChatView extends ItemView { diff --git a/src/components/chat-view/McpHubView.tsx b/src/components/chat-view/McpHubView.tsx index b56a823..ecce6c3 100644 --- a/src/components/chat-view/McpHubView.tsx +++ b/src/components/chat-view/McpHubView.tsx @@ -273,6 +273,11 @@ const McpHubView = () => { ) : ( mcpServers.map(server => { + // Add null check for server object + if (!server || !server.name) { + return null; + } + const serverKey = `${server.name}-${server.source || 'global'}`; const isExpanded = !!expandedServers[serverKey]; const currentDetailTab = activeServerDetailTab[serverKey] || 'tools'; @@ -285,7 +290,7 @@ const McpHubView = () => { {isExpanded ? : } -

{server.name.replace('infio-builtin-server', 'builtin')}

+

{server.name ? server.name.replace('infio-builtin-server', 'builtin') : 'Unknown Server'}

e.stopPropagation()}> @@ -352,7 +357,7 @@ const McpHubView = () => {
{currentDetailTab === 'tools' && (
- {(server.tools && server.tools.length > 0) ? server.tools.map(tool => ) :

{t('mcpHub.noTools')}

} + {(server.tools && server.tools.length > 0) ? server.tools.filter(tool => tool && tool.name).map(tool => ) :

{t('mcpHub.noTools')}

}
)} {currentDetailTab === 'resources' && ( diff --git a/src/components/chat-view/chat-input/MentionableBadge.tsx b/src/components/chat-view/chat-input/MentionableBadge.tsx index e064fd9..c1b6093 100644 --- a/src/components/chat-view/chat-input/MentionableBadge.tsx +++ b/src/components/chat-view/chat-input/MentionableBadge.tsx @@ -64,7 +64,7 @@ function FileBadge({ className="infio-chat-user-input-file-badge-name-icon" /> )} - {mentionable.file.name} + {mentionable.file?.name || 'Unknown File'}
) @@ -91,7 +91,7 @@ function FolderBadge({ className="infio-chat-user-input-file-badge-name-icon" /> )} - {mentionable.folder.name} + {mentionable.folder?.name || 'Unknown Folder'}
) @@ -147,7 +147,7 @@ function CurrentFileBadge({ className="infio-chat-user-input-file-badge-name-icon" /> )} - {mentionable.file.name} + {mentionable.file?.name || 'Unknown File'}
{' (Current file)'} @@ -177,7 +177,7 @@ function BlockBadge({ className="infio-chat-user-input-file-badge-name-block-name-icon" /> )} - {mentionable.file.name} + {mentionable.file?.name || 'Unknown File'}
{` (${mentionable.startLine}:${mentionable.endLine})`} @@ -234,7 +234,7 @@ function ImageBadge({ className="infio-chat-user-input-file-badge-name-icon" /> )} - {mentionable.name} + {mentionable.name || 'Unknown Image'}
) diff --git a/src/core/rag/embedding.ts b/src/core/rag/embedding.ts index 9c8c07c..897cc6a 100644 --- a/src/core/rag/embedding.ts +++ b/src/core/rag/embedding.ts @@ -27,6 +27,9 @@ export const getEmbeddingModel = ( dangerouslyAllowBrowser: true, }) const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, settings.embeddingModelId) + if (!modelInfo) { + throw new Error(`Embedding model ${settings.embeddingModelId} not found for provider ${settings.embeddingModelProvider}`) + } return { id: settings.embeddingModelId, dimension: modelInfo.dimensions, @@ -89,6 +92,9 @@ export const getEmbeddingModel = ( dangerouslyAllowBrowser: true, }) const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, settings.embeddingModelId) + if (!modelInfo) { + throw new Error(`Embedding model ${settings.embeddingModelId} not found for provider ${settings.embeddingModelProvider}`) + } return { id: settings.embeddingModelId, dimension: modelInfo.dimensions, @@ -151,6 +157,9 @@ export const getEmbeddingModel = ( dangerouslyAllowBrowser: true, }) const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, settings.embeddingModelId) + if (!modelInfo) { + throw new Error(`Embedding model ${settings.embeddingModelId} not found for provider ${settings.embeddingModelProvider}`) + } return { id: settings.embeddingModelId, dimension: modelInfo.dimensions, @@ -213,6 +222,9 @@ export const getEmbeddingModel = ( dangerouslyAllowBrowser: true, }) const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, settings.embeddingModelId) + if (!modelInfo) { + throw new Error(`Embedding model ${settings.embeddingModelId} not found for provider ${settings.embeddingModelProvider}`) + } return { id: settings.embeddingModelId, dimension: modelInfo.dimensions, @@ -271,6 +283,9 @@ export const getEmbeddingModel = ( const client = new GoogleGenerativeAI(settings.googleProvider.apiKey) const model = client.getGenerativeModel({ model: settings.embeddingModelId }) const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, settings.embeddingModelId) + if (!modelInfo) { + throw new Error(`Embedding model ${settings.embeddingModelId} not found for provider ${settings.embeddingModelProvider}`) + } return { id: settings.embeddingModelId, dimension: modelInfo.dimensions, diff --git a/src/utils/api.ts b/src/utils/api.ts index a9bffd4..48b3c3b 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -1760,7 +1760,7 @@ export const GetEmbeddingProviderModelIds = (provider: ApiProvider): string[] => return Object.keys(GetEmbeddingProviderModels(provider)) } // Get embedding model info for a provider and model id -export const GetEmbeddingModelInfo = (provider: ApiProvider, modelId: string): EmbeddingModelInfo => { +export const GetEmbeddingModelInfo = (provider: ApiProvider, modelId: string): EmbeddingModelInfo | undefined => { const models = GetEmbeddingProviderModels(provider) return models[modelId] }