From 01fef3733b5a2a098e82956151c3bde433c08e87 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 26 Jan 2024 13:37:00 -0300 Subject: [PATCH 01/29] Add unique constraints and new fixes --- .../b2fa308044b5_add_unique_constraints.py | 59 +++++++++++++++++++ .../versions/bc2f01c40e4a_new_fixes.py | 50 ++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py create mode 100644 src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py diff --git a/src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py b/src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py new file mode 100644 index 000000000..e24d5a72f --- /dev/null +++ b/src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py @@ -0,0 +1,59 @@ +"""Add unique constraints + +Revision ID: b2fa308044b5 +Revises: 0b8757876a7c +Create Date: 2024-01-26 13:31:14.797548 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +import sqlmodel +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = 'b2fa308044b5' +down_revision: Union[str, None] = '0b8757876a7c' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + op.drop_table('flowstyle') + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.add_column(sa.Column('is_component', sa.Boolean(), nullable=True)) + batch_op.add_column(sa.Column('updated_at', sa.DateTime(), nullable=True)) + batch_op.add_column(sa.Column('folder', sqlmodel.sql.sqltypes.AutoString(), nullable=True)) + batch_op.add_column(sa.Column('user_id', sqlmodel.sql.sqltypes.GUID(), nullable=True)) + batch_op.create_index(batch_op.f('ix_flow_user_id'), ['user_id'], unique=False) + batch_op.create_foreign_key(None, 'user', ['user_id'], ['id']) + except Exception: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.drop_constraint(None, type_='foreignkey') + batch_op.drop_index(batch_op.f('ix_flow_user_id')) + batch_op.drop_column('user_id') + batch_op.drop_column('folder') + batch_op.drop_column('updated_at') + batch_op.drop_column('is_component') + + op.create_table('flowstyle', + sa.Column('color', sa.VARCHAR(), nullable=False), + sa.Column('emoji', sa.VARCHAR(), nullable=False), + sa.Column('flow_id', sa.CHAR(length=32), nullable=True), + sa.Column('id', sa.CHAR(length=32), nullable=False), + sa.ForeignKeyConstraint(['flow_id'], ['flow.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('id') + ) + except Exception: + pass + # ### end Alembic commands ### diff --git a/src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py b/src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py new file mode 100644 index 000000000..3ad7ba5f3 --- /dev/null +++ b/src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py @@ -0,0 +1,50 @@ +"""New fixes + +Revision ID: bc2f01c40e4a +Revises: b2fa308044b5 +Create Date: 2024-01-26 13:34:14.496769 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +import sqlmodel +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = 'bc2f01c40e4a' +down_revision: Union[str, None] = 'b2fa308044b5' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.add_column(sa.Column('is_component', sa.Boolean(), nullable=True)) + batch_op.add_column(sa.Column('updated_at', sa.DateTime(), nullable=True)) + batch_op.add_column(sa.Column('folder', sqlmodel.sql.sqltypes.AutoString(), nullable=True)) + batch_op.add_column(sa.Column('user_id', sqlmodel.sql.sqltypes.GUID(), nullable=True)) + batch_op.create_index(batch_op.f('ix_flow_user_id'), ['user_id'], unique=False) + batch_op.create_foreign_key('flow_user_id_fkey' + , 'user', ['user_id'], ['id']) + except Exception: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.drop_constraint('flow_user_id_fkey', type_='foreignkey') + batch_op.drop_index(batch_op.f('ix_flow_user_id')) + batch_op.drop_column('user_id') + batch_op.drop_column('folder') + batch_op.drop_column('updated_at') + batch_op.drop_column('is_component') + except Exception: + pass + + # ### end Alembic commands ### From 89a8a6a0be3f9b1a3c8678894d3af4ac76ae8d69 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 26 Jan 2024 13:37:48 -0300 Subject: [PATCH 02/29] Update version number in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8abaf6ebe..4536ba982 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.5a9" +version = "0.6.5a10" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From e011d1f6dc2e513eb3fea203eab54fff0cf075a4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 26 Jan 2024 14:08:38 -0300 Subject: [PATCH 03/29] Refactor import order and remove unnecessary samesite attribute in set_cookie() calls --- src/backend/langflow/api/v1/login.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/api/v1/login.py b/src/backend/langflow/api/v1/login.py index b8fa48577..d0fa0e446 100644 --- a/src/backend/langflow/api/v1/login.py +++ b/src/backend/langflow/api/v1/login.py @@ -1,4 +1,4 @@ -from fastapi import Request, Response, APIRouter, Depends, HTTPException, status +from fastapi import APIRouter, Depends, HTTPException, Request, Response, status from fastapi.security import OAuth2PasswordRequestForm from sqlmodel import Session @@ -33,8 +33,8 @@ async def login_to_get_access_token( if user: tokens = create_user_tokens(user_id=user.id, db=db, update_last_login=True) - response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True, secure=True, samesite="strict") - response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True, samesite="strict") + response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True, secure=True) + response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True) return tokens else: raise HTTPException( From a2ca8a62e75f2ba3842d0e5959c01d3ac38a41e9 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 26 Jan 2024 14:09:48 -0300 Subject: [PATCH 04/29] Bumped version to 0.6.5a11 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4536ba982..678d25995 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.5a10" +version = "0.6.5a11" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From a5f91da7d4e99f773d7a75064e6deffa1b992772 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 26 Jan 2024 15:17:30 -0300 Subject: [PATCH 05/29] Update cookie settings in login.py --- src/backend/langflow/api/v1/login.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/api/v1/login.py b/src/backend/langflow/api/v1/login.py index d0fa0e446..29db59855 100644 --- a/src/backend/langflow/api/v1/login.py +++ b/src/backend/langflow/api/v1/login.py @@ -33,8 +33,8 @@ async def login_to_get_access_token( if user: tokens = create_user_tokens(user_id=user.id, db=db, update_last_login=True) - response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True, secure=True) - response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True) + response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True) + response.set_cookie("access_token_lf", tokens["access_token"], httponly=False) return tokens else: raise HTTPException( @@ -50,7 +50,7 @@ async def auto_login( ): if settings_service.auth_settings.AUTO_LOGIN: tokens = create_user_longterm_token(db) - response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True, samesite="strict") + response.set_cookie("access_token_lf", tokens["access_token"], httponly=False) return tokens raise HTTPException( @@ -67,8 +67,8 @@ async def refresh_token(request: Request, response: Response): token = request.cookies.get("refresh_token_lf") if token: tokens = create_refresh_token(token) - response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True, secure=True, samesite="strict") - response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True, samesite="strict") + response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True) + response.set_cookie("access_token_lf", tokens["access_token"], httponly=False) return tokens else: raise HTTPException( From e63878b2f1ffc843afcd743a2c1d04d94825876e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 26 Jan 2024 15:18:00 -0300 Subject: [PATCH 06/29] Update version to 0.6.5a12 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 678d25995..5d1140a4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.5a11" +version = "0.6.5a12" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 2fb72b1d1ef6771d68159515c7f7cf835342ab0b Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Jan 2024 14:46:38 -0300 Subject: [PATCH 07/29] added local storage of flow state to fake chat memory for refresh page --- .../src/components/newChatView/index.tsx | 1 + src/frontend/src/stores/flowStore.ts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/newChatView/index.tsx b/src/frontend/src/components/newChatView/index.tsx index ec2c0d66c..56e0ae38e 100644 --- a/src/frontend/src/components/newChatView/index.tsx +++ b/src/frontend/src/components/newChatView/index.tsx @@ -40,6 +40,7 @@ export default function newChatView(): JSX.Element { useEffect(() => { const chatOutputResponses: FlowPoolObjectType[] = []; outputIds.forEach((outputId) => { + console.log("rodou", flowPool[outputId]); if (outputId.includes("ChatOutput")) { if (flowPool[outputId] && flowPool[outputId].length > 0) { chatOutputResponses.push(...flowPool[outputId]); diff --git a/src/frontend/src/stores/flowStore.ts b/src/frontend/src/stores/flowStore.ts index f74bd5576..fb5831a07 100644 --- a/src/frontend/src/stores/flowStore.ts +++ b/src/frontend/src/stores/flowStore.ts @@ -45,12 +45,19 @@ const useFlowStore = create((set, get) => ({ set({ flowPool }); }, addDataToFlowPool: (data: any, nodeId: string) => { + const currentFlow = useFlowsManagerStore.getState().currentFlow; let newFlowPool = cloneDeep({ ...get().flowPool }); if (!newFlowPool[nodeId]) newFlowPool[nodeId] = [data]; else { newFlowPool[nodeId].push(data); } get().setFlowPool(newFlowPool); + if (currentFlow) { + window.sessionStorage.setItem( + `${currentFlow!.id}`, + JSON.stringify(newFlowPool) + ); + } }, CleanFlowPool: () => { get().setFlowPool({}); @@ -59,9 +66,15 @@ const useFlowStore = create((set, get) => ({ set({ isPending }); }, resetFlow: ({ nodes, edges, viewport }) => { + const currentFlow = useFlowsManagerStore.getState().currentFlow; + let flowPool = {}; + if (currentFlow) { + flowPool = JSON.parse( + window.sessionStorage.getItem(`${currentFlow!.id}`) ?? "{}" + ); + } let newEdges = cleanEdges(nodes, edges); const { inputs, outputs } = getInputsAndOutputs(nodes); - set({ nodes, edges: newEdges, @@ -69,6 +82,7 @@ const useFlowStore = create((set, get) => ({ inputs, outputs, hasIO: inputs.length > 0 && outputs.length > 0, + flowPool, }); get().reactFlowInstance!.setViewport(viewport); }, From 7912f846a69dc9f38f4a679e1e59714877f3f2a4 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Jan 2024 16:06:32 -0300 Subject: [PATCH 08/29] Add flow update to database --- src/frontend/src/stores/flowStore.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/frontend/src/stores/flowStore.ts b/src/frontend/src/stores/flowStore.ts index fb5831a07..4e8ef5068 100644 --- a/src/frontend/src/stores/flowStore.ts +++ b/src/frontend/src/stores/flowStore.ts @@ -9,6 +9,7 @@ import { applyNodeChanges, } from "reactflow"; import { create } from "zustand"; +import { updateFlowInDatabase } from "../controllers/API"; import { NodeDataType, NodeType, @@ -344,6 +345,16 @@ const useFlowStore = create((set, get) => ({ function handleBuildUpdate(data: any) { get().addDataToFlowPool(data.data[data.id], data.id); } + await updateFlowInDatabase({ + data: { + nodes: get().nodes, + edges: get().edges, + viewport: get().reactFlowInstance?.getViewport()!, + }, + id: currentFlow!.id, + name: currentFlow!.name, + description: currentFlow!.description, + }); return buildVertices({ flowId: currentFlow!.id, nodeId, From 7d7a980e7caafab16f24316d19efd63c255f558b Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Jan 2024 16:33:29 -0300 Subject: [PATCH 09/29] Fix selection validation and error message --- src/frontend/src/utils/reactflowUtils.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index 008de0378..94bd9d6dc 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -677,6 +677,7 @@ export function validateSelection( if (selection.edges.length === 0) { selection.edges = edges; } + // get only edges that are connected to the nodes in the selection // first creates a set of all the nodes ids let nodesSet = new Set(selection.nodes.map((n) => n.id)); @@ -692,7 +693,17 @@ export function validateSelection( if (selection.nodes.length < 2) { errorsArray.push("Please select more than one node"); } - + if ( + selection.nodes.some( + (node) => + isInputNode(node.data as NodeDataType) || + isOutputNode(node.data as NodeDataType) + ) + ) { + errorsArray.push( + "Please select only nodes that are not input or output nodes" + ); + } //check if there are two or more nodes with free outputs if ( selection.nodes.filter( From 2aa273166d7743e19cdfe6f7782a247581dfdef0 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Jan 2024 17:36:00 -0300 Subject: [PATCH 10/29] Fix input fields behavior when node is not selected --- src/frontend/src/CustomNodes/GenericNode/index.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index ea9f49845..c8f2d2349 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -80,6 +80,13 @@ export default function GenericNode({ countHandles(); }, [data, data.node]); + useEffect(() => { + if (!selected) { + setInputName(false); + setInputDescription(false); + } + }, [selected]); + // State for outline color const sseData = useFlowStore((state) => state.sseData); const isBuilding = useFlowStore((state) => state.isBuilding); From 35087cd2b4090acc1c681c39b126ff404c1e370f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 22:48:03 -0300 Subject: [PATCH 11/29] Add async file operations to LocalStorageService --- .../langflow/services/storage/local.py | 93 +++++++++++++++---- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/src/backend/langflow/services/storage/local.py b/src/backend/langflow/services/storage/local.py index bed6af844..667a7aeeb 100644 --- a/src/backend/langflow/services/storage/local.py +++ b/src/backend/langflow/services/storage/local.py @@ -1,31 +1,92 @@ from pathlib import Path +import aiofiles +from loguru import logger + from .service import StorageService class LocalStorageService(StorageService): - def __init__(self, session_service, settings_service): - super().__init__(session_service, settings_service) - self.data_dir = settings_service.settings.CONFIG_DIR + """A service class for handling local storage operations.""" + def __init__(self, session_service, settings_service): + """Initialize the local storage service with session and settings services.""" + super().__init__(session_service, settings_service) + self.data_dir = Path(settings_service.settings.CONFIG_DIR) self.set_ready() - def save_file(self, flow_id: str, file_name: str, data: bytes): - folder_path = Path(f"{self.data_dir}/{flow_id}") + async def save_file(self, flow_id: str, file_name: str, data: bytes): + """ + Save a file in the local storage. + + :param flow_id: The identifier for the flow. + :param file_name: The name of the file to be saved. + :param data: The byte content of the file. + :raises FileNotFoundError: If the specified flow does not exist. + :raises IsADirectoryError: If the file name is a directory. + :raises PermissionError: If there is no permission to write the file. + """ + folder_path = self.data_dir / flow_id folder_path.mkdir(parents=True, exist_ok=True) - with open(folder_path / file_name, "wb") as f: - f.write(data) + file_path = folder_path / file_name - def get_file(self, flow_id: str, file_name: str) -> bytes: - with open(f"{self.data_dir}/{flow_id}/{file_name}", "rb") as f: - return f.read() + try: + async with aiofiles.open(file_path, "wb") as f: + await f.write(data) + logger.info(f"File {file_name} saved successfully in flow {flow_id}.") + except Exception as e: + logger.error(f"Error saving file {file_name} in flow {flow_id}: {e}") + raise e - def list_files(self, flow_id: str): - folder_path = Path(f"{self.data_dir}/{flow_id}") - return [file.name for file in folder_path.iterdir() if file.is_file()] + async def get_file(self, flow_id: str, file_name: str) -> bytes: + """ + Retrieve a file from the local storage. - def delete_file(self, flow_id: str, file_name: str): - Path(f"{self.data_dir}/{flow_id}/{file_name}").unlink() + :param flow_id: The identifier for the flow. + :param file_name: The name of the file to be retrieved. + :return: The byte content of the file. + :raises FileNotFoundError: If the file does not exist. + """ + file_path = self.data_dir / flow_id / file_name + if not file_path.exists(): + logger.warning(f"File {file_name} not found in flow {flow_id}.") + raise FileNotFoundError(f"File {file_name} not found in flow {flow_id}") + + async with aiofiles.open(file_path, "rb") as f: + logger.info(f"File {file_name} retrieved successfully from flow {flow_id}.") + return await f.read() + + async def list_files(self, flow_id: str): + """ + List all files in a specified flow. + + :param flow_id: The identifier for the flow. + :return: A list of file names. + :raises FileNotFoundError: If the flow directory does not exist. + """ + folder_path = self.data_dir / flow_id + if not folder_path.exists() or not folder_path.is_dir(): + logger.warning(f"Flow {flow_id} directory does not exist.") + raise FileNotFoundError(f"Flow {flow_id} directory does not exist.") + + files = [file.name for file in folder_path.iterdir() if file.is_file()] + logger.info(f"Listed {len(files)} files in flow {flow_id}.") + return files + + async def delete_file(self, flow_id: str, file_name: str): + """ + Delete a file from the local storage. + + :param flow_id: The identifier for the flow. + :param file_name: The name of the file to be deleted. + """ + file_path = self.data_dir / flow_id / file_name + if file_path.exists(): + file_path.unlink() + logger.info(f"File {file_name} deleted successfully from flow {flow_id}.") + else: + logger.warning(f"Attempted to delete non-existent file {file_name} in flow {flow_id}.") def teardown(self): - pass + """Perform any cleanup operations when the service is being torn down.""" + pass # No specific teardown actions required for local storage at the moment. From 16dcbddb0d9cd141d8e5bb7c6346162301f583db Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 22:48:26 -0300 Subject: [PATCH 12/29] Refactor S3StorageService class to include logging --- src/backend/langflow/services/storage/s3.py | 58 ++++++++++++++++++--- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/services/storage/s3.py b/src/backend/langflow/services/storage/s3.py index 6f00015b5..8a6a24f3f 100644 --- a/src/backend/langflow/services/storage/s3.py +++ b/src/backend/langflow/services/storage/s3.py @@ -1,43 +1,89 @@ import boto3 from botocore.exceptions import ClientError, NoCredentialsError +from loguru import logger from .service import StorageService class S3StorageService(StorageService): + """A service class for handling operations with AWS S3 storage.""" + def __init__(self, session_service, settings_service): + """Initialize the S3 storage service with session and settings services.""" super().__init__(session_service, settings_service) self.bucket = "langflow" self.s3_client = boto3.client("s3") self.set_ready() def save_file(self, folder: str, file_name: str, data): + """ + Save a file to the S3 bucket. + + :param folder: The folder in the bucket to save the file. + :param file_name: The name of the file to be saved. + :param data: The byte content of the file. + :raises Exception: If an error occurs during file saving. + """ try: self.s3_client.put_object(Bucket=self.bucket, Key=f"{folder}/{file_name}", Body=data) + logger.info(f"File {file_name} saved successfully in folder {folder}.") except NoCredentialsError: - raise Exception("Credentials not available for AWS S3.") + logger.error("Credentials not available for AWS S3.") + raise except ClientError as e: - raise Exception(f"An error occurred: {e}") + logger.error(f"Error saving file {file_name} in folder {folder}: {e}") + raise def get_file(self, folder: str, file_name: str): + """ + Retrieve a file from the S3 bucket. + + :param folder: The folder in the bucket where the file is stored. + :param file_name: The name of the file to be retrieved. + :return: The byte content of the file. + :raises Exception: If an error occurs during file retrieval. + """ try: response = self.s3_client.get_object(Bucket=self.bucket, Key=f"{folder}/{file_name}") + logger.info(f"File {file_name} retrieved successfully from folder {folder}.") return response["Body"].read() except ClientError as e: - raise Exception(f"An error occurred: {e}") + logger.error(f"Error retrieving file {file_name} from folder {folder}: {e}") + raise def list_files(self, folder: str): + """ + List all files in a specified folder of the S3 bucket. + + :param folder: The folder in the bucket to list files from. + :return: A list of file names. + :raises Exception: If an error occurs during file listing. + """ try: response = self.s3_client.list_objects_v2(Bucket=self.bucket, Prefix=folder) - return [item["Key"] for item in response.get("Contents", []) if "/" not in item["Key"][len(folder) :]] + files = [item["Key"] for item in response.get("Contents", []) if "/" not in item["Key"][len(folder) :]] + logger.info(f"{len(files)} files listed in folder {folder}.") + return files except ClientError as e: - raise Exception(f"An error occurred: {e}") + logger.error(f"Error listing files in folder {folder}: {e}") + raise def delete_file(self, folder: str, file_name: str): + """ + Delete a file from the S3 bucket. + + :param folder: The folder in the bucket where the file is stored. + :param file_name: The name of the file to be deleted. + :raises Exception: If an error occurs during file deletion. + """ try: self.s3_client.delete_object(Bucket=self.bucket, Key=f"{folder}/{file_name}") + logger.info(f"File {file_name} deleted successfully from folder {folder}.") except ClientError as e: - raise Exception(f"An error occurred: {e}") + logger.error(f"Error deleting file {file_name} from folder {folder}: {e}") + raise def teardown(self): + """Perform any cleanup operations when the service is being torn down.""" + # No specific teardown actions required for S3 storage at the moment. pass From 6362cd28917910d47cfcbf33d5270701077ab311 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 22:48:55 -0300 Subject: [PATCH 13/29] Refactor file upload and download functions --- src/backend/langflow/api/v1/files.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/api/v1/files.py b/src/backend/langflow/api/v1/files.py index f67303275..aea014d9d 100644 --- a/src/backend/langflow/api/v1/files.py +++ b/src/backend/langflow/api/v1/files.py @@ -4,7 +4,6 @@ from io import BytesIO from fastapi import APIRouter, Depends, HTTPException, UploadFile from fastapi.responses import StreamingResponse - from langflow.api.v1.schemas import UploadFileResponse from langflow.services.auth.utils import get_current_active_user from langflow.services.database.models.flow import Flow @@ -42,7 +41,7 @@ async def upload_file( file_content = await file.read() file_name = file.filename or hashlib.sha256(file_content).hexdigest() folder = flow_id - storage_service.save_file(flow_id=folder, file_name=file_name, data=file_content) + await storage_service.save_file(flow_id=folder, file_name=file_name, data=file_content) return UploadFileResponse(flowId=flow_id, file_path=f"{folder}/{file_name}") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @@ -61,7 +60,7 @@ async def download_file(file_name: str, flow_id: str, storage_service: StorageSe if not content_type: raise HTTPException(status_code=500, detail=f"Content type not found for extension {extension}") - file_content = storage_service.get_file(flow_id=flow_id, file_name=file_name) + file_content = await storage_service.get_file(flow_id=flow_id, file_name=file_name) headers = { "Content-Disposition": f"attachment; filename={file_name} filename*=UTF-8''{file_name}", "Content-Type": "application/octet-stream", @@ -87,7 +86,7 @@ async def download_image(file_name: str, flow_id: str, storage_service: StorageS elif not content_type.startswith("image"): raise HTTPException(status_code=500, detail=f"Content type {content_type} is not an image") - file_content = storage_service.get_file(flow_id=flow_id, file_name=file_name) + file_content = await storage_service.get_file(flow_id=flow_id, file_name=file_name) return StreamingResponse(BytesIO(file_content), media_type=content_type) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @@ -98,7 +97,7 @@ async def list_files( flow_id: str = Depends(get_flow_id), storage_service: StorageService = Depends(get_storage_service) ): try: - files = storage_service.list_files(flow_id=flow_id) + files = await storage_service.list_files(flow_id=flow_id) return {"files": files} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @@ -109,7 +108,7 @@ async def delete_file( file_name: str, flow_id: str = Depends(get_flow_id), storage_service: StorageService = Depends(get_storage_service) ): try: - storage_service.delete_file(flow_id=flow_id, file_name=file_name) + await storage_service.delete_file(flow_id=flow_id, file_name=file_name) return {"message": f"File {file_name} deleted successfully"} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) From f29257c6130a1fa74fb9dcd25281e3efe13dfea1 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 22:49:16 -0300 Subject: [PATCH 14/29] Update storage service methods to be asynchronous --- src/backend/langflow/services/storage/service.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/services/storage/service.py b/src/backend/langflow/services/storage/service.py index f59fa2aa1..8d30ede61 100644 --- a/src/backend/langflow/services/storage/service.py +++ b/src/backend/langflow/services/storage/service.py @@ -20,19 +20,19 @@ class StorageService(Service): self.ready = True @abstractmethod - def save_file(self, flow_id: str, file_name: str, data) -> None: + async def save_file(self, flow_id: str, file_name: str, data) -> None: pass @abstractmethod - def get_file(self, flow_id: str, file_name: str) -> bytes: + async def get_file(self, flow_id: str, file_name: str) -> bytes: pass @abstractmethod - def list_files(self, flow_id: str) -> list[str]: + async def list_files(self, flow_id: str) -> list[str]: pass @abstractmethod - def delete_file(self, flow_id: str, file_name: str) -> bool: + async def delete_file(self, flow_id: str, file_name: str) -> bool: pass def teardown(self): From f232efe179e3fb21f41206c74a4323b38ef21f8b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 22:49:43 -0300 Subject: [PATCH 15/29] Convert save_file, get_file, list_files, delete_file, and teardown methods to async functions in S3StorageService --- src/backend/langflow/services/storage/s3.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/services/storage/s3.py b/src/backend/langflow/services/storage/s3.py index 8a6a24f3f..afd39760a 100644 --- a/src/backend/langflow/services/storage/s3.py +++ b/src/backend/langflow/services/storage/s3.py @@ -8,14 +8,14 @@ from .service import StorageService class S3StorageService(StorageService): """A service class for handling operations with AWS S3 storage.""" - def __init__(self, session_service, settings_service): + async def __init__(self, session_service, settings_service): """Initialize the S3 storage service with session and settings services.""" super().__init__(session_service, settings_service) self.bucket = "langflow" self.s3_client = boto3.client("s3") self.set_ready() - def save_file(self, folder: str, file_name: str, data): + async def save_file(self, folder: str, file_name: str, data): """ Save a file to the S3 bucket. @@ -34,7 +34,7 @@ class S3StorageService(StorageService): logger.error(f"Error saving file {file_name} in folder {folder}: {e}") raise - def get_file(self, folder: str, file_name: str): + async def get_file(self, folder: str, file_name: str): """ Retrieve a file from the S3 bucket. @@ -51,7 +51,7 @@ class S3StorageService(StorageService): logger.error(f"Error retrieving file {file_name} from folder {folder}: {e}") raise - def list_files(self, folder: str): + async def list_files(self, folder: str): """ List all files in a specified folder of the S3 bucket. @@ -68,7 +68,7 @@ class S3StorageService(StorageService): logger.error(f"Error listing files in folder {folder}: {e}") raise - def delete_file(self, folder: str, file_name: str): + async def delete_file(self, folder: str, file_name: str): """ Delete a file from the S3 bucket. @@ -83,7 +83,7 @@ class S3StorageService(StorageService): logger.error(f"Error deleting file {file_name} from folder {folder}: {e}") raise - def teardown(self): + async def teardown(self): """Perform any cleanup operations when the service is being torn down.""" # No specific teardown actions required for S3 storage at the moment. pass From 5eb2e7f9794782c2205422dfe6048c2e3540ab79 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 23:24:45 -0300 Subject: [PATCH 16/29] Update LLMChainComponent signature --- src/backend/langflow/components/chains/LLMChain.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/components/chains/LLMChain.py b/src/backend/langflow/components/chains/LLMChain.py index 309f69215..8a62a8c55 100644 --- a/src/backend/langflow/components/chains/LLMChain.py +++ b/src/backend/langflow/components/chains/LLMChain.py @@ -1,8 +1,9 @@ from typing import Callable, Optional, Union from langchain.chains import LLMChain + from langflow import CustomComponent -from langflow.field_typing import BaseLanguageModel, BaseMemory, BasePromptTemplate, Chain +from langflow.field_typing import BaseLanguageModel, BaseMemory, BasePromptTemplate, Chain, Text class LLMChainComponent(CustomComponent): @@ -22,5 +23,5 @@ class LLMChainComponent(CustomComponent): prompt: BasePromptTemplate, llm: BaseLanguageModel, memory: Optional[BaseMemory] = None, - ) -> Union[Chain, Callable]: + ) -> Union[Chain, Callable, Text]: return LLMChain(prompt=prompt, llm=llm, memory=memory) From d3c2d2f893017d1c506412b8f041981548bbdf2a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 23:36:26 -0300 Subject: [PATCH 17/29] Refactor ConversationChainComponent to handle inputs and return result as string if applicable --- .../components/chains/ConversationChain.py | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/components/chains/ConversationChain.py b/src/backend/langflow/components/chains/ConversationChain.py index 76e6d8e25..f3a302fe8 100644 --- a/src/backend/langflow/components/chains/ConversationChain.py +++ b/src/backend/langflow/components/chains/ConversationChain.py @@ -1,7 +1,9 @@ -from langflow import CustomComponent +from typing import Callable, Optional, Union + from langchain.chains import ConversationChain -from typing import Optional, Union, Callable -from langflow.field_typing import BaseLanguageModel, BaseMemory, Chain + +from langflow import CustomComponent +from langflow.field_typing import BaseLanguageModel, BaseMemory, Chain, Text class ConversationChainComponent(CustomComponent): @@ -23,7 +25,17 @@ class ConversationChainComponent(CustomComponent): self, llm: BaseLanguageModel, memory: Optional[BaseMemory] = None, - ) -> Union[Chain, Callable]: + inputs: dict = {}, + ) -> Union[Chain, Callable, Text]: if memory is None: - return ConversationChain(llm=llm) - return ConversationChain(llm=llm, memory=memory) + chain = ConversationChain(llm=llm) + chain = ConversationChain(llm=llm, memory=memory) + result = chain.invoke(inputs) + # result is an AIMessage which is a subclass of BaseMessage + # We need to check if it is a string or a BaseMessage + if hasattr(result, "content") and isinstance(result.content, str): + return result.content + elif isinstance(result, str): + return result + + return str(result) From 7a3d057a50a4d64c1759887a9989f928cfa410f5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Jan 2024 23:36:48 -0300 Subject: [PATCH 18/29] Refactor PromptRunner class to use langchain_core.messages.BaseMessage --- .../components/chains/PromptRunner.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/backend/langflow/components/chains/PromptRunner.py b/src/backend/langflow/components/chains/PromptRunner.py index 496be610e..955658bd3 100644 --- a/src/backend/langflow/components/chains/PromptRunner.py +++ b/src/backend/langflow/components/chains/PromptRunner.py @@ -1,8 +1,9 @@ -from langflow import CustomComponent - from langchain.llms.base import BaseLLM from langchain.prompts import PromptTemplate -from langchain.schema import Document +from langchain_core.messages import BaseMessage + +from langflow import CustomComponent +from langflow.field_typing import Text class PromptRunner(CustomComponent): @@ -18,11 +19,15 @@ class PromptRunner(CustomComponent): "code": {"show": False}, } - def build(self, llm: BaseLLM, prompt: PromptTemplate, inputs: dict = {}) -> Document: + def build(self, llm: BaseLLM, prompt: PromptTemplate, inputs: dict = {}) -> Text: chain = prompt | llm # The input is an empty dict because the prompt is already filled - result = chain.invoke(input=inputs) - if hasattr(result, "content"): - result = result.content + result_message: BaseMessage = chain.invoke(input=inputs) + if hasattr(result_message, "content"): + result: str = result_message.content + elif isinstance(result_message, str): + result = result_message + else: + result = str(result_message) self.repr_value = result - return Document(page_content=str(result)) + return result From 0c16cbed0431f63a3d3bf342042945cc960c7fe4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Jan 2024 08:54:41 -0300 Subject: [PATCH 19/29] Refactor instantiate_custom_component function signature This commit refactors the function signature of the `instantiate_custom_component` function in `loading.py`. The `class_object` parameter is now annotated with the `Type["CustomComponent"]` type hint to improve type safety. --- src/backend/langflow/interface/initialize/loading.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 8fab13351..d09c239d6 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -119,8 +119,8 @@ async def instantiate_based_on_type(class_object, base_type, node_type, params, async def instantiate_custom_component(node_type, class_object, params, user_id): params_copy = params.copy() - class_object: "CustomComponent" = eval_custom_component_code(params_copy.pop("code")) - custom_component = class_object(user_id=user_id) + class_object: Type["CustomComponent"] = eval_custom_component_code(params_copy.pop("code")) + custom_component: "CustomComponent" = class_object(user_id=user_id) if "retriever" in params_copy and hasattr(params_copy["retriever"], "as_retriever"): params_copy["retriever"] = params_copy["retriever"].as_retriever() From 1ad2b0b9f243180c4284386791942428f44b1d9a Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Jan 2024 16:27:11 +0100 Subject: [PATCH 20/29] Fix build button not working with beta badge --- src/frontend/package-lock.json | 695 +++++++++++++---------------- src/frontend/src/style/applies.css | 2 +- 2 files changed, 307 insertions(+), 390 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 168078c1d..e960c9bea 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -103,9 +103,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", "dev": true }, "node_modules/@alloc/quick-lru": { @@ -230,20 +230,20 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -428,13 +428,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -518,9 +518,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -529,9 +529,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -540,22 +540,22 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -563,8 +563,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -573,9 +573,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -1049,28 +1049,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", + "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", "dependencies": { - "@floating-ui/core": "^1.5.3", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -1178,9 +1178,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1206,14 +1206,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.31.tgz", - "integrity": "sha512-+uNbP3OHJuZVI00WyMg7xfLZotaEY7LgvYXDfONVJbrS+K9wyjCIPNfjy8r9XJn4fbHo/5ibiZqjWnU9LMNv+A==", + "version": "5.0.0-beta.33", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.33.tgz", + "integrity": "sha512-WcSpoJUw/UYHXpvgtl4HyMar2Ar97illUpqiS/X1gtSBp6sdDW6kB2BJ9OlVQ+Kk/RL2GDp/WHA9sbjAYV35ow==", "dependencies": { - "@babel/runtime": "^7.23.7", - "@floating-ui/react-dom": "^2.0.5", + "@babel/runtime": "^7.23.8", + "@floating-ui/react-dom": "^2.0.6", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.4", + "@mui/utils": "^5.15.6", "@popperjs/core": "^2.11.8", "clsx": "^2.1.0", "prop-types": "^15.8.1" @@ -1245,25 +1245,25 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.4.tgz", - "integrity": "sha512-0OZN9O6hAtBpx70mMNFOPaAIol/ytwZYPY+z7Rf9dK3+1Xlzwvj5/IeShJKvtp76S1qJyhPuvZg0+BGqQaUnUw==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.6.tgz", + "integrity": "sha512-0aoWS4qvk1uzm9JBs83oQmIMIQeTBUeqqu8u+3uo2tMznrB5fIKqQVCbCgq+4Tm4jG+5F7dIvnjvQ2aV7UKtdw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/material": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.4.tgz", - "integrity": "sha512-T/LGRAC+M0c+D3+y67eHwIN5bSje0TxbcJCWR0esNvU11T0QwrX3jedXItPNBwMupF2F5VWCDHBVLlFnN3+ABA==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.6.tgz", + "integrity": "sha512-rw7bDdpi2kzfmcDN78lHp8swArJ5sBCKsn+4G3IpGfu44ycyWAWX0VdlvkjcR9Yrws2KIm7c+8niXpWHUDbWoA==", "dependencies": { - "@babel/runtime": "^7.23.7", - "@mui/base": "5.0.0-beta.31", - "@mui/core-downloads-tracker": "^5.15.4", - "@mui/system": "^5.15.4", + "@babel/runtime": "^7.23.8", + "@mui/base": "5.0.0-beta.33", + "@mui/core-downloads-tracker": "^5.15.6", + "@mui/system": "^5.15.6", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.4", + "@mui/utils": "^5.15.6", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.2", @@ -1306,12 +1306,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.4.tgz", - "integrity": "sha512-9N5myIMEEQTM5WYWPGvvYADzjFo12LgJ7S+2iTZkBNOcJpUxQYM1tvYjkHCDV+t1ocMOEgjR2EfJ9Dus30dBlg==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.6.tgz", + "integrity": "sha512-ZBX9E6VNUSscUOtU8uU462VvpvBS7eFl5VfxAzTRVQBHflzL+5KtnGrebgf6Nd6cdvxa1o0OomiaxSKoN2XDmg==", "dependencies": { - "@babel/runtime": "^7.23.7", - "@mui/utils": "^5.15.4", + "@babel/runtime": "^7.23.8", + "@mui/utils": "^5.15.6", "prop-types": "^15.8.1" }, "engines": { @@ -1332,11 +1332,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.4.tgz", - "integrity": "sha512-vtrZUXG5XI8CNiNLcxjIirW4dEbOloR+ikfm6ePBo7jXpJdpXjVzBWetrfE+5eI0cHkKWlTptnJ2voKV8pBRfw==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.6.tgz", + "integrity": "sha512-KAn8P8xP/WigFKMlEYUpU9z2o7jJnv0BG28Qu1dhNQVutsLVIFdRf5Nb+0ijp2qgtcmygQ0FtfRuXv5LYetZTg==", "dependencies": { - "@babel/runtime": "^7.23.7", + "@babel/runtime": "^7.23.8", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -1363,15 +1363,15 @@ } }, "node_modules/@mui/system": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.4.tgz", - "integrity": "sha512-KCwkHajGBXPs2TK1HJjIyab4NDk0cZoBDYN/TTlXVo1qBAmCjY0vjqrlsjeoG+wrwwcezXMLs/e6OGP66fPCog==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.6.tgz", + "integrity": "sha512-J01D//u8IfXvaEHMBQX5aO2l7Q+P15nt96c4NskX7yp5/+UuZP8XCQJhtBtLuj+M2LLyXHYGmCPeblsmmscP2Q==", "dependencies": { - "@babel/runtime": "^7.23.7", - "@mui/private-theming": "^5.15.4", - "@mui/styled-engine": "^5.15.4", + "@babel/runtime": "^7.23.8", + "@mui/private-theming": "^5.15.6", + "@mui/styled-engine": "^5.15.6", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.4", + "@mui/utils": "^5.15.6", "clsx": "^2.1.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -1423,11 +1423,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.4.tgz", - "integrity": "sha512-E2wLQGBcs3VR52CpMRjk46cGscC4cbf3Q2uyHNaAeL36yTTm+aVNbtsTCazXtjOP4BDd8lu6VtlTpVC8Rtl4mg==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.6.tgz", + "integrity": "sha512-qfEhf+zfU9aQdbzo1qrSWlbPQhH1nCgeYgwhOVnj9Bn39shJQitEnXpSQpSNag8+uty5Od6PxmlNKPTnPySRKA==", "dependencies": { - "@babel/runtime": "^7.23.7", + "@babel/runtime": "^7.23.8", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -1491,12 +1491,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", - "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.1.tgz", + "integrity": "sha512-9g8EWTjiQ9yFBXc6HjCWe41msLpxEX0KhmfmPl9RPLJdfzL4F0lg2BdJ91O9azFdl11y1pmpwdjBiSxvqc+btw==", "dev": true, "dependencies": { - "playwright": "1.40.1" + "playwright": "1.41.1" }, "bin": { "playwright": "cli.js" @@ -2662,11 +2662,11 @@ } }, "node_modules/@reactflow/background": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.6.tgz", - "integrity": "sha512-06FPlSUOOMALEEs+2PqPAbpqmL7WDjrkbG2UsDr2d6mbcDDhHiV4tu9FYoz44SQvXo7ma9VRotlsaR4OiRcYsg==", + "version": "11.3.8", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.8.tgz", + "integrity": "sha512-U4aI54F7PwqgYI0Knv72QFRI/wXeipPmIYAlDsA0j51+tlPxs3Nk2z7G1/4pC11GxEZkgQVfcIXro4l1Fk+bIQ==", "dependencies": { - "@reactflow/core": "11.10.1", + "@reactflow/core": "11.10.3", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2676,11 +2676,11 @@ } }, "node_modules/@reactflow/controls": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.6.tgz", - "integrity": "sha512-4QHT92/ACVlZkvV+Hq44bAPV8WbMhkJl+/J0EbXcqQ1+an7cWJsF84eeelJw7R5J76RoaSSpKdsWsL2v7HAVlw==", + "version": "11.2.8", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.8.tgz", + "integrity": "sha512-Y9YVx38sRjYtbPsI/xa+B1FGN73FV1GqqajlmGfrc1TmqhJaX+gaMXMvVazT/N5haK1hMJvOApUTLQ2V/5Rdbg==", "dependencies": { - "@reactflow/core": "11.10.1", + "@reactflow/core": "11.10.3", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2690,9 +2690,9 @@ } }, "node_modules/@reactflow/core": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.10.1.tgz", - "integrity": "sha512-GIh3usY1W3eVobx//OO9+Cwm+5evQBBdPGxDaeXwm25UqPMWRI240nXQA5F/5gL5Mwpf0DUC7DR2EmrKNQy+Rw==", + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.10.3.tgz", + "integrity": "sha512-nV3nep4fjBy3h8mYSnJcclGcQtj8fkUBmNkEwCZCK4ps+n3HNkXFB0BRisSnQz6GRQlYboSsi0cThEl3KdNITw==", "dependencies": { "@types/d3": "^7.4.0", "@types/d3-drag": "^3.0.1", @@ -2710,11 +2710,11 @@ } }, "node_modules/@reactflow/minimap": { - "version": "11.7.6", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.6.tgz", - "integrity": "sha512-kJEtyeQkTZYViLGebVWHVUJROMAGcvejvT+iX4DqKnFb5yK8E8LWlXQpRx2FrL9gDy80mJJaciy7IxnnQKE1bg==", + "version": "11.7.8", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.8.tgz", + "integrity": "sha512-MwyP5q3VomC91Dhd4P6YcxEfnjDbREGYV6rRxbSJSTHiG0x7ETQCcPelYDGy7JvQej77Pa2yJ4g0FDwP7CsQEA==", "dependencies": { - "@reactflow/core": "11.10.1", + "@reactflow/core": "11.10.3", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", @@ -2728,11 +2728,11 @@ } }, "node_modules/@reactflow/node-resizer": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.6.tgz", - "integrity": "sha512-1Xb6q97uP7hRBLpog9sRCNfnsHdDgFRGEiU+lQqGgPEAeYwl4nRjWa/sXwH6ajniKxBhGEvrdzOgEFn6CRMcpQ==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.8.tgz", + "integrity": "sha512-u/EXLpvOfAmq1sGoPYwoX4gi0PnCi0mH3eHVClHNc8JQD0WCqcV1UeVV7H3PF+1SGhhg/aOv/vPG1PcQ5fu4jQ==", "dependencies": { - "@reactflow/core": "11.10.1", + "@reactflow/core": "11.10.3", "classcat": "^5.0.4", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", @@ -2744,11 +2744,11 @@ } }, "node_modules/@reactflow/node-toolbar": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.6.tgz", - "integrity": "sha512-JXDEuZ0wKjZ8z7qK2bIst0eZPzNyVEsiHL0e93EyuqT4fA9icoyE0fLq2ryNOOp7MXgId1h7LusnH6ta45F0yQ==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.8.tgz", + "integrity": "sha512-cfvlTPeJa/ciQTosx2bGrjHT8K/UL9kznpvpOzeZFnJm5UQXmbwAYt4Vo6GfkD51mORcIL7ujQJvB9ym3ZI9KA==", "dependencies": { - "@reactflow/core": "11.10.1", + "@reactflow/core": "11.10.3", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2758,9 +2758,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", - "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", + "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", "engines": { "node": ">=14.0.0" } @@ -3036,14 +3036,15 @@ } }, "node_modules/@swc/cli": { - "version": "0.1.63", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.63.tgz", - "integrity": "sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A==", + "version": "0.1.65", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.65.tgz", + "integrity": "sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==", "dev": true, "dependencies": { "@mole-inc/bin-wrapper": "^8.0.1", "commander": "^7.1.0", "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3" @@ -3076,9 +3077,9 @@ } }, "node_modules/@swc/core": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.102.tgz", - "integrity": "sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.107.tgz", + "integrity": "sha512-zKhqDyFcTsyLIYK1iEmavljZnf4CCor5pF52UzLAz4B6Nu/4GLU+2LQVAf+oRHjusG39PTPjd2AlRT3f3QWfsQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3093,16 +3094,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.102", - "@swc/core-darwin-x64": "1.3.102", - "@swc/core-linux-arm-gnueabihf": "1.3.102", - "@swc/core-linux-arm64-gnu": "1.3.102", - "@swc/core-linux-arm64-musl": "1.3.102", - "@swc/core-linux-x64-gnu": "1.3.102", - "@swc/core-linux-x64-musl": "1.3.102", - "@swc/core-win32-arm64-msvc": "1.3.102", - "@swc/core-win32-ia32-msvc": "1.3.102", - "@swc/core-win32-x64-msvc": "1.3.102" + "@swc/core-darwin-arm64": "1.3.107", + "@swc/core-darwin-x64": "1.3.107", + "@swc/core-linux-arm-gnueabihf": "1.3.107", + "@swc/core-linux-arm64-gnu": "1.3.107", + "@swc/core-linux-arm64-musl": "1.3.107", + "@swc/core-linux-x64-gnu": "1.3.107", + "@swc/core-linux-x64-musl": "1.3.107", + "@swc/core-win32-arm64-msvc": "1.3.107", + "@swc/core-win32-ia32-msvc": "1.3.107", + "@swc/core-win32-x64-msvc": "1.3.107" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -3114,9 +3115,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.102.tgz", - "integrity": "sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.107.tgz", + "integrity": "sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==", "cpu": [ "arm64" ], @@ -3130,9 +3131,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.102.tgz", - "integrity": "sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.107.tgz", + "integrity": "sha512-hwiLJ2ulNkBGAh1m1eTfeY1417OAYbRGcb/iGsJ+LuVLvKAhU/itzsl535CvcwAlt2LayeCFfcI8gdeOLeZa9A==", "cpu": [ "x64" ], @@ -3146,9 +3147,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.102.tgz", - "integrity": "sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.107.tgz", + "integrity": "sha512-I2wzcC0KXqh0OwymCmYwNRgZ9nxX7DWnOOStJXV3pS0uB83TXAkmqd7wvMBuIl9qu4Hfomi9aDM7IlEEn9tumQ==", "cpu": [ "arm" ], @@ -3162,9 +3163,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.102.tgz", - "integrity": "sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.107.tgz", + "integrity": "sha512-HWgnn7JORYlOYnGsdunpSF8A+BCZKPLzLtEUA27/M/ZuANcMZabKL9Zurt7XQXq888uJFAt98Gy+59PU90aHKg==", "cpu": [ "arm64" ], @@ -3178,9 +3179,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.102.tgz", - "integrity": "sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.107.tgz", + "integrity": "sha512-vfPF74cWfAm8hyhS8yvYI94ucMHIo8xIYU+oFOW9uvDlGQRgnUf/6DEVbLyt/3yfX5723Ln57U8uiMALbX5Pyw==", "cpu": [ "arm64" ], @@ -3194,9 +3195,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.102.tgz", - "integrity": "sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.107.tgz", + "integrity": "sha512-uBVNhIg0ip8rH9OnOsCARUFZ3Mq3tbPHxtmWk9uAa5u8jQwGWeBx5+nTHpDOVd3YxKb6+5xDEI/edeeLpha/9g==", "cpu": [ "x64" ], @@ -3210,9 +3211,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.102.tgz", - "integrity": "sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.107.tgz", + "integrity": "sha512-mvACkUvzSIB12q1H5JtabWATbk3AG+pQgXEN95AmEX2ZA5gbP9+B+mijsg7Sd/3tboHr7ZHLz/q3SHTvdFJrEw==", "cpu": [ "x64" ], @@ -3226,9 +3227,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.102.tgz", - "integrity": "sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.107.tgz", + "integrity": "sha512-J3P14Ngy/1qtapzbguEH41kY109t6DFxfbK4Ntz9dOWNuVY3o9/RTB841ctnJk0ZHEG+BjfCJjsD2n8H5HcaOA==", "cpu": [ "arm64" ], @@ -3242,9 +3243,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.102.tgz", - "integrity": "sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.107.tgz", + "integrity": "sha512-ZBUtgyjTHlz8TPJh7kfwwwFma+ktr6OccB1oXC8fMSopD0AxVnQasgun3l3099wIsAB9eEsJDQ/3lDkOLs1gBA==", "cpu": [ "ia32" ], @@ -3258,9 +3259,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.102.tgz", - "integrity": "sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw==", + "version": "1.3.107", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.107.tgz", + "integrity": "sha512-Eyzo2XRqWOxqhE1gk9h7LWmUf4Bp4Xn2Ttb0ayAXFp6YSTxQIThXcT9kipXZqcpxcmDwoq8iWbbf2P8XL743EA==", "cpu": [ "x64" ], @@ -3298,20 +3299,20 @@ } }, "node_modules/@tabler/icons": { - "version": "2.45.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.45.0.tgz", - "integrity": "sha512-J10UDghOni9wlrj5CpKAzychDCABCKYq897mGg0wGFsd+tYLaUdz0dt/HZeGnV8gZJo0hIiTPLGwBp5EW42Qsg==", + "version": "2.46.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.46.0.tgz", + "integrity": "sha512-Q5G8Pj5IO+Uhc6pszpu5/hGYY018JwEzzvmuqr+gKJtfIvAHA3umpwUilMRLEy89p+WCP+YsDhicMhfBCCv1qA==", "funding": { "type": "github", "url": "https://github.com/sponsors/codecalm" } }, "node_modules/@tabler/icons-react": { - "version": "2.45.0", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.45.0.tgz", - "integrity": "sha512-1vSBsHnBi9AfMILeJQrQo1XIHtFOxuWNGOeIvNHpDcBXyFTfVvDuh64PjMl57xCh5y/PlQlu3Hpx9vSkpSYXYQ==", + "version": "2.46.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.46.0.tgz", + "integrity": "sha512-X8MRxuslIOFqMjAo+GvUZDpjlOwNYNJTuOsHXf/NBvVI6ygqUf0FUNsDLLA5fQ6k6KtRwxMlgGB+eR8ZG1UP0g==", "dependencies": { - "@tabler/icons": "2.45.0", + "@tabler/icons": "2.46.0", "prop-types": "^15.7.2" }, "funding": { @@ -3357,9 +3358,9 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.1.tgz", - "integrity": "sha512-IFOFuRUTaiM/yibty9qQ9BfycQnYXIDHGP2+cU+0LrFFGNhVxCXSQnaY6wkX8uJVteFEBjUondX0Hmpp7TNcag==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.2.tgz", + "integrity": "sha512-9XbRLPKgnhMwwmuQMnJMv+5a9sitGNCSEtf/AZXzmJdesYk7XsjYHaEDny+IrJzvPNwZliIIDwCRiaUqR3zzCA==", "dependencies": { "@tanstack/virtual-core": "3.0.0" }, @@ -3514,14 +3515,6 @@ "path-browserify": "^1.0.1" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@ts-morph/common/node_modules/minimatch": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", @@ -3874,21 +3867,15 @@ "@types/unist": "^2" } }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "16.18.70", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.70.tgz", - "integrity": "sha512-8eIk20G5VVVQNZNouHjLA2b8utE2NvGybLjMaF4lyhA9uhGwnmXF8o+icdXKGSQSNANJewXva/sFUoZLwAaYAg==", + "version": "16.18.76", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.76.tgz", + "integrity": "sha512-/GsO2uv1Z6R42lBr59dtem56gVF/yHKQaScggwU+gLU6DXE25sDmOar4c4IfWb3h+X/7OYZznPOFk7oGF3jQSA==", "devOptional": true }, "node_modules/@types/parse-json": { @@ -3902,9 +3889,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.47", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.47.tgz", - "integrity": "sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==", + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3957,9 +3944,9 @@ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true }, "node_modules/@vitejs/plugin-react-swc": { @@ -3986,9 +3973,9 @@ "integrity": "sha512-jbQfFaw+57OBwPt7qSNHuW+RA8smmRwkWRS1Ozh6K/QxUspBgBV/LpdSzlY7vee8TomS6j3D33B9rIeH1qMwsA==" }, "node_modules/ace-builds": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.3.tgz", - "integrity": "sha512-ptSTUmDEU+LuwGiPY3/qQPmmAWE27vuv5sASL8swLRyLGJb7Ye7a8MrJ4NnAkFh1sJgVUqKTEGWRRFDmqYPw2Q==" + "version": "1.32.5", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.5.tgz", + "integrity": "sha512-Mrh+qTitOomv1kANaRHO6jpxq6j8BzN9Duwb6pmpuB2sAsfv7MHH9j3LpRHS388uid2GisauC682bemmkdNXKg==" }, "node_modules/acorn": { "version": "8.11.3", @@ -4011,9 +3998,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "engines": { "node": ">=0.4.0" } @@ -4165,33 +4152,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4206,9 +4166,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", "dev": true, "funding": [ { @@ -4225,9 +4185,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4255,9 +4215,9 @@ } }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dependencies": { "follow-redirects": "^1.15.4", "form-data": "^4.0.0", @@ -4494,13 +4454,11 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -4515,9 +4473,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "funding": [ { "type": "opencollective", @@ -4533,8 +4491,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -4652,9 +4610,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", "funding": [ { "type": "opencollective", @@ -4877,12 +4835,6 @@ "node": ">= 10" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5093,9 +5045,9 @@ } }, "node_modules/daisyui": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.6.0.tgz", - "integrity": "sha512-B5ZB/sczXpp4LMdo/SZrtYY/U2hq+Vr9I15QawuWZ0VwgtSAbuZpAZUftKVryEsPuv3BM0yVlBED0nAmtis/dw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.6.1.tgz", + "integrity": "sha512-IXI8ypN/hkl1AKsag1XPlWt0wfvL4NedTUtUkv/VFP5q/xDbBZrZthq3/9M2yU1egcbbLhp01rluIz0GICUc+g==", "dev": true, "dependencies": { "css-selector-tokenizer": "^0.8", @@ -5384,9 +5336,9 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.4.628", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.628.tgz", - "integrity": "sha512-2k7t5PHvLsufpP6Zwk0nof62yLOsCf032wZx7/q0mv8gwlXjhcxI3lz6f0jBr0GrnWKcm3burXzI3t5IrcdUxw==" + "version": "1.4.650", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.650.tgz", + "integrity": "sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5650,9 +5602,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dependencies": { "reusify": "^1.0.4" } @@ -5782,9 +5734,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -6049,28 +6001,6 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -8171,15 +8101,17 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -8238,22 +8170,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/multimatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -8677,9 +8593,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { "node": "14 || >=16.14" } @@ -8738,12 +8654,12 @@ } }, "node_modules/playwright": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", - "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.1.tgz", + "integrity": "sha512-gdZAWG97oUnbBdRL3GuBvX3nDDmUOuqzV/D24dytqlKt+eI5KbwusluZRGljx1YoJKZ2NRPaeWiFTeGZO7SosQ==", "dev": true, "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.41.1" }, "bin": { "playwright": "cli.js" @@ -8756,9 +8672,9 @@ } }, "node_modules/playwright-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", - "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.1.tgz", + "integrity": "sha512-/KPO5DzXSMlxSX77wy+HihKGOunh3hqndhqeo/nMxfigiKzogn8kfL0ZBDu0L1RKgan5XHCPmn6zXd2NUJgjhg==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -9068,39 +8984,27 @@ "dev": true }, "node_modules/pretty-quick": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.3.tgz", - "integrity": "sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.3.1.tgz", + "integrity": "sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg==", "dev": true, "dependencies": { - "chalk": "^3.0.0", - "execa": "^4.0.0", + "execa": "^4.1.0", "find-up": "^4.1.0", - "ignore": "^5.1.4", - "mri": "^1.1.5", - "multimatch": "^4.0.0" + "ignore": "^5.3.0", + "mri": "^1.2.0", + "picocolors": "^1.0.0", + "picomatch": "^3.0.1", + "tslib": "^2.6.2" }, "bin": { - "pretty-quick": "bin/pretty-quick.js" + "pretty-quick": "dist/cli.js" }, "engines": { "node": ">=10.13" }, "peerDependencies": { - "prettier": ">=2.0.0" - } - }, - "node_modules/pretty-quick/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" + "prettier": "^2.0.0" } }, "node_modules/pretty-quick/node_modules/cross-spawn": { @@ -9197,6 +9101,18 @@ "node": ">=8" } }, + "node_modules/pretty-quick/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pretty-quick/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9269,9 +9185,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/property-information": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", - "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9511,11 +9427,11 @@ } }, "node_modules/react-router": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", - "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", + "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", "dependencies": { - "@remix-run/router": "1.14.1" + "@remix-run/router": "1.14.2" }, "engines": { "node": ">=14.0.0" @@ -9525,12 +9441,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", - "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", + "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", "dependencies": { - "@remix-run/router": "1.14.1", - "react-router": "6.21.1" + "@remix-run/router": "1.14.2", + "react-router": "6.21.3" }, "engines": { "node": ">=14.0.0" @@ -9598,9 +9514,9 @@ } }, "node_modules/react-tooltip": { - "version": "5.25.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.25.1.tgz", - "integrity": "sha512-GDD0hrfbwGr2C6zEzVzzDzXSKeHM55cRFZQv2/EFmiFKVxWZk8hzOO5FNcwCpPyqVxQKUtYckReU5bXMd63alQ==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.0.tgz", + "integrity": "sha512-UBbwy3fo1KYDwRCOWwM6AEfQsk9shgVfNkXFqgwS33QHplzg7xao/7mX/6wd+lE6KSZzhUNTkB5TNk9SMaBV/A==", "dependencies": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" @@ -9626,24 +9542,24 @@ } }, "node_modules/react18-json-view": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.6.tgz", - "integrity": "sha512-RHAY880UwC7SClyQBoij50q2InpSrj5zmP2DCL73vEaaVTyj/QbMPBk4FRKMQ7LF8FSxhh+VI6mK3AhlBaCBxw==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.7.tgz", + "integrity": "sha512-u1H0ZrjrYZUuXEyjcMU+/lVbFi890SNacTcYQT+e7/TI7OeczHyLwcngY4JbtZgfhwjIU078O1+NKh97IVVwZw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/reactflow": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.10.1.tgz", - "integrity": "sha512-Q616fElAc5/N37tMwjuRkkgm/VgmnLLTNNCj61z5mvJxae+/VXZQMfot1K6a5LLz9G3SVKqU97PMb9Ga1PRXew==", + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.10.3.tgz", + "integrity": "sha512-DGNrTdkWjZtPOhj5MV8fiWWGkJo+otMVdoJ9l67bQL+Xf+8NkJ4AHmRXoYIxtgcENzwTr5WTAIJlswV9i91cyw==", "dependencies": { - "@reactflow/background": "11.3.6", - "@reactflow/controls": "11.2.6", - "@reactflow/core": "11.10.1", - "@reactflow/minimap": "11.7.6", - "@reactflow/node-resizer": "2.2.6", - "@reactflow/node-toolbar": "1.3.6" + "@reactflow/background": "11.3.8", + "@reactflow/controls": "11.2.8", + "@reactflow/core": "11.10.3", + "@reactflow/minimap": "11.7.8", + "@reactflow/node-resizer": "2.2.8", + "@reactflow/node-toolbar": "1.3.8" }, "peerDependencies": { "react": ">=17", @@ -10064,15 +9980,16 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -11354,9 +11271,9 @@ } }, "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -12087,9 +12004,9 @@ } }, "node_modules/zustand": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.7.tgz", - "integrity": "sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.0.tgz", + "integrity": "sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A==", "dependencies": { "use-sync-external-store": "1.2.0" }, @@ -12098,7 +12015,7 @@ }, "peerDependencies": { "@types/react": ">=16.8", - "immer": ">=9.0", + "immer": ">=9.0.6", "react": ">=16.8" }, "peerDependenciesMeta": { diff --git a/src/frontend/src/style/applies.css b/src/frontend/src/style/applies.css index abaf9dc78..687bc8f71 100644 --- a/src/frontend/src/style/applies.css +++ b/src/frontend/src/style/applies.css @@ -1012,7 +1012,7 @@ } .beta-badge-wrapper { - @apply absolute right-0 top-0 h-16 w-16 overflow-hidden rounded-tr-lg; + @apply absolute right-0 top-0 h-16 w-16 overflow-hidden rounded-tr-lg pointer-events-none; } .beta-badge-content { @apply mt-2 w-24 rotate-45 bg-beta-background text-center text-xs font-semibold text-beta-foreground; From 0257e9928885b48db231de033739e10dbe2442b8 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Jan 2024 16:36:22 +0100 Subject: [PATCH 21/29] Fixed build animation --- src/frontend/src/CustomNodes/GenericNode/index.tsx | 8 ++++---- src/frontend/src/style/applies.css | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index e5b128f56..460bf841c 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -383,14 +383,14 @@ export default function GenericNode({ ) } > -
+
diff --git a/src/frontend/src/style/applies.css b/src/frontend/src/style/applies.css index 687bc8f71..1af0e0f0b 100644 --- a/src/frontend/src/style/applies.css +++ b/src/frontend/src/style/applies.css @@ -290,7 +290,7 @@ @apply hidden h-4 w-4 animate-spin rounded-full bg-ring opacity-0; } .generic-node-status { - @apply opacity-100; + @apply opacity-100 animate-wiggle; } .green-status { @apply generic-node-status text-status-green fill-status-green; @@ -302,7 +302,7 @@ @apply generic-node-status text-status-yellow fill-status-yellow; } .status-build-animation { - @apply hidden animate-spin text-ring opacity-0; + @apply opacity-0; } .status-div { @apply absolute w-4 duration-200 ease-in-out; From 42e433c6e2a048591692f9aed6290a7e87307529 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Jan 2024 14:35:51 -0300 Subject: [PATCH 22/29] fix(IOview/index.tsx): import classNames function from utils/utils to fix compilation error feat(IOview/index.tsx): add support for dynamic categories based on available inputs and outputs feat(IOview/index.tsx): add functionality to select and display different views based on selected category fix(flowStore.ts): fix logic for determining if flow has inputs or outputs --- src/frontend/src/components/IOview/index.tsx | 69 +++++++++++++++----- src/frontend/src/stores/flowStore.ts | 4 +- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/frontend/src/components/IOview/index.tsx b/src/frontend/src/components/IOview/index.tsx index 520a4a3e8..a0ee0a988 100644 --- a/src/frontend/src/components/IOview/index.tsx +++ b/src/frontend/src/components/IOview/index.tsx @@ -2,7 +2,7 @@ import { cloneDeep } from "lodash"; import { ReactNode, useState } from "react"; import useFlowStore from "../../stores/flowStore"; import { NodeType } from "../../types/flow"; -import { extractTypeFromLongId } from "../../utils/utils"; +import { classNames } from "../../utils/utils"; import AccordionComponent from "../AccordionComponent"; import IOInputField from "../IOInputField"; import IconComponent from "../genericIconComponent"; @@ -16,30 +16,65 @@ export default function IOView(): JSX.Element { const outputIds = outputs.map((obj) => obj.id); const nodes = useFlowStore((state) => state.nodes); const setNode = useFlowStore((state) => state.setNode); - const options = inputIds.concat(outputIds); - //TODO: show output options for view - const [selectedView, setSelectedView] = useState( - handleSelectChange(options[0]) + const categories = getCategories(); + const [selectedCategory, setSelectedCategory] = useState( + categories[0] ); - // if (outputTypes.includes("ChatOutput")) { - // return ; - // } - function handleSelectChange(selected: string) { - const type = extractTypeFromLongId(selected); - return ; + //TODO: show output options for view + const [selectedView, setSelectedView] = useState("Chat"); + + function getCategories() { + const categories: string[] = []; + if (inputs.length > 0) categories.push("Inputs"); + if (outputs.filter((output) => output.type !== "ChatOutput").length > 0) + categories.push("Outputs"); + if (outputs.map((output) => output.type).includes("ChatOutput")) + categories.push("Chat"); + return categories; + } + + function handleSelectChange(type?: string): ReactNode { + if (selectedCategory === "Chat") return ; switch (type) { - case "ChatOutput": + case "Chat": return ; break; + // case "TextInput": + // break; + default: + //create empty view output screen + return
no view selected
; } } - console.log(inputs); return (
-
- - Inputs +
+ {categories.map((category, index) => { + return ( + //hide chat button if chat is alredy on the view + !(selectedView === category && category === "Chat") && ( + + ) + ); + })}
{inputs .filter((input) => input.type !== "ChatInput") @@ -86,7 +121,7 @@ export default function IOView(): JSX.Element { ); })}
- {selectedView} + {handleSelectChange(selectedView)}
); } diff --git a/src/frontend/src/stores/flowStore.ts b/src/frontend/src/stores/flowStore.ts index 4e8ef5068..447f68713 100644 --- a/src/frontend/src/stores/flowStore.ts +++ b/src/frontend/src/stores/flowStore.ts @@ -82,7 +82,7 @@ const useFlowStore = create((set, get) => ({ flowState: undefined, inputs, outputs, - hasIO: inputs.length > 0 && outputs.length > 0, + hasIO: inputs.length > 0 || outputs.length > 0, flowPool, }); get().reactFlowInstance!.setViewport(viewport); @@ -124,7 +124,7 @@ const useFlowStore = create((set, get) => ({ flowState: undefined, inputs, outputs, - hasIO: inputs.length > 0 && outputs.length > 0, + hasIO: inputs.length > 0 || outputs.length > 0, }); const flowsManager = useFlowsManagerStore.getState(); From 1fb907bf4f0817f7de2513d162592626ccce1150 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Jan 2024 15:37:17 -0300 Subject: [PATCH 23/29] Refactor IOInputField component and update dependencies --- .../src/components/IOInputField/index.tsx | 40 +++++-- src/frontend/src/components/IOview/index.tsx | 113 +++++++++++------- src/frontend/src/types/components/index.ts | 3 +- src/frontend/src/utils/styleUtils.ts | 2 + 4 files changed, 100 insertions(+), 58 deletions(-) diff --git a/src/frontend/src/components/IOInputField/index.tsx b/src/frontend/src/components/IOInputField/index.tsx index 3fc95d3d4..890e397d8 100644 --- a/src/frontend/src/components/IOInputField/index.tsx +++ b/src/frontend/src/components/IOInputField/index.tsx @@ -1,36 +1,54 @@ +import { cloneDeep } from "lodash"; +import useFlowStore from "../../stores/flowStore"; import { IOInputProps } from "../../types/components"; -import IOFileInput from "../IOInputs/FileInput"; import { Textarea } from "../ui/textarea"; export default function IOInputField({ inputType, - field, - updateValue, + inputId, }: IOInputProps): JSX.Element | undefined { + const nodes = useFlowStore((state) => state.nodes); + const setNode = useFlowStore((state) => state.setNode); + const node = nodes.find((node) => node.id === inputId); function handleInputType() { + if (!node) return "no node found"; switch (inputType) { case "TextInput": return (