From 6f2f182f03687c619df5b226fd0e577fc68b5930 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Sun, 25 Aug 2024 22:31:47 +0530 Subject: [PATCH 01/23] Base changes for ServerSide Events (instead of socket.io) --- .../ConversationalRetrievalQAChain.ts | 30 +++++++++++-- .../nodes/chains/LLMChain/LLMChain.ts | 16 +++++++ packages/components/src/handler.ts | 23 ++++++++++ packages/server/src/index.ts | 5 +++ packages/server/src/routes/index.ts | 1 + packages/server/src/utils/SSEStreamer.ts | 39 +++++++++++++++++ packages/server/src/utils/buildChatflow.ts | 4 +- .../ui/src/views/chatmessage/ChatMessage.jsx | 42 +++++++++++++++++-- 8 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 packages/server/src/utils/SSEStreamer.ts diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index 5a0e40685dc..7329d8ef38c 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -181,6 +181,9 @@ class ConversationalRetrievalQAChain_Chains implements INode { const databaseEntities = options.databaseEntities as IDatabaseEntity const chatflowid = options.chatflowid as string + const sseStreamer = options.sseStreamer + const chatId = options.chatId + let customResponsePrompt = responsePrompt // If the deprecated systemMessagePrompt is still exists if (systemMessagePrompt) { @@ -241,11 +244,20 @@ class ConversationalRetrievalQAChain_Chains implements INode { if (streamedResponse.final_output) { text = streamedResponse.final_output?.output - if (isStreamingEnabled) options.socketIO.to(options.socketIOClientId).emit('end') + if (isStreamingEnabled) { + options.socketIO.to(options.socketIOClientId).emit('end') + } if (Array.isArray(streamedResponse?.logs?.[sourceRunnableName]?.final_output?.output)) { sourceDocuments = streamedResponse?.logs?.[sourceRunnableName]?.final_output?.output - if (isStreamingEnabled && returnSourceDocuments) + if (isStreamingEnabled && returnSourceDocuments) { options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', sourceDocuments) + if (sseStreamer) { + sseStreamer.streamEvent(chatId, 'event: sourceDocuments\ndata: ' + JSON.stringify(sourceDocuments) + '\n\n') + } + } + } + if (isStreamingEnabled && sseStreamer) { + sseStreamer.streamEvent(chatId, 'event: end\ndata: [END]\n\n') } } @@ -258,9 +270,19 @@ class ConversationalRetrievalQAChain_Chains implements INode { if (!isStreamingStarted) { isStreamingStarted = true - if (isStreamingEnabled) options.socketIO.to(options.socketIOClientId).emit('start', token) + if (isStreamingEnabled) { + options.socketIO.to(options.socketIOClientId).emit('start', token) + if (sseStreamer) { + sseStreamer.streamEvent(chatId, 'event: start\ndata: ' + token + '\n\n') + } + } + } + if (isStreamingEnabled) { + options.socketIO.to(options.socketIOClientId).emit('token', token) + if (sseStreamer) { + sseStreamer.streamEvent(chatId, 'event: token\ndata: ' + token + '\n\n') + } } - if (isStreamingEnabled) options.socketIO.to(options.socketIOClientId).emit('token', token) } } diff --git a/packages/components/nodes/chains/LLMChain/LLMChain.ts b/packages/components/nodes/chains/LLMChain/LLMChain.ts index 5a7d04569a6..023262255ca 100644 --- a/packages/components/nodes/chains/LLMChain/LLMChain.ts +++ b/packages/components/nodes/chains/LLMChain/LLMChain.ts @@ -167,6 +167,9 @@ const runPrediction = async ( const socketIOClientId = isStreaming ? options.socketIOClientId : '' const moderations = nodeData.inputs?.inputModeration as Moderation[] + const sseStreamer = options.sseStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the LLM chain @@ -247,6 +250,10 @@ const runPrediction = async ( const options = { ...promptValues } if (isStreaming) { const handler = new CustomChainHandler(socketIO, socketIOClientId) + if (sseStreamer) { + handler.chatId = chatId + handler.sseStreamer = sseStreamer + } const res = await chain.call(options, [loggerHandler, handler, ...callbacks]) return formatResponse(res?.text) } else { @@ -263,6 +270,10 @@ const runPrediction = async ( } if (isStreaming) { const handler = new CustomChainHandler(socketIO, socketIOClientId) + if (options.sseStreamer) { + handler.chatId = options.chatId + handler.sseStreamer = options.sseStreamer + } const res = await chain.call(options, [loggerHandler, handler, ...callbacks]) return formatResponse(res?.text) } else { @@ -275,6 +286,11 @@ const runPrediction = async ( } else { if (isStreaming) { const handler = new CustomChainHandler(socketIO, socketIOClientId) + if (options.sseStreamer) { + handler.chatId = options.chatId + handler.sseStreamer = options.sseStreamer + } + const res = await chain.run(input, [loggerHandler, handler, ...callbacks]) return formatResponse(res) } else { diff --git a/packages/components/src/handler.ts b/packages/components/src/handler.ts index 3c3b9b256d1..cf3490a26c6 100644 --- a/packages/components/src/handler.ts +++ b/packages/components/src/handler.ts @@ -168,6 +168,8 @@ export class CustomChainHandler extends BaseCallbackHandler { skipK = 0 // Skip streaming for first K numbers of handleLLMStart returnSourceDocuments = false cachedResponse = true + chatId: string = '' + sseStreamer: any constructor(socketIO: Server, socketIOClientId: string, skipK?: number, returnSourceDocuments?: boolean) { super() @@ -187,13 +189,22 @@ export class CustomChainHandler extends BaseCallbackHandler { if (!this.isLLMStarted) { this.isLLMStarted = true this.socketIO.to(this.socketIOClientId).emit('start', token) + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') + } } this.socketIO.to(this.socketIOClientId).emit('token', token) + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') + } } } handleLLMEnd() { this.socketIO.to(this.socketIOClientId).emit('end') + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: end\ndata: [END]\n\n') + } } handleChainEnd(outputs: ChainValues, _: string, parentRunId?: string): void | Promise { @@ -209,16 +220,28 @@ export class CustomChainHandler extends BaseCallbackHandler { result.forEach((token: string, index: number) => { if (index === 0) { this.socketIO.to(this.socketIOClientId).emit('start', token) + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') + } + } + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') } this.socketIO.to(this.socketIOClientId).emit('token', token) }) if (this.returnSourceDocuments) { this.socketIO.to(this.socketIOClientId).emit('sourceDocuments', outputs?.sourceDocuments) + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') + } } this.socketIO.to(this.socketIOClientId).emit('end') } else { if (this.returnSourceDocuments) { this.socketIO.to(this.socketIOClientId).emit('sourceDocuments', outputs?.sourceDocuments) + if (this.sseStreamer) { + this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') + } } } } diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 0558b7e89b0..757bf8b0091 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -20,6 +20,8 @@ import { sanitizeMiddleware, getCorsOptions, getAllowedIframeOrigins } from './u import { Telemetry } from './utils/telemetry' import flowiseApiV1Router from './routes' import errorHandlerMiddleware from './middlewares/errors' +import { SSEStreamer } from "./utils/SSEStreamer"; +import { getRunningExpressApp } from "./utils/getRunningExpressApp"; declare global { namespace Express { @@ -36,6 +38,7 @@ export class App { cachePool: CachePool telemetry: Telemetry AppDataSource: DataSource = getDataSource() + sseStreamer: SSEStreamer constructor() { this.app = express() @@ -148,6 +151,8 @@ export class App { } this.app.use('/api/v1', flowiseApiV1Router) + this.sseStreamer = new SSEStreamer(this.app) + this.sseStreamer.setupSSEEndpoint() // ---------------------------------------- // Configure number of proxies in Host Environment diff --git a/packages/server/src/routes/index.ts b/packages/server/src/routes/index.ts index 075b28fb963..cb2f139c979 100644 --- a/packages/server/src/routes/index.ts +++ b/packages/server/src/routes/index.ts @@ -39,6 +39,7 @@ import variablesRouter from './variables' import vectorRouter from './vectors' import verifyRouter from './verify' import versionRouter from './versions' +import { getRunningExpressApp } from "../utils/getRunningExpressApp"; const router = express.Router() diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts new file mode 100644 index 00000000000..a9233310380 --- /dev/null +++ b/packages/server/src/utils/SSEStreamer.ts @@ -0,0 +1,39 @@ +import express from 'express' +import { Request, Response } from 'express' + +export class SSEStreamer { + clients: { [id: string]: Response } = {} + app: express.Application + + constructor(app: express.Application) { + this.app = app + } + + // Setup SSE endpoint + setupSSEEndpoint = () => { + this.app.get('/api/v1/events/:chatId', (req: Request, res: Response) => { + res.setHeader('Content-Type', 'text/event-stream') + res.setHeader('Cache-Control', 'no-cache') + res.setHeader('Connection', 'keep-alive') + res.flushHeaders() + + const chatId = req.params.chatId + this.clients[chatId] = res + + req.on('close', () => { + delete this.clients[chatId] + }) + }) + } + + // Send SSE message to a specific client + streamEvent(chatId: string, data: string) { + const client = this.clients[chatId] + if (client) { + client.write(`${data}`) + } + if (data === '[END]') { + delete this.clients[chatId] + } + } +} diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index 93a52332200..9995f149cb5 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -71,7 +71,6 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter const chatId = incomingInput.chatId ?? incomingInput.overrideConfig?.sessionId ?? uuidv4() const userMessageDateTime = new Date() - if (!isInternal) { const isKeyValidated = await utilValidateKey(req, chatflow) if (!isKeyValidated) { @@ -358,7 +357,8 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter uploads: incomingInput.uploads, socketIO, socketIOClientId: incomingInput.socketIOClientId, - prependMessages + prependMessages, + sseStreamer: appServer.sseStreamer }) : await nodeInstance.run(nodeToExecuteData, incomingInput.question, { chatId, diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 611b08fe8a9..20ae6f5439c 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -548,6 +548,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview if (isChatFlowAvailableToStream) params.socketIOClientId = socketIOClientId if (action) params.action = action + setupSSE(chatId) const response = await predictionApi.sendMessageAndGetPrediction(chatflowid, params) if (response.data) { @@ -609,6 +610,41 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } } + const setupSSE = (chatId) => { + // Establish the SSE connection to receive the streamed response + const eventSource = new EventSource(`${baseURL}/api/v1/events/${chatId}`) + + eventSource.addEventListener('start', (event) => { + console.log('onStart', event.data) + setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) + }) + + eventSource.addEventListener('token', (event) => { + console.log('onToken', event.data) + updateLastMessage(event.data) + }) + + eventSource.addEventListener('sourceDocuments', (event) => { + updateLastMessageSourceDocuments(JSON.parse(event.data)) + }) + + eventSource.addEventListener('end', () => { + console.log('onEnd : ' + event.data) + eventSource.close() // Close the connection when stream ends + }) + + eventSource.onmessage = (event) => { + if (event.data === '[END]') { + eventSource.close() // Close the connection when stream ends + } + } + + eventSource.onerror = (err) => { + console.error('EventSource failed:', err) + eventSource.close() + } + } + // Prevent blank submissions and allow for multiline input const handleEnter = (e) => { // Check if IME composition is in progress @@ -800,16 +836,16 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }) socket.on('start', () => { - setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) + // setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) }) - socket.on('sourceDocuments', updateLastMessageSourceDocuments) + //socket.on('sourceDocuments', updateLastMessageSourceDocuments) socket.on('usedTools', updateLastMessageUsedTools) socket.on('fileAnnotations', updateLastMessageFileAnnotations) - socket.on('token', updateLastMessage) + //socket.on('token', updateLastMessage) socket.on('agentReasoning', updateLastMessageAgentReasoning) From 183e951e38b88a599cc4e032383e74c6dc3dc443 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Sun, 25 Aug 2024 22:32:46 +0530 Subject: [PATCH 02/23] lint fixes --- packages/server/src/index.ts | 3 +-- packages/server/src/routes/index.ts | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 757bf8b0091..782d29f4467 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -20,8 +20,7 @@ import { sanitizeMiddleware, getCorsOptions, getAllowedIframeOrigins } from './u import { Telemetry } from './utils/telemetry' import flowiseApiV1Router from './routes' import errorHandlerMiddleware from './middlewares/errors' -import { SSEStreamer } from "./utils/SSEStreamer"; -import { getRunningExpressApp } from "./utils/getRunningExpressApp"; +import { SSEStreamer } from './utils/SSEStreamer' declare global { namespace Express { diff --git a/packages/server/src/routes/index.ts b/packages/server/src/routes/index.ts index cb2f139c979..075b28fb963 100644 --- a/packages/server/src/routes/index.ts +++ b/packages/server/src/routes/index.ts @@ -39,7 +39,6 @@ import variablesRouter from './variables' import vectorRouter from './vectors' import verifyRouter from './verify' import versionRouter from './versions' -import { getRunningExpressApp } from "../utils/getRunningExpressApp"; const router = express.Router() From f88694efff3c23957491505332eddc3fb15297fc Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Mon, 26 Aug 2024 15:16:56 +0530 Subject: [PATCH 03/23] adding of interface and separate methods for streaming events --- .../ConversationalRetrievalQAChain.ts | 18 ++++---- .../nodes/chains/LLMChain/LLMChain.ts | 12 +++++- packages/components/src/Interface.ts | 8 ++++ packages/components/src/handler.ts | 29 +++++++++---- packages/server/src/utils/SSEStreamer.ts | 41 ++++++++++++++++++- 5 files changed, 89 insertions(+), 19 deletions(-) diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index 7329d8ef38c..56911b19b9f 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -22,8 +22,8 @@ import { INodeData, INodeParams, IDatabaseEntity, - MemoryMethods -} from '../../../src/Interface' + MemoryMethods, IServerSideEventStreamer +} from "../../../src/Interface"; import { QA_TEMPLATE, REPHRASE_TEMPLATE, RESPONSE_TEMPLATE } from './prompts' type RetrievalChainInput = { @@ -181,7 +181,7 @@ class ConversationalRetrievalQAChain_Chains implements INode { const databaseEntities = options.databaseEntities as IDatabaseEntity const chatflowid = options.chatflowid as string - const sseStreamer = options.sseStreamer + const sseStreamer = options.sseStreamer as IServerSideEventStreamer const chatId = options.chatId let customResponsePrompt = responsePrompt @@ -252,12 +252,14 @@ class ConversationalRetrievalQAChain_Chains implements INode { if (isStreamingEnabled && returnSourceDocuments) { options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', sourceDocuments) if (sseStreamer) { - sseStreamer.streamEvent(chatId, 'event: sourceDocuments\ndata: ' + JSON.stringify(sourceDocuments) + '\n\n') + //sseStreamer.streamEvent(chatId, 'event: sourceDocuments\ndata: ' + JSON.stringify(sourceDocuments) + '\n\n') + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) } } } if (isStreamingEnabled && sseStreamer) { - sseStreamer.streamEvent(chatId, 'event: end\ndata: [END]\n\n') + //sseStreamer.streamEvent(chatId, 'event: end\ndata: [END]\n\n') + sseStreamer.streamEndEvent(chatId) } } @@ -273,14 +275,16 @@ class ConversationalRetrievalQAChain_Chains implements INode { if (isStreamingEnabled) { options.socketIO.to(options.socketIOClientId).emit('start', token) if (sseStreamer) { - sseStreamer.streamEvent(chatId, 'event: start\ndata: ' + token + '\n\n') + //sseStreamer.streamEvent(chatId, 'event: start\ndata: ' + token + '\n\n') + sseStreamer.streamStartEvent(chatId, token) } } } if (isStreamingEnabled) { options.socketIO.to(options.socketIOClientId).emit('token', token) if (sseStreamer) { - sseStreamer.streamEvent(chatId, 'event: token\ndata: ' + token + '\n\n') + //sseStreamer.streamEvent(chatId, 'event: token\ndata: ' + token + '\n\n') + sseStreamer.streamTokenEvent(chatId, token) } } } diff --git a/packages/components/nodes/chains/LLMChain/LLMChain.ts b/packages/components/nodes/chains/LLMChain/LLMChain.ts index 023262255ca..33c78fbcaed 100644 --- a/packages/components/nodes/chains/LLMChain/LLMChain.ts +++ b/packages/components/nodes/chains/LLMChain/LLMChain.ts @@ -4,7 +4,15 @@ import { HumanMessage } from '@langchain/core/messages' import { ChatPromptTemplate, FewShotPromptTemplate, HumanMessagePromptTemplate, PromptTemplate } from '@langchain/core/prompts' import { OutputFixingParser } from 'langchain/output_parsers' import { LLMChain } from 'langchain/chains' -import { IVisionChatModal, ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { + IVisionChatModal, + ICommonObject, + INode, + INodeData, + INodeOutputsValue, + INodeParams, + IServerSideEventStreamer +} from '../../../src/Interface' import { additionalCallbacks, ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler' import { getBaseClasses, handleEscapeCharacters } from '../../../src/utils' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' @@ -252,7 +260,7 @@ const runPrediction = async ( const handler = new CustomChainHandler(socketIO, socketIOClientId) if (sseStreamer) { handler.chatId = chatId - handler.sseStreamer = sseStreamer + handler.sseStreamer = sseStreamer as IServerSideEventStreamer } const res = await chain.call(options, [loggerHandler, handler, ...callbacks]) return formatResponse(res?.text) diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index 6b687fc77a0..75a7a11eb82 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -396,3 +396,11 @@ export interface IVisionChatModal { revertToOriginalModel(): void setMultiModalOption(multiModalOption: IMultiModalOption): void } + +export interface IServerSideEventStreamer { + streamEvent(chatId: string, data: string): void + streamSourceDocumentsEvent(chatId: string, data: string): void + streamTokenEvent(chatId: string, data: string): void + streamStartEvent(chatId: string, data: string): void + streamEndEvent(chatId: string): void +} diff --git a/packages/components/src/handler.ts b/packages/components/src/handler.ts index cf3490a26c6..0de958c4b05 100644 --- a/packages/components/src/handler.ts +++ b/packages/components/src/handler.ts @@ -15,7 +15,7 @@ import { AgentAction } from '@langchain/core/agents' import { LunaryHandler } from '@langchain/community/callbacks/handlers/lunary' import { getCredentialData, getCredentialParam, getEnvironmentVariable } from './utils' -import { ICommonObject, INodeData } from './Interface' +import { ICommonObject, INodeData, IServerSideEventStreamer } from './Interface' import { LangWatch, LangWatchSpan, LangWatchTrace, autoconvertTypedValues } from 'langwatch' interface AgentRun extends Run { @@ -169,7 +169,7 @@ export class CustomChainHandler extends BaseCallbackHandler { returnSourceDocuments = false cachedResponse = true chatId: string = '' - sseStreamer: any + sseStreamer: IServerSideEventStreamer constructor(socketIO: Server, socketIOClientId: string, skipK?: number, returnSourceDocuments?: boolean) { super() @@ -190,12 +190,14 @@ export class CustomChainHandler extends BaseCallbackHandler { this.isLLMStarted = true this.socketIO.to(this.socketIOClientId).emit('start', token) if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') + this.sseStreamer.streamStartEvent(this.chatId, token) } } this.socketIO.to(this.socketIOClientId).emit('token', token) if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') + this.sseStreamer.streamTokenEvent(this.chatId, token) } } } @@ -203,7 +205,8 @@ export class CustomChainHandler extends BaseCallbackHandler { handleLLMEnd() { this.socketIO.to(this.socketIOClientId).emit('end') if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: end\ndata: [END]\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: end\ndata: [END]\n\n') + this.sseStreamer.streamEndEvent(this.chatId) } } @@ -221,26 +224,34 @@ export class CustomChainHandler extends BaseCallbackHandler { if (index === 0) { this.socketIO.to(this.socketIOClientId).emit('start', token) if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') + this.sseStreamer.streamStartEvent(this.chatId, token) } } if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') + this.sseStreamer.streamTokenEvent(this.chatId, token) } this.socketIO.to(this.socketIOClientId).emit('token', token) }) if (this.returnSourceDocuments) { this.socketIO.to(this.socketIOClientId).emit('sourceDocuments', outputs?.sourceDocuments) if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') + this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) } } this.socketIO.to(this.socketIOClientId).emit('end') + if (this.sseStreamer) { + //this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') + this.sseStreamer.streamEndEvent(this.chatId) + } } else { if (this.returnSourceDocuments) { this.socketIO.to(this.socketIOClientId).emit('sourceDocuments', outputs?.sourceDocuments) if (this.sseStreamer) { - this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') + //this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') + this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) } } } diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index a9233310380..391bd99ba90 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -1,7 +1,8 @@ import express from 'express' import { Request, Response } from 'express' +import { IServerSideEventStreamer } from 'flowise-components' -export class SSEStreamer { +export class SSEStreamer implements IServerSideEventStreamer { clients: { [id: string]: Response } = {} app: express.Application @@ -35,5 +36,43 @@ export class SSEStreamer { if (data === '[END]') { delete this.clients[chatId] } + } // Send SSE message to a specific client + + streamStartEvent(chatId: string, data: string) { + const client = this.clients[chatId] + if (client) { + client.write(`event: start\ndata: ${data} \n\n'`) + } + if (data === '[END]') { + delete this.clients[chatId] + } + } + + streamTokenEvent(chatId: string, data: string) { + const client = this.clients[chatId] + if (client) { + client.write(`event: token\ndata: ${data} \n\n`) + } + if (data === '[END]') { + delete this.clients[chatId] + } + } + + streamSourceDocumentsEvent(chatId: string, data: string) { + const client = this.clients[chatId] + if (client) { + client.write(`event: sourceDocuments\ndata: ${data} \n\n`) + } + if (data === '[END]') { + delete this.clients[chatId] + } + } + + streamEndEvent(chatId: string) { + const client = this.clients[chatId] + if (client) { + client.write(`'event: sourceDocuments\ndata: [END] \n\n'`) + } + delete this.clients[chatId] } } From 7ec4fa188727c4a434a3ebbac61b12313247011d Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Mon, 26 Aug 2024 15:17:16 +0530 Subject: [PATCH 04/23] lint --- .../ConversationalRetrievalQAChain.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index 56911b19b9f..f30c7b23adb 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -22,8 +22,9 @@ import { INodeData, INodeParams, IDatabaseEntity, - MemoryMethods, IServerSideEventStreamer -} from "../../../src/Interface"; + MemoryMethods, + IServerSideEventStreamer +} from '../../../src/Interface' import { QA_TEMPLATE, REPHRASE_TEMPLATE, RESPONSE_TEMPLATE } from './prompts' type RetrievalChainInput = { From d3c543821a20f2470b0ac4fb8afe7e68523ba89a Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Sun, 1 Sep 2024 12:06:52 +0530 Subject: [PATCH 05/23] first draft, handles both internal and external prediction end points. --- .../agents/AirtableAgent/AirtableAgent.ts | 20 +- .../nodes/agents/AutoGPT/AutoGPT.ts | 3 + .../nodes/agents/BabyAGI/BabyAGI.ts | 3 + .../nodes/agents/CSVAgent/CSVAgent.ts | 20 +- .../ConversationalAgent.ts | 34 ++- .../OpenAIToolAgent_LlamaIndex.ts | 30 +- .../agents/OpenAIAssistant/OpenAIAssistant.ts | 76 +++-- .../agents/ReActAgentChat/ReActAgentChat.ts | 3 + .../agents/ReActAgentLLM/ReActAgentLLM.ts | 3 + .../nodes/agents/ToolAgent/ToolAgent.ts | 36 ++- .../nodes/agents/XMLAgent/XMLAgent.ts | 38 ++- .../nodes/chains/ApiChain/GETApiChain.ts | 9 +- .../nodes/chains/ApiChain/OpenAPIChain.ts | 15 +- .../nodes/chains/ApiChain/POSTApiChain.ts | 10 +- .../ConversationChain/ConversationChain.ts | 17 +- .../ConversationalRetrievalQAChain.ts | 27 +- .../nodes/chains/LLMChain/LLMChain.ts | 35 +-- .../MultiPromptChain/MultiPromptChain.ts | 24 +- .../MultiRetrievalQAChain.ts | 23 +- .../RetrievalQAChain/RetrievalQAChain.ts | 16 +- .../SqlDatabaseChain/SqlDatabaseChain.ts | 17 +- .../nodes/chains/VectaraChain/VectaraChain.ts | 3 + .../chains/VectorDBQAChain/VectorDBQAChain.ts | 15 +- .../engine/ChatEngine/ContextChatEngine.ts | 30 +- .../engine/ChatEngine/SimpleChatEngine.ts | 27 +- .../nodes/engine/QueryEngine/QueryEngine.ts | 29 +- .../SubQuestionQueryEngine.ts | 29 +- .../components/nodes/moderation/Moderation.ts | 22 +- packages/components/src/Interface.ts | 14 +- packages/components/src/handler.ts | 38 +-- packages/server/src/Interface.ts | 1 - .../controllers/internal-predictions/index.ts | 27 +- .../src/controllers/predictions/index.ts | 38 ++- packages/server/src/index.ts | 3 +- .../server/src/services/predictions/index.ts | 4 +- packages/server/src/utils/SSEStreamer.ts | 289 ++++++++++++++++-- packages/server/src/utils/buildAgentGraph.ts | 59 ++-- packages/server/src/utils/buildChatflow.ts | 48 +-- packages/server/src/utils/index.ts | 12 +- .../ui/src/views/chatmessage/ChatMessage.jsx | 223 ++++++++------ 40 files changed, 981 insertions(+), 389 deletions(-) diff --git a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts index 7b8349e80c1..ff649e6a628 100644 --- a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts +++ b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts @@ -2,7 +2,14 @@ import axios from 'axios' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { AgentExecutor } from 'langchain/agents' import { LLMChain } from 'langchain/chains' -import { ICommonObject, INode, INodeData, INodeParams, PromptTemplate } from '../../../src/Interface' +import { + ICommonObject, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + PromptTemplate +} from "../../../src/Interface"; import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { LoadPyodide, finalSystemPrompt, systemPrompt } from './core' @@ -104,11 +111,18 @@ class Airtable_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + const credentialData = await getCredentialData(nodeData.credential ?? '', options) const accessToken = getCredentialParam('accessToken', credentialData, nodeData) @@ -123,7 +137,6 @@ class Airtable_Agents implements INode { let base64String = Buffer.from(JSON.stringify(airtableData)).toString('base64') const loggerHandler = new ConsoleCallbackHandler(options.logger) - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) const callbacks = await additionalCallbacks(nodeData, options) const pyodide = await LoadPyodide() @@ -194,7 +207,8 @@ json.dumps(my_dict)` answer: finalResult } - if (options.socketIO && options.socketIOClientId) { + if (options.shouldStreamResponse) { + const handler = new CustomChainHandler(shouldStreamResponse ? sseStreamer : undefined, chatId) const result = await chain.call(inputs, [loggerHandler, handler, ...callbacks]) return result?.text } else { diff --git a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts index 4c1d962c3e4..10904a9a7c3 100644 --- a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts +++ b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts @@ -113,6 +113,9 @@ class AutoGPT_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } diff --git a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts index bfc910b7952..940cfb4db8e 100644 --- a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts +++ b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts @@ -73,6 +73,9 @@ class BabyAGI_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } diff --git a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts index 70c35cd967c..f51696dbeb1 100644 --- a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts +++ b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts @@ -2,7 +2,14 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { AgentExecutor } from 'langchain/agents' import { LLMChain } from 'langchain/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeParams, PromptTemplate } from '../../../src/Interface' +import { + ICommonObject, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + PromptTemplate +} from "../../../src/Interface"; import { getBaseClasses } from '../../../src/utils' import { LoadPyodide, finalSystemPrompt, systemPrompt } from './core' import { checkInputs, Moderation } from '../../moderation/Moderation' @@ -90,13 +97,19 @@ class CSV_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } const loggerHandler = new ConsoleCallbackHandler(options.logger) - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + const callbacks = await additionalCallbacks(nodeData, options) let files: string[] = [] @@ -203,7 +216,8 @@ json.dumps(my_dict)` answer: finalResult } - if (options.socketIO && options.socketIOClientId) { + if (options.shouldStreamResponse) { + const handler = new CustomChainHandler(shouldStreamResponse ? sseStreamer : undefined, chatId) const result = await chain.call(inputs, [loggerHandler, handler, ...callbacks]) return result?.text } else { diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index 2d8a2d73ed2..19b5f8ad8aa 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -9,7 +9,16 @@ import { RunnableSequence } from '@langchain/core/runnables' import { ChatConversationalAgent } from 'langchain/agents' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { IVisionChatModal, FlowiseMemory, ICommonObject, INode, INodeData, INodeParams, IUsedTool } from '../../../src/Interface' +import { + IVisionChatModal, + FlowiseMemory, + ICommonObject, + INode, + INodeData, + INodeParams, + IUsedTool, + IServerSideEventStreamer +} from "../../../src/Interface"; import { AgentExecutor } from '../../../src/agents' import { addImagesToMessages, llmSupportsVision } from '../../../src/multiModalUtils' import { checkInputs, Moderation } from '../../moderation/Moderation' @@ -106,12 +115,18 @@ class ConversationalAgent_Agents implements INode { const memory = nodeData.inputs?.memory as FlowiseMemory const moderations = nodeData.inputs?.inputModeration as Moderation[] + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the BabyAGI agent input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } @@ -125,15 +140,17 @@ class ConversationalAgent_Agents implements INode { let sourceDocuments: ICommonObject[] = [] let usedTools: IUsedTool[] = [] - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (options.shouldStreamResponse) { + const handler = new CustomChainHandler(shouldStreamResponse ? sseStreamer : undefined, chatId) res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', flatten(res.sourceDocuments)) + if (options.sseStreamer) { + sseStreamer.streamSourceDocumentsEvent(options.chatId, JSON.stringify(flatten(res.sourceDocuments))) + } sourceDocuments = res.sourceDocuments } if (res.usedTools) { - options.socketIO.to(options.socketIOClientId).emit('usedTools', res.usedTools) + sseStreamer.streamUsedToolsEvent(options.chatId, JSON.stringify(res.usedTools)) usedTools = res.usedTools } // If the tool is set to returnDirect, stream the output to the client @@ -142,11 +159,14 @@ class ConversationalAgent_Agents implements INode { inputTools = flatten(inputTools) for (const tool of res.usedTools) { const inputTool = inputTools.find((inputTool: Tool) => inputTool.name === tool.tool) - if (inputTool && inputTool.returnDirect) { - options.socketIO.to(options.socketIOClientId).emit('token', tool.toolOutput) + if (inputTool && inputTool.returnDirect && options.sseStreamer) { + sseStreamer.streamTokenEvent(options.chatId, tool.toolOutput) } } } + if (sseStreamer) { + sseStreamer.streamEndEvent(options.chatId) + } } else { res = await executor.invoke({ input }, { callbacks: [loggerHandler, ...callbacks] }) if (res.sourceDocuments) { diff --git a/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts b/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts index ed9895de0ed..98c582c1282 100644 --- a/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts +++ b/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts @@ -1,7 +1,16 @@ import { flatten } from 'lodash' import { ChatMessage, OpenAI, OpenAIAgent } from 'llamaindex' import { getBaseClasses } from '../../../../src/utils' -import { FlowiseMemory, ICommonObject, IMessage, INode, INodeData, INodeParams, IUsedTool } from '../../../../src/Interface' +import { + FlowiseMemory, + ICommonObject, + IMessage, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + IUsedTool +} from "../../../../src/Interface"; class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { label: string @@ -67,7 +76,9 @@ class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { let tools = nodeData.inputs?.tools tools = flatten(tools) - const isStreamingEnabled = options.socketIO && options.socketIOClientId + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId const chatHistory = [] as ChatMessage[] @@ -104,7 +115,7 @@ class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { let isStreamingStarted = false const usedTools: IUsedTool[] = [] - if (isStreamingEnabled) { + if (shouldStreamResponse) { const stream = await agent.chat({ message: input, chatHistory, @@ -116,7 +127,9 @@ class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { text += chunk.response.delta if (!isStreamingStarted) { isStreamingStarted = true - options.socketIO.to(options.socketIOClientId).emit('start', chunk.response.delta) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.response.delta) + } if (chunk.sources.length) { for (const sourceTool of chunk.sources) { usedTools.push({ @@ -125,11 +138,14 @@ class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { toolOutput: sourceTool.output as any }) } - options.socketIO.to(options.socketIOClientId).emit('usedTools', usedTools) + if (sseStreamer) { + sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(usedTools)) + } } } - - options.socketIO.to(options.socketIOClientId).emit('token', chunk.response.delta) + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.response.delta) + } } } else { const response = await agent.chat({ message: input, chatHistory, verbose: process.env.DEBUG === 'true' ? true : false }) diff --git a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts index 98e76fedc86..faa14558b90 100644 --- a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts +++ b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts @@ -1,4 +1,13 @@ -import { ICommonObject, IDatabaseEntity, INode, INodeData, INodeOptionsValue, INodeParams, IUsedTool } from '../../../src/Interface' +import { + ICommonObject, + IDatabaseEntity, + INode, + INodeData, + INodeOptionsValue, + INodeParams, + IServerSideEventStreamer, + IUsedTool +} from "../../../src/Interface"; import OpenAI from 'openai' import { DataSource } from 'typeorm' import { getCredentialData, getCredentialParam } from '../../../src/utils' @@ -176,16 +185,19 @@ class OpenAIAssistant_Agents implements INode { const moderations = nodeData.inputs?.inputModeration as Moderation[] const _toolChoice = nodeData.inputs?.toolChoice as string const parallelToolCalls = nodeData.inputs?.parallelToolCalls as boolean - const isStreaming = options.socketIO && options.socketIOClientId - const socketIO = isStreaming ? options.socketIO : undefined - const socketIOClientId = isStreaming ? options.socketIOClientId : '' + + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId if (moderations && moderations.length > 0) { try { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(isStreaming, e.message, socketIO, socketIOClientId) + if (shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } return formatResponse(e.message) } } @@ -307,7 +319,7 @@ class OpenAIAssistant_Agents implements INode { } } - if (isStreaming) { + if (shouldStreamResponse) { const streamThread = await openai.beta.threads.runs.create(threadId, { assistant_id: retrievedAssistant.id, stream: true, @@ -389,26 +401,37 @@ class OpenAIAssistant_Agents implements INode { if (message_content.value) { if (!isStreamingStarted) { isStreamingStarted = true - socketIO.to(socketIOClientId).emit('start', message_content.value) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, message_content.value) + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, message_content.value) } - socketIO.to(socketIOClientId).emit('token', message_content.value) } if (fileAnnotations.length) { if (!isStreamingStarted) { isStreamingStarted = true - socketIO.to(socketIOClientId).emit('start', '') + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, ' ') + } + } + if (sseStreamer) { + sseStreamer.streamFileAnnotationsEvent(chatId, JSON.stringify(fileAnnotations)) } - socketIO.to(socketIOClientId).emit('fileAnnotations', fileAnnotations) } } else { text += chunk.text?.value if (!isStreamingStarted) { isStreamingStarted = true - socketIO.to(socketIOClientId).emit('start', chunk.text?.value) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.text?.value || '') + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.text?.value || '') } - - socketIO.to(socketIOClientId).emit('token', chunk.text?.value) } } @@ -425,10 +448,13 @@ class OpenAIAssistant_Agents implements INode { if (!isStreamingStarted) { isStreamingStarted = true - socketIO.to(socketIOClientId).emit('start', imgHTML) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, imgHTML) + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, imgHTML) } - - socketIO.to(socketIOClientId).emit('token', imgHTML) } } @@ -495,15 +521,19 @@ class OpenAIAssistant_Agents implements INode { text += chunk.text.value if (!isStreamingStarted) { isStreamingStarted = true - socketIO.to(socketIOClientId).emit('start', chunk.text.value) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.text.value) + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.text.value) } - - socketIO.to(socketIOClientId).emit('token', chunk.text.value) } } } - - socketIO.to(socketIOClientId).emit('usedTools', usedTools) + if (sseStreamer) { + sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(usedTools)) + } } catch (error) { console.error('Error submitting tool outputs:', error) await openai.beta.threads.runs.cancel(threadId, runThreadId) @@ -574,7 +604,9 @@ class OpenAIAssistant_Agents implements INode { // Start tool analytics const toolIds = await analyticHandlers.onToolStart(tool.name, actions[i].toolInput, parentIds) - if (socketIO && socketIOClientId) socketIO.to(socketIOClientId).emit('tool', tool.name) + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamToolEvent(chatId, tool.name) + } try { const toolOutput = await tool.call(actions[i].toolInput, undefined, undefined, { diff --git a/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts b/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts index 227f1070675..6d07d4bbc24 100644 --- a/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts +++ b/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts @@ -88,6 +88,9 @@ class ReActAgentChat_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } diff --git a/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts b/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts index 7547c807d91..4799f04b0b7 100644 --- a/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts +++ b/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts @@ -77,6 +77,9 @@ class ReActAgentLLM_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } diff --git a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts index c56138da75a..02df55dc991 100644 --- a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts +++ b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts @@ -8,7 +8,16 @@ import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, Pr import { formatToOpenAIToolMessages } from 'langchain/agents/format_scratchpad/openai_tools' import { type ToolsAgentStep } from 'langchain/agents/openai/output_parser' import { getBaseClasses, handleEscapeCharacters } from '../../../src/utils' -import { FlowiseMemory, ICommonObject, INode, INodeData, INodeParams, IUsedTool, IVisionChatModal } from '../../../src/Interface' +import { + FlowiseMemory, + ICommonObject, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + IUsedTool, + IVisionChatModal +} from "../../../src/Interface"; import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { AgentExecutor, ToolCallingAgentOutputParser } from '../../../src/agents' import { Moderation, checkInputs, streamResponse } from '../../moderation/Moderation' @@ -100,7 +109,9 @@ class ToolAgent_Agents implements INode { const memory = nodeData.inputs?.memory as FlowiseMemory const moderations = nodeData.inputs?.inputModeration as Moderation[] - const isStreamable = options.socketIO && options.socketIOClientId + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId if (moderations && moderations.length > 0) { try { @@ -108,8 +119,9 @@ class ToolAgent_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - if (isStreamable) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } return formatResponse(e.message) } } @@ -123,15 +135,19 @@ class ToolAgent_Agents implements INode { let sourceDocuments: ICommonObject[] = [] let usedTools: IUsedTool[] = [] - if (isStreamable) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', flatten(res.sourceDocuments)) + if (sseStreamer) { + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(flatten(res.sourceDocuments))) + } sourceDocuments = res.sourceDocuments } if (res.usedTools) { - options.socketIO.to(options.socketIOClientId).emit('usedTools', res.usedTools) + if (sseStreamer) { + sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(flatten(res.usedTools))) + } usedTools = res.usedTools } // If the tool is set to returnDirect, stream the output to the client @@ -140,8 +156,8 @@ class ToolAgent_Agents implements INode { inputTools = flatten(inputTools) for (const tool of res.usedTools) { const inputTool = inputTools.find((inputTool: Tool) => inputTool.name === tool.tool) - if (inputTool && inputTool.returnDirect) { - options.socketIO.to(options.socketIOClientId).emit('token', tool.toolOutput) + if (inputTool && inputTool.returnDirect && shouldStreamResponse) { + sseStreamer.streamTokenEvent(chatId, tool.toolOutput) } } } diff --git a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts index 886f2bcbb91..459266f5e4d 100644 --- a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts +++ b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts @@ -7,10 +7,19 @@ import { Tool } from '@langchain/core/tools' import { ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder } from '@langchain/core/prompts' import { formatLogToMessage } from 'langchain/agents/format_scratchpad/log_to_message' import { getBaseClasses } from '../../../src/utils' -import { FlowiseMemory, ICommonObject, IMessage, INode, INodeData, INodeParams, IUsedTool } from '../../../src/Interface' +import { + FlowiseMemory, + ICommonObject, + IMessage, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + IUsedTool +} from "../../../src/Interface"; import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { AgentExecutor, XMLAgentOutputParser } from '../../../src/agents' -import { Moderation, checkInputs } from '../../moderation/Moderation' +import { Moderation, checkInputs, streamResponse } from "../../moderation/Moderation"; import { formatResponse } from '../../outputparsers/OutputParserHelpers' const defaultSystemMessage = `You are a helpful assistant. Help the user answer any questions. @@ -112,13 +121,20 @@ class XMLAgent_Agents implements INode { const memory = nodeData.inputs?.memory as FlowiseMemory const moderations = nodeData.inputs?.inputModeration as Moderation[] + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the OpenAI Function Agent input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -131,15 +147,19 @@ class XMLAgent_Agents implements INode { let sourceDocuments: ICommonObject[] = [] let usedTools: IUsedTool[] = [] - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', flatten(res.sourceDocuments)) + if (sseStreamer) { + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(flatten(res.sourceDocuments))) + } sourceDocuments = res.sourceDocuments } if (res.usedTools) { - options.socketIO.to(options.socketIOClientId).emit('usedTools', res.usedTools) + if (sseStreamer) { + sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(flatten(res.usedTools))) + } usedTools = res.usedTools } // If the tool is set to returnDirect, stream the output to the client @@ -149,7 +169,9 @@ class XMLAgent_Agents implements INode { for (const tool of res.usedTools) { const inputTool = inputTools.find((inputTool: Tool) => inputTool.name === tool.tool) if (inputTool && inputTool.returnDirect) { - options.socketIO.to(options.socketIOClientId).emit('token', tool.toolOutput) + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, tool.toolOutput) + } } } } diff --git a/packages/components/nodes/chains/ApiChain/GETApiChain.ts b/packages/components/nodes/chains/ApiChain/GETApiChain.ts index cdf78ffc837..d4eee2a073f 100644 --- a/packages/components/nodes/chains/ApiChain/GETApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/GETApiChain.ts @@ -2,7 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate } from '@langchain/core/prompts' import { APIChain } from 'langchain/chains' import { getBaseClasses } from '../../../src/utils' -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' export const API_URL_RAW_PROMPT_TEMPLATE = `You are given the below API Documentation: @@ -100,9 +100,12 @@ class GETApiChain_Chains implements INode { const chain = await getAPIChain(apiDocs, model, headers, urlPrompt, ansPrompt) const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId, 2) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.run(input, [loggerHandler, handler, ...callbacks]) return res } else { diff --git a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts index 27c1fe007e3..91c6b31416e 100644 --- a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts +++ b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts @@ -1,5 +1,5 @@ import { APIChain, createOpenAPIChain } from 'langchain/chains' -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' @@ -74,18 +74,25 @@ class OpenApiChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) const moderations = nodeData.inputs?.inputModeration as Moderation[] + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the OpenAPI chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (options.shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } + //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.run(input, [loggerHandler, handler, ...callbacks]) return res } else { diff --git a/packages/components/nodes/chains/ApiChain/POSTApiChain.ts b/packages/components/nodes/chains/ApiChain/POSTApiChain.ts index e6f0bd34994..a3d66f66fb7 100644 --- a/packages/components/nodes/chains/ApiChain/POSTApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/POSTApiChain.ts @@ -2,7 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate } from '@langchain/core/prompts' import { API_RESPONSE_RAW_PROMPT_TEMPLATE, API_URL_RAW_PROMPT_TEMPLATE, APIChain } from './postCore' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; import { getBaseClasses } from '../../../src/utils' class POSTApiChain_Chains implements INode { @@ -90,8 +90,12 @@ class POSTApiChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId, 2) + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.run(input, [loggerHandler, handler, ...callbacks]) return res } else { diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index 73dc9c68c71..5a7b2e12b58 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -23,8 +23,8 @@ import { INode, INodeData, INodeParams, - MessageContentImageUrl -} from '../../../src/Interface' + MessageContentImageUrl, IServerSideEventStreamer +} from "../../../src/Interface"; import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, handleEscapeCharacters } from '../../../src/utils' @@ -114,13 +114,20 @@ class ConversationChain_Chains implements INode { const chain = await prepareChain(nodeData, options, this.sessionId) const moderations = nodeData.inputs?.inputModeration as Moderation[] + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the LLM chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (options.shouldStreamResponse) { + streamResponse(options.sseStreamer, options.chatId, e.message) + } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -135,8 +142,8 @@ class ConversationChain_Chains implements INode { callbacks.push(new LCConsoleCallbackHandler()) } - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) callbacks.push(handler) res = await chain.invoke({ input }, { callbacks }) } else { diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index f30c7b23adb..36d9b3fb07a 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -182,7 +182,8 @@ class ConversationalRetrievalQAChain_Chains implements INode { const databaseEntities = options.databaseEntities as IDatabaseEntity const chatflowid = options.chatflowid as string - const sseStreamer = options.sseStreamer as IServerSideEventStreamer + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer const chatId = options.chatId let customResponsePrompt = responsePrompt @@ -209,7 +210,10 @@ class ConversationalRetrievalQAChain_Chains implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (options.shouldStreamResponse) { + streamResponse(options.sseStreamer, options.chatId, e.message) + } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -238,28 +242,21 @@ class ConversationalRetrievalQAChain_Chains implements INode { let sourceDocuments: ICommonObject[] = [] let text = '' let isStreamingStarted = false - const isStreamingEnabled = options.socketIO && options.socketIOClientId for await (const chunk of stream) { streamedResponse = applyPatch(streamedResponse, chunk.ops).newDocument if (streamedResponse.final_output) { text = streamedResponse.final_output?.output - if (isStreamingEnabled) { - options.socketIO.to(options.socketIOClientId).emit('end') - } if (Array.isArray(streamedResponse?.logs?.[sourceRunnableName]?.final_output?.output)) { sourceDocuments = streamedResponse?.logs?.[sourceRunnableName]?.final_output?.output - if (isStreamingEnabled && returnSourceDocuments) { - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', sourceDocuments) + if (shouldStreamResponse && returnSourceDocuments) { if (sseStreamer) { - //sseStreamer.streamEvent(chatId, 'event: sourceDocuments\ndata: ' + JSON.stringify(sourceDocuments) + '\n\n') sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) } } } - if (isStreamingEnabled && sseStreamer) { - //sseStreamer.streamEvent(chatId, 'event: end\ndata: [END]\n\n') + if (shouldStreamResponse && sseStreamer) { sseStreamer.streamEndEvent(chatId) } } @@ -273,18 +270,14 @@ class ConversationalRetrievalQAChain_Chains implements INode { if (!isStreamingStarted) { isStreamingStarted = true - if (isStreamingEnabled) { - options.socketIO.to(options.socketIOClientId).emit('start', token) + if (shouldStreamResponse) { if (sseStreamer) { - //sseStreamer.streamEvent(chatId, 'event: start\ndata: ' + token + '\n\n') sseStreamer.streamStartEvent(chatId, token) } } } - if (isStreamingEnabled) { - options.socketIO.to(options.socketIOClientId).emit('token', token) + if (shouldStreamResponse) { if (sseStreamer) { - //sseStreamer.streamEvent(chatId, 'event: token\ndata: ' + token + '\n\n') sseStreamer.streamTokenEvent(chatId, token) } } diff --git a/packages/components/nodes/chains/LLMChain/LLMChain.ts b/packages/components/nodes/chains/LLMChain/LLMChain.ts index 33c78fbcaed..57c0a907c25 100644 --- a/packages/components/nodes/chains/LLMChain/LLMChain.ts +++ b/packages/components/nodes/chains/LLMChain/LLMChain.ts @@ -170,12 +170,11 @@ const runPrediction = async ( const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - const isStreaming = !disableStreaming && options.socketIO && options.socketIOClientId - const socketIO = isStreaming ? options.socketIO : undefined - const socketIOClientId = isStreaming ? options.socketIOClientId : '' const moderations = nodeData.inputs?.inputModeration as Moderation[] - const sseStreamer = options.sseStreamer + // this is true if the prediction is external and the client has requested streaming='true' + const shouldStreamResponse = !disableStreaming && options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer const chatId = options.chatId if (moderations && moderations.length > 0) { @@ -184,7 +183,9 @@ const runPrediction = async ( input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(isStreaming, e.message, socketIO, socketIOClientId) + if (shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } return formatResponse(e.message) } } @@ -256,12 +257,8 @@ const runPrediction = async ( if (seen.length === 0) { // All inputVariables have fixed values specified const options = { ...promptValues } - if (isStreaming) { - const handler = new CustomChainHandler(socketIO, socketIOClientId) - if (sseStreamer) { - handler.chatId = chatId - handler.sseStreamer = sseStreamer as IServerSideEventStreamer - } + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.call(options, [loggerHandler, handler, ...callbacks]) return formatResponse(res?.text) } else { @@ -276,12 +273,8 @@ const runPrediction = async ( ...promptValues, [lastValue]: input } - if (isStreaming) { - const handler = new CustomChainHandler(socketIO, socketIOClientId) - if (options.sseStreamer) { - handler.chatId = options.chatId - handler.sseStreamer = options.sseStreamer - } + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.call(options, [loggerHandler, handler, ...callbacks]) return formatResponse(res?.text) } else { @@ -292,12 +285,8 @@ const runPrediction = async ( throw new Error(`Please provide Prompt Values for: ${seen.join(', ')}`) } } else { - if (isStreaming) { - const handler = new CustomChainHandler(socketIO, socketIOClientId) - if (options.sseStreamer) { - handler.chatId = options.chatId - handler.sseStreamer = options.sseStreamer - } + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.run(input, [loggerHandler, handler, ...callbacks]) return formatResponse(res) diff --git a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts index fa91bb205e4..80504fdbc4e 100644 --- a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts +++ b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts @@ -1,6 +1,13 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { MultiPromptChain } from 'langchain/chains' -import { ICommonObject, INode, INodeData, INodeParams, PromptRetriever } from '../../../src/Interface' +import { + ICommonObject, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + PromptRetriever +} from "../../../src/Interface"; import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' @@ -75,13 +82,22 @@ class MultiPromptChain_Chains implements INode { async run(nodeData: INodeData, input: string, options: ICommonObject): Promise { const chain = nodeData.instance as MultiPromptChain const moderations = nodeData.inputs?.inputModeration as Moderation[] + + // this is true if the prediction is external and the client has requested streaming='true' + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the Multi Prompt Chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (options.shouldStreamResponse) { + streamResponse(options.sseStreamer, options.chatId, e.message) + } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -90,8 +106,8 @@ class MultiPromptChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId, 2) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId, 2) const res = await chain.call(obj, [loggerHandler, handler, ...callbacks]) return res?.text } else { diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts index 71302d635af..1e2d8eb1bc5 100644 --- a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts @@ -1,6 +1,13 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { MultiRetrievalQAChain } from 'langchain/chains' -import { ICommonObject, INode, INodeData, INodeParams, VectorStoreRetriever } from '../../../src/Interface' +import { + ICommonObject, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + VectorStoreRetriever +} from "../../../src/Interface"; import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' @@ -83,13 +90,21 @@ class MultiRetrievalQAChain_Chains implements INode { const chain = nodeData.instance as MultiRetrievalQAChain const returnSourceDocuments = nodeData.inputs?.returnSourceDocuments as boolean const moderations = nodeData.inputs?.inputModeration as Moderation[] + + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the Multi Retrieval QA Chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (options.shouldStreamResponse) { + streamResponse(options.sseStreamer, options.chatId, e.message) + } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -97,8 +112,8 @@ class MultiRetrievalQAChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId, 2, returnSourceDocuments) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId, 2, returnSourceDocuments) const res = await chain.call(obj, [loggerHandler, handler, ...callbacks]) if (res.text && res.sourceDocuments) return res return res?.text diff --git a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts index 9125f38fcae..1b8fb888550 100644 --- a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts +++ b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts @@ -2,7 +2,7 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { RetrievalQAChain } from 'langchain/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' import { formatResponse } from '../../outputparsers/OutputParserHelpers' @@ -60,13 +60,21 @@ class RetrievalQAChain_Chains implements INode { async run(nodeData: INodeData, input: string, options: ICommonObject): Promise { const chain = nodeData.instance as RetrievalQAChain const moderations = nodeData.inputs?.inputModeration as Moderation[] + + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the Retrieval QA Chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -76,8 +84,8 @@ class RetrievalQAChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.call(obj, [loggerHandler, handler, ...callbacks]) return res?.text } else { diff --git a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts index f04102fd4a9..29a8c0fbaf0 100644 --- a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts +++ b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts @@ -4,7 +4,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate, PromptTemplateInput } from '@langchain/core/prompts' import { SqlDatabaseChain, SqlDatabaseChainInput, DEFAULT_SQL_DATABASE_PROMPT } from 'langchain/chains/sql_db' import { SqlDatabase } from 'langchain/sql_db' -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, getInputVariables } from '../../../src/utils' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' @@ -166,13 +166,21 @@ class SqlDatabaseChain_Chains implements INode { const topK = nodeData.inputs?.topK as number const customPrompt = nodeData.inputs?.customPrompt as string const moderations = nodeData.inputs?.inputModeration as Moderation[] + + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the Sql Database Chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -190,8 +198,9 @@ class SqlDatabaseChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId, 2) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId, 2) + const res = await chain.run(input, [loggerHandler, handler, ...callbacks]) return res } else { diff --git a/packages/components/nodes/chains/VectaraChain/VectaraChain.ts b/packages/components/nodes/chains/VectaraChain/VectaraChain.ts index e5427ca0f7d..16d20ca3186 100644 --- a/packages/components/nodes/chains/VectaraChain/VectaraChain.ts +++ b/packages/components/nodes/chains/VectaraChain/VectaraChain.ts @@ -269,6 +269,9 @@ class VectaraChain_Chains implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } diff --git a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts index 129eb46acdd..0ad1d4dc783 100644 --- a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts +++ b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts @@ -2,7 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { VectorStore } from '@langchain/core/vectorstores' import { VectorDBQAChain } from 'langchain/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; import { getBaseClasses } from '../../../src/utils' import { checkInputs, Moderation } from '../../moderation/Moderation' import { formatResponse } from '../../outputparsers/OutputParserHelpers' @@ -64,13 +64,20 @@ class VectorDBQAChain_Chains implements INode { const chain = nodeData.instance as VectorDBQAChain const moderations = nodeData.inputs?.inputModeration as Moderation[] + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + if (moderations && moderations.length > 0) { try { // Use the output of the moderation chain as input for the VectorDB QA Chain input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + // if (options.shouldStreamResponse) { + // streamResponse(options.sseStreamer, options.chatId, e.message) + // } + // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } @@ -81,8 +88,8 @@ class VectorDBQAChain_Chains implements INode { const loggerHandler = new ConsoleCallbackHandler(options.logger) const callbacks = await additionalCallbacks(nodeData, options) - if (options.socketIO && options.socketIOClientId) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) const res = await chain.call(obj, [loggerHandler, handler, ...callbacks]) return res?.text } else { diff --git a/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts b/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts index a5bacaad070..dd5fa110598 100644 --- a/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts +++ b/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts @@ -1,4 +1,13 @@ -import { FlowiseMemory, ICommonObject, IMessage, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { + FlowiseMemory, + ICommonObject, + IMessage, + INode, + INodeData, + INodeOutputsValue, + INodeParams, + IServerSideEventStreamer +} from "../../../src/Interface"; import { Metadata, BaseRetriever, LLM, ContextChatEngine, ChatMessage, NodeWithScore } from 'llamaindex' import { reformatSourceDocuments } from '../EngineUtils' @@ -103,24 +112,33 @@ class ContextChatEngine_LlamaIndex implements INode { let isStreamingStarted = false let sourceDocuments: ICommonObject[] = [] let sourceNodes: NodeWithScore[] = [] - const isStreamingEnabled = options.socketIO && options.socketIOClientId - if (isStreamingEnabled) { + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + + if (shouldStreamResponse) { const stream = await chatEngine.chat({ message: input, chatHistory, stream: true }) for await (const chunk of stream) { text += chunk.response if (chunk.sourceNodes) sourceNodes = chunk.sourceNodes if (!isStreamingStarted) { isStreamingStarted = true - options.socketIO.to(options.socketIOClientId).emit('start', chunk.response) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.response) + } } - options.socketIO.to(options.socketIOClientId).emit('token', chunk.response) + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.response) + } } if (returnSourceDocuments) { sourceDocuments = reformatSourceDocuments(sourceNodes) - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', sourceDocuments) + if (sseStreamer) { + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + } } } else { const response = await chatEngine.chat({ message: input, chatHistory }) diff --git a/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts b/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts index 5734288d1da..7fcb5b4d7c6 100644 --- a/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts +++ b/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts @@ -1,4 +1,13 @@ -import { FlowiseMemory, ICommonObject, IMessage, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { + FlowiseMemory, + ICommonObject, + IMessage, + INode, + INodeData, + INodeOutputsValue, + INodeParams, + IServerSideEventStreamer +} from "../../../src/Interface"; import { LLM, ChatMessage, SimpleChatEngine } from 'llamaindex' class SimpleChatEngine_LlamaIndex implements INode { @@ -86,18 +95,24 @@ class SimpleChatEngine_LlamaIndex implements INode { let text = '' let isStreamingStarted = false - const isStreamingEnabled = options.socketIO && options.socketIOClientId - if (isStreamingEnabled) { + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + + if (shouldStreamResponse) { const stream = await chatEngine.chat({ message: input, chatHistory, stream: true }) for await (const chunk of stream) { text += chunk.response if (!isStreamingStarted) { isStreamingStarted = true - options.socketIO.to(options.socketIOClientId).emit('start', chunk.response) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.response) + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.response) } - - options.socketIO.to(options.socketIOClientId).emit('token', chunk.response) } } else { const response = await chatEngine.chat({ message: input, chatHistory }) diff --git a/packages/components/nodes/engine/QueryEngine/QueryEngine.ts b/packages/components/nodes/engine/QueryEngine/QueryEngine.ts index 7d8d4fe4cad..4f058bd417f 100644 --- a/packages/components/nodes/engine/QueryEngine/QueryEngine.ts +++ b/packages/components/nodes/engine/QueryEngine/QueryEngine.ts @@ -1,4 +1,11 @@ -import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { + ICommonObject, + INode, + INodeData, + INodeOutputsValue, + INodeParams, + IServerSideEventStreamer +} from "../../../src/Interface"; import { RetrieverQueryEngine, ResponseSynthesizer, @@ -71,24 +78,32 @@ class QueryEngine_LlamaIndex implements INode { let sourceDocuments: ICommonObject[] = [] let sourceNodes: NodeWithScore[] = [] let isStreamingStarted = false - const isStreamingEnabled = options.socketIO && options.socketIOClientId - if (isStreamingEnabled) { + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + + if (shouldStreamResponse) { const stream = await queryEngine.query({ query: input, stream: true }) for await (const chunk of stream) { text += chunk.response if (chunk.sourceNodes) sourceNodes = chunk.sourceNodes if (!isStreamingStarted) { isStreamingStarted = true - options.socketIO.to(options.socketIOClientId).emit('start', chunk.response) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.response) + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.response) } - - options.socketIO.to(options.socketIOClientId).emit('token', chunk.response) } if (returnSourceDocuments) { sourceDocuments = reformatSourceDocuments(sourceNodes) - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', sourceDocuments) + if (sseStreamer) { + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + } } } else { const response = await queryEngine.query({ query: input }) diff --git a/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts b/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts index eb6f85dccb4..bcd17458508 100644 --- a/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts +++ b/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts @@ -1,5 +1,12 @@ import { flatten } from 'lodash' -import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { + ICommonObject, + INode, + INodeData, + INodeOutputsValue, + INodeParams, + IServerSideEventStreamer +} from "../../../src/Interface"; import { TreeSummarize, SimpleResponseBuilder, @@ -88,24 +95,32 @@ class SubQuestionQueryEngine_LlamaIndex implements INode { let sourceDocuments: ICommonObject[] = [] let sourceNodes: NodeWithScore[] = [] let isStreamingStarted = false - const isStreamingEnabled = options.socketIO && options.socketIOClientId - if (isStreamingEnabled) { + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId + + if (shouldStreamResponse) { const stream = await queryEngine.query({ query: input, stream: true }) for await (const chunk of stream) { text += chunk.response if (chunk.sourceNodes) sourceNodes = chunk.sourceNodes if (!isStreamingStarted) { isStreamingStarted = true - options.socketIO.to(options.socketIOClientId).emit('start', chunk.response) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, chunk.response) + } + } + if (sseStreamer) { + sseStreamer.streamTokenEvent(chatId, chunk.response) } - - options.socketIO.to(options.socketIOClientId).emit('token', chunk.response) } if (returnSourceDocuments) { sourceDocuments = reformatSourceDocuments(sourceNodes) - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', sourceDocuments) + if (sseStreamer) { + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + } } } else { const response = await queryEngine.query({ query: input }) diff --git a/packages/components/nodes/moderation/Moderation.ts b/packages/components/nodes/moderation/Moderation.ts index 9fd2bfde340..7e37ee5be17 100644 --- a/packages/components/nodes/moderation/Moderation.ts +++ b/packages/components/nodes/moderation/Moderation.ts @@ -1,4 +1,4 @@ -import { Server } from 'socket.io' +import { IServerSideEventStreamer } from '../../src' export abstract class Moderation { abstract checkForViolations(input: string): Promise @@ -13,15 +13,13 @@ export const checkInputs = async (inputModerations: Moderation[], input: string) // is this the correct location for this function? // should we have a utils files that all node components can use? -export const streamResponse = (isStreaming: any, response: string, socketIO: Server, socketIOClientId: string) => { - if (isStreaming) { - const result = response.split(/(\s+)/) - result.forEach((token: string, index: number) => { - if (index === 0) { - socketIO.to(socketIOClientId).emit('start', token) - } - socketIO.to(socketIOClientId).emit('token', token) - }) - socketIO.to(socketIOClientId).emit('end') - } +export const streamResponse = (sseStreamer: IServerSideEventStreamer, chatId: string, response: string) => { + const result = response.split(/(\s+)/) + result.forEach((token: string, index: number) => { + if (index === 0) { + sseStreamer.streamStartEvent(chatId, token) + } + sseStreamer.streamTokenEvent(chatId, token) + }) + sseStreamer.streamEndEvent(chatId) } diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index 75a7a11eb82..6bacae75e69 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -399,8 +399,18 @@ export interface IVisionChatModal { export interface IServerSideEventStreamer { streamEvent(chatId: string, data: string): void - streamSourceDocumentsEvent(chatId: string, data: string): void - streamTokenEvent(chatId: string, data: string): void streamStartEvent(chatId: string, data: string): void + + streamTokenEvent(chatId: string, data: string): void + + streamSourceDocumentsEvent(chatId: string, data: string): void + streamUsedToolsEvent(chatId: string, data: string): void + streamFileAnnotationsEvent(chatId: string, data: string): void + streamToolEvent(chatId: string, data: string): void + streamAgentReasoningEvent(chatId: string, data: string): void + streamNextAgentEvent(chatId: string, data: string): void + streamActionEvent(chatId: string, data: string): void + + streamAbortEvent(chatId: string): void streamEndEvent(chatId: string): void } diff --git a/packages/components/src/handler.ts b/packages/components/src/handler.ts index 307b7b0b517..a7b5965b1eb 100644 --- a/packages/components/src/handler.ts +++ b/packages/components/src/handler.ts @@ -1,6 +1,5 @@ import { Logger } from 'winston' import { v4 as uuidv4 } from 'uuid' -import { Server } from 'socket.io' import { Client } from 'langsmith' import CallbackHandler from 'langfuse-langchain' import lunary from 'lunary' @@ -163,18 +162,16 @@ export class ConsoleCallbackHandler extends BaseTracer { export class CustomChainHandler extends BaseCallbackHandler { name = 'custom_chain_handler' isLLMStarted = false - socketIO: Server - socketIOClientId = '' skipK = 0 // Skip streaming for first K numbers of handleLLMStart returnSourceDocuments = false cachedResponse = true chatId: string = '' - sseStreamer: IServerSideEventStreamer + sseStreamer: IServerSideEventStreamer | undefined - constructor(socketIO: Server, socketIOClientId: string, skipK?: number, returnSourceDocuments?: boolean) { + constructor(sseStreamer: IServerSideEventStreamer | undefined, chatId: string, skipK?: number, returnSourceDocuments?: boolean) { super() - this.socketIO = socketIO - this.socketIOClientId = socketIOClientId + this.sseStreamer = sseStreamer + this.chatId = chatId this.skipK = skipK ?? this.skipK this.returnSourceDocuments = returnSourceDocuments ?? this.returnSourceDocuments } @@ -188,24 +185,18 @@ export class CustomChainHandler extends BaseCallbackHandler { if (this.skipK === 0) { if (!this.isLLMStarted) { this.isLLMStarted = true - this.socketIO.to(this.socketIOClientId).emit('start', token) if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') this.sseStreamer.streamStartEvent(this.chatId, token) } } - this.socketIO.to(this.socketIOClientId).emit('token', token) if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') this.sseStreamer.streamTokenEvent(this.chatId, token) } } } handleLLMEnd() { - this.socketIO.to(this.socketIOClientId).emit('end') if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: end\ndata: [END]\n\n') this.sseStreamer.streamEndEvent(this.chatId) } } @@ -222,37 +213,24 @@ export class CustomChainHandler extends BaseCallbackHandler { const result = cachedValue.split(/(\s+)/) result.forEach((token: string, index: number) => { if (index === 0) { - this.socketIO.to(this.socketIOClientId).emit('start', token) if (this.sseStreamer) { //this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') this.sseStreamer.streamStartEvent(this.chatId, token) } } if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') this.sseStreamer.streamTokenEvent(this.chatId, token) } - this.socketIO.to(this.socketIOClientId).emit('token', token) }) - if (this.returnSourceDocuments) { - this.socketIO.to(this.socketIOClientId).emit('sourceDocuments', outputs?.sourceDocuments) - if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') - this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) - } + if (this.returnSourceDocuments && this.sseStreamer) { + this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) } - this.socketIO.to(this.socketIOClientId).emit('end') if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: token\ndata: ' + token + '\n\n') this.sseStreamer.streamEndEvent(this.chatId) } } else { - if (this.returnSourceDocuments) { - this.socketIO.to(this.socketIOClientId).emit('sourceDocuments', outputs?.sourceDocuments) - if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: sourceDocuments\ndata: ' + outputs?.sourceDocuments + '\n\n') - this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) - } + if (this.returnSourceDocuments && this.sseStreamer) { + this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) } } } diff --git a/packages/server/src/Interface.ts b/packages/server/src/Interface.ts index f4104576233..97a6d1d9bf9 100644 --- a/packages/server/src/Interface.ts +++ b/packages/server/src/Interface.ts @@ -216,7 +216,6 @@ export interface IMessage { export interface IncomingInput { question: string overrideConfig?: ICommonObject - socketIOClientId?: string chatId?: string stopNodeId?: string uploads?: IFileUpload[] diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index 1fea952d7a3..14072c1e550 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -1,16 +1,39 @@ import { Request, Response, NextFunction } from 'express' import { utilBuildChatflow } from '../../utils/buildChatflow' +import { getRunningExpressApp } from '../../utils/getRunningExpressApp' // Send input message and get prediction result (Internal) const createInternalPrediction = async (req: Request, res: Response, next: NextFunction) => { try { - const apiResponse = await utilBuildChatflow(req, req.io, true) + const chatId = req.params.chatId + //getRunningExpressApp().sseStreamer.addClient(chatId, res) + + const apiResponse = await utilBuildChatflow(req, true) + if (apiResponse.isStreamValid) { + const sseStreamer = getRunningExpressApp().sseStreamer + if (apiResponse.chatId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) + } + if (apiResponse.chatMessageId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) + } + if (apiResponse.question) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) + } + if (apiResponse.sessionId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) + } + if (apiResponse.memoryType) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) + } + sseStreamer.removeClient(apiResponse.chatId) + } + return res.json(apiResponse) } catch (error) { next(error) } } - export default { createInternalPrediction } diff --git a/packages/server/src/controllers/predictions/index.ts b/packages/server/src/controllers/predictions/index.ts index 0e78c80f7cd..5b3b7b797b1 100644 --- a/packages/server/src/controllers/predictions/index.ts +++ b/packages/server/src/controllers/predictions/index.ts @@ -5,6 +5,7 @@ import logger from '../../utils/logger' import predictionsServices from '../../services/predictions' import { InternalFlowiseError } from '../../errors/internalFlowiseError' import { StatusCodes } from 'http-status-codes' +import { getRunningExpressApp } from '../../utils/getRunningExpressApp' // Send input message and get prediction result (External) const createPrediction = async (req: Request, res: Response, next: NextFunction) => { @@ -46,9 +47,42 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) } } if (isDomainAllowed) { + const streamable = await chatflowsService.checkIfChatflowIsValidForStreaming(req.params.id) + if (streamable?.isStreaming && req.body.streaming === 'true') { + res.setHeader('Content-Type', 'text/event-stream') + res.setHeader('Cache-Control', 'no-cache') + res.setHeader('Connection', 'keep-alive') + res.flushHeaders() + const chatId = req.body.chatId + getRunningExpressApp().sseStreamer.addExternalClient(chatId, res) + } + //@ts-ignore - const apiResponse = await predictionsServices.buildChatflow(req, req?.io) - return res.json(apiResponse) + const apiResponse = await predictionsServices.buildChatflow(req) + if (streamable?.isStreaming && req.body.streaming === 'true') { + const sseStreamer = getRunningExpressApp().sseStreamer + if (apiResponse.chatId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) + } + if (apiResponse.chatMessageId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) + } + if (apiResponse.question) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) + } + if (apiResponse.sessionId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) + } + if (apiResponse.memoryType) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) + } + sseStreamer.removeClient(apiResponse.chatId) + } + if (req.body.streaming === 'true') { + return + } else { + return res.json(apiResponse) + } } else { throw new InternalFlowiseError(StatusCodes.UNAUTHORIZED, `This site is not allowed to access this chatbot`) } diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 7370607295b..24ef27f0f52 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -141,7 +141,8 @@ export class App { '/api/v1/leads', '/api/v1/get-upload-file', '/api/v1/ip', - '/api/v1/ping' + '/api/v1/ping', + '/api/v1/events' ] this.app.use(async (req, res, next) => { if (/\/api\/v1\//i.test(req.url)) { diff --git a/packages/server/src/services/predictions/index.ts b/packages/server/src/services/predictions/index.ts index e7411fe6ac5..dc2a994dcfb 100644 --- a/packages/server/src/services/predictions/index.ts +++ b/packages/server/src/services/predictions/index.ts @@ -5,9 +5,9 @@ import { utilBuildChatflow } from '../../utils/buildChatflow' import { InternalFlowiseError } from '../../errors/internalFlowiseError' import { getErrorMessage } from '../../errors/utils' -const buildChatflow = async (fullRequest: Request, ioServer: Server) => { +const buildChatflow = async (fullRequest: Request) => { try { - const dbResponse = await utilBuildChatflow(fullRequest, ioServer) + const dbResponse = await utilBuildChatflow(fullRequest) return dbResponse } catch (error) { throw new InternalFlowiseError( diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index 391bd99ba90..b9fc9087aae 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -1,17 +1,84 @@ -import express from 'express' +import express, { NextFunction } from 'express' import { Request, Response } from 'express' import { IServerSideEventStreamer } from 'flowise-components' +import predictionsController from '../controllers/predictions' +import chatflowsService from '../services/chatflows' + +import multer from 'multer' +import path from 'path' + +const upload = multer({ dest: `${path.join(__dirname, '..', '..', '..', 'uploads')}/` }) + +// define a new type that has a client type (INTERNAL or EXTERNAL) and Response type +type Client = { + clientType: 'INTERNAL' | 'EXTERNAL' + response: Response + abort: boolean +} export class SSEStreamer implements IServerSideEventStreamer { - clients: { [id: string]: Response } = {} + clients: { [id: string]: Client } = {} app: express.Application constructor(app: express.Application) { this.app = app + console.log('SSEStreamer constructor') + } + + addExternalClient(chatId: string, res: Response) { + this.clients[chatId] = { clientType: 'EXTERNAL', response: res, abort: false } + } + + addClient(chatId: string, res: Response) { + this.clients[chatId] = { clientType: 'INTERNAL', response: res, abort: false } } - // Setup SSE endpoint + removeClient(chatId: string) { + const client = this.clients[chatId] + console.log('Removing client', chatId) + if (client) { + if (client.clientType === 'INTERNAL') { + client.response.write(`event: end\ndata: [DONE]\n\n`) + } + if (client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'end', + data: '[DONE]' + } + client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + client.response.end() + delete this.clients[chatId] + } + } + + // TODO: remove the /api/v1 prefix from the endpoints setupSSEEndpoint = () => { + // this.app.post( + // '/api/v1/prediction/:id', + // upload.array('files'), + // predictionsController.getRateLimiterMiddleware, + // async (req: Request, res: Response, next: NextFunction) => { + // const streamable = await chatflowsService.checkIfChatflowIsValidForStreaming(req.params.id) + // if (streamable?.isStreaming && req.body.streaming === 'true') { + // res.setHeader('Content-Type', 'text/event-stream') + // res.setHeader('Cache-Control', 'no-cache') + // res.setHeader('Connection', 'keep-alive') + // res.flushHeaders() + // const chatId = req.body.chatId + // this.clients[chatId] = { clientType: 'EXTERNAL', response: res } + // } + // + // await predictionsController.createPrediction(req, res, next) + // if (streamable?.isStreaming && req.body.streaming === 'true') { + // const chatId = req.body.chatId + // req.on('close', () => { + // delete this.clients[chatId] + // }) + // } + // } + // ) + this.app.get('/api/v1/events/:chatId', (req: Request, res: Response) => { res.setHeader('Content-Type', 'text/event-stream') res.setHeader('Cache-Control', 'no-cache') @@ -19,60 +86,226 @@ export class SSEStreamer implements IServerSideEventStreamer { res.flushHeaders() const chatId = req.params.chatId - this.clients[chatId] = res + this.clients[chatId] = { clientType: 'INTERNAL', response: res, abort: false } - req.on('close', () => { - delete this.clients[chatId] - }) + // req.on('close', () => { + // console.log('req.onClose ', chatId, this.clients[chatId]) + // //delete this.clients[chatId] + // }) }) } // Send SSE message to a specific client streamEvent(chatId: string, data: string) { const client = this.clients[chatId] - if (client) { - client.write(`${data}`) + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: start\ndata: ${data}\n\n'`) } - if (data === '[END]') { - delete this.clients[chatId] + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'start', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + + streamCustomEvent(chatId: string, eventType: string, data: string) { + console.log('streamCustomEvent ', eventType, chatId) + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: ${eventType}\ndata: ${data}\n\n`) } - } // Send SSE message to a specific client + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: eventType, + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + } streamStartEvent(chatId: string, data: string) { + console.log('streamStartEvent ', chatId) const client = this.clients[chatId] - if (client) { - client.write(`event: start\ndata: ${data} \n\n'`) + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: start\ndata: ${data} \n\n'`) } - if (data === '[END]') { - delete this.clients[chatId] + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'start', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } } streamTokenEvent(chatId: string, data: string) { + console.log('streamTokenEvent ', chatId) const client = this.clients[chatId] - if (client) { - client.write(`event: token\ndata: ${data} \n\n`) + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: token\ndata: ${data}\n\n`) } - if (data === '[END]') { - delete this.clients[chatId] + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'token', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } } streamSourceDocumentsEvent(chatId: string, data: string) { const client = this.clients[chatId] - if (client) { - client.write(`event: sourceDocuments\ndata: ${data} \n\n`) + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: sourceDocuments\ndata: ${data}\n\n`) } - if (data === '[END]') { - delete this.clients[chatId] + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'sourceDocuments', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + streamUsedToolsEvent(chatId: string, data: string): void { + console.log('streamUsedToolsEvent ', chatId) + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: usedTools\ndata: ${data}\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'usedTools', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + streamFileAnnotationsEvent(chatId: string, data: string): void { + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: fileAnnotations\ndata: ${data}\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'fileAnnotations', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + streamToolEvent(chatId: string, data: string): void { + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: tool\ndata: ${data}\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'tool', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + streamAgentReasoningEvent(chatId: string, data: string): void { + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: agentReasoning\ndata: ${data}\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'agentReasoning', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + streamNextAgentEvent(chatId: string, data: string): void { + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: nextAgent\ndata: ${data}\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'nextAgent', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } + } + streamActionEvent(chatId: string, data: string): void { + const client = this.clients[chatId] + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: action\ndata: ${data}\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'action', + data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + // if (data === '[DONE]') { + // delete this.clients[chatId] + // } } - streamEndEvent(chatId: string) { + streamAbortEvent(chatId: string): void { + console.log('streamAbortEvent ', chatId) const client = this.clients[chatId] - if (client) { - client.write(`'event: sourceDocuments\ndata: [END] \n\n'`) + if (client && client.clientType === 'INTERNAL') { + client.response.write(`event: abort\ndata: [ABORT]\n\n`) + } + if (client && client.clientType === 'EXTERNAL') { + const clientResponse = { + event: 'abort', + data: '[DONE]' + } + client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - delete this.clients[chatId] + client.abort = true + } + + streamEndEvent(chatId: string) { + console.log('dummy streamEndEvent ', chatId) + // const client = this.clients[chatId] + // if (client && client.clientType === 'INTERNAL') { + // client.response.write(`event: end\ndata: [DONE] \n\n`) + // } + // if (client && client.clientType === 'EXTERNAL') { + // const clientResponse = { + // event: 'end', + // data: '[DONE]' + // } + // client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') + // } } } diff --git a/packages/server/src/utils/buildAgentGraph.ts b/packages/server/src/utils/buildAgentGraph.ts index 945bc07ce75..ba94865d693 100644 --- a/packages/server/src/utils/buildAgentGraph.ts +++ b/packages/server/src/utils/buildAgentGraph.ts @@ -9,9 +9,9 @@ import { ISeqAgentsState, ISeqAgentNode, IUsedTool, - IDocument + IDocument, + IServerSideEventStreamer } from 'flowise-components' -import { Server } from 'socket.io' import { omit, cloneDeep, flatten, uniq } from 'lodash' import { StateGraph, END, START } from '@langchain/langgraph' import { Document } from '@langchain/core/documents' @@ -53,7 +53,6 @@ import logger from './logger' * @param {ICommonObject} incomingInput * @param {boolean} isInternal * @param {string} baseURL - * @param {Server} socketIO */ export const buildAgentGraph = async ( chatflow: IChatFlow, @@ -62,7 +61,8 @@ export const buildAgentGraph = async ( incomingInput: IncomingInput, isInternal: boolean, baseURL?: string, - socketIO?: Server + sseStreamer?: IServerSideEventStreamer, + shouldStreamResponse?: boolean ): Promise => { try { const appServer = getRunningExpressApp() @@ -287,28 +287,34 @@ export const buildAgentGraph = async ( ? output[agentName].messages[output[agentName].messages.length - 1].content : lastWorkerResult - if (socketIO && incomingInput.socketIOClientId) { + if (shouldStreamResponse) { if (!isStreamingStarted) { isStreamingStarted = true - socketIO.to(incomingInput.socketIOClientId).emit('start', agentReasoning) + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, JSON.stringify(agentReasoning)) + } } - socketIO.to(incomingInput.socketIOClientId).emit('agentReasoning', agentReasoning) + if (sseStreamer) { + sseStreamer.streamAgentReasoningEvent(chatId, JSON.stringify(agentReasoning)) + } // Send loading next agent indicator if (reasoning.next && reasoning.next !== 'FINISH' && reasoning.next !== 'END') { - socketIO - .to(incomingInput.socketIOClientId) - .emit('nextAgent', mapNameToLabel[reasoning.next].label || reasoning.next) + if (sseStreamer) { + sseStreamer.streamNextAgentEvent( + chatId, + mapNameToLabel[reasoning.next].label || JSON.stringify(reasoning.next) + ) + } } } } } else { finalResult = output.__end__.messages.length ? output.__end__.messages.pop()?.content : '' if (Array.isArray(finalResult)) finalResult = output.__end__.instructions - - if (socketIO && incomingInput.socketIOClientId) { - socketIO.to(incomingInput.socketIOClientId).emit('token', finalResult) + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamTokenEvent(chatId, finalResult) } } } @@ -321,9 +327,8 @@ export const buildAgentGraph = async ( if (!isSequential && !finalResult) { if (lastWorkerResult) finalResult = lastWorkerResult else if (finalSummarization) finalResult = finalSummarization - - if (socketIO && incomingInput.socketIOClientId) { - socketIO.to(incomingInput.socketIOClientId).emit('token', finalResult) + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamTokenEvent(chatId, finalResult) } } @@ -377,16 +382,16 @@ export const buildAgentGraph = async ( { type: 'reject-button', label: rejectButtonText } ] } - if (socketIO && incomingInput.socketIOClientId) { - socketIO.to(incomingInput.socketIOClientId).emit('token', finalResult) - socketIO.to(incomingInput.socketIOClientId).emit('action', finalAction) + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamTokenEvent(chatId, finalResult) + sseStreamer.streamActionEvent(chatId, finalResult) } } totalUsedTools.push(...mappedToolCalls) } else if (lastAgentReasoningMessage) { finalResult = lastAgentReasoningMessage - if (socketIO && incomingInput.socketIOClientId) { - socketIO.to(incomingInput.socketIOClientId).emit('token', finalResult) + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamTokenEvent(chatId, finalResult) } } } @@ -394,10 +399,10 @@ export const buildAgentGraph = async ( totalSourceDocuments = uniq(flatten(totalSourceDocuments)) totalUsedTools = uniq(flatten(totalUsedTools)) - if (socketIO && incomingInput.socketIOClientId) { - socketIO.to(incomingInput.socketIOClientId).emit('usedTools', totalUsedTools) - socketIO.to(incomingInput.socketIOClientId).emit('sourceDocuments', totalSourceDocuments) - socketIO.to(incomingInput.socketIOClientId).emit('end') + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(totalUsedTools)) + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(totalSourceDocuments)) + sseStreamer.streamEndEvent(chatId) } return { @@ -412,8 +417,8 @@ export const buildAgentGraph = async ( // clear agent memory because checkpoints were saved during runtime await clearSessionMemory(nodes, appServer.nodesPool.componentNodes, chatId, appServer.AppDataSource, sessionId) if (getErrorMessage(e).includes('Aborted')) { - if (socketIO && incomingInput.socketIOClientId) { - socketIO.to(incomingInput.socketIOClientId).emit('abort') + if (shouldStreamResponse && sseStreamer) { + sseStreamer.streamAbortEvent(chatId) } return { finalResult, agentReasoning } } diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index b3179f699cf..75151563d02 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -5,7 +5,8 @@ import { ICommonObject, addSingleFileToStorage, addArrayFilesToStorage, - mapMimeTypeToInputField + mapMimeTypeToInputField, + IServerSideEventStreamer } from 'flowise-components' import { StatusCodes } from 'http-status-codes' import { @@ -22,7 +23,6 @@ import { } from '../Interface' import { InternalFlowiseError } from '../errors/internalFlowiseError' import { ChatFlow } from '../database/entities/ChatFlow' -import { Server } from 'socket.io' import { getRunningExpressApp } from '../utils/getRunningExpressApp' import { isFlowValidForStream, @@ -56,10 +56,9 @@ import { IAction } from 'flowise-components' /** * Build Chatflow * @param {Request} req - * @param {Server} socketIO * @param {boolean} isInternal */ -export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInternal: boolean = false): Promise => { +export const utilBuildChatflow = async (req: Request, isInternal: boolean = false): Promise => { try { const appServer = getRunningExpressApp() const chatflowid = req.params.id @@ -160,8 +159,7 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter } incomingInput = { question: req.body.question ?? 'hello', - overrideConfig, - socketIOClientId: req.body.socketIOClientId + overrideConfig } } @@ -180,7 +178,9 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter const { graph, nodeDependencies } = constructGraphs(nodes, edges) const directedGraph = graph const endingNodes = getEndingNodes(nodeDependencies, directedGraph, nodes) - + // if this is an external prediction call, and they have requested streaming + let streamResponse = isStreamValid ? !isInternal && req.body.streaming === 'true' : false + console.log('streamResponse', streamResponse) /*** If the graph is an agent graph, build the agent response ***/ if (endingNodes.filter((node) => node.data.category === 'Multi Agents' || node.data.category === 'Sequential Agents').length) { return await utilBuildAgentResponse( @@ -194,8 +194,9 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter incomingInput, nodes, edges, - socketIO, - baseURL + baseURL, + appServer.sseStreamer, + streamResponse ) } @@ -259,6 +260,7 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter // Once custom function ending node exists, flow is always unavailable to stream isStreamValid = isCustomFunctionEndingNode ? false : isStreamValid + streamResponse = isStreamValid ? !isInternal && req.body.streaming === 'true' : false let chatHistory: IMessage[] = [] @@ -319,9 +321,7 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter cachePool: appServer.cachePool, isUpsert: false, uploads: incomingInput.uploads, - baseURL, - socketIO, - socketIOClientId: incomingInput.socketIOClientId + baseURL }) const nodeToExecute = @@ -354,6 +354,7 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter const nodeInstanceFilePath = appServer.nodesPool.componentNodes[nodeToExecuteData.name].filePath as string const nodeModule = await import(nodeInstanceFilePath) const nodeInstance = new nodeModule.nodeClass({ sessionId }) + console.log('streamResponse 2', isStreamValid) let result = isStreamValid ? await nodeInstance.run(nodeToExecuteData, incomingInput.question, { @@ -364,10 +365,9 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter databaseEntities, analytic: chatflow.analytic, uploads: incomingInput.uploads, - socketIO, - socketIOClientId: incomingInput.socketIOClientId, prependMessages, - sseStreamer: appServer.sseStreamer + sseStreamer: appServer.sseStreamer, + shouldStreamResponse: isStreamValid }) : await nodeInstance.run(nodeToExecuteData, incomingInput.question, { chatId, @@ -434,6 +434,8 @@ export const utilBuildChatflow = async (req: Request, socketIO?: Server, isInter result.question = incomingInput.question result.chatId = chatId result.chatMessageId = chatMessage?.id + result.isStreamValid = isStreamValid + if (sessionId) result.sessionId = sessionId if (memoryType) result.memoryType = memoryType @@ -459,12 +461,22 @@ const utilBuildAgentResponse = async ( incomingInput: IncomingInput, nodes: IReactFlowNode[], edges: IReactFlowEdge[], - socketIO?: Server, - baseURL?: string + baseURL?: string, + sseStreamer?: IServerSideEventStreamer, + shouldStreamResponse?: boolean ) => { try { const appServer = getRunningExpressApp() - const streamResults = await buildAgentGraph(agentflow, chatId, sessionId, incomingInput, isInternal, baseURL, socketIO) + const streamResults = await buildAgentGraph( + agentflow, + chatId, + sessionId, + incomingInput, + isInternal, + baseURL, + sseStreamer, + shouldStreamResponse + ) if (streamResults) { const { finalResult, finalAction, sourceDocuments, usedTools, agentReasoning } = streamResults const userMessage: Omit = { diff --git a/packages/server/src/utils/index.ts b/packages/server/src/utils/index.ts index 2f884b11aae..0c7589949fa 100644 --- a/packages/server/src/utils/index.ts +++ b/packages/server/src/utils/index.ts @@ -436,8 +436,6 @@ type BuildFlowParams = { stopNodeId?: string uploads?: IFileUpload[] baseURL?: string - socketIO?: Server - socketIOClientId?: string } /** @@ -462,9 +460,7 @@ export const buildFlow = async ({ isUpsert, stopNodeId, uploads, - baseURL, - socketIO, - socketIOClientId + baseURL }: BuildFlowParams) => { const flowNodes = cloneDeep(reactFlowNodes) @@ -525,9 +521,7 @@ export const buildFlow = async ({ cachePool, dynamicVariables, uploads, - baseURL, - socketIO, - socketIOClientId + baseURL }) if (indexResult) upsertHistory['result'] = indexResult logger.debug(`[server]: Finished upserting ${reactFlowNode.data.label} (${reactFlowNode.data.id})`) @@ -553,8 +547,6 @@ export const buildFlow = async ({ dynamicVariables, uploads, baseURL, - socketIO, - socketIOClientId, componentNodes: componentNodes as ICommonObject }) diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 992ce19243d..200b320291c 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -1,7 +1,6 @@ import { useState, useRef, useEffect, useCallback, Fragment } from 'react' import { useSelector, useDispatch } from 'react-redux' import PropTypes from 'prop-types' -import socketIOClient from 'socket.io-client' import { cloneDeep } from 'lodash' import rehypeMathjax from 'rehype-mathjax' import rehypeRaw from 'rehype-raw' @@ -171,7 +170,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview type: 'apiMessage' } ]) - const [socketIOClientId, setSocketIOClientId] = useState('') + //const [socketIOClientId, setSocketIOClientId] = useState('') const [isChatFlowAvailableToStream, setIsChatFlowAvailableToStream] = useState(false) const [isChatFlowAvailableForSpeech, setIsChatFlowAvailableForSpeech] = useState(false) const [sourceDialogOpen, setSourceDialogOpen] = useState(false) @@ -643,7 +642,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } if (uploads && uploads.length > 0) params.uploads = uploads if (leadEmail) params.leadEmail = leadEmail - if (isChatFlowAvailableToStream) params.socketIOClientId = socketIOClientId + if (action) params.action = action if (uploadedFiles.length > 0) { @@ -665,80 +664,53 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } } - setupSSE(chatId) + /* TODO: Make this one call, after we convert this to GET. */ + setupSSE(chatflowid, params) const response = await predictionApi.sendMessageAndGetPrediction(chatflowid, params) - if (response.data) { - const data = response.data - - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 1].type === 'apiMessage') { - allMessages[allMessages.length - 1].id = data?.chatMessageId - } - return allMessages - }) - - setChatId(data.chatId) - - if (input === '' && data.question) { - // the response contains the question even if it was in an audio format - // so if input is empty but the response contains the question, update the user message to show the question - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages - allMessages[allMessages.length - 2].message = data.question - return allMessages - }) - } - - if (!isChatFlowAvailableToStream) { - let text = '' - if (data.text) text = data.text - else if (data.json) text = '```json\n' + JSON.stringify(data.json, null, 2) - else text = JSON.stringify(data, null, 2) - - setMessages((prevMessages) => [ - ...prevMessages, - { - message: text, - id: data?.chatMessageId, - sourceDocuments: data?.sourceDocuments, - usedTools: data?.usedTools, - fileAnnotations: data?.fileAnnotations, - agentReasoning: data?.agentReasoning, - action: data?.action, - type: 'apiMessage', - feedback: null - } - ]) - } - setLocalStorageChatflow(chatflowid, data.chatId) - setLoading(false) - setUserInput('') - setUploadedFiles([]) - setTimeout(() => { - inputRef.current?.focus() - scrollToBottom() - }, 100) - } + // TBD: handle this part of the response + // if (response.data) { + // const data = response.data + // if (!isChatFlowAvailableToStream) { + // let text = '' + // if (data.text) text = data.text + // else if (data.json) text = '```json\n' + JSON.stringify(data.json, null, 2) + // else text = JSON.stringify(data, null, 2) + // + // setMessages((prevMessages) => [ + // ...prevMessages, + // { + // message: text, + // id: data?.chatMessageId, + // sourceDocuments: data?.sourceDocuments, + // usedTools: data?.usedTools, + // fileAnnotations: data?.fileAnnotations, + // agentReasoning: data?.agentReasoning, + // action: data?.action, + // type: 'apiMessage', + // feedback: null + // } + // ]) + // } + // } } catch (error) { handleError(error.response.data.message) return } } - const setupSSE = (chatId) => { + const setupSSE = (chatflowid, params) => { + const chatId = params.chatId + const input = params.question // Establish the SSE connection to receive the streamed response + ///internal-prediction/${id} const eventSource = new EventSource(`${baseURL}/api/v1/events/${chatId}`) eventSource.addEventListener('start', (event) => { - console.log('onStart', event.data) setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) }) eventSource.addEventListener('token', (event) => { - console.log('onToken', event.data) updateLastMessage(event.data) }) @@ -747,12 +719,78 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }) eventSource.addEventListener('end', () => { - console.log('onEnd : ' + event.data) + setLocalStorageChatflow(chatflowid, chatId) + setLoading(false) + setUserInput('') + setUploadedFiles([]) + setTimeout(() => { + inputRef.current?.focus() + scrollToBottom() + }, 100) eventSource.close() // Close the connection when stream ends }) + eventSource.addEventListener('usedTools', (event) => { + updateLastMessageUsedTools(JSON.parse(event.data)) + }) + + eventSource.addEventListener('fileAnnotations', (event) => { + updateLastMessageFileAnnotations(JSON.parse(event.data)) + }) + + eventSource.addEventListener('agentReasoning', (event) => { + updateLastMessageAgentReasoning(JSON.parse(event.data)) + }) + + eventSource.addEventListener('action', (event) => { + updateLastMessageAction(JSON.parse(event.data)) + }) + + eventSource.addEventListener('nextAgent', (event) => { + updateLastMessageNextAgent(JSON.parse(event.data)) + }) + + eventSource.addEventListener('chatId', (event) => { + setChatId(event.data) + }) + + eventSource.addEventListener('question', (event) => { + if (input === '' && event.data) { + // the response contains the question even if it was in an audio format + // so if input is empty but the response contains the question, update the user message to show the question + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages + allMessages[allMessages.length - 2].message = event.data + return allMessages + }) + } + }) + + eventSource.addEventListener('chatMessageId', (event) => { + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'apiMessage') { + allMessages[allMessages.length - 1].id = event.data + } + return allMessages + }) + }) + + eventSource.addEventListener('abort', (event) => { + abortMessage(event.data) + }) + eventSource.onmessage = (event) => { - if (event.data === '[END]') { + if (event.data === '[DONE]') { + setLocalStorageChatflow(chatflowid, chatId) + setLoading(false) + setUserInput('') + setUploadedFiles([]) + setTimeout(() => { + inputRef.current?.focus() + scrollToBottom() + }, 100) eventSource.close() // Close the connection when stream ends } } @@ -929,7 +967,6 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }, [isDialog, inputRef]) useEffect(() => { - let socket if (open && chatflowid) { // API request getChatmessageApi.request(chatflowid) @@ -950,31 +987,31 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } // SocketIO - socket = socketIOClient(baseURL) - - socket.on('connect', () => { - setSocketIOClientId(socket.id) - }) - - socket.on('start', () => { - // setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) - }) - - //socket.on('sourceDocuments', updateLastMessageSourceDocuments) - - socket.on('usedTools', updateLastMessageUsedTools) - - socket.on('fileAnnotations', updateLastMessageFileAnnotations) - - //socket.on('token', updateLastMessage) - - socket.on('agentReasoning', updateLastMessageAgentReasoning) - - socket.on('action', updateLastMessageAction) - - socket.on('nextAgent', updateLastMessageNextAgent) - - socket.on('abort', abortMessage) + // socket = socketIOClient(baseURL) + // + // socket.on('connect', () => { + // setSocketIOClientId(socket.id) + // }) + // + // socket.on('start', () => { + // // setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) + // }) + // + // //socket.on('sourceDocuments', updateLastMessageSourceDocuments) + // + // socket.on('usedTools', updateLastMessageUsedTools) + // + // socket.on('fileAnnotations', updateLastMessageFileAnnotations) + // + // //socket.on('token', updateLastMessage) + // + // socket.on('agentReasoning', updateLastMessageAgentReasoning) + // + // socket.on('action', updateLastMessageAction) + // + // socket.on('nextAgent', updateLastMessageNextAgent) + // + // socket.on('abort', abortMessage) } return () => { @@ -987,10 +1024,10 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview type: 'apiMessage' } ]) - if (socket) { - socket.disconnect() - setSocketIOClientId('') - } + // if (socket) { + // socket.disconnect() + // setSocketIOClientId('') + // } } // eslint-disable-next-line react-hooks/exhaustive-deps From f0c259f55d279e63d85806d0abd81da15d0e3ada Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Sun, 1 Sep 2024 12:11:30 +0530 Subject: [PATCH 06/23] lint fixes --- .../nodes/agents/AirtableAgent/AirtableAgent.ts | 9 +-------- packages/components/nodes/agents/CSVAgent/CSVAgent.ts | 9 +-------- .../agents/ConversationalAgent/ConversationalAgent.ts | 2 +- .../OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts | 2 +- .../nodes/agents/OpenAIAssistant/OpenAIAssistant.ts | 2 +- packages/components/nodes/agents/ToolAgent/ToolAgent.ts | 2 +- packages/components/nodes/agents/XMLAgent/XMLAgent.ts | 4 ++-- packages/components/nodes/chains/ApiChain/GETApiChain.ts | 2 +- .../components/nodes/chains/ApiChain/OpenAPIChain.ts | 2 +- .../components/nodes/chains/ApiChain/POSTApiChain.ts | 2 +- .../nodes/chains/ConversationChain/ConversationChain.ts | 5 +++-- .../nodes/chains/MultiPromptChain/MultiPromptChain.ts | 9 +-------- .../MultiRetrievalQAChain/MultiRetrievalQAChain.ts | 9 +-------- .../nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts | 2 +- .../nodes/chains/VectorDBQAChain/VectorDBQAChain.ts | 2 +- .../nodes/engine/ChatEngine/ContextChatEngine.ts | 2 +- .../nodes/engine/ChatEngine/SimpleChatEngine.ts | 2 +- .../components/nodes/engine/QueryEngine/QueryEngine.ts | 9 +-------- .../SubQuestionQueryEngine/SubQuestionQueryEngine.ts | 9 +-------- packages/server/src/services/predictions/index.ts | 1 - packages/server/src/utils/SSEStreamer.ts | 6 +----- 21 files changed, 23 insertions(+), 69 deletions(-) diff --git a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts index ff649e6a628..a56d78377cb 100644 --- a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts +++ b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts @@ -2,14 +2,7 @@ import axios from 'axios' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { AgentExecutor } from 'langchain/agents' import { LLMChain } from 'langchain/chains' -import { - ICommonObject, - INode, - INodeData, - INodeParams, - IServerSideEventStreamer, - PromptTemplate -} from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, PromptTemplate } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { LoadPyodide, finalSystemPrompt, systemPrompt } from './core' diff --git a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts index f51696dbeb1..bbebb856b9f 100644 --- a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts +++ b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts @@ -2,14 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { AgentExecutor } from 'langchain/agents' import { LLMChain } from 'langchain/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { - ICommonObject, - INode, - INodeData, - INodeParams, - IServerSideEventStreamer, - PromptTemplate -} from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, PromptTemplate } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { LoadPyodide, finalSystemPrompt, systemPrompt } from './core' import { checkInputs, Moderation } from '../../moderation/Moderation' diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index 19b5f8ad8aa..c3a2b9591d9 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -18,7 +18,7 @@ import { INodeParams, IUsedTool, IServerSideEventStreamer -} from "../../../src/Interface"; +} from '../../../src/Interface' import { AgentExecutor } from '../../../src/agents' import { addImagesToMessages, llmSupportsVision } from '../../../src/multiModalUtils' import { checkInputs, Moderation } from '../../moderation/Moderation' diff --git a/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts b/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts index 98c582c1282..90481f38750 100644 --- a/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts +++ b/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts @@ -10,7 +10,7 @@ import { INodeParams, IServerSideEventStreamer, IUsedTool -} from "../../../../src/Interface"; +} from '../../../../src/Interface' class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { label: string diff --git a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts index faa14558b90..677d6063491 100644 --- a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts +++ b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts @@ -7,7 +7,7 @@ import { INodeParams, IServerSideEventStreamer, IUsedTool -} from "../../../src/Interface"; +} from '../../../src/Interface' import OpenAI from 'openai' import { DataSource } from 'typeorm' import { getCredentialData, getCredentialParam } from '../../../src/utils' diff --git a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts index 02df55dc991..1d17c523a97 100644 --- a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts +++ b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts @@ -17,7 +17,7 @@ import { IServerSideEventStreamer, IUsedTool, IVisionChatModal -} from "../../../src/Interface"; +} from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { AgentExecutor, ToolCallingAgentOutputParser } from '../../../src/agents' import { Moderation, checkInputs, streamResponse } from '../../moderation/Moderation' diff --git a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts index 459266f5e4d..198d1ff3034 100644 --- a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts +++ b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts @@ -16,10 +16,10 @@ import { INodeParams, IServerSideEventStreamer, IUsedTool -} from "../../../src/Interface"; +} from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { AgentExecutor, XMLAgentOutputParser } from '../../../src/agents' -import { Moderation, checkInputs, streamResponse } from "../../moderation/Moderation"; +import { Moderation, checkInputs } from '../../moderation/Moderation' import { formatResponse } from '../../outputparsers/OutputParserHelpers' const defaultSystemMessage = `You are a helpful assistant. Help the user answer any questions. diff --git a/packages/components/nodes/chains/ApiChain/GETApiChain.ts b/packages/components/nodes/chains/ApiChain/GETApiChain.ts index d4eee2a073f..ac3ef7f4fdc 100644 --- a/packages/components/nodes/chains/ApiChain/GETApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/GETApiChain.ts @@ -2,7 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate } from '@langchain/core/prompts' import { APIChain } from 'langchain/chains' import { getBaseClasses } from '../../../src/utils' -import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' export const API_URL_RAW_PROMPT_TEMPLATE = `You are given the below API Documentation: diff --git a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts index 91c6b31416e..a97691a2eac 100644 --- a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts +++ b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts @@ -1,5 +1,5 @@ import { APIChain, createOpenAPIChain } from 'langchain/chains' -import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' diff --git a/packages/components/nodes/chains/ApiChain/POSTApiChain.ts b/packages/components/nodes/chains/ApiChain/POSTApiChain.ts index a3d66f66fb7..b93c0bacdfd 100644 --- a/packages/components/nodes/chains/ApiChain/POSTApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/POSTApiChain.ts @@ -2,7 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate } from '@langchain/core/prompts' import { API_RESPONSE_RAW_PROMPT_TEMPLATE, API_URL_RAW_PROMPT_TEMPLATE, APIChain } from './postCore' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' class POSTApiChain_Chains implements INode { diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index 5a7b2e12b58..606e67d6b7a 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -23,8 +23,9 @@ import { INode, INodeData, INodeParams, - MessageContentImageUrl, IServerSideEventStreamer -} from "../../../src/Interface"; + MessageContentImageUrl, + IServerSideEventStreamer +} from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, handleEscapeCharacters } from '../../../src/utils' diff --git a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts index 80504fdbc4e..f6d75b6675a 100644 --- a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts +++ b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts @@ -1,13 +1,6 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { MultiPromptChain } from 'langchain/chains' -import { - ICommonObject, - INode, - INodeData, - INodeParams, - IServerSideEventStreamer, - PromptRetriever -} from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, PromptRetriever } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts index 1e2d8eb1bc5..7736479aa7d 100644 --- a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts @@ -1,13 +1,6 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { MultiRetrievalQAChain } from 'langchain/chains' -import { - ICommonObject, - INode, - INodeData, - INodeParams, - IServerSideEventStreamer, - VectorStoreRetriever -} from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, VectorStoreRetriever } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' diff --git a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts index 29a8c0fbaf0..dbdd4698053 100644 --- a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts +++ b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts @@ -4,7 +4,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate, PromptTemplateInput } from '@langchain/core/prompts' import { SqlDatabaseChain, SqlDatabaseChainInput, DEFAULT_SQL_DATABASE_PROMPT } from 'langchain/chains/sql_db' import { SqlDatabase } from 'langchain/sql_db' -import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, getInputVariables } from '../../../src/utils' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' diff --git a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts index 0ad1d4dc783..b9bd1f3db46 100644 --- a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts +++ b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts @@ -2,7 +2,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { VectorStore } from '@langchain/core/vectorstores' import { VectorDBQAChain } from 'langchain/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { checkInputs, Moderation } from '../../moderation/Moderation' import { formatResponse } from '../../outputparsers/OutputParserHelpers' diff --git a/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts b/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts index dd5fa110598..dd0f4d80722 100644 --- a/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts +++ b/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts @@ -7,7 +7,7 @@ import { INodeOutputsValue, INodeParams, IServerSideEventStreamer -} from "../../../src/Interface"; +} from '../../../src/Interface' import { Metadata, BaseRetriever, LLM, ContextChatEngine, ChatMessage, NodeWithScore } from 'llamaindex' import { reformatSourceDocuments } from '../EngineUtils' diff --git a/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts b/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts index 7fcb5b4d7c6..e6045fda6c6 100644 --- a/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts +++ b/packages/components/nodes/engine/ChatEngine/SimpleChatEngine.ts @@ -7,7 +7,7 @@ import { INodeOutputsValue, INodeParams, IServerSideEventStreamer -} from "../../../src/Interface"; +} from '../../../src/Interface' import { LLM, ChatMessage, SimpleChatEngine } from 'llamaindex' class SimpleChatEngine_LlamaIndex implements INode { diff --git a/packages/components/nodes/engine/QueryEngine/QueryEngine.ts b/packages/components/nodes/engine/QueryEngine/QueryEngine.ts index 4f058bd417f..bd22ae8be0f 100644 --- a/packages/components/nodes/engine/QueryEngine/QueryEngine.ts +++ b/packages/components/nodes/engine/QueryEngine/QueryEngine.ts @@ -1,11 +1,4 @@ -import { - ICommonObject, - INode, - INodeData, - INodeOutputsValue, - INodeParams, - IServerSideEventStreamer -} from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { RetrieverQueryEngine, ResponseSynthesizer, diff --git a/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts b/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts index bcd17458508..caefcc89517 100644 --- a/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts +++ b/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts @@ -1,12 +1,5 @@ import { flatten } from 'lodash' -import { - ICommonObject, - INode, - INodeData, - INodeOutputsValue, - INodeParams, - IServerSideEventStreamer -} from "../../../src/Interface"; +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { TreeSummarize, SimpleResponseBuilder, diff --git a/packages/server/src/services/predictions/index.ts b/packages/server/src/services/predictions/index.ts index dc2a994dcfb..6f2dbe199c1 100644 --- a/packages/server/src/services/predictions/index.ts +++ b/packages/server/src/services/predictions/index.ts @@ -1,5 +1,4 @@ import { Request } from 'express' -import { Server } from 'socket.io' import { StatusCodes } from 'http-status-codes' import { utilBuildChatflow } from '../../utils/buildChatflow' import { InternalFlowiseError } from '../../errors/internalFlowiseError' diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index b9fc9087aae..2707619b3ac 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -1,14 +1,10 @@ -import express, { NextFunction } from 'express' +import express from 'express' import { Request, Response } from 'express' import { IServerSideEventStreamer } from 'flowise-components' -import predictionsController from '../controllers/predictions' -import chatflowsService from '../services/chatflows' import multer from 'multer' import path from 'path' -const upload = multer({ dest: `${path.join(__dirname, '..', '..', '..', 'uploads')}/` }) - // define a new type that has a client type (INTERNAL or EXTERNAL) and Response type type Client = { clientType: 'INTERNAL' | 'EXTERNAL' From 57d0a754e999d06fc7cc5315e01f189f9dd108a1 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Mon, 2 Sep 2024 19:10:21 +0530 Subject: [PATCH 07/23] additional internal end point for streaming and associated changes --- .../ConversationalRetrievalToolAgent.ts | 28 +- .../controllers/internal-predictions/index.ts | 58 ++-- .../src/controllers/predictions/index.ts | 22 +- packages/server/src/index.ts | 7 +- .../src/routes/internal-predictions/index.ts | 1 + packages/server/src/utils/SSEStreamer.ts | 92 +----- packages/ui/package.json | 1 + packages/ui/src/api/prediction.js | 4 +- .../ui/src/views/chatmessage/ChatMessage.jsx | 271 ++++++++++-------- 9 files changed, 231 insertions(+), 253 deletions(-) diff --git a/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts b/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts index 54013ac551b..6e13a9365d3 100644 --- a/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts +++ b/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts @@ -7,7 +7,16 @@ import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, Pr import { formatToOpenAIToolMessages } from 'langchain/agents/format_scratchpad/openai_tools' import { getBaseClasses } from '../../../src/utils' import { type ToolsAgentStep } from 'langchain/agents/openai/output_parser' -import { FlowiseMemory, ICommonObject, INode, INodeData, INodeParams, IUsedTool, IVisionChatModal } from '../../../src/Interface' +import { + FlowiseMemory, + ICommonObject, + INode, + INodeData, + INodeParams, + IServerSideEventStreamer, + IUsedTool, + IVisionChatModal +} from "../../../src/Interface"; import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { AgentExecutor, ToolCallingAgentOutputParser } from '../../../src/agents' import { Moderation, checkInputs, streamResponse } from '../../moderation/Moderation' @@ -104,7 +113,9 @@ class ConversationalRetrievalToolAgent_Agents implements INode { const memory = nodeData.inputs?.memory as FlowiseMemory const moderations = nodeData.inputs?.inputModeration as Moderation[] - const isStreamable = options.socketIO && options.socketIOClientId + const shouldStreamResponse = options.shouldStreamResponse + const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer + const chatId = options.chatId if (moderations && moderations.length > 0) { try { @@ -112,8 +123,9 @@ class ConversationalRetrievalToolAgent_Agents implements INode { input = await checkInputs(moderations, input) } catch (e) { await new Promise((resolve) => setTimeout(resolve, 500)) - if (isStreamable) - streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + streamResponse(sseStreamer, chatId, e.message) + } return formatResponse(e.message) } } @@ -127,15 +139,15 @@ class ConversationalRetrievalToolAgent_Agents implements INode { let sourceDocuments: ICommonObject[] = [] let usedTools: IUsedTool[] = [] - if (isStreamable) { - const handler = new CustomChainHandler(options.socketIO, options.socketIOClientId) + if (shouldStreamResponse) { + const handler = new CustomChainHandler(sseStreamer, chatId) res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { - options.socketIO.to(options.socketIOClientId).emit('sourceDocuments', flatten(res.sourceDocuments)) + sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(flatten(res.sourceDocuments))) sourceDocuments = res.sourceDocuments } if (res.usedTools) { - options.socketIO.to(options.socketIOClientId).emit('usedTools', res.usedTools) + sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(res.usedTools)) usedTools = res.usedTools } } else { diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index 14072c1e550..4b5698905a7 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -5,35 +5,47 @@ import { getRunningExpressApp } from '../../utils/getRunningExpressApp' // Send input message and get prediction result (Internal) const createInternalPrediction = async (req: Request, res: Response, next: NextFunction) => { try { - const chatId = req.params.chatId - //getRunningExpressApp().sseStreamer.addClient(chatId, res) + const apiResponse = await utilBuildChatflow(req, true) + return res.json(apiResponse) + } catch (error) { + next(error) + } +} + +// Send input message and stream prediction result using SSE (Internal) +const createAndStreamInternalPrediction = async (req: Request, res: Response, next: NextFunction) => { + try { + const chatId = req.body.chatId + getRunningExpressApp().sseStreamer.addClient(chatId, res) + res.setHeader('Content-Type', 'text/event-stream') + res.setHeader('Cache-Control', 'no-cache') + res.setHeader('Connection', 'keep-alive') + res.flushHeaders() const apiResponse = await utilBuildChatflow(req, true) - if (apiResponse.isStreamValid) { - const sseStreamer = getRunningExpressApp().sseStreamer - if (apiResponse.chatId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) - } - if (apiResponse.chatMessageId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) - } - if (apiResponse.question) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) - } - if (apiResponse.sessionId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) - } - if (apiResponse.memoryType) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) - } - sseStreamer.removeClient(apiResponse.chatId) + const sseStreamer = getRunningExpressApp().sseStreamer + if (apiResponse.chatId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) } - - return res.json(apiResponse) + if (apiResponse.chatMessageId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) + } + if (apiResponse.question) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) + } + if (apiResponse.sessionId) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) + } + if (apiResponse.memoryType) { + sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) + } + sseStreamer.removeClient(apiResponse.chatId) + return } catch (error) { next(error) } } export default { - createInternalPrediction + createInternalPrediction, + createAndStreamInternalPrediction } diff --git a/packages/server/src/controllers/predictions/index.ts b/packages/server/src/controllers/predictions/index.ts index 5b3b7b797b1..e8e9be3155b 100644 --- a/packages/server/src/controllers/predictions/index.ts +++ b/packages/server/src/controllers/predictions/index.ts @@ -61,28 +61,32 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) const apiResponse = await predictionsServices.buildChatflow(req) if (streamable?.isStreaming && req.body.streaming === 'true') { const sseStreamer = getRunningExpressApp().sseStreamer + const metadataJson: any = {} if (apiResponse.chatId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) + metadataJson['chatId'] = apiResponse.chatId + //sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) } if (apiResponse.chatMessageId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) + metadataJson['chatMessageId'] = apiResponse.chatMessageId + //sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) } if (apiResponse.question) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) + metadataJson['question'] = apiResponse.question + //sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) } if (apiResponse.sessionId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) + metadataJson['sessionId'] = apiResponse.sessionId + //sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) } if (apiResponse.memoryType) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) + metadataJson['memoryType'] = apiResponse.memoryType + //sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) } + sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', JSON.stringify(metadataJson)) sseStreamer.removeClient(apiResponse.chatId) - } - if (req.body.streaming === 'true') { return - } else { - return res.json(apiResponse) } + return res.json(apiResponse) } else { throw new InternalFlowiseError(StatusCodes.UNAUTHORIZED, `This site is not allowed to access this chatbot`) } diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index efe42ad0965..b14c83cf7be 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -135,9 +135,9 @@ export class App { '/api/v1/leads', '/api/v1/get-upload-file', '/api/v1/ip', - '/api/v1/ping', - '/api/v1/events' - ]const URL_CASE_INSENSITIVE_REGEX: RegExp = /\/api\/v1\//i + '/api/v1/ping' + ] + const URL_CASE_INSENSITIVE_REGEX: RegExp = /\/api\/v1\//i const URL_CASE_SENSITIVE_REGEX: RegExp = /\/api\/v1\// if (process.env.FLOWISE_USERNAME && process.env.FLOWISE_PASSWORD) { @@ -203,7 +203,6 @@ export class App { this.app.use('/api/v1', flowiseApiV1Router) this.sseStreamer = new SSEStreamer(this.app) - this.sseStreamer.setupSSEEndpoint() // ---------------------------------------- // Configure number of proxies in Host Environment diff --git a/packages/server/src/routes/internal-predictions/index.ts b/packages/server/src/routes/internal-predictions/index.ts index 8e39dce20bc..066b80b3e64 100644 --- a/packages/server/src/routes/internal-predictions/index.ts +++ b/packages/server/src/routes/internal-predictions/index.ts @@ -4,5 +4,6 @@ const router = express.Router() // CREATE router.post(['/', '/:id'], internalPredictionsController.createInternalPrediction) +router.post(['/', '/stream/:id'], internalPredictionsController.createAndStreamInternalPrediction) export default router diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index 2707619b3ac..98277e6ab89 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -1,10 +1,7 @@ import express from 'express' -import { Request, Response } from 'express' +import { Response } from 'express' import { IServerSideEventStreamer } from 'flowise-components' -import multer from 'multer' -import path from 'path' - // define a new type that has a client type (INTERNAL or EXTERNAL) and Response type type Client = { clientType: 'INTERNAL' | 'EXTERNAL' @@ -18,7 +15,6 @@ export class SSEStreamer implements IServerSideEventStreamer { constructor(app: express.Application) { this.app = app - console.log('SSEStreamer constructor') } addExternalClient(chatId: string, res: Response) { @@ -27,11 +23,12 @@ export class SSEStreamer implements IServerSideEventStreamer { addClient(chatId: string, res: Response) { this.clients[chatId] = { clientType: 'INTERNAL', response: res, abort: false } + // console.log('adding internal client', chatId) } removeClient(chatId: string) { const client = this.clients[chatId] - console.log('Removing client', chatId) + // console.log('Removing client', chatId) if (client) { if (client.clientType === 'INTERNAL') { client.response.write(`event: end\ndata: [DONE]\n\n`) @@ -48,49 +45,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } } - // TODO: remove the /api/v1 prefix from the endpoints - setupSSEEndpoint = () => { - // this.app.post( - // '/api/v1/prediction/:id', - // upload.array('files'), - // predictionsController.getRateLimiterMiddleware, - // async (req: Request, res: Response, next: NextFunction) => { - // const streamable = await chatflowsService.checkIfChatflowIsValidForStreaming(req.params.id) - // if (streamable?.isStreaming && req.body.streaming === 'true') { - // res.setHeader('Content-Type', 'text/event-stream') - // res.setHeader('Cache-Control', 'no-cache') - // res.setHeader('Connection', 'keep-alive') - // res.flushHeaders() - // const chatId = req.body.chatId - // this.clients[chatId] = { clientType: 'EXTERNAL', response: res } - // } - // - // await predictionsController.createPrediction(req, res, next) - // if (streamable?.isStreaming && req.body.streaming === 'true') { - // const chatId = req.body.chatId - // req.on('close', () => { - // delete this.clients[chatId] - // }) - // } - // } - // ) - - this.app.get('/api/v1/events/:chatId', (req: Request, res: Response) => { - res.setHeader('Content-Type', 'text/event-stream') - res.setHeader('Cache-Control', 'no-cache') - res.setHeader('Connection', 'keep-alive') - res.flushHeaders() - - const chatId = req.params.chatId - this.clients[chatId] = { clientType: 'INTERNAL', response: res, abort: false } - - // req.on('close', () => { - // console.log('req.onClose ', chatId, this.clients[chatId]) - // //delete this.clients[chatId] - // }) - }) - } - // Send SSE message to a specific client streamEvent(chatId: string, data: string) { const client = this.clients[chatId] @@ -104,13 +58,10 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamCustomEvent(chatId: string, eventType: string, data: string) { - console.log('streamCustomEvent ', eventType, chatId) + // console.log('streamCustomEvent ', eventType, chatId) const client = this.clients[chatId] if (client && client.clientType === 'INTERNAL') { client.response.write(`event: ${eventType}\ndata: ${data}\n\n`) @@ -125,7 +76,7 @@ export class SSEStreamer implements IServerSideEventStreamer { } streamStartEvent(chatId: string, data: string) { - console.log('streamStartEvent ', chatId) + // console.log('streamStartEvent ', chatId) const client = this.clients[chatId] if (client && client.clientType === 'INTERNAL') { client.response.write(`event: start\ndata: ${data} \n\n'`) @@ -137,13 +88,10 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamTokenEvent(chatId: string, data: string) { - console.log('streamTokenEvent ', chatId) + // console.log('streamTokenEvent ', chatId) const client = this.clients[chatId] if (client && client.clientType === 'INTERNAL') { client.response.write(`event: token\ndata: ${data}\n\n`) @@ -155,9 +103,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamSourceDocumentsEvent(chatId: string, data: string) { @@ -172,12 +117,9 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamUsedToolsEvent(chatId: string, data: string): void { - console.log('streamUsedToolsEvent ', chatId) + // console.log('streamUsedToolsEvent ', chatId) const client = this.clients[chatId] if (client && client.clientType === 'INTERNAL') { client.response.write(`event: usedTools\ndata: ${data}\n\n`) @@ -189,9 +131,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamFileAnnotationsEvent(chatId: string, data: string): void { const client = this.clients[chatId] @@ -205,9 +144,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamToolEvent(chatId: string, data: string): void { const client = this.clients[chatId] @@ -221,9 +157,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamAgentReasoningEvent(chatId: string, data: string): void { const client = this.clients[chatId] @@ -237,9 +170,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamNextAgentEvent(chatId: string, data: string): void { const client = this.clients[chatId] @@ -253,9 +183,6 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamActionEvent(chatId: string, data: string): void { const client = this.clients[chatId] @@ -269,13 +196,10 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - // if (data === '[DONE]') { - // delete this.clients[chatId] - // } } streamAbortEvent(chatId: string): void { - console.log('streamAbortEvent ', chatId) + // console.log('streamAbortEvent ', chatId) const client = this.clients[chatId] if (client && client.clientType === 'INTERNAL') { client.response.write(`event: abort\ndata: [ABORT]\n\n`) diff --git a/packages/ui/package.json b/packages/ui/package.json index db9d022b714..5fb0bd39dc4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -14,6 +14,7 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", + "@microsoft/fetch-event-source": "^2.0.1", "@mui/base": "5.0.0-beta.40", "@mui/icons-material": "5.0.3", "@mui/lab": "5.0.0-alpha.156", diff --git a/packages/ui/src/api/prediction.js b/packages/ui/src/api/prediction.js index d3512843c2a..207d222f1a6 100644 --- a/packages/ui/src/api/prediction.js +++ b/packages/ui/src/api/prediction.js @@ -1,7 +1,9 @@ import client from './client' const sendMessageAndGetPrediction = (id, input) => client.post(`/internal-prediction/${id}`, input) +const sendMessageAndStreamPrediction = (id, input) => client.post(`/internal-prediction/stream/${id}`, input) export default { - sendMessageAndGetPrediction + sendMessageAndGetPrediction, + sendMessageAndStreamPrediction } diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 9881e390298..7204d85d7eb 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -8,6 +8,7 @@ import remarkGfm from 'remark-gfm' import remarkMath from 'remark-math' import axios from 'axios' import { v4 as uuidv4 } from 'uuid' +import { EventStreamContentType, fetchEventSource } from '@microsoft/fetch-event-source' import { Box, @@ -671,140 +672,162 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } /* TODO: Make this one call, after we convert this to GET. */ - setupSSE(chatflowid, params) - const response = await predictionApi.sendMessageAndGetPrediction(chatflowid, params) - - // TBD: handle this part of the response - // if (response.data) { - // const data = response.data - // if (!isChatFlowAvailableToStream) { - // let text = '' - // if (data.text) text = data.text - // else if (data.json) text = '```json\n' + JSON.stringify(data.json, null, 2) - // else text = JSON.stringify(data, null, 2) - // - // setMessages((prevMessages) => [ - // ...prevMessages, - // { - // message: text, - // id: data?.chatMessageId, - // sourceDocuments: data?.sourceDocuments, - // usedTools: data?.usedTools, - // fileAnnotations: data?.fileAnnotations, - // agentReasoning: data?.agentReasoning, - // action: data?.action, - // type: 'apiMessage', - // feedback: null - // } - // ]) - // } - // } + if (isChatFlowAvailableToStream) { + fetchResponseFromEventStream(chatflowid, params) + } else { + const response = await predictionApi.sendMessageAndGetPrediction(chatflowid, params) + if (response.data) { + const data = response.data + + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'apiMessage') { + allMessages[allMessages.length - 1].id = data?.chatMessageId + } + return allMessages + }) + + setChatId(data.chatId) + + if (input === '' && data.question) { + // the response contains the question even if it was in an audio format + // so if input is empty but the response contains the question, update the user message to show the question + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages + allMessages[allMessages.length - 2].message = data.question + return allMessages + }) + } + + if (!isChatFlowAvailableToStream) { + let text = '' + if (data.text) text = data.text + else if (data.json) text = '```json\n' + JSON.stringify(data.json, null, 2) + else text = JSON.stringify(data, null, 2) + + setMessages((prevMessages) => [ + ...prevMessages, + { + message: text, + id: data?.chatMessageId, + sourceDocuments: data?.sourceDocuments, + usedTools: data?.usedTools, + fileAnnotations: data?.fileAnnotations, + agentReasoning: data?.agentReasoning, + action: data?.action, + type: 'apiMessage', + feedback: null + } + ]) + } + setLocalStorageChatflow(chatflowid, data.chatId) + setLoading(false) + setUserInput('') + setUploadedFiles([]) + setTimeout(() => { + inputRef.current?.focus() + scrollToBottom() + }, 100) + } + } } catch (error) { handleError(error.response.data.message) return } } - const setupSSE = (chatflowid, params) => { + const fetchResponseFromEventStream = async (chatflowid, params) => { const chatId = params.chatId const input = params.question - // Establish the SSE connection to receive the streamed response - ///internal-prediction/${id} - const eventSource = new EventSource(`${baseURL}/api/v1/events/${chatId}`) - - eventSource.addEventListener('start', (event) => { - setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) - }) - - eventSource.addEventListener('token', (event) => { - updateLastMessage(event.data) - }) - - eventSource.addEventListener('sourceDocuments', (event) => { - updateLastMessageSourceDocuments(JSON.parse(event.data)) - }) - - eventSource.addEventListener('end', () => { - setLocalStorageChatflow(chatflowid, chatId) - setLoading(false) - setUserInput('') - setUploadedFiles([]) - setTimeout(() => { - inputRef.current?.focus() - scrollToBottom() - }, 100) - eventSource.close() // Close the connection when stream ends - }) - - eventSource.addEventListener('usedTools', (event) => { - updateLastMessageUsedTools(JSON.parse(event.data)) - }) - - eventSource.addEventListener('fileAnnotations', (event) => { - updateLastMessageFileAnnotations(JSON.parse(event.data)) - }) - - eventSource.addEventListener('agentReasoning', (event) => { - updateLastMessageAgentReasoning(JSON.parse(event.data)) - }) - - eventSource.addEventListener('action', (event) => { - updateLastMessageAction(JSON.parse(event.data)) - }) - - eventSource.addEventListener('nextAgent', (event) => { - updateLastMessageNextAgent(JSON.parse(event.data)) - }) - - eventSource.addEventListener('chatId', (event) => { - setChatId(event.data) - }) - - eventSource.addEventListener('question', (event) => { - if (input === '' && event.data) { - // the response contains the question even if it was in an audio format - // so if input is empty but the response contains the question, update the user message to show the question - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages - allMessages[allMessages.length - 2].message = event.data - return allMessages - }) - } - }) - - eventSource.addEventListener('chatMessageId', (event) => { - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 1].type === 'apiMessage') { - allMessages[allMessages.length - 1].id = event.data + const username = localStorage.getItem('username') + const password = localStorage.getItem('password') + let authString = `${username}:${password}` + await fetchEventSource(`${baseURL}/api/v1/internal-prediction/stream/${chatflowid}`, { + method: 'POST', + body: JSON.stringify(params), + headers: { + 'Content-Type': 'application/json', + Authorization: `Basic ${btoa(authString)}`, + 'x-request-from': 'internal' + }, + async onopen(response) { + if (response.ok && response.headers.get('content-type') === EventStreamContentType) { + //console.log('EventSource Open') } - return allMessages - }) - }) - - eventSource.addEventListener('abort', (event) => { - abortMessage(event.data) - }) - - eventSource.onmessage = (event) => { - if (event.data === '[DONE]') { - setLocalStorageChatflow(chatflowid, chatId) - setLoading(false) - setUserInput('') - setUploadedFiles([]) - setTimeout(() => { - inputRef.current?.focus() - scrollToBottom() - }, 100) - eventSource.close() // Close the connection when stream ends + }, + async onmessage(ev) { + switch (ev.event) { + case 'start': + setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) + break + case 'token': + updateLastMessage(ev.data) + break + case 'sourceDocuments': + updateLastMessageSourceDocuments(JSON.parse(ev.data)) + break + case 'usedTools': + updateLastMessageUsedTools(JSON.parse(ev.data)) + break + case 'fileAnnotations': + updateLastMessageFileAnnotations(JSON.parse(ev.data)) + break + case 'agentReasoning': + updateLastMessageAgentReasoning(JSON.parse(ev.data)) + break + case 'action': + updateLastMessageAction(JSON.parse(ev.data)) + break + case 'nextAgent': + updateLastMessageNextAgent(JSON.parse(ev.data)) + break + case 'chatId': + setChatId(ev.data) + break + case 'chatMessageId': + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'userMessage') { + allMessages[allMessages.length - 1].id = ev.data + } + return allMessages + }) + break + case 'question': + if (input === '' && ev.data) { + // the response contains the question even if it was in an audio format + // so if input is empty but the response contains the question, update the user message to show the question + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages + allMessages[allMessages.length - 2].message = ev.data + return allMessages + }) + } + break + case 'abort': + abortMessage(ev.data) + break + case 'end': + setLocalStorageChatflow(chatflowid, chatId) + setLoading(false) + setUserInput('') + setUploadedFiles([]) + setTimeout(() => { + inputRef.current?.focus() + scrollToBottom() + }, 100) + break + } + }, + async onclose() { + console.log('EventSource Closed') + }, + async onerror(err) { + console.error('EventSource failed:', err) } - } - - eventSource.onerror = (err) => { - console.error('EventSource failed:', err) - eventSource.close() - } + }) } // Prevent blank submissions and allow for multiline input From 6487381e0c67e9db239b2cad08837845edeb92da Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 3 Sep 2024 01:59:07 +0100 Subject: [PATCH 08/23] return streamresponse as true to build agent flow --- packages/server/src/utils/buildChatflow.ts | 6 +-- .../ui/src/views/chatmessage/ChatMessage.jsx | 41 +++++++++---------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index bee238b4e65..cea66cbed00 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -178,9 +178,6 @@ export const utilBuildChatflow = async (req: Request, isInternal: boolean = fals const { graph, nodeDependencies } = constructGraphs(nodes, edges) const directedGraph = graph const endingNodes = getEndingNodes(nodeDependencies, directedGraph, nodes) - // if this is an external prediction call, and they have requested streaming - let streamResponse = isStreamValid ? !isInternal && req.body.streaming === 'true' : false - console.log('streamResponse', streamResponse) /*** If the graph is an agent graph, build the agent response ***/ if (endingNodes.filter((node) => node.data.category === 'Multi Agents' || node.data.category === 'Sequential Agents').length) { return await utilBuildAgentResponse( @@ -196,7 +193,7 @@ export const utilBuildChatflow = async (req: Request, isInternal: boolean = fals edges, baseURL, appServer.sseStreamer, - streamResponse + true ) } @@ -260,7 +257,6 @@ export const utilBuildChatflow = async (req: Request, isInternal: boolean = fals // Once custom function ending node exists, flow is always unavailable to stream isStreamValid = isCustomFunctionEndingNode ? false : isStreamValid - streamResponse = isStreamValid ? !isInternal && req.body.streaming === 'true' : false let chatHistory: IMessage[] = [] diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 7204d85d7eb..3530ad79568 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -700,27 +700,26 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }) } - if (!isChatFlowAvailableToStream) { - let text = '' - if (data.text) text = data.text - else if (data.json) text = '```json\n' + JSON.stringify(data.json, null, 2) - else text = JSON.stringify(data, null, 2) - - setMessages((prevMessages) => [ - ...prevMessages, - { - message: text, - id: data?.chatMessageId, - sourceDocuments: data?.sourceDocuments, - usedTools: data?.usedTools, - fileAnnotations: data?.fileAnnotations, - agentReasoning: data?.agentReasoning, - action: data?.action, - type: 'apiMessage', - feedback: null - } - ]) - } + let text = '' + if (data.text) text = data.text + else if (data.json) text = '```json\n' + JSON.stringify(data.json, null, 2) + else text = JSON.stringify(data, null, 2) + + setMessages((prevMessages) => [ + ...prevMessages, + { + message: text, + id: data?.chatMessageId, + sourceDocuments: data?.sourceDocuments, + usedTools: data?.usedTools, + fileAnnotations: data?.fileAnnotations, + agentReasoning: data?.agentReasoning, + action: data?.action, + type: 'apiMessage', + feedback: null + } + ]) + setLocalStorageChatflow(chatflowid, data.chatId) setLoading(false) setUserInput('') From 768ec51f8c2fb03b4783dacb77439b73e98cecef Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Tue, 3 Sep 2024 18:32:59 +0530 Subject: [PATCH 09/23] 1) JSON formatting for internal events 2) other fixes --- .../ConversationalAgent.ts | 4 +- .../ConversationalRetrievalToolAgent.ts | 6 +- .../OpenAIToolAgent_LlamaIndex.ts | 2 +- .../agents/OpenAIAssistant/OpenAIAssistant.ts | 4 +- .../nodes/agents/ToolAgent/ToolAgent.ts | 4 +- .../nodes/agents/XMLAgent/XMLAgent.ts | 4 +- .../ConversationalRetrievalQAChain.ts | 2 +- .../engine/ChatEngine/ContextChatEngine.ts | 2 +- .../nodes/engine/QueryEngine/QueryEngine.ts | 2 +- .../SubQuestionQueryEngine.ts | 2 +- packages/components/src/Interface.ts | 19 +-- packages/components/src/handler.ts | 4 +- .../controllers/internal-predictions/index.ts | 12 +- .../src/controllers/predictions/index.ts | 14 ++- .../server/src/middlewares/errors/index.ts | 6 +- .../src/routes/internal-predictions/index.ts | 1 - packages/server/src/utils/SSEStreamer.ts | 117 ++++++------------ packages/server/src/utils/buildAgentGraph.ts | 13 +- packages/server/src/utils/buildChatflow.ts | 8 +- .../ui/src/views/chatmessage/ChatMessage.jsx | 48 +++---- 20 files changed, 121 insertions(+), 153 deletions(-) diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index c3a2b9591d9..f9541b369e0 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -145,12 +145,12 @@ class ConversationalAgent_Agents implements INode { res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { if (options.sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(options.chatId, JSON.stringify(flatten(res.sourceDocuments))) + sseStreamer.streamSourceDocumentsEvent(options.chatId, flatten(res.sourceDocuments)) } sourceDocuments = res.sourceDocuments } if (res.usedTools) { - sseStreamer.streamUsedToolsEvent(options.chatId, JSON.stringify(res.usedTools)) + sseStreamer.streamUsedToolsEvent(options.chatId, res.usedTools) usedTools = res.usedTools } // If the tool is set to returnDirect, stream the output to the client diff --git a/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts b/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts index 6e13a9365d3..894c7b13dbe 100644 --- a/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts +++ b/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts @@ -16,7 +16,7 @@ import { IServerSideEventStreamer, IUsedTool, IVisionChatModal -} from "../../../src/Interface"; +} from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { AgentExecutor, ToolCallingAgentOutputParser } from '../../../src/agents' import { Moderation, checkInputs, streamResponse } from '../../moderation/Moderation' @@ -143,11 +143,11 @@ class ConversationalRetrievalToolAgent_Agents implements INode { const handler = new CustomChainHandler(sseStreamer, chatId) res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(flatten(res.sourceDocuments))) + sseStreamer.streamSourceDocumentsEvent(chatId, flatten(res.sourceDocuments)) sourceDocuments = res.sourceDocuments } if (res.usedTools) { - sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(res.usedTools)) + sseStreamer.streamUsedToolsEvent(chatId, res.usedTools) usedTools = res.usedTools } } else { diff --git a/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts b/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts index 90481f38750..f25b9677bfa 100644 --- a/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts +++ b/packages/components/nodes/agents/LlamaIndexAgents/OpenAIToolAgent/OpenAIToolAgent_LlamaIndex.ts @@ -139,7 +139,7 @@ class OpenAIFunctionAgent_LlamaIndex_Agents implements INode { }) } if (sseStreamer) { - sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(usedTools)) + sseStreamer.streamUsedToolsEvent(chatId, usedTools) } } } diff --git a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts index 677d6063491..4778b1b744f 100644 --- a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts +++ b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts @@ -418,7 +418,7 @@ class OpenAIAssistant_Agents implements INode { } } if (sseStreamer) { - sseStreamer.streamFileAnnotationsEvent(chatId, JSON.stringify(fileAnnotations)) + sseStreamer.streamFileAnnotationsEvent(chatId, fileAnnotations) } } } else { @@ -532,7 +532,7 @@ class OpenAIAssistant_Agents implements INode { } } if (sseStreamer) { - sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(usedTools)) + sseStreamer.streamUsedToolsEvent(chatId, usedTools) } } catch (error) { console.error('Error submitting tool outputs:', error) diff --git a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts index 1d17c523a97..012e18d6eb5 100644 --- a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts +++ b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts @@ -140,13 +140,13 @@ class ToolAgent_Agents implements INode { res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { if (sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(flatten(res.sourceDocuments))) + sseStreamer.streamSourceDocumentsEvent(chatId, flatten(res.sourceDocuments)) } sourceDocuments = res.sourceDocuments } if (res.usedTools) { if (sseStreamer) { - sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(flatten(res.usedTools))) + sseStreamer.streamUsedToolsEvent(chatId, flatten(res.usedTools)) } usedTools = res.usedTools } diff --git a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts index 198d1ff3034..13a6d55b42a 100644 --- a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts +++ b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts @@ -152,13 +152,13 @@ class XMLAgent_Agents implements INode { res = await executor.invoke({ input }, { callbacks: [loggerHandler, handler, ...callbacks] }) if (res.sourceDocuments) { if (sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(flatten(res.sourceDocuments))) + sseStreamer.streamSourceDocumentsEvent(chatId, flatten(res.sourceDocuments)) } sourceDocuments = res.sourceDocuments } if (res.usedTools) { if (sseStreamer) { - sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(flatten(res.usedTools))) + sseStreamer.streamUsedToolsEvent(chatId, flatten(res.usedTools)) } usedTools = res.usedTools } diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index 36d9b3fb07a..c9624a07d86 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -252,7 +252,7 @@ class ConversationalRetrievalQAChain_Chains implements INode { sourceDocuments = streamedResponse?.logs?.[sourceRunnableName]?.final_output?.output if (shouldStreamResponse && returnSourceDocuments) { if (sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + sseStreamer.streamSourceDocumentsEvent(chatId, sourceDocuments) } } } diff --git a/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts b/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts index dd0f4d80722..35b6ae069b4 100644 --- a/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts +++ b/packages/components/nodes/engine/ChatEngine/ContextChatEngine.ts @@ -137,7 +137,7 @@ class ContextChatEngine_LlamaIndex implements INode { if (returnSourceDocuments) { sourceDocuments = reformatSourceDocuments(sourceNodes) if (sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + sseStreamer.streamSourceDocumentsEvent(chatId, sourceDocuments) } } } else { diff --git a/packages/components/nodes/engine/QueryEngine/QueryEngine.ts b/packages/components/nodes/engine/QueryEngine/QueryEngine.ts index bd22ae8be0f..14eb3c5de1d 100644 --- a/packages/components/nodes/engine/QueryEngine/QueryEngine.ts +++ b/packages/components/nodes/engine/QueryEngine/QueryEngine.ts @@ -95,7 +95,7 @@ class QueryEngine_LlamaIndex implements INode { if (returnSourceDocuments) { sourceDocuments = reformatSourceDocuments(sourceNodes) if (sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + sseStreamer.streamSourceDocumentsEvent(chatId, sourceDocuments) } } } else { diff --git a/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts b/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts index caefcc89517..6d8ceead9c4 100644 --- a/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts +++ b/packages/components/nodes/engine/SubQuestionQueryEngine/SubQuestionQueryEngine.ts @@ -112,7 +112,7 @@ class SubQuestionQueryEngine_LlamaIndex implements INode { if (returnSourceDocuments) { sourceDocuments = reformatSourceDocuments(sourceNodes) if (sseStreamer) { - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(sourceDocuments)) + sseStreamer.streamSourceDocumentsEvent(chatId, sourceDocuments) } } } else { diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index 19817cc0133..ecbcb250e6d 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -403,17 +403,18 @@ export interface IStateWithMessages extends ICommonObject { export interface IServerSideEventStreamer { streamEvent(chatId: string, data: string): void - streamStartEvent(chatId: string, data: string): void + streamStartEvent(chatId: string, data: any): void streamTokenEvent(chatId: string, data: string): void - - streamSourceDocumentsEvent(chatId: string, data: string): void - streamUsedToolsEvent(chatId: string, data: string): void - streamFileAnnotationsEvent(chatId: string, data: string): void - streamToolEvent(chatId: string, data: string): void - streamAgentReasoningEvent(chatId: string, data: string): void - streamNextAgentEvent(chatId: string, data: string): void - streamActionEvent(chatId: string, data: string): void + streamCustomEvent(chatId: string, eventType: string, data: any): void + + streamSourceDocumentsEvent(chatId: string, data: any): void + streamUsedToolsEvent(chatId: string, data: any): void + streamFileAnnotationsEvent(chatId: string, data: any): void + streamToolEvent(chatId: string, data: any): void + streamAgentReasoningEvent(chatId: string, data: any): void + streamNextAgentEvent(chatId: string, data: any): void + streamActionEvent(chatId: string, data: any): void streamAbortEvent(chatId: string): void streamEndEvent(chatId: string): void diff --git a/packages/components/src/handler.ts b/packages/components/src/handler.ts index a7b5965b1eb..db55faf6895 100644 --- a/packages/components/src/handler.ts +++ b/packages/components/src/handler.ts @@ -223,14 +223,14 @@ export class CustomChainHandler extends BaseCallbackHandler { } }) if (this.returnSourceDocuments && this.sseStreamer) { - this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) + this.sseStreamer.streamSourceDocumentsEvent(this.chatId, outputs?.sourceDocuments) } if (this.sseStreamer) { this.sseStreamer.streamEndEvent(this.chatId) } } else { if (this.returnSourceDocuments && this.sseStreamer) { - this.sseStreamer.streamSourceDocumentsEvent(this.chatId, JSON.stringify(outputs?.sourceDocuments)) + this.sseStreamer.streamSourceDocumentsEvent(this.chatId, outputs?.sourceDocuments) } } } diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index 4b5698905a7..221bc31e7b5 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -5,8 +5,13 @@ import { getRunningExpressApp } from '../../utils/getRunningExpressApp' // Send input message and get prediction result (Internal) const createInternalPrediction = async (req: Request, res: Response, next: NextFunction) => { try { - const apiResponse = await utilBuildChatflow(req, true) - return res.json(apiResponse) + if (req.body.streaming || req.body.streaming === 'true') { + createAndStreamInternalPrediction(req, res, next) + return + } else { + const apiResponse = await utilBuildChatflow(req, true) + return res.json(apiResponse) + } } catch (error) { next(error) } @@ -46,6 +51,5 @@ const createAndStreamInternalPrediction = async (req: Request, res: Response, ne } } export default { - createInternalPrediction, - createAndStreamInternalPrediction + createInternalPrediction } diff --git a/packages/server/src/controllers/predictions/index.ts b/packages/server/src/controllers/predictions/index.ts index e8e9be3155b..1d82cd62cd9 100644 --- a/packages/server/src/controllers/predictions/index.ts +++ b/packages/server/src/controllers/predictions/index.ts @@ -6,6 +6,7 @@ import predictionsServices from '../../services/predictions' import { InternalFlowiseError } from '../../errors/internalFlowiseError' import { StatusCodes } from 'http-status-codes' import { getRunningExpressApp } from '../../utils/getRunningExpressApp' +import { v4 as uuidv4 } from 'uuid' // Send input message and get prediction result (External) const createPrediction = async (req: Request, res: Response, next: NextFunction) => { @@ -48,18 +49,23 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) } if (isDomainAllowed) { const streamable = await chatflowsService.checkIfChatflowIsValidForStreaming(req.params.id) - if (streamable?.isStreaming && req.body.streaming === 'true') { + const isStreamingRequested = req.body.streaming === 'true' || req.body.streaming === true + if (streamable?.isStreaming && isStreamingRequested) { res.setHeader('Content-Type', 'text/event-stream') res.setHeader('Cache-Control', 'no-cache') res.setHeader('Connection', 'keep-alive') res.flushHeaders() - const chatId = req.body.chatId + let chatId = req.body.chatId + if (!req.body.chatId) { + chatId = req.body.chatId ?? req.body.overrideConfig?.sessionId ?? uuidv4() + req.body.chatId = chatId + } getRunningExpressApp().sseStreamer.addExternalClient(chatId, res) } //@ts-ignore const apiResponse = await predictionsServices.buildChatflow(req) - if (streamable?.isStreaming && req.body.streaming === 'true') { + if (streamable?.isStreaming && isStreamingRequested) { const sseStreamer = getRunningExpressApp().sseStreamer const metadataJson: any = {} if (apiResponse.chatId) { @@ -82,7 +88,7 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) metadataJson['memoryType'] = apiResponse.memoryType //sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) } - sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', JSON.stringify(metadataJson)) + sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', metadataJson) sseStreamer.removeClient(apiResponse.chatId) return } diff --git a/packages/server/src/middlewares/errors/index.ts b/packages/server/src/middlewares/errors/index.ts index ea0ab513ae8..75cd2c21b24 100644 --- a/packages/server/src/middlewares/errors/index.ts +++ b/packages/server/src/middlewares/errors/index.ts @@ -12,8 +12,10 @@ async function errorHandlerMiddleware(err: InternalFlowiseError, req: Request, r // Provide error stack trace only in development stack: process.env.NODE_ENV === 'development' ? err.stack : {} } - res.setHeader('Content-Type', 'application/json') - res.status(displayedError.statusCode).json(displayedError) + if (!req.body.streaming || req.body.streaming === 'false') { + res.setHeader('Content-Type', 'application/json') + res.status(displayedError.statusCode).json(displayedError) + } } export default errorHandlerMiddleware diff --git a/packages/server/src/routes/internal-predictions/index.ts b/packages/server/src/routes/internal-predictions/index.ts index 066b80b3e64..8e39dce20bc 100644 --- a/packages/server/src/routes/internal-predictions/index.ts +++ b/packages/server/src/routes/internal-predictions/index.ts @@ -4,6 +4,5 @@ const router = express.Router() // CREATE router.post(['/', '/:id'], internalPredictionsController.createInternalPrediction) -router.post(['/', '/stream/:id'], internalPredictionsController.createAndStreamInternalPrediction) export default router diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index 98277e6ab89..6336f44de3b 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -23,23 +23,17 @@ export class SSEStreamer implements IServerSideEventStreamer { addClient(chatId: string, res: Response) { this.clients[chatId] = { clientType: 'INTERNAL', response: res, abort: false } - // console.log('adding internal client', chatId) } removeClient(chatId: string) { const client = this.clients[chatId] // console.log('Removing client', chatId) if (client) { - if (client.clientType === 'INTERNAL') { - client.response.write(`event: end\ndata: [DONE]\n\n`) - } - if (client.clientType === 'EXTERNAL') { - const clientResponse = { - event: 'end', - data: '[DONE]' - } - client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') + const clientResponse = { + event: 'end', + data: '[DONE]' } + client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') client.response.end() delete this.clients[chatId] } @@ -48,163 +42,122 @@ export class SSEStreamer implements IServerSideEventStreamer { // Send SSE message to a specific client streamEvent(chatId: string, data: string) { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: start\ndata: ${data}\n\n'`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'start', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamCustomEvent(chatId: string, eventType: string, data: string) { - // console.log('streamCustomEvent ', eventType, chatId) + streamCustomEvent(chatId: string, eventType: string, data: any) { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: ${eventType}\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: eventType, - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } streamStartEvent(chatId: string, data: string) { - // console.log('streamStartEvent ', chatId) const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: start\ndata: ${data} \n\n'`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'start', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } streamTokenEvent(chatId: string, data: string) { - // console.log('streamTokenEvent ', chatId) const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: token\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'token', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamSourceDocumentsEvent(chatId: string, data: string) { + streamSourceDocumentsEvent(chatId: string, data: any) { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: sourceDocuments\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'sourceDocuments', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamUsedToolsEvent(chatId: string, data: string): void { - // console.log('streamUsedToolsEvent ', chatId) + streamUsedToolsEvent(chatId: string, data: any): void { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: usedTools\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'usedTools', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamFileAnnotationsEvent(chatId: string, data: string): void { + streamFileAnnotationsEvent(chatId: string, data: any): void { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: fileAnnotations\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'fileAnnotations', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamToolEvent(chatId: string, data: string): void { + streamToolEvent(chatId: string, data: any): void { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: tool\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'tool', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamAgentReasoningEvent(chatId: string, data: string): void { + streamAgentReasoningEvent(chatId: string, data: any): void { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: agentReasoning\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'agentReasoning', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamNextAgentEvent(chatId: string, data: string): void { + streamNextAgentEvent(chatId: string, data: any): void { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: nextAgent\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'nextAgent', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } - streamActionEvent(chatId: string, data: string): void { + streamActionEvent(chatId: string, data: any): void { const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: action\ndata: ${data}\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'action', - data + data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } streamAbortEvent(chatId: string): void { - // console.log('streamAbortEvent ', chatId) const client = this.clients[chatId] - if (client && client.clientType === 'INTERNAL') { - client.response.write(`event: abort\ndata: [ABORT]\n\n`) - } - if (client && client.clientType === 'EXTERNAL') { + if (client) { const clientResponse = { event: 'abort', data: '[DONE]' diff --git a/packages/server/src/utils/buildAgentGraph.ts b/packages/server/src/utils/buildAgentGraph.ts index ba94865d693..8a04b2b60c5 100644 --- a/packages/server/src/utils/buildAgentGraph.ts +++ b/packages/server/src/utils/buildAgentGraph.ts @@ -291,21 +291,18 @@ export const buildAgentGraph = async ( if (!isStreamingStarted) { isStreamingStarted = true if (sseStreamer) { - sseStreamer.streamStartEvent(chatId, JSON.stringify(agentReasoning)) + sseStreamer.streamStartEvent(chatId, agentReasoning) } } if (sseStreamer) { - sseStreamer.streamAgentReasoningEvent(chatId, JSON.stringify(agentReasoning)) + sseStreamer.streamAgentReasoningEvent(chatId, agentReasoning) } // Send loading next agent indicator if (reasoning.next && reasoning.next !== 'FINISH' && reasoning.next !== 'END') { if (sseStreamer) { - sseStreamer.streamNextAgentEvent( - chatId, - mapNameToLabel[reasoning.next].label || JSON.stringify(reasoning.next) - ) + sseStreamer.streamNextAgentEvent(chatId, mapNameToLabel[reasoning.next].label || reasoning.next) } } } @@ -400,8 +397,8 @@ export const buildAgentGraph = async ( totalUsedTools = uniq(flatten(totalUsedTools)) if (shouldStreamResponse && sseStreamer) { - sseStreamer.streamUsedToolsEvent(chatId, JSON.stringify(totalUsedTools)) - sseStreamer.streamSourceDocumentsEvent(chatId, JSON.stringify(totalSourceDocuments)) + sseStreamer.streamUsedToolsEvent(chatId, totalUsedTools) + sseStreamer.streamSourceDocumentsEvent(chatId, totalSourceDocuments) sseStreamer.streamEndEvent(chatId) } diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index cea66cbed00..c4971d11b4d 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -506,9 +506,9 @@ const utilBuildAgentResponse = async ( memoryType, sessionId } - if (sourceDocuments.length) apiMessage.sourceDocuments = JSON.stringify(sourceDocuments) - if (usedTools.length) apiMessage.usedTools = JSON.stringify(usedTools) - if (agentReasoning.length) apiMessage.agentReasoning = JSON.stringify(agentReasoning) + if (sourceDocuments?.length) apiMessage.sourceDocuments = JSON.stringify(sourceDocuments) + if (usedTools?.length) apiMessage.usedTools = JSON.stringify(usedTools) + if (agentReasoning?.length) apiMessage.agentReasoning = JSON.stringify(agentReasoning) if (Object.keys(finalAction).length) apiMessage.action = JSON.stringify(finalAction) const chatMessage = await utilAddChatMessage(apiMessage) @@ -556,7 +556,7 @@ const utilBuildAgentResponse = async ( result.chatMessageId = chatMessage?.id if (sessionId) result.sessionId = sessionId if (memoryType) result.memoryType = memoryType - if (agentReasoning.length) result.agentReasoning = agentReasoning + if (agentReasoning?.length) result.agentReasoning = agentReasoning if (Object.keys(finalAction).length) result.action = finalAction return result diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 3530ad79568..890f6af9bb8 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -671,7 +671,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } } - /* TODO: Make this one call, after we convert this to GET. */ + console.log('isChatFlowAvailableToStream::', isChatFlowAvailableToStream) if (isChatFlowAvailableToStream) { fetchResponseFromEventStream(chatflowid, params) } else { @@ -742,7 +742,8 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview const username = localStorage.getItem('username') const password = localStorage.getItem('password') let authString = `${username}:${password}` - await fetchEventSource(`${baseURL}/api/v1/internal-prediction/stream/${chatflowid}`, { + params.streaming = true + await fetchEventSource(`${baseURL}/api/v1/internal-prediction/${chatflowid}`, { method: 'POST', body: JSON.stringify(params), headers: { @@ -756,39 +757,40 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } }, async onmessage(ev) { - switch (ev.event) { + const payload = JSON.parse(ev.data) + switch (payload.event) { case 'start': setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) break case 'token': - updateLastMessage(ev.data) + updateLastMessage(payload.data) break case 'sourceDocuments': - updateLastMessageSourceDocuments(JSON.parse(ev.data)) + updateLastMessageSourceDocuments(payload.data) break case 'usedTools': - updateLastMessageUsedTools(JSON.parse(ev.data)) + updateLastMessageUsedTools(payload.data) break case 'fileAnnotations': - updateLastMessageFileAnnotations(JSON.parse(ev.data)) + updateLastMessageFileAnnotations(payload.data) break case 'agentReasoning': - updateLastMessageAgentReasoning(JSON.parse(ev.data)) + updateLastMessageAgentReasoning(payload.data) break case 'action': - updateLastMessageAction(JSON.parse(ev.data)) + updateLastMessageAction(payload.data) break case 'nextAgent': - updateLastMessageNextAgent(JSON.parse(ev.data)) + updateLastMessageNextAgent(payload.data) break case 'chatId': - setChatId(ev.data) + setChatId(payload.data) break case 'chatMessageId': setMessages((prevMessages) => { let allMessages = [...cloneDeep(prevMessages)] if (allMessages[allMessages.length - 1].type === 'userMessage') { - allMessages[allMessages.length - 1].id = ev.data + allMessages[allMessages.length - 1].id = payload.data } return allMessages }) @@ -800,23 +802,18 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview setMessages((prevMessages) => { let allMessages = [...cloneDeep(prevMessages)] if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages - allMessages[allMessages.length - 2].message = ev.data + allMessages[allMessages.length - 2].message = payload.data return allMessages }) } break case 'abort': - abortMessage(ev.data) + abortMessage(payload.data) + closeResponse() break case 'end': setLocalStorageChatflow(chatflowid, chatId) - setLoading(false) - setUserInput('') - setUploadedFiles([]) - setTimeout(() => { - inputRef.current?.focus() - scrollToBottom() - }, 100) + closeResponse() break } }, @@ -829,6 +826,15 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }) } + const closeResponse = () => { + setLoading(false) + setUserInput('') + setUploadedFiles([]) + setTimeout(() => { + inputRef.current?.focus() + scrollToBottom() + }, 100) + } // Prevent blank submissions and allow for multiline input const handleEnter = (e) => { // Check if IME composition is in progress From 1174c0d2b9ef2a1193f3ded8b3f05459c49db125 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Tue, 3 Sep 2024 19:04:33 +0530 Subject: [PATCH 10/23] 1) convert internal event to metadata to maintain consistency with external response --- .../controllers/internal-predictions/index.ts | 12 ++++--- .../src/controllers/predictions/index.ts | 5 --- .../ui/src/views/chatmessage/ChatMessage.jsx | 32 +++++++++---------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index 221bc31e7b5..5a2b339ad06 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -29,21 +29,23 @@ const createAndStreamInternalPrediction = async (req: Request, res: Response, ne const apiResponse = await utilBuildChatflow(req, true) const sseStreamer = getRunningExpressApp().sseStreamer + const metadataJson: any = {} if (apiResponse.chatId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) + metadataJson['chatId'] = apiResponse.chatId } if (apiResponse.chatMessageId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) + metadataJson['chatMessageId'] = apiResponse.chatMessageId } if (apiResponse.question) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) + metadataJson['question'] = apiResponse.question } if (apiResponse.sessionId) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) + metadataJson['sessionId'] = apiResponse.sessionId } if (apiResponse.memoryType) { - sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) + metadataJson['memoryType'] = apiResponse.memoryType } + sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', metadataJson) sseStreamer.removeClient(apiResponse.chatId) return } catch (error) { diff --git a/packages/server/src/controllers/predictions/index.ts b/packages/server/src/controllers/predictions/index.ts index 1d82cd62cd9..d34b7c69409 100644 --- a/packages/server/src/controllers/predictions/index.ts +++ b/packages/server/src/controllers/predictions/index.ts @@ -70,23 +70,18 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) const metadataJson: any = {} if (apiResponse.chatId) { metadataJson['chatId'] = apiResponse.chatId - //sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatId', apiResponse.chatId) } if (apiResponse.chatMessageId) { metadataJson['chatMessageId'] = apiResponse.chatMessageId - //sseStreamer.streamCustomEvent(apiResponse.chatId, 'chatMessageId', apiResponse.chatMessageId) } if (apiResponse.question) { metadataJson['question'] = apiResponse.question - //sseStreamer.streamCustomEvent(apiResponse.chatId, 'question', apiResponse.question) } if (apiResponse.sessionId) { metadataJson['sessionId'] = apiResponse.sessionId - //sseStreamer.streamCustomEvent(apiResponse.chatId, 'sessionId', apiResponse.sessionId) } if (apiResponse.memoryType) { metadataJson['memoryType'] = apiResponse.memoryType - //sseStreamer.streamCustomEvent(apiResponse.chatId, 'memoryType', apiResponse.memoryType) } sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', metadataJson) sseStreamer.removeClient(apiResponse.chatId) diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 890f6af9bb8..1e84258c168 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -783,26 +783,24 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview case 'nextAgent': updateLastMessageNextAgent(payload.data) break - case 'chatId': - setChatId(payload.data) - break - case 'chatMessageId': - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 1].type === 'userMessage') { - allMessages[allMessages.length - 1].id = payload.data - } - return allMessages - }) - break - case 'question': - if (input === '' && ev.data) { + case 'metadata': + if (payload.data.chatId) setChatId(payload.data.chatId) + if (payload.data.chatMessageId) { + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'userMessage') { + allMessages[allMessages.length - 1].id = payload.data.chatMessageId + } + return allMessages + }) + } + if (input === '' && payload.data.question) { // the response contains the question even if it was in an audio format // so if input is empty but the response contains the question, update the user message to show the question setMessages((prevMessages) => { let allMessages = [...cloneDeep(prevMessages)] if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages - allMessages[allMessages.length - 2].message = payload.data + allMessages[allMessages.length - 2].message = payload.data.question return allMessages }) } @@ -818,10 +816,10 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } }, async onclose() { - console.log('EventSource Closed') + closeResponse() }, async onerror(err) { - console.error('EventSource failed:', err) + closeResponse() } }) } From d24c9a4b41e07f01440f72ae8ef9b964c16d759a Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 3 Sep 2024 18:41:23 +0100 Subject: [PATCH 11/23] fix action and metadata streaming --- packages/server/src/utils/buildAgentGraph.ts | 2 +- packages/server/src/utils/index.ts | 1 - .../ui/src/views/chatmessage/ChatMessage.jsx | 73 ++++++++----------- 3 files changed, 32 insertions(+), 44 deletions(-) diff --git a/packages/server/src/utils/buildAgentGraph.ts b/packages/server/src/utils/buildAgentGraph.ts index 8a04b2b60c5..cd6fafe7a5a 100644 --- a/packages/server/src/utils/buildAgentGraph.ts +++ b/packages/server/src/utils/buildAgentGraph.ts @@ -381,7 +381,7 @@ export const buildAgentGraph = async ( } if (shouldStreamResponse && sseStreamer) { sseStreamer.streamTokenEvent(chatId, finalResult) - sseStreamer.streamActionEvent(chatId, finalResult) + sseStreamer.streamActionEvent(chatId, finalAction) } } totalUsedTools.push(...mappedToolCalls) diff --git a/packages/server/src/utils/index.ts b/packages/server/src/utils/index.ts index 4b5d1f76611..6b9f381b904 100644 --- a/packages/server/src/utils/index.ts +++ b/packages/server/src/utils/index.ts @@ -1,7 +1,6 @@ import path from 'path' import fs from 'fs' import logger from './logger' -import { Server } from 'socket.io' import { IComponentCredentials, IComponentNodes, diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 1e84258c168..d085673daac 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -614,6 +614,34 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview handleSubmit(undefined, elem.label, action) } + const updateMetadata = (data, input) => { + // set message id that is needed for feedback + if (data.chatMessageId) { + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'apiMessage') { + allMessages[allMessages.length - 1].id = data.chatMessageId + } + return allMessages + }) + } + + if (data.chatId) { + setChatId(data.chatId) + } + + if (input === '' && data.question) { + // the response contains the question even if it was in an audio format + // so if input is empty but the response contains the question, update the user message to show the question + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages + allMessages[allMessages.length - 2].message = data.question + return allMessages + }) + } + } + // Handle form submission const handleSubmit = async (e, selectedInput, action) => { if (e) e.preventDefault() @@ -679,26 +707,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview if (response.data) { const data = response.data - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 1].type === 'apiMessage') { - allMessages[allMessages.length - 1].id = data?.chatMessageId - } - return allMessages - }) - - setChatId(data.chatId) - - if (input === '' && data.question) { - // the response contains the question even if it was in an audio format - // so if input is empty but the response contains the question, update the user message to show the question - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages - allMessages[allMessages.length - 2].message = data.question - return allMessages - }) - } + updateMetadata(data, input) let text = '' if (data.text) text = data.text @@ -741,14 +750,13 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview const input = params.question const username = localStorage.getItem('username') const password = localStorage.getItem('password') - let authString = `${username}:${password}` params.streaming = true await fetchEventSource(`${baseURL}/api/v1/internal-prediction/${chatflowid}`, { method: 'POST', body: JSON.stringify(params), headers: { 'Content-Type': 'application/json', - Authorization: `Basic ${btoa(authString)}`, + Authorization: username && password ? `Basic ${btoa(`${username}:${password}`)}` : undefined, 'x-request-from': 'internal' }, async onopen(response) { @@ -784,26 +792,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview updateLastMessageNextAgent(payload.data) break case 'metadata': - if (payload.data.chatId) setChatId(payload.data.chatId) - if (payload.data.chatMessageId) { - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 1].type === 'userMessage') { - allMessages[allMessages.length - 1].id = payload.data.chatMessageId - } - return allMessages - }) - } - if (input === '' && payload.data.question) { - // the response contains the question even if it was in an audio format - // so if input is empty but the response contains the question, update the user message to show the question - setMessages((prevMessages) => { - let allMessages = [...cloneDeep(prevMessages)] - if (allMessages[allMessages.length - 2].type === 'apiMessage') return allMessages - allMessages[allMessages.length - 2].message = payload.data.question - return allMessages - }) - } + updateMetadata(payload.data, input) break case 'abort': abortMessage(payload.data) From 8e00eb2b07b3ab6a25169cecfa5f30fd2b31bcab Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Wed, 4 Sep 2024 11:30:26 +0530 Subject: [PATCH 12/23] fix for error when agent flow is aborted --- packages/server/src/utils/buildChatflow.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index c4971d11b4d..ed7df2039bb 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -509,7 +509,7 @@ const utilBuildAgentResponse = async ( if (sourceDocuments?.length) apiMessage.sourceDocuments = JSON.stringify(sourceDocuments) if (usedTools?.length) apiMessage.usedTools = JSON.stringify(usedTools) if (agentReasoning?.length) apiMessage.agentReasoning = JSON.stringify(agentReasoning) - if (Object.keys(finalAction).length) apiMessage.action = JSON.stringify(finalAction) + if (finalAction && Object.keys(finalAction).length) apiMessage.action = JSON.stringify(finalAction) const chatMessage = await utilAddChatMessage(apiMessage) await appServer.telemetry.sendTelemetry('agentflow_prediction_sent', { @@ -557,7 +557,7 @@ const utilBuildAgentResponse = async ( if (sessionId) result.sessionId = sessionId if (memoryType) result.memoryType = memoryType if (agentReasoning?.length) result.agentReasoning = agentReasoning - if (Object.keys(finalAction).length) result.action = finalAction + if (finalAction && Object.keys(finalAction).length) result.action = finalAction return result } From 1c936b9b08a034690a278313d4b20899a670cea1 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Wed, 4 Sep 2024 17:43:45 +0530 Subject: [PATCH 13/23] prevent subflows from streaming and other code cleanup --- .../agents/AirtableAgent/AirtableAgent.ts | 1 - .../nodes/agents/AutoGPT/AutoGPT.ts | 1 - .../nodes/agents/BabyAGI/BabyAGI.ts | 1 - .../nodes/agents/CSVAgent/CSVAgent.ts | 1 - .../agents/ReActAgentChat/ReActAgentChat.ts | 1 - .../agents/ReActAgentLLM/ReActAgentLLM.ts | 1 - .../nodes/agents/XMLAgent/XMLAgent.ts | 1 - .../nodes/chains/ApiChain/OpenAPIChain.ts | 1 - .../ConversationChain/ConversationChain.ts | 1 - .../ConversationalRetrievalQAChain.ts | 1 - .../MultiPromptChain/MultiPromptChain.ts | 1 - .../MultiRetrievalQAChain.ts | 1 - .../RetrievalQAChain/RetrievalQAChain.ts | 1 - .../nodes/chains/VectaraChain/VectaraChain.ts | 1 - .../chains/VectorDBQAChain/VectorDBQAChain.ts | 1 - .../nodes/tools/ChatflowTool/ChatflowTool.ts | 10 ++++ packages/components/src/handler.ts | 1 - .../controllers/internal-predictions/index.ts | 18 +------ .../src/controllers/predictions/index.ts | 18 +------ packages/server/src/utils/SSEStreamer.ts | 49 ++++++++++++------- packages/server/src/utils/buildChatflow.ts | 1 - .../ui/src/views/chatmessage/ChatMessage.jsx | 32 ------------ 22 files changed, 43 insertions(+), 101 deletions(-) diff --git a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts index a56d78377cb..e6428f14b7d 100644 --- a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts +++ b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts @@ -107,7 +107,6 @@ class Airtable_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts index 10904a9a7c3..c41a52965fd 100644 --- a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts +++ b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts @@ -116,7 +116,6 @@ class AutoGPT_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts index 940cfb4db8e..87d5cd28923 100644 --- a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts +++ b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts @@ -76,7 +76,6 @@ class BabyAGI_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts index bbebb856b9f..b0bc0eabe81 100644 --- a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts +++ b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts @@ -93,7 +93,6 @@ class CSV_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts b/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts index 6d07d4bbc24..c0732d3f713 100644 --- a/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts +++ b/packages/components/nodes/agents/ReActAgentChat/ReActAgentChat.ts @@ -91,7 +91,6 @@ class ReActAgentChat_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts b/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts index 4799f04b0b7..bc7b0e94580 100644 --- a/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts +++ b/packages/components/nodes/agents/ReActAgentLLM/ReActAgentLLM.ts @@ -80,7 +80,6 @@ class ReActAgentLLM_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts index 13a6d55b42a..d28e3439ebf 100644 --- a/packages/components/nodes/agents/XMLAgent/XMLAgent.ts +++ b/packages/components/nodes/agents/XMLAgent/XMLAgent.ts @@ -134,7 +134,6 @@ class XMLAgent_Agents implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts index a97691a2eac..a04d1961d23 100644 --- a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts +++ b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts @@ -87,7 +87,6 @@ class OpenApiChain_Chains implements INode { if (options.shouldStreamResponse) { streamResponse(sseStreamer, chatId, e.message) } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index 606e67d6b7a..07da2ee449b 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -128,7 +128,6 @@ class ConversationChain_Chains implements INode { if (options.shouldStreamResponse) { streamResponse(options.sseStreamer, options.chatId, e.message) } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index d7e27ae344a..29528ae5c69 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -213,7 +213,6 @@ class ConversationalRetrievalQAChain_Chains implements INode { if (options.shouldStreamResponse) { streamResponse(options.sseStreamer, options.chatId, e.message) } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts index f6d75b6675a..d3d15e4a08a 100644 --- a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts +++ b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts @@ -90,7 +90,6 @@ class MultiPromptChain_Chains implements INode { if (options.shouldStreamResponse) { streamResponse(options.sseStreamer, options.chatId, e.message) } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts index 7736479aa7d..8b7889e2450 100644 --- a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts @@ -97,7 +97,6 @@ class MultiRetrievalQAChain_Chains implements INode { if (options.shouldStreamResponse) { streamResponse(options.sseStreamer, options.chatId, e.message) } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts index 1b8fb888550..5b43ffc1369 100644 --- a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts +++ b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts @@ -74,7 +74,6 @@ class RetrievalQAChain_Chains implements INode { if (shouldStreamResponse) { streamResponse(sseStreamer, chatId, e.message) } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/VectaraChain/VectaraChain.ts b/packages/components/nodes/chains/VectaraChain/VectaraChain.ts index 16d20ca3186..dc34a166fb4 100644 --- a/packages/components/nodes/chains/VectaraChain/VectaraChain.ts +++ b/packages/components/nodes/chains/VectaraChain/VectaraChain.ts @@ -272,7 +272,6 @@ class VectaraChain_Chains implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - //streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts index b9bd1f3db46..aab8d824e0c 100644 --- a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts +++ b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts @@ -77,7 +77,6 @@ class VectorDBQAChain_Chains implements INode { // if (options.shouldStreamResponse) { // streamResponse(options.sseStreamer, options.chatId, e.message) // } - // streamResponse(options.socketIO && options.socketIOClientId, e.message, options.socketIO, options.socketIOClientId) return formatResponse(e.message) } } diff --git a/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts b/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts index 0a8d5516804..3d476cbe18a 100644 --- a/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts +++ b/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts @@ -7,6 +7,7 @@ import { StructuredTool } from '@langchain/core/tools' import { ICommonObject, IDatabaseEntity, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' import { availableDependencies, defaultAllowBuiltInDep, getCredentialData, getCredentialParam } from '../../../src/utils' import { v4 as uuidv4 } from 'uuid' +import { CustomChainHandler } from '../../../src' class ChatflowTool_Tools implements INode { label: string @@ -219,6 +220,15 @@ class ChatflowTool extends StructuredTool { } catch (e) { throw new Error(`Received tool input did not match expected schema: ${JSON.stringify(arg)}`) } + // iterate over the callbacks and the sse streamer + if (config.callbacks instanceof CallbackManager) { + const callbacks = config.callbacks.handlers + for (let i = 0; i < callbacks.length; i += 1) { + if (callbacks[i] instanceof CustomChainHandler) { + ;(callbacks[i] as any).sseStreamer = undefined + } + } + } const callbackManager_ = await CallbackManager.configure( config.callbacks, this.callbacks, diff --git a/packages/components/src/handler.ts b/packages/components/src/handler.ts index db55faf6895..2c0679c7a88 100644 --- a/packages/components/src/handler.ts +++ b/packages/components/src/handler.ts @@ -214,7 +214,6 @@ export class CustomChainHandler extends BaseCallbackHandler { result.forEach((token: string, index: number) => { if (index === 0) { if (this.sseStreamer) { - //this.sseStreamer.streamEvent(this.chatId, 'event: start\ndata: ' + token + '\n\n') this.sseStreamer.streamStartEvent(this.chatId, token) } } diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index 5a2b339ad06..52a6194fa58 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -29,23 +29,7 @@ const createAndStreamInternalPrediction = async (req: Request, res: Response, ne const apiResponse = await utilBuildChatflow(req, true) const sseStreamer = getRunningExpressApp().sseStreamer - const metadataJson: any = {} - if (apiResponse.chatId) { - metadataJson['chatId'] = apiResponse.chatId - } - if (apiResponse.chatMessageId) { - metadataJson['chatMessageId'] = apiResponse.chatMessageId - } - if (apiResponse.question) { - metadataJson['question'] = apiResponse.question - } - if (apiResponse.sessionId) { - metadataJson['sessionId'] = apiResponse.sessionId - } - if (apiResponse.memoryType) { - metadataJson['memoryType'] = apiResponse.memoryType - } - sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', metadataJson) + sseStreamer.streamMetadataEvent(apiResponse.chatId, apiResponse) sseStreamer.removeClient(apiResponse.chatId) return } catch (error) { diff --git a/packages/server/src/controllers/predictions/index.ts b/packages/server/src/controllers/predictions/index.ts index d34b7c69409..dd37a544de0 100644 --- a/packages/server/src/controllers/predictions/index.ts +++ b/packages/server/src/controllers/predictions/index.ts @@ -67,23 +67,7 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) const apiResponse = await predictionsServices.buildChatflow(req) if (streamable?.isStreaming && isStreamingRequested) { const sseStreamer = getRunningExpressApp().sseStreamer - const metadataJson: any = {} - if (apiResponse.chatId) { - metadataJson['chatId'] = apiResponse.chatId - } - if (apiResponse.chatMessageId) { - metadataJson['chatMessageId'] = apiResponse.chatMessageId - } - if (apiResponse.question) { - metadataJson['question'] = apiResponse.question - } - if (apiResponse.sessionId) { - metadataJson['sessionId'] = apiResponse.sessionId - } - if (apiResponse.memoryType) { - metadataJson['memoryType'] = apiResponse.memoryType - } - sseStreamer.streamCustomEvent(apiResponse.chatId, 'metadata', metadataJson) + sseStreamer.streamMetadataEvent(apiResponse.chatId, apiResponse) sseStreamer.removeClient(apiResponse.chatId) return } diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index 6336f44de3b..eeff783da44 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -4,9 +4,11 @@ import { IServerSideEventStreamer } from 'flowise-components' // define a new type that has a client type (INTERNAL or EXTERNAL) and Response type type Client = { + // future use clientType: 'INTERNAL' | 'EXTERNAL' response: Response - abort: boolean + // optional property with default value + started?: boolean } export class SSEStreamer implements IServerSideEventStreamer { @@ -18,16 +20,15 @@ export class SSEStreamer implements IServerSideEventStreamer { } addExternalClient(chatId: string, res: Response) { - this.clients[chatId] = { clientType: 'EXTERNAL', response: res, abort: false } + this.clients[chatId] = { clientType: 'EXTERNAL', response: res, started: false } } addClient(chatId: string, res: Response) { - this.clients[chatId] = { clientType: 'INTERNAL', response: res, abort: false } + this.clients[chatId] = { clientType: 'INTERNAL', response: res, started: false } } removeClient(chatId: string) { const client = this.clients[chatId] - // console.log('Removing client', chatId) if (client) { const clientResponse = { event: 'end', @@ -64,12 +65,14 @@ export class SSEStreamer implements IServerSideEventStreamer { streamStartEvent(chatId: string, data: string) { const client = this.clients[chatId] - if (client) { + // prevent multiple start events being streamed to the client + if (client && !client.started) { const clientResponse = { event: 'start', data: data } client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + client.started = true } } @@ -164,21 +167,31 @@ export class SSEStreamer implements IServerSideEventStreamer { } client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') } - client.abort = true } streamEndEvent(chatId: string) { - console.log('dummy streamEndEvent ', chatId) - // const client = this.clients[chatId] - // if (client && client.clientType === 'INTERNAL') { - // client.response.write(`event: end\ndata: [DONE] \n\n`) - // } - // if (client && client.clientType === 'EXTERNAL') { - // const clientResponse = { - // event: 'end', - // data: '[DONE]' - // } - // client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') - // } + // placeholder for future use + } + + streamMetadataEvent(chatId: string, apiResponse: any) { + const metadataJson: any = {} + if (apiResponse.chatId) { + metadataJson['chatId'] = apiResponse.chatId + } + if (apiResponse.chatMessageId) { + metadataJson['chatMessageId'] = apiResponse.chatMessageId + } + if (apiResponse.question) { + metadataJson['question'] = apiResponse.question + } + if (apiResponse.sessionId) { + metadataJson['sessionId'] = apiResponse.sessionId + } + if (apiResponse.memoryType) { + metadataJson['memoryType'] = apiResponse.memoryType + } + if (Object.keys(metadataJson).length > 0) { + this.streamCustomEvent(chatId, 'metadata', metadataJson) + } } } diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index ed7df2039bb..7cd7b68f8a8 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -358,7 +358,6 @@ export const utilBuildChatflow = async (req: Request, isInternal: boolean = fals const nodeInstanceFilePath = appServer.nodesPool.componentNodes[nodeToExecuteData.name].filePath as string const nodeModule = await import(nodeInstanceFilePath) const nodeInstance = new nodeModule.nodeClass({ sessionId }) - console.log('streamResponse 2', isStreamValid) let result = isStreamValid ? await nodeInstance.run(nodeToExecuteData, incomingInput.question, { diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 04b6c26e5c6..ce8a997c050 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -171,7 +171,6 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview type: 'apiMessage' } ]) - //const [socketIOClientId, setSocketIOClientId] = useState('') const [isChatFlowAvailableToStream, setIsChatFlowAvailableToStream] = useState(false) const [isChatFlowAvailableForSpeech, setIsChatFlowAvailableForSpeech] = useState(false) const [sourceDialogOpen, setSourceDialogOpen] = useState(false) @@ -1006,33 +1005,6 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview setIsLeadSaved(!!savedLead) setLeadEmail(savedLead.email) } - - // SocketIO - // socket = socketIOClient(baseURL) - // - // socket.on('connect', () => { - // setSocketIOClientId(socket.id) - // }) - // - // socket.on('start', () => { - // // setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage' }]) - // }) - // - // //socket.on('sourceDocuments', updateLastMessageSourceDocuments) - // - // socket.on('usedTools', updateLastMessageUsedTools) - // - // socket.on('fileAnnotations', updateLastMessageFileAnnotations) - // - // //socket.on('token', updateLastMessage) - // - // socket.on('agentReasoning', updateLastMessageAgentReasoning) - // - // socket.on('action', updateLastMessageAction) - // - // socket.on('nextAgent', updateLastMessageNextAgent) - // - // socket.on('abort', abortMessage) } return () => { @@ -1045,10 +1017,6 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview type: 'apiMessage' } ]) - // if (socket) { - // socket.disconnect() - // setSocketIOClientId('') - // } } // eslint-disable-next-line react-hooks/exhaustive-deps From 3a66e2b1a69fe4ae8532087b44990530cc0db28b Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Wed, 4 Sep 2024 21:54:22 +0530 Subject: [PATCH 14/23] prevent streaming from enclosed tools --- .../components/nodes/tools/ChainTool/core.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/components/nodes/tools/ChainTool/core.ts b/packages/components/nodes/tools/ChainTool/core.ts index 60ba5977637..91c43909196 100644 --- a/packages/components/nodes/tools/ChainTool/core.ts +++ b/packages/components/nodes/tools/ChainTool/core.ts @@ -1,6 +1,7 @@ import { DynamicTool, DynamicToolInput } from '@langchain/core/tools' import { BaseChain } from 'langchain/chains' import { handleEscapeCharacters } from '../../../src/utils' +import { CustomChainHandler } from '../../../src' export interface ChainToolInput extends Omit { chain: BaseChain @@ -16,7 +17,25 @@ export class ChainTool extends DynamicTool { // To enable LLM Chain which has promptValues if ((chain as any).prompt && (chain as any).prompt.promptValues) { const promptValues = handleEscapeCharacters((chain as any).prompt.promptValues, true) + const sseStreamer = runManager?.handlers.find((handler) => handler instanceof CustomChainHandler)?.sseStreamer + if (runManager) { + const callbacks = runManager.handlers + for (let i = 0; i < callbacks.length; i += 1) { + if (callbacks[i] instanceof CustomChainHandler) { + ;(callbacks[i] as any).sseStreamer = undefined + } + } + } + const values = await chain.call(promptValues, runManager?.getChild()) + if (runManager && sseStreamer) { + const callbacks = runManager.handlers + for (let i = 0; i < callbacks.length; i += 1) { + if (callbacks[i] instanceof CustomChainHandler) { + ;(callbacks[i] as any).sseStreamer = sseStreamer + } + } + } return values?.text } return chain.run(input, runManager?.getChild()) From 0a520d8dffb648e4c8ff63b33d474045dd0bfd59 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 4 Sep 2024 23:44:14 +0100 Subject: [PATCH 15/23] add fix for preventing chaintool streaming --- .../components/nodes/tools/ChainTool/core.ts | 33 ++++++++++++------- packages/server/src/utils/SSEStreamer.ts | 2 +- .../ui/src/views/chatmessage/ChatMessage.jsx | 2 +- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/packages/components/nodes/tools/ChainTool/core.ts b/packages/components/nodes/tools/ChainTool/core.ts index 91c43909196..e43c126f8d5 100644 --- a/packages/components/nodes/tools/ChainTool/core.ts +++ b/packages/components/nodes/tools/ChainTool/core.ts @@ -14,18 +14,19 @@ export class ChainTool extends DynamicTool { super({ ...rest, func: async (input, runManager) => { - // To enable LLM Chain which has promptValues - if ((chain as any).prompt && (chain as any).prompt.promptValues) { - const promptValues = handleEscapeCharacters((chain as any).prompt.promptValues, true) - const sseStreamer = runManager?.handlers.find((handler) => handler instanceof CustomChainHandler)?.sseStreamer - if (runManager) { - const callbacks = runManager.handlers - for (let i = 0; i < callbacks.length; i += 1) { - if (callbacks[i] instanceof CustomChainHandler) { - ;(callbacks[i] as any).sseStreamer = undefined - } + // prevent sending SSE events of the sub-chain + const sseStreamer = runManager?.handlers.find((handler) => handler instanceof CustomChainHandler)?.sseStreamer + if (runManager) { + const callbacks = runManager.handlers + for (let i = 0; i < callbacks.length; i += 1) { + if (callbacks[i] instanceof CustomChainHandler) { + ;(callbacks[i] as any).sseStreamer = undefined } } + } + + if ((chain as any).prompt && (chain as any).prompt.promptValues) { + const promptValues = handleEscapeCharacters((chain as any).prompt.promptValues, true) const values = await chain.call(promptValues, runManager?.getChild()) if (runManager && sseStreamer) { @@ -38,7 +39,17 @@ export class ChainTool extends DynamicTool { } return values?.text } - return chain.run(input, runManager?.getChild()) + + const values = chain.run(input, runManager?.getChild()) + if (runManager && sseStreamer) { + const callbacks = runManager.handlers + for (let i = 0; i < callbacks.length; i += 1) { + if (callbacks[i] instanceof CustomChainHandler) { + ;(callbacks[i] as any).sseStreamer = sseStreamer + } + } + } + return values } }) this.chain = chain diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index eeff783da44..d8fb485382f 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -169,7 +169,7 @@ export class SSEStreamer implements IServerSideEventStreamer { } } - streamEndEvent(chatId: string) { + streamEndEvent(_: string) { // placeholder for future use } diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index ce8a997c050..ad7023929b0 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -698,7 +698,6 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } } - console.log('isChatFlowAvailableToStream::', isChatFlowAvailableToStream) if (isChatFlowAvailableToStream) { fetchResponseFromEventStream(chatflowid, params) } else { @@ -807,6 +806,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview closeResponse() }, async onerror(err) { + console.error('EventSource Error: ', err) closeResponse() } }) From 6367d486865c7082e62725b69f55c362ae754990 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 5 Sep 2024 02:13:57 +0100 Subject: [PATCH 16/23] update lock file --- pnpm-lock.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 000a7e1a64a..c0d2411f3a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -613,6 +613,9 @@ importers: '@emotion/styled': specifier: ^11.10.6 version: 11.11.0(@emotion/react@11.11.4(@types/react@18.2.65)(react@18.2.0))(@types/react@18.2.65)(react@18.2.0) + '@microsoft/fetch-event-source': + specifier: ^2.0.1 + version: 2.0.1 '@mui/base': specifier: 5.0.0-beta.40 version: 5.0.0-beta.40(@types/react@18.2.65)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -3741,6 +3744,9 @@ packages: '@mendable/firecrawl-js@0.0.28': resolution: { integrity: sha512-Xa+ZbBQkoR/KHM1ZpvJBdLWSCdRoRGyllDNoVvhKxGv9qXZk9h/lBxbqp3Kc1Kg2L2JJnJCkmeaTUCAn8y33GA== } + '@microsoft/fetch-event-source@2.0.1': + resolution: { integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA== } + '@mistralai/mistralai@0.1.3': resolution: { integrity: sha512-WUHxC2xdeqX9PTXJEqdiNY54vT2ir72WSJrZTTBKRnkfhX6zIfCYA24faRlWjUB5WTpn+wfdGsTMl3ArijlXFA== } @@ -21315,6 +21321,8 @@ snapshots: transitivePeerDependencies: - debug + '@microsoft/fetch-event-source@2.0.1': {} + '@mistralai/mistralai@0.1.3(encoding@0.1.13)': dependencies: node-fetch: 2.7.0(encoding@0.1.13) From 88ec25eb83655d5ab20ea74580f67ffd14be4614 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 7 Sep 2024 13:23:55 +0100 Subject: [PATCH 17/23] add open when hidden to sse --- packages/ui/src/views/chatmessage/ChatMessage.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index ad7023929b0..4f9fca3943d 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -750,6 +750,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview const password = localStorage.getItem('password') params.streaming = true await fetchEventSource(`${baseURL}/api/v1/internal-prediction/${chatflowid}`, { + openWhenHidden: true, method: 'POST', body: JSON.stringify(params), headers: { From f5a893993fb7afd4a96ba03bde2f0ab94acfff81 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Wed, 11 Sep 2024 16:33:58 +0530 Subject: [PATCH 18/23] Streaming errors --- .../controllers/internal-predictions/index.ts | 16 +++++++++------- packages/server/src/utils/SSEStreamer.ts | 11 +++++++++++ .../ui/src/views/chatmessage/ChatMessage.jsx | 3 +++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index 52a6194fa58..d7d3513dbf6 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -1,6 +1,7 @@ import { Request, Response, NextFunction } from 'express' import { utilBuildChatflow } from '../../utils/buildChatflow' import { getRunningExpressApp } from '../../utils/getRunningExpressApp' +import { getErrorMessage } from '../../errors/utils' // Send input message and get prediction result (Internal) const createInternalPrediction = async (req: Request, res: Response, next: NextFunction) => { @@ -19,21 +20,22 @@ const createInternalPrediction = async (req: Request, res: Response, next: NextF // Send input message and stream prediction result using SSE (Internal) const createAndStreamInternalPrediction = async (req: Request, res: Response, next: NextFunction) => { + const chatId = req.body.chatId + const sseStreamer = getRunningExpressApp().sseStreamer try { - const chatId = req.body.chatId - getRunningExpressApp().sseStreamer.addClient(chatId, res) + sseStreamer.addClient(chatId, res) res.setHeader('Content-Type', 'text/event-stream') res.setHeader('Cache-Control', 'no-cache') res.setHeader('Connection', 'keep-alive') res.flushHeaders() - const apiResponse = await utilBuildChatflow(req, true) - const sseStreamer = getRunningExpressApp().sseStreamer - sseStreamer.streamMetadataEvent(apiResponse.chatId, apiResponse) - sseStreamer.removeClient(apiResponse.chatId) - return } catch (error) { + if (chatId) { + sseStreamer.streamErrorEvent(chatId, getErrorMessage(error)) + } next(error) + } finally { + sseStreamer.removeClient(chatId) } } export default { diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index d8fb485382f..0e81b8380ca 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -173,6 +173,17 @@ export class SSEStreamer implements IServerSideEventStreamer { // placeholder for future use } + streamErrorEvent(chatId: string, msg: string) { + const client = this.clients[chatId] + if (client) { + const clientResponse = { + event: 'error', + data: msg + } + client.response.write('message\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + } + streamMetadataEvent(chatId: string, apiResponse: any) { const metadataJson: any = {} if (apiResponse.chatId) { diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 4f9fca3943d..222c3d9c7ac 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -793,6 +793,9 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview case 'metadata': updateMetadata(payload.data, input) break + case 'error': + updateLastMessage(payload.data) + break case 'abort': abortMessage(payload.data) closeResponse() From 285ddaffac18c3d13dd90b30e60e28a536b09691 Mon Sep 17 00:00:00 2001 From: Vinod Paidimarry Date: Wed, 11 Sep 2024 16:34:27 +0530 Subject: [PATCH 19/23] Streaming errors --- packages/server/src/controllers/internal-predictions/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index d7d3513dbf6..a706b2255ce 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -28,7 +28,6 @@ const createAndStreamInternalPrediction = async (req: Request, res: Response, ne res.setHeader('Cache-Control', 'no-cache') res.setHeader('Connection', 'keep-alive') res.flushHeaders() - } catch (error) { if (chatId) { sseStreamer.streamErrorEvent(chatId, getErrorMessage(error)) From 1a00e9474f863d8df35ad2550481b662fd27accf Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 11 Sep 2024 22:25:20 +0100 Subject: [PATCH 20/23] add fix for showing error message --- .../controllers/internal-predictions/index.ts | 3 ++ .../src/controllers/predictions/index.ts | 35 +++++++++++-------- .../ui/src/views/chatmessage/ChatMessage.jsx | 10 +++++- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/server/src/controllers/internal-predictions/index.ts b/packages/server/src/controllers/internal-predictions/index.ts index a706b2255ce..6539d76e0e7 100644 --- a/packages/server/src/controllers/internal-predictions/index.ts +++ b/packages/server/src/controllers/internal-predictions/index.ts @@ -28,6 +28,9 @@ const createAndStreamInternalPrediction = async (req: Request, res: Response, ne res.setHeader('Cache-Control', 'no-cache') res.setHeader('Connection', 'keep-alive') res.flushHeaders() + + const apiResponse = await utilBuildChatflow(req, true) + sseStreamer.streamMetadataEvent(apiResponse.chatId, apiResponse) } catch (error) { if (chatId) { sseStreamer.streamErrorEvent(chatId, getErrorMessage(error)) diff --git a/packages/server/src/controllers/predictions/index.ts b/packages/server/src/controllers/predictions/index.ts index dd37a544de0..ae649b9bc81 100644 --- a/packages/server/src/controllers/predictions/index.ts +++ b/packages/server/src/controllers/predictions/index.ts @@ -7,6 +7,7 @@ import { InternalFlowiseError } from '../../errors/internalFlowiseError' import { StatusCodes } from 'http-status-codes' import { getRunningExpressApp } from '../../utils/getRunningExpressApp' import { v4 as uuidv4 } from 'uuid' +import { getErrorMessage } from '../../errors/utils' // Send input message and get prediction result (External) const createPrediction = async (req: Request, res: Response, next: NextFunction) => { @@ -51,27 +52,33 @@ const createPrediction = async (req: Request, res: Response, next: NextFunction) const streamable = await chatflowsService.checkIfChatflowIsValidForStreaming(req.params.id) const isStreamingRequested = req.body.streaming === 'true' || req.body.streaming === true if (streamable?.isStreaming && isStreamingRequested) { - res.setHeader('Content-Type', 'text/event-stream') - res.setHeader('Cache-Control', 'no-cache') - res.setHeader('Connection', 'keep-alive') - res.flushHeaders() + const sseStreamer = getRunningExpressApp().sseStreamer let chatId = req.body.chatId if (!req.body.chatId) { chatId = req.body.chatId ?? req.body.overrideConfig?.sessionId ?? uuidv4() req.body.chatId = chatId } - getRunningExpressApp().sseStreamer.addExternalClient(chatId, res) - } + try { + sseStreamer.addExternalClient(chatId, res) + res.setHeader('Content-Type', 'text/event-stream') + res.setHeader('Cache-Control', 'no-cache') + res.setHeader('Connection', 'keep-alive') + res.flushHeaders() - //@ts-ignore - const apiResponse = await predictionsServices.buildChatflow(req) - if (streamable?.isStreaming && isStreamingRequested) { - const sseStreamer = getRunningExpressApp().sseStreamer - sseStreamer.streamMetadataEvent(apiResponse.chatId, apiResponse) - sseStreamer.removeClient(apiResponse.chatId) - return + const apiResponse = await predictionsServices.buildChatflow(req) + sseStreamer.streamMetadataEvent(apiResponse.chatId, apiResponse) + } catch (error) { + if (chatId) { + sseStreamer.streamErrorEvent(chatId, getErrorMessage(error)) + } + next(error) + } finally { + sseStreamer.removeClient(chatId) + } + } else { + const apiResponse = await predictionsServices.buildChatflow(req) + return res.json(apiResponse) } - return res.json(apiResponse) } else { throw new InternalFlowiseError(StatusCodes.UNAUTHORIZED, `This site is not allowed to access this chatbot`) } diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index 222c3d9c7ac..f9bf3431316 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -499,6 +499,14 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }) } + const updateErrorMessage = (errorMessage) => { + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + allMessages.push({ message: errorMessage, type: 'apiMessage' }) + return allMessages + }) + } + const updateLastMessageSourceDocuments = (sourceDocuments) => { setMessages((prevMessages) => { let allMessages = [...cloneDeep(prevMessages)] @@ -794,7 +802,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview updateMetadata(payload.data, input) break case 'error': - updateLastMessage(payload.data) + updateErrorMessage(payload.data) break case 'abort': abortMessage(payload.data) From 530cbb2b4eadc851d79d7989f3edd5c0252e87bd Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 13 Sep 2024 13:50:49 +0100 Subject: [PATCH 21/23] add code interpreter --- .../agents/OpenAIAssistant/OpenAIAssistant.ts | 43 +-- .../nodes/agents/ToolAgent/ToolAgent.ts | 15 +- .../nodes/sequentialagents/Agent/Agent.ts | 39 ++- .../sequentialagents/ToolNode/ToolNode.ts | 23 +- .../CodeInterpreterE2B/CodeInterpreterE2B.ts | 269 ++++++++++++++++++ .../tools/{E2B => CodeInterpreterE2B}/e2b.png | Bin packages/components/nodes/tools/E2B/E2B.ts | 151 ---------- .../PythonInterpreter/PythonInterpreter.ts | 127 --------- .../nodes/tools/PythonInterpreter/python.svg | 1 - packages/components/src/Interface.ts | 1 + packages/components/src/agents.ts | 30 +- packages/server/src/Interface.ts | 1 + .../src/controllers/chat-messages/index.ts | 3 + .../src/database/entities/ChatMessage.ts | 3 + ...1726156258465-AddArtifactsToChatMessage.ts | 11 + .../src/database/migrations/sqlite/index.ts | 4 +- packages/server/src/utils/SSEStreamer.ts | 10 + packages/server/src/utils/buildAgentGraph.ts | 13 + packages/server/src/utils/buildChatflow.ts | 5 +- .../ui/src/views/chatmessage/ChatMessage.jsx | 141 +++++++++ 20 files changed, 575 insertions(+), 315 deletions(-) create mode 100644 packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts rename packages/components/nodes/tools/{E2B => CodeInterpreterE2B}/e2b.png (100%) delete mode 100644 packages/components/nodes/tools/E2B/E2B.ts delete mode 100644 packages/components/nodes/tools/PythonInterpreter/PythonInterpreter.ts delete mode 100644 packages/components/nodes/tools/PythonInterpreter/python.svg create mode 100644 packages/server/src/database/migrations/sqlite/1726156258465-AddArtifactsToChatMessage.ts diff --git a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts index 4778b1b744f..26ea5dd1a96 100644 --- a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts +++ b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts @@ -208,6 +208,7 @@ class OpenAIAssistant_Agents implements INode { const usedTools: IUsedTool[] = [] const fileAnnotations = [] + const artifacts = [] const assistant = await appDataSource.getRepository(databaseEntities['Assistant']).findOneBy({ id: selectedAssistantId @@ -439,22 +440,26 @@ class OpenAIAssistant_Agents implements INode { const fileId = chunk.image_file.file_id const fileObj = await openai.files.retrieve(fileId) - const buffer = await downloadImg(openai, fileId, `${fileObj.filename}.png`, options.chatflowid, options.chatId) - const base64String = Buffer.from(buffer).toString('base64') - - // TODO: Use a file path and retrieve image on the fly. Storing as base64 to localStorage and database will easily hit limits - const imgHTML = `${fileObj.filename}
` - text += imgHTML + const filePath = await downloadImg( + openai, + fileId, + `${fileObj.filename}.png`, + options.chatflowid, + options.chatId + ) + artifacts.push({ type: 'png', data: filePath }) - if (!isStreamingStarted) { - isStreamingStarted = true + if (artifacts.length) { + if (!isStreamingStarted) { + isStreamingStarted = true + if (sseStreamer) { + sseStreamer.streamStartEvent(chatId, ' ') + } + } if (sseStreamer) { - sseStreamer.streamStartEvent(chatId, imgHTML) + sseStreamer.streamArtifactsEvent(chatId, artifacts) } } - if (sseStreamer) { - sseStreamer.streamTokenEvent(chatId, imgHTML) - } } } @@ -565,6 +570,7 @@ class OpenAIAssistant_Agents implements INode { return { text, usedTools, + artifacts, fileAnnotations, assistant: { assistantId: openAIAssistantId, threadId, runId: runThreadId, messages: messageData } } @@ -769,12 +775,8 @@ class OpenAIAssistant_Agents implements INode { const fileId = content.image_file.file_id const fileObj = await openai.files.retrieve(fileId) - const buffer = await downloadImg(openai, fileId, `${fileObj.filename}.png`, options.chatflowid, options.chatId) - const base64String = Buffer.from(buffer).toString('base64') - - // TODO: Use a file path and retrieve image on the fly. Storing as base64 to localStorage and database will easily hit limits - const imgHTML = `${fileObj.filename}
` - returnVal += imgHTML + const filePath = await downloadImg(openai, fileId, `${fileObj.filename}.png`, options.chatflowid, options.chatId) + artifacts.push({ type: 'png', data: filePath }) } } @@ -787,6 +789,7 @@ class OpenAIAssistant_Agents implements INode { return { text: returnVal, usedTools, + artifacts, fileAnnotations, assistant: { assistantId: openAIAssistantId, threadId, runId: runThreadId, messages: messageData } } @@ -807,9 +810,9 @@ const downloadImg = async (openai: OpenAI, fileId: string, fileName: string, ... const image_data_buffer = Buffer.from(image_data) const mime = 'image/png' - await addSingleFileToStorage(mime, image_data_buffer, fileName, ...paths) + const res = await addSingleFileToStorage(mime, image_data_buffer, fileName, ...paths) - return image_data_buffer + return res } const downloadFile = async (openAIApiKey: string, fileObj: any, fileName: string, ...paths: string[]) => { diff --git a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts index 012e18d6eb5..598ed17ea81 100644 --- a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts +++ b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts @@ -134,6 +134,7 @@ class ToolAgent_Agents implements INode { let res: ChainValues = {} let sourceDocuments: ICommonObject[] = [] let usedTools: IUsedTool[] = [] + let artifacts = [] if (shouldStreamResponse) { const handler = new CustomChainHandler(sseStreamer, chatId) @@ -150,6 +151,12 @@ class ToolAgent_Agents implements INode { } usedTools = res.usedTools } + if (res.artifacts) { + if (sseStreamer) { + sseStreamer.streamArtifactsEvent(chatId, flatten(res.artifacts)) + } + artifacts = res.artifacts + } // If the tool is set to returnDirect, stream the output to the client if (res.usedTools && res.usedTools.length) { let inputTools = nodeData.inputs?.tools @@ -169,6 +176,9 @@ class ToolAgent_Agents implements INode { if (res.usedTools) { usedTools = res.usedTools } + if (res.artifacts) { + artifacts = res.artifacts + } } let output = res?.output @@ -203,7 +213,7 @@ class ToolAgent_Agents implements INode { let finalRes = output - if (sourceDocuments.length || usedTools.length) { + if (sourceDocuments.length || usedTools.length || artifacts.length) { const finalRes: ICommonObject = { text: output } if (sourceDocuments.length) { finalRes.sourceDocuments = flatten(sourceDocuments) @@ -211,6 +221,9 @@ class ToolAgent_Agents implements INode { if (usedTools.length) { finalRes.usedTools = usedTools } + if (artifacts.length) { + finalRes.artifacts = artifacts + } return finalRes } diff --git a/packages/components/nodes/sequentialagents/Agent/Agent.ts b/packages/components/nodes/sequentialagents/Agent/Agent.ts index e6b45490f71..ff1525d1c51 100644 --- a/packages/components/nodes/sequentialagents/Agent/Agent.ts +++ b/packages/components/nodes/sequentialagents/Agent/Agent.ts @@ -21,7 +21,7 @@ import { IDocument, IStateWithMessages } from '../../../src/Interface' -import { ToolCallingAgentOutputParser, AgentExecutor, SOURCE_DOCUMENTS_PREFIX } from '../../../src/agents' +import { ToolCallingAgentOutputParser, AgentExecutor, SOURCE_DOCUMENTS_PREFIX, ARTIFACTS_PREFIX } from '../../../src/agents' import { getInputVariables, getVars, handleEscapeCharacters, prepareSandboxVars } from '../../../src/utils' import { customGet, @@ -35,7 +35,6 @@ import { } from '../commonUtils' import { END, StateGraph } from '@langchain/langgraph' import { StructuredTool } from '@langchain/core/tools' -import { DynamicStructuredTool } from '../../tools/CustomTool/core' const defaultApprovalPrompt = `You are about to execute tool: {tools}. Ask if user want to proceed` const examplePrompt = 'You are a research assistant who can search for up-to-date info using search engine.' @@ -739,7 +738,12 @@ async function agentNode( // If the last message is a tool message and is an interrupted message, format output into standard agent output if (lastMessage._getType() === 'tool' && lastMessage.additional_kwargs?.nodeId === nodeData.id) { - let formattedAgentResult: { output?: string; usedTools?: IUsedTool[]; sourceDocuments?: IDocument[] } = {} + let formattedAgentResult: { + output?: string + usedTools?: IUsedTool[] + sourceDocuments?: IDocument[] + artifacts?: ICommonObject[] + } = {} formattedAgentResult.output = result.content if (lastMessage.additional_kwargs?.usedTools) { formattedAgentResult.usedTools = lastMessage.additional_kwargs.usedTools as IUsedTool[] @@ -747,6 +751,9 @@ async function agentNode( if (lastMessage.additional_kwargs?.sourceDocuments) { formattedAgentResult.sourceDocuments = lastMessage.additional_kwargs.sourceDocuments as IDocument[] } + if (lastMessage.additional_kwargs?.artifacts) { + formattedAgentResult.artifacts = lastMessage.additional_kwargs.artifacts as ICommonObject[] + } result = formattedAgentResult } else { result.name = name @@ -765,12 +772,18 @@ async function agentNode( if (result.sourceDocuments) { additional_kwargs.sourceDocuments = result.sourceDocuments } + if (result.artifacts) { + additional_kwargs.artifacts = result.artifacts + } if (result.output) { result.content = result.output delete result.output } - const outputContent = typeof result === 'string' ? result : result.content || result.output + let outputContent = typeof result === 'string' ? result : result.content || result.output + + // remove invalid markdown image pattern: ![]() + outputContent = typeof outputContent === 'string' ? outputContent.replace(/!\[.*?\]\(.*?\)/g, '') : outputContent if (nodeData.inputs?.updateStateMemoryUI || nodeData.inputs?.updateStateMemoryCode) { let formattedOutput = { @@ -931,6 +944,9 @@ class ToolNode extends RunnableCallable // Extract all properties except messages for IStateWithMessages const { messages: _, ...inputWithoutMessages } = Array.isArray(input) ? { messages: input } : input const ChannelsWithoutMessages = { + chatId: this.options.chatId, + sessionId: this.options.sessionId, + input: this.inputQuery, state: inputWithoutMessages } @@ -940,12 +956,14 @@ class ToolNode extends RunnableCallable if (tool === undefined) { throw new Error(`Tool ${call.name} not found.`) } - if (tool && tool instanceof DynamicStructuredTool) { + if (tool && (tool as any).setFlowObject) { // @ts-ignore tool.setFlowObject(ChannelsWithoutMessages) } let output = await tool.invoke(call.args, config) let sourceDocuments: Document[] = [] + let artifacts = [] + if (output?.includes(SOURCE_DOCUMENTS_PREFIX)) { const outputArray = output.split(SOURCE_DOCUMENTS_PREFIX) output = outputArray[0] @@ -956,12 +974,23 @@ class ToolNode extends RunnableCallable console.error('Error parsing source documents from tool') } } + if (output?.includes(ARTIFACTS_PREFIX)) { + const outputArray = output.split(ARTIFACTS_PREFIX) + output = outputArray[0] + try { + artifacts = JSON.parse(outputArray[1]) + } catch (e) { + console.error('Error parsing artifacts from tool') + } + } + return new ToolMessage({ name: tool.name, content: typeof output === 'string' ? output : JSON.stringify(output), tool_call_id: call.id!, additional_kwargs: { sourceDocuments, + artifacts, args: call.args, usedTools: [ { diff --git a/packages/components/nodes/sequentialagents/ToolNode/ToolNode.ts b/packages/components/nodes/sequentialagents/ToolNode/ToolNode.ts index 45ef49c1b8f..2c4daee48e0 100644 --- a/packages/components/nodes/sequentialagents/ToolNode/ToolNode.ts +++ b/packages/components/nodes/sequentialagents/ToolNode/ToolNode.ts @@ -12,13 +12,12 @@ import { import { AIMessage, AIMessageChunk, BaseMessage, ToolMessage } from '@langchain/core/messages' import { StructuredTool } from '@langchain/core/tools' import { RunnableConfig } from '@langchain/core/runnables' -import { SOURCE_DOCUMENTS_PREFIX } from '../../../src/agents' +import { ARTIFACTS_PREFIX, SOURCE_DOCUMENTS_PREFIX } from '../../../src/agents' import { Document } from '@langchain/core/documents' import { DataSource } from 'typeorm' import { MessagesState, RunnableCallable, customGet, getVM } from '../commonUtils' import { getVars, prepareSandboxVars } from '../../../src/utils' import { ChatPromptTemplate } from '@langchain/core/prompts' -import { DynamicStructuredTool } from '../../tools/CustomTool/core' const defaultApprovalPrompt = `You are about to execute tool: {tools}. Ask if user want to proceed` @@ -408,6 +407,9 @@ class ToolNode ext // Extract all properties except messages for IStateWithMessages const { messages: _, ...inputWithoutMessages } = Array.isArray(input) ? { messages: input } : input const ChannelsWithoutMessages = { + chatId: this.options.chatId, + sessionId: this.options.sessionId, + input: this.inputQuery, state: inputWithoutMessages } @@ -417,12 +419,13 @@ class ToolNode ext if (tool === undefined) { throw new Error(`Tool ${call.name} not found.`) } - if (tool && tool instanceof DynamicStructuredTool) { + if (tool && (tool as any).setFlowObject) { // @ts-ignore tool.setFlowObject(ChannelsWithoutMessages) } let output = await tool.invoke(call.args, config) let sourceDocuments: Document[] = [] + let artifacts = [] if (output?.includes(SOURCE_DOCUMENTS_PREFIX)) { const outputArray = output.split(SOURCE_DOCUMENTS_PREFIX) output = outputArray[0] @@ -433,12 +436,23 @@ class ToolNode ext console.error('Error parsing source documents from tool') } } + if (output?.includes(ARTIFACTS_PREFIX)) { + const outputArray = output.split(ARTIFACTS_PREFIX) + output = outputArray[0] + try { + artifacts = JSON.parse(outputArray[1]) + } catch (e) { + console.error('Error parsing artifacts from tool') + } + } + return new ToolMessage({ name: tool.name, content: typeof output === 'string' ? output : JSON.stringify(output), tool_call_id: call.id!, additional_kwargs: { sourceDocuments, + artifacts, args: call.args, usedTools: [ { @@ -489,7 +503,8 @@ const getReturnOutput = async ( tool: output.name, toolInput: output.additional_kwargs.args, toolOutput: output.content, - sourceDocuments: output.additional_kwargs.sourceDocuments + sourceDocuments: output.additional_kwargs.sourceDocuments, + artifacts: output.additional_kwargs.artifacts } as IUsedTool }) diff --git a/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts b/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts new file mode 100644 index 00000000000..8c3967dc927 --- /dev/null +++ b/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts @@ -0,0 +1,269 @@ +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { StructuredTool, ToolInputParsingException, ToolParams } from '@langchain/core/tools' +import { CodeInterpreter } from '@e2b/code-interpreter' +import { z } from 'zod' +import { addSingleFileToStorage } from '../../../src/storageUtils' +import { CallbackManager, CallbackManagerForToolRun, Callbacks, parseCallbackConfigArg } from '@langchain/core/callbacks/manager' +import { RunnableConfig } from '@langchain/core/runnables' +import { ARTIFACTS_PREFIX } from '../../../src/agents' + +const DESC = `Evaluates python code in a sandbox environment. \ +The environment is long running and exists across multiple executions. \ +You must send the whole script every time and print your outputs. \ +Script should be pure python code that can be evaluated. \ +It should be in python format NOT markdown. \ +The code should NOT be wrapped in backticks. \ +All python packages including requests, matplotlib, scipy, numpy, pandas, \ +etc are available. Create and display chart using "plt.show()".` +const NAME = 'code_interpreter' + +class Code_Interpreter_Tools implements INode { + label: string + name: string + version: number + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + badge: string + credential: INodeParams + + constructor() { + this.label = 'Code Interpreter by E2B' + this.name = 'codeInterpreterE2B' + this.version = 1.0 + this.type = 'CodeInterpreter' + this.icon = 'e2b.png' + this.category = 'Tools' + this.description = 'Execute code in a sandbox environment' + this.baseClasses = [this.type, 'Tool', ...getBaseClasses(E2BTool)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['E2BApi'], + optional: true + } + this.inputs = [ + { + label: 'Tool Name', + name: 'toolName', + type: 'string', + description: 'Specify the name of the tool', + default: 'code_interpreter' + }, + { + label: 'Tool Description', + name: 'toolDesc', + type: 'string', + rows: 4, + description: 'Specify the description of the tool', + default: DESC + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const toolDesc = nodeData.inputs?.toolDesc as string + const toolName = nodeData.inputs?.toolName as string + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const e2bApiKey = getCredentialParam('e2bApiKey', credentialData, nodeData) + + return await E2BTool.initialize({ + description: toolDesc ?? DESC, + name: toolName ?? NAME, + apiKey: e2bApiKey, + schema: z.object({ + input: z.string().describe('Python code to be executed in the sandbox environment') + }), + chatflowid: options.chatflowid + }) + } +} + +type E2BToolParams = ToolParams +type E2BToolInput = { + name: string + description: string + apiKey: string + schema: any + chatflowid: string + templateCodeInterpreterE2B?: string + domainCodeInterpreterE2B?: string +} + +export class E2BTool extends StructuredTool { + static lc_name() { + return 'E2BTool' + } + + name = NAME + + description = DESC + + instance: CodeInterpreter + + apiKey: string + + schema + + chatflowid: string + + flowObj: ICommonObject + + templateCodeInterpreterE2B?: string + domainCodeInterpreterE2B?: string + + constructor(options: E2BToolParams & E2BToolInput) { + super(options) + this.description = options.description + this.name = options.name + this.apiKey = options.apiKey + this.schema = options.schema + this.chatflowid = options.chatflowid + this.templateCodeInterpreterE2B = options.templateCodeInterpreterE2B + this.domainCodeInterpreterE2B = options.domainCodeInterpreterE2B + } + + static async initialize(options: Partial & E2BToolInput) { + return new this({ + name: options.name, + description: options.description, + apiKey: options.apiKey, + schema: options.schema, + chatflowid: options.chatflowid, + templateCodeInterpreterE2B: options.templateCodeInterpreterE2B, + domainCodeInterpreterE2B: options.domainCodeInterpreterE2B + }) + } + + async call( + arg: z.infer, + configArg?: RunnableConfig | Callbacks, + tags?: string[], + flowConfig?: { sessionId?: string; chatId?: string; input?: string; state?: ICommonObject } + ): Promise { + const config = parseCallbackConfigArg(configArg) + if (config.runName === undefined) { + config.runName = this.name + } + let parsed + try { + parsed = await this.schema.parseAsync(arg) + } catch (e) { + throw new ToolInputParsingException(`Received tool input did not match expected schema`, JSON.stringify(arg)) + } + const callbackManager_ = await CallbackManager.configure( + config.callbacks, + this.callbacks, + config.tags || tags, + this.tags, + config.metadata, + this.metadata, + { verbose: this.verbose } + ) + const runManager = await callbackManager_?.handleToolStart( + this.toJSON(), + typeof parsed === 'string' ? parsed : JSON.stringify(parsed), + undefined, + undefined, + undefined, + undefined, + config.runName + ) + let result + try { + result = await this._call(parsed, runManager, flowConfig) + } catch (e) { + await runManager?.handleToolError(e) + throw e + } + if (result && typeof result !== 'string') { + result = JSON.stringify(result) + } + await runManager?.handleToolEnd(result) + return result + } + + // @ts-ignore + protected async _call( + arg: z.infer, + _?: CallbackManagerForToolRun, + flowConfig?: { sessionId?: string; chatId?: string; input?: string } + ): Promise { + flowConfig = { ...this.flowObj, ...flowConfig } + try { + if ('input' in arg) { + this.instance = await CodeInterpreter.create({ apiKey: this.apiKey }) + const execution = await this.instance.notebook.execCell(arg?.input) + + const artifacts = [] + for (const result of execution.results) { + for (const key in result) { + if (!(result as any)[key]) continue + + if (key === 'png') { + //@ts-ignore + const pngData = Buffer.from(result.png, 'base64') + + const filename = `artifact_${Date.now()}.png` + + const res = await addSingleFileToStorage( + 'image/png', + pngData, + filename, + this.chatflowid, + flowConfig!.chatId as string + ) + artifacts.push({ type: 'png', data: res }) + } else if (key === 'jpeg') { + //@ts-ignore + const jpegData = Buffer.from(result.jpeg, 'base64') + + const filename = `artifact_${Date.now()}.jpg` + + const res = await addSingleFileToStorage( + 'image/jpg', + jpegData, + filename, + this.chatflowid, + flowConfig!.chatId as string + ) + artifacts.push({ type: 'jpeg', data: res }) + } else if (key === 'html' || key === 'markdown' || key === 'latex' || key === 'json' || key === 'javascript') { + artifacts.push({ type: key, data: (result as any)[key] }) + } //TODO: support for pdf + } + } + + this.instance.close() + + let output = '' + + if (execution.text) output = execution.text + if (!execution.text && execution.logs.stdout.length) output = execution.logs.stdout.join('\n') + + if (execution.error) { + return `${execution.error.name}: ${execution.error.value}` + } + + return artifacts.length > 0 ? output + ARTIFACTS_PREFIX + JSON.stringify(artifacts) : output + } else { + return 'No input provided' + } + } catch (e) { + if (this.instance) this.instance.close() + return typeof e === 'string' ? e : JSON.stringify(e, null, 2) + } + } + + setFlowObject(flowObj: ICommonObject) { + this.flowObj = flowObj + } +} + +module.exports = { nodeClass: Code_Interpreter_Tools } diff --git a/packages/components/nodes/tools/E2B/e2b.png b/packages/components/nodes/tools/CodeInterpreterE2B/e2b.png similarity index 100% rename from packages/components/nodes/tools/E2B/e2b.png rename to packages/components/nodes/tools/CodeInterpreterE2B/e2b.png diff --git a/packages/components/nodes/tools/E2B/E2B.ts b/packages/components/nodes/tools/E2B/E2B.ts deleted file mode 100644 index 9954e4bd20d..00000000000 --- a/packages/components/nodes/tools/E2B/E2B.ts +++ /dev/null @@ -1,151 +0,0 @@ -/* -* TODO: Implement codeInterpreter column to chat_message table -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' -import { StructuredTool, ToolParams } from '@langchain/core/tools' -import { CodeInterpreter } from '@e2b/code-interpreter' -import { z } from 'zod' - -const DESC = `Evaluates python code in a sandbox environment. \ -The environment is long running and exists across multiple executions. \ -You must send the whole script every time and print your outputs. \ -Script should be pure python code that can be evaluated. \ -It should be in python format NOT markdown. \ -The code should NOT be wrapped in backticks. \ -All python packages including requests, matplotlib, scipy, numpy, pandas, \ -etc are available. Create and display chart using "plt.show()".` -const NAME = 'code_interpreter' - -class E2B_Tools implements INode { - label: string - name: string - version: number - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - badge: string - credential: INodeParams - - constructor() { - this.label = 'E2B' - this.name = 'e2b' - this.version = 1.0 - this.type = 'E2B' - this.icon = 'e2b.png' - this.category = 'Tools' - this.description = 'Execute code in E2B Code Intepreter' - this.baseClasses = [this.type, 'Tool', ...getBaseClasses(E2BTool)] - this.credential = { - label: 'Connect Credential', - name: 'credential', - type: 'credential', - credentialNames: ['E2BApi'] - } - this.inputs = [ - { - label: 'Tool Name', - name: 'toolName', - type: 'string', - description: 'Specify the name of the tool', - default: 'code_interpreter' - }, - { - label: 'Tool Description', - name: 'toolDesc', - type: 'string', - rows: 4, - description: 'Specify the description of the tool', - default: DESC - } - ] - } - - async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { - const toolDesc = nodeData.inputs?.toolDesc as string - const toolName = nodeData.inputs?.toolName as string - const credentialData = await getCredentialData(nodeData.credential ?? '', options) - const e2bApiKey = getCredentialParam('e2bApiKey', credentialData, nodeData) - const socketIO = options.socketIO - const socketIOClientId = options.socketIOClientId - - return await E2BTool.initialize({ - description: toolDesc ?? DESC, - name: toolName ?? NAME, - apiKey: e2bApiKey, - schema: z.object({ - input: z.string().describe('Python code to be executed in the sandbox environment') - }), - socketIO, - socketIOClientId - }) - } -} - -type E2BToolParams = ToolParams & { instance: CodeInterpreter } - -export class E2BTool extends StructuredTool { - static lc_name() { - return 'E2BTool' - } - - name = NAME - - description = DESC - - instance: CodeInterpreter - - apiKey: string - - schema - - socketIO - - socketIOClientId = '' - - constructor(options: E2BToolParams & { name: string; description: string, apiKey: string, schema: any, socketIO: any, socketIOClientId: string}) { - super(options) - this.instance = options.instance - this.description = options.description - this.name = options.name - this.apiKey = options.apiKey - this.schema = options.schema - this.returnDirect = true - this.socketIO = options.socketIO - this.socketIOClientId = options.socketIOClientId - } - - static async initialize(options: Partial & { name: string; description: string, apiKey: string, schema: any, socketIO: any, socketIOClientId: string }) { - const instance = await CodeInterpreter.create({ apiKey: options.apiKey }) - return new this({ instance, name: options.name, description: options.description, apiKey: options.apiKey, schema: options.schema, socketIO: options.socketIO, socketIOClientId: options.socketIOClientId}) - } - - async _call(args: any) { - try { - if ('input' in args) { - const execution = await this.instance.notebook.execCell(args?.input) - let imgHTML = '' - for (const result of execution.results) { - if (result.png) { - imgHTML += `\n\nimage
` - } - if (result.jpeg) { - imgHTML += `\n\nimage
` - } - } - const output = execution.text ? execution.text + imgHTML : imgHTML - if (this.socketIO && this.socketIOClientId) this.socketIO.to(this.socketIOClientId).emit('token', output) - return output - } else { - return 'No input provided' - } - } catch (e) { - return typeof e === 'string' ? e : JSON.stringify(e, null, 2) - } - } -} - -module.exports = { nodeClass: E2B_Tools } -*/ diff --git a/packages/components/nodes/tools/PythonInterpreter/PythonInterpreter.ts b/packages/components/nodes/tools/PythonInterpreter/PythonInterpreter.ts deleted file mode 100644 index fa577632e52..00000000000 --- a/packages/components/nodes/tools/PythonInterpreter/PythonInterpreter.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' -import { loadPyodide, type PyodideInterface } from 'pyodide' -import { Tool, ToolParams } from '@langchain/core/tools' -import * as path from 'path' -import { getUserHome } from '../../../src/utils' - -let pyodideInstance: PyodideInterface | undefined -const DESC = `Evaluates python code in a sandbox environment. The environment resets on every execution. You must send the whole script every time and print your outputs. Script should be pure python code that can be evaluated. Use only packages available in Pyodide.` -const NAME = 'python_interpreter' - -async function LoadPyodide(): Promise { - if (pyodideInstance === undefined) { - const obj = { packageCacheDir: path.join(getUserHome(), '.flowise', 'pyodideCacheDir') } - pyodideInstance = await loadPyodide(obj) - } - return pyodideInstance -} - -class PythonInterpreter_Tools implements INode { - label: string - name: string - version: number - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - badge: string - - constructor() { - this.label = 'Python Interpreter' - this.name = 'pythonInterpreter' - this.version = 1.0 - this.type = 'PythonInterpreter' - this.icon = 'python.svg' - this.category = 'Tools' - this.description = 'Execute python code in Pyodide sandbox environment' - this.baseClasses = [this.type, 'Tool', ...getBaseClasses(PythonInterpreterTool)] - this.inputs = [ - { - label: 'Tool Name', - name: 'toolName', - type: 'string', - description: 'Specify the name of the tool', - default: 'python_interpreter' - }, - { - label: 'Tool Description', - name: 'toolDesc', - type: 'string', - rows: 4, - description: 'Specify the description of the tool', - default: DESC - } - ] - } - - async init(nodeData: INodeData): Promise { - const toolDesc = nodeData.inputs?.toolDesc as string - const toolName = nodeData.inputs?.toolName as string - - return await PythonInterpreterTool.initialize({ - description: toolDesc ?? DESC, - name: toolName ?? NAME - }) - } -} - -type PythonInterpreterToolParams = Parameters[0] & - ToolParams & { - instance: PyodideInterface - } - -export class PythonInterpreterTool extends Tool { - static lc_name() { - return 'PythonInterpreterTool' - } - - name = NAME - - description = DESC - - pyodideInstance: PyodideInterface - - stdout = '' - - stderr = '' - - constructor(options: PythonInterpreterToolParams & { name: string; description: string }) { - super(options) - this.description = options.description - this.name = options.name - this.pyodideInstance = options.instance - this.pyodideInstance.setStderr({ - batched: (text: string) => { - this.stderr += text - } - }) - this.pyodideInstance.setStdout({ - batched: (text: string) => { - this.stdout += text - } - }) - } - - static async initialize(options: Partial & { name: string; description: string }) { - const instance = await LoadPyodide() - return new this({ instance, name: options.name, description: options.description }) - } - - async _call(script: string) { - this.stdout = '' - this.stderr = '' - - try { - await this.pyodideInstance.loadPackagesFromImports(script) - await this.pyodideInstance.runPythonAsync(script) - return JSON.stringify({ stdout: this.stdout, stderr: this.stderr }, null, 2) - } catch (e) { - return typeof e === 'string' ? e : JSON.stringify(e, null, 2) - } - } -} - -module.exports = { nodeClass: PythonInterpreter_Tools } diff --git a/packages/components/nodes/tools/PythonInterpreter/python.svg b/packages/components/nodes/tools/PythonInterpreter/python.svg deleted file mode 100644 index 9cbbf9478df..00000000000 --- a/packages/components/nodes/tools/PythonInterpreter/python.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index ecbcb250e6d..7674dab8c8a 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -415,6 +415,7 @@ export interface IServerSideEventStreamer { streamAgentReasoningEvent(chatId: string, data: any): void streamNextAgentEvent(chatId: string, data: any): void streamActionEvent(chatId: string, data: any): void + streamArtifactsEvent(chatId: string, data: any): void streamAbortEvent(chatId: string): void streamEndEvent(chatId: string): void diff --git a/packages/components/src/agents.ts b/packages/components/src/agents.ts index f464a6742eb..c8d473ac178 100644 --- a/packages/components/src/agents.ts +++ b/packages/components/src/agents.ts @@ -26,6 +26,8 @@ import { formatLogToString } from 'langchain/agents/format_scratchpad/log' import { IUsedTool } from './Interface' export const SOURCE_DOCUMENTS_PREFIX = '\n\n----FLOWISE_SOURCE_DOCUMENTS----\n\n' +export const ARTIFACTS_PREFIX = '\n\n----FLOWISE_ARTIFACTS----\n\n' + export type AgentFinish = { returnValues: Record log: string @@ -345,12 +347,14 @@ export class AgentExecutor extends BaseChain { let iterations = 0 let sourceDocuments: Array = [] const usedTools: IUsedTool[] = [] + let artifacts: any[] = [] const getOutput = async (finishStep: AgentFinish): Promise => { const { returnValues } = finishStep const additional = await this.agent.prepareForOutput(returnValues, steps) if (sourceDocuments.length) additional.sourceDocuments = flatten(sourceDocuments) if (usedTools.length) additional.usedTools = usedTools + if (artifacts.length) additional.artifacts = flatten(artifacts) if (this.returnIntermediateSteps) { return { ...returnValues, intermediateSteps: steps, ...additional } } @@ -426,13 +430,17 @@ export class AgentExecutor extends BaseChain { state: inputs } ) + let toolOutput = observation + if (typeof toolOutput === 'string' && toolOutput.includes(SOURCE_DOCUMENTS_PREFIX)) { + toolOutput = toolOutput.split(SOURCE_DOCUMENTS_PREFIX)[0] + } + if (typeof toolOutput === 'string' && toolOutput.includes(ARTIFACTS_PREFIX)) { + toolOutput = toolOutput.split(ARTIFACTS_PREFIX)[0] + } usedTools.push({ tool: tool.name, toolInput: action.toolInput as any, - toolOutput: - typeof observation === 'string' && observation.includes(SOURCE_DOCUMENTS_PREFIX) - ? observation.split(SOURCE_DOCUMENTS_PREFIX)[0] - : observation + toolOutput }) } else { observation = `${action.tool} is not a valid tool, try another one.` @@ -463,6 +471,16 @@ export class AgentExecutor extends BaseChain { console.error('Error parsing source documents from tool') } } + if (typeof observation === 'string' && observation.includes(ARTIFACTS_PREFIX)) { + const observationArray = observation.split(ARTIFACTS_PREFIX) + observation = observationArray[0] + try { + const artifact = JSON.parse(observationArray[1]) + artifacts.push(artifact) + } catch (e) { + console.error('Error parsing source documents from tool') + } + } return { action, observation: observation ?? '' } }) ) @@ -566,6 +584,10 @@ export class AgentExecutor extends BaseChain { const observationArray = observation.split(SOURCE_DOCUMENTS_PREFIX) observation = observationArray[0] } + if (typeof observation === 'string' && observation.includes(ARTIFACTS_PREFIX)) { + const observationArray = observation.split(ARTIFACTS_PREFIX) + observation = observationArray[0] + } } catch (e) { if (e instanceof ToolInputParsingException) { if (this.handleParsingErrors === true) { diff --git a/packages/server/src/Interface.ts b/packages/server/src/Interface.ts index 3fb1192094a..0294406770c 100644 --- a/packages/server/src/Interface.ts +++ b/packages/server/src/Interface.ts @@ -42,6 +42,7 @@ export interface IChatMessage { fileAnnotations?: string agentReasoning?: string fileUploads?: string + artifacts?: string chatType: string chatId: string memoryType?: string diff --git a/packages/server/src/controllers/chat-messages/index.ts b/packages/server/src/controllers/chat-messages/index.ts index bc4b7003b4e..903a313bc7b 100644 --- a/packages/server/src/controllers/chat-messages/index.ts +++ b/packages/server/src/controllers/chat-messages/index.ts @@ -209,6 +209,9 @@ const parseAPIResponse = (apiResponse: ChatMessage | ChatMessage[]): ChatMessage if (parsedResponse.action) { parsedResponse.action = JSON.parse(parsedResponse.action) } + if (parsedResponse.artifacts) { + parsedResponse.artifacts = JSON.parse(parsedResponse.artifacts) + } return parsedResponse } diff --git a/packages/server/src/database/entities/ChatMessage.ts b/packages/server/src/database/entities/ChatMessage.ts index 6228b6699c6..ebd059f3670 100644 --- a/packages/server/src/database/entities/ChatMessage.ts +++ b/packages/server/src/database/entities/ChatMessage.ts @@ -32,6 +32,9 @@ export class ChatMessage implements IChatMessage { @Column({ nullable: true, type: 'text' }) fileUploads?: string + @Column({ nullable: true, type: 'text' }) + artifacts?: string + @Column({ nullable: true, type: 'text' }) action?: string | null diff --git a/packages/server/src/database/migrations/sqlite/1726156258465-AddArtifactsToChatMessage.ts b/packages/server/src/database/migrations/sqlite/1726156258465-AddArtifactsToChatMessage.ts new file mode 100644 index 00000000000..1056cb1ce51 --- /dev/null +++ b/packages/server/src/database/migrations/sqlite/1726156258465-AddArtifactsToChatMessage.ts @@ -0,0 +1,11 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddArtifactsToChatMessage1726156258465 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "chat_message" ADD COLUMN "artifacts" TEXT;`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "artifacts";`) + } +} diff --git a/packages/server/src/database/migrations/sqlite/index.ts b/packages/server/src/database/migrations/sqlite/index.ts index 69bd8a69e9e..1922bcb0995 100644 --- a/packages/server/src/database/migrations/sqlite/index.ts +++ b/packages/server/src/database/migrations/sqlite/index.ts @@ -23,6 +23,7 @@ import { AddAgentReasoningToChatMessage1714679514451 } from './1714679514451-Add import { AddTypeToChatFlow1716300000000 } from './1716300000000-AddTypeToChatFlow' import { AddApiKey1720230151480 } from './1720230151480-AddApiKey' import { AddActionToChatMessage1721078251523 } from './1721078251523-AddActionToChatMessage' +import { AddArtifactsToChatMessage1726156258465 } from './1726156258465-AddArtifactsToChatMessage' export const sqliteMigrations = [ Init1693835579790, @@ -49,5 +50,6 @@ export const sqliteMigrations = [ AddTypeToChatFlow1716300000000, AddVectorStoreConfigToDocStore1715861032479, AddApiKey1720230151480, - AddActionToChatMessage1721078251523 + AddActionToChatMessage1721078251523, + AddArtifactsToChatMessage1726156258465 ] diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index 0e81b8380ca..4217925f21c 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -97,6 +97,16 @@ export class SSEStreamer implements IServerSideEventStreamer { client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') } } + streamArtifactsEvent(chatId: string, data: any) { + const client = this.clients[chatId] + if (client) { + const clientResponse = { + event: 'artifacts', + data: data + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + } streamUsedToolsEvent(chatId: string, data: any): void { const client = this.clients[chatId] if (client) { diff --git a/packages/server/src/utils/buildAgentGraph.ts b/packages/server/src/utils/buildAgentGraph.ts index cd6fafe7a5a..ea44382bb30 100644 --- a/packages/server/src/utils/buildAgentGraph.ts +++ b/packages/server/src/utils/buildAgentGraph.ts @@ -154,6 +154,7 @@ export const buildAgentGraph = async ( let finalAction: IAction = {} let totalSourceDocuments: IDocument[] = [] let totalUsedTools: IUsedTool[] = [] + let totalArtifacts: ICommonObject[] = [] const workerNodes = reactFlowNodes.filter((node) => node.data.name === 'worker') const supervisorNodes = reactFlowNodes.filter((node) => node.data.name === 'supervisor') @@ -221,6 +222,9 @@ export const buildAgentGraph = async ( const sourceDocuments = output[agentName]?.messages ? output[agentName].messages.map((msg: BaseMessage) => msg.additional_kwargs?.sourceDocuments) : [] + const artifacts = output[agentName]?.messages + ? output[agentName].messages.map((msg: BaseMessage) => msg.additional_kwargs?.artifacts) + : [] const messages = output[agentName]?.messages ? output[agentName].messages.map((msg: BaseMessage) => (typeof msg === 'string' ? msg : msg.content)) : [] @@ -240,6 +244,11 @@ export const buildAgentGraph = async ( if (cleanedDocs.length) totalSourceDocuments.push(...cleanedDocs) } + if (artifacts && artifacts.length) { + const cleanedArtifacts = artifacts.filter((artifact: ICommonObject) => artifact) + if (cleanedArtifacts.length) totalArtifacts.push(...cleanedArtifacts) + } + /* * Check if the next node is a condition node, if yes, then add the agent reasoning of the condition node */ @@ -273,6 +282,7 @@ export const buildAgentGraph = async ( instructions: output[agentName]?.instructions, usedTools: flatten(usedTools) as IUsedTool[], sourceDocuments: flatten(sourceDocuments) as Document[], + artifacts: flatten(artifacts) as ICommonObject[], state, nodeName: isSequential ? mapNameToLabel[agentName].nodeName : undefined, nodeId @@ -395,10 +405,12 @@ export const buildAgentGraph = async ( totalSourceDocuments = uniq(flatten(totalSourceDocuments)) totalUsedTools = uniq(flatten(totalUsedTools)) + totalArtifacts = uniq(flatten(totalArtifacts)) if (shouldStreamResponse && sseStreamer) { sseStreamer.streamUsedToolsEvent(chatId, totalUsedTools) sseStreamer.streamSourceDocumentsEvent(chatId, totalSourceDocuments) + sseStreamer.streamArtifactsEvent(chatId, totalArtifacts) sseStreamer.streamEndEvent(chatId) } @@ -406,6 +418,7 @@ export const buildAgentGraph = async ( finalResult, finalAction, sourceDocuments: totalSourceDocuments, + artifacts: totalArtifacts, usedTools: totalUsedTools, agentReasoning } diff --git a/packages/server/src/utils/buildChatflow.ts b/packages/server/src/utils/buildChatflow.ts index 7cd7b68f8a8..429492f2dd2 100644 --- a/packages/server/src/utils/buildChatflow.ts +++ b/packages/server/src/utils/buildChatflow.ts @@ -420,6 +420,8 @@ export const utilBuildChatflow = async (req: Request, isInternal: boolean = fals if (result?.sourceDocuments) apiMessage.sourceDocuments = JSON.stringify(result.sourceDocuments) if (result?.usedTools) apiMessage.usedTools = JSON.stringify(result.usedTools) if (result?.fileAnnotations) apiMessage.fileAnnotations = JSON.stringify(result.fileAnnotations) + if (result?.artifacts) apiMessage.artifacts = JSON.stringify(result.artifacts) + const chatMessage = await utilAddChatMessage(apiMessage) logger.debug(`[server]: Finished running ${nodeToExecuteData.label} (${nodeToExecuteData.id})`) @@ -481,7 +483,7 @@ const utilBuildAgentResponse = async ( shouldStreamResponse ) if (streamResults) { - const { finalResult, finalAction, sourceDocuments, usedTools, agentReasoning } = streamResults + const { finalResult, finalAction, sourceDocuments, artifacts, usedTools, agentReasoning } = streamResults const userMessage: Omit = { role: 'userMessage', content: incomingInput.question, @@ -506,6 +508,7 @@ const utilBuildAgentResponse = async ( sessionId } if (sourceDocuments?.length) apiMessage.sourceDocuments = JSON.stringify(sourceDocuments) + if (artifacts?.length) apiMessage.artifacts = JSON.stringify(artifacts) if (usedTools?.length) apiMessage.usedTools = JSON.stringify(usedTools) if (agentReasoning?.length) apiMessage.agentReasoning = JSON.stringify(agentReasoning) if (finalAction && Object.keys(finalAction).length) apiMessage.action = JSON.stringify(finalAction) diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index f9bf3431316..ebabf125377 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -534,6 +534,23 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview }) } + const updateLastMessageArtifacts = (artifacts) => { + artifacts.forEach((artifact) => { + if (artifact.type === 'png' || artifact.type === 'jpeg') { + artifact.data = `${baseURL}/api/v1/get-upload-file?chatflowId=${chatflowid}&chatId=${chatId}&fileName=${artifact.data.replace( + 'FILE-STORAGE::', + '' + )}` + } + }) + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'userMessage') return allMessages + allMessages[allMessages.length - 1].artifacts = artifacts + return allMessages + }) + } + const updateLastMessageNextAgent = (nextAgent) => { setMessages((prevMessages) => { let allMessages = [...cloneDeep(prevMessages)] @@ -730,6 +747,7 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview fileAnnotations: data?.fileAnnotations, agentReasoning: data?.agentReasoning, action: data?.action, + artifacts: data?.artifacts, type: 'apiMessage', feedback: null } @@ -792,6 +810,9 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview case 'agentReasoning': updateLastMessageAgentReasoning(payload.data) break + case 'artifacts': + updateLastMessageArtifacts(payload.data) + break case 'action': updateLastMessageAction(payload.data) break @@ -913,6 +934,17 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview if (message.fileAnnotations) obj.fileAnnotations = message.fileAnnotations if (message.agentReasoning) obj.agentReasoning = message.agentReasoning if (message.action) obj.action = message.action + if (message.artifacts) { + obj.artifacts = message.artifacts + obj.artifacts.forEach((artifact) => { + if (artifact.type === 'png' || artifact.type === 'jpeg') { + artifact.data = `${baseURL}/api/v1/get-upload-file?chatflowId=${chatflowid}&chatId=${chatId}&fileName=${artifact.data.replace( + 'FILE-STORAGE::', + '' + )}` + } + }) + } if (message.fileUploads) { obj.fileUploads = message.fileUploads obj.fileUploads.forEach((file) => { @@ -1260,6 +1292,84 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview } } + const agentReasoningArtifacts = (artifacts) => { + const newArtifacts = cloneDeep(artifacts) + for (let i = 0; i < newArtifacts.length; i++) { + const artifact = newArtifacts[i] + if (artifact && (artifact.type === 'png' || artifact.type === 'jpeg')) { + const data = artifact.data + newArtifacts[i].data = `${baseURL}/api/v1/get-upload-file?chatflowId=${chatflowid}&chatId=${chatId}&fileName=${data.replace( + 'FILE-STORAGE::', + '' + )}` + } + } + return newArtifacts + } + + const renderArtifacts = (item, index, isAgentReasoning) => { + if (item.type === 'png' || item.type === 'jpeg') { + return ( + + + + ) + } else if (item.type === 'html') { + return ( +
+
+
+ ) + } else { + return ( + + ) : ( + + {children} + + ) + } + }} + > + {item.data} + + ) + } + } + return (
{isDragActive && ( @@ -1459,6 +1569,23 @@ export const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, preview />
)} + {agent.artifacts && ( +
+ {agentReasoningArtifacts(agent.artifacts).map((item, index) => { + return item !== null ? ( + <>{renderArtifacts(item, index, true)} + ) : null + })} +
+ )} {agent.messages.length > 0 && ( )} + {message.artifacts && ( +
+ {message.artifacts.map((item, index) => { + return item !== null ? <>{renderArtifacts(item, index)} : null + })} +
+ )}
{message.type === 'leadCaptureMessage' && !getLocalStorageChatflow(chatflowid)?.lead && From a2cf396ee87bf9d107233e10b1bb57d0992c6c8b Mon Sep 17 00:00:00 2001 From: Henry Date: Sun, 15 Sep 2024 13:14:57 +0100 Subject: [PATCH 22/23] add artifacts to view message dialog --- .../dialog/ViewMessagesDialog.jsx | 183 +++++++++++++++--- 1 file changed, 161 insertions(+), 22 deletions(-) diff --git a/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx b/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx index ef981cd9285..5b40d1e7c21 100644 --- a/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx +++ b/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx @@ -8,6 +8,7 @@ import rehypeRaw from 'rehype-raw' import remarkGfm from 'remark-gfm' import remarkMath from 'remark-math' import axios from 'axios' +import { cloneDeep } from 'lodash' // material-ui import { @@ -207,7 +208,16 @@ const ViewMessagesDialog = ({ show, dialogProps, onCancel }) => { if (chatmsg.fileAnnotations) msg.fileAnnotations = chatmsg.fileAnnotations if (chatmsg.feedback) msg.feedback = chatmsg.feedback?.content if (chatmsg.agentReasoning) msg.agentReasoning = chatmsg.agentReasoning - + if (chatmsg.artifacts) { + obj.artifacts = chatmsg.artifacts + obj.artifacts.forEach((artifact) => { + if (artifact.type === 'png' || artifact.type === 'jpeg') { + artifact.data = `${baseURL}/api/v1/get-upload-file?chatflowId=${chatmsg.chatflowid}&chatId=${ + chatmsg.chatId + }&fileName=${artifact.data.replace('FILE-STORAGE::', '')}` + } + }) + } if (!Object.prototype.hasOwnProperty.call(obj, chatPK)) { obj[chatPK] = { id: chatmsg.chatId, @@ -341,7 +351,16 @@ const ViewMessagesDialog = ({ show, dialogProps, onCancel }) => { if (chatmsg.usedTools) obj.usedTools = chatmsg.usedTools if (chatmsg.fileAnnotations) obj.fileAnnotations = chatmsg.fileAnnotations if (chatmsg.agentReasoning) obj.agentReasoning = chatmsg.agentReasoning - + if (chatmsg.artifacts) { + obj.artifacts = chatmsg.artifacts + obj.artifacts.forEach((artifact) => { + if (artifact.type === 'png' || artifact.type === 'jpeg') { + artifact.data = `${baseURL}/api/v1/get-upload-file?chatflowId=${chatmsg.chatflowid}&chatId=${ + chatmsg.chatId + }&fileName=${artifact.data.replace('FILE-STORAGE::', '')}` + } + }) + } loadedMessages.push(obj) } setChatMessages(loadedMessages) @@ -574,6 +593,83 @@ const ViewMessagesDialog = ({ show, dialogProps, onCancel }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [feedbackTypeFilter]) + const agentReasoningArtifacts = (artifacts) => { + const newArtifacts = cloneDeep(artifacts) + for (let i = 0; i < newArtifacts.length; i++) { + const artifact = newArtifacts[i] + if (artifact && (artifact.type === 'png' || artifact.type === 'jpeg')) { + const data = artifact.data + newArtifacts[i].data = `${baseURL}/api/v1/get-upload-file?chatflowId=${ + dialogProps.chatflow.id + }&chatId=${selectedChatId}&fileName=${data.replace('FILE-STORAGE::', '')}` + } + } + return newArtifacts + } + + const renderArtifacts = (item, index, isAgentReasoning) => { + if (item.type === 'png' || item.type === 'jpeg') { + return ( + + + + ) + } else if (item.type === 'html') { + return ( +
+
+
+ ) + } else { + return ( + + ) : ( + + {children} + + ) + } + }} + > + {item.data} + + ) + } + } + const component = show ? ( { width: '100%' }} > - {message.usedTools && ( -
- {message.usedTools.map((tool, index) => { - return ( - onSourceDialogClick(tool, 'Used Tools')} - /> - ) - })} -
- )} {message.fileUploads && message.fileUploads.length > 0 && (
{ />
)} + {agent.artifacts && ( +
+ {agentReasoningArtifacts( + agent.artifacts + ).map((item, index) => { + return item !== null ? ( + <> + {renderArtifacts( + item, + index, + true + )} + + ) : null + })} +
+ )} {agent.messages.length > 0 && ( { return !inline ? ( { })}
)} + {message.usedTools && ( +
+ {message.usedTools.map((tool, index) => { + return ( + onSourceDialogClick(tool, 'Used Tools')} + /> + ) + })} +
+ )} + {message.artifacts && ( +
+ {message.artifacts.map((item, index) => { + return item !== null ? ( + <>{renderArtifacts(item, index)} + ) : null + })} +
+ )}
{/* Messages are being rendered in Markdown format */} Date: Tue, 17 Sep 2024 08:22:34 +0100 Subject: [PATCH 23/23] Update pnpm-lock.yaml --- pnpm-lock.yaml | 3374 +----------------------------------------------- 1 file changed, 48 insertions(+), 3326 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0d2411f3a1..0d7ef3e6e84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,7 @@ overrides: '@google/generative-ai': ^0.15.0 openai: 4.51.0 '@langchain/core': 0.2.18 + set-value: ^3.0.3 importers: .: @@ -122,6 +123,9 @@ importers: '@elastic/elasticsearch': specifier: ^8.9.0 version: 8.12.2 + '@flowiseai/nodevm': + specifier: ^3.9.25 + version: 3.9.25 '@getzep/zep-cloud': specifier: ~1.0.7 version: 1.0.7(@langchain/core@0.2.18)(encoding@0.1.13)(langchain@0.2.11) @@ -154,7 +158,7 @@ importers: version: 0.0.7(encoding@0.1.13)(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13)) '@langchain/community': specifier: ^0.2.17 - version: 0.2.17(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-bedrock-agent-runtime@3.625.0)(@aws-sdk/client-bedrock-runtime@3.422.0)(@aws-sdk/client-dynamodb@3.529.1)(@aws-sdk/client-kendra@3.624.0)(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@datastax/astra-db-ts@0.1.4)(@elastic/elasticsearch@8.12.2)(@getzep/zep-cloud@1.0.7)(@getzep/zep-js@0.9.0)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@google-ai/generativelanguage@2.6.0(encoding@0.1.13))(@huggingface/inference@2.6.4)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@opensearch-project/opensearch@1.2.0)(@pinecone-database/pinecone@2.2.2)(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@smithy/eventstream-codec@3.1.2)(@smithy/protocol-http@4.1.0)(@smithy/signature-v4@4.1.0)(@smithy/util-utf8@3.0.0)(@supabase/postgrest-js@1.9.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@upstash/redis@1.22.1(encoding@0.1.13))(@upstash/vector@1.1.5)(@xenova/transformers@2.17.1)(@zilliz/milvus2-sdk-node@2.3.5)(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(cohere-ai@7.10.0(encoding@0.1.13))(couchbase@4.3.1)(crypto-js@4.2.0)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(google-auth-library@9.6.3(encoding@0.1.13))(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(lodash@4.17.21)(lunary@0.6.16(openai@4.51.0(encoding@0.1.13))(react@18.2.0))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(pg@8.11.3)(playwright@1.42.1)(portkey-ai@0.1.16)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(replicate@0.31.1)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + version: 0.2.17(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-bedrock-agent-runtime@3.625.0)(@aws-sdk/client-bedrock-runtime@3.422.0)(@aws-sdk/client-dynamodb@3.529.1)(@aws-sdk/client-kendra@3.624.0)(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@datastax/astra-db-ts@0.1.4)(@elastic/elasticsearch@8.12.2)(@getzep/zep-cloud@1.0.7)(@getzep/zep-js@0.9.0)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@google-ai/generativelanguage@2.6.0(encoding@0.1.13))(@huggingface/inference@2.6.4)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@opensearch-project/opensearch@1.2.0)(@pinecone-database/pinecone@2.2.2)(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@smithy/eventstream-codec@3.1.2)(@smithy/protocol-http@4.1.0)(@smithy/signature-v4@4.1.0)(@smithy/util-utf8@3.0.0)(@supabase/postgrest-js@1.9.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@upstash/redis@1.22.1(encoding@0.1.13))(@upstash/vector@1.1.5)(@xenova/transformers@2.17.1)(@zilliz/milvus2-sdk-node@2.3.5)(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(cohere-ai@7.10.0(encoding@0.1.13))(couchbase@4.3.1)(crypto-js@4.2.0)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(google-auth-library@9.6.3(encoding@0.1.13))(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(lodash@4.17.21)(lunary@0.7.10(openai@4.51.0(encoding@0.1.13))(react@18.2.0))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(pg@8.11.3)(playwright@1.42.1)(portkey-ai@0.1.16)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(replicate@0.31.1)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@langchain/core': specifier: 0.2.18 version: 0.2.18(langchain@0.2.11(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@langchain/anthropic@0.2.1)(@langchain/aws@0.0.9)(@langchain/cohere@0.0.7)(@langchain/community@0.2.17)(@langchain/google-genai@0.0.22)(@langchain/google-vertexai@0.0.19)(@langchain/groq@0.0.8)(@langchain/mistralai@0.0.26)(@langchain/ollama@0.0.2)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(couchbase@4.3.1)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(playwright@1.42.1)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.51.0(encoding@0.1.13)) @@ -318,8 +322,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 lunary: - specifier: ^0.6.16 - version: 0.6.16(openai@4.51.0(encoding@0.1.13))(react@18.2.0) + specifier: ^0.7.10 + version: 0.7.10(openai@4.51.0(encoding@0.1.13))(react@18.2.0) mammoth: specifier: ^1.5.1 version: 1.7.0 @@ -374,6 +378,9 @@ importers: replicate: specifier: ^0.31.1 version: 0.31.1 + sanitize-filename: + specifier: ^1.6.3 + version: 1.6.3 socket.io: specifier: ^4.6.1 version: 4.7.4(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -383,9 +390,6 @@ importers: typeorm: specifier: ^0.3.6 version: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)) - vm2: - specifier: ^3.9.19 - version: 3.9.19 weaviate-ts-client: specifier: ^1.1.0 version: 1.6.0(encoding@0.1.13)(graphql@16.8.1) @@ -2991,6 +2995,11 @@ packages: '@floating-ui/utils@0.2.1': resolution: { integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== } + '@flowiseai/nodevm@3.9.25': + resolution: { integrity: sha512-Ncd6iSsW4X6cKmJ+QtRM3SAZkqkM4Hg/CpgSdij3zOiZok9NiLxptXOyadHp5uomwr8EVozFFYknAVJngJ0jFQ== } + engines: { node: '>=18.10', pnpm: '>=9.6' } + hasBin: true + '@gar/promisify@1.1.3': resolution: { integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== } @@ -5781,68 +5790,12 @@ packages: ajv@8.13.0: resolution: { integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== } - align-text@0.1.4: - resolution: { integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg== } - engines: { node: '>=0.10.0' } - already@2.2.1: resolution: { integrity: sha512-qk6RIVMS/R1yTvBzfIL1T76PsIL7DIVCINoLuFw2YXKLpLtsTobqdChMs8m3OhuPS3CEE3+Ra5ibYiqdyogbsQ== } ansi-align@3.0.1: resolution: { integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== } - ansi-bgblack@0.1.1: - resolution: { integrity: sha512-tp8M/NCmSr6/skdteeo9UgJ2G1rG88X3ZVNZWXUxFw4Wh0PAGaAAWQS61sfBt/1QNcwMTY3EBKOMPujwioJLaw== } - engines: { node: '>=0.10.0' } - - ansi-bgblue@0.1.1: - resolution: { integrity: sha512-R8JmX2Xv3+ichUQE99oL+LvjsyK+CDWo/BtVb4QUz3hOfmf2bdEmiDot3fQcpn2WAHW3toSRdjSLm6bgtWRDlA== } - engines: { node: '>=0.10.0' } - - ansi-bgcyan@0.1.1: - resolution: { integrity: sha512-6SByK9q2H978bmqzuzA5NPT1lRDXl3ODLz/DjC4URO5f/HqK7dnRKfoO/xQLx/makOz7zWIbRf6+Uf7bmaPSkQ== } - engines: { node: '>=0.10.0' } - - ansi-bggreen@0.1.1: - resolution: { integrity: sha512-8TRtOKmIPOuxjpklrkhUbqD2NnVb4WZQuIjXrT+TGKFKzl7NrL7wuNvEap3leMt2kQaCngIN1ZzazSbJNzF+Aw== } - engines: { node: '>=0.10.0' } - - ansi-bgmagenta@0.1.1: - resolution: { integrity: sha512-UZYhobiGAlV4NiwOlKAKbkCyxOl1PPZNvdIdl/Ce5by45vwiyNdBetwHk/AjIpo1Ji9z+eE29PUBAjjfVmz5SA== } - engines: { node: '>=0.10.0' } - - ansi-bgred@0.1.1: - resolution: { integrity: sha512-BpPHMnYmRBhcjY5knRWKjQmPDPvYU7wrgBSW34xj7JCH9+a/SEIV7+oSYVOgMFopRIadOz9Qm4zIy+mEBvUOPA== } - engines: { node: '>=0.10.0' } - - ansi-bgwhite@0.1.1: - resolution: { integrity: sha512-KIF19t+HOYOorUnHTOhZpeZ3bJsjzStBG2hSGM0WZ8YQQe4c7lj9CtwnucscJDPrNwfdz6GBF+pFkVfvHBq6uw== } - engines: { node: '>=0.10.0' } - - ansi-bgyellow@0.1.1: - resolution: { integrity: sha512-WyRoOFSIvOeM7e7YdlSjfAV82Z6K1+VUVbygIQ7C/VGzWYuO/d30F0PG7oXeo4uSvSywR0ozixDQvtXJEorq4Q== } - engines: { node: '>=0.10.0' } - - ansi-black@0.1.1: - resolution: { integrity: sha512-hl7re02lWus7lFOUG6zexhoF5gssAfG5whyr/fOWK9hxNjUFLTjhbU/b4UHWOh2dbJu9/STSUv+80uWYzYkbTQ== } - engines: { node: '>=0.10.0' } - - ansi-blue@0.1.1: - resolution: { integrity: sha512-8Um59dYNDdQyoczlf49RgWLzYgC2H/28W3JAIyOAU/+WkMcfZmaznm+0i1ikrE0jME6Ypk9CJ9CY2+vxbPs7Fg== } - engines: { node: '>=0.10.0' } - - ansi-bold@0.1.1: - resolution: { integrity: sha512-wWKwcViX1E28U6FohtWOP4sHFyArELHJ2p7+3BzbibqJiuISeskq6t7JnrLisUngMF5zMhgmXVw8Equjzz9OlA== } - engines: { node: '>=0.10.0' } - - ansi-colors@0.1.0: - resolution: { integrity: sha512-nUNbMZLDr1YQaPdMC2lREJXKttoaHwICajt9x40Js/POX7gNv7OK/VbC9ciJaIFshg9Xol+1GclqfY14UW+0ZA== } - engines: { node: '>=0.10.0' } - - ansi-colors@0.2.0: - resolution: { integrity: sha512-ScRNUT0TovnYw6+Xo3iKh6G+VXDw2Ds7ZRnMIuKBgHY02DgvT2T2K22/tc/916Fi0W/5Z1RzDaHQwnp75hqdbA== } - engines: { node: '>=0.10.0' } - ansi-colors@1.1.0: resolution: { integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== } engines: { node: '>=0.10.0' } @@ -5851,18 +5804,6 @@ packages: resolution: { integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== } engines: { node: '>=6' } - ansi-cyan@0.1.1: - resolution: { integrity: sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== } - engines: { node: '>=0.10.0' } - - ansi-dim@0.1.1: - resolution: { integrity: sha512-zAfb1fokXsq4BoZBkL0eK+6MfFctbzX3R4UMcoWrL1n2WHewFKentTvOZv2P11u6P4NtW/V47hVjaN7fJiefOg== } - engines: { node: '>=0.10.0' } - - ansi-escapes@1.4.0: - resolution: { integrity: sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw== } - engines: { node: '>=0.10.0' } - ansi-escapes@4.3.2: resolution: { integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== } engines: { node: '>=8' } @@ -5875,39 +5816,11 @@ packages: resolution: { integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== } engines: { node: '>=0.10.0' } - ansi-green@0.1.1: - resolution: { integrity: sha512-WJ70OI4jCaMy52vGa/ypFSKFb/TrYNPaQ2xco5nUwE0C5H8piume/uAZNNdXXiMQ6DbRmiE7l8oNBHu05ZKkrw== } - engines: { node: '>=0.10.0' } - - ansi-grey@0.1.1: - resolution: { integrity: sha512-+J1nM4lC+whSvf3T4jsp1KR+C63lypb+VkkwtLQMc1Dlt+nOvdZpFT0wwFTYoSlSwCcLUAaOpHF6kPkYpSa24A== } - engines: { node: '>=0.10.0' } - - ansi-hidden@0.1.1: - resolution: { integrity: sha512-8gB1bo9ym9qZ/Obvrse1flRsfp2RE+40B23DhQcKxY+GSeaOJblLnzBOxzvmLTWbi5jNON3as7wd9rC0fNK73Q== } - engines: { node: '>=0.10.0' } - ansi-html-community@0.0.8: resolution: { integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== } engines: { '0': node >= 0.8.0 } hasBin: true - ansi-inverse@0.1.1: - resolution: { integrity: sha512-Kq8Z0dBRhQhDMN/Rso1Nu9niwiTsRkJncfJZXiyj7ApbfJrGrrubHXqXI37feJZkYcIx6SlTBdNCeK0OQ6X6ag== } - engines: { node: '>=0.10.0' } - - ansi-italic@0.1.1: - resolution: { integrity: sha512-jreCxifSAqbaBvcibeQxcwhQDbEj7gF69XnpA6x83qbECEBaRBD1epqskrmov1z4B+zzQuEdwbWxgzvhKa+PkA== } - engines: { node: '>=0.10.0' } - - ansi-magenta@0.1.1: - resolution: { integrity: sha512-A1Giu+HRwyWuiXKyXPw2AhG1yWZjNHWO+5mpt+P+VWYkmGRpLPry0O5gmlJQEvpjNpl4RjFV7DJQ4iozWOmkbQ== } - engines: { node: '>=0.10.0' } - - ansi-red@0.1.1: - resolution: { integrity: sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== } - engines: { node: '>=0.10.0' } - ansi-regex@2.1.1: resolution: { integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== } engines: { node: '>=0.10.0' } @@ -5920,14 +5833,6 @@ packages: resolution: { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } engines: { node: '>=12' } - ansi-reset@0.1.1: - resolution: { integrity: sha512-n+D0qD3B+h/lP0dSwXX1SZMoXufdUVotLMwUuvXa50LtBAh3f+WV8b5nFMfLL/hgoPBUt+rG/pqqzF8krlZKcw== } - engines: { node: '>=0.10.0' } - - ansi-strikethrough@0.1.1: - resolution: { integrity: sha512-gWkLPDvHH2pC9YEKqp8dIl0mg3sRglMPvioqGDIOXiwxjxUwIJ1gF86E2o4R5yLNh8IAkwHbaMtASkJfkQ2hIA== } - engines: { node: '>=0.10.0' } - ansi-styles@2.2.1: resolution: { integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== } engines: { node: '>=0.10.0' } @@ -5948,22 +5853,10 @@ packages: resolution: { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } engines: { node: '>=12' } - ansi-underline@0.1.1: - resolution: { integrity: sha512-D+Bzwio/0/a0Fu5vJzrIT6bFk43TW46vXfSvzysOTEHcXOAUJTVMHWDbELIzGU4AVxVw2rCTb7YyWS4my2cSKQ== } - engines: { node: '>=0.10.0' } - - ansi-white@0.1.1: - resolution: { integrity: sha512-DJHaF2SRzBb9wZBgqIJNjjTa7JUJTO98sHeTS1sDopyKKRopL1KpaJ20R6W2f/ZGras8bYyIZDtNwYOVXNgNFg== } - engines: { node: '>=0.10.0' } - ansi-wrap@0.1.0: resolution: { integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== } engines: { node: '>=0.10.0' } - ansi-yellow@0.1.1: - resolution: { integrity: sha512-6E3D4BQLXHLl3c/NwirWVZ+BCkMq2qsYxdeAGGOijKrx09FaqU+HktFL6QwAwNvgJiMLnv6AQ2C1gFZx0h1CBg== } - engines: { node: '>=0.10.0' } - ansicolors@0.3.2: resolution: { integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== } @@ -6026,10 +5919,6 @@ packages: aria-query@5.3.0: resolution: { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } - arr-diff@2.0.0: - resolution: { integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== } - engines: { node: '>=0.10.0' } - arr-diff@4.0.0: resolution: { integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== } engines: { node: '>=0.10.0' } @@ -6046,10 +5935,6 @@ packages: resolution: { integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw== } engines: { node: '>=0.10.0' } - arr-pluck@0.1.0: - resolution: { integrity: sha512-r+XGzphTuhTu//mwL9wIjXawJCiKkZqUDgJsUxzq+YGiYb4Gg9+GuIVorvSo7halsbEiDj5D34cquiHj7jTvgg== } - engines: { node: '>=0.10.0' } - arr-union@3.1.0: resolution: { integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== } engines: { node: '>=0.10.0' } @@ -6085,10 +5970,6 @@ packages: resolution: { integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== } engines: { node: '>=0.10.0' } - array-sort@0.1.4: - resolution: { integrity: sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ== } - engines: { node: '>=0.10.0' } - array-sort@1.0.0: resolution: { integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== } engines: { node: '>=0.10.0' } @@ -6097,10 +5978,6 @@ packages: resolution: { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } engines: { node: '>=8' } - array-unique@0.2.1: - resolution: { integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== } - engines: { node: '>=0.10.0' } - array-unique@0.3.2: resolution: { integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== } engines: { node: '>=0.10.0' } @@ -6139,10 +6016,6 @@ packages: resolution: { integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== } engines: { node: '>= 0.4' } - arrayify-compact@0.2.0: - resolution: { integrity: sha512-uCIqMaBeu+onuiFS1kB2raQYLETAAeWwAGwrZs7soA1nu4TuHfejWJMoFL06SvWHZAxmOCN7UDzcBjUZ6Y6s6Q== } - engines: { node: '>=0.10.0' } - arrify@2.0.1: resolution: { integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== } engines: { node: '>=8' } @@ -6153,30 +6026,6 @@ packages: asn1@0.2.6: resolution: { integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== } - assemble-core@0.25.0: - resolution: { integrity: sha512-5vS/XZK0ke3gIHoKTyl88brqOR9zw3niz5jJHrEgrDLlZGEri4a1Wr4badallKCx4M4/TWG12GT/O5wABZjaVA== } - engines: { node: '>=4.0' } - - assemble-fs@0.6.0: - resolution: { integrity: sha512-vp9szLsFTz0NFa7aiCBZ4JJZPsRRjLB7ftj3anSm/apE+DJ8d1s7kaVFHpxc2LCrEVIGMc1ALLyfRYJDwtzfaw== } - engines: { node: '>=0.10.0' } - - assemble-handle@0.1.4: - resolution: { integrity: sha512-7O1lbkR2fMqsGwrtGzHraLQHN0OKukPeLF/qgD7yTzFKSKg/HH2xeEN8mKutwymXRzVsUF3AvboJoOjMGiT+5g== } - engines: { node: '>=0.10.0' } - - assemble-loader@0.6.1: - resolution: { integrity: sha512-jef7ecixuK8DgP2LMJ5TO1Zs6YnltxQN8KDLDYLav+VbfK7+BGVLHv2NNrIm0/Mls2CklNmMqeWcccdSUNRUnQ== } - engines: { node: '>=0.10.0' } - - assemble-render-file@0.7.2: - resolution: { integrity: sha512-Fmt/7KDIwHr/zIStwzl1QEzeph++eP0I7G3tQch1s0ftBllEwZZ5Py7IpO1WPkP+ef8xMRjXNrNKx8/cpTgb4w== } - engines: { node: '>=0.10.0' } - - assemble-streams@0.6.0: - resolution: { integrity: sha512-JEZRYrkAQHKCT41jTVXQ63AxeYGD9aDuxRDZhZH5fsVfvLZGOHXsGPSJBEfDuC6Nz6APJGt9lwWfZH9lqmG65Q== } - engines: { node: '>=0.10.0' } - assemblyai@4.3.2: resolution: { integrity: sha512-XSrLNA8laggP2P8GswK2HlAdx/uwGQ8Y2O0IkAoOz/OsRE3zBqtcY0RPFB2vQSdVKkHVbDC/S5kcQ8Sp1ABcqA== } engines: { node: '>=18' } @@ -6189,14 +6038,6 @@ packages: resolution: { integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== } engines: { node: '>=0.8' } - assign-deep@0.4.8: - resolution: { integrity: sha512-uxqXJCnNZDEjPnsaLKVzmh/ST5+Pqoz0wi06HDfHKx1ASNpSbbvz2qW2Gl8ZyHwr5jnm11X2S5eMQaP1lMZmCg== } - engines: { node: '>=0.10.0' } - - assign-symbols@0.1.1: - resolution: { integrity: sha512-gwzH8QS/GV4pQsf6XOrlpBC6aDE8uJeZvymbEJ0W9TuDYqYOZc4RodvKDH98HCc+KFPYil1kD2XT0X0JWeOzQg== } - engines: { node: '>=0.10.0' } - assign-symbols@1.0.0: resolution: { integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== } engines: { node: '>=0.10.0' } @@ -6212,44 +6053,23 @@ packages: resolution: { integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== } engines: { node: '>=8' } - async-array-reduce@0.2.1: - resolution: { integrity: sha512-/ywTADOcaEnwiAnOEi0UB/rAcIq5bTFfCV9euv3jLYFUMmy6KvKccTQUnLlp8Ensmfj43wHSmbGiPqjsZ6RhNA== } - engines: { node: '>=0.10.0' } - - async-done@0.4.0: - resolution: { integrity: sha512-NcrnJY08hBDUa3qhZIfRALshlau6U/Q9X1WHA53t/8OfJpQz5qXPKGFVHwIY38md62TiM9JA+5tpRed5LFWrKw== } - async-done@1.3.2: resolution: { integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== } engines: { node: '>= 0.10' } - async-each-series@1.1.0: - resolution: { integrity: sha512-/VIpPVIJJlJObJiXkHBJ1RhjDtydBRG/3/dWpsXoVGOShNw5tameXnC7Yys+wpb0p/myItxGmSGgNi/dNlsIiA== } - engines: { node: '>=0.8.0' } - async-each@1.0.6: resolution: { integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== } - async-helpers@0.3.17: - resolution: { integrity: sha512-LfgCyvmK6ZiC7pyqOgli2zfkWL4HYbEb+HXvGgdmqVBgsOOtQz5rSF8Ii/H/1cNNtrfj1KsdZE/lUMeIY3Qcwg== } - engines: { node: '>=4.0.0' } - async-mutex@0.4.1: resolution: { integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== } async-retry@1.3.3: resolution: { integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== } - async-settle@0.2.1: - resolution: { integrity: sha512-3b4i8Bf/9Zw3V/EsLtMx+qj2r0mDYotjMhzXJQxjvESOe5LgevY5KaH5BHROVZWHE7TlSY2FkeTgIgDvdkRFYQ== } - async-settle@1.0.0: resolution: { integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw== } engines: { node: '>= 0.10' } - async@1.5.2: - resolution: { integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== } - async@3.2.5: resolution: { integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== } @@ -6431,10 +6251,6 @@ packages: resolution: { integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== } hasBin: true - bach@0.5.0: - resolution: { integrity: sha512-wr1KICs4sa/Ye4D38CEWkxmRi0E/1NnlcTXE4WT46993f+m+W8rVeRlQVh7O9jUHd3/cyNttv4qIDEUullFPcw== } - engines: { node: '>= 0.10' } - bach@1.2.0: resolution: { integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg== } engines: { node: '>= 0.10' } @@ -6463,98 +6279,6 @@ packages: base-64@1.0.0: resolution: { integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== } - base-argv@0.4.5: - resolution: { integrity: sha512-U78T4In2FMtSYBaf3utKCAOrOBJJXgvGLUmck71ZLQuJZBO6+DDUFoJGfuys0bX/wSQOZgB/HLLFiapvvUUFlw== } - engines: { node: '>=0.10.0' } - - base-cli-process@0.1.19: - resolution: { integrity: sha512-hH9MGqad9bZBmowsZ8uKL91rS4L+q4GEOc5SaL045jQWaR93sla0UI4Q9C6GzOD2AgVJulY2QtCMmwcBhdVYtQ== } - engines: { node: '>=4.0' } - - base-cli-schema@0.1.19: - resolution: { integrity: sha512-8k3JPZjVjdwpYtaaF3F8JT9RztX1oFDWKsAVDpUUR/uXL6b85DyTpRX4TUw3rjwZMZIf1BmiTys2zOSqC7+oAA== } - engines: { node: '>=4.0' } - - base-cli@0.5.0: - resolution: { integrity: sha512-GQnPyusKASZoCKR3JFf4iVygLvZjk6RwEQokZF35M9VHnhkoPycf22jYlWkwLEtCejtcLECgGC7fq0G/ab5k8g== } - engines: { node: '>=0.10.0' } - - base-compose@0.2.1: - resolution: { integrity: sha512-z/wx9ij4i4Bj6WbXJeJlVO2O99eErMXSWjyYUt/NAfxrGpNfMz4SWS9P0OYx9RVQ2CyMEcT1J3z5+9EqQQr8Ug== } - engines: { node: '>=4.0' } - - base-config-process@0.1.9: - resolution: { integrity: sha512-tShRbXNMml5V/qgcZ3ntWsaS6ovw1t7e4yvtYY9XzhJtNpuC8WudMwtSbG7lXAuEZ04jY1istJzKR3NzAoxo3A== } - engines: { node: '>=0.10.0' } - - base-config-schema@0.1.24: - resolution: { integrity: sha512-3CYvd28nsiNVp1rkAfVqfYo7VzDPdIxwv0Ab6iGY0K7JdGRsT6U7Jqq6BBMGNd9XLazLhVBPNGUzaDg5oUtV5w== } - engines: { node: '>=0.12.0' } - - base-config@0.5.2: - resolution: { integrity: sha512-Oq0PKM//Sh82mHQt64eUi5GZQOM8I+aNkM/P8Al4A5qwaGBkxKB+ElNqJHUVlF3WA9VjBLYUmO9asGzLEigxBw== } - engines: { node: '>=0.10.0' } - - base-cwd@0.3.4: - resolution: { integrity: sha512-/kxZE1Hg9p4tvy4DHrWyS/DelZeovOWvBZ9CZKTgeieIxMuZ47FaLIkEkcjOVFcu3nIY4TXdlxhMZFi8D2Rs9g== } - engines: { node: '>=0.10.0' } - - base-data@0.6.2: - resolution: { integrity: sha512-wH2ViG6CUO2AaeHSEt6fJTyQAk5gl0oY456DoSC5h8mnHrWUbvdctMCuF53CXgBmi0oalZQppKNH0iamG5+uqw== } - engines: { node: '>=0.10.0' } - - base-engines@0.2.1: - resolution: { integrity: sha512-s/A07Vbh6irEMNG+HpccmaGw8SUMXPBetJuYPpq7Rf1WCjtCU1L+FKyeKyRahONGNYBSIHEV0d3cqXYw35EjBw== } - engines: { node: '>=0.10.0' } - - base-env@0.3.1: - resolution: { integrity: sha512-/HxC8QV1m/bWqvjcu4WZl4Um1HRpTAjuY31uiFUEukXsXge4WIvNvGKG/gCs2PrpBFPCybowA406V/ivdPknpQ== } - engines: { node: '>=0.10.0' } - - base-generators@0.4.6: - resolution: { integrity: sha512-0k8QAoqYhOwIHQANQxwNOhtlQiuoMqv+rFu2szVIvLUNhZ8B7BOXWFRE5UXMAexRxz7H8rZIwLmeqxlYpOXJGw== } - engines: { node: '>=0.10.0' } - - base-helpers@0.1.1: - resolution: { integrity: sha512-aUdOoz47aMdM2OAkN71P3m8wjFB+pZDVfvLebDoNAsD0zhKUc68QR30q9iK6vW6S302yNNVW8bZxUF6FwFLnQw== } - engines: { node: '>=0.10.0' } - - base-namespace@0.2.0: - resolution: { integrity: sha512-jZYAnj1wkwyi6HkqATtO86D8L9jbDdqVthISLG27LcXCFkc5EV+BwS/cfaPBkWoMGb3NsVMau+PLfFle58Xi2g== } - engines: { node: '>=0.10.0' } - - base-option@0.8.4: - resolution: { integrity: sha512-CS9V8trhwEccFFjmveBHWx4Wr4rwaohzMhwZx1DSUHdGHV9Nme3jbxJQ0U8JsrLFJvGtiav35NiHLeNd8n74XA== } - engines: { node: '>=0.10.0' } - - base-pkg@0.2.5: - resolution: { integrity: sha512-/POxajlgBhVsknwLXnqnbp//bAMh7SkDgHF+z/uoYnFqk46e05c3MxSEmn5vFCB8g4rHHKxAPLKrU/4Yb3vUdA== } - engines: { node: '>=0.10.0' } - - base-plugins@0.4.13: - resolution: { integrity: sha512-w77IDOnkxERPZ7x27A8MmSFcwEfTfrcZ43zK5eOt42itA8FZT9OFhZm1XgOtTEORKrCmW8yVT6DWr/ut7wvgiQ== } - engines: { node: '>=0.10.0' } - - base-questions@0.7.4: - resolution: { integrity: sha512-uHRp5ZM2MFXUhDOPK09lroJdDe3lrXTHtg2x7pC1x4RdimVZcsX+hvQuxNqyAUN62EHfFuaK+FIFjMiA4AoiQg== } - engines: { node: '>=0.10.0' } - - base-routes@0.2.2: - resolution: { integrity: sha512-z7jtXacfUbjAKUGj5jmJP8GrhZG+UqcwnfkKjLJtUa1w1bWrq5JmsZ1SFRfomXWbLAlEcE87dHvelvTkelQBIg== } - engines: { node: '>=0.10.0' } - - base-runtimes@0.2.0: - resolution: { integrity: sha512-J98SbWB4Rpcva8w8kWtTts+Qc/X/imcmFoy9nt2fKemPTmVgvrt8DyDK5KFUDyQHt+hahYa69pJTGFfUma7V8A== } - engines: { node: '>=0.10.0' } - - base-store@0.4.4: - resolution: { integrity: sha512-fb5L2iNR9pCl85jeg88TCJYlcKg8xhmdH1Cjp1MI2RZNnMBjdIaQOuGy9Q4VjSD/GNGBWgQ2H8pQK61Xsx29OA== } - engines: { node: '>=0.10.0' } - - base-task@0.6.2: - resolution: { integrity: sha512-dxCXKPLFRrl02kJ+Lu6Y0Y2/XeaVf3GbGXMoZKuHN9OvFjz+QXRwpTJ0PciQPAvktUgK46Mc9Kwakrcj8fSTog== } - engines: { node: '>=0.10.0' } - base16@1.0.0: resolution: { integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== } @@ -6569,10 +6293,6 @@ packages: resolution: { integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== } engines: { node: '>=0.10.0' } - base@0.8.1: - resolution: { integrity: sha512-hCEtSWF9Xin1mVIrgCAwJhIJxURWOu3odjKsv+9TXofdJly0vO9Di87hnkChwi44v0+LPzHtNOjoCUYb36fBhg== } - engines: { node: '>=0.10.0' } - basic-auth@2.0.1: resolution: { integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== } engines: { node: '>= 0.8' } @@ -6665,10 +6385,6 @@ packages: brace-expansion@2.0.1: resolution: { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } - braces@1.8.5: - resolution: { integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== } - engines: { node: '>=0.10.0' } - braces@2.3.2: resolution: { integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== } engines: { node: '>=0.10.0' } @@ -6768,10 +6484,6 @@ packages: resolution: { integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== } engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - cache-base@0.8.5: - resolution: { integrity: sha512-19t0n7xdoVr5Q08+6sF85YZ9VuvbpVFq5JLm0gcsRmCvTO1Y3duTJGMaOQYf14Ras4o6dEnvoqvjdrUK1tNtgg== } - engines: { node: '>=0.10.0' } - cache-base@1.0.1: resolution: { integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== } engines: { node: '>=0.10.0' } @@ -6802,9 +6514,6 @@ packages: resolution: { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } engines: { node: '>=6' } - camel-case@3.0.0: - resolution: { integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== } - camel-case@4.1.2: resolution: { integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== } @@ -7006,10 +6715,6 @@ packages: resolution: { integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== } engines: { node: '>=10' } - cli-cursor@1.0.2: - resolution: { integrity: sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A== } - engines: { node: '>=0.10.0' } - cli-cursor@3.1.0: resolution: { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } engines: { node: '>=8' } @@ -7047,9 +6752,6 @@ packages: resolution: { integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - cli-width@1.1.1: - resolution: { integrity: sha512-eMU2akIeEIkCxGXUNmDnJq1KzOIiPnJ+rKqRe6hcxE3vIOPvpMrBYOn/Bl7zNlYJj/zQxXquAnozHUCf9Whnsg== } - cli-width@3.0.0: resolution: { integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== } engines: { node: '>= 10' } @@ -7071,16 +6773,9 @@ packages: resolution: { integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g== } engines: { node: '>= 0.10' } - clone-deep@0.2.4: - resolution: { integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== } - engines: { node: '>=0.10.0' } - clone-response@1.0.3: resolution: { integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== } - clone-stats@0.0.1: - resolution: { integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA== } - clone-stats@1.0.0: resolution: { integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag== } @@ -7148,10 +6843,6 @@ packages: resolution: { integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA== } engines: { node: '>=0.10.0' } - collection-visit@0.2.3: - resolution: { integrity: sha512-V88PJOCqJfsZS45YBELDgmhQkECokQAAr9XR4hT6eFkFsAPsCsk3EoDHSuBPYzygjquGM/0KF4vdwTiQO6lbdw== } - engines: { node: '>=0.10.0' } - collection-visit@1.0.0: resolution: { integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== } engines: { node: '>=0.10.0' } @@ -7252,11 +6943,6 @@ packages: common-ancestor-path@1.0.1: resolution: { integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== } - common-config@0.1.1: - resolution: { integrity: sha512-mDp+nqoFbYsHKZfjg8OSb0CYfdPkuoGTMCVKy4ceYHR0EACTLV/qG8Q4cih2c/0IleQ7SISiqWqLMLXXZnJ2FA== } - engines: { node: '>=0.10.0' } - hasBin: true - common-path-prefix@3.0.0: resolution: { integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== } @@ -7273,10 +6959,6 @@ packages: component-register@0.8.3: resolution: { integrity: sha512-/0u8ov0WPWi2FL78rgB9aFOcfY8pJT4jP/l9NTOukGNLVQ6hk35sEJE1RkEnNQU3yk48Qr7HlDQjRQKEVfgeWg== } - composer@0.13.0: - resolution: { integrity: sha512-8bW8vzd0YdwjBTbbHmUV3fb1jGFlczUEwti3dbdogI+r/igv2yyLqZFh9IyQv4+gK3k1kdNGVrf6Af5BY8qB3Q== } - engines: { node: '>=4.0' } - compressible@2.0.18: resolution: { integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== } engines: { node: '>= 0.6' } @@ -7307,10 +6989,6 @@ packages: console-control-strings@1.1.0: resolution: { integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== } - contains-path@0.1.0: - resolution: { integrity: sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg== } - engines: { node: '>=0.10.0' } - content-disposition@0.5.4: resolution: { integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== } engines: { node: '>= 0.6' } @@ -7343,10 +7021,6 @@ packages: copy-props@2.0.5: resolution: { integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw== } - copy-task@0.1.0: - resolution: { integrity: sha512-Idcf7BdeyJY8kSQodguY8jevkP8CuB22S9Hr5blRqwEyO75yuZEJQbzJ755Q9vZREnCQ5sfOIRxjZWbUq2+K0g== } - engines: { node: '>=0.10.0' } - core-js-compat@3.36.0: resolution: { integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== } @@ -7569,14 +7243,6 @@ packages: csstype@3.1.3: resolution: { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== } - cwd@0.10.0: - resolution: { integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== } - engines: { node: '>=0.8' } - - cwd@0.9.1: - resolution: { integrity: sha512-4+0D+ojEasdLndYX4Cqff057I/Jp6ysXpwKkdLQLnZxV8f6IYZmZtTP5uqD91a/kWqejoc0sSqK4u8wpTKCh8A== } - engines: { node: '>=0.8' } - cypress@13.13.0: resolution: { integrity: sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA== } engines: { node: ^16.0.0 || ^18.0.0 || >=20.0.0 } @@ -7639,10 +7305,6 @@ packages: resolution: { integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== } engines: { node: '>=0.10' } - data-store@0.16.1: - resolution: { integrity: sha512-tGbl4oVi9UPysie6y6+fuCjUNhaR3KxnuIRV0OMUCwq/wvikmWHXQYALbW/IVQvmxBNbrxUwjG5BWsrjx5v55w== } - engines: { node: '>=0.10.0' } - data-uri-to-buffer@6.0.2: resolution: { integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== } engines: { node: '>= 14' } @@ -7727,10 +7389,6 @@ packages: dedent@0.7.0: resolution: { integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== } - deep-bind@0.3.0: - resolution: { integrity: sha512-SwekOBPDnCT3qhOM78ARzBdPSbNMyQ63F8eZDahBzzVAoqousMhYh3HYIh2pLmhtGcVvO8/SU6B6kMsj0SXb1Q== } - engines: { node: '>=0.10.0' } - deep-equal@2.2.3: resolution: { integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== } engines: { node: '>= 0.4' } @@ -7770,10 +7428,6 @@ packages: resolution: { integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ== } engines: { node: '>= 0.10' } - defaults-deep@0.2.4: - resolution: { integrity: sha512-V6BtqzcMvn0EPOy7f+SfMhfmTawq+7UQdt9yZH0EBK89+IHo5f+Hse/qzTorAXOBrQpxpwb6cB/8OgtaMrT+Fg== } - engines: { node: '>=0.10.0' } - defaults@1.0.4: resolution: { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } @@ -7819,14 +7473,6 @@ packages: delegates@1.0.0: resolution: { integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== } - delimiter-regex@1.3.1: - resolution: { integrity: sha512-NyEdbzFCa0imbFMxQH6X5AB/DxngubpAAiQEqaam+YYcT0gGiM1gFo410HwpiPOruHl8HfFM913tFLjA8kkvHg== } - engines: { node: '>=0.10.0' } - - delimiter-regex@2.0.0: - resolution: { integrity: sha512-EtGkq9TgEZlFACc/NvgwIidQ1wkEupWWbAIJTr9gi4TJUZOvHY8TdXd3i8/dan66BufB1/V6bI7rRW/zvGoVKw== } - engines: { node: '>=0.10.0' } - denque@2.1.0: resolution: { integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== } engines: { node: '>=0.10' } @@ -8060,14 +7706,6 @@ packages: resolution: { integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== } engines: { node: '>= 4' } - empty-dir@0.2.1: - resolution: { integrity: sha512-0f1naHGJh4K6iVG28nRN7SCdfzT18OlpGzHmXw3JGwREb8qmtibHdmRgqx08u4sQfDadezK7kpU3bcIZNSwoZw== } - engines: { node: '>= 0.8.0' } - - en-route@0.7.5: - resolution: { integrity: sha512-WjnZ2HzvoztSL/NhKYmlN86tSP7VkOTN0Ck4FBJUsvTfLQOlULZak/1wcUArcdenvT9mNS3NzQ+41lqKf/gaGQ== } - engines: { node: '>=0.10.0' } - enabled@2.0.0: resolution: { integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== } @@ -8078,24 +7716,9 @@ packages: encoding@0.1.13: resolution: { integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== } - end-of-stream@0.1.5: - resolution: { integrity: sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw== } - end-of-stream@1.4.4: resolution: { integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== } - engine-base@0.1.3: - resolution: { integrity: sha512-CdNgUJcWgD9OsZ4vDFDmQB1/sN+UM0hEaDcbTZ2Ya/eMTkgCbdRLGvNuRE1UbN+AQJNo8Sm6iT327ULB7ynqnQ== } - engines: { node: '>=0.10.0' } - - engine-cache@0.19.4: - resolution: { integrity: sha512-PNhE008O6X+7VggZSVe0+fZcafIAjVHWuU+iLIbeKXGGKzjb05Y8ht0l1O9sIusrULRsNq/FcYVPoqoNz7k4wg== } - engines: { node: '>=0.10.0' } - - engine-utils@0.1.1: - resolution: { integrity: sha512-5IdkZiV3qEGS3STfaRfeQsQ93Sokg9cEK7rdfjCGZFY6O/iTdq+d0obwqjkmv4fTSbTqEgYV+J3TeSzkq9GP5A== } - engines: { node: '>=0.10.0' } - engine.io-client@6.5.3: resolution: { integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== } @@ -8107,10 +7730,6 @@ packages: resolution: { integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== } engines: { node: '>=10.2.0' } - engine@0.1.12: - resolution: { integrity: sha512-1+oxmZV5nKFhoR3QkwIbyHKSVbMuNgU8+oxcx4Af1kpxuSjDD0nL3pKKJtY1mGjAPqSAwNeDEHzD94NR5LP5rg== } - engines: { node: '>=0.10.0' } - enhanced-resolve@5.16.0: resolution: { integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== } engines: { node: '>=10.13.0' } @@ -8139,10 +7758,6 @@ packages: error-stack-parser@2.1.4: resolution: { integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== } - error-symbol@0.1.0: - resolution: { integrity: sha512-VyjaKxUmeDX/m2lxm/aknsJ1GWDWUO2Ze2Ad8S1Pb9dykAm9TjSKp5CjrNyltYqZ5W/PO6TInAmO2/BfwMyT1g== } - engines: { node: '>=0.10.0' } - error@10.4.0: resolution: { integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw== } @@ -8502,47 +8117,18 @@ packages: resolution: { integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== } engines: { node: '>=4' } - exit-hook@1.1.1: - resolution: { integrity: sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg== } - engines: { node: '>=0.10.0' } - exit@0.1.2: resolution: { integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== } engines: { node: '>= 0.8.0' } - expand-args@0.4.3: - resolution: { integrity: sha512-bAAnw/WnKZUkA9PI3tk4oWRpyZkRiHtFSJ+W8dkTX/oXGhM3rz9Vo5+qW9sJ34z1da8jPap35/igXmE7lEjdsQ== } - engines: { node: '>=0.10.0' } - - expand-brackets@0.1.5: - resolution: { integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== } - engines: { node: '>=0.10.0' } - expand-brackets@2.1.4: resolution: { integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== } engines: { node: '>=0.10.0' } - expand-object@0.4.2: - resolution: { integrity: sha512-rC0h+knI3YE2rT9v2m6HIowp1aLAVo19u02/wRzE+Dl5eyPowLRcWVyLQ3UaIjSLvjfsTiE0xGb0qqrap5ABKw== } - engines: { node: '>=0.10.0' } - hasBin: true - - expand-pkg@0.1.9: - resolution: { integrity: sha512-Qqtqzx/e8tODrDr0H8HtO7+nftN0wH9bsk3948KpKBZLrc86Cm3/8mRKJmDfNSDWWcuKsilMmFlKPhYx5gHYuA== } - engines: { node: '>= 0.10.0' } - - expand-range@1.8.2: - resolution: { integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== } - engines: { node: '>=0.10.0' } - expand-template@2.0.3: resolution: { integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== } engines: { node: '>=6' } - expand-tilde@1.2.2: - resolution: { integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== } - engines: { node: '>=0.10.0' } - expand-tilde@2.0.2: resolution: { integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== } engines: { node: '>=0.10.0' } @@ -8558,10 +8144,6 @@ packages: exponential-backoff@3.1.1: resolution: { integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== } - export-files@2.1.1: - resolution: { integrity: sha512-r2x1Zt0OKgdXRy0bXis3sOI8TNYmo5Fe71qXwsvpYaMvIlH5G0fWEf3AYiE2bONjePdSOojca7Jw+p9CQ6/6NQ== } - engines: { node: '>=0.10.0' } - expr-eval@2.0.2: resolution: { integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== } @@ -8581,10 +8163,6 @@ packages: ext@1.7.0: resolution: { integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== } - extend-shallow@1.1.4: - resolution: { integrity: sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw== } - engines: { node: '>=0.10.0' } - extend-shallow@2.0.1: resolution: { integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== } engines: { node: '>=0.10.0' } @@ -8600,10 +8178,6 @@ packages: resolution: { integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== } engines: { node: '>=4' } - extglob@0.3.2: - resolution: { integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== } - engines: { node: '>=0.10.0' } - extglob@2.0.4: resolution: { integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== } engines: { node: '>=0.10.0' } @@ -8625,10 +8199,6 @@ packages: resolution: { integrity: sha512-zD8wobJn8C6OLWo68Unho+Ih8l6nSRB2w3Amj01a+xc4bsEvd2mBDLklAn7VocA9XO3WDvQL/bLpi5flkCn/XQ== } engines: { node: '>= 14.0.0' } - falsey@0.3.2: - resolution: { integrity: sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg== } - engines: { node: '>=0.10.0' } - fancy-log@1.3.3: resolution: { integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== } engines: { node: '>= 0.10' } @@ -8712,62 +8282,30 @@ packages: resolution: { integrity: sha512-Lo6UPdMKKc9Ond7yjG2vq0mnocspOLh1oV6+XZdtfdexacvMSz5xm3WoQhTAdoR2+UqPlyMNqcqfecipoD+l/A== } engines: { node: '>=12' } - figures@1.7.0: - resolution: { integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== } - engines: { node: '>=0.10.0' } - figures@3.2.0: resolution: { integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== } engines: { node: '>=8' } - file-contents@0.2.4: - resolution: { integrity: sha512-PEz7U6YlXr+dvWCtW63DUY1LUTHOVs1rv4s1/I/39dpvvidQqMSTY6JklazQS60MMoI/ztpo5kMlpdvGagvLbA== } - engines: { node: '>=0.10.0' } - - file-contents@1.0.1: - resolution: { integrity: sha512-yR9NGsF6Ua0vUjag441JRYB+WflAoBCF3+ReeKocYzpfAjN1U4TvQEjIKXOqwIxFl9Bflg8xf/Fi2qrNBoFUOQ== } - engines: { node: '>=0.10.0' } - file-entry-cache@6.0.1: resolution: { integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== } engines: { node: ^10.12.0 || >=12.0.0 } - file-is-binary@1.0.0: - resolution: { integrity: sha512-71I2LciuolZDBUCu4JzFBKxSvVurMD84G97uCYgt9PZ7ElhEomGqYHTKKU2NcDOxR1g2bwn+hRbkTFSrD80Pfw== } - engines: { node: '>=0.10.0' } - file-loader@6.2.0: resolution: { integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== } engines: { node: '>= 10.13.0' } peerDependencies: webpack: ^4.0.0 || ^5.0.0 - file-name@0.1.0: - resolution: { integrity: sha512-Q8SskhjF4eUk/xoQkmubwLkoHwOTv6Jj/WGtOVLKkZ0vvM+LipkSXugkn1F/+mjWXU32AXLZB3qaz0arUzgtRw== } - engines: { node: '>=0.10.0' } - - file-stat@0.1.3: - resolution: { integrity: sha512-f72m4132aOd5DVtREdDX8I0Dd7Zf/3PiUYYvn4BFCxfsLqj6r8joBZzrRlfvsNvxhADw+jpEa0AnWPII9H0Fbg== } - engines: { node: '>=0.10.0' } - file-uri-to-path@1.0.0: resolution: { integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== } filelist@1.0.4: resolution: { integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== } - filename-regex@2.0.1: - resolution: { integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== } - engines: { node: '>=0.10.0' } - filesize@8.0.7: resolution: { integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== } engines: { node: '>= 0.4.0' } - fill-range@2.2.4: - resolution: { integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== } - engines: { node: '>=0.10.0' } - fill-range@4.0.0: resolution: { integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== } engines: { node: '>=0.10.0' } @@ -8788,14 +8326,6 @@ packages: resolution: { integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== } engines: { node: '>=8' } - find-file-up@0.1.3: - resolution: { integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== } - engines: { node: '>=0.10.0' } - - find-pkg@0.1.2: - resolution: { integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== } - engines: { node: '>=0.10.0' } - find-root@1.1.0: resolution: { integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== } @@ -8833,10 +8363,6 @@ packages: resolution: { integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== } engines: { node: '>= 0.10' } - first-chunk-stream@1.0.0: - resolution: { integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ== } - engines: { node: '>=0.10.0' } - first-chunk-stream@2.0.0: resolution: { integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg== } engines: { node: '>=0.10.0' } @@ -8906,18 +8432,10 @@ packages: for-each@0.3.3: resolution: { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } - for-in@0.1.8: - resolution: { integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== } - engines: { node: '>=0.10.0' } - for-in@1.0.2: resolution: { integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== } engines: { node: '>=0.10.0' } - for-own@0.1.5: - resolution: { integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== } - engines: { node: '>=0.10.0' } - for-own@1.0.0: resolution: { integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== } engines: { node: '>=0.10.0' } @@ -9013,10 +8531,6 @@ packages: fs-constants@1.0.0: resolution: { integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== } - fs-exists-sync@0.1.0: - resolution: { integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== } - engines: { node: '>=0.10.0' } - fs-extra@10.1.0: resolution: { integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== } engines: { node: '>=12' } @@ -9141,10 +8655,6 @@ packages: resolution: { integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - get-stdin@5.0.1: - resolution: { integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA== } - engines: { node: '>=0.12.0' } - get-stream@5.2.0: resolution: { integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== } engines: { node: '>=8' } @@ -9164,32 +8674,16 @@ packages: resolution: { integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== } engines: { node: '>= 14' } - get-value@1.3.1: - resolution: { integrity: sha512-TrDxHI5wqgpM5Guhoz7xmblwy7kzhDauSs4df3NP907yFmLtCkOau8YtGo087jZXKDwP22NG6fCo0UA4EFLjOw== } - engines: { node: '>=0.10.0' } - get-value@2.0.6: resolution: { integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== } engines: { node: '>=0.10.0' } - get-view@0.1.3: - resolution: { integrity: sha512-PZOmJnoY9wEDzAWW/0L6vRVfmPx/iKNiAxXdEI83dD8EPaqnI3GQraUTTSVgIVt5R1ja25/C3ARQAyVSkxN2Cg== } - engines: { node: '>=0.10.0' } - getos@3.2.1: resolution: { integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== } getpass@0.1.7: resolution: { integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== } - git-config-path@1.0.1: - resolution: { integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg== } - engines: { node: '>=0.10.0' } - - git-repo-name@0.6.0: - resolution: { integrity: sha512-DF4XxB6H+Te79JA08/QF/IjIv+j+0gF990WlgAX3SXXU2irfqvBc/xxlAIh6eJWYaKz45MrrGVBFS0Qc4bBz5g== } - engines: { node: '>=0.8' } - github-from-package@0.0.0: resolution: { integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== } @@ -9200,13 +8694,6 @@ packages: resolution: { integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ== } engines: { node: '>=10' } - glob-base@0.3.0: - resolution: { integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== } - engines: { node: '>=0.10.0' } - - glob-parent@2.0.0: - resolution: { integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== } - glob-parent@3.1.0: resolution: { integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== } @@ -9218,10 +8705,6 @@ packages: resolution: { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } engines: { node: '>=10.13.0' } - glob-stream@5.3.5: - resolution: { integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg== } - engines: { node: '>= 0.10' } - glob-stream@6.1.0: resolution: { integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw== } engines: { node: '>= 0.10' } @@ -9238,10 +8721,6 @@ packages: engines: { node: '>=16 || 14 >=14.17' } hasBin: true - glob@5.0.15: - resolution: { integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== } - deprecated: Glob versions prior to v9 are no longer supported - glob@7.1.6: resolution: { integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== } deprecated: Glob versions prior to v9 are no longer supported @@ -9259,10 +8738,6 @@ packages: resolution: { integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== } engines: { node: '>=10' } - global-modules@0.2.3: - resolution: { integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== } - engines: { node: '>=0.10.0' } - global-modules@1.0.0: resolution: { integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== } engines: { node: '>=0.10.0' } @@ -9271,10 +8746,6 @@ packages: resolution: { integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== } engines: { node: '>=6' } - global-prefix@0.1.5: - resolution: { integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== } - engines: { node: '>=0.10.0' } - global-prefix@1.0.2: resolution: { integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== } engines: { node: '>=0.10.0' } @@ -9359,17 +8830,9 @@ packages: resolution: { integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== } engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } - gray-matter@3.1.1: - resolution: { integrity: sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA== } - engines: { node: '>=0.10.0' } - groq-sdk@0.3.2: resolution: { integrity: sha512-Xp1xOea7nqUcTMndpiA8VkjZ05jM/eUUeCILxhRF+c2etBz/myQwRcUrr5lpWc0euIt96AiBMa9aYa0Iqrh13g== } - group-array@0.3.4: - resolution: { integrity: sha512-YAmNsgsi1uQ7Ai3T4FFkMoskqbLEUPRajAmrn8FclwZQQnV98NLrNWjQ3n2+i1pANxdO3n6wsNEkKq5XrYy0Ow== } - engines: { node: '>=0.10.0' } - grouped-queue@2.0.0: resolution: { integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw== } engines: { node: '>=8.0.0' } @@ -9389,18 +8852,11 @@ packages: guid-typescript@1.0.9: resolution: { integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== } - gulp-choose-files@0.1.3: - resolution: { integrity: sha512-SuAg0I2iCMEDcE3BJ46cfIo1Gn5N16403eie6G/iqrttDuKJUK1q3wh/2HBP/ZAJAqNXABI0uEavL2QxSMka1A== } - engines: { node: '>=0.10.0' } - gulp-cli@2.3.0: resolution: { integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== } engines: { node: '>= 0.10' } hasBin: true - gulp-sourcemaps@1.6.0: - resolution: { integrity: sha512-NjRy6+Qb5K1xbwOvPviD3uA4KSq2zsalPL+4vxPQPuL+kKzHjXJL10/kLaESic3LmBto8VIBHr3gIN3F9AjnhA== } - gulp@4.0.2: resolution: { integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== } engines: { node: '>= 0.10' } @@ -9435,18 +8891,6 @@ packages: resolution: { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } engines: { node: '>=8' } - has-glob@0.1.1: - resolution: { integrity: sha512-WMHzb7oCwDcMDngWy0b+viLjED8zvSi5d4/YdBetADHX/rLH+noJaRTytuyN6thTxxM7lK+FloogQHHdOOR+7g== } - engines: { node: '>=0.10.0' } - - has-glob@1.0.0: - resolution: { integrity: sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g== } - engines: { node: '>=0.10.0' } - - has-own-deep@0.1.4: - resolution: { integrity: sha512-a9Dn8Q46DZySlvZqjCX5rkwS9AYIv3VQM3IoOhTXJVJ/cEmVDMLTrJClIihLS0a09PzhrEBbueji44ZQjLh19g== } - engines: { node: '>=0.10.0' } - has-property-descriptors@1.0.2: resolution: { integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== } @@ -9531,10 +8975,6 @@ packages: resolution: { integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== } hasBin: true - helper-cache@0.7.2: - resolution: { integrity: sha512-ictXA4Nsj9HZcY5Sf4PyWKOXRkQLCDLJLvekaKKrQ+IGLMe4Z+u2oM1QqRGjtWeQRfQCA3NJyIzZpfmw6GvwOQ== } - engines: { node: '>=0.10.0' } - hey-listen@1.0.8: resolution: { integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== } @@ -9796,18 +9236,10 @@ packages: infer-owner@1.0.4: resolution: { integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== } - inflection@1.13.4: - resolution: { integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== } - engines: { '0': node >= 0.4.0 } - inflight@1.0.6: resolution: { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - info-symbol@0.1.0: - resolution: { integrity: sha512-qkc9wjLDQ+dYYZnY5uJXGNNHyZ0UOMDUnhvy0SEZGVVYmQ5s4i8cPAin2MbU6OxJgi8dfj/AnwqPx0CJE6+Lsw== } - engines: { node: '>=0.10.0' } - infobox-parser@3.6.4: resolution: { integrity: sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw== } @@ -9827,9 +9259,6 @@ packages: inline-style-parser@0.1.1: resolution: { integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== } - inquirer2@0.1.1: - resolution: { integrity: sha512-U7R6xvJmmcAx8Bq3Ok7+9L5kyBiUbCokZJMSibn+lDQasL9RtW9kYmnO5fezF0EcqE+pt4Hp3gc5XBGCqLkRDg== } - inquirer@8.2.6: resolution: { integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== } engines: { node: '>=12.0.0' } @@ -9865,10 +9294,6 @@ packages: resolution: { integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== } engines: { node: '>= 10' } - is-absolute@0.2.6: - resolution: { integrity: sha512-7Kr05z5LkcOpoMvxHN1PC11WbPabdNFmMYYo0eZvWu3BfVS0T03yoqYDczoCBx17xqk2x1XAZrcKiFVL88jxlQ== } - engines: { node: '>=0.10.0' } - is-absolute@1.0.0: resolution: { integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== } engines: { node: '>=0.10.0' } @@ -9883,10 +9308,6 @@ packages: is-alphanumerical@1.0.4: resolution: { integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== } - is-answer@0.1.1: - resolution: { integrity: sha512-ifVYWfVjXzeNx32XK7twC8xMzVYfOqFGETEuwww/Oo8OZQe/tv+huAjP+05qP8omK+IfLmPWN0omZ7YvIvejMw== } - engines: { node: '>=0.10.0' } - is-any-array@2.0.1: resolution: { integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== } @@ -9911,10 +9332,6 @@ packages: is-bigint@1.0.4: resolution: { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } - is-binary-buffer@1.0.0: - resolution: { integrity: sha512-fP08vt1YuBWSWdDCWkHUDo/Gb+YpnsiK41w2kP3iAkWhMKV4uuAAwPQm9GkA4r+OCDzpa+APIOaHZW6d83e5Ug== } - engines: { node: '>=4' } - is-binary-path@1.0.1: resolution: { integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== } engines: { node: '>=0.10.0' } @@ -9969,14 +9386,6 @@ packages: engines: { node: '>=8' } hasBin: true - is-dotfile@1.0.3: - resolution: { integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== } - engines: { node: '>=0.10.0' } - - is-equal-shallow@0.1.3: - resolution: { integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== } - engines: { node: '>=0.10.0' } - is-extendable@0.1.1: resolution: { integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== } engines: { node: '>=0.10.0' } @@ -9985,10 +9394,6 @@ packages: resolution: { integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== } engines: { node: '>=0.10.0' } - is-extglob@1.0.0: - resolution: { integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== } - engines: { node: '>=0.10.0' } - is-extglob@2.1.1: resolution: { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } engines: { node: '>=0.10.0' } @@ -10020,13 +9425,6 @@ packages: resolution: { integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== } engines: { node: '>= 0.4' } - is-generator@1.0.3: - resolution: { integrity: sha512-G56jBpbJeg7ds83HW1LuShNs8J73Fv3CPz/bmROHOHlnKkN8sWb9ujiagjmxxMUywftgq48HlBZELKKqFLk0oA== } - - is-glob@2.0.1: - resolution: { integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== } - engines: { node: '>=0.10.0' } - is-glob@3.1.0: resolution: { integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== } engines: { node: '>=0.10.0' } @@ -10068,10 +9466,6 @@ packages: resolution: { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== } engines: { node: '>= 0.4' } - is-number@2.1.0: - resolution: { integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== } - engines: { node: '>=0.10.0' } - is-number@3.0.0: resolution: { integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== } engines: { node: '>=0.10.0' } @@ -10116,17 +9510,9 @@ packages: resolution: { integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== } engines: { node: '>=0.10.0' } - is-posix-bracket@0.1.1: - resolution: { integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== } - engines: { node: '>=0.10.0' } - is-potential-custom-element-name@1.0.1: resolution: { integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== } - is-primitive@2.0.0: - resolution: { integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== } - engines: { node: '>=0.10.0' } - is-property@1.0.2: resolution: { integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== } @@ -10141,14 +9527,6 @@ packages: resolution: { integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== } engines: { node: '>=0.10.0' } - is-registered@0.1.5: - resolution: { integrity: sha512-dOOjAYNmKGtjoW229wn/SDmrO65oQcUvng9WUYF/AIZAQZG/l+puNUPt+/x7YCn4W9A33H6LItHgSETDmS0urg== } - engines: { node: '>=0.10.0' } - - is-relative@0.2.1: - resolution: { integrity: sha512-9AMzjRmLqcue629b4ezEVSK6kJsYJlUIhMcygmYORUgwUNJiavHcC3HkaGx0XYpyVKQSOqFbMEZmW42cY87sYw== } - engines: { node: '>=0.10.0' } - is-relative@1.0.0: resolution: { integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== } engines: { node: '>=0.10.0' } @@ -10173,10 +9551,6 @@ packages: resolution: { integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== } engines: { node: '>= 0.4' } - is-stream@1.1.0: - resolution: { integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== } - engines: { node: '>=0.10.0' } - is-stream@2.0.1: resolution: { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } engines: { node: '>=8' } @@ -10200,10 +9574,6 @@ packages: is-typedarray@1.0.0: resolution: { integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== } - is-unc-path@0.1.2: - resolution: { integrity: sha512-HhLc5VDMH4pu3oMtIuunz/DFQUIoR561kMME3U3Afhj8b7vH085vkIkemrz1kLXCEIuoMAmO3yVmafWdSbGW8w== } - engines: { node: '>=0.10.0' } - is-unc-path@1.0.0: resolution: { integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== } engines: { node: '>=0.10.0' } @@ -10215,38 +9585,10 @@ packages: is-utf8@0.2.1: resolution: { integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== } - is-valid-app@0.1.2: - resolution: { integrity: sha512-UKIjincKieawS6pPJjpH76qUmblicLSi0pqGCvFdscOM3pWgnrRBtB/iWIRYXKNCW8qjxb+6k12wFd82Kq94CA== } - engines: { node: '>=0.10.0' } - - is-valid-app@0.2.1: - resolution: { integrity: sha512-2/qNSVFKyi5WiaIgv153Vt2ZM7T7HSlUu/m3HMnoyp6pk5NYhOUz0aU7Gx2DGYRnZ/8q+pMOwd93pCE8uWhvBg== } - engines: { node: '>=0.10.0' } - - is-valid-app@0.3.0: - resolution: { integrity: sha512-6+PklNvJraE3XpoqWurkrPIqFIeJin5kwX+sJjcwhPcFY7TM0wjbJlPIBCvHtGawIfb4WtS1t22s7TdgQ0S+Xg== } - engines: { node: '>=0.10.0' } - - is-valid-glob@0.3.0: - resolution: { integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ== } - engines: { node: '>=0.10.0' } - is-valid-glob@1.0.0: resolution: { integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA== } engines: { node: '>=0.10.0' } - is-valid-instance@0.1.0: - resolution: { integrity: sha512-js5DRu650+u3zcGfCe23npdFtPuBeLx3iR8q2vfCO4m1KqNz5R35fDQlLPm++gAzg5H+OJXDOG5LGyn8pzl/1Q== } - engines: { node: '>=0.10.0' } - - is-valid-instance@0.2.0: - resolution: { integrity: sha512-dNT7bamkigo07gvbnoBRABSNX1ayAhkcw6/3fYhVDhiPXiqnCouD4JMmrozyOx37UUlC+Se1j/jCfLo1fNs0Ng== } - engines: { node: '>=0.10.0' } - - is-valid-instance@0.3.0: - resolution: { integrity: sha512-XEd0ddnORLW/Qf1+VMh7PnYb6XhWs0zK0C/Kh8muwj26IjdlCTlo7QQIjt8+efkE8RqtyzlqYNZE5SfN8ys9hQ== } - engines: { node: '>=0.10.0' } - is-weakmap@2.0.2: resolution: { integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== } engines: { node: '>= 0.4' } @@ -10258,14 +9600,6 @@ packages: resolution: { integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== } engines: { node: '>= 0.4' } - is-whitespace@0.3.0: - resolution: { integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== } - engines: { node: '>=0.10.0' } - - is-windows@0.2.0: - resolution: { integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== } - engines: { node: '>=0.10.0' } - is-windows@1.0.2: resolution: { integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== } engines: { node: '>=0.10.0' } @@ -10274,9 +9608,6 @@ packages: resolution: { integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== } engines: { node: '>=8' } - isarray@0.0.1: - resolution: { integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== } - isarray@1.0.0: resolution: { integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== } @@ -10294,10 +9625,6 @@ packages: isexe@2.0.0: resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } - isobject@1.0.2: - resolution: { integrity: sha512-WQQgFoML/sLgmhu9zTekYHZUJaPoa/fpVMQ8oxIuOvppzs70DxxyHZdAIjwcuuNDOVtNYsahhqtBbUvKwhRcGw== } - engines: { node: '>=0.10.0' } - isobject@2.1.0: resolution: { integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== } engines: { node: '>=0.10.0' } @@ -10732,14 +10059,6 @@ packages: resolution: { integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ== } hasBin: true - kind-of@1.1.0: - resolution: { integrity: sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g== } - engines: { node: '>=0.10.0' } - - kind-of@2.0.1: - resolution: { integrity: sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== } - engines: { node: '>=0.10.0' } - kind-of@3.2.2: resolution: { integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== } engines: { node: '>=0.10.0' } @@ -11183,26 +10502,10 @@ packages: launch-editor@2.6.1: resolution: { integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== } - layouts@0.11.0: - resolution: { integrity: sha512-Zt65tua9otUMsfoQMAKmUSMGBwgkchSCc33ko/xBBSGnc/Q4+G8gJgouynZy7/iSnzpt3+myRRDQ9HQ5cctSog== } - engines: { node: '>=0.10.0' } - lazy-ass@1.6.0: resolution: { integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== } engines: { node: '> 0.8' } - lazy-cache@0.2.7: - resolution: { integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== } - engines: { node: '>=0.10.0' } - - lazy-cache@1.0.4: - resolution: { integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== } - engines: { node: '>=0.10.0' } - - lazy-cache@2.0.2: - resolution: { integrity: sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA== } - engines: { node: '>=0.10.0' } - lazystream@1.0.1: resolution: { integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== } engines: { node: '>= 0.6.3' } @@ -11283,26 +10586,10 @@ packages: llm-cost@1.0.4: resolution: { integrity: sha512-2VQOroPSjyijGUkA8id61srReJXDJzftfOerly4HUIRNbYrPPt+4eqOIM1wL3vTOrIp7z//xevyoK/TsTH2fhQ== } - load-helpers@0.2.11: - resolution: { integrity: sha512-+iUnxQSddtpXoeRrza02jbJOUgCbJGG6GGeE4WTf6nV0Z0uR+/+/h2RMfDAl5SI4Cd/fu5xFPqo0ibP3v9y1ew== } - engines: { node: '>=0.10.0' } - load-json-file@1.1.0: resolution: { integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== } engines: { node: '>=0.10.0' } - load-pkg@3.0.1: - resolution: { integrity: sha512-wW6PBOWKbPceeIamjHjoacmI0F7Q+JdHoYl1nYE3lGOQCmq+xAnfIp24dqhUSfsO6Y7YSlrmyi3JxvSiRnoivg== } - engines: { node: '>=0.10.0' } - - load-templates@0.11.4: - resolution: { integrity: sha512-roLgv19smhcE2x9mBvuuUzj3u3jRL+lWr+7u6v0KSk2wtdX0v8KOEHYZGBUdMjY1YPIh9864YQdO0SqpxiA+6Q== } - engines: { node: '>=0.10.0' } - - load-templates@1.0.2: - resolution: { integrity: sha512-UUfhwRTBH9V4Uf0gGX7FqU5RUdi9IvJWrY1AaPRCRkV/LE/cbudUtY0+YXZs1fNp1J4PFlwOMyrtfzSOCtBbJA== } - engines: { node: '>=0.10.0' } - load-yaml-file@0.2.0: resolution: { integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== } engines: { node: '>=6' } @@ -11337,51 +10624,9 @@ packages: lodash-es@4.17.21: resolution: { integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== } - lodash._arrayfilter@3.0.0: - resolution: { integrity: sha512-xi4jscMHMkWtF8vXNpmvAXTmes6gKMpXsWM8kKuJ5tfk/VhJujrAG2sVc/LBsUERkReV9blMG2GD4SjPHyqaTw== } - - lodash._basecallback@3.3.1: - resolution: { integrity: sha512-LQffghuO63ufDY33KKO1ezGKbcFZK3ngYV7JpxaUomoM5acf0YeXU3Pm8csVE0girVs50TXzfNibl69Co3ggJA== } - - lodash._baseeach@3.0.4: - resolution: { integrity: sha512-IqUZ9MQo2UT1XPGuBntInqTOlc+oV+bCo0kMp+yuKGsfvRSNgUW0YjWVZUrG/gs+8z/Eyuc0jkJjOBESt9BXxg== } - - lodash._basefilter@3.0.0: - resolution: { integrity: sha512-EjWjqBE5KHmvrzgZ9tSvt7ggGmDF0pjPzaiUONQ97M4+YDYW8VMH3VnyKS/JHFoqDAYEIIx+3/Tg4C0zlC6qPA== } - - lodash._baseisequal@3.0.7: - resolution: { integrity: sha512-U+3GsNEZj9ebI03ncLC2pLmYVjgtYZEwdkAPO7UGgtGvAz36JVFPAQUufpSaVL93Cz5arc6JGRKZRhaOhyVJYA== } - - lodash._baseismatch@3.1.3: - resolution: { integrity: sha512-lq0Z+O/HfAJ16frtiZnvi2sLQrFfcYxK2q5R+n10+cWbXQ/Mz6R52mLOX/8R3npLGIO7Rq7zNP7ENTCJB/GN+g== } - - lodash._basematches@3.2.0: - resolution: { integrity: sha512-E6aibw9mFnfTO8z4zu1Fc2Pgv102/c11RtunY0MBdnIRWy27CtwnTVBQjfXohtUoDH1BI+vxZ9+b2JJY13dt3A== } - - lodash._bindcallback@3.0.1: - resolution: { integrity: sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ== } - - lodash._createwrapper@3.2.0: - resolution: { integrity: sha512-O8fi7P57KZQjtTJN3tbUAJsm6Coo35JVi4OiEU/WV0rrqaWemk+rRB/1ohiIiv1cIK3dIkVhMehaFOFyNZDYkQ== } - - lodash._getnative@3.9.1: - resolution: { integrity: sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA== } - lodash._reinterpolate@3.0.0: resolution: { integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== } - lodash._replaceholders@3.0.0: - resolution: { integrity: sha512-FbnZp+6+UaT8VzGNXUK8nIH7rC/P+c2te5R/rpjgwLY27OsEMqCyF6yOxqHMj9Qv3yelSVVuYzCjtrJzcKbAhg== } - - lodash._root@3.0.1: - resolution: { integrity: sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ== } - - lodash.assign@4.2.0: - resolution: { integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== } - - lodash.bind@3.1.0: - resolution: { integrity: sha512-GaXlyWuJbyuJ54vRypYLVq1NS4v7QIBVicEX4lmW8PE5XaltCuFzWLG4WuXKYQ7SKfzxkiEsadQyuVOxym7paQ== } - lodash.camelcase@4.3.0: resolution: { integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== } @@ -11394,48 +10639,21 @@ packages: lodash.defaults@4.2.0: resolution: { integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== } - lodash.filter@4.6.0: - resolution: { integrity: sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ== } - - lodash.flatten@4.4.0: - resolution: { integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== } - lodash.flow@3.5.0: resolution: { integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== } - lodash.foreach@4.5.0: - resolution: { integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ== } - lodash.get@4.4.2: resolution: { integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== } - lodash.initial@4.1.1: - resolution: { integrity: sha512-/eZXy8y0IGQTuCKScq32mU+O/Qc160EfYPrAD7y4oXPAgWdQvyxxhTOIpl+tDfP86yT7jrMtUA8noSqYUdKWQg== } - lodash.isarguments@3.1.0: resolution: { integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== } - lodash.isarray@3.0.4: - resolution: { integrity: sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ== } - lodash.isequal@4.5.0: resolution: { integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== } lodash.isplainobject@4.0.6: resolution: { integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== } - lodash.istypedarray@3.0.6: - resolution: { integrity: sha512-lGWJ6N8AA3KSv+ZZxlTdn4f6A7kMfpJboeyvbFdE7IU9YAgweODqmOgdUHOA+c6lVWeVLysdaxciFXi+foVsWw== } - - lodash.keys@3.1.2: - resolution: { integrity: sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ== } - - lodash.last@3.0.0: - resolution: { integrity: sha512-14mq7rSkCxG4XMy9lF2FbIOqqgF0aH0NfPuQ3LPR3vIh0kHnUvIYP70dqa1Hf47zyXfQ8FzAg0MYOQeSuE1R7A== } - - lodash.map@4.6.0: - resolution: { integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== } - lodash.memoize@4.1.2: resolution: { integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== } @@ -11448,12 +10666,6 @@ packages: lodash.once@4.1.1: resolution: { integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== } - lodash.pairs@3.0.1: - resolution: { integrity: sha512-lgXvpU43ZNQrZ/pK2cR97YzKeAno3e3HhcyvLKsofljeHKrQcZhT1vW7fg4X61c92tM+mjD/DypoLZYuAKNIkQ== } - - lodash.restparam@3.6.1: - resolution: { integrity: sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw== } - lodash.sortby@4.7.0: resolution: { integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== } @@ -11466,16 +10678,9 @@ packages: lodash.uniq@4.5.0: resolution: { integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== } - lodash.where@3.1.0: - resolution: { integrity: sha512-9iH6No94IEtewjRRAykRVVW4Sw0DULKFp9H7x92MvbYUjg5EHj/+o58/Jx/kxAu7UWJLItwBH4FemHaQIGFIeg== } - lodash@4.17.21: resolution: { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } - log-ok@0.1.1: - resolution: { integrity: sha512-cc8VrkS6C+9TFuYAwuHpshrcrGRAv7d0tUJ0GdM72ZBlKXtlgjUZF84O+OhQUdiVHoF7U/nVxwpjOdwUJ8d3Vg== } - engines: { node: '>=0.10.0' } - log-symbols@4.1.0: resolution: { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== } engines: { node: '>=10' } @@ -11488,14 +10693,6 @@ packages: resolution: { integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - log-utils@0.1.5: - resolution: { integrity: sha512-5jLIj9RWWYxQbBhHDvNZTZE3J/oSTbw/fuPmsXJg8/vbY/4XiJ4YAiEPrwo3dLbcB/n9k1qTznOVr6IigiaF7A== } - engines: { node: '>=0.10.0' } - - log-utils@0.2.1: - resolution: { integrity: sha512-udyegKoMz9eGfpKAX//Khy7sVAZ8b1F7oLDnepZv/1/y8xTvsyPgqQrM94eG8V0vcc2BieYI2kVW4+aa6m+8Qw== } - engines: { node: '>=0.10.0' } - logform@2.6.0: resolution: { integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== } engines: { node: '>= 12.0.0' } @@ -11509,10 +10706,6 @@ packages: longest-streak@3.1.0: resolution: { integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== } - longest@1.0.1: - resolution: { integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== } - engines: { node: '>=0.10.0' } - loose-envify@1.4.0: resolution: { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } hasBin: true @@ -11520,9 +10713,6 @@ packages: lop@0.4.1: resolution: { integrity: sha512-9xyho9why2A2tzm5aIcMWKvzqKsnxrf9B5I+8O30olh6lQU8PH978LqZoI4++37RBgS1Em5i54v1TFs/3wnmXQ== } - lower-case@1.1.4: - resolution: { integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== } - lower-case@2.0.2: resolution: { integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== } @@ -11562,8 +10752,8 @@ packages: resolution: { integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== } engines: { node: 14 || >=16.14 } - lunary@0.6.16: - resolution: { integrity: sha512-LVuABIuZxtxN55zLdRQjXG01S0wQ8U2Psd0/7z+wxK3L2tx6jFk3XIGsRXjXEgcwMAI7KQDrkoGIwtsHmhRcDQ== } + lunary@0.7.10: + resolution: { integrity: sha512-sH0NKjPuTf+HN/yxr1aMJ0n5pKIiaTq13bGm2ccc9AA7Je8tQ3lXIwzMCZBfkvvhH4bad5H3eT/eG8Qbz4HBpQ== } peerDependencies: openai: 4.51.0 react: '>=17.0.0' @@ -11590,10 +10780,6 @@ packages: magic-string@0.30.10: resolution: { integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== } - magic-string@0.30.8: - resolution: { integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== } - engines: { node: '>=12' } - make-dir@3.1.0: resolution: { integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== } engines: { node: '>=8' } @@ -11638,21 +10824,9 @@ packages: resolution: { integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== } engines: { node: '>=0.10.0' } - map-config@0.5.0: - resolution: { integrity: sha512-7pgduXtyOXZ/py4n6IM8G+7wanqbRDPK5Myp7P3jUUAFQwzGDeuMm0N8Dxrwaf3bySqJpne4NdglRUxdw7I7QQ== } - engines: { node: '>=0.10.0' } - - map-schema@0.2.4: - resolution: { integrity: sha512-1sgduImleUF+8NiS1wlqDJ8uhmJtFbLRjVW3PZP5IZJd1n+11eV91AnHI4jOYT2UCirriivNUgh6DG73V+G9QQ== } - engines: { node: '>=0.10.0' } - map-stream@0.1.0: resolution: { integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== } - map-visit@0.1.5: - resolution: { integrity: sha512-zdmJBFvvVR/H5wCfsCP7XxSLp+346yAZ30Wy2OsQLcH19OVGMWa3Ms9quO00lj9ybsySu3gKOINNgICb4Zqauw== } - engines: { node: '>=0.10.0' } - map-visit@1.0.0: resolution: { integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== } engines: { node: '>=0.10.0' } @@ -11663,28 +10837,13 @@ packages: markdown-table@3.0.3: resolution: { integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== } - match-file@0.2.2: - resolution: { integrity: sha512-BDEZIcrBSnooL0zC72Yt3z1HhJiCq+2pMnHKVDeYN/cilCrz3KrpqKPm4ZOfWCoDolRl4QyKQpfRlQWF6PqnjQ== } - engines: { node: '>=0.10.0' } - matchdep@2.0.0: resolution: { integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA== } engines: { node: '>= 0.10.0' } - matched@0.4.4: - resolution: { integrity: sha512-zpasnbB5vQkvb0nfcKV0zEoGgMtV7atlWR1Vk3E8tEKh6EicMseKtVV+5vc+zsZwvDlcNMKlKK/CVOEeAalYRQ== } - engines: { node: '>= 0.12.0' } - - matched@1.0.2: - resolution: { integrity: sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q== } - engines: { node: '>= 0.12.0' } - material-colors@1.2.6: resolution: { integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== } - math-random@1.0.4: - resolution: { integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== } - mathjax-full@3.2.2: resolution: { integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w== } @@ -11784,26 +10943,12 @@ packages: memory-stream@1.0.0: resolution: { integrity: sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww== } - merge-deep@3.0.3: - resolution: { integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== } - engines: { node: '>=0.10.0' } - merge-descriptors@1.0.1: resolution: { integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== } - merge-stream@0.1.8: - resolution: { integrity: sha512-ivGsLZth/AkvevAzPlRLSie8Q3GdyH/5xUYgn+ItAJYslT0NsKd2cxx0bAjmqoY5swX0NoWJjvkDkfpaVZx9lw== } - - merge-stream@1.0.1: - resolution: { integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA== } - merge-stream@2.0.0: resolution: { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } - merge-value@1.0.0: - resolution: { integrity: sha512-fJMmvat4NeKz63Uv9iHWcPDjCWcCkoiRoajRTEO8hlhUC6rwaHg0QCF9hBOTjZmm4JuglPckPSTtcuJL5kp0TQ== } - engines: { node: '>=0.10.0' } - merge2@1.4.1: resolution: { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } engines: { node: '>= 8' } @@ -11920,10 +11065,6 @@ packages: micromark@3.2.0: resolution: { integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== } - micromatch@2.3.11: - resolution: { integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== } - engines: { node: '>=0.10.0' } - micromatch@3.1.10: resolution: { integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== } engines: { node: '>=0.10.0' } @@ -12054,10 +11195,6 @@ packages: resolution: { integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== } engines: { node: '>=0.10.0' } - mixin-object@2.0.1: - resolution: { integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== } - engines: { node: '>=0.10.0' } - mj-context-menu@0.6.1: resolution: { integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== } @@ -12196,9 +11333,6 @@ packages: resolution: { integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== } engines: { node: '>= 0.10' } - mute-stream@0.0.5: - resolution: { integrity: sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg== } - mute-stream@0.0.8: resolution: { integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== } @@ -12238,10 +11372,6 @@ packages: resolution: { integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== } engines: { node: '>=0.10.0' } - nanoseconds@0.1.0: - resolution: { integrity: sha512-6yOHqTvJNI9xGmVHWQ4ZTYhGpT0O4h9N+uk/UuRVPI8TskViB4s4QL3y+jY/Yxsdz7gvoBGPCHWRUibOyyYMwA== } - engines: { node: '>=0.10.0' } - napi-build-utils@1.0.2: resolution: { integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== } @@ -12265,15 +11395,9 @@ packages: resolution: { integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== } engines: { node: '>= 0.4.0' } - next-tick@0.2.2: - resolution: { integrity: sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q== } - next-tick@1.1.0: resolution: { integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== } - no-case@2.3.2: - resolution: { integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== } - no-case@3.0.4: resolution: { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== } @@ -12346,10 +11470,6 @@ packages: engines: { node: '>=8.10.0' } hasBin: true - noncharacters@1.1.0: - resolution: { integrity: sha512-U69XzMNq7UQXR27xT17tkQsHPsLc+5W9yfXvYzVCwFxghVf+7VttxFnCKFMxM/cHD+/QIyU009263hxIIurj4g== } - engines: { node: '>=0.10.0' } - nopt@1.0.10: resolution: { integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== } hasBin: true @@ -12383,11 +11503,6 @@ packages: resolution: { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } engines: { node: '>=0.10.0' } - normalize-pkg@0.3.20: - resolution: { integrity: sha512-kM3ee93xDLnhu7R1j2BpJ+0zenlOB5ZE6H+vt2iCNXdGgcxedzweZn6UeW5p2iJEdkNYaXDoJm8uoSLiXF4eBw== } - engines: { node: '>= 0.10.0' } - hasBin: true - normalize-range@0.1.2: resolution: { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== } engines: { node: '>=0.10.0' } @@ -12417,10 +11532,6 @@ packages: '@emotion/styled': optional: true - now-and-later@0.0.6: - resolution: { integrity: sha512-qNIeNeH6v6KbriliCoOEmKhelv+66P2yCKEQta3MYcwN98S3NrVMgYEh9hWxJRPqPna3d7r0KElZQKQkAm0/jA== } - engines: { node: '>= 0.10' } - now-and-later@2.0.1: resolution: { integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== } engines: { node: '>= 0.10' } @@ -12546,10 +11657,6 @@ packages: resolution: { integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== } engines: { node: '>= 10' } - object-visit@0.3.4: - resolution: { integrity: sha512-6QNyX7uTuwqxP7pmDBqgBDKdmZws1rXriUyXM5KG6+7J0aYRuuAGoc636IGdLzgOL77WUwL+EpoTJrEHwWsyOA== } - engines: { node: '>=0.10.0' } - object-visit@1.0.1: resolution: { integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== } engines: { node: '>=0.10.0' } @@ -12584,10 +11691,6 @@ packages: resolution: { integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w== } engines: { node: '>=0.10.0' } - object.omit@2.0.1: - resolution: { integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== } - engines: { node: '>=0.10.0' } - object.pick@1.3.0: resolution: { integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== } engines: { node: '>=0.10.0' } @@ -12614,14 +11717,6 @@ packages: ollama@0.5.6: resolution: { integrity: sha512-4BySAMt96+OCt4emL6DE78UBCGqC7GvteM9LRCd6WwJyefn0x9w2BrcUcLm9nJ9bYpRsmkhf0Au18Q5MhsA14w== } - omit-empty@0.3.6: - resolution: { integrity: sha512-P5zl3TYREgcRAjjyj9kYHNhVtOOXMlCyYh/KNm53oUZNKpGOBbS0WLdRcThDPWbuFleXlbCd1KTBRZD86nj3RA== } - engines: { node: '>=0.10.0' } - - omit-empty@0.4.1: - resolution: { integrity: sha512-NwnVOAaLwUEYmvvwLKKqvG6BkSG0pu0yKhKc6uYbWerkIXe6Wi2HQ1qoL+Wksj3DCauRuNKIjZUsLyjLj1/lrw== } - engines: { node: '>=0.10.0' } - on-finished@2.4.1: resolution: { integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== } engines: { node: '>= 0.8' } @@ -12630,19 +11725,12 @@ packages: resolution: { integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== } engines: { node: '>= 0.8' } - once@1.3.3: - resolution: { integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w== } - once@1.4.0: resolution: { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } one-time@1.0.0: resolution: { integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== } - onetime@1.1.0: - resolution: { integrity: sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A== } - engines: { node: '>=0.10.0' } - onetime@5.1.2: resolution: { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } engines: { node: '>=6' } @@ -12679,10 +11767,6 @@ packages: resolution: { integrity: sha512-smLZPck4OkKMNExcw8jMgrMOGgVGx2N/s6DbKL2ftNl77g5HfoGpZGFy79RBzU/EkaO0OZpwBnslfdBfh7ZcWg== } engines: { node: '>= 12.0.0', npm: '>= 7.0.0' } - option-cache@3.5.0: - resolution: { integrity: sha512-Hr14410H8ajAHeUirXZtuE9drwy8e85l0CssHB/k7Y6nRkleKsGAzB/gwltUzsnIqr9Y+7ZQ+H16GYWAJH3PVg== } - engines: { node: '>=0.10.0' } - option@0.2.4: resolution: { integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== } @@ -12698,9 +11782,6 @@ packages: resolution: { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== } engines: { node: '>=10' } - ordered-read-streams@0.3.0: - resolution: { integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw== } - ordered-read-streams@1.0.1: resolution: { integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw== } @@ -12796,14 +11877,6 @@ packages: engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } hasBin: true - pad-right@0.2.2: - resolution: { integrity: sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g== } - engines: { node: '>=0.10.0' } - - paginationator@0.1.4: - resolution: { integrity: sha512-o46P8Z9DK0blcmY7F95SnsBWZ6bow3HAcLKXlgIc/SZE8og21qrxL14nAi6Wy8E0Iw06wA0yS5icSayXw8BU8A== } - engines: { node: '>=0.10.0' } - pako@1.0.11: resolution: { integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== } @@ -12817,10 +11890,6 @@ packages: resolution: { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } engines: { node: '>=6' } - parse-author@1.0.0: - resolution: { integrity: sha512-OrNKo0jTFjJNCT0UKOPtnUctvGJvKdfB5ild+r3xwg/TgU5k2CCZW4fU9uJdKJ3njVFw5InP/2gd+n2vEXKgLQ== } - engines: { node: '>=0.10.0' } - parse-conflict-json@2.0.2: resolution: { integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA== } engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } @@ -12835,18 +11904,6 @@ packages: resolution: { integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== } engines: { node: '>=0.8' } - parse-git-config@1.1.1: - resolution: { integrity: sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ== } - engines: { node: '>=0.10.0' } - - parse-github-url@0.3.2: - resolution: { integrity: sha512-vawkgsrRR8wm/nqFTVQIl9G/VkRJK2VVo0ECPni20WRV+NOmHXGilnWwC/EjVqRqQ4oSIKwRKP1jW8CjlxlJ2Q== } - engines: { node: '>=0.10.0' } - - parse-glob@3.0.4: - resolution: { integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== } - engines: { node: '>=0.10.0' } - parse-json@2.2.0: resolution: { integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== } engines: { node: '>=0.10.0' } @@ -12888,10 +11945,6 @@ packages: parseley@0.12.1: resolution: { integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== } - parser-front-matter@1.6.4: - resolution: { integrity: sha512-eqtUnI5+COkf1CQOYo8FmykN5Zs+5Yr60f/7GcPgQDZEEjdE/VZ4WMaMo9g37foof8h64t/TH2Uvk2Sq0fDy/g== } - engines: { node: '>=0.10.0' } - parseurl@1.3.3: resolution: { integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== } engines: { node: '>= 0.8' } @@ -12958,9 +12011,6 @@ packages: path-to-regexp@0.1.7: resolution: { integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== } - path-to-regexp@1.8.0: - resolution: { integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== } - path-type@1.1.0: resolution: { integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== } engines: { node: '>=0.10.0' } @@ -13121,10 +12171,6 @@ packages: resolution: { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } engines: { node: '>=8' } - pkg-store@0.2.2: - resolution: { integrity: sha512-1JZVLbIRN6Dgsfk918EMZyL/T4NvJduSaT7n6ssHO3FV1FCrg6zjHJmuj3+Fb/Y5nBe3IBDoMYsY6Jf2IoRH0A== } - engines: { node: '>=0.10.0' } - pkg-up@3.1.0: resolution: { integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== } engines: { node: '>=8' } @@ -13642,10 +12688,6 @@ packages: resolution: { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } engines: { node: '>= 0.8.0' } - preserve@0.2.0: - resolution: { integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== } - engines: { node: '>=0.10.0' } - prettier-linter-helpers@1.0.0: resolution: { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } engines: { node: '>=6.0.0' } @@ -13694,10 +12736,6 @@ packages: peerDependencies: prettier: ^2.0.0 - pretty-time@0.2.0: - resolution: { integrity: sha512-BwYVCPtnSq3nIGDK2rgwZTN2ClhBQmnG8pudrXIfGBwuMutIBj/W7wm/jz1WCHl/Kk2Q5i1Am1uD2Q74oPyBCw== } - engines: { node: '>=0.10.0' } - prism-react-renderer@1.3.5: resolution: { integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== } peerDependencies: @@ -13736,11 +12774,6 @@ packages: resolution: { integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== } engines: { node: '>=0.4.0' } - project-name@0.2.6: - resolution: { integrity: sha512-ZOxqunIi7fnAX+E0tE+FLHv2pSEa7IgEbnVG2s4wPxWL+p2cUk9KRDZV4lNkpfyrVR6rfOUBxIbctbJDo/qOTA== } - engines: { node: '>=0.10.0' } - hasBin: true - promise-all-reject-late@1.0.1: resolution: { integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== } @@ -13901,18 +12934,6 @@ packages: querystringify@2.2.0: resolution: { integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== } - question-cache@0.4.0: - resolution: { integrity: sha512-QgX1mI/ZNBbG8M5gYfZQG/qxZRggP2Fk+WOqE/FKylmNwi5aWy6o1JSaojYrHT5JUtRdyG+wwVJSlTfW7UBmog== } - engines: { node: '>=0.10.0' } - - question-cache@0.5.1: - resolution: { integrity: sha512-v9F1LnlSQIUEAGFtrfVX/76lH4u4zyV34t94o6EkguPTKKfbvV6SLH8h3pn7LXGZLmAgD1PbmVOuKMY8ZWnuPg== } - engines: { node: '>=0.10.0' } - - question-store@0.11.1: - resolution: { integrity: sha512-rvyFpqLYQCO7FOnX+3qZ7b8K7omWkn9MWyj/7dknf7BaGZHo//fzBS2/0atmcvZfjT2mu1q64oiZIrsB7OqqGg== } - engines: { node: '>=0.10.0' } - queue-microtask@1.2.3: resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } @@ -13929,10 +12950,6 @@ packages: rake-modified@1.0.8: resolution: { integrity: sha512-rj/1t+EyI8Ly52eaCeSy5hoNpdNnDlNQ/+jll2DypR6nkuxotMbaupzwbuMSaXzuSL1I2pYVYy7oPus/Ls49ag== } - randomatic@3.1.1: - resolution: { integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== } - engines: { node: '>= 0.10.0' } - randombytes@2.1.0: resolution: { integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== } @@ -14166,10 +13183,6 @@ packages: resolution: { integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== } engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - read-file@0.2.0: - resolution: { integrity: sha512-na/zgd5KplGlR+io+ygXQMIoDfX/Y0bNS5+P2TOXOTk5plquOVd0snudCd30hZJAsnVK2rxuxUP2z0CN+Aw1lQ== } - engines: { node: '>=0.8' } - read-package-json-fast@2.0.3: resolution: { integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== } engines: { node: '>=10' } @@ -14198,9 +13211,6 @@ packages: resolution: { integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== } engines: { node: '>=8' } - readable-stream@1.0.34: - resolution: { integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== } - readable-stream@2.3.8: resolution: { integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== } @@ -14224,9 +13234,6 @@ packages: resolution: { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } engines: { node: '>=8.10.0' } - readline2@1.0.1: - resolution: { integrity: sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g== } - rechoir@0.6.2: resolution: { integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== } engines: { node: '>= 0.10' } @@ -14253,10 +13260,6 @@ packages: redis@4.6.13: resolution: { integrity: sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA== } - reduce-object@0.1.3: - resolution: { integrity: sha512-7js/WmWoI5NRe/mfxUimt0rmj04lfhJIa8SDyt+OKasagu+KjffnVxElTKuZs1fRjytlN46BrDoVK+IsBVovtw== } - engines: { node: '>=0.10.0' } - redux@4.2.1: resolution: { integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== } @@ -14295,10 +13298,6 @@ packages: regenerator-transform@0.15.2: resolution: { integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== } - regex-cache@0.4.4: - resolution: { integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== } - engines: { node: '>=0.10.0' } - regex-not@1.0.2: resolution: { integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== } engines: { node: '>=0.10.0' } @@ -14328,10 +13327,6 @@ packages: resolution: { integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== } engines: { node: '>= 0.10' } - relative@3.0.2: - resolution: { integrity: sha512-Q5W2qeYtY9GbiR8z1yHNZ1DGhyjb4AnLEjt8iE6XfcC1QIu+FAtj3HQaO0wH28H1mX6cqNLvAqWhP402dxJGyA== } - engines: { node: '>= 0.8.0' } - remark-gfm@3.0.1: resolution: { integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== } @@ -14344,10 +13339,6 @@ packages: remark-rehype@10.1.0: resolution: { integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== } - remote-origin-url@0.5.3: - resolution: { integrity: sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg== } - engines: { node: '>= 0.8.0' } - remove-bom-buffer@3.0.0: resolution: { integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== } engines: { node: '>=0.10.0' } @@ -14374,10 +13365,6 @@ packages: resolution: { integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== } engines: { node: '>=0.10.0' } - replace-ext@0.0.1: - resolution: { integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ== } - engines: { node: '>= 0.4' } - replace-ext@1.0.1: resolution: { integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== } engines: { node: '>= 0.10' } @@ -14390,10 +13377,6 @@ packages: resolution: { integrity: sha512-klO76pTPzzS9Xri6bWtAp5mNjgcvyvqpVHibhTyrx4pAK7rvXal8rNGspURGCwp8ToxDQNYGEV7l+3d+xiFiwQ== } engines: { git: '>=2.11.0', node: '>=18.0.0', npm: '>=7.19.0', yarn: '>=1.7.0' } - repo-utils@0.3.7: - resolution: { integrity: sha512-NQmnug1GX04LoNb2bXGsCV3FzLDqmwf3qMmjToibrxI1CFV2uyE2XDdo9SYW8epfBK7wmw0ANhkmDtbGlrkyWQ== } - engines: { node: '>=0.10.0' } - request-progress@3.0.0: resolution: { integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== } @@ -14421,22 +13404,10 @@ packages: resolution: { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } engines: { node: '>=8' } - resolve-dir@0.1.1: - resolution: { integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== } - engines: { node: '>=0.10.0' } - resolve-dir@1.0.1: resolution: { integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== } engines: { node: '>=0.10.0' } - resolve-file@0.2.2: - resolution: { integrity: sha512-3t2k4iUeMlX3PbjgZPcKzILg8HEtl0VW/lS8G+k4FCgj3kNn1uTOv6YJtm192rYMFpq9abzfJ2xd5W6ibOwVag== } - engines: { node: '>=0.10.0' } - - resolve-file@0.3.0: - resolution: { integrity: sha512-9RXicAgDvLD272hZ3HwJv9MJUGxCBRRwwSBRdOGWgcO03MtC9UTGC6XG1VbS4T5MvDrb+tVZx2RhZ90uk3uczg== } - engines: { node: '>=0.10.0' } - resolve-from@4.0.0: resolution: { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } engines: { node: '>=4' } @@ -14445,10 +13416,6 @@ packages: resolution: { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } engines: { node: '>=8' } - resolve-glob@1.0.0: - resolution: { integrity: sha512-wSW9pVGJRs89k0wEXhM7C6+va9998NsDhgc0Y+6Nv8hrHsu0hUS7Ug10J1EiVtU6N2tKlSNvx9wLihL8Ao22Lg== } - engines: { node: '>=0.10.0' } - resolve-options@1.1.0: resolution: { integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A== } engines: { node: '>= 0.10' } @@ -14484,10 +13451,6 @@ packages: responselike@2.0.1: resolution: { integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== } - restore-cursor@1.0.1: - resolution: { integrity: sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw== } - engines: { node: '>=0.10.0' } - restore-cursor@3.1.0: resolution: { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== } engines: { node: '>=8' } @@ -14500,10 +13463,6 @@ packages: resolution: { integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== } engines: { node: '>=0.12' } - rethrow@0.2.3: - resolution: { integrity: sha512-vtB0AIP/FlRbR4stc8szvHXe+N4158/K1hRMZbFHljIiQAHru54M9LylbxNjBGHl9biuwQNVUdvRzVxv1QWAiA== } - engines: { node: '>=0.10.0' } - retry-request@7.0.2: resolution: { integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w== } engines: { node: '>=14' } @@ -14523,14 +13482,6 @@ packages: rfdc@1.3.1: resolution: { integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== } - right-align@0.1.3: - resolution: { integrity: sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg== } - engines: { node: '>=0.10.0' } - - rimraf@2.7.1: - resolution: { integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== } - hasBin: true - rimraf@3.0.2: resolution: { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } hasBin: true @@ -14568,9 +13519,6 @@ packages: resolution: { integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== } engines: { node: '>=12' } - run-async@0.1.0: - resolution: { integrity: sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw== } - run-async@2.4.1: resolution: { integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== } engines: { node: '>=0.12.0' } @@ -14588,9 +13536,6 @@ packages: rw@1.3.3: resolution: { integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== } - rx-lite@4.0.8: - resolution: { integrity: sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== } - rxjs@7.8.1: resolution: { integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== } @@ -14622,6 +13567,9 @@ packages: safer-buffer@2.1.2: resolution: { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } + sanitize-filename@1.6.3: + resolution: { integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== } + sanitize-html@2.12.1: resolution: { integrity: sha512-Plh+JAn0UVDpBRP/xEjsk+xDCoOvMBwQUf/K+/cBAVuTbtX8bj2VB7S1sL1dssVpykqp0/KPSesHrqXtokVBpA== } @@ -14762,29 +13710,6 @@ packages: resolution: { integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== } engines: { node: '>= 0.4' } - set-getter@0.1.1: - resolution: { integrity: sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw== } - engines: { node: '>=0.10.0' } - - set-value@0.2.0: - resolution: { integrity: sha512-dJaeu7V8d1KwjePimg1oOpGp31cEw/uRcZlfL7wwemkr+A00ev/ZhikvSMiQ4hkf83d8JdY2AFoFmXsKzmHMSw== } - engines: { node: '>=0.10.0' } - deprecated: Critical bug fixed in v3.0.1, please upgrade to the latest version. - - set-value@0.3.3: - resolution: { integrity: sha512-aJPTd11HzK47w8xJMpyY4tBmFC6EidC8EG2fENxCJvPwLYzXLnNaesgo796y1fhSISSYAuah4Het+wDoPXK2tg== } - engines: { node: '>=0.10.0' } - deprecated: Critical bug fixed in v3.0.1, please upgrade to the latest version. - - set-value@0.4.3: - resolution: { integrity: sha512-2Z0LRUUvYeF7gIFFep48ksPq0NR09e5oKoFXznaMGNcu+EZAfGnyL0K6xno2gCqX6dZYEZRjrcn04/gvZzcKhQ== } - engines: { node: '>=0.10.0' } - deprecated: Critical bug fixed in v3.0.1, please upgrade to the latest version. - - set-value@2.0.1: - resolution: { integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== } - engines: { node: '>=0.10.0' } - set-value@3.0.3: resolution: { integrity: sha512-Xsn/XSatoVOGBbp5hs3UylFDs5Bi9i+ArpVJKdHPniZHoEgRniXTqHWrWrGQ0PbEClVT6WtfnBwR8CAHC9sveg== } engines: { node: '>=6.0' } @@ -14802,10 +13727,6 @@ packages: resolution: { integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== } hasBin: true - shallow-clone@0.1.2: - resolution: { integrity: sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw== } - engines: { node: '>=0.10.0' } - shallowequal@1.1.0: resolution: { integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== } @@ -14958,10 +13879,6 @@ packages: resolution: { integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== } engines: { node: '>=8' } - sort-object-arrays@0.1.1: - resolution: { integrity: sha512-yqoVMBF2wzCdE4f2zeYKq2dQHe1WjGIdAV1dYSkXOFB+M3Bo+Bp0u+NdZCOETM3OC1VXerlruTD6Ckgus1NsnA== } - engines: { node: '>=0.10.0' } - source-list-map@2.0.1: resolution: { integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== } @@ -15056,10 +13973,6 @@ packages: resolution: { integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== } engines: { node: '>=12' } - split-string@1.0.1: - resolution: { integrity: sha512-ZuVODgxrpJnBD5LezfE484E2ArRF8HGgJqaiGBWvCbGS1iqynO45FQxBx7Ze4t45X9a994ejFD5kLhI6WtL1xA== } - engines: { node: '>=0.10.0' } - split-string@3.1.0: resolution: { integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== } engines: { node: '>=0.10.0' } @@ -15084,10 +13997,6 @@ packages: resolution: { integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== } engines: { node: '>= 0.6' } - src-stream@0.1.1: - resolution: { integrity: sha512-fczCn/BzNcH27V7unPzgCl+owTuC/Uv3UG9BQxGemRs6Fy1M2GFmYu1ZHQ2UjeYlGQqAmkModp949g235kYzcw== } - engines: { node: '>=0.10.0' } - srt-parser-2@1.2.3: resolution: { integrity: sha512-dANP1AyJTI503H0/kXwRza+7QxDB3BqeFvEKTF4MI9lQcBe8JbRUQTKVIGzGABJCwBovEYavZ2Qsdm/s8XKz8A== } hasBin: true @@ -15158,9 +14067,6 @@ packages: stream-combiner@0.0.4: resolution: { integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== } - stream-combiner@0.2.2: - resolution: { integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ== } - stream-events@1.0.5: resolution: { integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== } @@ -15233,19 +14139,12 @@ packages: string.prototype.trimstart@1.0.7: resolution: { integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== } - string_decoder@0.10.31: - resolution: { integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== } - string_decoder@1.1.1: resolution: { integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== } string_decoder@1.3.0: resolution: { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } - stringify-author@0.1.3: - resolution: { integrity: sha512-OxmcAnr4DESGl/ics9lAv30DdOBC2bdqswEAzTiOZSQRqVpWfnmlr3cpfxTmExf7phS5WxBJ1flD1e3ResNTBA== } - engines: { node: '>=0.10.0' } - stringify-object@3.3.0: resolution: { integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== } engines: { node: '>=4' } @@ -15266,26 +14165,10 @@ packages: resolution: { integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ== } engines: { node: '>=4' } - strip-bom-buffer@0.1.1: - resolution: { integrity: sha512-dbIOX/cOLFgLH/2ofd7n78uPD3uPkXyt3P1IgaVoGiPYEdOnb7D1mawyhOTXyYWva1kCuRxJY5FkMsVKYlZRRg== } - engines: { node: '>=0.10.0' } - - strip-bom-stream@1.0.0: - resolution: { integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ== } - engines: { node: '>=0.10.0' } - strip-bom-stream@2.0.0: resolution: { integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w== } engines: { node: '>=0.10.0' } - strip-bom-string@0.1.2: - resolution: { integrity: sha512-3DgNqQFTfOwWgxn3cXsa6h/WRgFa7dVb6/7YqwfJlBpLSSQbiU1VhaBNRKmtLI59CHjc9awLp9yGJREu7AnaMQ== } - engines: { node: '>=0.10.0' } - - strip-bom-string@1.0.0: - resolution: { integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== } - engines: { node: '>=0.10.0' } - strip-bom@2.0.0: resolution: { integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== } engines: { node: '>=0.10.0' } @@ -15298,10 +14181,6 @@ packages: resolution: { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== } engines: { node: '>=8' } - strip-color@0.1.0: - resolution: { integrity: sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA== } - engines: { node: '>=0.10.0' } - strip-comments@2.0.1: resolution: { integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== } engines: { node: '>=10' } @@ -15374,10 +14253,6 @@ packages: stylis@4.2.0: resolution: { integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== } - success-symbol@0.1.0: - resolution: { integrity: sha512-7S6uOTxPklNGxOSbDIg4KlVLBQw1UiGVyfCUYgYxrZUKRblUkmGj7r8xlfQoFudvqLv6Ap5gd76/IIFfI9JG2A== } - engines: { node: '>=0.10.0' } - sucrase@3.35.0: resolution: { integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== } engines: { node: '>=16 || 14 >=14.17' } @@ -15462,10 +14337,6 @@ packages: symbol-tree@3.2.4: resolution: { integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== } - tableize-object@0.1.0: - resolution: { integrity: sha512-seDB76zNqvGXG0W8gxUteRuq1fk1dvSxcRVbeYQ1a1QqMkbtqrGwvqTubfN6VCizzlb7NxOPM/j3z9JeBrbxYg== } - engines: { node: '>=0.10.0' } - tailwindcss@3.4.1: resolution: { integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA== } engines: { node: '>=14.0.0' } @@ -15507,14 +14378,6 @@ packages: resolution: { integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== } engines: { node: '>=8' } - template-error@0.1.2: - resolution: { integrity: sha512-soS5m+iT4k/okmMyydvMjPlmyz3CowvMcOxfgoAqccmkyF81W3D+zMi4lhqbSIhTgLhKE/Bh8wUlXzr6F+ERCw== } - engines: { node: '>=0.10.0' } - - templates@0.24.3: - resolution: { integrity: sha512-R5CUlz3atppbifPePB5Z2KGXCsB0Y87lQ/+ziizq/d3kyydDlNk40yX98RWLprNnKjTiwqeiuGjLJlPPJPYshg== } - engines: { node: '>=4.0.0' } - tempy@0.6.0: resolution: { integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== } engines: { node: '>=10' } @@ -15571,15 +14434,9 @@ packages: throttleit@1.0.1: resolution: { integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== } - through2-filter@2.0.0: - resolution: { integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg== } - through2-filter@3.0.0: resolution: { integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== } - through2@0.6.5: - resolution: { integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg== } - through2@2.0.5: resolution: { integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== } @@ -15595,10 +14452,6 @@ packages: tiktoken@1.0.15: resolution: { integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw== } - time-diff@0.3.1: - resolution: { integrity: sha512-8/LJTO3zKbhj6sQFeN3aoAA04GGjUgwKEquQVnKXkziHjEHadpIVIQ1rAjQgSVMnBRubJ/q5gMjK9WqXTzSykA== } - engines: { node: '>=0.10.0' } - time-stamp@1.1.0: resolution: { integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== } engines: { node: '>=0.10.0' } @@ -15630,10 +14483,6 @@ packages: tmpl@1.0.5: resolution: { integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== } - to-absolute-glob@0.1.1: - resolution: { integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ== } - engines: { node: '>=0.10.0' } - to-absolute-glob@2.0.2: resolution: { integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA== } engines: { node: '>=0.10.0' } @@ -15641,10 +14490,6 @@ packages: to-arraybuffer@1.0.1: resolution: { integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== } - to-choices@0.2.0: - resolution: { integrity: sha512-oPVwP4jpJZM4R3Yvfcod8/OjddMoi33amdFzwZktcHAjddmIEAzQ9DQsdPKUr/Q4hLxNMWPys4Pn1qJdLiR4Kg== } - engines: { node: '>=0.10.0' } - to-fast-properties@1.0.3: resolution: { integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== } engines: { node: '>=0.10.0' } @@ -15653,14 +14498,6 @@ packages: resolution: { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== } engines: { node: '>=4' } - to-file@0.2.0: - resolution: { integrity: sha512-xLyYVRKJQTwy2tKMOLD0M0yL+YSZVgMAzkaY9hh7GhzgBBHSIWARDkgPx8krPPm0mW5CgoIFsQEdKRFOyIRdqg== } - engines: { node: '>=0.10.0' } - - to-object-path@0.2.0: - resolution: { integrity: sha512-6oMu4CTicplxUMOXBoS1W9YNjIclUzmWpWf02v+JnYMEGVX24rTCsYMHay85WA7Wq+9wZa2iJ+HAAX0yGOcxCQ== } - engines: { node: '>=0.10.0' } - to-object-path@0.3.0: resolution: { integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== } engines: { node: '>=0.10.0' } @@ -15721,10 +14558,6 @@ packages: treeverse@1.0.4: resolution: { integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g== } - trim-leading-lines@0.1.1: - resolution: { integrity: sha512-ViFS8blDWJN4Jg10fyZ+sIAfkSSAn5NiTVywc3kKtMWK3DZjaV7FV86oX3i9KY6/gqYkdka/UNeM2/NMGttiyA== } - engines: { node: '>=0.10.0' } - trim-lines@3.0.1: resolution: { integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== } @@ -15739,6 +14572,9 @@ packages: trough@2.2.0: resolution: { integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== } + truncate-utf8-bytes@1.0.2: + resolution: { integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== } + tryer@1.0.1: resolution: { integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== } @@ -16046,10 +14882,6 @@ packages: unified@10.1.2: resolution: { integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== } - union-value@0.2.4: - resolution: { integrity: sha512-Tv3cqdyY8yjW9ZcJ9WP7JdHS34natzylD0oNRLlYbWOfUdC4EQ0sf3fubnqrK2IErtlmobFmuS1pWvv88VghpA== } - engines: { node: '>=0.10.0' } - union-value@1.0.1: resolution: { integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== } engines: { node: '>=0.10.0' } @@ -16148,10 +14980,6 @@ packages: unquote@1.1.1: resolution: { integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== } - unset-value@0.1.2: - resolution: { integrity: sha512-yhv5I4TsldLdE3UcVQn0hD2T5sNCPv4+qm/CTUpRKIpwthYRIipsAPdsrNpOI79hPQa0rTTeW22Fq6JWRcTgNg== } - engines: { node: '>=0.10.0' } - unset-value@1.0.0: resolution: { integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== } engines: { node: '>=0.10.0' } @@ -16170,14 +14998,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update@0.7.4: - resolution: { integrity: sha512-B7HArWh4T6TSmMffmxlbD9gZM0QdboQ8N/p5aHcyhGCuuVRHSk37pvuQlAvi1XBrQMrEX5WJUQyQR8+jy/x4iQ== } - engines: { node: '>=5.0' } - hasBin: true - - upper-case@1.1.3: - resolution: { integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== } - uri-js@4.4.1: resolution: { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } @@ -16222,14 +15042,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - use@1.1.2: - resolution: { integrity: sha512-25Uw2xiVk0m2ySqmnu2GjOIROlImdXMRcpI6Cq7sZeG/zFZgFkSeo2+QwKNWJncfZOVS55eACoinvJ3EtprOBw== } - engines: { node: '>=0.10.0' } - - use@2.0.2: - resolution: { integrity: sha512-RrhWfFWkNCz3djfSFZh7uSwu491QRhwNaHyAgB2sGl4kmmznb5ZUuuHpiWLVEsXOdpDakYK/x5+9o4lgg41UMw== } - engines: { node: '>=0.10.0' } - use@3.1.1: resolution: { integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== } engines: { node: '>=0.10.0' } @@ -16238,6 +15050,9 @@ packages: resolution: { integrity: sha512-xu9GQDeFp+eZ6LnCywXN/zBancWvOpUMzgjLPSjy4BRHSmTelvn2E0DG0o1sTiw5hkCKBHo8rwSKncfRfv2EEQ== } engines: { node: '>=6.14.2' } + utf8-byte-length@1.0.5: + resolution: { integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA== } + util-deprecate@1.0.2: resolution: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } @@ -16339,30 +15154,14 @@ packages: resolution: { integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg== } engines: { node: '>=4' } - vinyl-fs@2.4.4: - resolution: { integrity: sha512-lxMlQW/Wxk/pwhooY3Ut0Q11OH5ZvZfV0Gg1c306fBNWznQ6ZeQaCdE7XX0O/PpGSqgAsHMBxwFgcGxiYW3hZg== } - engines: { node: '>=0.10' } - vinyl-fs@3.0.3: resolution: { integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== } engines: { node: '>= 0.10' } - vinyl-item@0.1.0: - resolution: { integrity: sha512-9L2HEcbtuTdKCLWDucRPObPoAxnUUCdAXg0QDf3aDPM3oFpb6C+yct/R31PA9EhLGeilNl8TF/inc3OwFSSEMg== } - engines: { node: '>=0.10.0' } - vinyl-sourcemap@1.1.0: resolution: { integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA== } engines: { node: '>= 0.10' } - vinyl-view@0.1.2: - resolution: { integrity: sha512-qIc2qnXgOXZrT1Q1ViR1VMTjuylAi3Y/LSYSYfwJ6ZG7Ar5miUfioSIBu30bsHTo5dSz4ReDNSUw3lelCtc5Jw== } - engines: { node: '>=0.10.0' } - - vinyl@1.2.0: - resolution: { integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ== } - engines: { node: '>= 0.9' } - vinyl@2.2.1: resolution: { integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== } engines: { node: '>= 0.10' } @@ -16442,12 +15241,6 @@ packages: terser: optional: true - vm2@3.9.19: - resolution: { integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== } - engines: { node: '>=6.0' } - deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. - hasBin: true - vue@3.4.31: resolution: { integrity: sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ== } peerDependencies: @@ -16482,10 +15275,6 @@ packages: walker@1.0.8: resolution: { integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== } - warning-symbol@0.1.0: - resolution: { integrity: sha512-1S0lwbHo3kNUKA4VomBAhqn4DPjQkIKSdbOin5K7EFUQNwyIKx+wZMGXKI53RUjla8V2B8ouQduUlgtx8LoSMw== } - engines: { node: '>=0.10.0' } - warning@4.0.3: resolution: { integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== } @@ -16835,14 +15624,6 @@ packages: resolution: { integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== } engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - write-json@0.2.2: - resolution: { integrity: sha512-3HOXDnA8CgyaObzkxKPTHBw0feFlYMn9Mi8ZIrnoNJTTMABn+XOhmTsVlX/P/WeZuXEV9ApvQvR1fpZOOQ5FOg== } - engines: { node: '>=0.10.0' } - - write@0.2.1: - resolution: { integrity: sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA== } - engines: { node: '>=0.10.0' } - ws@7.5.9: resolution: { integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== } engines: { node: '>=8.3.0' } @@ -16974,9 +15755,6 @@ packages: engines: { node: '>= 14' } hasBin: true - yargs-parser@2.4.1: - resolution: { integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== } - yargs-parser@20.2.9: resolution: { integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== } engines: { node: '>=10' } @@ -20453,6 +19231,11 @@ snapshots: '@floating-ui/utils@0.2.1': {} + '@flowiseai/nodevm@3.9.25': + dependencies: + acorn: 8.11.3 + acorn-walk: 8.3.2 + '@gar/promisify@1.1.3': {} '@getzep/zep-cloud@1.0.7(@langchain/core@0.2.18)(encoding@0.1.13)(langchain@0.2.11)': @@ -20935,7 +19718,7 @@ snapshots: - langchain - openai - '@langchain/community@0.2.17(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-bedrock-agent-runtime@3.625.0)(@aws-sdk/client-bedrock-runtime@3.422.0)(@aws-sdk/client-dynamodb@3.529.1)(@aws-sdk/client-kendra@3.624.0)(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@datastax/astra-db-ts@0.1.4)(@elastic/elasticsearch@8.12.2)(@getzep/zep-cloud@1.0.7)(@getzep/zep-js@0.9.0)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@google-ai/generativelanguage@2.6.0(encoding@0.1.13))(@huggingface/inference@2.6.4)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@opensearch-project/opensearch@1.2.0)(@pinecone-database/pinecone@2.2.2)(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@smithy/eventstream-codec@3.1.2)(@smithy/protocol-http@4.1.0)(@smithy/signature-v4@4.1.0)(@smithy/util-utf8@3.0.0)(@supabase/postgrest-js@1.9.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@upstash/redis@1.22.1(encoding@0.1.13))(@upstash/vector@1.1.5)(@xenova/transformers@2.17.1)(@zilliz/milvus2-sdk-node@2.3.5)(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(cohere-ai@7.10.0(encoding@0.1.13))(couchbase@4.3.1)(crypto-js@4.2.0)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(google-auth-library@9.6.3(encoding@0.1.13))(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(lodash@4.17.21)(lunary@0.6.16(openai@4.51.0(encoding@0.1.13))(react@18.2.0))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(pg@8.11.3)(playwright@1.42.1)(portkey-ai@0.1.16)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(replicate@0.31.1)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@langchain/community@0.2.17(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-bedrock-agent-runtime@3.625.0)(@aws-sdk/client-bedrock-runtime@3.422.0)(@aws-sdk/client-dynamodb@3.529.1)(@aws-sdk/client-kendra@3.624.0)(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@datastax/astra-db-ts@0.1.4)(@elastic/elasticsearch@8.12.2)(@getzep/zep-cloud@1.0.7)(@getzep/zep-js@0.9.0)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@google-ai/generativelanguage@2.6.0(encoding@0.1.13))(@huggingface/inference@2.6.4)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@opensearch-project/opensearch@1.2.0)(@pinecone-database/pinecone@2.2.2)(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@smithy/eventstream-codec@3.1.2)(@smithy/protocol-http@4.1.0)(@smithy/signature-v4@4.1.0)(@smithy/util-utf8@3.0.0)(@supabase/postgrest-js@1.9.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@upstash/redis@1.22.1(encoding@0.1.13))(@upstash/vector@1.1.5)(@xenova/transformers@2.17.1)(@zilliz/milvus2-sdk-node@2.3.5)(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(cohere-ai@7.10.0(encoding@0.1.13))(couchbase@4.3.1)(crypto-js@4.2.0)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(google-auth-library@9.6.3(encoding@0.1.13))(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(lodash@4.17.21)(lunary@0.7.10(openai@4.51.0(encoding@0.1.13))(react@18.2.0))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(pg@8.11.3)(playwright@1.42.1)(portkey-ai@0.1.16)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(replicate@0.31.1)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: '@langchain/core': 0.2.18(langchain@0.2.3(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(couchbase@4.3.1)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(playwright@1.42.1)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.51.0(encoding@0.1.13)) '@langchain/openai': 0.1.3(encoding@0.1.13)(langchain@0.2.3(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(couchbase@4.3.1)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(playwright@1.42.1)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) @@ -20994,7 +19777,7 @@ snapshots: ioredis: 5.3.2 jsdom: 22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4) lodash: 4.17.21 - lunary: 0.6.16(openai@4.51.0(encoding@0.1.13))(react@18.2.0) + lunary: 0.7.10(openai@4.51.0(encoding@0.1.13))(react@18.2.0) mammoth: 1.7.0 mongodb: 6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1) mysql2: 3.9.2 @@ -24024,138 +22807,18 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - align-text@0.1.4: - dependencies: - kind-of: 3.2.2 - longest: 1.0.1 - repeat-string: 1.6.1 - already@2.2.1: {} ansi-align@3.0.1: dependencies: string-width: 4.2.3 - ansi-bgblack@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgblue@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgcyan@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bggreen@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgmagenta@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgred@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgwhite@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgyellow@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-black@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-blue@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bold@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-colors@0.1.0: - dependencies: - ansi-bgblack: 0.1.1 - ansi-bgblue: 0.1.1 - ansi-bgcyan: 0.1.1 - ansi-bggreen: 0.1.1 - ansi-bgmagenta: 0.1.1 - ansi-bgred: 0.1.1 - ansi-bgwhite: 0.1.1 - ansi-bgyellow: 0.1.1 - ansi-black: 0.1.1 - ansi-blue: 0.1.1 - ansi-bold: 0.1.1 - ansi-cyan: 0.1.1 - ansi-dim: 0.1.1 - ansi-gray: 0.1.1 - ansi-green: 0.1.1 - ansi-grey: 0.1.1 - ansi-hidden: 0.1.1 - ansi-inverse: 0.1.1 - ansi-italic: 0.1.1 - ansi-magenta: 0.1.1 - ansi-red: 0.1.1 - ansi-reset: 0.1.1 - ansi-strikethrough: 0.1.1 - ansi-underline: 0.1.1 - ansi-white: 0.1.1 - ansi-yellow: 0.1.1 - lazy-cache: 0.2.7 - - ansi-colors@0.2.0: - dependencies: - ansi-bgblack: 0.1.1 - ansi-bgblue: 0.1.1 - ansi-bgcyan: 0.1.1 - ansi-bggreen: 0.1.1 - ansi-bgmagenta: 0.1.1 - ansi-bgred: 0.1.1 - ansi-bgwhite: 0.1.1 - ansi-bgyellow: 0.1.1 - ansi-black: 0.1.1 - ansi-blue: 0.1.1 - ansi-bold: 0.1.1 - ansi-cyan: 0.1.1 - ansi-dim: 0.1.1 - ansi-gray: 0.1.1 - ansi-green: 0.1.1 - ansi-grey: 0.1.1 - ansi-hidden: 0.1.1 - ansi-inverse: 0.1.1 - ansi-italic: 0.1.1 - ansi-magenta: 0.1.1 - ansi-red: 0.1.1 - ansi-reset: 0.1.1 - ansi-strikethrough: 0.1.1 - ansi-underline: 0.1.1 - ansi-white: 0.1.1 - ansi-yellow: 0.1.1 - lazy-cache: 2.0.2 - ansi-colors@1.1.0: dependencies: ansi-wrap: 0.1.0 ansi-colors@4.1.3: {} - ansi-cyan@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-dim@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-escapes@1.4.0: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -24168,50 +22831,14 @@ snapshots: dependencies: ansi-wrap: 0.1.0 - ansi-green@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-grey@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-hidden@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-html-community@0.0.8: {} - ansi-inverse@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-italic@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-magenta@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-red@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-regex@2.1.1: {} ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} - ansi-reset@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-strikethrough@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-styles@2.2.1: {} ansi-styles@3.2.1: @@ -24226,20 +22853,8 @@ snapshots: ansi-styles@6.2.1: {} - ansi-underline@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-white@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-wrap@0.1.0: {} - ansi-yellow@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansicolors@0.3.2: {} any-promise@1.3.0: {} @@ -24313,10 +22928,6 @@ snapshots: dependencies: dequal: 2.0.3 - arr-diff@2.0.0: - dependencies: - arr-flatten: 1.1.0 - arr-diff@4.0.0: {} arr-filter@1.1.2: @@ -24329,10 +22940,6 @@ snapshots: dependencies: make-iterator: 1.0.1 - arr-pluck@0.1.0: - dependencies: - arr-map: 2.0.2 - arr-union@3.1.0: {} array-buffer-byte-length@1.0.1: @@ -24365,12 +22972,6 @@ snapshots: array-slice@1.1.0: {} - array-sort@0.1.4: - dependencies: - default-compare: 1.0.0 - get-value: 2.0.6 - kind-of: 5.1.0 - array-sort@1.0.0: dependencies: default-compare: 1.0.0 @@ -24379,8 +22980,6 @@ snapshots: array-union@2.1.0: {} - array-unique@0.2.1: {} - array-unique@0.3.2: {} array.prototype.filter@1.0.3: @@ -24455,10 +23054,6 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - arrayify-compact@0.2.0: - dependencies: - arr-flatten: 1.1.0 - arrify@2.0.1: {} asap@2.0.6: {} @@ -24467,67 +23062,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - assemble-core@0.25.0: - dependencies: - assemble-fs: 0.6.0 - assemble-render-file: 0.7.2 - assemble-streams: 0.6.0 - base-task: 0.6.2 - define-property: 0.2.5 - lazy-cache: 2.0.2 - templates: 0.24.3 - transitivePeerDependencies: - - supports-color - - assemble-fs@0.6.0: - dependencies: - assemble-handle: 0.1.4 - extend-shallow: 2.0.1 - is-valid-app: 0.2.1 - lazy-cache: 2.0.2 - stream-combiner: 0.2.2 - through2: 2.0.5 - vinyl-fs: 2.4.4 - transitivePeerDependencies: - - supports-color - - assemble-handle@0.1.4: - dependencies: - through2: 2.0.5 - - assemble-loader@0.6.1: - dependencies: - extend-shallow: 2.0.1 - file-contents: 0.2.4 - fs-exists-sync: 0.1.0 - has-glob: 0.1.1 - is-registered: 0.1.5 - is-valid-glob: 0.3.0 - is-valid-instance: 0.1.0 - isobject: 2.1.0 - lazy-cache: 2.0.2 - load-templates: 0.11.4 - - assemble-render-file@0.7.2: - dependencies: - debug: 2.6.9 - is-valid-app: 0.1.2 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - through2: 2.0.5 - transitivePeerDependencies: - - supports-color - - assemble-streams@0.6.0: - dependencies: - assemble-handle: 0.1.4 - is-registered: 0.1.5 - is-valid-instance: 0.1.0 - lazy-cache: 2.0.2 - match-file: 0.2.2 - src-stream: 0.1.1 - through2: 2.0.5 - assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4): dependencies: ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -24544,14 +23078,6 @@ snapshots: assert-plus@1.0.0: {} - assign-deep@0.4.8: - dependencies: - assign-symbols: 0.1.1 - is-primitive: 2.0.0 - kind-of: 5.1.0 - - assign-symbols@0.1.1: {} - assign-symbols@1.0.0: {} ast-types-flow@0.0.8: {} @@ -24562,15 +23088,6 @@ snapshots: astral-regex@2.0.0: {} - async-array-reduce@0.2.1: {} - - async-done@0.4.0: - dependencies: - end-of-stream: 0.1.5 - next-tick: 0.2.2 - once: 1.4.0 - stream-exhaust: 1.0.2 - async-done@1.3.2: dependencies: end-of-stream: 1.4.4 @@ -24578,15 +23095,8 @@ snapshots: process-nextick-args: 2.0.1 stream-exhaust: 1.0.2 - async-each-series@1.1.0: {} - async-each@1.0.6: {} - async-helpers@0.3.17: - dependencies: - co: 4.6.0 - kind-of: 6.0.3 - async-mutex@0.4.1: dependencies: tslib: 2.6.2 @@ -24595,16 +23105,10 @@ snapshots: dependencies: retry: 0.13.1 - async-settle@0.2.1: - dependencies: - async-done: 0.4.0 - async-settle@1.0.0: dependencies: async-done: 1.3.2 - async@1.5.2: {} - async@3.2.5: {} asynciterator.prototype@1.0.0: @@ -24943,18 +23447,6 @@ snapshots: babylon@6.18.0: {} - bach@0.5.0: - dependencies: - async-done: 1.3.2 - async-settle: 0.2.1 - lodash.filter: 4.6.0 - lodash.flatten: 4.4.0 - lodash.foreach: 4.5.0 - lodash.initial: 4.1.1 - lodash.last: 3.0.0 - lodash.map: 4.6.0 - now-and-later: 0.0.6 - bach@1.2.0: dependencies: arr-filter: 1.1.2 @@ -24994,304 +23486,6 @@ snapshots: base-64@1.0.0: {} - base-argv@0.4.5: - dependencies: - arr-diff: 2.0.0 - arr-union: 3.1.0 - debug: 2.6.9 - define-property: 0.2.5 - expand-args: 0.4.3 - extend-shallow: 2.0.1 - lazy-cache: 1.0.4 - transitivePeerDependencies: - - supports-color - - base-cli-process@0.1.19: - dependencies: - arr-union: 3.1.0 - arrayify-compact: 0.2.0 - base-cli: 0.5.0 - base-cli-schema: 0.1.19 - base-config-process: 0.1.9 - base-cwd: 0.3.4 - base-option: 0.8.4 - base-pkg: 0.2.5 - debug: 2.6.9 - export-files: 2.1.1 - fs-exists-sync: 0.1.0 - is-valid-app: 0.2.1 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - log-utils: 0.2.1 - merge-deep: 3.0.3 - mixin-deep: 1.3.2 - object.pick: 1.3.0 - pad-right: 0.2.2 - union-value: 1.0.1 - transitivePeerDependencies: - - supports-color - - base-cli-schema@0.1.19: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.2.1 - debug: 2.6.9 - define-property: 0.2.5 - export-files: 2.1.1 - extend-shallow: 2.0.1 - falsey: 0.3.2 - fs-exists-sync: 0.1.0 - has-glob: 0.1.1 - has-value: 0.3.1 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - map-schema: 0.2.4 - merge-deep: 3.0.3 - mixin-deep: 1.3.2 - resolve: 1.22.8 - tableize-object: 0.1.0 - transitivePeerDependencies: - - supports-color - - base-cli@0.5.0: - dependencies: - base-argv: 0.4.5 - base-config: 0.5.2 - transitivePeerDependencies: - - supports-color - - base-compose@0.2.1: - dependencies: - copy-task: 0.1.0 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - - base-config-process@0.1.9: - dependencies: - base-config: 0.5.2 - base-config-schema: 0.1.24 - base-cwd: 0.3.4 - base-option: 0.8.4 - debug: 2.6.9 - export-files: 2.1.1 - is-valid-app: 0.2.1 - lazy-cache: 2.0.2 - micromatch: 2.3.11 - mixin-deep: 1.3.2 - transitivePeerDependencies: - - supports-color - - base-config-schema@0.1.24: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - base-pkg: 0.2.5 - camel-case: 3.0.0 - debug: 2.6.9 - define-property: 1.0.0 - export-files: 2.1.1 - extend-shallow: 2.0.1 - has-glob: 1.0.0 - has-value: 0.3.1 - inflection: 1.13.4 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - load-templates: 1.0.2 - map-schema: 0.2.4 - matched: 0.4.4 - mixin-deep: 1.3.2 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - base-config@0.5.2: - dependencies: - isobject: 2.1.0 - lazy-cache: 1.0.4 - map-config: 0.5.0 - resolve-dir: 0.1.1 - - base-cwd@0.3.4: - dependencies: - empty-dir: 0.2.1 - find-pkg: 0.1.2 - is-valid-app: 0.2.1 - transitivePeerDependencies: - - supports-color - - base-data@0.6.2: - dependencies: - arr-flatten: 1.1.0 - cache-base: 1.0.1 - extend-shallow: 2.0.1 - get-value: 2.0.6 - has-glob: 1.0.0 - has-value: 1.0.0 - is-registered: 0.1.5 - is-valid-app: 0.3.0 - kind-of: 5.1.0 - lazy-cache: 2.0.2 - merge-value: 1.0.0 - mixin-deep: 1.3.2 - read-file: 0.2.0 - resolve-glob: 1.0.0 - set-value: 2.0.1 - union-value: 1.0.1 - transitivePeerDependencies: - - supports-color - - base-engines@0.2.1: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - engine-cache: 0.19.4 - is-valid-app: 0.1.2 - lazy-cache: 2.0.2 - transitivePeerDependencies: - - supports-color - - base-env@0.3.1: - dependencies: - base-namespace: 0.2.0 - contains-path: 0.1.0 - debug: 2.6.9 - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - global-modules: 0.2.3 - is-absolute: 0.2.6 - is-valid-app: 0.1.2 - is-valid-instance: 0.1.0 - kind-of: 3.2.2 - os-homedir: 1.0.2 - resolve-file: 0.3.0 - transitivePeerDependencies: - - supports-color - - base-generators@0.4.6: - dependencies: - async-each-series: 1.1.0 - base-compose: 0.2.1 - base-cwd: 0.3.4 - base-data: 0.6.2 - base-env: 0.3.1 - base-option: 0.8.4 - base-pkg: 0.2.5 - base-plugins: 0.4.13 - base-task: 0.6.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - global-modules: 0.2.3 - is-valid-app: 0.2.1 - is-valid-instance: 0.2.0 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - transitivePeerDependencies: - - supports-color - - base-helpers@0.1.1: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - is-valid-app: 0.1.2 - lazy-cache: 2.0.2 - load-helpers: 0.2.11 - transitivePeerDependencies: - - supports-color - - base-namespace@0.2.0: - dependencies: - is-valid-app: 0.1.2 - transitivePeerDependencies: - - supports-color - - base-option@0.8.4: - dependencies: - define-property: 0.2.5 - get-value: 2.0.6 - is-valid-app: 0.2.1 - isobject: 2.1.0 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - option-cache: 3.5.0 - set-value: 0.3.3 - transitivePeerDependencies: - - supports-color - - base-pkg@0.2.5: - dependencies: - cache-base: 1.0.1 - debug: 2.6.9 - define-property: 1.0.0 - expand-pkg: 0.1.9 - extend-shallow: 2.0.1 - is-valid-app: 0.3.0 - log-utils: 0.2.1 - pkg-store: 0.2.2 - transitivePeerDependencies: - - supports-color - - base-plugins@0.4.13: - dependencies: - define-property: 0.2.5 - is-registered: 0.1.5 - isobject: 2.1.0 - - base-questions@0.7.4: - dependencies: - base-store: 0.4.4 - clone-deep: 0.2.4 - debug: 2.6.9 - define-property: 0.2.5 - is-valid-app: 0.2.1 - isobject: 2.1.0 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - question-store: 0.11.1 - transitivePeerDependencies: - - supports-color - - base-routes@0.2.2: - dependencies: - debug: 2.6.9 - en-route: 0.7.5 - is-valid-app: 0.2.1 - lazy-cache: 2.0.2 - template-error: 0.1.2 - transitivePeerDependencies: - - supports-color - - base-runtimes@0.2.0: - dependencies: - extend-shallow: 2.0.1 - is-valid-app: 0.2.1 - lazy-cache: 2.0.2 - log-utils: 0.1.5 - micromatch: 2.3.11 - time-diff: 0.3.1 - transitivePeerDependencies: - - supports-color - - base-store@0.4.4: - dependencies: - data-store: 0.16.1 - debug: 2.6.9 - extend-shallow: 2.0.1 - is-registered: 0.1.5 - is-valid-instance: 0.1.0 - lazy-cache: 2.0.2 - project-name: 0.2.6 - transitivePeerDependencies: - - supports-color - - base-task@0.6.2: - dependencies: - composer: 0.13.0 - is-valid-app: 0.1.2 - transitivePeerDependencies: - - supports-color - base16@1.0.0: {} base64-js@1.5.1: {} @@ -25308,19 +23502,6 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 - base@0.8.1: - dependencies: - arr-union: 3.1.0 - cache-base: 0.8.5 - class-utils: 0.3.6 - component-emitter: 1.3.1 - debug: 2.6.9 - define-property: 0.2.5 - lazy-cache: 1.0.4 - mixin-deep: 1.3.2 - transitivePeerDependencies: - - supports-color - basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -25432,12 +23613,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@1.8.5: - dependencies: - expand-range: 1.8.2 - preserve: 0.2.0 - repeat-element: 1.1.4 - braces@2.3.2: dependencies: arr-flatten: 1.1.0 @@ -25588,19 +23763,6 @@ snapshots: tar: 6.2.0 unique-filename: 3.0.0 - cache-base@0.8.5: - dependencies: - collection-visit: 0.2.3 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 0.3.1 - isobject: 3.0.1 - lazy-cache: 2.0.2 - set-value: 0.4.3 - to-object-path: 0.3.0 - union-value: 0.2.4 - unset-value: 0.1.2 - cache-base@1.0.1: dependencies: collection-visit: 1.0.0 @@ -25608,7 +23770,7 @@ snapshots: get-value: 2.0.6 has-value: 1.0.0 isobject: 3.0.1 - set-value: 2.0.1 + set-value: 3.0.3 to-object-path: 0.3.0 union-value: 1.0.1 unset-value: 1.0.0 @@ -25641,11 +23803,6 @@ snapshots: callsites@3.1.0: {} - camel-case@3.0.0: - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - camel-case@4.1.2: dependencies: pascal-case: 3.1.2 @@ -25850,10 +24007,6 @@ snapshots: cli-boxes@3.0.0: {} - cli-cursor@1.0.2: - dependencies: - restore-cursor: 1.0.1 - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -25897,8 +24050,6 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 - cli-width@1.1.1: {} - cli-width@3.0.0: {} clipboard@2.0.11: @@ -25928,20 +24079,10 @@ snapshots: clone-buffer@1.0.0: {} - clone-deep@0.2.4: - dependencies: - for-own: 0.1.5 - is-plain-object: 2.0.4 - kind-of: 3.2.2 - lazy-cache: 1.0.4 - shallow-clone: 0.1.2 - clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - clone-stats@0.0.1: {} - clone-stats@1.0.0: {} clone@1.0.4: {} @@ -26037,12 +24178,6 @@ snapshots: for-own: 1.0.0 make-iterator: 1.0.1 - collection-visit@0.2.3: - dependencies: - lazy-cache: 2.0.2 - map-visit: 0.1.5 - object-visit: 0.3.4 - collection-visit@1.0.0: dependencies: map-visit: 1.0.0 @@ -26120,24 +24255,6 @@ snapshots: common-ancestor-path@1.0.1: {} - common-config@0.1.1: - dependencies: - composer: 0.13.0 - data-store: 0.16.1 - get-value: 2.0.6 - lazy-cache: 2.0.2 - log-utils: 0.2.1 - object.pick: 1.3.0 - omit-empty: 0.4.1 - question-cache: 0.4.0 - set-value: 3.0.3 - strip-color: 0.1.0 - tableize-object: 0.1.0 - text-table: 0.2.0 - yargs-parser: 2.4.1 - transitivePeerDependencies: - - supports-color - common-path-prefix@3.0.0: {} common-tags@1.8.2: {} @@ -26148,21 +24265,6 @@ snapshots: component-register@0.8.3: {} - composer@0.13.0: - dependencies: - array-unique: 0.2.1 - bach: 0.5.0 - co: 4.6.0 - component-emitter: 1.3.1 - define-property: 0.2.5 - extend-shallow: 2.0.1 - is-generator: 1.0.3 - is-glob: 2.0.1 - isobject: 2.1.0 - lazy-cache: 2.0.2 - micromatch: 2.3.11 - nanoseconds: 0.1.0 - compressible@2.0.18: dependencies: mime-db: 1.52.0 @@ -26206,8 +24308,6 @@ snapshots: console-control-strings@1.1.0: {} - contains-path@0.1.0: {} - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -26231,8 +24331,6 @@ snapshots: each-props: 1.3.2 is-plain-object: 5.0.0 - copy-task@0.1.0: {} - core-js-compat@3.36.0: dependencies: browserslist: 4.23.0 @@ -26490,15 +24588,6 @@ snapshots: csstype@3.1.3: {} - cwd@0.10.0: - dependencies: - find-pkg: 0.1.2 - fs-exists-sync: 0.1.0 - - cwd@0.9.1: - dependencies: - find-pkg: 0.1.2 - cypress@13.13.0: dependencies: '@cypress/request': 3.0.1 @@ -26599,24 +24688,6 @@ snapshots: dependencies: assert-plus: 1.0.0 - data-store@0.16.1: - dependencies: - cache-base: 0.8.5 - clone-deep: 0.2.4 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - graceful-fs: 4.2.11 - has-own-deep: 0.1.4 - lazy-cache: 2.0.2 - mkdirp: 0.5.6 - project-name: 0.2.6 - resolve-dir: 0.1.1 - rimraf: 2.7.1 - union-value: 0.2.4 - transitivePeerDependencies: - - supports-color - data-uri-to-buffer@6.0.2: {} data-urls@2.0.0: @@ -26698,10 +24769,6 @@ snapshots: dedent@0.7.0: {} - deep-bind@0.3.0: - dependencies: - mixin-deep: 1.3.2 - deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -26753,12 +24820,6 @@ snapshots: default-resolution@2.0.0: {} - defaults-deep@0.2.4: - dependencies: - for-own: 0.1.5 - is-extendable: 0.1.1 - lazy-cache: 0.2.7 - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -26805,15 +24866,6 @@ snapshots: delegates@1.0.0: {} - delimiter-regex@1.3.1: - dependencies: - extend-shallow: 1.1.4 - - delimiter-regex@2.0.0: - dependencies: - extend-shallow: 1.1.4 - isobject: 2.1.0 - denque@2.1.0: {} depd@1.1.2: {} @@ -27041,21 +25093,6 @@ snapshots: emojis-list@3.0.0: {} - empty-dir@0.2.1: - dependencies: - fs-exists-sync: 0.1.0 - - en-route@0.7.5: - dependencies: - arr-flatten: 1.1.0 - debug: 2.6.9 - extend-shallow: 2.0.1 - kind-of: 3.2.2 - lazy-cache: 1.0.4 - path-to-regexp: 1.8.0 - transitivePeerDependencies: - - supports-color - enabled@2.0.0: {} encodeurl@1.0.2: {} @@ -27064,36 +25101,10 @@ snapshots: dependencies: iconv-lite: 0.6.3 - end-of-stream@0.1.5: - dependencies: - once: 1.3.3 - end-of-stream@1.4.4: dependencies: once: 1.4.0 - engine-base@0.1.3: - dependencies: - component-emitter: 1.3.1 - delimiter-regex: 2.0.0 - engine: 0.1.12 - engine-utils: 0.1.1 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - object.omit: 2.0.1 - object.pick: 1.3.0 - - engine-cache@0.19.4: - dependencies: - async-helpers: 0.3.17 - extend-shallow: 2.0.1 - helper-cache: 0.7.2 - isobject: 3.0.1 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - - engine-utils@0.1.1: {} - engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.4): dependencies: '@socket.io/component-emitter': 3.1.0 @@ -27125,16 +25136,6 @@ snapshots: - supports-color - utf-8-validate - engine@0.1.12: - dependencies: - assign-deep: 0.4.8 - collection-visit: 0.2.3 - get-value: 1.3.1 - kind-of: 2.0.1 - lazy-cache: 0.2.7 - object.omit: 2.0.1 - set-value: 0.2.0 - enhanced-resolve@5.16.0: dependencies: graceful-fs: 4.2.11 @@ -27161,8 +25162,6 @@ snapshots: dependencies: stackframe: 1.3.4 - error-symbol@0.1.0: {} - error@10.4.0: {} es-abstract@1.22.5: @@ -27736,24 +25735,8 @@ snapshots: dependencies: pify: 2.3.0 - exit-hook@1.1.1: {} - exit@0.1.2: {} - expand-args@0.4.3: - dependencies: - expand-object: 0.4.2 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - minimist: 1.2.8 - mixin-deep: 1.3.2 - omit-empty: 0.4.1 - set-value: 0.3.3 - - expand-brackets@0.1.5: - dependencies: - is-posix-bracket: 0.1.1 - expand-brackets@2.1.4: dependencies: debug: 2.6.9 @@ -27766,42 +25749,8 @@ snapshots: transitivePeerDependencies: - supports-color - expand-object@0.4.2: - dependencies: - get-stdin: 5.0.1 - is-number: 2.1.0 - minimist: 1.2.8 - set-value: 0.3.3 - - expand-pkg@0.1.9: - dependencies: - component-emitter: 1.3.1 - debug: 2.6.9 - defaults-deep: 0.2.4 - export-files: 2.1.1 - get-value: 2.0.6 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - load-pkg: 3.0.1 - mixin-deep: 1.3.2 - normalize-pkg: 0.3.20 - omit-empty: 0.4.1 - parse-author: 1.0.0 - parse-git-config: 1.1.1 - repo-utils: 0.3.7 - transitivePeerDependencies: - - supports-color - - expand-range@1.8.2: - dependencies: - fill-range: 2.2.4 - expand-template@2.0.3: {} - expand-tilde@1.2.2: - dependencies: - os-homedir: 1.0.2 - expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 @@ -27823,10 +25772,6 @@ snapshots: exponential-backoff@3.1.1: {} - export-files@2.1.1: - dependencies: - lazy-cache: 1.0.4 - expr-eval@2.0.2: {} express-basic-auth@1.2.1: @@ -27877,10 +25822,6 @@ snapshots: dependencies: type: 2.7.2 - extend-shallow@1.1.4: - dependencies: - kind-of: 1.1.0 - extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -27898,10 +25839,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extglob@0.3.2: - dependencies: - is-extglob: 1.0.0 - extglob@2.0.4: dependencies: array-unique: 0.3.2 @@ -27945,10 +25882,6 @@ snapshots: node-addon-api: 6.1.0 prebuild-install: 7.1.2 - falsey@0.3.2: - dependencies: - kind-of: 5.1.0 - fancy-log@1.3.3: dependencies: ansi-gray: 0.1.1 @@ -28050,77 +25983,28 @@ snapshots: to-arraybuffer: 1.0.1 tough-cookie: 4.1.3 - figures@1.7.0: - dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - file-contents@0.2.4: - dependencies: - extend-shallow: 2.0.1 - file-stat: 0.1.3 - graceful-fs: 4.2.11 - is-buffer: 1.1.6 - is-utf8: 0.2.1 - lazy-cache: 0.2.7 - through2: 2.0.5 - - file-contents@1.0.1: - dependencies: - define-property: 0.2.5 - extend-shallow: 2.0.1 - is-buffer: 1.1.6 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - strip-bom-buffer: 0.1.1 - strip-bom-string: 0.1.2 - through2: 2.0.5 - file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - file-is-binary@1.0.0: - dependencies: - is-binary-buffer: 1.0.0 - isobject: 3.0.1 - file-loader@6.2.0(webpack@5.90.3(@swc/core@1.4.6)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.90.3(@swc/core@1.4.6) - file-name@0.1.0: {} - - file-stat@0.1.3: - dependencies: - graceful-fs: 4.2.11 - lazy-cache: 0.2.7 - through2: 2.0.5 - file-uri-to-path@1.0.0: {} filelist@1.0.4: dependencies: minimatch: 5.1.6 - filename-regex@2.0.1: {} - filesize@8.0.7: {} - fill-range@2.2.4: - dependencies: - is-number: 2.1.0 - isobject: 2.1.0 - randomatic: 3.1.1 - repeat-element: 1.1.4 - repeat-string: 1.6.1 - fill-range@4.0.0: dependencies: extend-shallow: 2.0.1 @@ -28152,15 +26036,6 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 - find-file-up@0.1.3: - dependencies: - fs-exists-sync: 0.1.0 - resolve-dir: 0.1.1 - - find-pkg@0.1.2: - dependencies: - find-file-up: 0.1.3 - find-root@1.1.0: {} find-up@1.1.2: @@ -28217,8 +26092,6 @@ snapshots: object.pick: 1.3.0 parse-filepath: 1.0.2 - first-chunk-stream@1.0.0: {} - first-chunk-stream@2.0.0: dependencies: readable-stream: 2.3.8 @@ -28309,14 +26182,8 @@ snapshots: dependencies: is-callable: 1.2.7 - for-in@0.1.8: {} - for-in@1.0.2: {} - for-own@0.1.5: - dependencies: - for-in: 1.0.2 - for-own@1.0.0: dependencies: for-in: 1.0.2 @@ -28427,8 +26294,6 @@ snapshots: fs-constants@1.0.0: {} - fs-exists-sync@0.1.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -28591,8 +26456,6 @@ snapshots: get-port@6.1.2: {} - get-stdin@5.0.1: {} - get-stream@5.2.0: dependencies: pump: 3.0.0 @@ -28616,20 +26479,8 @@ snapshots: transitivePeerDependencies: - supports-color - get-value@1.3.1: - dependencies: - arr-flatten: 1.1.0 - is-extendable: 0.1.1 - lazy-cache: 0.2.7 - noncharacters: 1.1.0 - get-value@2.0.6: {} - get-view@0.1.3: - dependencies: - isobject: 3.0.1 - match-file: 0.2.2 - getos@3.2.1: dependencies: async: 3.2.5 @@ -28638,19 +26489,6 @@ snapshots: dependencies: assert-plus: 1.0.0 - git-config-path@1.0.1: - dependencies: - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - homedir-polyfill: 1.0.3 - - git-repo-name@0.6.0: - dependencies: - cwd: 0.9.1 - file-name: 0.1.0 - lazy-cache: 1.0.4 - remote-origin-url: 0.5.3 - github-from-package@0.0.0: {} github-slugger@1.5.0: {} @@ -28661,15 +26499,6 @@ snapshots: transitivePeerDependencies: - encoding - glob-base@0.3.0: - dependencies: - glob-parent: 2.0.0 - is-glob: 2.0.1 - - glob-parent@2.0.0: - dependencies: - is-glob: 2.0.1 - glob-parent@3.1.0: dependencies: is-glob: 3.1.0 @@ -28683,17 +26512,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-stream@5.3.5: - dependencies: - extend: 3.0.2 - glob: 5.0.15 - glob-parent: 3.1.0 - micromatch: 2.3.11 - ordered-read-streams: 0.3.0 - through2: 0.6.5 - to-absolute-glob: 0.1.1 - unique-stream: 2.3.1 - glob-stream@6.1.0: dependencies: extend: 3.0.2 @@ -28729,14 +26547,6 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.1 - glob@5.0.15: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - glob@7.1.6: dependencies: fs.realpath: 1.0.0 @@ -28767,11 +26577,6 @@ snapshots: dependencies: ini: 2.0.0 - global-modules@0.2.3: - dependencies: - global-prefix: 0.1.5 - is-windows: 0.2.0 - global-modules@1.0.0: dependencies: global-prefix: 1.0.2 @@ -28782,13 +26587,6 @@ snapshots: dependencies: global-prefix: 3.0.0 - global-prefix@0.1.5: - dependencies: - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 0.2.0 - which: 1.3.1 - global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 @@ -28928,13 +26726,6 @@ snapshots: graphql@16.8.1: {} - gray-matter@3.1.1: - dependencies: - extend-shallow: 2.0.1 - js-yaml: 3.14.1 - kind-of: 5.1.0 - strip-bom-string: 1.0.0 - groq-sdk@0.3.2(encoding@0.1.13): dependencies: '@types/node': 18.19.23 @@ -28949,15 +26740,6 @@ snapshots: transitivePeerDependencies: - encoding - group-array@0.3.4: - dependencies: - arr-flatten: 1.1.0 - for-own: 0.1.5 - get-value: 2.0.6 - kind-of: 3.2.2 - split-string: 1.0.1 - union-value: 1.0.1 - grouped-queue@2.0.0: {} grpc-tools@1.12.4(encoding@0.1.13): @@ -28986,14 +26768,6 @@ snapshots: guid-typescript@1.0.9: {} - gulp-choose-files@0.1.3: - dependencies: - extend-shallow: 2.0.1 - question-cache: 0.5.1 - through2: 2.0.5 - transitivePeerDependencies: - - supports-color - gulp-cli@2.3.0: dependencies: ansi-colors: 1.1.0 @@ -29017,14 +26791,6 @@ snapshots: transitivePeerDependencies: - supports-color - gulp-sourcemaps@1.6.0: - dependencies: - convert-source-map: 1.9.0 - graceful-fs: 4.2.11 - strip-bom: 2.0.0 - through2: 2.0.5 - vinyl: 1.2.0 - gulp@4.0.2: dependencies: glob-watcher: 5.0.5 @@ -29056,16 +26822,6 @@ snapshots: has-flag@4.0.0: {} - has-glob@0.1.1: - dependencies: - is-glob: 2.0.1 - - has-glob@1.0.0: - dependencies: - is-glob: 3.1.0 - - has-own-deep@0.1.4: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 @@ -29202,12 +26958,6 @@ snapshots: he@1.2.0: {} - helper-cache@0.7.2: - dependencies: - extend-shallow: 2.0.1 - lazy-cache: 0.2.7 - lodash.bind: 3.1.0 - hey-listen@1.0.8: {} highlight.js@10.7.3: {} @@ -29495,15 +27245,11 @@ snapshots: infer-owner@1.0.4: {} - inflection@1.13.4: {} - inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - info-symbol@0.1.0: {} - infobox-parser@3.6.4: dependencies: camelcase: 4.1.0 @@ -29518,28 +27264,6 @@ snapshots: inline-style-parser@0.1.1: {} - inquirer2@0.1.1: - dependencies: - ansi-escapes: 1.4.0 - ansi-regex: 2.1.1 - arr-flatten: 1.1.0 - arr-pluck: 0.1.0 - array-unique: 0.2.1 - chalk: 1.1.3 - cli-cursor: 1.0.2 - cli-width: 1.1.1 - extend-shallow: 2.0.1 - figures: 1.7.0 - is-number: 2.1.0 - is-plain-object: 2.0.4 - lazy-cache: 1.0.4 - lodash.where: 3.1.0 - readline2: 1.0.1 - run-async: 0.1.0 - rx-lite: 4.0.8 - strip-color: 0.1.0 - through2: 2.0.5 - inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 @@ -29595,11 +27319,6 @@ snapshots: ipaddr.js@2.1.0: {} - is-absolute@0.2.6: - dependencies: - is-relative: 0.2.1 - is-windows: 0.2.0 - is-absolute@1.0.0: dependencies: is-relative: 1.0.0 @@ -29616,12 +27335,6 @@ snapshots: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - is-answer@0.1.1: - dependencies: - has-values: 0.1.4 - is-primitive: 2.0.0 - omit-empty: 0.4.1 - is-any-array@2.0.1: {} is-arguments@1.1.1: @@ -29646,10 +27359,6 @@ snapshots: dependencies: has-bigints: 1.0.2 - is-binary-buffer@1.0.0: - dependencies: - is-buffer: 1.1.6 - is-binary-path@1.0.1: dependencies: binary-extensions: 1.13.1 @@ -29699,20 +27408,12 @@ snapshots: is-docker@2.2.1: {} - is-dotfile@1.0.3: {} - - is-equal-shallow@0.1.3: - dependencies: - is-primitive: 2.0.0 - is-extendable@0.1.1: {} is-extendable@1.0.1: dependencies: is-plain-object: 2.0.4 - is-extglob@1.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -29735,12 +27436,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-generator@1.0.3: {} - - is-glob@2.0.1: - dependencies: - is-extglob: 1.0.0 - is-glob@3.1.0: dependencies: is-extglob: 2.1.1 @@ -29772,10 +27467,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-number@2.1.0: - dependencies: - kind-of: 3.2.2 - is-number@3.0.0: dependencies: kind-of: 3.2.2 @@ -29802,12 +27493,8 @@ snapshots: is-plain-object@5.0.0: {} - is-posix-bracket@0.1.1: {} - is-potential-custom-element-name@1.0.1: {} - is-primitive@2.0.0: {} - is-property@1.0.2: {} is-reference@3.0.2: @@ -29821,15 +27508,6 @@ snapshots: is-regexp@1.0.0: {} - is-registered@0.1.5: - dependencies: - define-property: 0.2.5 - isobject: 2.1.0 - - is-relative@0.2.1: - dependencies: - is-unc-path: 0.1.2 - is-relative@1.0.0: dependencies: is-unc-path: 1.0.0 @@ -29848,8 +27526,6 @@ snapshots: dependencies: call-bind: 1.0.7 - is-stream@1.1.0: {} - is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -29868,10 +27544,6 @@ snapshots: is-typedarray@1.0.0: {} - is-unc-path@0.1.2: - dependencies: - unc-path-regex: 0.1.2 - is-unc-path@1.0.0: dependencies: unc-path-regex: 0.1.2 @@ -29880,52 +27552,8 @@ snapshots: is-utf8@0.2.1: {} - is-valid-app@0.1.2: - dependencies: - debug: 2.6.9 - is-registered: 0.1.5 - is-valid-instance: 0.1.0 - lazy-cache: 2.0.2 - transitivePeerDependencies: - - supports-color - - is-valid-app@0.2.1: - dependencies: - debug: 2.6.9 - is-registered: 0.1.5 - is-valid-instance: 0.2.0 - lazy-cache: 2.0.2 - transitivePeerDependencies: - - supports-color - - is-valid-app@0.3.0: - dependencies: - debug: 2.6.9 - is-registered: 0.1.5 - is-valid-instance: 0.3.0 - lazy-cache: 2.0.2 - transitivePeerDependencies: - - supports-color - - is-valid-glob@0.3.0: {} - is-valid-glob@1.0.0: {} - is-valid-instance@0.1.0: - dependencies: - isobject: 2.1.0 - pascalcase: 0.1.1 - - is-valid-instance@0.2.0: - dependencies: - isobject: 2.1.0 - pascalcase: 0.1.1 - - is-valid-instance@0.3.0: - dependencies: - isobject: 3.0.1 - pascalcase: 0.1.1 - is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -29937,18 +27565,12 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is-whitespace@0.3.0: {} - - is-windows@0.2.0: {} - is-windows@1.0.2: {} is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - isarray@0.0.1: {} - isarray@1.0.0: {} isarray@2.0.5: {} @@ -29959,8 +27581,6 @@ snapshots: isexe@2.0.0: {} - isobject@1.0.2: {} - isobject@2.1.0: dependencies: isarray: 1.0.0 @@ -30748,12 +28368,6 @@ snapshots: get-them-args: 1.3.2 shell-exec: 1.0.2 - kind-of@1.1.0: {} - - kind-of@2.0.1: - dependencies: - is-buffer: 1.1.6 - kind-of@3.2.2: dependencies: is-buffer: 1.1.6 @@ -30800,7 +28414,7 @@ snapshots: '@langchain/anthropic': 0.2.1(encoding@0.1.13)(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13)) '@langchain/aws': 0.0.9(@aws-sdk/client-sso-oidc@3.624.0(@aws-sdk/client-sts@3.624.0))(@aws-sdk/client-sts@3.624.0)(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13)) '@langchain/cohere': 0.0.7(encoding@0.1.13)(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13)) - '@langchain/community': 0.2.17(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-bedrock-agent-runtime@3.625.0)(@aws-sdk/client-bedrock-runtime@3.422.0)(@aws-sdk/client-dynamodb@3.529.1)(@aws-sdk/client-kendra@3.624.0)(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@datastax/astra-db-ts@0.1.4)(@elastic/elasticsearch@8.12.2)(@getzep/zep-cloud@1.0.7)(@getzep/zep-js@0.9.0)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@google-ai/generativelanguage@2.6.0(encoding@0.1.13))(@huggingface/inference@2.6.4)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@opensearch-project/opensearch@1.2.0)(@pinecone-database/pinecone@2.2.2)(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@smithy/eventstream-codec@3.1.2)(@smithy/protocol-http@4.1.0)(@smithy/signature-v4@4.1.0)(@smithy/util-utf8@3.0.0)(@supabase/postgrest-js@1.9.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@upstash/redis@1.22.1(encoding@0.1.13))(@upstash/vector@1.1.5)(@xenova/transformers@2.17.1)(@zilliz/milvus2-sdk-node@2.3.5)(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(cohere-ai@7.10.0(encoding@0.1.13))(couchbase@4.3.1)(crypto-js@4.2.0)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(google-auth-library@9.6.3(encoding@0.1.13))(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(lodash@4.17.21)(lunary@0.6.16(openai@4.51.0(encoding@0.1.13))(react@18.2.0))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(pg@8.11.3)(playwright@1.42.1)(portkey-ai@0.1.16)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(replicate@0.31.1)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/community': 0.2.17(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-bedrock-agent-runtime@3.625.0)(@aws-sdk/client-bedrock-runtime@3.422.0)(@aws-sdk/client-dynamodb@3.529.1)(@aws-sdk/client-kendra@3.624.0)(@aws-sdk/client-s3@3.529.1)(@aws-sdk/credential-provider-node@3.529.1)(@datastax/astra-db-ts@0.1.4)(@elastic/elasticsearch@8.12.2)(@getzep/zep-cloud@1.0.7)(@getzep/zep-js@0.9.0)(@gomomento/sdk-core@1.68.1)(@gomomento/sdk@1.68.1(encoding@0.1.13))(@google-ai/generativelanguage@2.6.0(encoding@0.1.13))(@huggingface/inference@2.6.4)(@mendable/firecrawl-js@0.0.28)(@notionhq/client@2.2.14(encoding@0.1.13))(@opensearch-project/opensearch@1.2.0)(@pinecone-database/pinecone@2.2.2)(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@smithy/eventstream-codec@3.1.2)(@smithy/protocol-http@4.1.0)(@smithy/signature-v4@4.1.0)(@smithy/util-utf8@3.0.0)(@supabase/postgrest-js@1.9.2)(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@upstash/redis@1.22.1(encoding@0.1.13))(@upstash/vector@1.1.5)(@xenova/transformers@2.17.1)(@zilliz/milvus2-sdk-node@2.3.5)(apify-client@2.9.3)(assemblyai@4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.6.2)(cheerio@1.0.0-rc.12)(chromadb@1.8.1(@google/generative-ai@0.15.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.51.0(encoding@0.1.13)))(cohere-ai@7.10.0(encoding@0.1.13))(couchbase@4.3.1)(crypto-js@4.2.0)(d3-dsv@2.0.0)(encoding@0.1.13)(faiss-node@0.5.1)(fast-xml-parser@4.4.1)(google-auth-library@9.6.3(encoding@0.1.13))(html-to-text@9.0.5)(ignore@5.3.1)(ioredis@5.3.2)(jsdom@22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4))(lodash@4.17.21)(lunary@0.7.10(openai@4.51.0(encoding@0.1.13))(react@18.2.0))(mammoth@1.7.0)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(notion-to-md@3.1.1(encoding@0.1.13))(openai@4.51.0(encoding@0.1.13))(pdf-parse@1.1.1)(pg@8.11.3)(playwright@1.42.1)(portkey-ai@0.1.16)(puppeteer@20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4))(pyodide@0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(redis@4.6.13)(replicate@0.31.1)(srt-parser-2@1.2.3)(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(gcp-metadata@6.1.0(encoding@0.1.13))(socks@2.8.1))(mysql2@3.9.2)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)))(weaviate-ts-client@1.6.0(encoding@0.1.13)(graphql@16.8.1))(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@langchain/google-genai': 0.0.22(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13))(zod@3.22.4) '@langchain/google-vertexai': 0.0.19(encoding@0.1.13)(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13))(zod@3.22.4) '@langchain/groq': 0.0.8(encoding@0.1.13)(langchain@0.2.11)(openai@4.51.0(encoding@0.1.13)) @@ -31003,23 +28617,8 @@ snapshots: picocolors: 1.0.0 shell-quote: 1.8.1 - layouts@0.11.0: - dependencies: - delimiter-regex: 1.3.1 - falsey: 0.3.2 - get-view: 0.1.3 - lazy-cache: 1.0.4 - lazy-ass@1.6.0: {} - lazy-cache@0.2.7: {} - - lazy-cache@1.0.4: {} - - lazy-cache@2.0.2: - dependencies: - set-getter: 0.1.1 - lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -31174,14 +28773,6 @@ snapshots: dependencies: tiktoken: 1.0.15 - load-helpers@0.2.11: - dependencies: - extend-shallow: 2.0.1 - is-valid-glob: 0.3.0 - lazy-cache: 2.0.2 - matched: 0.4.4 - resolve-dir: 0.1.1 - load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -31190,32 +28781,6 @@ snapshots: pinkie-promise: 2.0.1 strip-bom: 2.0.0 - load-pkg@3.0.1: - dependencies: - find-pkg: 0.1.2 - - load-templates@0.11.4: - dependencies: - define-property: 0.2.5 - extend-shallow: 2.0.1 - glob-parent: 2.0.0 - has-glob: 0.1.1 - is-valid-glob: 0.3.0 - lazy-cache: 2.0.2 - matched: 0.4.4 - to-file: 0.2.0 - - load-templates@1.0.2: - dependencies: - extend-shallow: 2.0.1 - file-contents: 1.0.1 - glob-parent: 3.1.0 - is-glob: 3.1.0 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - matched: 0.4.4 - vinyl: 2.2.1 - load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -31250,60 +28815,8 @@ snapshots: lodash-es@4.17.21: {} - lodash._arrayfilter@3.0.0: {} - - lodash._basecallback@3.3.1: - dependencies: - lodash._baseisequal: 3.0.7 - lodash._bindcallback: 3.0.1 - lodash.isarray: 3.0.4 - lodash.pairs: 3.0.1 - - lodash._baseeach@3.0.4: - dependencies: - lodash.keys: 3.1.2 - - lodash._basefilter@3.0.0: - dependencies: - lodash._baseeach: 3.0.4 - - lodash._baseisequal@3.0.7: - dependencies: - lodash.isarray: 3.0.4 - lodash.istypedarray: 3.0.6 - lodash.keys: 3.1.2 - - lodash._baseismatch@3.1.3: - dependencies: - lodash._baseisequal: 3.0.7 - - lodash._basematches@3.2.0: - dependencies: - lodash._baseismatch: 3.1.3 - lodash.pairs: 3.0.1 - - lodash._bindcallback@3.0.1: {} - - lodash._createwrapper@3.2.0: - dependencies: - lodash._root: 3.0.1 - - lodash._getnative@3.9.1: {} - lodash._reinterpolate@3.0.0: {} - lodash._replaceholders@3.0.0: {} - - lodash._root@3.0.1: {} - - lodash.assign@4.2.0: {} - - lodash.bind@3.1.0: - dependencies: - lodash._createwrapper: 3.2.0 - lodash._replaceholders: 3.0.0 - lodash.restparam: 3.6.1 - lodash.camelcase@4.3.0: {} lodash.curry@4.1.1: {} @@ -31312,39 +28825,17 @@ snapshots: lodash.defaults@4.2.0: {} - lodash.filter@4.6.0: {} - - lodash.flatten@4.4.0: {} - lodash.flow@3.5.0: {} - lodash.foreach@4.5.0: {} - lodash.get@4.4.2: {} - lodash.initial@4.1.1: {} - lodash.isarguments@3.1.0: {} - lodash.isarray@3.0.4: {} - lodash.isequal@4.5.0: {} lodash.isplainobject@4.0.6: optional: true - lodash.istypedarray@3.0.6: {} - - lodash.keys@3.1.2: - dependencies: - lodash._getnative: 3.9.1 - lodash.isarguments: 3.1.0 - lodash.isarray: 3.0.4 - - lodash.last@3.0.0: {} - - lodash.map@4.6.0: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -31353,12 +28844,6 @@ snapshots: lodash.once@4.1.1: {} - lodash.pairs@3.0.1: - dependencies: - lodash.keys: 3.1.2 - - lodash.restparam@3.6.1: {} - lodash.sortby@4.7.0: {} lodash.template@4.5.0: @@ -31372,21 +28857,8 @@ snapshots: lodash.uniq@4.5.0: {} - lodash.where@3.1.0: - dependencies: - lodash._arrayfilter: 3.0.0 - lodash._basecallback: 3.3.1 - lodash._basefilter: 3.0.0 - lodash._basematches: 3.2.0 - lodash.isarray: 3.0.4 - lodash@4.17.21: {} - log-ok@0.1.1: - dependencies: - ansi-green: 0.1.1 - success-symbol: 0.1.0 - log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -31407,26 +28879,6 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 8.1.0 - log-utils@0.1.5: - dependencies: - ansi-colors: 0.1.0 - error-symbol: 0.1.0 - info-symbol: 0.1.0 - log-ok: 0.1.1 - success-symbol: 0.1.0 - time-stamp: 1.1.0 - warning-symbol: 0.1.0 - - log-utils@0.2.1: - dependencies: - ansi-colors: 0.2.0 - error-symbol: 0.1.0 - info-symbol: 0.1.0 - log-ok: 0.1.1 - success-symbol: 0.1.0 - time-stamp: 1.1.0 - warning-symbol: 0.1.0 - logform@2.6.0: dependencies: '@colors/colors': 1.6.0 @@ -31442,8 +28894,6 @@ snapshots: longest-streak@3.1.0: {} - longest@1.0.1: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -31454,8 +28904,6 @@ snapshots: option: 0.2.4 underscore: 1.13.6 - lower-case@1.1.4: {} - lower-case@2.0.2: dependencies: tslib: 2.6.2 @@ -31493,15 +28941,12 @@ snapshots: lru-cache@9.1.2: {} - lunary@0.6.16(openai@4.51.0(encoding@0.1.13))(react@18.2.0): + lunary@0.7.10(openai@4.51.0(encoding@0.1.13))(react@18.2.0): dependencies: unctx: 2.3.1 - update: 0.7.4 optionalDependencies: openai: 4.51.0(encoding@0.1.13) react: 18.2.0 - transitivePeerDependencies: - - supports-color lz-string@1.5.0: {} @@ -31519,10 +28964,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magic-string@0.30.8: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -31633,43 +29074,8 @@ snapshots: map-cache@0.2.2: {} - map-config@0.5.0: - dependencies: - array-unique: 0.2.1 - async: 1.5.2 - - map-schema@0.2.4: - dependencies: - arr-union: 3.1.0 - collection-visit: 0.2.3 - component-emitter: 1.3.1 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - get-value: 2.0.6 - is-primitive: 2.0.0 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - log-utils: 0.2.1 - longest: 1.0.1 - mixin-deep: 1.3.2 - object.omit: 2.0.1 - object.pick: 1.3.0 - omit-empty: 0.4.1 - pad-right: 0.2.2 - set-value: 0.4.3 - sort-object-arrays: 0.1.1 - union-value: 0.2.4 - transitivePeerDependencies: - - supports-color - map-stream@0.1.0: {} - map-visit@0.1.5: - dependencies: - lazy-cache: 2.0.2 - object-visit: 0.3.4 - map-visit@1.0.0: dependencies: object-visit: 1.0.1 @@ -31680,12 +29086,6 @@ snapshots: markdown-table@3.0.3: {} - match-file@0.2.2: - dependencies: - is-glob: 3.1.0 - isobject: 3.0.1 - micromatch: 2.3.11 - matchdep@2.0.0: dependencies: findup-sync: 2.0.0 @@ -31695,31 +29095,8 @@ snapshots: transitivePeerDependencies: - supports-color - matched@0.4.4: - dependencies: - arr-union: 3.1.0 - async-array-reduce: 0.2.1 - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - glob: 7.2.3 - has-glob: 0.1.1 - is-valid-glob: 0.3.0 - lazy-cache: 2.0.2 - resolve-dir: 0.1.1 - - matched@1.0.2: - dependencies: - arr-union: 3.1.0 - async-array-reduce: 0.2.1 - glob: 7.2.3 - has-glob: 1.0.0 - is-valid-glob: 1.0.0 - resolve-dir: 1.0.1 - material-colors@1.2.6: {} - math-random@1.0.4: {} - mathjax-full@3.2.2: dependencies: esm: 3.2.25 @@ -31917,31 +29294,10 @@ snapshots: readable-stream: 3.6.2 optional: true - merge-deep@3.0.3: - dependencies: - arr-union: 3.1.0 - clone-deep: 0.2.4 - kind-of: 3.2.2 - merge-descriptors@1.0.1: {} - merge-stream@0.1.8: - dependencies: - through2: 0.6.5 - - merge-stream@1.0.1: - dependencies: - readable-stream: 2.3.8 - merge-stream@2.0.0: {} - merge-value@1.0.0: - dependencies: - get-value: 2.0.6 - is-extendable: 1.0.1 - mixin-deep: 1.3.2 - set-value: 2.0.1 - merge2@1.4.1: {} methods@1.1.2: {} @@ -32173,22 +29529,6 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@2.3.11: - dependencies: - arr-diff: 2.0.0 - array-unique: 0.2.1 - braces: 1.8.5 - expand-brackets: 0.1.5 - extglob: 0.3.2 - filename-regex: 2.0.1 - is-extglob: 1.0.0 - is-glob: 2.0.1 - kind-of: 3.2.2 - normalize-path: 2.1.1 - object.omit: 2.0.1 - parse-glob: 3.0.4 - regex-cache: 0.4.4 - micromatch@3.1.10: dependencies: arr-diff: 4.0.0 @@ -32328,11 +29668,6 @@ snapshots: for-in: 1.0.2 is-extendable: 1.0.1 - mixin-object@2.0.1: - dependencies: - for-in: 0.1.8 - is-extendable: 0.1.1 - mj-context-menu@0.6.1: {} mkdirp-classic@0.5.3: {} @@ -32440,8 +29775,6 @@ snapshots: mute-stdout@1.0.1: {} - mute-stream@0.0.5: {} - mute-stream@0.0.8: {} mysql2@3.9.2: @@ -32492,8 +29825,6 @@ snapshots: transitivePeerDependencies: - supports-color - nanoseconds@0.1.0: {} - napi-build-utils@1.0.2: {} natural-compare-lite@1.4.0: {} @@ -32508,14 +29839,8 @@ snapshots: netmask@2.0.2: {} - next-tick@0.2.2: {} - next-tick@1.1.0: {} - no-case@2.3.2: - dependencies: - lower-case: 1.1.4 - no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -32608,8 +29933,6 @@ snapshots: touch: 3.1.0 undefsafe: 2.0.5 - noncharacters@1.1.0: {} - nopt@1.0.10: dependencies: abbrev: 1.1.1 @@ -32649,29 +29972,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-pkg@0.3.20: - dependencies: - arr-union: 3.1.0 - array-unique: 0.3.2 - component-emitter: 1.3.1 - export-files: 2.1.1 - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - get-value: 2.0.6 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - map-schema: 0.2.4 - minimist: 1.2.8 - mixin-deep: 1.3.2 - omit-empty: 0.4.1 - parse-git-config: 1.1.1 - repo-utils: 0.3.7 - semver: 5.7.2 - stringify-author: 0.1.3 - write-json: 0.2.2 - transitivePeerDependencies: - - supports-color - normalize-range@0.1.2: {} normalize-url@6.1.0: {} @@ -32701,10 +30001,6 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.2.65)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.4(@types/react@18.2.65)(react@18.2.0))(@types/react@18.2.65)(react@18.2.0) - now-and-later@0.0.6: - dependencies: - once: 1.4.0 - now-and-later@2.0.1: dependencies: once: 1.4.0 @@ -32854,10 +30150,6 @@ snapshots: object-treeify@1.1.33: {} - object-visit@0.3.4: - dependencies: - isobject: 2.1.0 - object-visit@1.0.1: dependencies: isobject: 3.0.1 @@ -32914,11 +30206,6 @@ snapshots: for-own: 1.0.0 make-iterator: 1.0.1 - object.omit@2.0.1: - dependencies: - for-own: 0.1.5 - is-extendable: 0.1.1 - object.pick@1.3.0: dependencies: isobject: 3.0.1 @@ -32973,29 +30260,12 @@ snapshots: dependencies: whatwg-fetch: 3.6.20 - omit-empty@0.3.6: - dependencies: - has-values: 0.1.4 - is-date-object: 1.0.5 - isobject: 2.1.0 - reduce-object: 0.1.3 - - omit-empty@0.4.1: - dependencies: - has-values: 0.1.4 - kind-of: 3.2.2 - reduce-object: 0.1.3 - on-finished@2.4.1: dependencies: ee-first: 1.1.1 on-headers@1.0.2: {} - once@1.3.3: - dependencies: - wrappy: 1.0.2 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -33004,8 +30274,6 @@ snapshots: dependencies: fn.name: 1.1.0 - onetime@1.1.0: {} - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -33057,18 +30325,6 @@ snapshots: openapi-typescript-fetch@1.1.3: {} - option-cache@3.5.0: - dependencies: - arr-flatten: 1.1.0 - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 0.3.1 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - set-value: 0.4.3 - to-object-path: 0.3.0 - option@0.2.4: {} optionator@0.8.3: @@ -33101,11 +30357,6 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - ordered-read-streams@0.3.0: - dependencies: - is-stream: 1.1.0 - readable-stream: 2.3.8 - ordered-read-streams@1.0.1: dependencies: readable-stream: 2.3.8 @@ -33248,12 +30499,6 @@ snapshots: - bluebird - supports-color - pad-right@0.2.2: - dependencies: - repeat-string: 1.6.1 - - paginationator@0.1.4: {} - pako@1.0.11: {} papaparse@5.4.1: {} @@ -33267,8 +30512,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-author@1.0.0: {} - parse-conflict-json@2.0.2: dependencies: json-parse-even-better-errors: 2.3.1 @@ -33299,22 +30542,6 @@ snapshots: map-cache: 0.2.2 path-root: 0.1.1 - parse-git-config@1.1.1: - dependencies: - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - git-config-path: 1.0.1 - ini: 1.3.8 - - parse-github-url@0.3.2: {} - - parse-glob@3.0.4: - dependencies: - glob-base: 0.3.0 - is-dotfile: 1.0.3 - is-extglob: 1.0.0 - is-glob: 2.0.1 - parse-json@2.2.0: dependencies: error-ex: 1.3.2 @@ -33359,16 +30586,6 @@ snapshots: leac: 0.6.0 peberminta: 0.9.0 - parser-front-matter@1.6.4: - dependencies: - extend-shallow: 2.0.1 - file-is-binary: 1.0.0 - gray-matter: 3.1.1 - isobject: 3.0.1 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - trim-leading-lines: 0.1.1 - parseurl@1.3.3: {} pascal-case@3.1.2: @@ -33418,10 +30635,6 @@ snapshots: path-to-regexp@0.1.7: {} - path-to-regexp@1.8.0: - dependencies: - isarray: 0.0.1 - path-type@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -33567,14 +30780,6 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-store@0.2.2: - dependencies: - cache-base: 0.8.5 - kind-of: 3.2.2 - lazy-cache: 1.0.4 - union-value: 0.2.4 - write-json: 0.2.2 - pkg-up@3.1.0: dependencies: find-up: 3.0.0 @@ -34090,8 +31295,6 @@ snapshots: prelude-ls@1.2.1: {} - preserve@0.2.0: {} - prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 @@ -34152,11 +31355,6 @@ snapshots: prettier: 3.2.5 tslib: 2.6.2 - pretty-time@0.2.0: - dependencies: - is-number: 2.1.0 - nanoseconds: 0.1.0 - prism-react-renderer@1.3.5(react@18.2.0): dependencies: react: 18.2.0 @@ -34181,12 +31379,6 @@ snapshots: progress@2.0.3: {} - project-name@0.2.6: - dependencies: - find-pkg: 0.1.2 - git-repo-name: 0.6.0 - minimist: 1.2.8 - promise-all-reject-late@1.0.1: {} promise-call-limit@1.0.2: {} @@ -34410,66 +31602,6 @@ snapshots: querystringify@2.2.0: {} - question-cache@0.4.0: - dependencies: - arr-flatten: 1.1.0 - arr-union: 3.1.0 - async: 1.5.2 - debug: 2.6.9 - define-property: 0.2.5 - get-value: 2.0.6 - has-value: 0.3.1 - inquirer2: 0.1.1 - is-answer: 0.1.1 - isobject: 2.1.0 - lazy-cache: 1.0.4 - mixin-deep: 1.3.2 - omit-empty: 0.3.6 - option-cache: 3.5.0 - os-homedir: 1.0.2 - project-name: 0.2.6 - set-value: 0.3.3 - to-choices: 0.2.0 - use: 1.1.2 - transitivePeerDependencies: - - supports-color - - question-cache@0.5.1: - dependencies: - arr-flatten: 1.1.0 - arr-union: 3.1.0 - async-each-series: 1.1.0 - debug: 2.6.9 - define-property: 0.2.5 - get-value: 2.0.6 - has-value: 0.3.1 - inquirer2: 0.1.1 - is-answer: 0.1.1 - isobject: 2.1.0 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - omit-empty: 0.4.1 - option-cache: 3.5.0 - os-homedir: 1.0.2 - project-name: 0.2.6 - set-value: 0.3.3 - to-choices: 0.2.0 - use: 2.0.2 - transitivePeerDependencies: - - supports-color - - question-store@0.11.1: - dependencies: - common-config: 0.1.1 - data-store: 0.16.1 - debug: 2.6.9 - is-answer: 0.1.1 - lazy-cache: 2.0.2 - project-name: 0.2.6 - question-cache: 0.5.1 - transitivePeerDependencies: - - supports-color - queue-microtask@1.2.3: {} queue-tick@1.0.1: {} @@ -34485,12 +31617,6 @@ snapshots: fs-promise: 2.0.3 lodash: 4.17.21 - randomatic@3.1.1: - dependencies: - is-number: 4.0.0 - kind-of: 6.0.3 - math-random: 1.0.4 - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -34877,8 +32003,6 @@ snapshots: read-cmd-shim@3.0.1: {} - read-file@0.2.0: {} - read-package-json-fast@2.0.3: dependencies: json-parse-even-better-errors: 2.3.1 @@ -34920,13 +32044,6 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -34970,12 +32087,6 @@ snapshots: dependencies: picomatch: 2.3.1 - readline2@1.0.1: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - mute-stream: 0.0.5 - rechoir@0.6.2: dependencies: resolve: 1.22.8 @@ -35008,10 +32119,6 @@ snapshots: '@redis/search': 1.1.6(@redis/client@1.5.14) '@redis/time-series': 1.0.5(@redis/client@1.5.14) - reduce-object@0.1.3: - dependencies: - for-own: 0.1.5 - redux@4.2.1: dependencies: '@babel/runtime': 7.24.0 @@ -35058,10 +32165,6 @@ snapshots: dependencies: '@babel/runtime': 7.24.0 - regex-cache@0.4.4: - dependencies: - is-equal-shallow: 0.1.3 - regex-not@1.0.2: dependencies: extend-shallow: 3.0.2 @@ -35113,10 +32216,6 @@ snapshots: relateurl@0.2.7: {} - relative@3.0.2: - dependencies: - isobject: 2.1.0 - remark-gfm@3.0.1: dependencies: '@types/mdast': 3.0.15 @@ -35148,10 +32247,6 @@ snapshots: mdast-util-to-hast: 12.3.0 unified: 10.1.2 - remote-origin-url@0.5.3: - dependencies: - parse-git-config: 1.1.1 - remove-bom-buffer@3.0.0: dependencies: is-buffer: 1.1.6 @@ -35181,8 +32276,6 @@ snapshots: dependencies: is-finite: 1.1.0 - replace-ext@0.0.1: {} - replace-ext@1.0.1: {} replace-homedir@1.0.0: @@ -35195,21 +32288,6 @@ snapshots: optionalDependencies: readable-stream: 4.5.2 - repo-utils@0.3.7: - dependencies: - extend-shallow: 2.0.1 - get-value: 2.0.6 - git-config-path: 1.0.1 - is-absolute: 0.2.6 - kind-of: 3.2.2 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - omit-empty: 0.4.1 - parse-author: 1.0.0 - parse-git-config: 1.1.1 - parse-github-url: 0.3.2 - project-name: 0.2.6 - request-progress@3.0.0: dependencies: throttleit: 1.0.1 @@ -35230,49 +32308,15 @@ snapshots: dependencies: resolve-from: 5.0.0 - resolve-dir@0.1.1: - dependencies: - expand-tilde: 1.2.2 - global-modules: 0.2.3 - resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - resolve-file@0.2.2: - dependencies: - cwd: 0.10.0 - expand-tilde: 2.0.2 - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - global-modules: 0.2.3 - homedir-polyfill: 1.0.3 - lazy-cache: 2.0.2 - resolve: 1.22.8 - - resolve-file@0.3.0: - dependencies: - cwd: 0.10.0 - expand-tilde: 2.0.2 - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - homedir-polyfill: 1.0.3 - lazy-cache: 2.0.2 - resolve: 1.22.8 - resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve-glob@1.0.0: - dependencies: - extend-shallow: 2.0.1 - is-valid-glob: 1.0.0 - matched: 1.0.2 - relative: 3.0.2 - resolve-dir: 1.0.1 - resolve-options@1.1.0: dependencies: value-or-function: 3.0.0 @@ -35305,11 +32349,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - restore-cursor@1.0.1: - dependencies: - exit-hook: 1.1.1 - onetime: 1.1.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -35322,15 +32361,6 @@ snapshots: ret@0.1.15: {} - rethrow@0.2.3: - dependencies: - ansi-bgred: 0.1.1 - ansi-red: 0.1.1 - ansi-yellow: 0.1.1 - extend-shallow: 1.1.4 - lazy-cache: 0.2.7 - right-align: 0.1.3 - retry-request@7.0.2(encoding@0.1.13): dependencies: '@types/request': 2.48.12 @@ -35348,14 +32378,6 @@ snapshots: rfdc@1.3.1: {} - right-align@0.1.3: - dependencies: - align-text: 0.1.4 - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -35405,10 +32427,6 @@ snapshots: dependencies: execa: 5.1.1 - run-async@0.1.0: - dependencies: - once: 1.4.0 - run-async@2.4.1: {} run-parallel@1.2.0: @@ -35421,8 +32439,6 @@ snapshots: rw@1.3.3: {} - rx-lite@4.0.8: {} - rxjs@7.8.1: dependencies: tslib: 2.6.2 @@ -35456,6 +32472,10 @@ snapshots: safer-buffer@2.1.2: {} + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + sanitize-html@2.12.1: dependencies: deepmerge: 4.3.1 @@ -35623,35 +32643,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-getter@0.1.1: - dependencies: - to-object-path: 0.3.0 - - set-value@0.2.0: - dependencies: - isobject: 1.0.2 - noncharacters: 1.1.0 - - set-value@0.3.3: - dependencies: - extend-shallow: 2.0.1 - isobject: 2.1.0 - to-object-path: 0.2.0 - - set-value@0.4.3: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - to-object-path: 0.3.0 - - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - set-value@3.0.3: dependencies: is-plain-object: 2.0.4 @@ -35667,13 +32658,6 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - shallow-clone@0.1.2: - dependencies: - is-extendable: 0.1.1 - kind-of: 2.0.1 - lazy-cache: 0.2.7 - mixin-object: 2.0.1 - shallowequal@1.1.0: {} sharp@0.32.6: @@ -35892,10 +32876,6 @@ snapshots: dependencies: is-plain-obj: 2.1.0 - sort-object-arrays@0.1.1: - dependencies: - kind-of: 3.2.2 - source-list-map@2.0.1: {} source-map-js@1.0.2: {} @@ -35995,10 +32975,6 @@ snapshots: split-on-first@3.0.0: {} - split-string@1.0.1: - dependencies: - extend-shallow: 2.0.1 - split-string@3.1.0: dependencies: extend-shallow: 3.0.2 @@ -36027,12 +33003,6 @@ snapshots: sqlstring@2.3.3: {} - src-stream@0.1.1: - dependencies: - duplexify: 3.7.1 - merge-stream: 0.1.8 - through2: 2.0.5 - srt-parser-2@1.2.3: {} sshpk@1.18.0: @@ -36110,11 +33080,6 @@ snapshots: dependencies: duplexer: 0.1.2 - stream-combiner@0.2.2: - dependencies: - duplexer: 0.1.2 - through: 2.3.8 - stream-events@1.0.5: dependencies: stubs: 3.0.0 @@ -36213,8 +33178,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 - string_decoder@0.10.31: {} - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -36223,8 +33186,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - stringify-author@0.1.3: {} - stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 @@ -36247,25 +33208,11 @@ snapshots: dependencies: is-utf8: 0.2.1 - strip-bom-buffer@0.1.1: - dependencies: - is-buffer: 1.1.6 - is-utf8: 0.2.1 - - strip-bom-stream@1.0.0: - dependencies: - first-chunk-stream: 1.0.0 - strip-bom: 2.0.0 - strip-bom-stream@2.0.0: dependencies: first-chunk-stream: 2.0.0 strip-bom: 2.0.0 - strip-bom-string@0.1.2: {} - - strip-bom-string@1.0.0: {} - strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 @@ -36274,8 +33221,6 @@ snapshots: strip-bom@4.0.0: {} - strip-color@0.1.0: {} - strip-comments@2.0.1: {} strip-eof@1.0.0: {} @@ -36345,8 +33290,6 @@ snapshots: stylis@4.2.0: {} - success-symbol@0.1.0: {} - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -36465,10 +33408,6 @@ snapshots: symbol-tree@3.2.4: {} - tableize-object@0.1.0: - dependencies: - isobject: 2.1.0 - tailwindcss@3.4.1(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@20.12.12)(typescript@5.5.2)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -36557,51 +33496,6 @@ snapshots: temp-dir@2.0.0: {} - template-error@0.1.2: - dependencies: - engine: 0.1.12 - kind-of: 2.0.1 - lazy-cache: 0.2.7 - rethrow: 0.2.3 - - templates@0.24.3: - dependencies: - array-sort: 0.1.4 - async-each: 1.0.6 - base: 0.11.2 - base-data: 0.6.2 - base-engines: 0.2.1 - base-helpers: 0.1.1 - base-option: 0.8.4 - base-plugins: 0.4.13 - base-routes: 0.2.2 - debug: 2.6.9 - deep-bind: 0.3.0 - define-property: 0.2.5 - engine-base: 0.1.3 - export-files: 2.1.1 - extend-shallow: 2.0.1 - falsey: 0.3.2 - get-value: 2.0.6 - get-view: 0.1.3 - group-array: 0.3.4 - has-glob: 0.1.1 - has-value: 0.3.1 - inflection: 1.13.4 - is-valid-app: 0.2.1 - layouts: 0.11.0 - lazy-cache: 2.0.2 - match-file: 0.2.2 - mixin-deep: 1.3.2 - paginationator: 0.1.4 - pascalcase: 0.1.1 - set-value: 0.3.3 - template-error: 0.1.2 - vinyl-item: 0.1.0 - vinyl-view: 0.1.2 - transitivePeerDependencies: - - supports-color - tempy@0.6.0: dependencies: is-stream: 2.0.1 @@ -36656,21 +33550,11 @@ snapshots: throttleit@1.0.1: {} - through2-filter@2.0.0: - dependencies: - through2: 2.0.5 - xtend: 4.0.2 - through2-filter@3.0.0: dependencies: through2: 2.0.5 xtend: 4.0.2 - through2@0.6.5: - dependencies: - readable-stream: 1.0.34 - xtend: 4.0.2 - through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -36686,13 +33570,6 @@ snapshots: tiktoken@1.0.15: {} - time-diff@0.3.1: - dependencies: - extend-shallow: 2.0.1 - is-number: 2.1.0 - log-utils: 0.1.5 - pretty-time: 0.2.0 - time-stamp@1.1.0: {} tiny-emitter@2.1.0: @@ -36714,10 +33591,6 @@ snapshots: tmpl@1.0.5: {} - to-absolute-glob@0.1.1: - dependencies: - extend-shallow: 2.0.1 - to-absolute-glob@2.0.2: dependencies: is-absolute: 1.0.0 @@ -36725,31 +33598,10 @@ snapshots: to-arraybuffer@1.0.1: {} - to-choices@0.2.0: - dependencies: - ansi-gray: 0.1.1 - mixin-deep: 1.3.2 - to-fast-properties@1.0.3: {} to-fast-properties@2.0.0: {} - to-file@0.2.0: - dependencies: - define-property: 0.2.5 - extend-shallow: 2.0.1 - file-contents: 0.2.4 - glob-parent: 2.0.0 - is-valid-glob: 0.3.0 - isobject: 2.1.0 - lazy-cache: 2.0.2 - vinyl: 1.2.0 - - to-object-path@0.2.0: - dependencies: - arr-flatten: 1.1.0 - is-arguments: 1.1.1 - to-object-path@0.3.0: dependencies: kind-of: 3.2.2 @@ -36811,10 +33663,6 @@ snapshots: treeverse@1.0.4: {} - trim-leading-lines@0.1.1: - dependencies: - is-whitespace: 0.3.0 - trim-lines@3.0.1: {} trim-right@1.0.1: {} @@ -36823,6 +33671,10 @@ snapshots: trough@2.2.0: {} + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + tryer@1.0.1: {} ts-api-utils@1.3.0(typescript@5.5.2): @@ -37047,7 +33899,7 @@ snapshots: dependencies: acorn: 8.11.3 estree-walker: 3.0.3 - magic-string: 0.30.8 + magic-string: 0.30.10 unplugin: 1.9.0 undefsafe@2.0.5: {} @@ -37102,19 +33954,12 @@ snapshots: trough: 2.2.0 vfile: 5.3.7 - union-value@0.2.4: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 0.4.3 - union-value@1.0.1: dependencies: arr-union: 3.1.0 get-value: 2.0.6 is-extendable: 0.1.1 - set-value: 2.0.1 + set-value: 3.0.3 unique-filename@1.1.1: dependencies: @@ -37225,11 +34070,6 @@ snapshots: unquote@1.1.1: {} - unset-value@0.1.2: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - unset-value@1.0.0: dependencies: has-value: 0.3.1 @@ -37245,42 +34085,6 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.0 - update@0.7.4: - dependencies: - arr-union: 3.1.0 - assemble-core: 0.25.0 - assemble-loader: 0.6.1 - base-cli-process: 0.1.19 - base-config-process: 0.1.9 - base-generators: 0.4.6 - base-questions: 0.7.4 - base-runtimes: 0.2.0 - base-store: 0.4.4 - common-config: 0.1.1 - data-store: 0.16.1 - export-files: 2.1.1 - extend-shallow: 2.0.1 - find-pkg: 0.1.2 - fs-exists-sync: 0.1.0 - global-modules: 0.2.3 - gulp-choose-files: 0.1.3 - is-valid-app: 0.2.1 - isobject: 2.1.0 - lazy-cache: 2.0.2 - log-utils: 0.2.1 - parser-front-matter: 1.6.4 - resolve-dir: 0.1.1 - resolve-file: 0.2.2 - set-blocking: 2.0.0 - strip-color: 0.1.0 - text-table: 0.2.0 - through2: 2.0.5 - yargs-parser: 2.4.1 - transitivePeerDependencies: - - supports-color - - upper-case@1.1.3: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -37320,17 +34124,6 @@ snapshots: dependencies: react: 18.2.0 - use@1.1.2: - dependencies: - define-property: 0.2.5 - isobject: 2.1.0 - - use@2.0.2: - dependencies: - define-property: 0.2.5 - isobject: 3.0.1 - lazy-cache: 2.0.2 - use@3.1.1: {} utf-8-validate@6.0.4: @@ -37338,6 +34131,8 @@ snapshots: node-gyp-build: 4.8.1 optional: true + utf8-byte-length@1.0.5: {} + util-deprecate@1.0.2: {} util.promisify@1.0.1: @@ -37451,26 +34246,6 @@ snapshots: strip-bom-stream: 2.0.0 vinyl: 2.2.1 - vinyl-fs@2.4.4: - dependencies: - duplexify: 3.7.1 - glob-stream: 5.3.5 - graceful-fs: 4.2.11 - gulp-sourcemaps: 1.6.0 - is-valid-glob: 0.3.0 - lazystream: 1.0.1 - lodash.isequal: 4.5.0 - merge-stream: 1.0.1 - mkdirp: 0.5.6 - object-assign: 4.1.1 - readable-stream: 2.3.8 - strip-bom: 2.0.0 - strip-bom-stream: 1.0.0 - through2: 2.0.5 - through2-filter: 2.0.0 - vali-date: 1.0.0 - vinyl: 1.2.0 - vinyl-fs@3.0.3: dependencies: fs-mkdirp-stream: 1.0.0 @@ -37491,21 +34266,6 @@ snapshots: vinyl: 2.2.1 vinyl-sourcemap: 1.1.0 - vinyl-item@0.1.0: - dependencies: - base: 0.8.1 - base-option: 0.8.4 - base-plugins: 0.4.13 - clone: 1.0.4 - clone-stats: 1.0.0 - define-property: 0.2.5 - extend-shallow: 2.0.1 - isobject: 2.1.0 - lazy-cache: 2.0.2 - vinyl: 1.2.0 - transitivePeerDependencies: - - supports-color - vinyl-sourcemap@1.1.0: dependencies: append-buffer: 1.0.2 @@ -37516,24 +34276,6 @@ snapshots: remove-bom-buffer: 3.0.0 vinyl: 2.2.1 - vinyl-view@0.1.2: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - engine-base: 0.1.3 - isobject: 2.1.0 - lazy-cache: 2.0.2 - mixin-deep: 1.3.2 - vinyl-item: 0.1.0 - transitivePeerDependencies: - - supports-color - - vinyl@1.2.0: - dependencies: - clone: 1.0.4 - clone-stats: 0.0.1 - replace-ext: 0.0.1 - vinyl@2.2.1: dependencies: clone: 2.1.2 @@ -37594,11 +34336,6 @@ snapshots: sass: 1.71.1 terser: 5.29.1 - vm2@3.9.19: - dependencies: - acorn: 8.11.3 - acorn-walk: 8.3.2 - vue@3.4.31(typescript@5.5.2): dependencies: '@vue/compiler-dom': 3.4.31 @@ -37639,8 +34376,6 @@ snapshots: dependencies: makeerror: 1.0.12 - warning-symbol@0.1.0: {} - warning@4.0.3: dependencies: loose-envify: 1.4.0 @@ -38224,14 +34959,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - write-json@0.2.2: - dependencies: - write: 0.2.1 - - write@0.2.1: - dependencies: - mkdirp: 0.5.6 - ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.4): optionalDependencies: bufferutil: 4.0.8 @@ -38301,11 +35028,6 @@ snapshots: yaml@2.4.1: {} - yargs-parser@2.4.1: - dependencies: - camelcase: 3.0.0 - lodash.assign: 4.2.0 - yargs-parser@20.2.9: {} yargs-parser@21.1.1: {}