🔀 fix: MCP Improvements, Auto-Save Drafts, Artifact Markup (#7040)

* feat: Update MCP tool creation to use lowercase provider name

* refactor: handle MCP image output edge cases where tool outputs must contain string responses

* feat: Drop 'anyOf' and 'oneOf' fields from JSON schema conversion

* feat: Transform 'oneOf' and 'anyOf' fields to Zod union in JSON schema conversion

* fix: artifactPlugin to replace textDirective with expected text, closes #7029

* fix: auto-save functionality to handle conversation transitions from pending drafts, closes #7027

* refactor: improve async handling during user disconnection process

* fix: use correct user ID variable for MCP tool calling

* fix: improve handling of pending drafts in auto-save functionality

* fix: add support for additional model names in getValueKey function

* fix: reset form values on agent deletion when no agents remain
This commit is contained in:
Danny Avila 2025-04-23 18:56:06 -04:00 committed by GitHub
parent 150116eefe
commit 7f1d01c35a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 856 additions and 73 deletions

View file

@ -1,6 +1,6 @@
import debounce from 'lodash/debounce';
import { SetterOrUpdater, useRecoilValue } from 'recoil';
import { useState, useEffect, useMemo, useCallback } from 'react';
import { useState, useEffect, useMemo, useCallback, useRef } from 'react';
import { LocalStorageKeys, Constants } from 'librechat-data-provider';
import type { TFile } from 'librechat-data-provider';
import type { ExtendedFile } from '~/common';
@ -159,6 +159,8 @@ export const useAutoSave = ({
};
}, [conversationId, saveDrafts, textAreaRef]);
const prevConversationIdRef = useRef<string | null>(null);
useEffect(() => {
// This useEffect is responsible for saving the current conversation's draft and
// restoring the new conversation's draft when switching between conversations.
@ -176,7 +178,28 @@ export const useAutoSave = ({
setFiles(new Map());
try {
if (currentConversationId != null && currentConversationId) {
// Check for transition from PENDING_CONVO to a valid conversationId
if (
prevConversationIdRef.current === Constants.PENDING_CONVO &&
conversationId !== Constants.PENDING_CONVO &&
conversationId.length > 3
) {
const pendingDraft = localStorage.getItem(
`${LocalStorageKeys.TEXT_DRAFT}${Constants.PENDING_CONVO}`,
);
// Clear the pending draft, if it exists, and save the current draft to the new conversationId;
// otherwise, save the current text area value to the new conversationId
localStorage.removeItem(`${LocalStorageKeys.TEXT_DRAFT}${Constants.PENDING_CONVO}`);
if (pendingDraft) {
localStorage.setItem(`${LocalStorageKeys.TEXT_DRAFT}${conversationId}`, pendingDraft);
} else if (textAreaRef?.current?.value) {
localStorage.setItem(
`${LocalStorageKeys.TEXT_DRAFT}${conversationId}`,
encodeBase64(textAreaRef.current.value),
);
}
} else if (currentConversationId != null && currentConversationId) {
saveText(currentConversationId);
}
@ -186,11 +209,13 @@ export const useAutoSave = ({
console.error(e);
}
prevConversationIdRef.current = conversationId;
setCurrentConversationId(conversationId);
}, [
conversationId,
currentConversationId,
conversationId,
restoreFiles,
textAreaRef,
restoreText,
saveDrafts,
saveText,