mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-02-07 02:01:50 +01:00
🔐 fix: MCP OAuth Tool Discovery and Event Emission (#11599)
* fix: MCP OAuth tool discovery and event emission in event-driven mode - Add discoverServerTools method to MCPManager for tool discovery when OAuth is required - Fix OAuth event emission to send both ON_RUN_STEP and ON_RUN_STEP_DELTA events - Fix hasSubscriber flag reset in GenerationJobManager for proper event buffering - Add ToolDiscoveryOptions and ToolDiscoveryResult types - Update reinitMCPServer to use new discovery method and propagate OAuth URLs * refactor: Update ToolService and MCP modules for improved functionality - Reintroduced Constants in ToolService for better reference management. - Enhanced loadToolDefinitionsWrapper to handle both response and streamId scenarios. - Updated MCP module to correct type definitions for oauthStart parameter. - Improved MCPConnectionFactory to ensure proper disconnection handling during tool discovery. - Adjusted tests to reflect changes in mock implementations and ensure accurate behavior during OAuth handling. * fix: Refine OAuth handling in MCPConnectionFactory and related tests - Updated the OAuth URL assignment logic in reinitMCPServer to prevent overwriting existing URLs. - Enhanced error logging to provide clearer messages when tool discovery fails. - Adjusted tests to reflect changes in OAuth handling, ensuring accurate detection of OAuth requirements without generating URLs in discovery mode. * refactor: Clean up OAuth URL assignment in reinitMCPServer - Removed redundant OAuth URL assignment logic in the reinitMCPServer function to streamline the tool discovery process. - Enhanced error logging for tool discovery failures, improving clarity in debugging and monitoring. * fix: Update response handling in ToolService for event-driven mode - Changed the condition in loadToolDefinitionsWrapper to check for writableEnded instead of headersSent, ensuring proper event emission when the response is still writable. - This adjustment enhances the reliability of event handling during tool execution, particularly in streaming scenarios.
This commit is contained in:
parent
5af1342dbb
commit
d13037881a
12 changed files with 667 additions and 40 deletions
|
|
@ -238,6 +238,7 @@ class GenerationJobManagerClass {
|
|||
const currentRuntime = this.runtimeState.get(streamId);
|
||||
if (currentRuntime) {
|
||||
currentRuntime.syncSent = false;
|
||||
currentRuntime.hasSubscriber = false;
|
||||
// Persist syncSent=false to Redis for cross-replica consistency
|
||||
this.jobStore.updateJob(streamId, { syncSent: false }).catch((err) => {
|
||||
logger.error(`[GenerationJobManager] Failed to persist syncSent=false:`, err);
|
||||
|
|
@ -435,6 +436,7 @@ class GenerationJobManagerClass {
|
|||
const currentRuntime = this.runtimeState.get(streamId);
|
||||
if (currentRuntime) {
|
||||
currentRuntime.syncSent = false;
|
||||
currentRuntime.hasSubscriber = false;
|
||||
// Persist syncSent=false to Redis
|
||||
this.jobStore.updateJob(streamId, { syncSent: false }).catch((err) => {
|
||||
logger.error(`[GenerationJobManager] Failed to persist syncSent=false:`, err);
|
||||
|
|
@ -767,7 +769,6 @@ class GenerationJobManagerClass {
|
|||
for (const bufferedEvent of runtime.earlyEventBuffer) {
|
||||
onChunk(bufferedEvent);
|
||||
}
|
||||
// Clear buffer after replay
|
||||
runtime.earlyEventBuffer = [];
|
||||
}
|
||||
}
|
||||
|
|
@ -822,7 +823,6 @@ class GenerationJobManagerClass {
|
|||
// Buffer early events if no subscriber yet (replay when first subscriber connects)
|
||||
if (!runtime.hasSubscriber) {
|
||||
runtime.earlyEventBuffer.push(event);
|
||||
// Also emit to transport in case subscriber connects mid-flight
|
||||
}
|
||||
|
||||
this.eventTransport.emitChunk(streamId, event);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue