update some crash logs

This commit is contained in:
duanfuxiang
2025-06-17 17:45:02 +08:00
parent d57551dd23
commit 208e14f8e8
5 changed files with 37 additions and 10 deletions

View File

@@ -57,8 +57,15 @@ export class ChatView extends ItemView {
} }
async render() { 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) { if (!this.root) {
this.root = createRoot(this.containerEl.children[1]) this.root = createRoot(containerElement)
} }
const queryClient = new QueryClient({ const queryClient = new QueryClient({
@@ -92,7 +99,7 @@ export class ChatView extends ItemView {
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<React.StrictMode> <React.StrictMode>
<DialogProvider <DialogProvider
container={this.containerEl.children[1] as HTMLElement} container={containerElement}
> >
<Chat ref={this.chatRef} {...this.initialChatProps} /> <Chat ref={this.chatRef} {...this.initialChatProps} />
</DialogProvider> </DialogProvider>

View File

@@ -273,6 +273,11 @@ const McpHubView = () => {
</div> </div>
) : ( ) : (
mcpServers.map(server => { mcpServers.map(server => {
// Add null check for server object
if (!server || !server.name) {
return null;
}
const serverKey = `${server.name}-${server.source || 'global'}`; const serverKey = `${server.name}-${server.source || 'global'}`;
const isExpanded = !!expandedServers[serverKey]; const isExpanded = !!expandedServers[serverKey];
const currentDetailTab = activeServerDetailTab[serverKey] || 'tools'; const currentDetailTab = activeServerDetailTab[serverKey] || 'tools';
@@ -285,7 +290,7 @@ const McpHubView = () => {
{isExpanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />} {isExpanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />}
</div> </div>
<span className={`infio-mcp-hub-status-indicator ${server.status === 'connected' ? 'connected' : server.status === 'connecting' ? 'connecting' : 'disconnected'} ${server.disabled ? 'disabled' : ''}`}></span> <span className={`infio-mcp-hub-status-indicator ${server.status === 'connected' ? 'connected' : server.status === 'connecting' ? 'connecting' : 'disconnected'} ${server.disabled ? 'disabled' : ''}`}></span>
<h3 className="infio-mcp-hub-name">{server.name.replace('infio-builtin-server', 'builtin')}</h3> <h3 className="infio-mcp-hub-name">{server.name ? server.name.replace('infio-builtin-server', 'builtin') : 'Unknown Server'}</h3>
</div> </div>
<div className="infio-mcp-hub-actions" onClick={(e) => e.stopPropagation()}> <div className="infio-mcp-hub-actions" onClick={(e) => e.stopPropagation()}>
@@ -352,7 +357,7 @@ const McpHubView = () => {
<div className="infio-mcp-tab-content"> <div className="infio-mcp-tab-content">
{currentDetailTab === 'tools' && ( {currentDetailTab === 'tools' && (
<div className="infio-mcp-tools-list"> <div className="infio-mcp-tools-list">
{(server.tools && server.tools.length > 0) ? server.tools.map(tool => <ToolRow key={tool.name} tool={tool} />) : <p className="infio-mcp-empty-message">{t('mcpHub.noTools')}</p>} {(server.tools && server.tools.length > 0) ? server.tools.filter(tool => tool && tool.name).map(tool => <ToolRow key={tool.name} tool={tool} />) : <p className="infio-mcp-empty-message">{t('mcpHub.noTools')}</p>}
</div> </div>
)} )}
{currentDetailTab === 'resources' && ( {currentDetailTab === 'resources' && (

View File

@@ -64,7 +64,7 @@ function FileBadge({
className="infio-chat-user-input-file-badge-name-icon" className="infio-chat-user-input-file-badge-name-icon"
/> />
)} )}
<span>{mentionable.file.name}</span> <span>{mentionable.file?.name || 'Unknown File'}</span>
</div> </div>
</BadgeBase> </BadgeBase>
) )
@@ -91,7 +91,7 @@ function FolderBadge({
className="infio-chat-user-input-file-badge-name-icon" className="infio-chat-user-input-file-badge-name-icon"
/> />
)} )}
<span>{mentionable.folder.name}</span> <span>{mentionable.folder?.name || 'Unknown Folder'}</span>
</div> </div>
</BadgeBase> </BadgeBase>
) )
@@ -147,7 +147,7 @@ function CurrentFileBadge({
className="infio-chat-user-input-file-badge-name-icon" className="infio-chat-user-input-file-badge-name-icon"
/> />
)} )}
<span>{mentionable.file.name}</span> <span>{mentionable.file?.name || 'Unknown File'}</span>
</div> </div>
<div className="infio-chat-user-input-file-badge-name-block-suffix"> <div className="infio-chat-user-input-file-badge-name-block-suffix">
{' (Current file)'} {' (Current file)'}
@@ -177,7 +177,7 @@ function BlockBadge({
className="infio-chat-user-input-file-badge-name-block-name-icon" className="infio-chat-user-input-file-badge-name-block-name-icon"
/> />
)} )}
<span>{mentionable.file.name}</span> <span>{mentionable.file?.name || 'Unknown File'}</span>
</div> </div>
<div className="infio-chat-user-input-file-badge-name-block-suffix"> <div className="infio-chat-user-input-file-badge-name-block-suffix">
{` (${mentionable.startLine}:${mentionable.endLine})`} {` (${mentionable.startLine}:${mentionable.endLine})`}
@@ -234,7 +234,7 @@ function ImageBadge({
className="infio-chat-user-input-file-badge-name-icon" className="infio-chat-user-input-file-badge-name-icon"
/> />
)} )}
<span>{mentionable.name}</span> <span>{mentionable.name || 'Unknown Image'}</span>
</div> </div>
</BadgeBase> </BadgeBase>
) )

View File

@@ -27,6 +27,9 @@ export const getEmbeddingModel = (
dangerouslyAllowBrowser: true, dangerouslyAllowBrowser: true,
}) })
const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, 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 { return {
id: settings.embeddingModelId, id: settings.embeddingModelId,
dimension: modelInfo.dimensions, dimension: modelInfo.dimensions,
@@ -89,6 +92,9 @@ export const getEmbeddingModel = (
dangerouslyAllowBrowser: true, dangerouslyAllowBrowser: true,
}) })
const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, 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 { return {
id: settings.embeddingModelId, id: settings.embeddingModelId,
dimension: modelInfo.dimensions, dimension: modelInfo.dimensions,
@@ -151,6 +157,9 @@ export const getEmbeddingModel = (
dangerouslyAllowBrowser: true, dangerouslyAllowBrowser: true,
}) })
const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, 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 { return {
id: settings.embeddingModelId, id: settings.embeddingModelId,
dimension: modelInfo.dimensions, dimension: modelInfo.dimensions,
@@ -213,6 +222,9 @@ export const getEmbeddingModel = (
dangerouslyAllowBrowser: true, dangerouslyAllowBrowser: true,
}) })
const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, 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 { return {
id: settings.embeddingModelId, id: settings.embeddingModelId,
dimension: modelInfo.dimensions, dimension: modelInfo.dimensions,
@@ -271,6 +283,9 @@ export const getEmbeddingModel = (
const client = new GoogleGenerativeAI(settings.googleProvider.apiKey) const client = new GoogleGenerativeAI(settings.googleProvider.apiKey)
const model = client.getGenerativeModel({ model: settings.embeddingModelId }) const model = client.getGenerativeModel({ model: settings.embeddingModelId })
const modelInfo = GetEmbeddingModelInfo(settings.embeddingModelProvider, 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 { return {
id: settings.embeddingModelId, id: settings.embeddingModelId,
dimension: modelInfo.dimensions, dimension: modelInfo.dimensions,

View File

@@ -1760,7 +1760,7 @@ export const GetEmbeddingProviderModelIds = (provider: ApiProvider): string[] =>
return Object.keys(GetEmbeddingProviderModels(provider)) return Object.keys(GetEmbeddingProviderModels(provider))
} }
// Get embedding model info for a provider and model id // 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) const models = GetEmbeddingProviderModels(provider)
return models[modelId] return models[modelId]
} }