From d0cf46a849e03fca6fa6c6ad01bb00ff09a853a7 Mon Sep 17 00:00:00 2001 From: Vinicius Vaz Date: Thu, 2 Nov 2023 16:09:27 -0300 Subject: [PATCH 01/72] token expires_in from server and expire timestamp in client --- .../authentication/api/postAuthLogin.ts | 1 + .../authentication/api/postAuthRegister.ts | 6 ++++-- .../authentication/authentication.context.tsx | 17 +++++++++++++++-- rest/schemas/responses/auth.py | 10 ++++------ rest/services/auth_service.py | 18 +++++++++++++----- rest/services/user_service.py | 16 ++++++++++++---- rest/tests/auth/test_auth_router.py | 8 +++++--- 7 files changed, 54 insertions(+), 22 deletions(-) diff --git a/frontend/src/context/authentication/api/postAuthLogin.ts b/frontend/src/context/authentication/api/postAuthLogin.ts index 003a0df9..4ee42820 100644 --- a/frontend/src/context/authentication/api/postAuthLogin.ts +++ b/frontend/src/context/authentication/api/postAuthLogin.ts @@ -10,6 +10,7 @@ interface IPostAuthLoginResponseInterface { user_id: string; group_ids: number[]; access_token: string; + token_expires_in: number; } /** diff --git a/frontend/src/context/authentication/api/postAuthRegister.ts b/frontend/src/context/authentication/api/postAuthRegister.ts index 1f021ee8..d5b875d0 100644 --- a/frontend/src/context/authentication/api/postAuthRegister.ts +++ b/frontend/src/context/authentication/api/postAuthRegister.ts @@ -7,8 +7,9 @@ interface IPostAuthRegisterParams { } interface IPostAuthRegisterResponseInterface { - id: string; + user_id: string; email: string; + token_expires_in: number; groups: Array<{ group_id: number; group_name: string }>; } @@ -27,7 +28,8 @@ export const postAuthRegister: ( export const postAuthRegisterMockResponse: IPostAuthRegisterResponseInterface = { - id: "some_id", + user_id: "some_id", email: "some@email.com", + token_expires_in: 3600, groups: [{ group_id: 0, group_name: "some group" }], }; diff --git a/frontend/src/context/authentication/authentication.context.tsx b/frontend/src/context/authentication/authentication.context.tsx index 0b2af220..badcde5f 100644 --- a/frontend/src/context/authentication/authentication.context.tsx +++ b/frontend/src/context/authentication/authentication.context.tsx @@ -38,15 +38,24 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ const isLogged = useRef(!!store.token); const login = useCallback( - (token: string, userId: string, redirect = "") => { + (token: string, userId: string, tokenExpiresIn: number, redirect = "") => { isLogged.current = true; setStore((store) => ({ ...store, token, userId, + tokenExpiresIn, })); + const currentDate = new Date(); + const tokenExpirationDate = new Date( + currentDate.getTime() + tokenExpiresIn * 1000, + ); localStorage.setItem("auth_token", token); localStorage.setItem("userId", userId); + localStorage.setItem( + "tokenExpiresInTimestamp", + tokenExpirationDate.getTime().toString(), + ); navigate(redirect); }, [navigate], @@ -72,7 +81,11 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ void postAuthLogin({ email, password }) .then((res) => { if (res.status === 200) { - login(res.data.access_token, res.data.user_id); + login( + res.data.access_token, + res.data.user_id, + res.data.token_expires_in, + ); } }) .finally(() => { diff --git a/rest/schemas/responses/auth.py b/rest/schemas/responses/auth.py index c437f11c..f70d1575 100644 --- a/rest/schemas/responses/auth.py +++ b/rest/schemas/responses/auth.py @@ -1,19 +1,17 @@ from pydantic import BaseModel from typing import List -# # Base Models -# class UserGroupBase(BaseModel): -# group_id: int -# group_name: str -# Responses Models class LoginResponse(BaseModel): user_id: int + email: str workspaces_ids: List[int] access_token: str + token_expires_in: int class RegisterResponse(BaseModel): - id: int + user_id: int email: str workspaces_ids: List[int] access_token: str + token_expires_in: int diff --git a/rest/services/auth_service.py b/rest/services/auth_service.py index 606958dd..c6a6bef9 100644 --- a/rest/services/auth_service.py +++ b/rest/services/auth_service.py @@ -13,6 +13,7 @@ import functools from typing import Optional, Dict from cryptography.fernet import Fernet +from math import floor class AuthService(): @@ -36,16 +37,23 @@ def verify_password(cls, plain_password, hashed_password): @classmethod def encode_token(cls, user_id): + exp = datetime.utcnow() + timedelta(days=0, minutes=cls.expire) + current_date = datetime.utcnow() + expires_in = floor((exp - current_date).total_seconds()) + payload = { 'exp': datetime.utcnow() + timedelta(days=0, minutes=cls.expire), 'iat': datetime.utcnow(), 'sub': user_id } - return jwt.encode( - payload, - settings.AUTH_SECRET_KEY, - algorithm=cls.algorithm - ) + return { + "token": jwt.encode( + payload, + settings.AUTH_SECRET_KEY, + algorithm=cls.algorithm + ), + "expires_in": expires_in + } @classmethod def decode_token(cls, token): diff --git a/rest/services/user_service.py b/rest/services/user_service.py index 33fd04ba..2dfa2bbe 100644 --- a/rest/services/user_service.py +++ b/rest/services/user_service.py @@ -44,10 +44,12 @@ async def create_user(self, email: str, password: str): ) user_default_workspace_id = user_default_workspace.id + token_info = self.auth_service.encode_token(user_id=user.id) response = RegisterResponse( - id=user.id, + user_id=user.id, email=user.email, - access_token=self.auth_service.encode_token(user_id=user.id), + access_token=token_info.get('token'), + token_expires_in=token_info.get('expires_in'), workspaces_ids=[user_default_workspace_id] ) @@ -71,8 +73,14 @@ def login_user(self, email: str, password: str) -> LoginResponse: if not self.auth_service.verify_password(password.get_secret_value(), user.password): raise UnauthorizedException() - token = self.auth_service.encode_token(user_id=user.id) - return LoginResponse(access_token=token, user_id=user.id, workspaces_ids=[workspace.workspace.id for workspace in user.workspaces]) + token_info = self.auth_service.encode_token(user_id=user.id) + return LoginResponse( + access_token=token_info.get('token'), + user_id=user.id, + email=user.email, + workspaces_ids=[workspace.workspace.id for workspace in user.workspaces], + token_expires_in=token_info.get('expires_in') + ) async def delete_user(self, user_id: int, auth_context: AuthorizationContextData) -> None: self.logger.info(f"Deleting user with id: {user_id}") diff --git a/rest/tests/auth/test_auth_router.py b/rest/tests/auth/test_auth_router.py index 5275686f..8e8a8f02 100644 --- a/rest/tests/auth/test_auth_router.py +++ b/rest/tests/auth/test_auth_router.py @@ -13,9 +13,10 @@ class TestAuthRouter: @staticmethod def test_register(user: User, register: Response, authorization_token: Dict): mock_response = RegisterResponse( - id=1, + user_id=1, email=user.email, workspaces_ids=[1], + token_expires_in=35999, access_token="access_token" ) response = register @@ -31,7 +32,8 @@ def test_login(user: User, register: Response, login: Response, authorization_to mock_response = LoginResponse( user_id=user.id, email=user.email, - workspaces_ids=[1], + workspaces_ids=[1], + token_expires_in=35999, access_token=authorization_token["header"].split(' ')[1] ) response = login @@ -41,5 +43,5 @@ def test_login(user: User, register: Response, login: Response, authorization_to assert response.status_code == 200 assert content.keys() == mock_response_content.keys() for key in content: - if key != "workspaces_ids": + if key != "workspaces_ids" and key != "token_expires_in": assert content.get(key) == mock_response_content.get(key) From 9411bbf4a877c1d41287c62acb3897b393670cf0 Mon Sep 17 00:00:00 2001 From: Vinicius Vaz Date: Thu, 2 Nov 2023 16:12:02 -0300 Subject: [PATCH 02/72] tokenExpiresInTimestamp --- frontend/src/context/authentication/authentication.context.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/context/authentication/authentication.context.tsx b/frontend/src/context/authentication/authentication.context.tsx index badcde5f..1c090b5f 100644 --- a/frontend/src/context/authentication/authentication.context.tsx +++ b/frontend/src/context/authentication/authentication.context.tsx @@ -53,7 +53,7 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ localStorage.setItem("auth_token", token); localStorage.setItem("userId", userId); localStorage.setItem( - "tokenExpiresInTimestamp", + "tokenExpiresAtTimestamp", tokenExpirationDate.getTime().toString(), ); navigate(redirect); From 36cd083d969206bf2c138fb50655b294f4e95320 Mon Sep 17 00:00:00 2001 From: Vinicius Vaz Date: Fri, 3 Nov 2023 08:30:49 -0300 Subject: [PATCH 03/72] avoid clock drift-jitter --- rest/services/auth_service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rest/services/auth_service.py b/rest/services/auth_service.py index c6a6bef9..7ac095c2 100644 --- a/rest/services/auth_service.py +++ b/rest/services/auth_service.py @@ -40,7 +40,9 @@ def encode_token(cls, user_id): exp = datetime.utcnow() + timedelta(days=0, minutes=cls.expire) current_date = datetime.utcnow() expires_in = floor((exp - current_date).total_seconds()) - + if expires_in >= 120: + expires_in = expires_in - 120 + payload = { 'exp': datetime.utcnow() + timedelta(days=0, minutes=cls.expire), 'iat': datetime.utcnow(), From 3292c5b41379f487a6d4fc8a06bad4c782772d7e Mon Sep 17 00:00:00 2001 From: luiz Date: Tue, 14 Nov 2023 09:29:32 +0100 Subject: [PATCH 04/72] cli stop compose --- src/domino/cli/cli.py | 7 +++++ src/domino/cli/utils/platform.py | 54 +++++++++++++++++--------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/domino/cli/cli.py b/src/domino/cli/cli.py index 55a0349b..afea7620 100644 --- a/src/domino/cli/cli.py +++ b/src/domino/cli/cli.py @@ -219,6 +219,12 @@ def cli_run_platform_compose(d, use_config_file, dev, stop): platform.run_platform_compose(detached=d, use_config_file=use_config_file, dev=dev) +@click.command() +def cli_stop_platform_compose(): + """Stop Domino platform locally with docker compose. Do NOT use this in production.""" + platform.stop_platform_compose() + + @click.group() @click.pass_context def cli_platform(ctx): @@ -233,6 +239,7 @@ def cli_platform(ctx): cli_platform.add_command(cli_create_platform, name="create") cli_platform.add_command(cli_destroy_platform, name="destroy") cli_platform.add_command(cli_run_platform_compose, name="run-compose") +cli_platform.add_command(cli_stop_platform_compose, name="stop-compose") ############################################################################### diff --git a/src/domino/cli/utils/platform.py b/src/domino/cli/utils/platform.py index 7238926e..4ed0d33e 100644 --- a/src/domino/cli/utils/platform.py +++ b/src/domino/cli/utils/platform.py @@ -19,16 +19,19 @@ class AsLiteral(str): - pass + pass + def represent_literal(dumper, data): - return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG, data, style="|") + return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG, data, style="|") + yaml.add_representer(AsLiteral, represent_literal) console = Console() + def create_ssh_pair_key() -> None: # Create SSH key pair for GitHub Workflows console.print("Generating SSH key pair for GitHub Workflows...") @@ -48,12 +51,12 @@ def create_ssh_pair_key() -> None: crypto_serialization.PublicFormat.OpenSSH ) return private_key, public_key - + def prepare_platform( - cluster_name: str, - workflows_repository: str, - github_workflows_ssh_private_key: str, + cluster_name: str, + workflows_repository: str, + github_workflows_ssh_private_key: str, github_default_pieces_repository_token: str, github_workflows_token: str, deploy_mode: str, @@ -67,7 +70,7 @@ def prepare_platform( config_file_path = Path(__file__).resolve().parent / "config-domino-local.toml" with open(str(config_file_path), "rb") as f: config_dict = tomli.load(f) - + running_path = str(Path().cwd().resolve()) config_dict["path"]["DOMINO_LOCAL_RUNNING_PATH"] = running_path config_dict["kind"]["DOMINO_KIND_CLUSTER_NAME"] = cluster_name @@ -83,8 +86,8 @@ def prepare_platform( repo_config_file_path = Path(local_pieces_repository).resolve() / "config.toml" with open(str(repo_config_file_path), "rb") as f: repo_toml = tomli.load(f) - - repo_name = repo_toml['repository']['REPOSITORY_NAME'] + + repo_name = repo_toml['repository']['REPOSITORY_NAME'] config_dict['dev'][repo_name] = local_pieces_repository config_dict['github']['DOMINO_GITHUB_WORKFLOWS_REPOSITORY'] = workflows_repository.split("github.com/")[-1].strip('/') @@ -98,7 +101,7 @@ def prepare_platform( config_dict['github']['DOMINO_GITHUB_ACCESS_TOKEN_WORKFLOWS'] = github_workflows_token config_dict['github']['DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN'] = github_default_pieces_repository_token - + with open("config-domino-local.toml", "wb") as f: tomli_w.dump(config_dict, f) @@ -124,7 +127,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None ) ) extra_mounts_local_repositories = [] - + domino_dev_private_variables_list = [ "DOMINO_LOCAL_DOMINO_PACKAGE", "DOMINO_REST_IMAGE", @@ -196,7 +199,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None yaml.dump(kind_config, f) cluster_name = platform_config["kind"]["DOMINO_KIND_CLUSTER_NAME"] - + # Delete previous Kind cluster console.print("") console.print(f"Removing previous Kind cluster - {cluster_name}...") @@ -232,7 +235,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None local_domino_rest_image = platform_config.get('dev', {}).get('DOMINO_REST_IMAGE', None) domino_airflow_image_tag = 'latest' - domino_airflow_image = "ghcr.io/tauffer-consulting/domino-airflow-base" + domino_airflow_image = "ghcr.io/tauffer-consulting/domino-airflow-base" if local_domino_airflow_image: console.print(f"Loading local Domino Airflow image {local_domino_airflow_image} to Kind cluster...") subprocess.run(["kind", "load", "docker-image", local_domino_airflow_image , "--name", cluster_name, "--nodes", f"{cluster_name}-worker"]) @@ -248,19 +251,19 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None domino_frontend_image = "ghcr.io/tauffer-consulting/domino-frontend:k8s-dev" else: domino_frontend_image = "ghcr.io/tauffer-consulting/domino-frontend:k8s" - + if local_domino_rest_image: console.print(f"Loading local REST image {local_domino_rest_image} to Kind cluster...") subprocess.run(["kind", "load", "docker-image", local_domino_rest_image , "--name", cluster_name, "--nodes", f"{cluster_name}-worker"]) domino_rest_image = f'docker.io/library/{local_domino_rest_image}' elif platform_config['kind']["DOMINO_DEPLOY_MODE"] == 'local-k8s-dev': - domino_rest_image = "ghcr.io/tauffer-consulting/domino-rest:latest-dev" + domino_rest_image = "ghcr.io/tauffer-consulting/domino-rest:latest-dev" else: - domino_rest_image = "ghcr.io/tauffer-consulting/domino-rest:latest" + domino_rest_image = "ghcr.io/tauffer-consulting/domino-rest:latest" # In order to use nvidia gpu in our cluster we need nvidia plugins to be installed. # We can use nvidia operator to install nvidia plugins. - # References: + # References: # https://catalog.ngc.nvidia.com/orgs/nvidia/containers/gpu-operator # https://jacobtomlinson.dev/posts/2022/quick-hack-adding-gpu-support-to-kind/ if use_gpu: @@ -275,8 +278,8 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None # We don't need driver as we are using kind and our host machine already has nvidia driver that is why we are disabling it. nvidia_plugis_install_command = "helm install --wait --generate-name -n gpu-operator --create-namespace nvidia/gpu-operator --set driver.enabled=false" subprocess.run(nvidia_plugis_install_command, shell=True) - - + + # Override values for Domino Helm chart db_enabled = platform_config['domino_db'].get("DOMINO_CREATE_DATABASE", True) token_pieces = platform_config["github"]["DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN"] @@ -565,7 +568,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None ) ) k8s_client.create_persistent_volume(body=pv) - + if platform_config['dev'].get('DOMINO_LOCAL_DOMINO_PACKAGE'): console.print("Creating PV's and PVC's for Local Domino Package...") # Create pv and pvc for local dev domino @@ -656,7 +659,6 @@ def run_platform_compose(detached: bool = False, use_config_file: bool = False, if platform_config['domino_db'].get('DOMINO_DB_HOST') in ['localhost', '0.0.0.0', '127.0.0.1']: os.environ['NETWORK_MODE'] = 'host' - # Create local directories local_path = Path(".").resolve() domino_dir = local_path / "domino_data" @@ -680,8 +682,8 @@ def run_platform_compose(detached: bool = False, use_config_file: bool = False, shutil.copy(str(docker_compose_path), "./docker-compose.yaml") # Run docker-compose up cmd = [ - "docker", - "compose", + "docker", + "compose", "up" ] if detached: @@ -697,8 +699,8 @@ def stop_platform_compose() -> None: docker_compose_path = Path.cwd().resolve() / "docker-compose.yaml" if docker_compose_path.exists(): cmd = [ - "docker", - "compose", + "docker", + "compose", "down" ] completed_process = subprocess.run(cmd) @@ -722,7 +724,7 @@ def stop_and_remove_container(container_name): print(f"Command failed with error: {stderr.decode()}") else: print(stdout.decode()) - + try: container_names = [ "domino-frontend", From 622d2b0801662edc55d9fae9a53f97c78179219e Mon Sep 17 00:00:00 2001 From: luiz Date: Tue, 14 Nov 2023 12:35:24 +0100 Subject: [PATCH 05/72] improve cli for compose --- src/domino/cli/cli.py | 13 +- src/domino/cli/utils/platform.py | 224 ++++++++++++++++++++++++------- 2 files changed, 183 insertions(+), 54 deletions(-) diff --git a/src/domino/cli/cli.py b/src/domino/cli/cli.py index afea7620..e23dce86 100644 --- a/src/domino/cli/cli.py +++ b/src/domino/cli/cli.py @@ -205,18 +205,24 @@ def cli_destroy_platform(): help="Run platform in dev mode.", default=False ) +@click.option( + '--debug', + is_flag=True, + help="Debug mode prints docker compose messages on terminal.", + default=False +) @click.option( '--stop', is_flag=True, help="Stop and remove containers.", default=False ) -def cli_run_platform_compose(d, use_config_file, dev, stop): +def cli_run_platform_compose(d, use_config_file, dev, debug, stop): """Run Domino platform locally with docker compose. Do NOT use this in production.""" if stop: platform.stop_platform_compose() else: - platform.run_platform_compose(detached=d, use_config_file=use_config_file, dev=dev) + platform.run_platform_compose(detached=d, use_config_file=use_config_file, dev=dev, debug=debug) @click.command() @@ -389,7 +395,8 @@ def cli_run_piece_docker(): @click.group() @click.pass_context def cli(ctx): - console.print(msg, style="rgb(109,125,176)", highlight=False) + # console.print(msg, style="rgb(109,125,176)", highlight=False) + console.print("") console.print("Welcome to Domino! :red_heart-emoji:") console.print("") diff --git a/src/domino/cli/utils/platform.py b/src/domino/cli/utils/platform.py index 4ed0d33e..a95f5de7 100644 --- a/src/domino/cli/utils/platform.py +++ b/src/domino/cli/utils/platform.py @@ -3,6 +3,10 @@ import tomli_w import yaml import subprocess +import re +import shutil +import requests +import time from concurrent.futures import ThreadPoolExecutor import base64 from pathlib import Path @@ -15,7 +19,6 @@ from kubernetes import client, config from domino.cli.utils.constants import COLOR_PALETTE, DOMINO_HELM_PATH, DOMINO_HELM_VERSION, DOMINO_HELM_REPOSITORY -import shutil class AsLiteral(str): @@ -637,7 +640,9 @@ def destroy_platform() -> None: console.print("") -def run_platform_compose(detached: bool = False, use_config_file: bool = False, dev: bool = False) -> None: +def run_platform_compose(detached: bool = False, use_config_file: bool = False, dev: bool = False, debug: bool = False) -> None: + console.print("Starting Domino Platform using Docker Compose.") + console.print("Please wait, this might take a few minutes...") # Database default settings create_database = True if use_config_file: @@ -680,69 +685,186 @@ def run_platform_compose(detached: bool = False, use_config_file: bool = False, else: docker_compose_path = Path(__file__).resolve().parent / "docker-compose-without-database.yaml" shutil.copy(str(docker_compose_path), "./docker-compose.yaml") - # Run docker-compose up + + # Environment variables + environment = os.environ.copy() + environment['DOMINO_COMPOSE_DEV'] = '' + if dev: + environment['DOMINO_COMPOSE_DEV'] = '-dev' + + # Run docker compose pull + console.print("\nPulling Docker images...") + pull_cmd = [ + "docker", + "compose", + "pull" + ] + pull_process = subprocess.Popen(pull_cmd, env=environment) + pull_process.wait() + if pull_process.returncode == 0: + console.print(" \u2713 Docker images pulled successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + else: + console.print("Docker images pull failed.", style=f"bold {COLOR_PALETTE.get('error')}") + + # Run docker compose up + console.print("\nStarting services...") cmd = [ "docker", "compose", "up" ] - if detached: + if detached and not debug: cmd.append("-d") - environment = os.environ.copy() - if dev: - environment['DOMINO_COMPOSE_DEV'] = '-dev' - subprocess.Popen(cmd, env=environment) + + if debug: + subprocess.Popen(cmd, env=environment) + else: + airflow_redis_ready = False + airflow_database_ready = False + airflow_init_ready = False + airflow_triggerer_ready = False + airflow_worker_ready = False + airflow_webserver_ready = False + airflow_scheduler_ready = False + domino_database_ready = False + + process = subprocess.Popen(cmd, env=environment, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Read and filter the output + def customize_message( + line: str, + airflow_redis_ready: bool = False, + airflow_database_ready: bool = False, + airflow_init_ready: bool = False, + airflow_triggerer_ready: bool = False, + airflow_worker_ready: bool = False, + airflow_webserver_ready: bool = False, + airflow_scheduler_ready: bool = False, + domino_database_ready: bool = False, + ): + line = line.lower() + line = re.sub(r'\s+', ' ', line) + if not airflow_redis_ready and "airflow-redis" in line and "ready to accept connections tcp" in line: + console.print(" \u2713 Airflow Redis service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_redis_ready = True + if not airflow_database_ready and "airflow-postgres" in line and ("ready" in line or "skipping" in line): + console.print(" \u2713 Airflow database service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_database_ready = True + if not airflow_init_ready and "airflow-init" in line and "exited with code 0" in line: + console.print(" \u2713 Airflow pre-initialization service completed successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_init_ready = True + if not airflow_triggerer_ready and "airflow-triggerer" in line and "starting" in line: + console.print(" \u2713 Airflow triggerer service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_triggerer_ready = True + if not airflow_worker_ready and "airflow-domino-worker" in line and "execute_command" in line: + console.print(" \u2713 Airflow worker service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_worker_ready = True + if not airflow_webserver_ready and "airflow-webserver" in line and "health" in line and "200" in line: + console.print(" \u2713 Airflow webserver service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_webserver_ready = True + if not airflow_scheduler_ready and "airflow-domino-scheduler" in line and "launched" in line: + console.print(" \u2713 Airflow scheduler service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + airflow_scheduler_ready = True + if not domino_database_ready and "domino-postgres" in line and ("ready" in line or "skipping" in line): + console.print(" \u2713 Domino database service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + domino_database_ready = True + return airflow_redis_ready, airflow_database_ready, airflow_init_ready, airflow_triggerer_ready, airflow_worker_ready, airflow_webserver_ready, airflow_scheduler_ready, domino_database_ready + + def check_domino_processes(): + while True: + frontend_response = requests.get("http://localhost:3000").status_code + rest_response = requests.get("http://localhost:8000/health-check").status_code + if frontend_response == 200 and rest_response == 200: + console.print(" \u2713 Domino REST service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + console.print(" \u2713 Domino frontend service started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + break + time.sleep(5) + + for line in process.stdout: + airflow_redis_ready, airflow_database_ready, airflow_init_ready, airflow_triggerer_ready, airflow_worker_ready, airflow_webserver_ready, airflow_scheduler_ready, domino_database_ready = customize_message( + line, airflow_redis_ready, airflow_database_ready, airflow_init_ready, airflow_triggerer_ready, + airflow_worker_ready, airflow_webserver_ready, airflow_scheduler_ready, domino_database_ready) + if all([ + airflow_redis_ready, + airflow_database_ready, + airflow_init_ready, + airflow_triggerer_ready, + airflow_worker_ready, + airflow_webserver_ready, + airflow_scheduler_ready, + domino_database_ready, + ]): + check_domino_processes() + console.print("\n \u2713 All services for Domino Platform started successfully!", style=f"bold {COLOR_PALETTE.get('success')}") + console.print("") + console.print("You can now access them at") + console.print("Domino UI: http://localhost:3000") + console.print("Domino REST API: http://localhost:8000") + console.print("Domino REST API Docs: http://localhost:8000/docs") + console.print("Airflow webserver: http://localhost:8080") + console.print("") + console.print("To stop the platform, run:") + console.print(" $ domino platform stop-compose") + console.print("") + break def stop_platform_compose() -> None: # If "docker-compose.yaml" file is present in current working path, try run "docker compose down" docker_compose_path = Path.cwd().resolve() / "docker-compose.yaml" if docker_compose_path.exists(): + # Setting this environment variable to empty string just to print cleaner messages to terminal + environment = os.environ.copy() + environment['DOMINO_COMPOSE_DEV'] = '' + environment['DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN'] = '' + environment['AIRFLOW_UID'] = '' cmd = [ "docker", "compose", "down" ] - completed_process = subprocess.run(cmd) - if completed_process.returncode == 0: - print("Domino Platform stopped successfully. All containers were removed.") - # If not, try to stop and remove containers by name - else: - def stop_and_remove_container(container_name): - print(f"Stopping {container_name}...") - process = subprocess.Popen(f"docker stop {container_name}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = process.communicate() - if process.returncode != 0: - print(f"Command failed with error: {stderr.decode()}") - else: - print(stdout.decode()) - - print(f"Removing {container_name}...") - process = subprocess.Popen(f"docker rm {container_name}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = process.communicate() - if process.returncode != 0: - print(f"Command failed with error: {stderr.decode()}") - else: - print(stdout.decode()) - - try: - container_names = [ - "domino-frontend", - "domino-rest", - "domino-postgres", - "domino-docker-proxy", - "airflow-domino-scheduler", - "airflow-domino-worker", - "airflow-webserver", - "airflow-triggerer", - "airflow-redis", - "airflow-postgres", - "airflow-flower", - "airflow-cli", - "airflow-init", - ] - with ThreadPoolExecutor() as executor: - executor.map(stop_and_remove_container, container_names) - print("Domino Platform stopped successfully. All containers were removed.") - except Exception as e: - print(f"An error occurred: {e}") + completed_process = subprocess.run(cmd, env=environment) + # if completed_process.returncode == 0: + # print("Domino Platform stopped successfully. All containers were removed.") + + # Stop and remove containers by name + def stop_and_remove_container(container_name): + print(f"Stopping {container_name}...") + process = subprocess.Popen(f"docker stop {container_name}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + if process.returncode != 0: + # print(f"Command failed with error: {stderr.decode()}") + pass + else: + print(stdout.decode()) + + print(f"Removing {container_name}...") + process = subprocess.Popen(f"docker rm {container_name}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + if process.returncode != 0: + # print(f"Command failed with error: {stderr.decode()}") + pass + else: + print(stdout.decode()) + + try: + container_names = [ + "domino-frontend", + "domino-rest", + "domino-postgres", + "domino-docker-proxy", + "airflow-domino-scheduler", + "airflow-domino-worker", + "airflow-webserver", + "airflow-triggerer", + "airflow-redis", + "airflow-postgres", + "airflow-flower", + "airflow-cli", + "airflow-init", + ] + with ThreadPoolExecutor() as executor: + executor.map(stop_and_remove_container, container_names) + console.print("\n \u2713 Domino Platform stopped successfully. All containers were removed.\n", style=f"bold {COLOR_PALETTE.get('success')}") + except Exception as e: + print(f"An error occurred: {e}") From 9aaeacdb3305585cfb4aa900586f08ace22db212 Mon Sep 17 00:00:00 2001 From: luiz Date: Tue, 14 Nov 2023 12:46:20 +0100 Subject: [PATCH 06/72] update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc650aaa..cd9285ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v0.7.1 + +### Features +* Improved terminal messages for `domino platform run-compose` and `domino platform stop-compose` CLI. + + # v0.7.0 ### Features From 27d45cb50d39a09e96e6fe9fbb4ab9e84853a53e Mon Sep 17 00:00:00 2001 From: luiz Date: Tue, 14 Nov 2023 12:52:34 +0100 Subject: [PATCH 07/72] version bump --- src/domino/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/domino/VERSION b/src/domino/VERSION index bcaffe19..7deb86fe 100644 --- a/src/domino/VERSION +++ b/src/domino/VERSION @@ -1 +1 @@ -0.7.0 \ No newline at end of file +0.7.1 \ No newline at end of file From c5a638f861f8e20eef80669c21c6d0a1aef12578 Mon Sep 17 00:00:00 2001 From: Vinicius Vaz Date: Thu, 2 Nov 2023 16:09:27 -0300 Subject: [PATCH 08/72] token expires_in from server and expire timestamp in client --- .../authentication/api/postAuthLogin.ts | 1 + .../authentication/api/postAuthRegister.ts | 6 ++++-- .../authentication/authentication.context.tsx | 17 +++++++++++++++-- rest/schemas/responses/auth.py | 10 ++++------ rest/services/auth_service.py | 18 +++++++++++++----- rest/services/user_service.py | 16 ++++++++++++---- rest/tests/auth/test_auth_router.py | 8 +++++--- 7 files changed, 54 insertions(+), 22 deletions(-) diff --git a/frontend/src/context/authentication/api/postAuthLogin.ts b/frontend/src/context/authentication/api/postAuthLogin.ts index 003a0df9..4ee42820 100644 --- a/frontend/src/context/authentication/api/postAuthLogin.ts +++ b/frontend/src/context/authentication/api/postAuthLogin.ts @@ -10,6 +10,7 @@ interface IPostAuthLoginResponseInterface { user_id: string; group_ids: number[]; access_token: string; + token_expires_in: number; } /** diff --git a/frontend/src/context/authentication/api/postAuthRegister.ts b/frontend/src/context/authentication/api/postAuthRegister.ts index 1f021ee8..d5b875d0 100644 --- a/frontend/src/context/authentication/api/postAuthRegister.ts +++ b/frontend/src/context/authentication/api/postAuthRegister.ts @@ -7,8 +7,9 @@ interface IPostAuthRegisterParams { } interface IPostAuthRegisterResponseInterface { - id: string; + user_id: string; email: string; + token_expires_in: number; groups: Array<{ group_id: number; group_name: string }>; } @@ -27,7 +28,8 @@ export const postAuthRegister: ( export const postAuthRegisterMockResponse: IPostAuthRegisterResponseInterface = { - id: "some_id", + user_id: "some_id", email: "some@email.com", + token_expires_in: 3600, groups: [{ group_id: 0, group_name: "some group" }], }; diff --git a/frontend/src/context/authentication/authentication.context.tsx b/frontend/src/context/authentication/authentication.context.tsx index 0b2af220..badcde5f 100644 --- a/frontend/src/context/authentication/authentication.context.tsx +++ b/frontend/src/context/authentication/authentication.context.tsx @@ -38,15 +38,24 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ const isLogged = useRef(!!store.token); const login = useCallback( - (token: string, userId: string, redirect = "") => { + (token: string, userId: string, tokenExpiresIn: number, redirect = "") => { isLogged.current = true; setStore((store) => ({ ...store, token, userId, + tokenExpiresIn, })); + const currentDate = new Date(); + const tokenExpirationDate = new Date( + currentDate.getTime() + tokenExpiresIn * 1000, + ); localStorage.setItem("auth_token", token); localStorage.setItem("userId", userId); + localStorage.setItem( + "tokenExpiresInTimestamp", + tokenExpirationDate.getTime().toString(), + ); navigate(redirect); }, [navigate], @@ -72,7 +81,11 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ void postAuthLogin({ email, password }) .then((res) => { if (res.status === 200) { - login(res.data.access_token, res.data.user_id); + login( + res.data.access_token, + res.data.user_id, + res.data.token_expires_in, + ); } }) .finally(() => { diff --git a/rest/schemas/responses/auth.py b/rest/schemas/responses/auth.py index c437f11c..f70d1575 100644 --- a/rest/schemas/responses/auth.py +++ b/rest/schemas/responses/auth.py @@ -1,19 +1,17 @@ from pydantic import BaseModel from typing import List -# # Base Models -# class UserGroupBase(BaseModel): -# group_id: int -# group_name: str -# Responses Models class LoginResponse(BaseModel): user_id: int + email: str workspaces_ids: List[int] access_token: str + token_expires_in: int class RegisterResponse(BaseModel): - id: int + user_id: int email: str workspaces_ids: List[int] access_token: str + token_expires_in: int diff --git a/rest/services/auth_service.py b/rest/services/auth_service.py index 606958dd..c6a6bef9 100644 --- a/rest/services/auth_service.py +++ b/rest/services/auth_service.py @@ -13,6 +13,7 @@ import functools from typing import Optional, Dict from cryptography.fernet import Fernet +from math import floor class AuthService(): @@ -36,16 +37,23 @@ def verify_password(cls, plain_password, hashed_password): @classmethod def encode_token(cls, user_id): + exp = datetime.utcnow() + timedelta(days=0, minutes=cls.expire) + current_date = datetime.utcnow() + expires_in = floor((exp - current_date).total_seconds()) + payload = { 'exp': datetime.utcnow() + timedelta(days=0, minutes=cls.expire), 'iat': datetime.utcnow(), 'sub': user_id } - return jwt.encode( - payload, - settings.AUTH_SECRET_KEY, - algorithm=cls.algorithm - ) + return { + "token": jwt.encode( + payload, + settings.AUTH_SECRET_KEY, + algorithm=cls.algorithm + ), + "expires_in": expires_in + } @classmethod def decode_token(cls, token): diff --git a/rest/services/user_service.py b/rest/services/user_service.py index c5623252..d37cea09 100644 --- a/rest/services/user_service.py +++ b/rest/services/user_service.py @@ -43,10 +43,12 @@ async def create_user(self, email: str, password: str): ) user_default_workspace_id = user_default_workspace.id + token_info = self.auth_service.encode_token(user_id=user.id) response = RegisterResponse( - id=user.id, + user_id=user.id, email=user.email, - access_token=self.auth_service.encode_token(user_id=user.id), + access_token=token_info.get('token'), + token_expires_in=token_info.get('expires_in'), workspaces_ids=[user_default_workspace_id] ) @@ -68,8 +70,14 @@ def login_user(self, email: str, password: str) -> LoginResponse: if not self.auth_service.verify_password(password.get_secret_value(), user.password): raise UnauthorizedException() - token = self.auth_service.encode_token(user_id=user.id) - return LoginResponse(access_token=token, user_id=user.id, workspaces_ids=[workspace.workspace.id for workspace in user.workspaces]) + token_info = self.auth_service.encode_token(user_id=user.id) + return LoginResponse( + access_token=token_info.get('token'), + user_id=user.id, + email=user.email, + workspaces_ids=[workspace.workspace.id for workspace in user.workspaces], + token_expires_in=token_info.get('expires_in') + ) async def delete_user(self, user_id: int, auth_context: AuthorizationContextData) -> None: self.logger.info(f"Deleting user with id: {user_id}") diff --git a/rest/tests/auth/test_auth_router.py b/rest/tests/auth/test_auth_router.py index 5275686f..8e8a8f02 100644 --- a/rest/tests/auth/test_auth_router.py +++ b/rest/tests/auth/test_auth_router.py @@ -13,9 +13,10 @@ class TestAuthRouter: @staticmethod def test_register(user: User, register: Response, authorization_token: Dict): mock_response = RegisterResponse( - id=1, + user_id=1, email=user.email, workspaces_ids=[1], + token_expires_in=35999, access_token="access_token" ) response = register @@ -31,7 +32,8 @@ def test_login(user: User, register: Response, login: Response, authorization_to mock_response = LoginResponse( user_id=user.id, email=user.email, - workspaces_ids=[1], + workspaces_ids=[1], + token_expires_in=35999, access_token=authorization_token["header"].split(' ')[1] ) response = login @@ -41,5 +43,5 @@ def test_login(user: User, register: Response, login: Response, authorization_to assert response.status_code == 200 assert content.keys() == mock_response_content.keys() for key in content: - if key != "workspaces_ids": + if key != "workspaces_ids" and key != "token_expires_in": assert content.get(key) == mock_response_content.get(key) From f48f0fa7d6c39cef5262265b93a4ca11944bba28 Mon Sep 17 00:00:00 2001 From: Vinicius Vaz Date: Thu, 2 Nov 2023 16:12:02 -0300 Subject: [PATCH 09/72] tokenExpiresInTimestamp --- frontend/src/context/authentication/authentication.context.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/context/authentication/authentication.context.tsx b/frontend/src/context/authentication/authentication.context.tsx index badcde5f..1c090b5f 100644 --- a/frontend/src/context/authentication/authentication.context.tsx +++ b/frontend/src/context/authentication/authentication.context.tsx @@ -53,7 +53,7 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ localStorage.setItem("auth_token", token); localStorage.setItem("userId", userId); localStorage.setItem( - "tokenExpiresInTimestamp", + "tokenExpiresAtTimestamp", tokenExpirationDate.getTime().toString(), ); navigate(redirect); From e7063680311d4e43fb37351d48e2fc50ccc030d6 Mon Sep 17 00:00:00 2001 From: Vinicius Vaz Date: Fri, 3 Nov 2023 08:30:49 -0300 Subject: [PATCH 10/72] avoid clock drift-jitter --- rest/services/auth_service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rest/services/auth_service.py b/rest/services/auth_service.py index c6a6bef9..7ac095c2 100644 --- a/rest/services/auth_service.py +++ b/rest/services/auth_service.py @@ -40,7 +40,9 @@ def encode_token(cls, user_id): exp = datetime.utcnow() + timedelta(days=0, minutes=cls.expire) current_date = datetime.utcnow() expires_in = floor((exp - current_date).total_seconds()) - + if expires_in >= 120: + expires_in = expires_in - 120 + payload = { 'exp': datetime.utcnow() + timedelta(days=0, minutes=cls.expire), 'iat': datetime.utcnow(), From f1c699d315f5a42e848948ea591a57c3647324e4 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Tue, 14 Nov 2023 14:13:28 -0300 Subject: [PATCH 11/72] feat: verify expiration date --- .../authentication/authentication.context.tsx | 52 ++++++++++++++----- .../authentication.interface.ts | 6 +++ 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/frontend/src/context/authentication/authentication.context.tsx b/frontend/src/context/authentication/authentication.context.tsx index 1c090b5f..ee56f1c6 100644 --- a/frontend/src/context/authentication/authentication.context.tsx +++ b/frontend/src/context/authentication/authentication.context.tsx @@ -1,3 +1,4 @@ +import Loading from "components/Loading"; import React, { type ReactNode, useCallback, @@ -13,6 +14,7 @@ import { createCustomContext } from "utils"; import { postAuthLogin, postAuthRegister } from "./api"; import { + authStatus, type IAuthenticationContext, type IAuthenticationStore, } from "./authentication.interface"; @@ -29,6 +31,7 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ children, }) => { const navigate = useNavigate(); + const [status, setStatus] = useState(authStatus.Loading); const [authLoading, setAuthLoading] = useState(false); const [store, setStore] = useState({ token: localStorage.getItem("auth_token"), @@ -56,6 +59,7 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ "tokenExpiresAtTimestamp", tokenExpirationDate.getTime().toString(), ); + setStatus(authStatus.SignedIn); navigate(redirect); }, [navigate], @@ -69,12 +73,10 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ ...store, token: null, })); + setStatus(authStatus.SignedOut); navigate("/sign-in"); }, [navigate]); - /** - * @todo improve error handling - */ const authenticate = useCallback( async (email: string, password: string) => { setAuthLoading(true); @@ -120,16 +122,15 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ [authenticate], ); - const value = useMemo((): IAuthenticationContext => { - return { - store, - isLogged: isLogged.current, - authLoading, - logout, - authenticate, - register, - }; - }, [store, logout, authenticate, register, authLoading]); + const tokenExpired = useCallback(() => { + const tokenTimestamp = localStorage.getItem("tokenExpiresAtTimestamp"); + if (tokenTimestamp) { + const date1 = Number(tokenTimestamp); + const date2 = new Date().getTime(); + return date1 <= date2; + } + return true; + }, []); /** * Listen to "logout" event and handles it (ie. unauthorized request) @@ -145,6 +146,31 @@ export const AuthenticationProvider: React.FC<{ children: ReactNode }> = ({ }; }, [logout]); + useEffect(() => { + const expired = tokenExpired(); + + if (expired) { + logout(); + } else { + setStatus(authStatus.SignedIn); + } + }, [tokenExpired]); + + const value = useMemo((): IAuthenticationContext => { + return { + store, + isLogged: isLogged.current, + authLoading, + logout, + authenticate, + register, + }; + }, [store, logout, authenticate, register, authLoading]); + + if (status === authStatus.Loading) { + return ; + } + return ( {children} diff --git a/frontend/src/context/authentication/authentication.interface.ts b/frontend/src/context/authentication/authentication.interface.ts index 5d8fd984..b768146f 100644 --- a/frontend/src/context/authentication/authentication.interface.ts +++ b/frontend/src/context/authentication/authentication.interface.ts @@ -3,6 +3,12 @@ export interface IAuthenticationStore { userId: string | null; } +export enum authStatus { + Loading, + SignedIn, + SignedOut, +} + export interface IAuthenticationContext { store: IAuthenticationStore; isLogged: boolean; From 87b536b27188a348a6adfeba40ac061f2d37cdda Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Tue, 14 Nov 2023 18:08:53 -0300 Subject: [PATCH 12/72] feat: add refresh button on runs view --- .../WorkflowRunTableFooter/index.tsx | 20 ++++++++++--------- .../WorkflowDetail/WorkflowRunsTable.tsx | 4 +++- .../components/WorkflowDetail/index.tsx | 1 + 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunTableFooter/index.tsx b/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunTableFooter/index.tsx index 8613b32f..e61f8abb 100644 --- a/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunTableFooter/index.tsx +++ b/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunTableFooter/index.tsx @@ -1,3 +1,4 @@ +import RefreshIcon from "@mui/icons-material/Refresh"; import { Button, Grid } from "@mui/material"; import { type GridSlotsComponentsProps, @@ -8,15 +9,17 @@ import React from "react"; declare module "@mui/x-data-grid" { interface FooterPropsOverrides { triggerRun: () => void; + refresh: () => void; } } interface Props extends NonNullable { triggerRun: () => void; + refresh: () => void; } export const WorkflowRunTableFooter = React.forwardRef( - ({ triggerRun }) => { + ({ triggerRun, refresh }, ref) => { const rootProps = useGridRootProps(); const paginationElement = rootProps.pagination && @@ -26,7 +29,7 @@ export const WorkflowRunTableFooter = React.forwardRef( ); return ( - + ( - - - - diff --git a/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunsTable.tsx b/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunsTable.tsx index ccb4b181..90251537 100644 --- a/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunsTable.tsx +++ b/frontend/src/features/myWorkflows/components/WorkflowDetail/WorkflowRunsTable.tsx @@ -19,6 +19,7 @@ interface Props { selectedRun: IWorkflowRuns | null; onSelectedRunChange: (run: IWorkflowRuns | null) => void; triggerRun: () => void; + refresh: () => void; } export interface WorkflowRunsTableRef { @@ -32,6 +33,7 @@ export const WorkflowRunsTable = forwardRef( selectedRun, onSelectedRunChange: setSelectedRun, triggerRun, + refresh, }, ref, ) => { @@ -164,7 +166,7 @@ export const WorkflowRunsTable = forwardRef( footer: WorkflowRunTableFooter, }} slotProps={{ - footer: { triggerRun }, + footer: { triggerRun, refresh }, }} sx={{ "&.MuiDataGrid-root .MuiDataGrid-cell:focus": { diff --git a/frontend/src/features/myWorkflows/components/WorkflowDetail/index.tsx b/frontend/src/features/myWorkflows/components/WorkflowDetail/index.tsx index 6afd1431..451b7b39 100644 --- a/frontend/src/features/myWorkflows/components/WorkflowDetail/index.tsx +++ b/frontend/src/features/myWorkflows/components/WorkflowDetail/index.tsx @@ -214,6 +214,7 @@ export const WorkflowDetail: React.FC = () => { setAutoUpdate(true); } }} + refresh={refresh} selectedRun={selectedRun} ref={workflowRunsTableRef} onSelectedRunChange={handleSelectRun} From 433cf3b4e2c39fd452b270a7d16d11af203b748c Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 07:00:08 -0300 Subject: [PATCH 13/72] improving workflow gallery modal --- .../WorkflowExamplesGalleryModal/index.tsx | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index 4262ed2c..3b13a5da 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -32,12 +32,14 @@ const WorkflowExamplesGalleryModal = forwardRef( description: "Sends the summary of the last BBCNews youtube channel video to an emails list. You must configure Secrets and Local storage to use it.", jsonFile: YoutubeSummarizerWorkflow, + levelTag: "Advanced", }, { title: "Simple Log Workflow", description: "A simple workflow that logs a message to the console. Useful as starting point for new users.", jsonFile: LogWorkflow, + levelTag: "Beginner", }, ]; @@ -83,8 +85,24 @@ const WorkflowExamplesGalleryModal = forwardRef( /> )} - {card.title} -
+ + {card.title} + +
{card.description}
From 4c3793e4d17640cfeabe398109f0af5a8e908e54 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 08:22:46 -0300 Subject: [PATCH 14/72] improving missing message --- .../components/WorkflowEditor.tsx | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx b/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx index 15ce9e0a..ddd9add1 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx @@ -250,7 +250,14 @@ export const WorkflowsEditorComponent: React.FC = () => { toast.error( "Some repositories are missing or incompatible version", ); - setIncompatiblesPieces(differences); + const uniquePieces = new Set(); + incompatiblesPieces.forEach((item) => { + const pieceWithVersion = `${ + item.split("ghcr.io/")[1].split(":")[0] + }:${item.split("ghcr.io/")[1].split(":")[1].split("-")[0]}`; + uniquePieces.add(pieceWithVersion); + }); + setIncompatiblesPieces(Array.from(uniquePieces)); incompatiblePiecesModalRef.current?.open(); } else { workflowPanelRef?.current?.setNodes(json.workflowNodes); @@ -494,18 +501,19 @@ export const WorkflowsEditorComponent: React.FC = () => { - {incompatiblesPieces.map((item) => ( -
  • - {`${item.split("ghcr.io/")[1].split(":")[0]}: ${ - item - .split("ghcr.io/")[1] - .split(":")[1] - .split("-")[0] - }`} -
  • - ))} - +
    +

    + Some of the pieces necessary to run this workflow are + not present in this workspace. In order to install the + correct versions go to the workspace configuration page + and install the following repositories versions: +

    +
      + {incompatiblesPieces.map((item) => ( +
    • {`${item}`}
    • + ))} +
    +
    } ref={incompatiblePiecesModalRef} /> From 9b91707e4da17a25a8e1d2108481049838c07c80 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 08:50:51 -0300 Subject: [PATCH 15/72] add card level tag --- .../WorkflowExamplesGalleryModal/index.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index 3b13a5da..353ecf31 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -5,6 +5,7 @@ import { Card, CardContent, CardActionArea, + Chip, } from "@mui/material"; import { Modal, type ModalRef } from "components/Modal"; import theme from "providers/theme.config"; @@ -43,6 +44,18 @@ const WorkflowExamplesGalleryModal = forwardRef( }, ]; + const levelTagMap: any = { + Beginner: { + color: "success", + }, + Advanced: { + color: "error", + }, + Intermediate: { + color: "warning", + }, + }; + return ( {card.description}
    + From cf6e04e1fad75f6dc4c9353902a9e3b1cbf9fe54 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 09:07:00 -0300 Subject: [PATCH 16/72] ordering workflows gallery --- .../WorkflowExamplesGalleryModal/index.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index 353ecf31..6142cd1d 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -56,6 +56,19 @@ const WorkflowExamplesGalleryModal = forwardRef( }, }; + cardsContents.sort((a, b) => { + const orderMap: any = { + Beginner: 1, + Intermediate: 2, + Advanced: 3, + }; + + const levelA = orderMap[a.levelTag]; + const levelB = orderMap[b.levelTag]; + + return levelA - levelB; + }); + return ( Date: Wed, 15 Nov 2023 09:18:51 -0300 Subject: [PATCH 17/72] card styles --- .../components/MyWorkflowsGalleryModal/index.tsx | 2 +- .../components/WorkflowExamplesGalleryModal/index.tsx | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx index efb52154..2bccc7e2 100644 --- a/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx @@ -46,7 +46,7 @@ const MyWorkflowExamplesGalleryModal = forwardRef( return ( {card.title} @@ -127,6 +128,8 @@ const WorkflowExamplesGalleryModal = forwardRef( position: "absolute", top: "80px", overflow: "hidden", + paddingRight: "10px", + textAlign: "justify", }} > {card.description} From e375c1fcad386971055eb19a5d8fd247cf74366a Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 09:25:19 -0300 Subject: [PATCH 18/72] my workflows spacing --- .../workflowEditor/components/MyWorkflowsGalleryModal/index.tsx | 2 +- .../components/WorkflowExamplesGalleryModal/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx index 2bccc7e2..3aa61310 100644 --- a/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx @@ -51,7 +51,7 @@ const MyWorkflowExamplesGalleryModal = forwardRef( fullWidth={true} content={ - + {cardsContents.map((card, index) => ( From e27862c83f10040fdf4ecdb8f98a1fe6aed4bfd5 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 09:30:53 -0300 Subject: [PATCH 19/72] increase version column varchar len --- .../alembic/versions/f7214a10a4df_.py | 34 +++++++++++++++++++ rest/database/models/piece_repository.py | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 rest/database/alembic/versions/f7214a10a4df_.py diff --git a/rest/database/alembic/versions/f7214a10a4df_.py b/rest/database/alembic/versions/f7214a10a4df_.py new file mode 100644 index 00000000..01e41d40 --- /dev/null +++ b/rest/database/alembic/versions/f7214a10a4df_.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: f7214a10a4df +Revises: 758034ba1a89 +Create Date: 2023-11-15 09:29:24.616358 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f7214a10a4df' +down_revision = '758034ba1a89' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('piece_repository', 'version', + existing_type=sa.VARCHAR(length=10), + type_=sa.String(length=15), + existing_nullable=True) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('piece_repository', 'version', + existing_type=sa.String(length=15), + type_=sa.VARCHAR(length=10), + existing_nullable=True) + # ### end Alembic commands ### diff --git a/rest/database/models/piece_repository.py b/rest/database/models/piece_repository.py index 6d087b5e..45cdeacf 100644 --- a/rest/database/models/piece_repository.py +++ b/rest/database/models/piece_repository.py @@ -15,7 +15,7 @@ class PieceRepository(Base, BaseDatabaseModel): source = Column(Enum(RepositorySource), nullable=True, default=RepositorySource.github.value) path = Column(String(250), nullable=True) url = Column(String(250), nullable=True) - version = Column(String(10), nullable=True) + version = Column(String(15), nullable=True) dependencies_map = Column(JSON, nullable=True) compiled_metadata = Column(JSON, nullable=True) workspace_id = Column(Integer, ForeignKey("workspace.id", ondelete='cascade'), nullable=False) From fc0e08799fdfb03decd6398722ffdc06678c1d9c Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 09:41:26 -0300 Subject: [PATCH 20/72] my workflows gallery style --- .../components/MyWorkflowsGalleryModal/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx index 3aa61310..37206e43 100644 --- a/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/MyWorkflowsGalleryModal/index.tsx @@ -53,11 +53,11 @@ const MyWorkflowExamplesGalleryModal = forwardRef( {cardsContents.map((card, index) => ( - + From 8cb2403e2c5c87c47195d5fde73311a73b5f2013 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 14:00:33 -0300 Subject: [PATCH 21/72] img filter simple workflow --- .../SidebarForm/PieceForm/PieceFormItem/index.tsx | 11 ++++++----- .../components/WorkflowExamplesGalleryModal/index.tsx | 9 ++++----- .../utils/workflows/image_filter_workflow.json | 1 + .../utils/workflows/simple_log_workflow.json | 1 - 4 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json delete mode 100644 frontend/src/features/workflowEditor/utils/workflows/simple_log_workflow.json diff --git a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx index 46b2320e..fcf56cb6 100644 --- a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx +++ b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx @@ -4,8 +4,8 @@ import CodeEditorInput from "components/CodeEditorInput"; import DatetimeInput from "components/DatetimeInput"; import NumberInput from "components/NumberInput"; import SelectInput from "components/SelectInput"; -import TextInput from "components/TextInput"; import TextAreaInput from "components/TextAreaInput"; +import TextInput from "components/TextInput"; import { type IWorkflowPieceData } from "features/workflowEditor/context/types"; import React, { useMemo } from "react"; import { type Control, useWatch } from "react-hook-form"; @@ -223,10 +223,11 @@ const PieceFormItem: React.FC = ({ /> ); } else if ( - ("type" in schema && - "widget" in schema && - schema.type === "string" && - schema.widget === "textarea")) { + "type" in schema && + "widget" in schema && + schema.type === "string" && + schema.widget === "textarea" + ) { inputElement = ( variant="outlined" diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index a209e81e..d72b8fd3 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -11,7 +11,7 @@ import { Modal, type ModalRef } from "components/Modal"; import theme from "providers/theme.config"; import { forwardRef, type ForwardedRef, useState } from "react"; -import LogWorkflow from "../../utils/workflows/simple_log_workflow.json"; +import ImageFilterWorkflow from "../../utils/workflows/image_filter_workflow.json"; import YoutubeSummarizerWorkflow from "../../utils/workflows/youtube_summarizer.json"; interface WorkflowGalleryModalRef extends ModalRef {} @@ -36,10 +36,9 @@ const WorkflowExamplesGalleryModal = forwardRef( levelTag: "Advanced", }, { - title: "Simple Log Workflow", - description: - "A simple workflow that logs a message to the console. Useful as starting point for new users.", - jsonFile: LogWorkflow, + title: "Image Filter Workflow", + description: "A simple workflow that applies a filter to an image.", + jsonFile: ImageFilterWorkflow, levelTag: "Beginner", }, ]; diff --git a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json new file mode 100644 index 00000000..0f21d88c --- /dev/null +++ b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json @@ -0,0 +1 @@ +{"workflowPieces":{"683_49562660-709a-4a51-a677-63a0325b2dab":{"id":683,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":218},"682_a7131528-2dcc-464e-8e7e-ce0201772877":{"id":682,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":218}},"workflowPiecesData":{"683_49562660-709a-4a51-a677-63a0325b2dab":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_a71315282dcc464e8e7ece0201772877","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (a7131528) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}},"682_a7131528-2dcc-464e-8e7e-ce0201772877":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":" "},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}}},"workflowNodes":[{"id":"683_49562660-709a-4a51-a677-63a0325b2dab","type":"CustomNode","position":{"x":722,"y":249.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":722,"y":249.5},"dragging":false},{"id":"682_a7131528-2dcc-464e-8e7e-ce0201772877","type":"CustomNode","position":{"x":482,"y":268.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":482,"y":268.5},"dragging":false}],"workflowEdges":[{"source":"682_a7131528-2dcc-464e-8e7e-ce0201772877","sourceHandle":"source-682_a7131528-2dcc-464e-8e7e-ce0201772877","target":"683_49562660-709a-4a51-a677-63a0325b2dab","targetHandle":"target-683_49562660-709a-4a51-a677-63a0325b2dab","id":"reactflow__edge-682_a7131528-2dcc-464e-8e7e-ce0201772877source-682_a7131528-2dcc-464e-8e7e-ce0201772877-683_49562660-709a-4a51-a677-63a0325b2dabtarget-683_49562660-709a-4a51-a677-63a0325b2dab"}]} \ No newline at end of file diff --git a/frontend/src/features/workflowEditor/utils/workflows/simple_log_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/simple_log_workflow.json deleted file mode 100644 index df891b6b..00000000 --- a/frontend/src/features/workflowEditor/utils/workflows/simple_log_workflow.json +++ /dev/null @@ -1 +0,0 @@ -{"workflowPieces":{"7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1":{"id":7,"name":"SimpleLogPiece","description":"A Piece that simply logs its input","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.5.0-group0","input_schema":{"$defs":{"InputEnum":{"enum":["option1","option2","option3"],"title":"InputEnum","type":"string"}},"description":"SimpleLogPiece Input Model","properties":{"input_str":{"default":"default value","description":"Input string to be logged.","title":"Input Str","type":"string"},"input_int":{"default":10,"description":"Input integer to be logged.","title":"Input Int","type":"integer"},"input_float":{"default":10.5,"description":"Input float to be logged.","title":"Input Float","type":"number"},"input_bool":{"default":false,"description":"Input boolean to be logged.","title":"Input Bool","type":"boolean"},"input_enum":{"allOf":[{"$ref":"#/$defs/InputEnum"}],"default":"option1","description":"Input enum to be logged."},"input_date":{"default":"2023-01-01","description":"Input date to be logged.","format":"date","title":"Input Date","type":"string"},"input_time":{"default":"16:20:00","description":"Input time to be logged.","format":"time","title":"Input Time","type":"string"},"input_datetime":{"default":"2023-01-01T16:20:00","description":"Input datetime to be logged.","format":"date-time","title":"Input Datetime","type":"string"},"input_array":{"default":["default_1","default_2","default_3"],"description":"Input array to be logged.","items":{"type":"string"},"title":"Input Array","type":"array"},"input_code":{"default":"print('Hello world!')","description":"Input code to be logged.","title":"Input Code","type":"string","widget":"codeeditor"}},"title":"SimpleLogPiece","type":"object"},"output_schema":{"description":"SimpleLogPiece Output Model","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"output_msg":{"description":"Value that was logged.","title":"Output Msg","type":"string"},"output_str":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Output string to be logged.","title":"Output Str"},"output_int":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Output integer to be logged.","title":"Output Int"},"output_float":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Output float to be logged.","title":"Output Float"},"output_bool":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Output boolean to be logged.","title":"Output Bool"},"output_date":{"description":"Output date to be logged.","format":"date","title":"Output Date","type":"string"},"output_time":{"description":"Output time to be logged.","format":"time","title":"Output Time","type":"string"},"output_datetime":{"description":"Output datetime to be logged.","format":"date-time","title":"Output Datetime","type":"string"},"output_array":{"description":"Output array to be logged.","items":{"type":"string"},"title":"Output Array","type":"array"},"output_code":{"description":"Input code to be logged.","title":"Output Code","type":"string","widget":"codeeditor"}},"required":["output_msg","output_str","output_int","output_float","output_bool","output_date","output_time","output_datetime","output_array","output_code"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"SimpleLogPiece","label":"Simple Log Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fa-solid:file-alt","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/SimpleLogPiece","repository_id":2},"5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9":{"id":5,"name":"GetDateTimePiece","description":"A Piece that gets current system date and time.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.5.0-group0","input_schema":{"$defs":{"TZOptions":{"enum":["(UTC-11) - Pacific/Pago_Pago","(UTC-10) - US/Hawaii","(UTC-09) - Pacific/Gambier","(UTC-08) - US/Alaska","(UTC-07) - US/Pacific","(UTC-06) - US/Mountain","(UTC-05) - US/Central","(UTC-04) - US/Eastern","(UTC-03) - Canada/Atlantic","(UTC-02) - Atlantic/South_Georgia","(UTC-01) - Atlantic/Cape_Verde","(UTC+00) - UTC","(UTC+01) - Europe/London","(UTC+02) - Europe/Zurich","(UTC+03) - Indian/Mayotte","(UTC+04) - Asia/Tehran","(UTC+05) - Asia/Kathmandu","(UTC+06) - Indian/Cocos","(UTC+07) - Indian/Christmas","(UTC+08) - Australia/Eucla","(UTC+09) - Australia/Darwin","(UTC+10) - Australia/Lord_Howe","(UTC+11) - Pacific/Pohnpei","(UTC+12) - Pacific/Chatham","(UTC+13) - Pacific/Tongatapu","(UTC+14) - Pacific/Kiritimati"],"title":"TZOptions","type":"string"}},"description":"GetDateTimePiece Input Model","properties":{"use_timezone":{"default":false,"description":"Whether to use a timezone for the timestamp.","title":"Use Timezone","type":"boolean"},"timezone":{"allOf":[{"$ref":"#/$defs/TZOptions"}],"default":"(UTC+00) - UTC","description":"Timezone to use for timestamp."}},"title":"GetDateTimePiece","type":"object"},"output_schema":{"description":"GetDateTimePiece Output Model","properties":{"date":{"description":"Date of the timestamp, in ISO format.","format":"date","title":"Date","type":"string"},"time":{"description":"Time of the timestamp, in ISO format.","format":"time","title":"Time","type":"string"},"datetime":{"description":"Datetime of the timestamp, in ISO format.","format":"date-time","title":"Datetime","type":"string"}},"required":["date","time","datetime"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetDateTimePiece","label":"Get Datetime","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fa:calendar-o","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetDateTimePiece","repository_id":2}},"workflowPiecesData":{"7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_str":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"default value"},"input_int":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"input_float":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10.5},"input_bool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"input_enum":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"option1"},"input_date":{"fromUpstream":true,"upstreamId":"GetDateTim_77847bb5ba3b4f9eb2ea92319b5150a9","upstreamArgument":"date","upstreamValue":"GetDateTimePiece (77847bb5) - Date","value":"2023-01-01"},"input_time":{"fromUpstream":true,"upstreamId":"GetDateTim_77847bb5ba3b4f9eb2ea92319b5150a9","upstreamArgument":"time","upstreamValue":"GetDateTimePiece (77847bb5) - Time","value":"16:20:00"},"input_datetime":{"fromUpstream":true,"upstreamId":"GetDateTim_77847bb5ba3b4f9eb2ea92319b5150a9","upstreamArgument":"datetime","upstreamValue":"GetDateTimePiece (77847bb5) - Datetime","value":"2023-01-01T16:20:00"},"input_array":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"default_1"},{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"default_2"},{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"default_3"}]},"input_code":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"print('Hello world!')"}}},"5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"use_timezone":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"timezone":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"(UTC+00) - UTC"}}}},"workflowNodes":[{"id":"7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1","type":"CustomNode","position":{"x":147,"y":-58},"data":{"name":"SimpleLogPiece","style":{"module":"SimpleLogPiece","label":"Simple Log Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fa-solid:file-alt","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":933,"y":233.5},"dragging":false},{"id":"5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9","type":"CustomNode","position":{"x":-103,"y":-58},"data":{"name":"GetDateTimePiece","style":{"module":"GetDateTimePiece","label":"Get Datetime","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fa:calendar-o","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":640,"y":245.5},"dragging":false}],"workflowEdges":[{"source":"5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9","sourceHandle":"source-5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9","target":"7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1","targetHandle":"target-7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1","id":"reactflow__edge-5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9source-5_77847bb5-ba3b-4f9e-b2ea-92319b5150a9-7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1target-7_907ad4d7-4fc8-4a27-90a0-d0a65f2a08f1"}]} \ No newline at end of file From 330a55caeb0987c009118144fc087468a5a043fb Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 14:35:46 -0300 Subject: [PATCH 22/72] fix validation --- .../components/SidebarForm/PieceForm/validation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/validation.ts b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/validation.ts index b4d7313a..ab00dc08 100644 --- a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/validation.ts +++ b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/validation.ts @@ -161,7 +161,7 @@ function getValidationValueBySchemaType(schema: any, required: boolean) { if (fromUpstream) { return yup.mixed().notRequired(); } - return required ? yup.string().required() : yup.string(); + return required ? yup.string().required() : yup.string().nullable(); }), }); } else if (schema.type === "object") { From f568a56bff1e789d4ce157e859d2d127abaf65ed Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 14:35:54 -0300 Subject: [PATCH 23/72] update img workflow to default pieces 0.7 --- .../workflowEditor/utils/workflows/image_filter_workflow.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json index 0f21d88c..4c1adb51 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json +++ b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json @@ -1 +1 @@ -{"workflowPieces":{"683_49562660-709a-4a51-a677-63a0325b2dab":{"id":683,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":218},"682_a7131528-2dcc-464e-8e7e-ce0201772877":{"id":682,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":218}},"workflowPiecesData":{"683_49562660-709a-4a51-a677-63a0325b2dab":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_a71315282dcc464e8e7ece0201772877","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (a7131528) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}},"682_a7131528-2dcc-464e-8e7e-ce0201772877":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":" "},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}}},"workflowNodes":[{"id":"683_49562660-709a-4a51-a677-63a0325b2dab","type":"CustomNode","position":{"x":722,"y":249.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":722,"y":249.5},"dragging":false},{"id":"682_a7131528-2dcc-464e-8e7e-ce0201772877","type":"CustomNode","position":{"x":482,"y":268.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":482,"y":268.5},"dragging":false}],"workflowEdges":[{"source":"682_a7131528-2dcc-464e-8e7e-ce0201772877","sourceHandle":"source-682_a7131528-2dcc-464e-8e7e-ce0201772877","target":"683_49562660-709a-4a51-a677-63a0325b2dab","targetHandle":"target-683_49562660-709a-4a51-a677-63a0325b2dab","id":"reactflow__edge-682_a7131528-2dcc-464e-8e7e-ce0201772877source-682_a7131528-2dcc-464e-8e7e-ce0201772877-683_49562660-709a-4a51-a677-63a0325b2dabtarget-683_49562660-709a-4a51-a677-63a0325b2dab"}]} \ No newline at end of file +{"workflowPieces":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"id":694,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":219},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"id":695,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":219}},"workflowPiecesData":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_27dd10b0cd4b41a5bb118468b0a3c60b","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (27dd10b0) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}}},"workflowNodes":[{"id":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","type":"CustomNode","position":{"x":369,"y":188.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","type":"CustomNode","position":{"x":656,"y":161.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"dragging":false}],"workflowEdges":[{"source":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","sourceHandle":"source-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","target":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","targetHandle":"target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62","id":"reactflow__edge-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60bsource-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b-695_7a0d7be2-528e-4149-831a-d0a4308dcb62target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62"}]} \ No newline at end of file From 6fda8c982d8bec4c3eb2aa7816cedd62f208e004 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Wed, 15 Nov 2023 15:46:14 -0300 Subject: [PATCH 24/72] fix: invalid token message --- .../workspaces/api/getWorkspaceMembers.ts | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/frontend/src/context/workspaces/api/getWorkspaceMembers.ts b/frontend/src/context/workspaces/api/getWorkspaceMembers.ts index d5a06313..e270380a 100644 --- a/frontend/src/context/workspaces/api/getWorkspaceMembers.ts +++ b/frontend/src/context/workspaces/api/getWorkspaceMembers.ts @@ -12,22 +12,37 @@ interface IGetWorkspaceMembers { pageSize: number; } +const getWorkspaceUsersUrl = ( + auth: boolean, + workspaceId: string, + page: number, + pageSize: number, +) => { + return auth && workspaceId + ? `/workspaces/${workspaceId}/users?page=${page}&page_size=${pageSize}` + : null; +}; + /** * Get workspaces using GET /workspaces * @returns workspaces */ const getWorkspaceUsers: ( + auth: boolean, workspaceId: string, page: number, pageSize: number, -) => Promise> = async ( +) => Promise | undefined> = async ( + auth, workspaceId, page, pageSize, ) => { - return await dominoApiClient.get( - `/workspaces/${workspaceId}/users?page=${page}&page_size=${pageSize}`, - ); + if (auth && workspaceId && page && pageSize) { + const url = getWorkspaceUsersUrl(auth, workspaceId, page, pageSize); + + if (url) return await dominoApiClient.get(url); + } }; /** @@ -37,30 +52,31 @@ const getWorkspaceUsers: ( export const useAuthenticatedGetWorkspaceUsers = ( params: IGetWorkspaceMembers, ) => { - const fetcher = useCallback(async (params: IGetWorkspaceMembers) => { - return await getWorkspaceUsers( - params.workspaceId, - params.page, - params.pageSize, - ).then((data) => data.data); - }, []); - - const auth = useAuthentication(); - if (!params.page) { params.page = 0; } if (!params.pageSize) { params.pageSize = 10; } + + const auth = useAuthentication(); + + const fetcher = useCallback(async () => { + return await getWorkspaceUsers( + auth.isLogged, + params.workspaceId, + params.page, + params.pageSize, + ).then((data) => data?.data); + }, [params, auth]); + return useSWR( - auth.isLogged && params.workspaceId - ? `/workspaces/${params.workspaceId}/users?page=${params.page}&page_size=${params.pageSize}` - : null, - async () => await fetcher(params), - { - revalidateOnFocus: false, - revalidateOnReconnect: false, - }, + getWorkspaceUsersUrl( + auth.isLogged, + params.workspaceId, + params.page, + params.pageSize, + ), + fetcher, ); }; From dd4b879631ccdd95c858839142966b1c80d50517 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 16:20:22 -0300 Subject: [PATCH 25/72] add possibility of not required secrets --- rest/schemas/responses/secret.py | 3 ++- rest/services/secret_service.py | 7 +++++-- rest/services/workflow_service.py | 4 ++-- .../custom_operators/docker_operator.py | 19 +++++++++++-------- src/domino/custom_operators/k8s_operator.py | 10 ++++++---- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/rest/schemas/responses/secret.py b/rest/schemas/responses/secret.py index 677e775b..9167fae2 100644 --- a/rest/schemas/responses/secret.py +++ b/rest/schemas/responses/secret.py @@ -19,4 +19,5 @@ class ListRepositorySecretsResponse(BaseModel): class GetSecretsByPieceResponse(BaseModel): name: str - value: Optional[str] = None \ No newline at end of file + value: Optional[str] = None + required: bool \ No newline at end of file diff --git a/rest/services/secret_service.py b/rest/services/secret_service.py index c43f9bb4..f9c75009 100644 --- a/rest/services/secret_service.py +++ b/rest/services/secret_service.py @@ -111,7 +111,9 @@ def get_piece_secrets( piece_item = self.piece_repository.find_by_name_and_repository_id(name=piece_name, repository_id=piece_repository_id) if not piece_item: raise ResourceNotFoundException() - + + + piece_item_required_secrets = piece_item.secrets_schema.get('required', []) secrets_names = self.piece_repository.get_piece_secrets_names_by_repository_id(name=piece_name, repository_id=piece_repository_id) secrets_names = [e[0] for e in secrets_names] @@ -128,7 +130,8 @@ def get_piece_secrets( response.append( GetSecretsByPieceResponse( name=secret, - value=decoded_value + value=decoded_value, + required=secret in piece_item_required_secrets ) ) diff --git a/rest/services/workflow_service.py b/rest/services/workflow_service.py index 59e9de51..e111710d 100644 --- a/rest/services/workflow_service.py +++ b/rest/services/workflow_service.py @@ -331,7 +331,7 @@ def _validate_workflow_tasks(self, tasks_dict: dict, workspace_id: int): piece_name=shared_storage_piece_name, ) for secret in shared_storage_secrets: - if not secret.value: + if not secret.value and not secret.required: raise BadRequestException("Missing secrets for shared storage.") # Find necessary repositories from pieces names and workspace_id @@ -351,7 +351,7 @@ def _validate_workflow_tasks(self, tasks_dict: dict, workspace_id: int): piece_name=piece_name, ) for secret in piece_secrets: - if not secret.value: + if not secret.value and secret.required: raise ResourceNotFoundException(f"Secret {secret.name} missing for {piece_name}.") return True diff --git a/src/domino/custom_operators/docker_operator.py b/src/domino/custom_operators/docker_operator.py index 62bd6600..69e0be3b 100644 --- a/src/domino/custom_operators/docker_operator.py +++ b/src/domino/custom_operators/docker_operator.py @@ -53,14 +53,15 @@ def __init__( mounts = [] # TODO remove - used in DEV only ####################### - dev_pieces = False + dev_pieces = True if dev_pieces: piece_repo_name = repository_url.split("/")[-1] - local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" + #local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" + local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" mounts = [ # TODO remove - # Mount(source='/home/vinicius/Documents/work/tauffer/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), - Mount(source='/mnt/shared_storage/Github/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), + Mount(source='/home/vinicius/Documents/work/tauffer/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), + #Mount(source='/mnt/shared_storage/Github/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), Mount(source=local_repos_path, target='/home/domino/pieces_repository/', type='bind', read_only=True), ] ######################################################## @@ -102,10 +103,12 @@ def _get_piece_secrets(self) -> Dict[str, Any]: ) if secrets_response.status_code != 200: raise Exception(f"Error getting piece secrets: {secrets_response.json()}") - piece_secrets = { - e.get('name'): e.get('value') - for e in secrets_response.json() - } + piece_secrets = {} + for e in secrets_response.json(): + if not e.get('value') and not e.get('required'): + continue + piece_secrets[e.get('name')] = e.get('value') + return piece_secrets @staticmethod diff --git a/src/domino/custom_operators/k8s_operator.py b/src/domino/custom_operators/k8s_operator.py index 74f16253..2293ed87 100644 --- a/src/domino/custom_operators/k8s_operator.py +++ b/src/domino/custom_operators/k8s_operator.py @@ -365,10 +365,12 @@ def _get_piece_secrets( ) if secrets_response.status_code != 200: raise Exception(f"Error getting piece secrets: {secrets_response.json()}") - piece_secrets = { - e.get('name'): e.get('value') - for e in secrets_response.json() - } + + piece_secrets = {} + for e in secrets_response.json(): + if not e.get('value') and not e.get('required'): + continue + piece_secrets[e.get('name')] = e.get('value') return piece_secrets From d0bb6a072a48a575e4af894388dc3514c8b8d0e8 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Wed, 15 Nov 2023 16:29:42 -0300 Subject: [PATCH 26/72] fix: types --- frontend/src/context/authentication/api/postAuthLogin.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/context/authentication/api/postAuthLogin.ts b/frontend/src/context/authentication/api/postAuthLogin.ts index 4ee42820..bbf42904 100644 --- a/frontend/src/context/authentication/api/postAuthLogin.ts +++ b/frontend/src/context/authentication/api/postAuthLogin.ts @@ -30,4 +30,5 @@ export const postAuthLoginMockResponse: IPostAuthLoginResponseInterface = { user_id: "some_id", group_ids: [0], access_token: "MOCK ACCESS TOKEN", + token_expires_in: new Date().getTime() + 10000, }; From 5d069ea3df5dc466e5a12be8ed89f3460f197b45 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 15 Nov 2023 16:34:15 -0300 Subject: [PATCH 27/72] basic nasa workflow --- .../components/WorkflowExamplesGalleryModal/index.tsx | 7 +++++++ .../workflowEditor/utils/workflows/nasa_workflow.json | 1 + 2 files changed, 8 insertions(+) create mode 100644 frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index d72b8fd3..25618566 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -12,6 +12,7 @@ import theme from "providers/theme.config"; import { forwardRef, type ForwardedRef, useState } from "react"; import ImageFilterWorkflow from "../../utils/workflows/image_filter_workflow.json"; +import NasaImageWorkflow from "../../utils/workflows/nasa_workflow.json"; import YoutubeSummarizerWorkflow from "../../utils/workflows/youtube_summarizer.json"; interface WorkflowGalleryModalRef extends ModalRef {} @@ -41,6 +42,12 @@ const WorkflowExamplesGalleryModal = forwardRef( jsonFile: ImageFilterWorkflow, levelTag: "Beginner", }, + { + title: "NASA Image Workflow", + description: "A simple workflow that gets an image from NASA API.", + jsonFile: NasaImageWorkflow, + levelTag: "Beginner", + }, ]; const levelTagMap: any = { diff --git a/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json new file mode 100644 index 00000000..bb0bbf32 --- /dev/null +++ b/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json @@ -0,0 +1 @@ +{"workflowPieces":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"id":705,"name":"NasaEarthImagePiece","description":"This Piece uses the NASA EPIC API to get satellite images of the Earth.\nReferences: \n- https://epic.gsfc.nasa.gov/about/api \n- https://api.nasa.gov/","dependency":{"dockerfile":null,"requirements_file":"requirements.txt"},"source_image":"ghcr.io/tauffer-consulting/data_apis_domino_pieces:0.2.0-group0","input_schema":{"$defs":{"LocationTypes":{"enum":["random","America","Atlantic Ocean","Africa","Asia","Pacific Ocean"],"title":"LocationTypes","type":"string"}},"properties":{"location":{"allOf":[{"$ref":"#/$defs/LocationTypes"}],"default":"random","description":"Retrieve image centered approximately on this location."}},"title":"NasaEarthImagePiece","type":"object"},"output_schema":{"properties":{"image_url":{"default":null,"description":"URL of the image.","title":"Image Url","type":"string"},"image_base64_string":{"default":null,"description":"Output data as base64 encoded string.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":null,"description":"Path to the image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"properties":{"NASA_API_KEY":{"default":"DEMO_KEY","description":"API key for NASA Earth Image API.","title":"Nasa Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces/tree/main/pieces/NasaEarthImagePiece","repository_id":221}},"workflowPiecesData":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"location":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"random"}}}},"workflowNodes":[{"id":"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52","type":"CustomNode","position":{"x":718,"y":212.5},"data":{"name":"NasaEarthImagePiece","style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":718,"y":212.5},"dragging":false}],"workflowEdges":[]} \ No newline at end of file From 1ca69aed51321b1fbc6f28a8321749dfbf494f98 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 16 Nov 2023 09:14:53 -0300 Subject: [PATCH 28/72] fix: verify members table --- frontend/src/context/workspaces/api/getWorkspaceMembers.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/context/workspaces/api/getWorkspaceMembers.ts b/frontend/src/context/workspaces/api/getWorkspaceMembers.ts index e270380a..9a478027 100644 --- a/frontend/src/context/workspaces/api/getWorkspaceMembers.ts +++ b/frontend/src/context/workspaces/api/getWorkspaceMembers.ts @@ -38,7 +38,7 @@ const getWorkspaceUsers: ( page, pageSize, ) => { - if (auth && workspaceId && page && pageSize) { + if (auth && workspaceId && !isNaN(page) && !isNaN(pageSize)) { const url = getWorkspaceUsersUrl(auth, workspaceId, page, pageSize); if (url) return await dominoApiClient.get(url); @@ -68,7 +68,7 @@ export const useAuthenticatedGetWorkspaceUsers = ( params.page, params.pageSize, ).then((data) => data?.data); - }, [params, auth]); + }, [params]); return useSWR( getWorkspaceUsersUrl( From b16a4bd34d2f0eb8c7f2c30c65dc5167883f66f2 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 09:49:05 -0300 Subject: [PATCH 29/72] improving create piece repository response time --- rest/services/piece_repository_service.py | 22 +++++++++----- rest/services/piece_service.py | 37 ++++++----------------- rest/services/workspace_service.py | 1 - 3 files changed, 24 insertions(+), 36 deletions(-) diff --git a/rest/services/piece_repository_service.py b/rest/services/piece_repository_service.py index 97a95b13..bc1099eb 100644 --- a/rest/services/piece_repository_service.py +++ b/rest/services/piece_repository_service.py @@ -243,13 +243,11 @@ def create_piece_repository( try: # Create pieces for this repository in database self._update_repository_pieces( - source=piece_repository_data.source, - path=piece_repository_data.path, repository_id=repository.id, - version=piece_repository_data.version, - github_access_token=token + source=piece_repository_data.source, + compiled_metadata=repository_files_metadata['compiled_metadata'], + dependencies_map=repository_files_metadata['dependencies_map'], ) - # Create secrets for the repository with null values secrets_to_update = list() for value in repository_files_metadata['dependencies_map'].values(): @@ -320,11 +318,21 @@ def _read_data_from_github(self, path: str, version: str, github_access_token: s } return data - def _update_repository_pieces(self, source: str, path: str, repository_id: int, version: str, github_access_token: str): + def _update_repository_pieces( + self, + source: str, + compiled_metadata: dict, + dependencies_map: dict, + repository_id: int, + ): read_pieces_from_github = { "github": self.piece_service.check_pieces_to_update_github } - read_pieces_from_github[source](repo_name=path, repository_id=repository_id, version=version, github_access_token=github_access_token) + read_pieces_from_github[source]( + repository_id=repository_id, + compiled_metadata=compiled_metadata, + dependencies_map=dependencies_map, + ) def _read_repository_data(self, source: str, path: str, version: str, github_access_token: str): read_metadata_from_source_map = { diff --git a/rest/services/piece_service.py b/rest/services/piece_service.py index 57663613..56970e0d 100644 --- a/rest/services/piece_service.py +++ b/rest/services/piece_service.py @@ -62,39 +62,20 @@ def list_pieces( ] - def check_pieces_to_update_github(self, repo_name: str, repository_id: int, version: str, github_access_token: str) -> None: - """Check if there are new pieces in the github repository and update them if necessary - - Args: - repo_name (str): Github repository name - repository_id (int): User group id being updated - """ - github_rest_client = GithubRestClient(token=github_access_token) - tag = github_rest_client.get_tag(repo_name=repo_name, tag_name=version) - if not tag: - raise ResourceNotFoundException(message=f"Version {version} not found in repository {repo_name}") - tag_commit_sha = str(tag.commit.sha) - github_pieces_names_list = [e.name for e in github_rest_client.get_contents(repo_name=repo_name, file_path='pieces', commit_sha=tag_commit_sha) if e.type == 'dir'] - - compiled_metadata = github_rest_client.get_contents( - repo_name=repo_name, - file_path=f".domino/compiled_metadata.json", - commit_sha=tag_commit_sha - ) - compiled_metadata_dict = json.loads(compiled_metadata.decoded_content.decode('utf-8')) - dependencies_map = github_rest_client.get_contents( - repo_name=repo_name, - file_path=f".domino/dependencies_map.json", - commit_sha=tag_commit_sha - ) - dependencies_map_dict = json.loads(dependencies_map.decoded_content.decode('utf-8')) + def check_pieces_to_update_github( + self, + repository_id: int, + compiled_metadata: dict, + dependencies_map: dict, + ) -> None: + github_pieces_names_list = list(compiled_metadata.keys()) updated_pieces_list = list() for piece_name in github_pieces_names_list: # Create piece if it does not exist, update if it exists (ignoring version control) - piece_metadata = compiled_metadata_dict[piece_name] + piece_metadata = compiled_metadata[piece_name] self._update_pieces_from_metadata( piece_metadata=piece_metadata, - dependencies_map=dependencies_map_dict, + dependencies_map=dependencies_map, repository_id=repository_id ) response_msg = ", ".join(updated_pieces_list) if len(updated_pieces_list) > 0 else "None" diff --git a/rest/services/workspace_service.py b/rest/services/workspace_service.py index 034dad99..b1be338c 100644 --- a/rest/services/workspace_service.py +++ b/rest/services/workspace_service.py @@ -73,7 +73,6 @@ def create_workspace( github_access_token=None, user_permission=Permission.owner.value ) - self.piece_repository_service.create_piece_repository( piece_repository_data=CreateRepositoryRequest( workspace_id=workspace.id, From 643da210ac51a8e6d24a29dcd227708e6f6ddc57 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 10:23:31 -0300 Subject: [PATCH 30/72] add github token in cli compose --- src/domino/cli/cli.py | 19 ++++++++++++++++--- src/domino/cli/utils/platform.py | 11 ++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/domino/cli/cli.py b/src/domino/cli/cli.py index e23dce86..5be33faf 100644 --- a/src/domino/cli/cli.py +++ b/src/domino/cli/cli.py @@ -3,7 +3,7 @@ import click import os import uuid - +import tomli from domino.cli.utils import pieces_repository, platform import ast @@ -65,6 +65,14 @@ def get_registry_token_from_env(): return os.environ.get('GHCR_PASSWORD', "") +def get_github_token_pieces_from_config_or_env(): + if Path('config-domino-local.toml').is_file(): + with open("config-domino-local.toml", "rb") as f: + config = tomli.load(f) + return config.get('github').get('DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN', None) + + return os.environ.get("DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN", None) + @click.command() @click.option( '--cluster-name', @@ -217,12 +225,17 @@ def cli_destroy_platform(): help="Stop and remove containers.", default=False ) -def cli_run_platform_compose(d, use_config_file, dev, debug, stop): +@click.option( + '--github-token', + prompt='Github token for access default pieces repositories', + default=get_github_token_pieces_from_config_or_env, +) +def cli_run_platform_compose(d, use_config_file, dev, debug, stop, github_token): """Run Domino platform locally with docker compose. Do NOT use this in production.""" if stop: platform.stop_platform_compose() else: - platform.run_platform_compose(detached=d, use_config_file=use_config_file, dev=dev, debug=debug) + platform.run_platform_compose(github_token=github_token, detached=d, use_config_file=use_config_file, dev=dev, debug=debug) @click.command() diff --git a/src/domino/cli/utils/platform.py b/src/domino/cli/utils/platform.py index a95f5de7..2b09a968 100644 --- a/src/domino/cli/utils/platform.py +++ b/src/domino/cli/utils/platform.py @@ -640,7 +640,13 @@ def destroy_platform() -> None: console.print("") -def run_platform_compose(detached: bool = False, use_config_file: bool = False, dev: bool = False, debug: bool = False) -> None: +def run_platform_compose( + github_token: str, + detached: bool = False, + use_config_file: bool = False, + dev: bool = False, + debug: bool = False +) -> None: console.print("Starting Domino Platform using Docker Compose.") console.print("Please wait, this might take a few minutes...") # Database default settings @@ -649,8 +655,7 @@ def run_platform_compose(detached: bool = False, use_config_file: bool = False, console.print("Using config file...") with open("config-domino-local.toml", "rb") as f: platform_config = tomli.load(f) - token_pieces = platform_config["github"].get("DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN") - os.environ['DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN'] = token_pieces + os.environ['DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN'] = github_token create_database = platform_config['domino_db'].get('DOMINO_CREATE_DATABASE', True) if not create_database: os.environ['DOMINO_DB_HOST'] = platform_config['domino_db'].get("DOMINO_DB_HOST", 'postgres') From 79dae17a42607aa1fa902ea1deb614660b4c27f9 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 11:29:12 -0300 Subject: [PATCH 31/72] populate first admin user on init script --- docker-compose-dev.yaml | 2 +- rest/core/settings.py | 7 ++----- rest/utils/populate_first_user.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 rest/utils/populate_first_user.py diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml index 677fe4ae..90c48e44 100644 --- a/docker-compose-dev.yaml +++ b/docker-compose-dev.yaml @@ -300,7 +300,7 @@ services: context: ./rest dockerfile: Dockerfile container_name: domino-rest - command: bash -c "alembic upgrade heads && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" + command: bash -c "alembic upgrade heads && python -m utils.populate_first_user && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" ports: - 8000:8000 environment: diff --git a/rest/core/settings.py b/rest/core/settings.py index 1e4b7a75..4ccf1da7 100644 --- a/rest/core/settings.py +++ b/rest/core/settings.py @@ -23,6 +23,8 @@ class Settings(BaseSettings): AUTH_SECRET_KEY: str = os.environ.get('AUTH_SECRET_KEY', "SECRET") AUTH_ALGORITHM: str = os.environ.get('AUTH_ALGORITHM', "HS256") AUTH_ACCESS_TOKEN_EXPIRE_MINUTES: int = 600 + ADMIN_USER_EMAIL: str = os.environ.get('ADMIN_USER_EMAIL', "admin@email.com") + ADMIN_USER_PASSWORD: str = os.environ.get('ADMIN_USER_PASSWORD', "admin") # Secrets config SECRETS_SECRET_KEY: str = os.environ.get('SECRETS_SECRET_KEY', b'j1DsRJ-ehxU_3PbXW0c_-U4nTOx3knRB4zzWguMVaio=') @@ -43,11 +45,6 @@ class Settings(BaseSettings): DOMINO_DEFAULT_PIECES_REPOSITORY_URL: str = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY_URL', 'https://github.com/Tauffer-Consulting/default_domino_pieces') # Default DB mock data - RUN_CREATE_MOCK_DATA: bool = False - ADMIN_CREDENTIALS: dict = { - "email": "admin@email.com", - "password": "admin" - } AIRFLOW_ADMIN_CREDENTIALS: dict = { "username": os.environ.get('AIRFLOW_ADMIN_USERNAME', "admin"), "password": os.environ.get('AIRFLOW_ADMIN_PASSWORD', "admin") diff --git a/rest/utils/populate_first_user.py b/rest/utils/populate_first_user.py new file mode 100644 index 00000000..cfbf77c1 --- /dev/null +++ b/rest/utils/populate_first_user.py @@ -0,0 +1,31 @@ +from services.user_service import UserService +from schemas.requests.auth import AuthRegisterRequest +from schemas.exceptions.base import ConflictException +from core.settings import settings +from core.logger import get_configured_logger +import asyncio + + +async def populate_first_user(): + logger = get_configured_logger('populate-first-user') + user_service = UserService() + + request = AuthRegisterRequest( + email=settings.ADMIN_USER_EMAIL, + password=settings.ADMIN_USER_PASSWORD, + ) + + try: + await user_service.create_user( + email=request.email, + password=request.password + ) + logger.info('Admin user created successfully') + except ConflictException: + logger.info('Admin user already exists, skipping...') + except Exception as e: + logger.exception(e) + raise e + +if __name__ == '__main__': + asyncio.run(populate_first_user()) \ No newline at end of file From ec96453afb63a0d730cc279cd470529054ebb9eb Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 11:30:51 -0300 Subject: [PATCH 32/72] add populate script to initialization composes --- src/domino/cli/utils/docker-compose-without-database.yaml | 2 +- src/domino/cli/utils/docker-compose.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/domino/cli/utils/docker-compose-without-database.yaml b/src/domino/cli/utils/docker-compose-without-database.yaml index 81cd9d35..4027ac07 100644 --- a/src/domino/cli/utils/docker-compose-without-database.yaml +++ b/src/domino/cli/utils/docker-compose-without-database.yaml @@ -289,7 +289,7 @@ services: domino_rest: image: ghcr.io/tauffer-consulting/domino-rest:latest${DOMINO_COMPOSE_DEV} container_name: domino-rest - command: bash -c "uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" + command: bash -c "python -m utils.populate_first_user && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" ports: - 8000:8000 environment: diff --git a/src/domino/cli/utils/docker-compose.yaml b/src/domino/cli/utils/docker-compose.yaml index 9e95b43d..5340b0ac 100644 --- a/src/domino/cli/utils/docker-compose.yaml +++ b/src/domino/cli/utils/docker-compose.yaml @@ -289,7 +289,7 @@ services: domino_rest: image: ghcr.io/tauffer-consulting/domino-rest:latest${DOMINO_COMPOSE_DEV} container_name: domino-rest - command: bash -c "alembic upgrade heads && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" + command: bash -c "alembic upgrade heads && python -m utils.populate_first_user && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" ports: - 8000:8000 environment: From b103922446c2ee2c32d6a8199b6c8a5a2df08f6e Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 11:50:14 -0300 Subject: [PATCH 33/72] create multiple repos based on token --- rest/core/settings.py | 29 ++++++++++++++++++++++++----- rest/services/workspace_service.py | 25 +++++++++++++++---------- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/rest/core/settings.py b/rest/core/settings.py index 4ccf1da7..5482e345 100644 --- a/rest/core/settings.py +++ b/rest/core/settings.py @@ -38,11 +38,30 @@ class Settings(BaseSettings): DOMINO_LOCAL_WORKFLOWS_REPOSITORY: str = '/opt/airflow/dags' # Default domino pieces repository - DOMINO_DEFAULT_PIECES_REPOSITORY: str = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY', "Tauffer-Consulting/default_domino_pieces") - DOMINO_DEFAULT_PIECES_REPOSITORY_VERSION: str = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY_VERSION', "0.6.0") - DOMINO_DEFAULT_PIECES_REPOSITORY_SOURCE: str = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY_SOURCE', "github") - DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN: str | None = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN', None) - DOMINO_DEFAULT_PIECES_REPOSITORY_URL: str = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY_URL', 'https://github.com/Tauffer-Consulting/default_domino_pieces') + DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN: str | None = os.environ.get('DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN', None) + DEFAULT_REPOSITORIES_LIST: list[dict] = [ + dict( + path="Tauffer-Consulting/default_domino_pieces", + version='0.7.0', + source='github', + require_token=False, + url='https://github.com/Tauffer-Consulting/default_domino_pieces' + ), + dict( + path="Tauffer-Consulting/openai_domino_pieces", + version='0.6.1', + source='github', + require_token=True, + url='https://github.com/Tauffer-Consulting/openai_domino_pieces' + ), + dict( + path="Tauffer-Consulting/social_media_domino_pieces", + version='0.5.0', + source='github', + require_token=True, + url='https://github.com/Tauffer-Consulting/social_media_domino_pieces' + ) + ] # Default DB mock data AIRFLOW_ADMIN_CREDENTIALS: dict = { diff --git a/rest/services/workspace_service.py b/rest/services/workspace_service.py index b1be338c..684ecbfe 100644 --- a/rest/services/workspace_service.py +++ b/rest/services/workspace_service.py @@ -73,16 +73,21 @@ def create_workspace( github_access_token=None, user_permission=Permission.owner.value ) - self.piece_repository_service.create_piece_repository( - piece_repository_data=CreateRepositoryRequest( - workspace_id=workspace.id, - source=settings.DOMINO_DEFAULT_PIECES_REPOSITORY_SOURCE, - path=settings.DOMINO_DEFAULT_PIECES_REPOSITORY, - version=settings.DOMINO_DEFAULT_PIECES_REPOSITORY_VERSION, - url=settings.DOMINO_DEFAULT_PIECES_REPOSITORY_URL - ), - auth_context=auth_context - ) + for repo in settings.DEFAULT_REPOSITORIES_LIST: + if not settings.DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN and repo.get('require_token'): + self.logger.info(f'Not installing default repository {repo.get("path")} because it requires a token and no token was provided.') + continue + self.logger.info(f'Installing default repository: {repo.get("path")}') + self.piece_repository_service.create_piece_repository( + piece_repository_data=CreateRepositoryRequest( + workspace_id=workspace.id, + source=repo.get('source'), + path=repo.get('path'), + version=repo.get('version'), + url=repo.get('url') + ), + auth_context=auth_context + ) return CreateWorkspaceResponse( id=workspace.id, name=workspace.name, From d8f0c03f2acb3d95fe4a7f63fe0907646adb975b Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 16 Nov 2023 12:15:09 -0300 Subject: [PATCH 34/72] feat: filtered pieces --- .../components/DrawerMenu/index.tsx | 15 +- .../components/DrawerMenu/sidebarAddNode.tsx | 155 ++++++++++-------- 2 files changed, 90 insertions(+), 80 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/DrawerMenu/index.tsx b/frontend/src/features/workflowEditor/components/DrawerMenu/index.tsx index d0538d28..45565532 100644 --- a/frontend/src/features/workflowEditor/components/DrawerMenu/index.tsx +++ b/frontend/src/features/workflowEditor/components/DrawerMenu/index.tsx @@ -7,7 +7,6 @@ import { Box, Divider, IconButton, - ListItem, Typography, useTheme, } from "@mui/material"; @@ -61,14 +60,12 @@ export const PermanentDrawerRightWorkflows: FC< {openDrawer && ( <> - - - - - + + + )} diff --git a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx index dd048a22..0b81375e 100644 --- a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx +++ b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx @@ -5,21 +5,16 @@ import { AccordionSummary, Alert, Box, + TextField, ToggleButton, ToggleButtonGroup, Typography, } from "@mui/material"; import { usesPieces } from "context/workspaces"; -import { type FC, useState } from "react"; +import { type FC, useState, useMemo } from "react"; import PiecesSidebarNode from "./sidebarNode"; -/** - * @todo cleanup comments when no longer needed - * @todo move pieces rules to create workflow context - * @todo improve loading/error/empty states - */ - interface Props { setOrientation: React.Dispatch< React.SetStateAction<"horizontal" | "vertical"> @@ -30,24 +25,48 @@ interface Props { const SidebarAddNode: FC = ({ setOrientation, orientation }) => { const { repositories, repositoriesLoading, repositoryPieces } = usesPieces(); - const [piecesMap, setPiecesMap] = useState>({}); - const [expandedRepos, setExpandedRepos] = useState([]); + const [filter, setFilter] = useState(""); + const [expanded, setExpanded] = useState>({}); + const filteredRepositoryPieces = useMemo(() => { + function filterPieces( + repository: PiecesRepository, + searchTerm: string, + ): PiecesRepository { + const filteredRepository: PiecesRepository = {}; + + Object.keys(repository).forEach((key) => { + const filteredPieces = repository[key].filter((piece) => { + return ( + piece.name.toLowerCase().includes(searchTerm.toLowerCase()) || + piece.description.toLowerCase().includes(searchTerm.toLowerCase()) + ); + }); + + filteredRepository[key] = filteredPieces; + if (filteredPieces.length) { + setExpanded((e) => ({ ...e, [key]: true })); + } + }); + + return filteredRepository; + } - /** controls if an accordion is loading Pieces */ - const [loadingPieces, setLoadingPieces] = useState(false); + return filterPieces(repositoryPieces, filter); + }, [filter, repositoryPieces, setExpanded]); + + console.log(expanded); return ( - + {repositoriesLoading && ( Loading repositories... )} {!repositoriesLoading && ( { - console.log("value", value); if (value) setOrientation(value); }} > @@ -59,69 +78,63 @@ const SidebarAddNode: FC = ({ setOrientation, orientation }) => { )} + { + setFilter(e.target.value); + }} + fullWidth + variant="filled" + label="search" + /> {!repositoriesLoading && - repositories.map((repo) => ( - { - if (loadingPieces) return; - setLoadingPieces(repo.id); - - // Check if the repo is currently expanded - const isExpanded = expandedRepos.includes(repo.id); - - // If the repo is already expanded, remove it from the expandedRepos array - // Otherwise, add it to the expandedRepos array - setExpandedRepos( - isExpanded - ? (prev) => prev.filter((id) => id !== repo.id) - : (prev) => [...prev, repo.id], - ); + repositories.map((repo) => { + if (!filteredRepositoryPieces[repo.id].length) { + return null; + } - // If the repo is not currently expanded, load its pieces - if (!isExpanded) { - setPiecesMap((prev) => ({ - ...prev, - [repo.id]: repositoryPieces[repo.id], - })); - } - - setLoadingPieces(false); - }} - > - }> - { + setExpanded((e) => ({ ...e, [repo.id]: expanded })); + }} + TransitionProps={{ unmountOnExit: true }} + key={repo.id} + > + }> + + {repo.label} + + + - {repo.label} - - - - {!!loadingPieces && loadingPieces === repo.id && ( + {/* {!!loadingPieces && loadingPieces === repo.id && ( Loading Pieces... - )} - {expandedRepos.includes(repo.id) && - piecesMap[repo.id]?.length && - piecesMap[repo.id].map((piece) => ( - - ))} - - - ))} + )} */} + + {Boolean(filteredRepositoryPieces[repo.id]?.length) && + filteredRepositoryPieces[repo.id].map((piece) => ( + + ))} + + + ); + })} ); }; From 928b16e3fe26c8de08de35a10bef20eb65563c26 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 16 Nov 2023 14:45:17 -0300 Subject: [PATCH 35/72] feat: close taps when the search comes to empty --- .../components/DrawerMenu/sidebarAddNode.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx index 0b81375e..319243ab 100644 --- a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx +++ b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx @@ -11,7 +11,7 @@ import { Typography, } from "@mui/material"; import { usesPieces } from "context/workspaces"; -import { type FC, useState, useMemo } from "react"; +import { type FC, useState, useMemo, useEffect } from "react"; import PiecesSidebarNode from "./sidebarNode"; @@ -54,7 +54,21 @@ const SidebarAddNode: FC = ({ setOrientation, orientation }) => { return filterPieces(repositoryPieces, filter); }, [filter, repositoryPieces, setExpanded]); - console.log(expanded); + useEffect(() => { + if (!filter) { + setExpanded((e) => { + const newExpanded = Object.keys(e).reduce>( + (acc, next) => { + acc[next] = false; + return acc; + }, + {}, + ); + + return newExpanded; + }); + } + }, [filter]); return ( From 062762e096ebdbbe7ce8017dfa54081e3273ba8e Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 15:29:09 -0300 Subject: [PATCH 36/72] installing pieces repositories with threading when creating workspace --- rest/services/workspace_service.py | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/rest/services/workspace_service.py b/rest/services/workspace_service.py index 684ecbfe..1c3fb1a9 100644 --- a/rest/services/workspace_service.py +++ b/rest/services/workspace_service.py @@ -23,7 +23,7 @@ from core.settings import settings from typing import List from math import ceil - +import threading class WorkspaceService(object): def __init__(self) -> None: @@ -33,6 +33,7 @@ def __init__(self) -> None: self.logger = get_configured_logger(self.__class__.__name__) self.workflow_service = WorkflowService() self.github_token_fernet = Fernet(settings.GITHUB_TOKEN_SECRET_KEY) + def create_workspace( self, @@ -73,21 +74,30 @@ def create_workspace( github_access_token=None, user_permission=Permission.owner.value ) + threads = [] for repo in settings.DEFAULT_REPOSITORIES_LIST: if not settings.DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN and repo.get('require_token'): self.logger.info(f'Not installing default repository {repo.get("path")} because it requires a token and no token was provided.') continue - self.logger.info(f'Installing default repository: {repo.get("path")}') - self.piece_repository_service.create_piece_repository( - piece_repository_data=CreateRepositoryRequest( - workspace_id=workspace.id, - source=repo.get('source'), - path=repo.get('path'), - version=repo.get('version'), - url=repo.get('url') - ), - auth_context=auth_context + + thread = threading.Thread( + target=self.piece_repository_service.create_piece_repository, kwargs=dict( + piece_repository_data=CreateRepositoryRequest( + workspace_id=workspace.id, + source=repo.get('source'), + path=repo.get('path'), + version=repo.get('version'), + url=repo.get('url') + ), + auth_context=auth_context + ) ) + thread.start() + threads.append(thread) + + for thread in threads: + thread.join() + return CreateWorkspaceResponse( id=workspace.id, name=workspace.name, From 2537f49de32b85d81a7b4462116193242d93409b Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 16:09:41 -0300 Subject: [PATCH 37/72] fix tests --- rest/core/settings.py | 7 +++++++ rest/tests/piece_repository/fixtures.py | 2 +- .../piece_repository/test_piece_repository_router.py | 8 ++++---- rest/tests/secret/test_secret_router.py | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/rest/core/settings.py b/rest/core/settings.py index 5482e345..fabead8a 100644 --- a/rest/core/settings.py +++ b/rest/core/settings.py @@ -60,6 +60,13 @@ class Settings(BaseSettings): source='github', require_token=True, url='https://github.com/Tauffer-Consulting/social_media_domino_pieces' + ), + dict( + path="Tauffer-Consulting/data_apis_domino_pieces", + version='0.2.0', + source='github', + require_token=True, + url='https://github.com/Tauffer-Consulting/data_apis_domino_pieces' ) ] diff --git a/rest/tests/piece_repository/fixtures.py b/rest/tests/piece_repository/fixtures.py index d310718f..1674110a 100644 --- a/rest/tests/piece_repository/fixtures.py +++ b/rest/tests/piece_repository/fixtures.py @@ -54,7 +54,7 @@ def add_piece_repository(client: ApiTestClient, authorization_token: Dict, piece def get_pieces_repositories(client: ApiTestClient, authorization_token: Dict, piece_repository: PieceRepository): return client.get( "/pieces-repositories", - params={"workspace_id": piece_repository.workspace_id}, + params={"workspace_id": piece_repository.workspace_id, "name__like": piece_repository.name}, headers={"Authorization": authorization_token["header"]} ) diff --git a/rest/tests/piece_repository/test_piece_repository_router.py b/rest/tests/piece_repository/test_piece_repository_router.py index 06b9898b..d4ac4280 100644 --- a/rest/tests/piece_repository/test_piece_repository_router.py +++ b/rest/tests/piece_repository/test_piece_repository_router.py @@ -65,8 +65,8 @@ def test_get_pieces_repositories(add_piece_repository: Response, get_pieces_repo ], metadata = PaginationSet( page=0, - records=2, - total=2, + records=1, + total=1, last_page=0 ) ) @@ -76,8 +76,8 @@ def test_get_pieces_repositories(add_piece_repository: Response, get_pieces_repo assert response.status_code == 200 assert content.keys() == mock_response_content.keys() - for key in content["data"][1].keys(): - assert content["data"][1].get(key) == mock_response_content["data"][0].get(key) + for key in content["data"][0].keys(): + assert content["data"][0].get(key) == mock_response_content["data"][0].get(key) for key in content["metadata"].keys(): assert content["metadata"].get(key) == mock_response_content["metadata"].get(key) diff --git a/rest/tests/secret/test_secret_router.py b/rest/tests/secret/test_secret_router.py index dbc00ce4..cb1887e1 100644 --- a/rest/tests/secret/test_secret_router.py +++ b/rest/tests/secret/test_secret_router.py @@ -45,6 +45,7 @@ def test_get_secrets_by_piece_name(get_secrets_by_piece_name: Response): GetSecretsByPieceResponse( name = "EXAMPLE_VAR", value = "123", + required=True ) ] response = get_secrets_by_piece_name From 58d46e9a059b44a03b5a820e0bbd7efc1b78dcf5 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 16:14:51 -0300 Subject: [PATCH 38/72] create default user using docker flag --- docker-compose-dev.yaml | 1 + rest/core/settings.py | 1 + rest/main.py | 5 +++++ src/domino/cli/utils/docker-compose-without-database.yaml | 1 + src/domino/cli/utils/docker-compose.yaml | 1 + 5 files changed, 9 insertions(+) diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml index 90c48e44..545114b2 100644 --- a/docker-compose-dev.yaml +++ b/docker-compose-dev.yaml @@ -313,6 +313,7 @@ services: - DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN=${DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN} - DOMINO_GITHUB_ACCESS_TOKEN_WORKFLOWS=${DOMINO_GITHUB_ACCESS_TOKEN_WORKFLOWS} - DOMINO_GITHUB_WORKFLOWS_REPOSITORY=${DOMINO_GITHUB_WORKFLOWS_REPOSITORY} + - CREATE_DEFAULT_USER=true - DOMINO_DEPLOY_MODE=local-compose - AIRFLOW_ADMIN_USERNAME=airflow - AIRFLOW_ADMIN_PASSWORD=airflow diff --git a/rest/core/settings.py b/rest/core/settings.py index fabead8a..ff8aa903 100644 --- a/rest/core/settings.py +++ b/rest/core/settings.py @@ -25,6 +25,7 @@ class Settings(BaseSettings): AUTH_ACCESS_TOKEN_EXPIRE_MINUTES: int = 600 ADMIN_USER_EMAIL: str = os.environ.get('ADMIN_USER_EMAIL', "admin@email.com") ADMIN_USER_PASSWORD: str = os.environ.get('ADMIN_USER_PASSWORD', "admin") + CREATE_DEFAULT_USER: bool = os.environ.get('CREATE_DEFAULT_USER', True) # Secrets config SECRETS_SECRET_KEY: str = os.environ.get('SECRETS_SECRET_KEY', b'j1DsRJ-ehxU_3PbXW0c_-U4nTOx3knRB4zzWguMVaio=') diff --git a/rest/main.py b/rest/main.py index 97cd0e71..6e65ec77 100644 --- a/rest/main.py +++ b/rest/main.py @@ -11,6 +11,7 @@ from routers.secret_router import router as secret_router from routers.health_check_router import router as health_check_router from core.settings import settings +from utils.populate_first_user import populate_first_user description = """ @@ -27,6 +28,10 @@ def configure_app(): version=settings.VERSION, ) + if settings.CREATE_DEFAULT_USER: + populate_first_user() + + app.add_middleware( CORSMiddleware, allow_origins=settings.CORS["origins"], diff --git a/src/domino/cli/utils/docker-compose-without-database.yaml b/src/domino/cli/utils/docker-compose-without-database.yaml index 4027ac07..56aff022 100644 --- a/src/domino/cli/utils/docker-compose-without-database.yaml +++ b/src/domino/cli/utils/docker-compose-without-database.yaml @@ -302,6 +302,7 @@ services: - DOMINO_DEPLOY_MODE=local-compose - AIRFLOW_ADMIN_USERNAME=airflow - AIRFLOW_ADMIN_PASSWORD=airflow + - CREATE_DEFAULT_USER=true network_mode: ${NETWORK_MODE} volumes: - ${AIRFLOW_PROJ_DIR:-./airflow}/dags:/opt/airflow/dags diff --git a/src/domino/cli/utils/docker-compose.yaml b/src/domino/cli/utils/docker-compose.yaml index 5340b0ac..53900487 100644 --- a/src/domino/cli/utils/docker-compose.yaml +++ b/src/domino/cli/utils/docker-compose.yaml @@ -302,6 +302,7 @@ services: - DOMINO_DEPLOY_MODE=local-compose - AIRFLOW_ADMIN_USERNAME=airflow - AIRFLOW_ADMIN_PASSWORD=airflow + - CREATE_DEFAULT_USER=true networks: - domino-postgres-network - default From 8d3a53209b1a938543422bc931dcac280d4240b5 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 16:46:17 -0300 Subject: [PATCH 39/72] update helm to use create default user var --- helm/domino/Chart.yaml | 4 ++-- helm/domino/templates/domino-rest-deployment.yml | 2 ++ helm/domino/values.yaml | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/helm/domino/Chart.yaml b/helm/domino/Chart.yaml index 66845405..40db4b00 100644 --- a/helm/domino/Chart.yaml +++ b/helm/domino/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: domino description: A Helm chart for Domino type: application -version: 0.1.7 -appVersion: 0.1.7 +version: 0.1.8 +appVersion: 0.1.8 home: https://github.com/Tauffer-Consulting/domino sources: - https://github.com/Tauffer-Consulting/domino diff --git a/helm/domino/templates/domino-rest-deployment.yml b/helm/domino/templates/domino-rest-deployment.yml index b1fcdb34..e8bf5a46 100644 --- a/helm/domino/templates/domino-rest-deployment.yml +++ b/helm/domino/templates/domino-rest-deployment.yml @@ -44,6 +44,8 @@ spec: value: {{ .Values.database.password }} - name: DOMINO_DB_PORT value: "{{ .Values.database.port }}" + - name: CREATE_DEFAULT_USER + value: {{ .Values.rest.create_default_user }} - name: "DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN" valueFrom: secretKeyRef: diff --git a/helm/domino/values.yaml b/helm/domino/values.yaml index 5f9f3a89..21f6d57a 100644 --- a/helm/domino/values.yaml +++ b/helm/domino/values.yaml @@ -17,6 +17,7 @@ rest: deployMode: local-k8s # TODO change to prod # Github workflows repository name - Same one used in airflow gitSync ssh workflowsRepository: ~ + create_default_user: true # Change this if using external Database database: From 2197ee909032ebcbe3007a00ebea730dad531dc2 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 16 Nov 2023 16:46:53 -0300 Subject: [PATCH 40/72] add DOMINO_CREATE_DEFAULT_USER var to config file to set if create user --- src/domino/cli/utils/config-domino-local.toml | 1 + src/domino/cli/utils/docker-compose-without-database.yaml | 2 +- src/domino/cli/utils/docker-compose.yaml | 2 +- src/domino/cli/utils/platform.py | 5 ++++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/domino/cli/utils/config-domino-local.toml b/src/domino/cli/utils/config-domino-local.toml index ad7c1a9d..2933ecee 100644 --- a/src/domino/cli/utils/config-domino-local.toml +++ b/src/domino/cli/utils/config-domino-local.toml @@ -20,6 +20,7 @@ DOMINO_DB_PORT = "postgres" DOMINO_DB_USER = "postgres" DOMINO_DB_PASSWORD = "postgres" DOMINO_DB_NAME = "postgres" +DOMINO_CREATE_DEFAULT_USER = true [dev] DOMINO_LOCAL_DOMINO_PACKAGE="" \ No newline at end of file diff --git a/src/domino/cli/utils/docker-compose-without-database.yaml b/src/domino/cli/utils/docker-compose-without-database.yaml index 56aff022..d4880d76 100644 --- a/src/domino/cli/utils/docker-compose-without-database.yaml +++ b/src/domino/cli/utils/docker-compose-without-database.yaml @@ -302,7 +302,7 @@ services: - DOMINO_DEPLOY_MODE=local-compose - AIRFLOW_ADMIN_USERNAME=airflow - AIRFLOW_ADMIN_PASSWORD=airflow - - CREATE_DEFAULT_USER=true + - CREATE_DEFAULT_USER=${DOMINO_CREATE_DEFAULT_USER} network_mode: ${NETWORK_MODE} volumes: - ${AIRFLOW_PROJ_DIR:-./airflow}/dags:/opt/airflow/dags diff --git a/src/domino/cli/utils/docker-compose.yaml b/src/domino/cli/utils/docker-compose.yaml index 53900487..9699dd8e 100644 --- a/src/domino/cli/utils/docker-compose.yaml +++ b/src/domino/cli/utils/docker-compose.yaml @@ -302,7 +302,7 @@ services: - DOMINO_DEPLOY_MODE=local-compose - AIRFLOW_ADMIN_USERNAME=airflow - AIRFLOW_ADMIN_PASSWORD=airflow - - CREATE_DEFAULT_USER=true + - CREATE_DEFAULT_USER=${DOMINO_CREATE_DEFAULT_USER} networks: - domino-postgres-network - default diff --git a/src/domino/cli/utils/platform.py b/src/domino/cli/utils/platform.py index 2b09a968..f8b36885 100644 --- a/src/domino/cli/utils/platform.py +++ b/src/domino/cli/utils/platform.py @@ -300,6 +300,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None "enabled": True, "image": domino_rest_image, "workflowsRepository": platform_config['github']['DOMINO_GITHUB_WORKFLOWS_REPOSITORY'], + "create_default_user": platform_config['domino_db']['DOMINO_CREATE_DEFAULT_USER'] }, "database": { "enabled": db_enabled, @@ -307,7 +308,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None "name": "postgres", "user": "postgres", "password": "postgres", - "port": "5432" + "port": "5432", } } @@ -651,12 +652,14 @@ def run_platform_compose( console.print("Please wait, this might take a few minutes...") # Database default settings create_database = True + os.environ['DOMINO_CREATE_DEFAULT_USER'] = 'true' if use_config_file: console.print("Using config file...") with open("config-domino-local.toml", "rb") as f: platform_config = tomli.load(f) os.environ['DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN'] = github_token create_database = platform_config['domino_db'].get('DOMINO_CREATE_DATABASE', True) + os.environ['DOMINO_CREATE_DEFAULT_USER'] = str(platform_config['domino_db'].get('DOMINO_CREATE_DEFAULT_USER', 'true')).lower() if not create_database: os.environ['DOMINO_DB_HOST'] = platform_config['domino_db'].get("DOMINO_DB_HOST", 'postgres') os.environ['DOMINO_DB_PORT'] = platform_config['domino_db'].get("DOMINO_DB_PORT", 5432) From a4b0b2085152125bd6cffd1c2cb3dfb6836a1d5a Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Fri, 17 Nov 2023 16:07:44 -0300 Subject: [PATCH 41/72] fix populate first user in k8s and whitespaces trim --- .../domino/templates/domino-rest-deployment.yml | 4 ++-- helm/domino/values.yaml | 2 +- rest/main.py | 14 +++++++++----- rest/services/piece_repository_service.py | 8 ++++---- rest/services/secret_service.py | 17 ++++++++++------- rest/utils/populate_first_user.py | 1 + src/domino/cli/utils/platform.py | 3 ++- 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/helm/domino/templates/domino-rest-deployment.yml b/helm/domino/templates/domino-rest-deployment.yml index e8bf5a46..37138743 100644 --- a/helm/domino/templates/domino-rest-deployment.yml +++ b/helm/domino/templates/domino-rest-deployment.yml @@ -34,6 +34,8 @@ spec: value: http://airflow-webserver:8080 - name: DOMINO_DEPLOY_MODE value: {{ .Values.rest.deployMode }} + - name: CREATE_DEFAULT_USER + value: "{{ toString .Values.rest.createDefaultUser }}" - name: DOMINO_DB_HOST value: {{ if .Values.database.enabled }}"{{ .Release.Name }}-postgres-service"{{ else }}{{ .Values.database.host }}{{ end }} - name: DOMINO_DB_NAME @@ -44,8 +46,6 @@ spec: value: {{ .Values.database.password }} - name: DOMINO_DB_PORT value: "{{ .Values.database.port }}" - - name: CREATE_DEFAULT_USER - value: {{ .Values.rest.create_default_user }} - name: "DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN" valueFrom: secretKeyRef: diff --git a/helm/domino/values.yaml b/helm/domino/values.yaml index 21f6d57a..82a87fb7 100644 --- a/helm/domino/values.yaml +++ b/helm/domino/values.yaml @@ -17,7 +17,7 @@ rest: deployMode: local-k8s # TODO change to prod # Github workflows repository name - Same one used in airflow gitSync ssh workflowsRepository: ~ - create_default_user: true + createDefaultUser: true # Change this if using external Database database: diff --git a/rest/main.py b/rest/main.py index 6e65ec77..94f14fec 100644 --- a/rest/main.py +++ b/rest/main.py @@ -12,6 +12,7 @@ from routers.health_check_router import router as health_check_router from core.settings import settings from utils.populate_first_user import populate_first_user +from contextlib import asynccontextmanager description = """ @@ -19,19 +20,21 @@ """ +@asynccontextmanager +async def lifespan(app: FastAPI): + if settings.CREATE_DEFAULT_USER: + await populate_first_user() + yield + def configure_app(): - load_dotenv(find_dotenv()) app = FastAPI( root_path=settings.ROOT_PATH, title=settings.APP_TITLE, description=description, version=settings.VERSION, + lifespan=lifespan ) - if settings.CREATE_DEFAULT_USER: - populate_first_user() - - app.add_middleware( CORSMiddleware, allow_origins=settings.CORS["origins"], @@ -57,6 +60,7 @@ def configure_app(): + if __name__ == "__main__": uvicorn.run( "main:app", diff --git a/rest/services/piece_repository_service.py b/rest/services/piece_repository_service.py index bc1099eb..c16b0775 100644 --- a/rest/services/piece_repository_service.py +++ b/rest/services/piece_repository_service.py @@ -102,7 +102,7 @@ def get_piece_repository_release_data(self, version: str, source:str, path: str, self.logger.info(f'Getting release data for repository {path}') token = auth_context.workspace.github_access_token if auth_context.workspace.github_access_token else settings.DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN - if not token.strip(): + if token is not None and not token.strip(): token = None tag_data = self._read_repository_data(path=path, source=source, version=version, github_access_token=token) name = tag_data.get('config_toml').get('repository').get("REPOSITORY_NAME") @@ -219,7 +219,7 @@ def create_piece_repository( raise ConflictException(message=f"Repository {piece_repository_data.path} already exists for this workspace") token = auth_context.workspace.github_access_token if auth_context.workspace.github_access_token else settings.DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN - if not token.strip(): + if token is not None and not token.strip(): token = None repository_files_metadata = self._read_repository_data( source=piece_repository_data.source, @@ -319,7 +319,7 @@ def _read_data_from_github(self, path: str, version: str, github_access_token: s return data def _update_repository_pieces( - self, + self, source: str, compiled_metadata: dict, dependencies_map: dict, @@ -329,7 +329,7 @@ def _update_repository_pieces( "github": self.piece_service.check_pieces_to_update_github } read_pieces_from_github[source]( - repository_id=repository_id, + repository_id=repository_id, compiled_metadata=compiled_metadata, dependencies_map=dependencies_map, ) diff --git a/rest/services/secret_service.py b/rest/services/secret_service.py index f9c75009..957926c0 100644 --- a/rest/services/secret_service.py +++ b/rest/services/secret_service.py @@ -42,7 +42,7 @@ def create_default_storage_pieces_secrets( ) def create_workspace_repository_secret( - self, + self, workspace_id: int, repository_id: int, secret_name: str, @@ -52,7 +52,7 @@ def create_workspace_repository_secret( new_secret = Secret( name=secret_name, value=None, - piece_repository_id=repository_id + piece_repository_id=repository_id ) secret = self.secret_repository.create(secret=new_secret) return secret @@ -67,7 +67,7 @@ def update_repository_secret( secret = self.secret_repository.find_by_id(id=secret_id) if not secret: raise ResourceNotFoundException() - + if not body.value: secret.value = None else: @@ -95,7 +95,7 @@ def get_repository_secrets(self, piece_repository_id: int) -> List[ListRepositor return response def get_piece_secrets( - self, + self, piece_repository_id: int, piece_name: str ) -> List[GetSecretsByPieceResponse]: @@ -111,15 +111,18 @@ def get_piece_secrets( piece_item = self.piece_repository.find_by_name_and_repository_id(name=piece_name, repository_id=piece_repository_id) if not piece_item: raise ResourceNotFoundException() - - - piece_item_required_secrets = piece_item.secrets_schema.get('required', []) + + secrets_schema = piece_item.secrets_schema + piece_item_required_secrets = [] + if isinstance(secrets_schema, dict): + piece_item_required_secrets = secrets_schema.get('required', []) secrets_names = self.piece_repository.get_piece_secrets_names_by_repository_id(name=piece_name, repository_id=piece_repository_id) secrets_names = [e[0] for e in secrets_names] if not secrets_names: secrets_names = [] self.logger.info(f"Fetching the folowing secrets for {piece_name} from repository {piece_repository_id}: " + ", ".join(secrets_names)) + response = list() for secret in secrets_names: secret_item = self.secret_repository.find_by_name_and_piece_repository_id(name=secret, piece_repository_id=piece_repository_id) diff --git a/rest/utils/populate_first_user.py b/rest/utils/populate_first_user.py index cfbf77c1..caf6280c 100644 --- a/rest/utils/populate_first_user.py +++ b/rest/utils/populate_first_user.py @@ -8,6 +8,7 @@ async def populate_first_user(): logger = get_configured_logger('populate-first-user') + logger.info('Populating first user') user_service = UserService() request = AuthRegisterRequest( diff --git a/src/domino/cli/utils/platform.py b/src/domino/cli/utils/platform.py index f8b36885..f9711cff 100644 --- a/src/domino/cli/utils/platform.py +++ b/src/domino/cli/utils/platform.py @@ -300,7 +300,7 @@ def create_platform(install_airflow: bool = True, use_gpu: bool = False) -> None "enabled": True, "image": domino_rest_image, "workflowsRepository": platform_config['github']['DOMINO_GITHUB_WORKFLOWS_REPOSITORY'], - "create_default_user": platform_config['domino_db']['DOMINO_CREATE_DEFAULT_USER'] + "createDefaultUser": platform_config['domino_db'].get('DOMINO_CREATE_DEFAULT_USER', True) }, "database": { "enabled": db_enabled, @@ -660,6 +660,7 @@ def run_platform_compose( os.environ['DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN'] = github_token create_database = platform_config['domino_db'].get('DOMINO_CREATE_DATABASE', True) os.environ['DOMINO_CREATE_DEFAULT_USER'] = str(platform_config['domino_db'].get('DOMINO_CREATE_DEFAULT_USER', 'true')).lower() + if not create_database: os.environ['DOMINO_DB_HOST'] = platform_config['domino_db'].get("DOMINO_DB_HOST", 'postgres') os.environ['DOMINO_DB_PORT'] = platform_config['domino_db'].get("DOMINO_DB_PORT", 5432) From 3db35623bcfb84b23895ebcfd7b67983a1a08369 Mon Sep 17 00:00:00 2001 From: luiz Date: Fri, 17 Nov 2023 21:29:28 +0100 Subject: [PATCH 42/72] leave value as False on repo code --- src/domino/custom_operators/docker_operator.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/domino/custom_operators/docker_operator.py b/src/domino/custom_operators/docker_operator.py index 69e0be3b..66a7e297 100644 --- a/src/domino/custom_operators/docker_operator.py +++ b/src/domino/custom_operators/docker_operator.py @@ -53,15 +53,15 @@ def __init__( mounts = [] # TODO remove - used in DEV only ####################### - dev_pieces = True + dev_pieces = False if dev_pieces: piece_repo_name = repository_url.split("/")[-1] - #local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" - local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" + local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" + # local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" mounts = [ # TODO remove - Mount(source='/home/vinicius/Documents/work/tauffer/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), - #Mount(source='/mnt/shared_storage/Github/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), + # Mount(source='/home/vinicius/Documents/work/tauffer/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), + Mount(source='/mnt/shared_storage/Github/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), Mount(source=local_repos_path, target='/home/domino/pieces_repository/', type='bind', read_only=True), ] ######################################################## From 094b024f1854163db969f64e70c8dcf70ff5674a Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Fri, 17 Nov 2023 17:57:43 -0300 Subject: [PATCH 43/72] temporary solution for invalid token bug --- frontend/src/context/workspaces/api/getWorkspaceMembers.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/context/workspaces/api/getWorkspaceMembers.ts b/frontend/src/context/workspaces/api/getWorkspaceMembers.ts index 9a478027..2493041f 100644 --- a/frontend/src/context/workspaces/api/getWorkspaceMembers.ts +++ b/frontend/src/context/workspaces/api/getWorkspaceMembers.ts @@ -18,7 +18,9 @@ const getWorkspaceUsersUrl = ( page: number, pageSize: number, ) => { - return auth && workspaceId + // TODO: get workspaceId from context - this is a temporary solution + const workspace = localStorage.getItem("workspace"); + return auth && workspaceId && workspace ? `/workspaces/${workspaceId}/users?page=${page}&page_size=${pageSize}` : null; }; From 7d99b2f9f00e2d856dbbcdde26a182760e7ad3d4 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 20 Nov 2023 15:49:08 -0300 Subject: [PATCH 44/72] fix cli and compose dev --- docker-compose-dev.yaml | 2 +- src/domino/cli/cli.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml index 545114b2..14e1ddfc 100644 --- a/docker-compose-dev.yaml +++ b/docker-compose-dev.yaml @@ -300,7 +300,7 @@ services: context: ./rest dockerfile: Dockerfile container_name: domino-rest - command: bash -c "alembic upgrade heads && python -m utils.populate_first_user && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" + command: bash -c "alembic upgrade heads && uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000" ports: - 8000:8000 environment: diff --git a/src/domino/cli/cli.py b/src/domino/cli/cli.py index 5be33faf..eaf00d94 100644 --- a/src/domino/cli/cli.py +++ b/src/domino/cli/cli.py @@ -227,7 +227,8 @@ def cli_destroy_platform(): ) @click.option( '--github-token', - prompt='Github token for access default pieces repositories', + prompt='Github token for access default pieces repositories.', + help='Github token for access default pieces repositories.', default=get_github_token_pieces_from_config_or_env, ) def cli_run_platform_compose(d, use_config_file, dev, debug, stop, github_token): From ab2d1aa25e56acd054964f1d4b51a1ddad4e6970 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Tue, 21 Nov 2023 11:09:26 -0300 Subject: [PATCH 45/72] gpu support for docker operator --- .../components/SidebarForm/ContainerResourceForm.tsx | 4 ++-- src/domino/custom_operators/docker_operator.py | 12 ++++++++++-- src/domino/task.py | 5 +++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/SidebarForm/ContainerResourceForm.tsx b/frontend/src/features/workflowEditor/components/SidebarForm/ContainerResourceForm.tsx index 6bc4a237..d1d92796 100644 --- a/frontend/src/features/workflowEditor/components/SidebarForm/ContainerResourceForm.tsx +++ b/frontend/src/features/workflowEditor/components/SidebarForm/ContainerResourceForm.tsx @@ -73,7 +73,7 @@ const ContainerResourceForm: React.FC = () => { { None: self.task_id = task_id @@ -30,6 +31,7 @@ def __init__( self.workspace_id = workspace_id self.piece_input_kwargs = piece_input_kwargs self.workflow_shared_storage = workflow_shared_storage + self.container_resources = container_resources or {} # Environment variables self.environment = { @@ -76,11 +78,17 @@ def __init__( ), ) + self.device_requests = [] + if self.container_resources.get('use_gpu', False): + self.device_requests=[ + docker.types.DeviceRequest(count=-1, capabilities=[['gpu']]) + ] super().__init__( **docker_operator_kwargs, task_id=task_id, docker_url='tcp://docker-proxy:2375', mounts=mounts, + device_requests=self.device_requests, environment=self.environment, ) diff --git a/src/domino/task.py b/src/domino/task.py index 15d51372..b36daa6f 100644 --- a/src/domino/task.py +++ b/src/domino/task.py @@ -8,7 +8,6 @@ from domino.custom_operators.docker_operator import DominoDockerOperator from domino.custom_operators.python_operator import PythonOperator from domino.custom_operators.worker_operator import DominoWorkerOperator -from domino.utils import dict_deep_update from domino.logger import get_configured_logger from domino.schemas import shared_storage_map, StorageSource @@ -140,15 +139,17 @@ def _set_operator(self) -> BaseOperator: workspace_id=self.workspace_id, piece_input_kwargs=self.piece_input_kwargs, workflow_shared_storage=self.workflow_shared_storage, + container_resources=self.container_resources, # ----------------- Docker ----------------- + # TODO uncoment image=self.piece["source_image"], + entrypoint=["domino", "run-piece-docker"], do_xcom_push=True, mount_tmp_dir=False, tty=True, xcom_all=False, retrieve_output=True, retrieve_output_path='/airflow/xcom/return.out', - entrypoint=["domino", "run-piece-docker"], ) def __call__(self) -> Callable: From f1bc50de8cbd5aeb6773af3d8c8512f29eaaa01f Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 22 Nov 2023 07:56:32 -0300 Subject: [PATCH 46/72] add plotly_json option for DIsplayResult --- frontend/package.json | 3 + .../CustomTabMenu/TaskResult.tsx | 12 + frontend/yarn.lock | 1645 ++++++++++++++++- src/domino/schemas/display_result.py | 3 +- 4 files changed, 1648 insertions(+), 15 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 8dbc47b0..850fe044 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,6 +18,7 @@ "@mui/x-data-grid": "^6.15.0", "@mui/x-date-pickers": "^6.5.0", "@types/react-dom": "^18.0.9", + "@types/react-plotly.js": "^2.6.3", "@types/uuid": "^9.0.0", "@uiw/react-textarea-code-editor": "^2.1.1", "@vitejs/plugin-react": "^4.1.0", @@ -29,11 +30,13 @@ "dotenv": "^16.3.1", "elkjs": "^0.8.2", "localforage": "^1.10.0", + "plotly.js": "^2.27.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-draggable": "^4.4.5", "react-hook-form": "^7.45.1", "react-markdown": "^8.0.7", + "react-plotly.js": "^2.6.0", "react-router-dom": "^6.6.0", "react-toastify": "^9.1.1", "reactflow": "^11.4.0", diff --git a/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx b/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx index 981a7dab..8312ca32 100644 --- a/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx +++ b/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx @@ -1,6 +1,7 @@ import { CircularProgress, Container, Typography } from "@mui/material"; import { type CSSProperties } from "react"; import ReactMarkdown from "react-markdown"; +import Plot from "react-plotly.js"; import "./styles.css"; // import { PDFViewer, Page, Text, View, Document, StyleSheet } from '@react-pdf/renderer'; @@ -95,6 +96,17 @@ export const TaskResult = (props: ITaskResultProps) => { // style={{ width: '100%', height: '100%' }} // /> ); + case "plotly_json": { + const utf8String = atob(base64_content); + const decodedJSON = JSON.parse(utf8String); + return ( + + ); + } default: return
    Unsupported file type
    ; } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 9216bb06..67c14a0d 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -220,6 +220,13 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@choojs/findup@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" + integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== + dependencies: + commander "^2.15.1" + "@cush/relative@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@cush/relative/-/relative-1.0.0.tgz#8cd1769bf9bde3bb27dac356b1bc94af40f6cc16" @@ -601,6 +608,56 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz#591a5d71a9cd1da1a0bf3420b3bea31b0fc7946a" + integrity sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.6" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== + +"@mapbox/mapbox-gl-supported@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ== + +"@mapbox/tiny-sdf@^1.1.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" + integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA== + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + "@material-ui/core@^4.12.4": version "4.12.4" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" @@ -844,6 +901,46 @@ picocolors "^1.0.0" tslib "^2.6.0" +"@plotly/d3-sankey-circular@0.33.1": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" + integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== + dependencies: + d3-array "^1.2.1" + d3-collection "^1.0.4" + d3-shape "^1.2.0" + elementary-circuits-directed-graph "^1.0.4" + +"@plotly/d3-sankey@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" + integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== + dependencies: + d3-array "1" + d3-collection "1" + d3-shape "^1.2.0" + +"@plotly/d3@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@plotly/d3/-/d3-3.8.1.tgz#674bf19809ffcc359e0ab388a1051f2dac5e6877" + integrity sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg== + +"@plotly/point-cluster@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@plotly/point-cluster/-/point-cluster-3.1.9.tgz#8ffec77fbf5041bf15401079e4fdf298220291c1" + integrity sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw== + dependencies: + array-bounds "^1.0.1" + binary-search-bounds "^2.0.4" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + "@popperjs/core@^2.11.8": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" @@ -1012,6 +1109,42 @@ "@svgr/hast-util-to-babel-ast" "^6.5.1" svg-parser "^2.0.4" +"@turf/area@^6.4.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" + integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/bbox@^6.4.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" + integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/centroid@^6.0.2": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" + integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/helpers@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" + integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== + +"@turf/meta@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" + integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== + dependencies: + "@turf/helpers" "^6.5.0" + "@types/babel__core@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" @@ -1311,6 +1444,11 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== +"@types/plotly.js@*": + version "2.12.30" + resolved "https://registry.yarnpkg.com/@types/plotly.js/-/plotly.js-2.12.30.tgz#e0ce5231189a360b0be29445117789fbd75831fe" + integrity sha512-/yeGIFTrh5e5Q9HUCVZWDwwxqGyWHYsi4IVhG/1YKaOScslMlimLBIoce/F/Tjw7YahRTbh4xHNDfGxvq51w7Q== + "@types/prismjs@^1.0.0": version "1.26.1" resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.1.tgz#aae6739d8f0d14a3bc9e6dd83e6d791ad75d4d76" @@ -1328,6 +1466,14 @@ dependencies: "@types/react" "*" +"@types/react-plotly.js@^2.6.3": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@types/react-plotly.js/-/react-plotly.js-2.6.3.tgz#49829a5c4f011345d09f6cab692f7ddbf558cbfb" + integrity sha512-HBQwyGuu/dGXDsWhnQrhH+xcJSsHvjkwfSRjP+YpOsCCWryIuXF78ZCBjpfgO3sCc0Jo8sYp4NOGtqT7Cn3epQ== + dependencies: + "@types/plotly.js" "*" + "@types/react" "*" + "@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.6", "@types/react-transition-group@^4.4.7": version "4.4.7" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.7.tgz#bf69f269d74aa78b99097673ca6dd6824a68ef1c" @@ -1517,11 +1663,21 @@ "@types/babel__core" "^7.20.2" react-refresh "^0.14.0" +abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^8.10.0, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" @@ -1537,6 +1693,11 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +almost-equal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" + integrity sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1584,6 +1745,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-bounds@^1.0.0, array-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" + integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -1592,6 +1758,11 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" +array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== + array-includes@^3.1.6: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" @@ -1603,6 +1774,23 @@ array-includes@^3.1.6: get-intrinsic "^1.2.1" is-string "^1.0.7" +array-normalize@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" + integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== + dependencies: + array-bounds "^1.0.0" + +array-range@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" + integrity sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA== + +array-rearrange@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" + integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1726,6 +1914,29 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +binary-search-bounds@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz#125e5bd399882f71e6660d4bf1186384e989fba7" + integrity sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA== + +bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" + integrity sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA== + +bitmap-sdf@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz#e87b8b1d84ee846567cfbb29d60eedd34bca5b6f" + integrity sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg== + +bl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" + integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + bplist-parser@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" @@ -1765,6 +1976,11 @@ browserslist@^4.21.9: node-releases "^2.0.13" update-browserslist-db "^1.0.13" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + builtins@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -1802,6 +2018,13 @@ caniuse-lite@^1.0.30001541: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== +canvas-fit@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" + integrity sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ== + dependencies: + element-size "^1.1.1" + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -1859,6 +2082,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +clamp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" + integrity sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA== + classcat@^5.0.3, classcat@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/classcat/-/classcat-5.0.4.tgz#e12d1dfe6df6427f260f03b80dc63571a5107ba6" @@ -1879,6 +2107,20 @@ clsx@^2.0.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== +color-alpha@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.0.4.tgz#c141dc926e95fc3db647d0e14e5bc3651c29e040" + integrity sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A== + dependencies: + color-parse "^1.3.8" + +color-alpha@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" + integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== + dependencies: + color-parse "^1.4.1" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1893,16 +2135,86 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-id@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" + integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== + dependencies: + clamp "^1.0.1" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-normalize@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.0.tgz#ee610af9acb15daf73e77a945a847b18e40772da" + integrity sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw== + dependencies: + clamp "^1.0.1" + color-rgba "^2.1.1" + dtype "^2.0.0" + +color-normalize@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" + integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== + dependencies: + color-rgba "^2.2.0" + dtype "^2.0.0" + +color-parse@1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.3.8.tgz#eaf54cd385cb34c0681f18c218aca38478082fa3" + integrity sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA== + dependencies: + color-name "^1.0.0" + defined "^1.0.0" + is-plain-obj "^1.1.0" + +color-parse@^1.3.8, color-parse@^1.4.1, color-parse@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.3.tgz#6dadfb49128c554c60c49d63f3d025f2c5a7ff22" + integrity sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A== + dependencies: + color-name "^1.0.0" + +color-rgba@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.1.1.tgz#4633b83817c7406c90b3d7bf4d1acfa48dde5c83" + integrity sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw== + dependencies: + clamp "^1.0.1" + color-parse "^1.3.8" + color-space "^1.14.6" + +color-rgba@^2.1.1, color-rgba@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.4.0.tgz#ae85819c530262c29fc2da129fc7c8f9efc57015" + integrity sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q== + dependencies: + color-parse "^1.4.2" + color-space "^2.0.0" + +color-space@^1.14.6: + version "1.16.0" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" + integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== + dependencies: + hsluv "^0.0.3" + mumath "^3.3.4" + +color-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-2.0.1.tgz#da39871175baf4a5785ba519397df04b8d67e0fa" + integrity sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1920,6 +2232,11 @@ commander@11.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== +commander@2, commander@^2.15.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -1930,6 +2247,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -1940,6 +2267,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -1951,6 +2283,11 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +country-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" + integrity sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA== + cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -1967,6 +2304,51 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-font-size-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" + integrity sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q== + +css-font-stretch-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" + integrity sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg== + +css-font-style-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" + integrity sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg== + +css-font-weight-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" + integrity sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA== + +css-font@^1.0.0, css-font@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" + integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== + dependencies: + css-font-size-keywords "^1.0.0" + css-font-stretch-keywords "^1.0.1" + css-font-style-keywords "^1.0.1" + css-font-weight-keywords "^1.0.0" + css-global-keywords "^1.0.1" + css-system-font-keywords "^1.0.0" + pick-by-alias "^1.2.0" + string-split-by "^1.0.0" + unquote "^1.1.0" + +css-global-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" + integrity sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ== + +css-system-font-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" + integrity sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA== + css-vendor@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" @@ -1975,6 +2357,11 @@ css-vendor@^2.0.8: "@babel/runtime" "^7.8.3" is-in-browser "^1.0.2" +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== + csstype@^2.5.2: version "2.6.21" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" @@ -1985,11 +2372,26 @@ csstype@^3.0.2, csstype@^3.1.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +d3-array@1, d3-array@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-collection@1, d3-collection@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + "d3-color@1 - 3": version "3.1.0" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + "d3-dispatch@1 - 3": version "3.0.1" resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" @@ -2008,18 +2410,89 @@ csstype@^3.0.2, csstype@^3.1.2: resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== -"d3-interpolate@1 - 3": +d3-force@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-format@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +d3-geo-projection@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz#826db62f748e8ecd67cd00aced4c26a236ec030c" + integrity sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ== + dependencies: + commander "2" + d3-array "1" + d3-geo "^1.12.0" + resolve "^1.1.10" + +d3-geo@^1.12.0, d3-geo@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-hierarchy@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +"d3-interpolate@1 - 3", d3-interpolate@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + "d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-time-format@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" + integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== + dependencies: + d3-time "1" + +d3-time@1, d3-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + "d3-timer@1 - 3": version "3.0.1" resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" @@ -2047,6 +2520,14 @@ d3-zoom@^3.0.0: d3-selection "2 - 3" d3-transition "2 - 3" +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + date-fns@^2.30.0: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -2059,7 +2540,14 @@ dayjs@^1.11.7: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== -debug@^3.2.7: +debug@2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -2080,7 +2568,7 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -2126,6 +2614,11 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2136,6 +2629,11 @@ dequal@^2.0.0: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-kerning@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" + integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== + diff@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" @@ -2175,6 +2673,39 @@ dotenv@^16.3.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +draw-svg-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" + integrity sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg== + dependencies: + abs-svg-path "~0.1.1" + normalize-svg-path "~0.1.0" + +dtype@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" + integrity sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg== + +dup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" + integrity sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA== + +duplexify@^3.4.5: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +earcut@^2.1.5, earcut@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -2185,6 +2716,18 @@ electron-to-chromium@^1.4.535: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.549.tgz#ab223f5d85c55a9def358db163bc8cacba72df69" integrity sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg== +element-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" + integrity sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ== + +elementary-circuits-directed-graph@^1.0.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz#31c5a1c69517de833127247e5460472168e9e1c1" + integrity sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ== + dependencies: + strongly-connected-components "^1.0.1" + elkjs@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" @@ -2200,6 +2743,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.0.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.12.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -2310,6 +2860,42 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + esbuild@^0.18.10: version "0.18.20" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" @@ -2353,6 +2939,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" @@ -2566,6 +3164,11 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" @@ -2580,7 +3183,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -2600,6 +3203,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2630,11 +3238,26 @@ execa@^7.1.1: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +falafel@^2.1.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.5.tgz#3ccb4970a09b094e9e54fead2deee64b4a589d56" + integrity sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ== + dependencies: + acorn "^7.1.1" + isarray "^2.0.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2656,12 +3279,19 @@ fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" +fast-isnumeric@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" + integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== + dependencies: + is-string-blank "^1.0.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -2714,11 +3344,32 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +flatten-vertex-data@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" + integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== + dependencies: + dtype "^2.0.0" + follow-redirects@^1.15.0: version "1.15.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +font-atlas@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" + integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== + dependencies: + css-font "^1.0.0" + +font-measure@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" + integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== + dependencies: + css-font "^1.2.0" + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2743,6 +3394,14 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +from2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2778,6 +3437,16 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + +get-canvas-context@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" + integrity sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -2808,6 +3477,52 @@ get-tsconfig@^4.5.0, get-tsconfig@^4.7.0: dependencies: resolve-pkg-maps "^1.0.0" +gl-mat4@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" + integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== + +gl-matrix@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + +gl-text@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" + integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== + dependencies: + bit-twiddle "^1.0.2" + color-normalize "^1.5.0" + css-font "^1.2.0" + detect-kerning "^2.1.2" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + font-atlas "^2.1.0" + font-measure "^1.2.2" + gl-util "^3.1.2" + is-plain-obj "^1.1.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + parse-unit "^1.0.1" + pick-by-alias "^1.2.0" + regl "^2.0.0" + to-px "^1.0.1" + typedarray-pool "^1.1.0" + +gl-util@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" + integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== + dependencies: + is-browser "^2.0.1" + is-firefox "^1.0.3" + is-plain-obj "^1.1.0" + number-is-integer "^1.0.1" + object-assign "^4.1.0" + pick-by-alias "^1.2.0" + weak-map "^1.0.5" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -2898,6 +3613,133 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +glsl-inject-defines@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" + integrity sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A== + dependencies: + glsl-token-inject-block "^1.0.0" + glsl-token-string "^1.0.1" + glsl-tokenizer "^2.0.2" + +glsl-resolve@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" + integrity sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA== + dependencies: + resolve "^0.6.1" + xtend "^2.1.2" + +glsl-token-assignments@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" + integrity sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ== + +glsl-token-defines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" + integrity sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ== + dependencies: + glsl-tokenizer "^2.0.0" + +glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" + integrity sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg== + +glsl-token-descope@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" + integrity sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw== + dependencies: + glsl-token-assignments "^2.0.0" + glsl-token-depth "^1.1.0" + glsl-token-properties "^1.0.0" + glsl-token-scope "^1.1.0" + +glsl-token-inject-block@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" + integrity sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA== + +glsl-token-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" + integrity sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA== + +glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" + integrity sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A== + +glsl-token-string@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" + integrity sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg== + +glsl-token-whitespace-trim@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" + integrity sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ== + +glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + +glslify-bundle@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" + integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== + dependencies: + glsl-inject-defines "^1.0.1" + glsl-token-defines "^1.0.0" + glsl-token-depth "^1.1.1" + glsl-token-descope "^1.0.2" + glsl-token-scope "^1.1.1" + glsl-token-string "^1.0.1" + glsl-token-whitespace-trim "^1.0.0" + glsl-tokenizer "^2.0.2" + murmurhash-js "^1.0.0" + shallow-copy "0.0.1" + +glslify-deps@^1.2.5: + version "1.3.2" + resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" + integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== + dependencies: + "@choojs/findup" "^0.2.0" + events "^3.2.0" + glsl-resolve "0.0.1" + glsl-tokenizer "^2.0.0" + graceful-fs "^4.1.2" + inherits "^2.0.1" + map-limit "0.0.1" + resolve "^1.0.0" + +glslify@^7.0.0, glslify@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" + integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== + dependencies: + bl "^2.2.1" + concat-stream "^1.5.2" + duplexify "^3.4.5" + falafel "^2.1.0" + from2 "^2.3.0" + glsl-resolve "0.0.1" + glsl-token-whitespace-trim "^1.0.0" + glslify-bundle "^5.0.0" + glslify-deps "^1.2.5" + minimist "^1.2.5" + resolve "^1.1.5" + stack-trace "0.0.9" + static-eval "^2.0.5" + through2 "^2.0.1" + xtend "^4.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -2905,7 +3747,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -2915,6 +3757,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -2930,6 +3777,20 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-hover@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" + integrity sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg== + dependencies: + is-browser "^2.0.1" + +has-passive-events@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" + integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== + dependencies: + is-browser "^2.0.1" + has-property-descriptors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" @@ -3055,6 +3916,11 @@ hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" +hsluv@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" + integrity sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ== + html-void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" @@ -3075,6 +3941,18 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.12: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -3106,7 +3984,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3181,6 +4059,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-browser@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" + integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== + is-buffer@^2.0.0, is-buffer@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" @@ -3232,6 +4115,16 @@ is-finalizationregistry@^1.0.2: dependencies: call-bind "^1.0.2" +is-finite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-firefox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" + integrity sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3256,6 +4149,11 @@ is-hexadecimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== +is-iexplorer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" + integrity sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg== + is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" @@ -3273,6 +4171,11 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-mobile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-4.0.0.tgz#bba396eb9656e2739afde3053d7191da310fc758" + integrity sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -3290,11 +4193,21 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + is-plain-obj@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" @@ -3330,6 +4243,11 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-string-blank@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" + integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3337,6 +4255,11 @@ is-string@^1.0.5, is-string@^1.0.7: dependencies: has-tostringtag "^1.0.0" +is-svg-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" + integrity sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg== + is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" @@ -3378,11 +4301,21 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@^2.0.5: +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3537,6 +4470,11 @@ jss@10.10.0, jss@^10.5.1: object.assign "^4.1.4" object.values "^1.1.6" +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -3557,6 +4495,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lie@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" @@ -3621,6 +4567,47 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +map-limit@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg== + dependencies: + once "~1.3.0" + +mapbox-gl@1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" + integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.5.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.1" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.2.1" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + integrity sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA== + mdast-util-definitions@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" @@ -3917,7 +4904,7 @@ minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -3927,11 +4914,42 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +mouse-change@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" + integrity sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ== + dependencies: + mouse-event "^1.0.0" + +mouse-event-offset@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" + integrity sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w== + +mouse-event@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" + integrity sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw== + +mouse-wheel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" + integrity sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw== + dependencies: + right-now "^1.0.0" + signum "^1.0.0" + to-px "^1.0.1" + mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -3942,6 +4960,18 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +mumath@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" + integrity sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA== + dependencies: + almost-equal "^1.1.0" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -3956,11 +4986,30 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + integrity sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" @@ -3971,6 +5020,18 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-svg-path@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" + integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-svg-path@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" + integrity sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA== + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -3985,7 +5046,14 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -object-assign@^4.0.1, object-assign@^4.1.1: +number-is-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" + integrity sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg== + dependencies: + is-finite "^1.0.1" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4060,13 +5128,20 @@ object.values@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w== + dependencies: + wrappy "1" + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -4091,6 +5166,18 @@ open@^9.1.0: is-inside-container "^1.0.0" is-wsl "^2.2.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -4124,6 +5211,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parenthesis@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.8.tgz#3457fccb8f05db27572b841dad9d2630b912f125" + integrity sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw== + parse-entities@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" @@ -4153,6 +5245,23 @@ parse-numeric-range@^1.3.0: resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== +parse-rect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" + integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== + dependencies: + pick-by-alias "^1.2.0" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ== + +parse-unit@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" + integrity sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg== + parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -4196,6 +5305,24 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pick-by-alias@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" + integrity sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw== + picocolors@1.0.0, picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4211,6 +5338,71 @@ pirates@^4.0.1: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +plotly.js@^2.27.1: + version "2.27.1" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-2.27.1.tgz#064d80d17ad8f9cde400d6f7df45926f520dac06" + integrity sha512-XeE0zTJWTxURYrUJqzf73l8lTb+HnyRvvhHkoSIEvWf58ins4saopo9l25kCm+xHAGz8E/2EOncE4DyXsJ34kA== + dependencies: + "@plotly/d3" "3.8.1" + "@plotly/d3-sankey" "0.7.2" + "@plotly/d3-sankey-circular" "0.33.1" + "@turf/area" "^6.4.0" + "@turf/bbox" "^6.4.0" + "@turf/centroid" "^6.0.2" + canvas-fit "^1.5.0" + color-alpha "1.0.4" + color-normalize "1.5.0" + color-parse "1.3.8" + color-rgba "2.1.1" + country-regex "^1.1.0" + d3-force "^1.2.1" + d3-format "^1.4.5" + d3-geo "^1.12.1" + d3-geo-projection "^2.9.0" + d3-hierarchy "^1.1.9" + d3-interpolate "^3.0.1" + d3-time "^1.1.0" + d3-time-format "^2.2.3" + fast-isnumeric "^1.1.4" + gl-mat4 "^1.2.0" + gl-text "^1.3.1" + glslify "^7.1.1" + has-hover "^1.0.1" + has-passive-events "^1.0.0" + is-mobile "^4.0.0" + mapbox-gl "1.10.1" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + native-promise-only "^0.8.1" + parse-svg-path "^0.1.2" + point-in-polygon "^1.1.0" + polybooljs "^1.2.0" + probe-image-size "^7.2.3" + regl "npm:@plotly/regl@^2.1.2" + regl-error2d "^2.0.12" + regl-line2d "^3.1.2" + regl-scatter2d "^3.2.9" + regl-splom "^1.0.14" + strongly-connected-components "^1.0.1" + superscript-text "^1.0.0" + svg-path-sdf "^1.1.3" + tinycolor2 "^1.4.2" + to-px "1.0.1" + topojson-client "^3.1.0" + webgl-context "^2.2.0" + world-calendars "^1.0.3" + +point-in-polygon@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357" + integrity sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw== + +polybooljs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" + integrity sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ== + popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" @@ -4225,11 +5417,21 @@ postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -4242,6 +5444,20 @@ prettier@^3.0.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== +probe-image-size@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.3.tgz#d49c64be540ec8edea538f6f585f65a9b3ab4309" + integrity sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w== + dependencies: + lodash.merge "^4.6.2" + needle "^2.5.2" + stream-parser "~0.3.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -4261,6 +5477,11 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -4276,6 +5497,18 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4340,6 +5573,13 @@ react-markdown@^8.0.7: unist-util-visit "^4.0.0" vfile "^5.0.0" +react-plotly.js@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-plotly.js/-/react-plotly.js-2.6.0.tgz#ad6b68ee64f1b5cfa142ee92c59687f9c2c09209" + integrity sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA== + dependencies: + prop-types "^15.8.1" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -4396,6 +5636,29 @@ reactflow@^11.4.0: "@reactflow/node-resizer" "2.2.3" "@reactflow/node-toolbar" "1.3.3" +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4450,6 +5713,82 @@ regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: define-properties "^1.2.0" set-function-name "^2.0.0" +regl-error2d@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" + integrity sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA== + dependencies: + array-bounds "^1.0.1" + color-normalize "^1.5.0" + flatten-vertex-data "^1.0.2" + object-assign "^4.1.1" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-line2d@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.1.2.tgz#2bedef7f44c1f7fae75c90f9918258723ca84c1c" + integrity sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ== + dependencies: + array-bounds "^1.0.1" + array-find-index "^1.0.2" + array-normalize "^1.1.4" + color-normalize "^1.5.0" + earcut "^2.1.5" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + +regl-scatter2d@^3.2.3, regl-scatter2d@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.2.9.tgz#cd27b014c355e80d96fb2f273b563fd8f1b094f0" + integrity sha512-PNrXs+xaCClKpiB2b3HZ2j3qXQXhC5kcTh/Nfgx9rLO0EpEhab0BSQDqAsbdbpdf+pSHSJvbgitB7ulbGeQ+Fg== + dependencies: + "@plotly/point-cluster" "^3.1.9" + array-range "^1.0.1" + array-rearrange "^2.2.2" + clamp "^1.0.1" + color-id "^1.1.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + is-iexplorer "^1.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-splom@^1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.14.tgz#58800b7bbd7576aa323499a1966868a6c9ea1456" + integrity sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw== + dependencies: + array-bounds "^1.0.1" + array-range "^1.0.1" + color-alpha "^1.0.4" + flatten-vertex-data "^1.0.2" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + raf "^3.4.1" + regl-scatter2d "^3.2.3" + +regl@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/regl/-/regl-2.1.0.tgz#7dae71e9ff20f29c4f42f510c70cd92ebb6b657c" + integrity sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg== + +"regl@npm:@plotly/regl@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@plotly/regl/-/regl-2.1.2.tgz#fd31e3e820ed8824d59a67ab5e766bb101b810b6" + integrity sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw== + rehype-parse@^8.0.0, rehype-parse@^8.0.2: version "8.0.5" resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.5.tgz#ccffc21e08e288c7846614f8dc1dc23d603a4a80" @@ -4525,7 +5864,19 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.19.0, resolve@^1.22.2, resolve@^1.22.4: +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + +resolve@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + integrity sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg== + +resolve@^1.0.0, resolve@^1.1.10, resolve@^1.1.5, resolve@^1.19.0, resolve@^1.22.2, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -4548,6 +5899,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +right-now@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" + integrity sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -4576,6 +5932,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + sade@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" @@ -4593,11 +5954,16 @@ safe-array-concat@^1.0.1: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.1.0: +safe-buffer@^5.1.0, safe-buffer@^5.1.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -4607,6 +5973,16 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -4642,6 +6018,11 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +shallow-copy@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4673,6 +6054,11 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +signum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" + integrity sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -4688,11 +6074,47 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ== + +static-eval@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +stream-parser@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ== + dependencies: + debug "2" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-split-by@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" + integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== + dependencies: + parenthesis "^3.1.5" + "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: name string-width-cjs version "4.2.3" @@ -4754,6 +6176,18 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-entities@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" @@ -4797,6 +6231,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strongly-connected-components@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" + integrity sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA== + style-to-object@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" @@ -4822,6 +6261,18 @@ sucrase@^3.20.3: pirates "^4.0.1" ts-interface-checker "^0.1.9" +supercluster@^7.0.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.5.tgz#65a6ce4a037a972767740614c19051b64b8be5a3" + integrity sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg== + dependencies: + kdbush "^3.0.0" + +superscript-text@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" + integrity sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4841,11 +6292,37 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-arc-to-cubic-bezier@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + svg-parser@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +svg-path-bounds@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz#00312f672b08afc432a66ddfbd06db40cec8d0d0" + integrity sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ== + dependencies: + abs-svg-path "^0.1.1" + is-svg-path "^1.0.1" + normalize-svg-path "^1.0.0" + parse-svg-path "^0.1.2" + +svg-path-sdf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" + integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== + dependencies: + bitmap-sdf "^1.0.0" + draw-svg-path "^1.0.0" + is-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + svg-path-bounds "^1.0.1" + swr@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.4.tgz#03ec4c56019902fbdc904d78544bd7a9a6fa3f07" @@ -4886,6 +6363,22 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg== + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + tiny-case@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" @@ -4896,6 +6389,16 @@ tiny-warning@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinycolor2@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + titleize@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" @@ -4906,6 +6409,25 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +to-float32@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" + integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== + +to-px@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" + integrity sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw== + dependencies: + parse-unit "^1.0.1" + +to-px@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" + integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== + dependencies: + parse-unit "^1.0.1" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4913,6 +6435,13 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +topojson-client@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" + integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== + dependencies: + commander "2" + toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" @@ -4981,6 +6510,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -4991,6 +6527,16 @@ type-fest@^2.19.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -5030,6 +6576,19 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typedarray-pool@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" + integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== + dependencies: + bit-twiddle "^1.0.0" + dup "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@*: version "5.2.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" @@ -5120,6 +6679,11 @@ unplugin@^1.5.0: webpack-sources "^3.2.3" webpack-virtual-modules "^0.5.0" +unquote@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -5133,6 +6697,11 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +update-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" + integrity sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -5145,6 +6714,11 @@ use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + uuid@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" @@ -5215,6 +6789,20 @@ vite@^4.4.11: optionalDependencies: fsevents "~2.3.2" +vt-pbf@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + +weak-map@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.8.tgz#394c18a9e8262e790544ed8b55c6a4ddad1cb1a3" + integrity sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw== + web-namespaces@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" @@ -5225,6 +6813,13 @@ web-worker@^1.2.0: resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== +webgl-context@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" + integrity sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q== + dependencies: + get-canvas-context "^1.0.1" + webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -5292,6 +6887,18 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +world-calendars@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" + integrity sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ== + dependencies: + object-assign "^4.1.0" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -5315,6 +6922,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + integrity sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" diff --git a/src/domino/schemas/display_result.py b/src/domino/schemas/display_result.py index 6416cf08..3fb60a75 100644 --- a/src/domino/schemas/display_result.py +++ b/src/domino/schemas/display_result.py @@ -12,4 +12,5 @@ class DisplayResultFileType(str, Enum): json = "json" md = "md" pdf = "pdf" - html = "html" \ No newline at end of file + html = "html" + plotly_json = "plotly_json" \ No newline at end of file From c5cabb0a7e7153510cd209a6df7d6941d8ff257f Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 22 Nov 2023 10:11:57 -0300 Subject: [PATCH 47/72] fix array of generic dict in upstream options --- .../components/SidebarForm/PieceForm/upstreamOptions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts index 69c34594..2b27f124 100644 --- a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts +++ b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts @@ -119,7 +119,7 @@ export const getUpstreamOptions = ( } const $array = getOptions(upstreamPieces, currentType); - if (itemsSchema.type === "object") { + if (itemsSchema.type === "object" && itemsSchema.properties) { const __data: any = {}; Object.keys(itemsSchema.properties).forEach((subKey) => { const subSchema = itemsSchema.properties[subKey]; From 68f1fd8586b67a05a57a0cd8f8239da21bd021b2 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 22 Nov 2023 13:50:44 -0300 Subject: [PATCH 48/72] fix optional arrays of objects upstream options --- .../SidebarForm/PieceForm/upstreamOptions.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts index 2b27f124..980edaf8 100644 --- a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts +++ b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/upstreamOptions.ts @@ -112,6 +112,18 @@ export const getUpstreamOptions = ( currentType === "array" || (Array.isArray(currentType) && currentType.includes("array")) ) { + if ("anyOf" in currentSchema && currentSchema.anyOf.length === 2) { + const hasNullType = currentSchema.anyOf.some( + (item: any) => item.type === "null", + ); + if (hasNullType) { + const notNullAnyOf = currentSchema.anyOf.find( + (item: any) => item.type !== "null", + ); + currentSchema.items = notNullAnyOf.items; + } + } + let itemsSchema = currentSchema?.items; if (currentSchema?.items?.$ref) { const subItemSchemaName = currentSchema.items.$ref.split("/").pop(); From 7753beb1ef72555a1123c7a9f85c924dbd833f96 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Wed, 22 Nov 2023 13:58:38 -0300 Subject: [PATCH 49/72] fix possible null from upstream with always key --- .../workflowEditor/context/workflowsEditor.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frontend/src/features/workflowEditor/context/workflowsEditor.tsx b/frontend/src/features/workflowEditor/context/workflowsEditor.tsx index 10fe1783..f0483675 100644 --- a/frontend/src/features/workflowEditor/context/workflowsEditor.tsx +++ b/frontend/src/features/workflowEditor/context/workflowsEditor.tsx @@ -216,6 +216,14 @@ const WorkflowsEditorProvider: FC<{ children?: React.ReactNode }> = ({ if (!value.fromUpstream && !value.value.length) { return acc; } + if ( + value.fromUpstream && + !value.upstreamId && + !value.upstreamArgument + ) { + return acc; + } + acc[key] = { fromUpstream: value.fromUpstream, upstreamTaskId: value.fromUpstream ? value.upstreamId : null, @@ -240,6 +248,13 @@ const WorkflowsEditorProvider: FC<{ children?: React.ReactNode }> = ({ if (!value.fromUpstream && !value.value) { return acc; } + if ( + value.fromUpstream && + !value.upstreamId && + !value.upstreamArgument + ) { + return acc; + } acc[key] = { fromUpstream: value.fromUpstream, From eac2922b20a1768016052412be60e8516a77e164 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 23 Nov 2023 10:24:23 -0300 Subject: [PATCH 50/72] add dimensionality reduction example to gallery --- .../components/WorkflowExamplesGalleryModal/index.tsx | 8 ++++++++ .../utils/workflows/dimensionality_reduction.json | 1 + 2 files changed, 9 insertions(+) create mode 100644 frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index 25618566..0a5fafcb 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -11,6 +11,7 @@ import { Modal, type ModalRef } from "components/Modal"; import theme from "providers/theme.config"; import { forwardRef, type ForwardedRef, useState } from "react"; +import DimensionalityReductionWorkflow from "../../utils/workflows/dimensionality_reduction.json"; import ImageFilterWorkflow from "../../utils/workflows/image_filter_workflow.json"; import NasaImageWorkflow from "../../utils/workflows/nasa_workflow.json"; import YoutubeSummarizerWorkflow from "../../utils/workflows/youtube_summarizer.json"; @@ -48,6 +49,13 @@ const WorkflowExamplesGalleryModal = forwardRef( jsonFile: NasaImageWorkflow, levelTag: "Beginner", }, + { + title: "Dimensionality Reduction", + description: + "A workflow that applies dimensionality reduction to a dataset. To use it, you must use Shared Storage", + jsonFile: DimensionalityReductionWorkflow, + levelTag: "Intermediate", + }, ]; const levelTagMap: any = { diff --git a/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json b/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json new file mode 100644 index 00000000..4867e7cd --- /dev/null +++ b/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json @@ -0,0 +1 @@ +{"workflowPieces":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"id":2228,"name":"ToyDatasetsPiece","description":"Load toy datasets from scikit-learn","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"DatasetName":{"enum":["iris","diabetes","digits","wine","breast_cancer","linnerrud"],"title":"DatasetName","type":"string"}},"properties":{"dataset":{"allOf":[{"$ref":"#/$defs/DatasetName"}],"default":"iris","title":"Dataset name"}},"title":"ToyDatasetsPiece","type":"object"},"output_schema":{"properties":{"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"File path"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ToyDatasetsPiece","repository_id":509},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"id":2254,"name":"PCATrainPiece","description":"Applies PCA to the input data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Train Data Path","type":"string"},"n_components":{"default":2,"description":"The number of components for PCA.","title":"Number of Components","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"PCATrainPiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"},"pca_model_path":{"default":null,"title":"Pca Model Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCATrainPiece","repository_id":513},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"id":2252,"name":"PCAInferencePiece","description":"Use the trained PCA model to transform the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"model_path":{"description":"The path to the PCA model.","from_upstream":"always","title":"Model Path","type":"string"},"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Data Path","type":"string"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["model_path","data_path"],"title":"PCAInferencePiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCAInferencePiece","repository_id":513},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"id":2251,"name":"TSNEPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to data to apply t-SNE.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions t-SNE.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"TSNEPiece","type":"object"},"output_schema":{"properties":{"tsne_data_path":{"default":null,"title":"Tsne Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TSNEPiece","repository_id":513},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"id":2255,"name":"UMAPPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the data to apply UMAP.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions for UMAP.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"UMAPPiece","type":"object"},"output_schema":{"properties":{"umap_data_path":{"default":null,"title":"Umap Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/UMAPPiece","repository_id":513}},"workflowPiecesData":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"dataset":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"breast_cancer"}}},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"model_path":{"fromUpstream":true,"upstreamId":"PCATrainPi_6a654f5c472e4cd38ad8d9bc00cce586","upstreamArgument":"pca_model_path","upstreamValue":"PCATrainPiece (6a654f5c) - Pca Model Path","value":""},"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}}},"workflowNodes":[{"id":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","type":"CustomNode","position":{"x":699,"y":278.5},"data":{"name":"ToyDatasetsPiece","style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","type":"CustomNode","position":{"x":1001,"y":30.5},"data":{"name":"PCATrainPiece","style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1001,"y":30.5},"dragging":false},{"id":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","type":"CustomNode","position":{"x":1266,"y":270.5},"data":{"name":"PCAInferencePiece","style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":1266,"y":270.5},"dragging":false},{"id":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","type":"CustomNode","position":{"x":981,"y":191.5},"data":{"name":"TSNEPiece","style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":981,"y":191.5},"dragging":false},{"id":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","type":"CustomNode","position":{"x":978,"y":368.5},"data":{"name":"UMAPPiece","style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":978,"y":368.5},"dragging":false}],"workflowEdges":[{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","targetHandle":"target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","targetHandle":"target-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2251_5ce467db-a67b-4acc-80d9-e94e94309c2dtarget-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","targetHandle":"target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"},{"source":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","sourceHandle":"source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"}]} \ No newline at end of file From b99ba3d79d70866f419c126d0d0dc2ceb83db767 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Thu, 23 Nov 2023 11:00:47 -0300 Subject: [PATCH 51/72] add skip envs to tests module --- src/domino/testing/__init__.py | 3 ++- src/domino/testing/utils.py | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/domino/testing/utils.py diff --git a/src/domino/testing/__init__.py b/src/domino/testing/__init__.py index dae5dcf3..ab8cbe8e 100644 --- a/src/domino/testing/__init__.py +++ b/src/domino/testing/__init__.py @@ -1 +1,2 @@ -from .dry_run import piece_dry_run \ No newline at end of file +from .dry_run import piece_dry_run +from .utils import skip_envs \ No newline at end of file diff --git a/src/domino/testing/utils.py b/src/domino/testing/utils.py new file mode 100644 index 00000000..2a13e029 --- /dev/null +++ b/src/domino/testing/utils.py @@ -0,0 +1,6 @@ +import os +import pytest + +def skip_envs(*envs): + env = os.environ.get('DOMINO_TESTS_ENVIRONMENT') + return pytest.mark.skipif(env in list(envs),reason=f"Not suitable envrionment {env} for current test") \ No newline at end of file From 3a30344a0871512f30f5f560cb637f07a20a317f Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 16 Nov 2023 16:25:22 -0300 Subject: [PATCH 52/72] fix: key warning react --- .../components/DrawerMenu/pieceDocsPopover.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/DrawerMenu/pieceDocsPopover.tsx b/frontend/src/features/workflowEditor/components/DrawerMenu/pieceDocsPopover.tsx index e4a3a897..72a15991 100644 --- a/frontend/src/features/workflowEditor/components/DrawerMenu/pieceDocsPopover.tsx +++ b/frontend/src/features/workflowEditor/components/DrawerMenu/pieceDocsPopover.tsx @@ -22,8 +22,8 @@ function renderPieceProperties( } return ( - <> - + + {key} - {typeName} @@ -35,7 +35,7 @@ function renderPieceProperties( )} - + ); }); } From 4661288f253d0b3e1d433b9a4a2e672848148010 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 16 Nov 2023 16:25:50 -0300 Subject: [PATCH 53/72] feat: log differences already installed --- .../components/WorkflowEditor.tsx | 16 ++++--- .../workflowEditor/utils/importWorkflow.ts | 42 ++++++++++++++++--- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx b/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx index ddd9add1..fd76c086 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx @@ -246,18 +246,16 @@ export const WorkflowsEditorComponent: React.FC = () => { if (json) { const differences = await validateJsonImported(json); - if (differences) { + if (differences.length) { toast.error( "Some repositories are missing or incompatible version", ); - const uniquePieces = new Set(); - incompatiblesPieces.forEach((item) => { - const pieceWithVersion = `${ - item.split("ghcr.io/")[1].split(":")[0] - }:${item.split("ghcr.io/")[1].split(":")[1].split("-")[0]}`; - uniquePieces.add(pieceWithVersion); - }); - setIncompatiblesPieces(Array.from(uniquePieces)); + + setIncompatiblesPieces( + differences.map( + (d) => `${d.source}:${d.version} - installed: ${d.installed}`, + ), + ); incompatiblePiecesModalRef.current?.open(); } else { workflowPanelRef?.current?.setNodes(json.workflowNodes); diff --git a/frontend/src/features/workflowEditor/utils/importWorkflow.ts b/frontend/src/features/workflowEditor/utils/importWorkflow.ts index ffd0eaa2..6e51c29e 100644 --- a/frontend/src/features/workflowEditor/utils/importWorkflow.ts +++ b/frontend/src/features/workflowEditor/utils/importWorkflow.ts @@ -32,7 +32,15 @@ export const importJsonWorkflow = ( return null; // Return null if no file is selected }; -export const validateJsonImported = async (json: any) => { +interface Differences { + source: string; + version: string; + installed: boolean; +} + +export const validateJsonImported = async ( + json: any, +): Promise => { const schema = yup .object() .shape({ @@ -98,10 +106,11 @@ export const validateJsonImported = async (json: any) => { await schema.validate(json); - const currentRepositories = [ + const currentRepositories: string[] = [ ...new Set( Object.values((await localForage.getItem("pieces")) as any)?.map( - (p: any) => p?.source_image, + (p: any) => + p?.source_image.replace("ghcr.io/", "").replace(/-group\d+$/g, ""), ), ), ]; @@ -109,7 +118,11 @@ export const validateJsonImported = async (json: any) => { ...new Set( Object.values(json.workflowPieces) .reduce>((acc, next: any) => { - acc.push(next.source_image); + acc.push( + next.source_image + .replace("ghcr.io/", "") + .replace(/-group\d+$/g, ""), + ); return acc; }, []) .filter((su) => !!su) as string[], @@ -120,5 +133,24 @@ export const validateJsonImported = async (json: any) => { (x) => !currentRepositories.includes(x), ); - return differences.length ? differences : null; + const currentRepositoriesWithoutVersion = currentRepositories.map( + (cr) => cr.split(":")[0], + ); + + const differencesWithoutVersion = differences.map((d) => d.split(":")[0]); + + const uninstalled = differencesWithoutVersion.filter( + (x) => !currentRepositoriesWithoutVersion.includes(x), + ); + + return differences.map((d) => { + const source = d.split(":")[0]; + const version = d.split(":")[1]; + const installed = !uninstalled.includes(source); + return { + source, + version, + installed, + }; + }); }; From e10653e7c1bb9dab32f3d762ae5381d99de69a44 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Wed, 22 Nov 2023 17:14:42 -0300 Subject: [PATCH 54/72] feat: install repos on workflow editor --- frontend/src/components/Modal/index.tsx | 44 ++++- .../context/workspaces/api/patchWorkspace.ts | 5 +- .../workspaces/api/postPiecesRepositories.ts | 2 +- .../src/context/workspaces/repositories.tsx | 157 ++++++++++++----- .../getPiecesRepositoriesReleases.request.ts | 6 +- .../deletePieceRepository.request.ts | 5 +- .../patchPieceRepositorySecret.request.ts | 5 +- .../api/workflow/postWorkflowRunId.ts | 5 +- .../components/DifferencesModal/index.tsx | 164 ++++++++++++++++++ .../components/DrawerMenu/sidebarAddNode.tsx | 4 +- .../components/WorkflowEditor.tsx | 42 ++--- .../workflowEditor/utils/importWorkflow.ts | 80 ++++----- .../workspaceSettings/RepositoriesCard.tsx | 9 +- .../workspaceSettings/StorageSecretsCard.tsx | 5 +- .../workspaceSettings/UsersCard.tsx | 4 +- .../WorkspaceSecretsCard.tsx | 4 +- .../components/workspaceSettings/index.tsx | 6 +- .../workspaces/WorkspaceListItem.tsx | 4 +- .../workspaces/context/workspaceSettings.tsx | 147 ---------------- .../pages/workspaceSettingsPage.tsx | 7 +- 20 files changed, 386 insertions(+), 319 deletions(-) create mode 100644 frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx delete mode 100644 frontend/src/features/workspaces/context/workspaceSettings.tsx diff --git a/frontend/src/components/Modal/index.tsx b/frontend/src/components/Modal/index.tsx index a65e4414..3b3a48bd 100644 --- a/frontend/src/components/Modal/index.tsx +++ b/frontend/src/components/Modal/index.tsx @@ -1,3 +1,4 @@ +import CloseIcon from "@mui/icons-material/Close"; import { Button, Dialog, @@ -6,6 +7,7 @@ import { type DialogProps, DialogTitle, Grid, + IconButton, } from "@mui/material"; import React, { useCallback, useImperativeHandle, useState } from "react"; @@ -16,6 +18,8 @@ interface Props { fullWidth?: boolean; confirmFn?: () => void; cancelFn?: () => void; + confirmText?: string; + cancelText?: string; } export interface ModalRef { @@ -24,7 +28,19 @@ export interface ModalRef { } export const Modal = React.forwardRef( - ({ cancelFn, confirmFn, title, content, maxWidth, fullWidth }, ref) => { + ( + { + cancelFn, + confirmFn, + title, + content, + maxWidth, + fullWidth, + confirmText, + cancelText, + }, + ref, + ) => { const [isOpen, setIsOpen] = useState(false); const open = () => { @@ -59,6 +75,18 @@ export const Modal = React.forwardRef( maxWidth={maxWidth} fullWidth={fullWidth} > + theme.palette.grey[500], + }} + > + + {title} {content} @@ -66,15 +94,17 @@ export const Modal = React.forwardRef( {cancelFn && ( + + )} + {confirmFn && ( + + )} - - -
    diff --git a/frontend/src/context/workspaces/api/patchWorkspace.ts b/frontend/src/context/workspaces/api/patchWorkspace.ts index 7f58e942..9a7b77d7 100644 --- a/frontend/src/context/workspaces/api/patchWorkspace.ts +++ b/frontend/src/context/workspaces/api/patchWorkspace.ts @@ -33,10 +33,7 @@ const patchWorkspace: ( export const useAuthenticatedPatchWorkspace = () => { const { workspace } = useWorkspaces(); - if (!workspace) - throw new Error( - "Impossible to run workflows without specifying a workspace", - ); + if (!workspace) return async (_params: PatchWorkspaceParams) => {}; const fetcher = async (params: PatchWorkspaceParams) => await patchWorkspace(params).then((data) => data); diff --git a/frontend/src/context/workspaces/api/postPiecesRepositories.ts b/frontend/src/context/workspaces/api/postPiecesRepositories.ts index 93b8886d..ec0d9c7f 100644 --- a/frontend/src/context/workspaces/api/postPiecesRepositories.ts +++ b/frontend/src/context/workspaces/api/postPiecesRepositories.ts @@ -28,7 +28,7 @@ export const useAuthenticatedPostPiecesRepository = (params: { workspace: string; }) => { if (!params?.workspace) - throw new Error("Impossible to add repositories without a workspace!"); + return async (_params: IPostWorkspaceRepositoryPayload) => {}; const fetcher = async (payload: IPostWorkspaceRepositoryPayload) => await postPiecesRepository({ diff --git a/frontend/src/context/workspaces/repositories.tsx b/frontend/src/context/workspaces/repositories.tsx index bc99e8de..8a435867 100644 --- a/frontend/src/context/workspaces/repositories.tsx +++ b/frontend/src/context/workspaces/repositories.tsx @@ -2,20 +2,46 @@ import { type IGetRepoPiecesResponseInterface, useAuthenticatedGetPieceRepositories, useFetchAuthenticatedGetRepoIdPieces, + type IGetPiecesRepositoriesResponseInterface, + type IGetPiecesRepositoriesReleasesParams, + type IGetPiecesRepositoriesReleasesResponseInterface, + useAuthenticatedGetPieceRepositoriesReleases, + useAuthenticatedDeleteRepository, } from "features/myWorkflows/api"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { toast } from "react-toastify"; import localForage from "services/config/localForage.config"; +import { type KeyedMutator } from "swr"; import { createCustomContext } from "utils"; +import { useAuthenticatedPostPiecesRepository } from "./api"; +import { + type IPostWorkspaceRepositoryPayload, + type IPostWorkspaceRepositoryResponseInterface, +} from "./types"; +import { useWorkspaces } from "./workspaces"; + export interface IPiecesContext { repositories: PieceRepository[]; - repositoriesError: boolean; - repositoriesLoading: boolean; + defaultRepositories: PieceRepository[]; repositoryPieces: PiecesRepository; + repositoriesLoading: boolean; - search: string; - handleSearch: (word: string) => void; + selectedRepositoryId: null | number; + setSelectedRepositoryId: React.Dispatch>; + + handleRefreshRepositories: KeyedMutator< + IGetPiecesRepositoriesResponseInterface | undefined + >; + handleAddRepository: ( + params: Omit, + ) => Promise; + + handleFetchRepoReleases: ( + params: IGetPiecesRepositoriesReleasesParams, + ) => Promise; + + handleDeleteRepository: (id: string) => Promise; fetchRepoById: (params: { id: string; @@ -29,24 +55,53 @@ export const [PiecesContext, usesPieces] = const PiecesProvider: React.FC<{ children: React.ReactNode }> = ({ children, }) => { - const [search, handleSearch] = useState(""); - const [repositoryPieces, setRepositoryPieces] = useState( - {}, - ); + const [selectedRepositoryId, setSelectedRepositoryId] = useState< + number | null + >(null); + + const { workspace, handleRefreshWorkspaces } = useWorkspaces(); const fetchRepoById = useFetchAuthenticatedGetRepoIdPieces(); const { - data, + data: repositories, error: repositoriesError, isValidating: repositoriesLoading, - // mutate: repositoriesRefresh, + mutate: handleRefreshRepositories, } = useAuthenticatedGetPieceRepositories({}); - const repositories: PieceRepository[] = useMemo( - () => data?.data.filter((repo) => repo.name.includes(search)) ?? [], - [data, search], - ); + const repositoryPieces = useMemo(() => { + const repositoryPiecesAux: PiecesRepository = {}; + const foragePieces: PieceForageSchema = {}; + + console.log("repositories", repositories); + + if (!repositories?.data?.length) { + void localForage.setItem("pieces", foragePieces); + return {}; + } else { + for (const repo of repositories.data) { + fetchRepoById({ id: repo.id }) + .then((pieces: any) => { + repositoryPiecesAux[repo.id] = []; + for (const op of pieces) { + repositoryPiecesAux[repo.id].push(op); + foragePieces[op.id] = op; + } + void localForage.setItem("pieces", foragePieces); + }) + .catch((e) => { + console.log(e); + }); + // Set piece item to storage -> {piece_id: Piece} + } + return repositoryPiecesAux; + } + }, [repositories, fetchRepoById]); + + const { data: defaultRepositories } = useAuthenticatedGetPieceRepositories({ + source: "default", + }); const fetchForagePieceById = useCallback(async (id: number) => { const pieces = await localForage.getItem("pieces"); @@ -55,33 +110,34 @@ const PiecesProvider: React.FC<{ children: React.ReactNode }> = ({ } }, []); - useEffect(() => { - const updateRepositoriesPieces = async () => { - const repositoryPiecesAux: PiecesRepository = {}; - const foragePieces: PieceForageSchema = {}; - if (!repositories?.length) { - void localForage.setItem("pieces", foragePieces); - } else { - for (const repo of repositories) { - fetchRepoById({ id: repo.id }) - .then((pieces: any) => { - repositoryPiecesAux[repo.id] = []; - for (const op of pieces) { - repositoryPiecesAux[repo.id].push(op); - foragePieces[op.id] = op; - } - setRepositoryPieces(repositoryPiecesAux); - void localForage.setItem("pieces", foragePieces); - }) - .catch((e) => { - console.log(e); - }); - // Set piece item to storage -> {piece_id: Piece} - } - } - }; - void updateRepositoriesPieces(); - }, [repositories, fetchRepoById]); + const postRepository = useAuthenticatedPostPiecesRepository({ + workspace: workspace?.id ?? "", + }); + + const handleAddRepository = useCallback( + async (payload: Omit) => + await postRepository({ ...payload, workspace_id: workspace?.id ?? "" }) + .then((data) => { + toast.success(`Repository added successfully!`); + handleRefreshWorkspaces(); + return data; + }) + .catch((e) => { + if (e.response?.status === 403) { + toast.error( + `You don't have permission to add repositories to this workspace.`, + ); + return; + } + toast.error(`Error adding repository, try again later.`); + }), + [postRepository, handleRefreshWorkspaces, workspace?.id], + ); + + const handleFetchRepoReleases = + useAuthenticatedGetPieceRepositoriesReleases(); + + const handleDeleteRepository = useAuthenticatedDeleteRepository(); useEffect(() => { if (repositoriesError) { @@ -90,14 +146,21 @@ const PiecesProvider: React.FC<{ children: React.ReactNode }> = ({ }, [repositoriesError]); const value: IPiecesContext = { + repositories: repositories?.data ?? [], + defaultRepositories: defaultRepositories?.data ?? [], + repositoryPieces, + repositoriesLoading, + + selectedRepositoryId, + setSelectedRepositoryId, + + handleRefreshRepositories, + handleAddRepository, + handleFetchRepoReleases, + handleDeleteRepository, + fetchForagePieceById, fetchRepoById, - handleSearch, - repositories, - repositoriesError, - repositoriesLoading, - repositoryPieces, - search, }; return ( diff --git a/frontend/src/features/myWorkflows/api/piece/getPiecesRepositoriesReleases.request.ts b/frontend/src/features/myWorkflows/api/piece/getPiecesRepositoriesReleases.request.ts index a0b573e3..2be28bca 100644 --- a/frontend/src/features/myWorkflows/api/piece/getPiecesRepositoriesReleases.request.ts +++ b/frontend/src/features/myWorkflows/api/piece/getPiecesRepositoriesReleases.request.ts @@ -36,10 +36,8 @@ const getPiecesRepositoriesReleases: ( export const useAuthenticatedGetPieceRepositoriesReleases = () => { const { workspace } = useWorkspaces(); - if (!workspace) - throw new Error( - "Impossible to fetch pieces repositories without specifying a workspace", - ); + if (!workspace?.id) + return (_params: IGetPiecesRepositoriesReleasesParams) => {}; return async (params: IGetPiecesRepositoriesReleasesParams) => await getPiecesRepositoriesReleases({ diff --git a/frontend/src/features/myWorkflows/api/repository/deletePieceRepository.request.ts b/frontend/src/features/myWorkflows/api/repository/deletePieceRepository.request.ts index 33bb30d1..1c33f61e 100644 --- a/frontend/src/features/myWorkflows/api/repository/deletePieceRepository.request.ts +++ b/frontend/src/features/myWorkflows/api/repository/deletePieceRepository.request.ts @@ -20,10 +20,7 @@ const deleteRepository: (id: string) => Promise = async (id) => { export const useAuthenticatedDeleteRepository = () => { const { workspace } = useWorkspaces(); - if (!workspace) - throw new Error( - "Impossible to run workflows without specifying a workspace", - ); + if (!workspace) return async (_id: string) => {}; const fetcher = async (id: string) => await deleteRepository(id).then((data) => data); diff --git a/frontend/src/features/myWorkflows/api/repository/patchPieceRepositorySecret.request.ts b/frontend/src/features/myWorkflows/api/repository/patchPieceRepositorySecret.request.ts index 9c8c452b..6b774972 100644 --- a/frontend/src/features/myWorkflows/api/repository/patchPieceRepositorySecret.request.ts +++ b/frontend/src/features/myWorkflows/api/repository/patchPieceRepositorySecret.request.ts @@ -34,10 +34,7 @@ const patchRepositorySecret: ( export const useAuthenticatedPatchRepositorySecret = () => { const { workspace } = useWorkspaces(); - if (!workspace) - throw new Error( - "Impossible to run workflows without specifying a workspace", - ); + if (!workspace) return async (_params: PatchRepositorySecretParams) => {}; const fetcher = async (params: PatchRepositorySecretParams) => await patchRepositorySecret(params).then((data) => data); diff --git a/frontend/src/features/myWorkflows/api/workflow/postWorkflowRunId.ts b/frontend/src/features/myWorkflows/api/workflow/postWorkflowRunId.ts index a3d37088..12517a8e 100644 --- a/frontend/src/features/myWorkflows/api/workflow/postWorkflowRunId.ts +++ b/frontend/src/features/myWorkflows/api/workflow/postWorkflowRunId.ts @@ -36,10 +36,7 @@ const postWorkflowRunId: ( export const useAuthenticatedPostWorkflowRunId = () => { const { workspace } = useWorkspaces(); - if (!workspace) - throw new Error( - "Impossible to run workflows without specifying a workspace", - ); + if (!workspace) return async (_params: IPostWorkflowRunIdParams) => {}; const fetcher = async (params: IPostWorkflowRunIdParams) => await postWorkflowRunId(workspace.id, params) diff --git a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx new file mode 100644 index 00000000..d280084e --- /dev/null +++ b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx @@ -0,0 +1,164 @@ +import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; +import { + Button, + Grid, + List, + ListItem, + ListItemIcon, + ListItemText, + Tooltip, + Typography, +} from "@mui/material"; +import { Modal, type ModalRef } from "components/Modal"; +import { useWorkspaces, usesPieces } from "context/workspaces"; +import { + useAuthenticatedGetWorkspace, + useAuthenticatedPostPiecesRepository, +} from "context/workspaces/api"; +import { type Differences } from "features/workflowEditor/utils/importWorkflow"; +import React, { forwardRef, useCallback, useMemo } from "react"; +import { Link } from "react-router-dom"; + +interface Props { + incompatiblesPieces: Differences[]; +} + +export const DifferencesModal = forwardRef( + ({ incompatiblesPieces }, ref) => { + const { workspace } = useWorkspaces(); + const { handleRefreshRepositories } = usesPieces(); + const handleAddRepository = useAuthenticatedPostPiecesRepository({ + workspace: workspace?.id ?? "", + }); + + const { mutate: refreshWorkspaceData } = useAuthenticatedGetWorkspace({ + id: workspace?.id ?? "", + }); + + const { installedPieces, uninstalledPieces } = useMemo(() => { + return { + installedPieces: incompatiblesPieces.filter((p) => p.installedVersion), + uninstalledPieces: incompatiblesPieces.filter( + (p) => !p.installedVersion, + ), + }; + }, [incompatiblesPieces]); + + const installRepositories = useCallback( + (e: Omit) => { + const addRepository = { + workspace_id: workspace?.id ?? "", + source: "github", + path: e.source, + version: e.requiredVersion, + url: `http://github.com/${e.source}`, + }; + + handleAddRepository(addRepository) + .then(async () => { + await refreshWorkspaceData().catch((e) => { + console.log(e); + }); + await handleRefreshRepositories().catch((e) => { + console.log(e); + }); + }) + .catch((e) => { + console.log(e); + }) + .finally(() => {}); + }, + [handleAddRepository], + ); + + const handleInstallMissingRepositories = useCallback(async () => { + await Promise.allSettled(uninstalledPieces.map(installRepositories)); + }, [installRepositories, uninstalledPieces]); + + return ( + + + + Some of the pieces necessary to run this workflow are not + present in this workspace or mismatch the correct version. + + {!!installedPieces.length && ( + <> + + Incorrect version pieces need to be manually update on + + workspace settings + + )} + + + + {uninstalledPieces.map((item) => ( + + + + + + Install {item.requiredVersion} + + + } + > + + + ))} + {installedPieces.map((item) => ( + + + + + + Update to {item.requiredVersion} + + + } + > + + + ))} + + + {!!uninstalledPieces.length && ( + + + + + + )} +
    + } + ref={ref} + /> + ); + }, +); + +DifferencesModal.displayName = "DifferencesModal"; diff --git a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx index 319243ab..a2e00e1a 100644 --- a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx +++ b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx @@ -27,6 +27,7 @@ const SidebarAddNode: FC = ({ setOrientation, orientation }) => { const [filter, setFilter] = useState(""); const [expanded, setExpanded] = useState>({}); + const filteredRepositoryPieces = useMemo(() => { function filterPieces( repository: PiecesRepository, @@ -51,6 +52,7 @@ const SidebarAddNode: FC = ({ setOrientation, orientation }) => { return filteredRepository; } + console.log("repositoryPieces", repositoryPieces); return filterPieces(repositoryPieces, filter); }, [filter, repositoryPieces, setExpanded]); @@ -104,7 +106,7 @@ const SidebarAddNode: FC = ({ setOrientation, orientation }) => { /> {!repositoriesLoading && repositories.map((repo) => { - if (!filteredRepositoryPieces[repo.id].length) { + if (!filteredRepositoryPieces[repo.id]?.length) { return null; } diff --git a/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx b/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx index fd76c086..4870bc9f 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowEditor.tsx @@ -8,7 +8,7 @@ import Menu from "@mui/material/Menu"; import MenuItem from "@mui/material/MenuItem"; import { AxiosError } from "axios"; import Loading from "components/Loading"; -import { Modal, type ModalRef } from "components/Modal"; +import { type ModalRef } from "components/Modal"; import { type WorkflowPanelRef, WorkflowPanel, @@ -28,10 +28,13 @@ import { type GenerateWorkflowsParams } from "../context/workflowsEditor"; import { containerResourcesSchema } from "../schemas/containerResourcesSchemas"; import { extractDefaultInputValues, extractDefaultValues } from "../utils"; import { + type Differences, importJsonWorkflow, validateJsonImported, + findDifferencesInJsonImported, } from "../utils/importWorkflow"; +import { DifferencesModal } from "./DifferencesModal"; import { PermanentDrawerRightWorkflows } from "./DrawerMenu"; import { MyWorkflowExamplesGalleryModal } from "./MyWorkflowsGalleryModal"; import SidebarPieceForm from "./SidebarForm"; @@ -87,7 +90,9 @@ export const WorkflowsEditorComponent: React.FC = () => { const incompatiblePiecesModalRef = useRef(null); const workflowsGalleryModalRef = useRef(null); const myWorkflowsGalleryModalRef = useRef(null); - const [incompatiblesPieces, setIncompatiblesPieces] = useState([]); + const [incompatiblesPieces, setIncompatiblesPieces] = useState( + [], + ); const { workspace } = useWorkspaces(); @@ -244,18 +249,16 @@ export const WorkflowsEditorComponent: React.FC = () => { async (json: GenerateWorkflowsParams) => { try { if (json) { - const differences = await validateJsonImported(json); + await validateJsonImported(json); + + const differences = await findDifferencesInJsonImported(json); if (differences.length) { toast.error( "Some repositories are missing or incompatible version", ); - setIncompatiblesPieces( - differences.map( - (d) => `${d.source}:${d.version} - installed: ${d.installed}`, - ), - ); + setIncompatiblesPieces(differences); incompatiblePiecesModalRef.current?.open(); } else { workflowPanelRef?.current?.setNodes(json.workflowNodes); @@ -496,25 +499,6 @@ export const WorkflowsEditorComponent: React.FC = () => { ref={fileInputRef} /> Import - -

    - Some of the pieces necessary to run this workflow are - not present in this workspace. In order to install the - correct versions go to the workspace configuration page - and install the following repositories versions: -

    -
      - {incompatiblesPieces.map((item) => ( -
    • {`${item}`}
    • - ))} -
    - - } - ref={incompatiblePiecesModalRef} - /> { void handleImportedJson(json); }} /> + diff --git a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx index a2e00e1a..9ea310b4 100644 --- a/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx +++ b/frontend/src/features/workflowEditor/components/DrawerMenu/sidebarAddNode.tsx @@ -52,7 +52,6 @@ const SidebarAddNode: FC = ({ setOrientation, orientation }) => { return filteredRepository; } - console.log("repositoryPieces", repositoryPieces); return filterPieces(repositoryPieces, filter); }, [filter, repositoryPieces, setExpanded]); From d9e87d40ababa163dc17e76b73852c4d22b68eab Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 23 Nov 2023 18:17:52 -0300 Subject: [PATCH 56/72] fix: url differences on install on workflow editor --- frontend/src/@types/piece/piece.d.ts | 1 + .../components/DifferencesModal/index.tsx | 2 +- .../workflowEditor/utils/importWorkflow.ts | 31 +++++++++++++------ .../workflows/dimensionality_reduction.json | 2 +- .../workflows/image_filter_workflow.json | 2 +- .../utils/workflows/nasa_workflow.json | 2 +- .../utils/workflows/youtube_summarizer.json | 2 +- rest/schemas/responses/piece.py | 1 + rest/services/piece_service.py | 4 +-- .../custom_operators/docker_operator.py | 10 +++--- 10 files changed, 36 insertions(+), 21 deletions(-) diff --git a/frontend/src/@types/piece/piece.d.ts b/frontend/src/@types/piece/piece.d.ts index cbdddb72..c04098cf 100644 --- a/frontend/src/@types/piece/piece.d.ts +++ b/frontend/src/@types/piece/piece.d.ts @@ -50,6 +50,7 @@ export interface Piece { source_image: string; source_url: string | null; + repository_url: string; dependency: { docker_image: string | null; dockerfile: string | null; diff --git a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx index 3b78fd93..af5b57e0 100644 --- a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx @@ -40,7 +40,7 @@ export const DifferencesModal = forwardRef( source: "github", path: e.source, version: e.requiredVersion, - url: `http://github.com/${e.source}`, + url: `https://github.com/${e.source}`, }; handleAddRepository(addRepository) diff --git a/frontend/src/features/workflowEditor/utils/importWorkflow.ts b/frontend/src/features/workflowEditor/utils/importWorkflow.ts index a1baf14e..0377f43d 100644 --- a/frontend/src/features/workflowEditor/utils/importWorkflow.ts +++ b/frontend/src/features/workflowEditor/utils/importWorkflow.ts @@ -109,20 +109,33 @@ export const findDifferencesInJsonImported = async ( ): Promise => { const currentRepositories = new Set( Object.values((await localForage.getItem("pieces")) as any)?.map( - (p: any) => - p?.source_image.replace("ghcr.io/", "").replace(/-group\d+$/g, "") || - "", + (p: any) => { + // console.log(p?.source_image.split(":")); + + const result = + p?.repository_url.replace("https://github.com/", "") + + ":" + + p?.source_image.split(":")[1]?.replace(/-group\d+$/g, "") || ""; + + console.log(result); + + return result; + }, ) || [], ); const incomeRepositories = new Set( Object.values(json.workflowPieces) - .flatMap( - (next: any) => - next.source_image - .replace("ghcr.io/", "") - .replace(/-group\d+$/g, "") || null, - ) + .flatMap((next: any) => { + console.log(next); + + const result = + next.repository_url.replace("https://github.com/", "") + + ":" + + next.source_image.split(":")[1].replace(/-group\d+$/g, "") || null; + + return result; + }) .filter(Boolean) as string[], ); diff --git a/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json b/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json index 4867e7cd..eb506581 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json +++ b/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json @@ -1 +1 @@ -{"workflowPieces":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"id":2228,"name":"ToyDatasetsPiece","description":"Load toy datasets from scikit-learn","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"DatasetName":{"enum":["iris","diabetes","digits","wine","breast_cancer","linnerrud"],"title":"DatasetName","type":"string"}},"properties":{"dataset":{"allOf":[{"$ref":"#/$defs/DatasetName"}],"default":"iris","title":"Dataset name"}},"title":"ToyDatasetsPiece","type":"object"},"output_schema":{"properties":{"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"File path"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ToyDatasetsPiece","repository_id":509},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"id":2254,"name":"PCATrainPiece","description":"Applies PCA to the input data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Train Data Path","type":"string"},"n_components":{"default":2,"description":"The number of components for PCA.","title":"Number of Components","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"PCATrainPiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"},"pca_model_path":{"default":null,"title":"Pca Model Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCATrainPiece","repository_id":513},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"id":2252,"name":"PCAInferencePiece","description":"Use the trained PCA model to transform the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"model_path":{"description":"The path to the PCA model.","from_upstream":"always","title":"Model Path","type":"string"},"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Data Path","type":"string"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["model_path","data_path"],"title":"PCAInferencePiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCAInferencePiece","repository_id":513},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"id":2251,"name":"TSNEPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to data to apply t-SNE.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions t-SNE.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"TSNEPiece","type":"object"},"output_schema":{"properties":{"tsne_data_path":{"default":null,"title":"Tsne Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TSNEPiece","repository_id":513},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"id":2255,"name":"UMAPPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the data to apply UMAP.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions for UMAP.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"UMAPPiece","type":"object"},"output_schema":{"properties":{"umap_data_path":{"default":null,"title":"Umap Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/UMAPPiece","repository_id":513}},"workflowPiecesData":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"dataset":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"breast_cancer"}}},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"model_path":{"fromUpstream":true,"upstreamId":"PCATrainPi_6a654f5c472e4cd38ad8d9bc00cce586","upstreamArgument":"pca_model_path","upstreamValue":"PCATrainPiece (6a654f5c) - Pca Model Path","value":""},"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}}},"workflowNodes":[{"id":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","type":"CustomNode","position":{"x":699,"y":278.5},"data":{"name":"ToyDatasetsPiece","style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","type":"CustomNode","position":{"x":1001,"y":30.5},"data":{"name":"PCATrainPiece","style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1001,"y":30.5},"dragging":false},{"id":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","type":"CustomNode","position":{"x":1266,"y":270.5},"data":{"name":"PCAInferencePiece","style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":1266,"y":270.5},"dragging":false},{"id":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","type":"CustomNode","position":{"x":981,"y":191.5},"data":{"name":"TSNEPiece","style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":981,"y":191.5},"dragging":false},{"id":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","type":"CustomNode","position":{"x":978,"y":368.5},"data":{"name":"UMAPPiece","style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":978,"y":368.5},"dragging":false}],"workflowEdges":[{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","targetHandle":"target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","targetHandle":"target-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2251_5ce467db-a67b-4acc-80d9-e94e94309c2dtarget-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","targetHandle":"target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"},{"source":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","sourceHandle":"source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"}]} \ No newline at end of file +{"workflowPieces":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"id":2228,"name":"ToyDatasetsPiece","description":"Load toy datasets from scikit-learn","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"DatasetName":{"enum":["iris","diabetes","digits","wine","breast_cancer","linnerrud"],"title":"DatasetName","type":"string"}},"properties":{"dataset":{"allOf":[{"$ref":"#/$defs/DatasetName"}],"default":"iris","title":"Dataset name"}},"title":"ToyDatasetsPiece","type":"object"},"output_schema":{"properties":{"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"File path"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ToyDatasetsPiece","repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","repository_id":509},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"id":2254,"name":"PCATrainPiece","description":"Applies PCA to the input data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Train Data Path","type":"string"},"n_components":{"default":2,"description":"The number of components for PCA.","title":"Number of Components","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"PCATrainPiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"},"pca_model_path":{"default":null,"title":"Pca Model Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCATrainPiece","repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","repository_id":513},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"id":2252,"name":"PCAInferencePiece","description":"Use the trained PCA model to transform the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"model_path":{"description":"The path to the PCA model.","from_upstream":"always","title":"Model Path","type":"string"},"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Data Path","type":"string"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["model_path","data_path"],"title":"PCAInferencePiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCAInferencePiece","repository_id":513},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"id":2251,"name":"TSNEPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to data to apply t-SNE.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions t-SNE.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"TSNEPiece","type":"object"},"output_schema":{"properties":{"tsne_data_path":{"default":null,"title":"Tsne Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TSNEPiece","repository_id":513},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"id":2255,"name":"UMAPPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the data to apply UMAP.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions for UMAP.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"UMAPPiece","type":"object"},"output_schema":{"properties":{"umap_data_path":{"default":null,"title":"Umap Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/UMAPPiece","repository_id":513}},"workflowPiecesData":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"dataset":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"breast_cancer"}}},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"model_path":{"fromUpstream":true,"upstreamId":"PCATrainPi_6a654f5c472e4cd38ad8d9bc00cce586","upstreamArgument":"pca_model_path","upstreamValue":"PCATrainPiece (6a654f5c) - Pca Model Path","value":""},"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}}},"workflowNodes":[{"id":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","type":"CustomNode","position":{"x":699,"y":278.5},"data":{"name":"ToyDatasetsPiece","style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","type":"CustomNode","position":{"x":1001,"y":30.5},"data":{"name":"PCATrainPiece","style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1001,"y":30.5},"dragging":false},{"id":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","type":"CustomNode","position":{"x":1266,"y":270.5},"data":{"name":"PCAInferencePiece","style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":1266,"y":270.5},"dragging":false},{"id":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","type":"CustomNode","position":{"x":981,"y":191.5},"data":{"name":"TSNEPiece","style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":981,"y":191.5},"dragging":false},{"id":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","type":"CustomNode","position":{"x":978,"y":368.5},"data":{"name":"UMAPPiece","style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":978,"y":368.5},"dragging":false}],"workflowEdges":[{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","targetHandle":"target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","targetHandle":"target-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2251_5ce467db-a67b-4acc-80d9-e94e94309c2dtarget-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","targetHandle":"target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"},{"source":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","sourceHandle":"source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"}]} diff --git a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json index 4c1adb51..87120eb1 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json +++ b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json @@ -1 +1 @@ -{"workflowPieces":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"id":694,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":219},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"id":695,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":219}},"workflowPiecesData":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_27dd10b0cd4b41a5bb118468b0a3c60b","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (27dd10b0) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}}},"workflowNodes":[{"id":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","type":"CustomNode","position":{"x":369,"y":188.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","type":"CustomNode","position":{"x":656,"y":161.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"dragging":false}],"workflowEdges":[{"source":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","sourceHandle":"source-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","target":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","targetHandle":"target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62","id":"reactflow__edge-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60bsource-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b-695_7a0d7be2-528e-4149-831a-d0a4308dcb62target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62"}]} \ No newline at end of file +{"workflowPieces":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"id":694,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":219},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"id":695,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":219}},"workflowPiecesData":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_27dd10b0cd4b41a5bb118468b0a3c60b","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (27dd10b0) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}}},"workflowNodes":[{"id":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","type":"CustomNode","position":{"x":369,"y":188.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","type":"CustomNode","position":{"x":656,"y":161.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"dragging":false}],"workflowEdges":[{"source":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","sourceHandle":"source-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","target":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","targetHandle":"target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62","id":"reactflow__edge-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60bsource-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b-695_7a0d7be2-528e-4149-831a-d0a4308dcb62target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62"}]} diff --git a/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json index bb0bbf32..538faf3a 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json +++ b/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json @@ -1 +1 @@ -{"workflowPieces":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"id":705,"name":"NasaEarthImagePiece","description":"This Piece uses the NASA EPIC API to get satellite images of the Earth.\nReferences: \n- https://epic.gsfc.nasa.gov/about/api \n- https://api.nasa.gov/","dependency":{"dockerfile":null,"requirements_file":"requirements.txt"},"source_image":"ghcr.io/tauffer-consulting/data_apis_domino_pieces:0.2.0-group0","input_schema":{"$defs":{"LocationTypes":{"enum":["random","America","Atlantic Ocean","Africa","Asia","Pacific Ocean"],"title":"LocationTypes","type":"string"}},"properties":{"location":{"allOf":[{"$ref":"#/$defs/LocationTypes"}],"default":"random","description":"Retrieve image centered approximately on this location."}},"title":"NasaEarthImagePiece","type":"object"},"output_schema":{"properties":{"image_url":{"default":null,"description":"URL of the image.","title":"Image Url","type":"string"},"image_base64_string":{"default":null,"description":"Output data as base64 encoded string.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":null,"description":"Path to the image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"properties":{"NASA_API_KEY":{"default":"DEMO_KEY","description":"API key for NASA Earth Image API.","title":"Nasa Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces/tree/main/pieces/NasaEarthImagePiece","repository_id":221}},"workflowPiecesData":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"location":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"random"}}}},"workflowNodes":[{"id":"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52","type":"CustomNode","position":{"x":718,"y":212.5},"data":{"name":"NasaEarthImagePiece","style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":718,"y":212.5},"dragging":false}],"workflowEdges":[]} \ No newline at end of file +{"workflowPieces":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"id":705,"name":"NasaEarthImagePiece","description":"This Piece uses the NASA EPIC API to get satellite images of the Earth.\nReferences: \n- https://epic.gsfc.nasa.gov/about/api \n- https://api.nasa.gov/","dependency":{"dockerfile":null,"requirements_file":"requirements.txt"},"source_image":"ghcr.io/tauffer-consulting/data_apis_domino_pieces:0.2.0-group0","input_schema":{"$defs":{"LocationTypes":{"enum":["random","America","Atlantic Ocean","Africa","Asia","Pacific Ocean"],"title":"LocationTypes","type":"string"}},"properties":{"location":{"allOf":[{"$ref":"#/$defs/LocationTypes"}],"default":"random","description":"Retrieve image centered approximately on this location."}},"title":"NasaEarthImagePiece","type":"object"},"output_schema":{"properties":{"image_url":{"default":null,"description":"URL of the image.","title":"Image Url","type":"string"},"image_base64_string":{"default":null,"description":"Output data as base64 encoded string.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":null,"description":"Path to the image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"properties":{"NASA_API_KEY":{"default":"DEMO_KEY","description":"API key for NASA Earth Image API.","title":"Nasa Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces/tree/main/pieces/NasaEarthImagePiece","repository_id":221}},"workflowPiecesData":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"location":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"random"}}}},"workflowNodes":[{"id":"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52","type":"CustomNode","position":{"x":718,"y":212.5},"data":{"name":"NasaEarthImagePiece","style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":718,"y":212.5},"dragging":false}],"workflowEdges":[]} diff --git a/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json b/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json index cf32bcc3..9260c95f 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json +++ b/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json @@ -1 +1 @@ -{"workflowPieces":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"id":494,"name":"YoutubeListVideosPiece","description":"List videos from youtube channel.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OrderBy":{"description":"The order in which the videos are returned.","enum":["date","rating","relevance","title","viewCount"],"title":"OrderBy","type":"string"},"VideoDuration":{"description":"The duration of the video.","enum":["any","long","medium","short"],"title":"VideoDuration","type":"string"}},"description":"Input data for YoutubeListVideosPiece","properties":{"channel_username":{"default":null,"description":"The username of the Youtube channel.","title":"Channel Username","type":"string"},"max_videos":{"default":10,"description":"The maximum number of videos to be returned","exclusiveMinimum":0,"title":"Max Videos","type":"integer"},"published_at_or_after":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created at or after the specified date","title":"Published At Or After"},"published_at_or_before":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created before or at the specified date","title":"Published At Or Before"},"order_by":{"allOf":[{"$ref":"#/$defs/OrderBy"}],"default":"date","description":"The order in which the videos are returned","title":"Order By"},"video_duration":{"allOf":[{"$ref":"#/$defs/VideoDuration"}],"default":"any","description":"The duration of the video","title":"Video Duration"},"return_only_urls":{"default":false,"description":"If True, only the urls of the videos will be returned","title":"Return only urls","type":"boolean"}},"title":"YoutubeListVideosPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeListVideosPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"videos_list":{"description":"A list containing information about videos.","items":{},"title":"Videos List","type":"array"}},"required":["videos_list"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for YoutubeListVideosPiece","properties":{"YOUTUBE_API_KEY":{"default":null,"description":"The Youtube Data API Key.","title":"Youtube Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeListVideosPiece","repository_id":179},"469_9d388791-b669-41b0-8983-36923286e964":{"id":469,"name":"GetItemFromArrayPiece","description":"Get one item from an array","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"IndexType":{"enum":["first","last","random","another"],"title":"IndexType","type":"string"}},"description":"GetItemFromArrayPiece Input Model","properties":{"input_array":{"description":"Input array to get item from.","from_upstream":"always","items":{},"title":"Input Array","type":"array"},"index":{"allOf":[{"$ref":"#/$defs/IndexType"}],"default":"first","description":"Index of item to get from input array."},"another_index":{"default":1,"description":"Index number of item to get from input array.","minimum":1,"title":"Another Index","type":"integer"}},"required":["input_array"],"title":"GetItemFromArrayPiece","type":"object"},"output_schema":{"description":"GetItemFromArrayPiece Output Model","properties":{"output_value":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"object"},{"format":"date","type":"string"},{"format":"time","type":"string"},{"format":"date-time","type":"string"}],"description":"Item from input array at specified index.","title":"Output Value"}},"required":["output_value"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetItemFromArrayPiece","repository_id":176},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"id":493,"name":"YoutubeDownloadPiece","description":"Downloads content from youtube videos as audio or video files.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OutputTypeType":{"enum":["audio","video"],"title":"OutputTypeType","type":"string"}},"description":"Input data for YoutubeDownloadPiece","properties":{"url":{"description":"The url of the video to be downloaded.","title":"Url","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"audio","description":"The type of output file to be downloaded."}},"required":["url"],"title":"YoutubeDownloadPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeDownloadPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"file_path":{"description":"The path to the downloaded file","title":"File Path","type":"string"}},"required":["file_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeDownloadPiece","repository_id":179},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"id":475,"name":"AudioTranscriptionPiece","description":"This Piece uses the OpenAI API to extract text transcripts from audio.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"AudioTranscriptPiece input model","properties":{"audio_file_path":{"description":"The path to the audio file to process.","title":"Audio File Path","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output for the result text"},"temperature":{"default":0.1,"description":"What sampling temperature to use, between 0 and 1","exclusiveMinimum":0,"maximum":1,"title":"Temperature","type":"number"}},"required":["audio_file_path"],"title":"AudioTranscriptionPiece","type":"object"},"output_schema":{"description":"AudioTranscriptPiece output model","properties":{"message":{"description":"Output message to log","title":"Message","type":"string"},"string_transcription_result":{"default":null,"description":"The result transcription text as a string.","title":"String Transcription Result","type":"string"},"file_path_transcription_result":{"default":null,"description":"The result transcription text as a file path.","title":"File Path Transcription Result","type":"string"}},"required":["message"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"AudioTranscriptPiece secret model","properties":{"OPENAI_API_KEY":{"description":"OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/AudioTranscriptionPiece","repository_id":177},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"id":480,"name":"TextSummarizerPiece","description":"This Piece runs a text summarizer using OpenAI API.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"LLMModelType":{"description":"OpenAI model type","enum":["gpt-3.5-turbo","gpt-4"],"title":"LLMModelType","type":"string"},"OutputTypeType":{"description":"Output type for the completion result","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"TextSummarizerPiece Input model","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text to summarize","required":false,"title":"Text"},"text_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Use it only if not using text field. File path to the text to summarize","required":false,"title":"Text File Path"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output to return"},"openai_model":{"allOf":[{"$ref":"#/$defs/LLMModelType"}],"default":"gpt-3.5-turbo","description":"OpenAI model name to use for summarization"},"chunk_size":{"default":1000,"description":"Chunk size, measured in tokens, of each pre-summary chunk","title":"Chunk Size","type":"integer"},"chunk_overlap_rate":{"default":0.2,"description":"The percentage of overlap between each chunk","title":"Chunk Overlap Rate","type":"number"},"completion_max_tokens":{"default":500,"description":"The maximum number of tokens to generate in the summary.","title":"Completion Max Tokens","type":"integer"},"temperature":{"default":0.2,"description":"Temperature of the model, between 0 (more precise) and 1 (more creative)","title":"Temperature","type":"number"}},"title":"TextSummarizerPiece","type":"object"},"output_schema":{"description":"TextSummarizerPiece Output model","properties":{"string_summarized_text":{"default":null,"description":"summarized text","title":"String Summarized Text","type":"string"},"file_path_summarized_text":{"default":null,"description":"Path to summarized text file","title":"File Path Summarized Text","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"description":"TextSummarizerPiece Secrets model","properties":{"OPENAI_API_KEY":{"description":"Your OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/TextSummarizerPiece","repository_id":177},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"id":488,"name":"EmailSenderPiece","description":"Email sender","dependency":{"dockerfile":null,"requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group0","input_schema":{"$defs":{"InnerArgModel":{"description":"Inner argument model to use in the body and subject texts","properties":{"arg_name":{"title":"Arg Name","type":"string"},"arg_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}],"title":"Arg Value"}},"required":["arg_name","arg_value"],"title":"InnerArgModel","type":"object"},"ProviderType":{"enum":["gmail","outlook","office365","yahoo"],"title":"ProviderType","type":"string"}},"description":"Input data for EmailSenderPiece","properties":{"email_provider":{"allOf":[{"$ref":"#/$defs/ProviderType"}],"default":"gmail","description":"The email provider to use"},"email_receivers":{"description":"The receivers of the email, as comma-separated values","title":"Email Receivers","type":"string"},"email_subject":{"description":"The subject of the email.","title":"Email Subject","type":"string"},"subject_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the subject of the email","title":"Subject Args"},"email_body":{"description":"The body of the email.","title":"Email Body","type":"string"},"body_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the body of the email","title":"Body Args"},"attachment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to the attachment file","title":"Attachment Path"}},"required":["email_receivers","email_subject","email_body"],"title":"EmailSenderPiece","type":"object"},"output_schema":{"description":"Output data for EmailSenderPiece","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"success":{"description":"The result of the email sending task.","title":"Success","type":"boolean"},"error":{"default":"","description":"The error message, if any.","title":"Error","type":"string"}},"required":["success"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for EmailSenderPiece","properties":{"EMAIL_SENDER_ACCOUNT":{"description":"The email sender account.","title":"Email Sender Account","type":"string"},"EMAIL_SENDER_PASSWORD":{"description":"The email sender password","title":"Email Sender Password","type":"string"}},"required":["EMAIL_SENDER_ACCOUNT","EMAIL_SENDER_PASSWORD"],"title":"SecretsModel","type":"object"},"style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/EmailSenderPiece","repository_id":179}},"workflowPiecesData":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"channel_username":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"bbcnews"},"max_videos":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"published_at_or_after":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"2023-11-01"},"published_at_or_before":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"order_by":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"date"},"video_duration":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"any"},"return_only_urls":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"469_9d388791-b669-41b0-8983-36923286e964":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_array":{"fromUpstream":true,"upstreamId":"YoutubeLis_0f4005cdd6c549ac8111f019bafb2250","upstreamArgument":"videos_list","upstreamValue":"YoutubeListVideosPiece (0f4005cd) - Videos List","value":""},"index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"first"},"another_index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1}}},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":true,"upstreamId":"GetItemFro_9d388791b66941b0898336923286e964","upstreamArgument":"output_value","upstreamValue":"GetItemFromArrayPiece (9d388791) - Output Value","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"audio"}}},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"audio_file_path":{"fromUpstream":true,"upstreamId":"YoutubeDow_fa2a889d92994b63a0cde051b66d12aa","upstreamArgument":"file_path","upstreamValue":"YoutubeDownloadPiece (fa2a889d) - File Path","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"file"},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.1}}},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"text":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"text_file_path":{"fromUpstream":true,"upstreamId":"AudioTrans_f7912cd832ef41668b1ed07190e5c52a","upstreamArgument":"file_path_transcription_result","upstreamValue":"AudioTranscriptionPiece (f7912cd8) - File Path Transcription Result","value":null},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"string"},"openai_model":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gpt-3.5-turbo"},"chunk_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1000},"chunk_overlap_rate":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2},"completion_max_tokens":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":500},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2}}},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"email_provider":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gmail"},"email_receivers":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":""},"email_subject":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"Summary"},"subject_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"email_body":{"fromUpstream":true,"upstreamId":"TextSummar_34d5b73b34f846d5a08a24008c814b34","upstreamArgument":"string_summarized_text","upstreamValue":"TextSummarizerPiece (34d5b73b) - String Summarized Text","value":""},"body_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"attachment_path":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}}},"workflowNodes":[{"id":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","type":"CustomNode","position":{"x":188,"y":195.5},"data":{"name":"YoutubeListVideosPiece","style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":188,"y":195.5},"dragging":false},{"id":"469_9d388791-b669-41b0-8983-36923286e964","type":"CustomNode","position":{"x":427,"y":213.5},"data":{"name":"GetItemFromArrayPiece","style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":427,"y":213.5},"dragging":false},{"id":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","type":"CustomNode","position":{"x":688,"y":241.5},"data":{"name":"YoutubeDownloadPiece","style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":688,"y":241.5},"dragging":false},{"id":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","type":"CustomNode","position":{"x":932,"y":276.5},"data":{"name":"AudioTranscriptionPiece","style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":932,"y":276.5},"dragging":false},{"id":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","type":"CustomNode","position":{"x":1165,"y":289.5},"data":{"name":"TextSummarizerPiece","style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1165,"y":289.5},"dragging":false},{"id":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","type":"CustomNode","position":{"x":1446,"y":364.5},"data":{"name":"EmailSenderPiece","style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false}],"workflowEdges":[{"source":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","sourceHandle":"source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250","target":"469_9d388791-b669-41b0-8983-36923286e964","targetHandle":"target-469_9d388791-b669-41b0-8983-36923286e964","id":"reactflow__edge-494_0f4005cd-d6c5-49ac-8111-f019bafb2250source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250-469_9d388791-b669-41b0-8983-36923286e964target-469_9d388791-b669-41b0-8983-36923286e964"},{"source":"469_9d388791-b669-41b0-8983-36923286e964","sourceHandle":"source-469_9d388791-b669-41b0-8983-36923286e964","target":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","targetHandle":"target-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","id":"reactflow__edge-469_9d388791-b669-41b0-8983-36923286e964source-469_9d388791-b669-41b0-8983-36923286e964-493_fa2a889d-9299-4b63-a0cd-e051b66d12aatarget-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa"},{"source":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","sourceHandle":"source-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","target":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","targetHandle":"target-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","id":"reactflow__edge-493_fa2a889d-9299-4b63-a0cd-e051b66d12aasource-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa-475_f7912cd8-32ef-4166-8b1e-d07190e5c52atarget-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a"},{"source":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","sourceHandle":"source-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","target":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","targetHandle":"target-480_34d5b73b-34f8-46d5-a08a-24008c814b34","id":"reactflow__edge-475_f7912cd8-32ef-4166-8b1e-d07190e5c52asource-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a-480_34d5b73b-34f8-46d5-a08a-24008c814b34target-480_34d5b73b-34f8-46d5-a08a-24008c814b34"},{"source":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","sourceHandle":"source-480_34d5b73b-34f8-46d5-a08a-24008c814b34","target":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","targetHandle":"target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","id":"reactflow__edge-480_34d5b73b-34f8-46d5-a08a-24008c814b34source-480_34d5b73b-34f8-46d5-a08a-24008c814b34-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99"}]} \ No newline at end of file +{"workflowPieces":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"id":494,"name":"YoutubeListVideosPiece","description":"List videos from youtube channel.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OrderBy":{"description":"The order in which the videos are returned.","enum":["date","rating","relevance","title","viewCount"],"title":"OrderBy","type":"string"},"VideoDuration":{"description":"The duration of the video.","enum":["any","long","medium","short"],"title":"VideoDuration","type":"string"}},"description":"Input data for YoutubeListVideosPiece","properties":{"channel_username":{"default":null,"description":"The username of the Youtube channel.","title":"Channel Username","type":"string"},"max_videos":{"default":10,"description":"The maximum number of videos to be returned","exclusiveMinimum":0,"title":"Max Videos","type":"integer"},"published_at_or_after":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created at or after the specified date","title":"Published At Or After"},"published_at_or_before":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created before or at the specified date","title":"Published At Or Before"},"order_by":{"allOf":[{"$ref":"#/$defs/OrderBy"}],"default":"date","description":"The order in which the videos are returned","title":"Order By"},"video_duration":{"allOf":[{"$ref":"#/$defs/VideoDuration"}],"default":"any","description":"The duration of the video","title":"Video Duration"},"return_only_urls":{"default":false,"description":"If True, only the urls of the videos will be returned","title":"Return only urls","type":"boolean"}},"title":"YoutubeListVideosPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeListVideosPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"videos_list":{"description":"A list containing information about videos.","items":{},"title":"Videos List","type":"array"}},"required":["videos_list"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for YoutubeListVideosPiece","properties":{"YOUTUBE_API_KEY":{"default":null,"description":"The Youtube Data API Key.","title":"Youtube Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeListVideosPiece","repository_id":179},"469_9d388791-b669-41b0-8983-36923286e964":{"id":469,"name":"GetItemFromArrayPiece","description":"Get one item from an array","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"IndexType":{"enum":["first","last","random","another"],"title":"IndexType","type":"string"}},"description":"GetItemFromArrayPiece Input Model","properties":{"input_array":{"description":"Input array to get item from.","from_upstream":"always","items":{},"title":"Input Array","type":"array"},"index":{"allOf":[{"$ref":"#/$defs/IndexType"}],"default":"first","description":"Index of item to get from input array."},"another_index":{"default":1,"description":"Index number of item to get from input array.","minimum":1,"title":"Another Index","type":"integer"}},"required":["input_array"],"title":"GetItemFromArrayPiece","type":"object"},"output_schema":{"description":"GetItemFromArrayPiece Output Model","properties":{"output_value":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"object"},{"format":"date","type":"string"},{"format":"time","type":"string"},{"format":"date-time","type":"string"}],"description":"Item from input array at specified index.","title":"Output Value"}},"required":["output_value"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetItemFromArrayPiece","repository_id":176},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"id":493,"name":"YoutubeDownloadPiece","description":"Downloads content from youtube videos as audio or video files.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OutputTypeType":{"enum":["audio","video"],"title":"OutputTypeType","type":"string"}},"description":"Input data for YoutubeDownloadPiece","properties":{"url":{"description":"The url of the video to be downloaded.","title":"Url","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"audio","description":"The type of output file to be downloaded."}},"required":["url"],"title":"YoutubeDownloadPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeDownloadPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"file_path":{"description":"The path to the downloaded file","title":"File Path","type":"string"}},"required":["file_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeDownloadPiece","repository_id":179},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"id":475,"name":"AudioTranscriptionPiece","description":"This Piece uses the OpenAI API to extract text transcripts from audio.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"AudioTranscriptPiece input model","properties":{"audio_file_path":{"description":"The path to the audio file to process.","title":"Audio File Path","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output for the result text"},"temperature":{"default":0.1,"description":"What sampling temperature to use, between 0 and 1","exclusiveMinimum":0,"maximum":1,"title":"Temperature","type":"number"}},"required":["audio_file_path"],"title":"AudioTranscriptionPiece","type":"object"},"output_schema":{"description":"AudioTranscriptPiece output model","properties":{"message":{"description":"Output message to log","title":"Message","type":"string"},"string_transcription_result":{"default":null,"description":"The result transcription text as a string.","title":"String Transcription Result","type":"string"},"file_path_transcription_result":{"default":null,"description":"The result transcription text as a file path.","title":"File Path Transcription Result","type":"string"}},"required":["message"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"AudioTranscriptPiece secret model","properties":{"OPENAI_API_KEY":{"description":"OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/AudioTranscriptionPiece","repository_id":177},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"id":480,"name":"TextSummarizerPiece","description":"This Piece runs a text summarizer using OpenAI API.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"LLMModelType":{"description":"OpenAI model type","enum":["gpt-3.5-turbo","gpt-4"],"title":"LLMModelType","type":"string"},"OutputTypeType":{"description":"Output type for the completion result","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"TextSummarizerPiece Input model","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text to summarize","required":false,"title":"Text"},"text_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Use it only if not using text field. File path to the text to summarize","required":false,"title":"Text File Path"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output to return"},"openai_model":{"allOf":[{"$ref":"#/$defs/LLMModelType"}],"default":"gpt-3.5-turbo","description":"OpenAI model name to use for summarization"},"chunk_size":{"default":1000,"description":"Chunk size, measured in tokens, of each pre-summary chunk","title":"Chunk Size","type":"integer"},"chunk_overlap_rate":{"default":0.2,"description":"The percentage of overlap between each chunk","title":"Chunk Overlap Rate","type":"number"},"completion_max_tokens":{"default":500,"description":"The maximum number of tokens to generate in the summary.","title":"Completion Max Tokens","type":"integer"},"temperature":{"default":0.2,"description":"Temperature of the model, between 0 (more precise) and 1 (more creative)","title":"Temperature","type":"number"}},"title":"TextSummarizerPiece","type":"object"},"output_schema":{"description":"TextSummarizerPiece Output model","properties":{"string_summarized_text":{"default":null,"description":"summarized text","title":"String Summarized Text","type":"string"},"file_path_summarized_text":{"default":null,"description":"Path to summarized text file","title":"File Path Summarized Text","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"description":"TextSummarizerPiece Secrets model","properties":{"OPENAI_API_KEY":{"description":"Your OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/TextSummarizerPiece","repository_id":177},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"id":488,"name":"EmailSenderPiece","description":"Email sender","dependency":{"dockerfile":null,"requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group0","input_schema":{"$defs":{"InnerArgModel":{"description":"Inner argument model to use in the body and subject texts","properties":{"arg_name":{"title":"Arg Name","type":"string"},"arg_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}],"title":"Arg Value"}},"required":["arg_name","arg_value"],"title":"InnerArgModel","type":"object"},"ProviderType":{"enum":["gmail","outlook","office365","yahoo"],"title":"ProviderType","type":"string"}},"description":"Input data for EmailSenderPiece","properties":{"email_provider":{"allOf":[{"$ref":"#/$defs/ProviderType"}],"default":"gmail","description":"The email provider to use"},"email_receivers":{"description":"The receivers of the email, as comma-separated values","title":"Email Receivers","type":"string"},"email_subject":{"description":"The subject of the email.","title":"Email Subject","type":"string"},"subject_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the subject of the email","title":"Subject Args"},"email_body":{"description":"The body of the email.","title":"Email Body","type":"string"},"body_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the body of the email","title":"Body Args"},"attachment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to the attachment file","title":"Attachment Path"}},"required":["email_receivers","email_subject","email_body"],"title":"EmailSenderPiece","type":"object"},"output_schema":{"description":"Output data for EmailSenderPiece","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"success":{"description":"The result of the email sending task.","title":"Success","type":"boolean"},"error":{"default":"","description":"The error message, if any.","title":"Error","type":"string"}},"required":["success"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for EmailSenderPiece","properties":{"EMAIL_SENDER_ACCOUNT":{"description":"The email sender account.","title":"Email Sender Account","type":"string"},"EMAIL_SENDER_PASSWORD":{"description":"The email sender password","title":"Email Sender Password","type":"string"}},"required":["EMAIL_SENDER_ACCOUNT","EMAIL_SENDER_PASSWORD"],"title":"SecretsModel","type":"object"},"style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/EmailSenderPiece","repository_id":179}},"workflowPiecesData":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"channel_username":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"bbcnews"},"max_videos":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"published_at_or_after":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"2023-11-01"},"published_at_or_before":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"order_by":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"date"},"video_duration":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"any"},"return_only_urls":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"469_9d388791-b669-41b0-8983-36923286e964":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_array":{"fromUpstream":true,"upstreamId":"YoutubeLis_0f4005cdd6c549ac8111f019bafb2250","upstreamArgument":"videos_list","upstreamValue":"YoutubeListVideosPiece (0f4005cd) - Videos List","value":""},"index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"first"},"another_index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1}}},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":true,"upstreamId":"GetItemFro_9d388791b66941b0898336923286e964","upstreamArgument":"output_value","upstreamValue":"GetItemFromArrayPiece (9d388791) - Output Value","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"audio"}}},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"audio_file_path":{"fromUpstream":true,"upstreamId":"YoutubeDow_fa2a889d92994b63a0cde051b66d12aa","upstreamArgument":"file_path","upstreamValue":"YoutubeDownloadPiece (fa2a889d) - File Path","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"file"},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.1}}},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"text":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"text_file_path":{"fromUpstream":true,"upstreamId":"AudioTrans_f7912cd832ef41668b1ed07190e5c52a","upstreamArgument":"file_path_transcription_result","upstreamValue":"AudioTranscriptionPiece (f7912cd8) - File Path Transcription Result","value":null},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"string"},"openai_model":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gpt-3.5-turbo"},"chunk_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1000},"chunk_overlap_rate":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2},"completion_max_tokens":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":500},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2}}},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"email_provider":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gmail"},"email_receivers":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":""},"email_subject":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"Summary"},"subject_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"email_body":{"fromUpstream":true,"upstreamId":"TextSummar_34d5b73b34f846d5a08a24008c814b34","upstreamArgument":"string_summarized_text","upstreamValue":"TextSummarizerPiece (34d5b73b) - String Summarized Text","value":""},"body_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"attachment_path":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}}},"workflowNodes":[{"id":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","type":"CustomNode","position":{"x":188,"y":195.5},"data":{"name":"YoutubeListVideosPiece","style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":188,"y":195.5},"dragging":false},{"id":"469_9d388791-b669-41b0-8983-36923286e964","type":"CustomNode","position":{"x":427,"y":213.5},"data":{"name":"GetItemFromArrayPiece","style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":427,"y":213.5},"dragging":false},{"id":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","type":"CustomNode","position":{"x":688,"y":241.5},"data":{"name":"YoutubeDownloadPiece","style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":688,"y":241.5},"dragging":false},{"id":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","type":"CustomNode","position":{"x":932,"y":276.5},"data":{"name":"AudioTranscriptionPiece","style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":932,"y":276.5},"dragging":false},{"id":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","type":"CustomNode","position":{"x":1165,"y":289.5},"data":{"name":"TextSummarizerPiece","style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1165,"y":289.5},"dragging":false},{"id":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","type":"CustomNode","position":{"x":1446,"y":364.5},"data":{"name":"EmailSenderPiece","style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false}],"workflowEdges":[{"source":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","sourceHandle":"source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250","target":"469_9d388791-b669-41b0-8983-36923286e964","targetHandle":"target-469_9d388791-b669-41b0-8983-36923286e964","id":"reactflow__edge-494_0f4005cd-d6c5-49ac-8111-f019bafb2250source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250-469_9d388791-b669-41b0-8983-36923286e964target-469_9d388791-b669-41b0-8983-36923286e964"},{"source":"469_9d388791-b669-41b0-8983-36923286e964","sourceHandle":"source-469_9d388791-b669-41b0-8983-36923286e964","target":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","targetHandle":"target-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","id":"reactflow__edge-469_9d388791-b669-41b0-8983-36923286e964source-469_9d388791-b669-41b0-8983-36923286e964-493_fa2a889d-9299-4b63-a0cd-e051b66d12aatarget-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa"},{"source":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","sourceHandle":"source-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","target":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","targetHandle":"target-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","id":"reactflow__edge-493_fa2a889d-9299-4b63-a0cd-e051b66d12aasource-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa-475_f7912cd8-32ef-4166-8b1e-d07190e5c52atarget-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a"},{"source":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","sourceHandle":"source-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","target":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","targetHandle":"target-480_34d5b73b-34f8-46d5-a08a-24008c814b34","id":"reactflow__edge-475_f7912cd8-32ef-4166-8b1e-d07190e5c52asource-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a-480_34d5b73b-34f8-46d5-a08a-24008c814b34target-480_34d5b73b-34f8-46d5-a08a-24008c814b34"},{"source":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","sourceHandle":"source-480_34d5b73b-34f8-46d5-a08a-24008c814b34","target":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","targetHandle":"target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","id":"reactflow__edge-480_34d5b73b-34f8-46d5-a08a-24008c814b34source-480_34d5b73b-34f8-46d5-a08a-24008c814b34-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99"}]} diff --git a/rest/schemas/responses/piece.py b/rest/schemas/responses/piece.py index 88f81cda..e70ea934 100644 --- a/rest/schemas/responses/piece.py +++ b/rest/schemas/responses/piece.py @@ -13,4 +13,5 @@ class GetPiecesResponse(BaseModel): secrets_schema: Optional[Dict] = None style: Optional[Dict] = None source_url: Optional[str] = None + repository_url: str repository_id: int \ No newline at end of file diff --git a/rest/services/piece_service.py b/rest/services/piece_service.py index 56970e0d..1b5feb70 100644 --- a/rest/services/piece_service.py +++ b/rest/services/piece_service.py @@ -55,10 +55,10 @@ def list_pieces( repository_id=piece_repository_id, page=page, page_size=page_size, - filters=filters.dict(exclude_none=True), + filters=filters.model_dump(exclude_none=True), ) return [ - GetPiecesResponse(**piece.to_dict()) for piece in pieces + GetPiecesResponse(**piece.to_dict(),repository_url=piece_repository.url) for piece in pieces ] diff --git a/src/domino/custom_operators/docker_operator.py b/src/domino/custom_operators/docker_operator.py index cfcb8bdb..b7d0bca4 100644 --- a/src/domino/custom_operators/docker_operator.py +++ b/src/domino/custom_operators/docker_operator.py @@ -55,16 +55,16 @@ def __init__( mounts = [] # TODO remove - used in DEV only ####################### - dev_pieces = False + dev_pieces = TRUE if dev_pieces: piece_repo_name = repository_url.split("/")[-1] - local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" - # local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" + # local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" + local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" mounts = [ # TODO remove - # Mount(source='/home/vinicius/Documents/work/tauffer/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), + Mount(source='/Users/nathan/Developer/Tauffer-Consulting/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), Mount(source='/mnt/shared_storage/Github/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), - Mount(source=local_repos_path, target='/home/domino/pieces_repository/', type='bind', read_only=True), + # Mount(source=local_repos_path, target='/home/domino/pieces_repository/', type='bind', read_only=True), ] ######################################################## From 3b1a9d2d0e1ddeb27de749305e53c0d18c02e48c Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Thu, 23 Nov 2023 18:46:52 -0300 Subject: [PATCH 57/72] feat add loading on install repositores modal --- .../components/DifferencesModal/index.tsx | 17 ++++++++++++++--- .../utils/workflows/youtube_summarizer.json | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx index af5b57e0..48db65a7 100644 --- a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx @@ -1,6 +1,7 @@ import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; import { Button, + CircularProgress, Grid, List, ListItem, @@ -12,7 +13,7 @@ import { import { Modal, type ModalRef } from "components/Modal"; import { useWorkspaces, usesPieces } from "context/workspaces"; import { type Differences } from "features/workflowEditor/utils/importWorkflow"; -import React, { forwardRef, useCallback, useMemo } from "react"; +import React, { forwardRef, useCallback, useMemo, useState } from "react"; import { Link } from "react-router-dom"; interface Props { @@ -23,6 +24,7 @@ export const DifferencesModal = forwardRef( ({ incompatiblesPieces }, ref) => { const { workspace } = useWorkspaces(); const { handleAddRepository } = usesPieces(); + const [buttonState, setButtonState] = useState<0 | 1 | 2>(0); const { installedPieces, uninstalledPieces } = useMemo(() => { return { @@ -53,7 +55,13 @@ export const DifferencesModal = forwardRef( ); const handleInstallMissingRepositories = useCallback(async () => { - await Promise.allSettled(uninstalledPieces.map(installRepositories)); + await Promise.allSettled(uninstalledPieces.map(installRepositories)) + .then(() => { + setButtonState(2); + }) + .catch(() => { + setButtonState(0); + }); }, [installRepositories, uninstalledPieces]); return ( @@ -131,8 +139,11 @@ export const DifferencesModal = forwardRef( diff --git a/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json b/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json index 9260c95f..bd798893 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json +++ b/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json @@ -1 +1 @@ -{"workflowPieces":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"id":494,"name":"YoutubeListVideosPiece","description":"List videos from youtube channel.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OrderBy":{"description":"The order in which the videos are returned.","enum":["date","rating","relevance","title","viewCount"],"title":"OrderBy","type":"string"},"VideoDuration":{"description":"The duration of the video.","enum":["any","long","medium","short"],"title":"VideoDuration","type":"string"}},"description":"Input data for YoutubeListVideosPiece","properties":{"channel_username":{"default":null,"description":"The username of the Youtube channel.","title":"Channel Username","type":"string"},"max_videos":{"default":10,"description":"The maximum number of videos to be returned","exclusiveMinimum":0,"title":"Max Videos","type":"integer"},"published_at_or_after":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created at or after the specified date","title":"Published At Or After"},"published_at_or_before":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created before or at the specified date","title":"Published At Or Before"},"order_by":{"allOf":[{"$ref":"#/$defs/OrderBy"}],"default":"date","description":"The order in which the videos are returned","title":"Order By"},"video_duration":{"allOf":[{"$ref":"#/$defs/VideoDuration"}],"default":"any","description":"The duration of the video","title":"Video Duration"},"return_only_urls":{"default":false,"description":"If True, only the urls of the videos will be returned","title":"Return only urls","type":"boolean"}},"title":"YoutubeListVideosPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeListVideosPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"videos_list":{"description":"A list containing information about videos.","items":{},"title":"Videos List","type":"array"}},"required":["videos_list"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for YoutubeListVideosPiece","properties":{"YOUTUBE_API_KEY":{"default":null,"description":"The Youtube Data API Key.","title":"Youtube Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeListVideosPiece","repository_id":179},"469_9d388791-b669-41b0-8983-36923286e964":{"id":469,"name":"GetItemFromArrayPiece","description":"Get one item from an array","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"IndexType":{"enum":["first","last","random","another"],"title":"IndexType","type":"string"}},"description":"GetItemFromArrayPiece Input Model","properties":{"input_array":{"description":"Input array to get item from.","from_upstream":"always","items":{},"title":"Input Array","type":"array"},"index":{"allOf":[{"$ref":"#/$defs/IndexType"}],"default":"first","description":"Index of item to get from input array."},"another_index":{"default":1,"description":"Index number of item to get from input array.","minimum":1,"title":"Another Index","type":"integer"}},"required":["input_array"],"title":"GetItemFromArrayPiece","type":"object"},"output_schema":{"description":"GetItemFromArrayPiece Output Model","properties":{"output_value":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"object"},{"format":"date","type":"string"},{"format":"time","type":"string"},{"format":"date-time","type":"string"}],"description":"Item from input array at specified index.","title":"Output Value"}},"required":["output_value"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetItemFromArrayPiece","repository_id":176},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"id":493,"name":"YoutubeDownloadPiece","description":"Downloads content from youtube videos as audio or video files.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OutputTypeType":{"enum":["audio","video"],"title":"OutputTypeType","type":"string"}},"description":"Input data for YoutubeDownloadPiece","properties":{"url":{"description":"The url of the video to be downloaded.","title":"Url","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"audio","description":"The type of output file to be downloaded."}},"required":["url"],"title":"YoutubeDownloadPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeDownloadPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"file_path":{"description":"The path to the downloaded file","title":"File Path","type":"string"}},"required":["file_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeDownloadPiece","repository_id":179},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"id":475,"name":"AudioTranscriptionPiece","description":"This Piece uses the OpenAI API to extract text transcripts from audio.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"AudioTranscriptPiece input model","properties":{"audio_file_path":{"description":"The path to the audio file to process.","title":"Audio File Path","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output for the result text"},"temperature":{"default":0.1,"description":"What sampling temperature to use, between 0 and 1","exclusiveMinimum":0,"maximum":1,"title":"Temperature","type":"number"}},"required":["audio_file_path"],"title":"AudioTranscriptionPiece","type":"object"},"output_schema":{"description":"AudioTranscriptPiece output model","properties":{"message":{"description":"Output message to log","title":"Message","type":"string"},"string_transcription_result":{"default":null,"description":"The result transcription text as a string.","title":"String Transcription Result","type":"string"},"file_path_transcription_result":{"default":null,"description":"The result transcription text as a file path.","title":"File Path Transcription Result","type":"string"}},"required":["message"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"AudioTranscriptPiece secret model","properties":{"OPENAI_API_KEY":{"description":"OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/AudioTranscriptionPiece","repository_id":177},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"id":480,"name":"TextSummarizerPiece","description":"This Piece runs a text summarizer using OpenAI API.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"LLMModelType":{"description":"OpenAI model type","enum":["gpt-3.5-turbo","gpt-4"],"title":"LLMModelType","type":"string"},"OutputTypeType":{"description":"Output type for the completion result","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"TextSummarizerPiece Input model","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text to summarize","required":false,"title":"Text"},"text_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Use it only if not using text field. File path to the text to summarize","required":false,"title":"Text File Path"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output to return"},"openai_model":{"allOf":[{"$ref":"#/$defs/LLMModelType"}],"default":"gpt-3.5-turbo","description":"OpenAI model name to use for summarization"},"chunk_size":{"default":1000,"description":"Chunk size, measured in tokens, of each pre-summary chunk","title":"Chunk Size","type":"integer"},"chunk_overlap_rate":{"default":0.2,"description":"The percentage of overlap between each chunk","title":"Chunk Overlap Rate","type":"number"},"completion_max_tokens":{"default":500,"description":"The maximum number of tokens to generate in the summary.","title":"Completion Max Tokens","type":"integer"},"temperature":{"default":0.2,"description":"Temperature of the model, between 0 (more precise) and 1 (more creative)","title":"Temperature","type":"number"}},"title":"TextSummarizerPiece","type":"object"},"output_schema":{"description":"TextSummarizerPiece Output model","properties":{"string_summarized_text":{"default":null,"description":"summarized text","title":"String Summarized Text","type":"string"},"file_path_summarized_text":{"default":null,"description":"Path to summarized text file","title":"File Path Summarized Text","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"description":"TextSummarizerPiece Secrets model","properties":{"OPENAI_API_KEY":{"description":"Your OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/TextSummarizerPiece","repository_id":177},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"id":488,"name":"EmailSenderPiece","description":"Email sender","dependency":{"dockerfile":null,"requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group0","input_schema":{"$defs":{"InnerArgModel":{"description":"Inner argument model to use in the body and subject texts","properties":{"arg_name":{"title":"Arg Name","type":"string"},"arg_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}],"title":"Arg Value"}},"required":["arg_name","arg_value"],"title":"InnerArgModel","type":"object"},"ProviderType":{"enum":["gmail","outlook","office365","yahoo"],"title":"ProviderType","type":"string"}},"description":"Input data for EmailSenderPiece","properties":{"email_provider":{"allOf":[{"$ref":"#/$defs/ProviderType"}],"default":"gmail","description":"The email provider to use"},"email_receivers":{"description":"The receivers of the email, as comma-separated values","title":"Email Receivers","type":"string"},"email_subject":{"description":"The subject of the email.","title":"Email Subject","type":"string"},"subject_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the subject of the email","title":"Subject Args"},"email_body":{"description":"The body of the email.","title":"Email Body","type":"string"},"body_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the body of the email","title":"Body Args"},"attachment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to the attachment file","title":"Attachment Path"}},"required":["email_receivers","email_subject","email_body"],"title":"EmailSenderPiece","type":"object"},"output_schema":{"description":"Output data for EmailSenderPiece","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"success":{"description":"The result of the email sending task.","title":"Success","type":"boolean"},"error":{"default":"","description":"The error message, if any.","title":"Error","type":"string"}},"required":["success"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for EmailSenderPiece","properties":{"EMAIL_SENDER_ACCOUNT":{"description":"The email sender account.","title":"Email Sender Account","type":"string"},"EMAIL_SENDER_PASSWORD":{"description":"The email sender password","title":"Email Sender Password","type":"string"}},"required":["EMAIL_SENDER_ACCOUNT","EMAIL_SENDER_PASSWORD"],"title":"SecretsModel","type":"object"},"style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/EmailSenderPiece","repository_id":179}},"workflowPiecesData":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"channel_username":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"bbcnews"},"max_videos":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"published_at_or_after":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"2023-11-01"},"published_at_or_before":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"order_by":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"date"},"video_duration":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"any"},"return_only_urls":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"469_9d388791-b669-41b0-8983-36923286e964":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_array":{"fromUpstream":true,"upstreamId":"YoutubeLis_0f4005cdd6c549ac8111f019bafb2250","upstreamArgument":"videos_list","upstreamValue":"YoutubeListVideosPiece (0f4005cd) - Videos List","value":""},"index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"first"},"another_index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1}}},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":true,"upstreamId":"GetItemFro_9d388791b66941b0898336923286e964","upstreamArgument":"output_value","upstreamValue":"GetItemFromArrayPiece (9d388791) - Output Value","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"audio"}}},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"audio_file_path":{"fromUpstream":true,"upstreamId":"YoutubeDow_fa2a889d92994b63a0cde051b66d12aa","upstreamArgument":"file_path","upstreamValue":"YoutubeDownloadPiece (fa2a889d) - File Path","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"file"},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.1}}},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"text":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"text_file_path":{"fromUpstream":true,"upstreamId":"AudioTrans_f7912cd832ef41668b1ed07190e5c52a","upstreamArgument":"file_path_transcription_result","upstreamValue":"AudioTranscriptionPiece (f7912cd8) - File Path Transcription Result","value":null},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"string"},"openai_model":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gpt-3.5-turbo"},"chunk_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1000},"chunk_overlap_rate":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2},"completion_max_tokens":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":500},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2}}},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"email_provider":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gmail"},"email_receivers":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":""},"email_subject":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"Summary"},"subject_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"email_body":{"fromUpstream":true,"upstreamId":"TextSummar_34d5b73b34f846d5a08a24008c814b34","upstreamArgument":"string_summarized_text","upstreamValue":"TextSummarizerPiece (34d5b73b) - String Summarized Text","value":""},"body_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"attachment_path":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}}},"workflowNodes":[{"id":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","type":"CustomNode","position":{"x":188,"y":195.5},"data":{"name":"YoutubeListVideosPiece","style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":188,"y":195.5},"dragging":false},{"id":"469_9d388791-b669-41b0-8983-36923286e964","type":"CustomNode","position":{"x":427,"y":213.5},"data":{"name":"GetItemFromArrayPiece","style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":427,"y":213.5},"dragging":false},{"id":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","type":"CustomNode","position":{"x":688,"y":241.5},"data":{"name":"YoutubeDownloadPiece","style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":688,"y":241.5},"dragging":false},{"id":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","type":"CustomNode","position":{"x":932,"y":276.5},"data":{"name":"AudioTranscriptionPiece","style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":932,"y":276.5},"dragging":false},{"id":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","type":"CustomNode","position":{"x":1165,"y":289.5},"data":{"name":"TextSummarizerPiece","style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1165,"y":289.5},"dragging":false},{"id":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","type":"CustomNode","position":{"x":1446,"y":364.5},"data":{"name":"EmailSenderPiece","style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false}],"workflowEdges":[{"source":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","sourceHandle":"source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250","target":"469_9d388791-b669-41b0-8983-36923286e964","targetHandle":"target-469_9d388791-b669-41b0-8983-36923286e964","id":"reactflow__edge-494_0f4005cd-d6c5-49ac-8111-f019bafb2250source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250-469_9d388791-b669-41b0-8983-36923286e964target-469_9d388791-b669-41b0-8983-36923286e964"},{"source":"469_9d388791-b669-41b0-8983-36923286e964","sourceHandle":"source-469_9d388791-b669-41b0-8983-36923286e964","target":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","targetHandle":"target-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","id":"reactflow__edge-469_9d388791-b669-41b0-8983-36923286e964source-469_9d388791-b669-41b0-8983-36923286e964-493_fa2a889d-9299-4b63-a0cd-e051b66d12aatarget-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa"},{"source":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","sourceHandle":"source-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","target":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","targetHandle":"target-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","id":"reactflow__edge-493_fa2a889d-9299-4b63-a0cd-e051b66d12aasource-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa-475_f7912cd8-32ef-4166-8b1e-d07190e5c52atarget-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a"},{"source":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","sourceHandle":"source-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","target":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","targetHandle":"target-480_34d5b73b-34f8-46d5-a08a-24008c814b34","id":"reactflow__edge-475_f7912cd8-32ef-4166-8b1e-d07190e5c52asource-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a-480_34d5b73b-34f8-46d5-a08a-24008c814b34target-480_34d5b73b-34f8-46d5-a08a-24008c814b34"},{"source":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","sourceHandle":"source-480_34d5b73b-34f8-46d5-a08a-24008c814b34","target":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","targetHandle":"target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","id":"reactflow__edge-480_34d5b73b-34f8-46d5-a08a-24008c814b34source-480_34d5b73b-34f8-46d5-a08a-24008c814b34-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99"}]} +{"workflowPieces":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"id":494,"name":"YoutubeListVideosPiece","description":"List videos from youtube channel.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OrderBy":{"description":"The order in which the videos are returned.","enum":["date","rating","relevance","title","viewCount"],"title":"OrderBy","type":"string"},"VideoDuration":{"description":"The duration of the video.","enum":["any","long","medium","short"],"title":"VideoDuration","type":"string"}},"description":"Input data for YoutubeListVideosPiece","properties":{"channel_username":{"default":null,"description":"The username of the Youtube channel.","title":"Channel Username","type":"string"},"max_videos":{"default":10,"description":"The maximum number of videos to be returned","exclusiveMinimum":0,"title":"Max Videos","type":"integer"},"published_at_or_after":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created at or after the specified date","title":"Published At Or After"},"published_at_or_before":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created before or at the specified date","title":"Published At Or Before"},"order_by":{"allOf":[{"$ref":"#/$defs/OrderBy"}],"default":"date","description":"The order in which the videos are returned","title":"Order By"},"video_duration":{"allOf":[{"$ref":"#/$defs/VideoDuration"}],"default":"any","description":"The duration of the video","title":"Video Duration"},"return_only_urls":{"default":false,"description":"If True, only the urls of the videos will be returned","title":"Return only urls","type":"boolean"}},"title":"YoutubeListVideosPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeListVideosPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"videos_list":{"description":"A list containing information about videos.","items":{},"title":"Videos List","type":"array"}},"required":["videos_list"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for YoutubeListVideosPiece","properties":{"YOUTUBE_API_KEY":{"default":null,"description":"The Youtube Data API Key.","title":"Youtube Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeListVideosPiece","repository_id":179},"469_9d388791-b669-41b0-8983-36923286e964":{"id":469,"name":"GetItemFromArrayPiece","description":"Get one item from an array","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"IndexType":{"enum":["first","last","random","another"],"title":"IndexType","type":"string"}},"description":"GetItemFromArrayPiece Input Model","properties":{"input_array":{"description":"Input array to get item from.","from_upstream":"always","items":{},"title":"Input Array","type":"array"},"index":{"allOf":[{"$ref":"#/$defs/IndexType"}],"default":"first","description":"Index of item to get from input array."},"another_index":{"default":1,"description":"Index number of item to get from input array.","minimum":1,"title":"Another Index","type":"integer"}},"required":["input_array"],"title":"GetItemFromArrayPiece","type":"object"},"output_schema":{"description":"GetItemFromArrayPiece Output Model","properties":{"output_value":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"object"},{"format":"date","type":"string"},{"format":"time","type":"string"},{"format":"date-time","type":"string"}],"description":"Item from input array at specified index.","title":"Output Value"}},"required":["output_value"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetItemFromArrayPiece","repository_id":176},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"id":493,"name":"YoutubeDownloadPiece","description":"Downloads content from youtube videos as audio or video files.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OutputTypeType":{"enum":["audio","video"],"title":"OutputTypeType","type":"string"}},"description":"Input data for YoutubeDownloadPiece","properties":{"url":{"description":"The url of the video to be downloaded.","title":"Url","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"audio","description":"The type of output file to be downloaded."}},"required":["url"],"title":"YoutubeDownloadPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeDownloadPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"file_path":{"description":"The path to the downloaded file","title":"File Path","type":"string"}},"required":["file_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeDownloadPiece","repository_id":179},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"id":475,"name":"AudioTranscriptionPiece","description":"This Piece uses the OpenAI API to extract text transcripts from audio.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"AudioTranscriptPiece input model","properties":{"audio_file_path":{"description":"The path to the audio file to process.","title":"Audio File Path","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output for the result text"},"temperature":{"default":0.1,"description":"What sampling temperature to use, between 0 and 1","exclusiveMinimum":0,"maximum":1,"title":"Temperature","type":"number"}},"required":["audio_file_path"],"title":"AudioTranscriptionPiece","type":"object"},"output_schema":{"description":"AudioTranscriptPiece output model","properties":{"message":{"description":"Output message to log","title":"Message","type":"string"},"string_transcription_result":{"default":null,"description":"The result transcription text as a string.","title":"String Transcription Result","type":"string"},"file_path_transcription_result":{"default":null,"description":"The result transcription text as a file path.","title":"File Path Transcription Result","type":"string"}},"required":["message"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"AudioTranscriptPiece secret model","properties":{"OPENAI_API_KEY":{"description":"OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/AudioTranscriptionPiece","repository_id":177},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"id":480,"name":"TextSummarizerPiece","description":"This Piece runs a text summarizer using OpenAI API.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"LLMModelType":{"description":"OpenAI model type","enum":["gpt-3.5-turbo","gpt-4"],"title":"LLMModelType","type":"string"},"OutputTypeType":{"description":"Output type for the completion result","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"TextSummarizerPiece Input model","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text to summarize","required":false,"title":"Text"},"text_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Use it only if not using text field. File path to the text to summarize","required":false,"title":"Text File Path"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output to return"},"openai_model":{"allOf":[{"$ref":"#/$defs/LLMModelType"}],"default":"gpt-3.5-turbo","description":"OpenAI model name to use for summarization"},"chunk_size":{"default":1000,"description":"Chunk size, measured in tokens, of each pre-summary chunk","title":"Chunk Size","type":"integer"},"chunk_overlap_rate":{"default":0.2,"description":"The percentage of overlap between each chunk","title":"Chunk Overlap Rate","type":"number"},"completion_max_tokens":{"default":500,"description":"The maximum number of tokens to generate in the summary.","title":"Completion Max Tokens","type":"integer"},"temperature":{"default":0.2,"description":"Temperature of the model, between 0 (more precise) and 1 (more creative)","title":"Temperature","type":"number"}},"title":"TextSummarizerPiece","type":"object"},"output_schema":{"description":"TextSummarizerPiece Output model","properties":{"string_summarized_text":{"default":null,"description":"summarized text","title":"String Summarized Text","type":"string"},"file_path_summarized_text":{"default":null,"description":"Path to summarized text file","title":"File Path Summarized Text","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"description":"TextSummarizerPiece Secrets model","properties":{"OPENAI_API_KEY":{"description":"Your OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/TextSummarizerPiece","repository_id":177},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"id":488,"name":"EmailSenderPiece","description":"Email sender","dependency":{"dockerfile":null,"requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group0","input_schema":{"$defs":{"InnerArgModel":{"description":"Inner argument model to use in the body and subject texts","properties":{"arg_name":{"title":"Arg Name","type":"string"},"arg_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}],"title":"Arg Value"}},"required":["arg_name","arg_value"],"title":"InnerArgModel","type":"object"},"ProviderType":{"enum":["gmail","outlook","office365","yahoo"],"title":"ProviderType","type":"string"}},"description":"Input data for EmailSenderPiece","properties":{"email_provider":{"allOf":[{"$ref":"#/$defs/ProviderType"}],"default":"gmail","description":"The email provider to use"},"email_receivers":{"description":"The receivers of the email, as comma-separated values","title":"Email Receivers","type":"string"},"email_subject":{"description":"The subject of the email.","title":"Email Subject","type":"string"},"subject_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the subject of the email","title":"Subject Args"},"email_body":{"description":"The body of the email.","title":"Email Body","type":"string"},"body_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the body of the email","title":"Body Args"},"attachment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to the attachment file","title":"Attachment Path"}},"required":["email_receivers","email_subject","email_body"],"title":"EmailSenderPiece","type":"object"},"output_schema":{"description":"Output data for EmailSenderPiece","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"success":{"description":"The result of the email sending task.","title":"Success","type":"boolean"},"error":{"default":"","description":"The error message, if any.","title":"Error","type":"string"}},"required":["success"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for EmailSenderPiece","properties":{"EMAIL_SENDER_ACCOUNT":{"description":"The email sender account.","title":"Email Sender Account","type":"string"},"EMAIL_SENDER_PASSWORD":{"description":"The email sender password","title":"Email Sender Password","type":"string"}},"required":["EMAIL_SENDER_ACCOUNT","EMAIL_SENDER_PASSWORD"],"title":"SecretsModel","type":"object"},"style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/EmailSenderPiece","repository_id":179}},"workflowPiecesData":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"channel_username":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"bbcnews"},"max_videos":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"published_at_or_after":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"2023-11-01"},"published_at_or_before":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"order_by":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"date"},"video_duration":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"any"},"return_only_urls":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"469_9d388791-b669-41b0-8983-36923286e964":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_array":{"fromUpstream":true,"upstreamId":"YoutubeLis_0f4005cdd6c549ac8111f019bafb2250","upstreamArgument":"videos_list","upstreamValue":"YoutubeListVideosPiece (0f4005cd) - Videos List","value":""},"index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"first"},"another_index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1}}},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":true,"upstreamId":"GetItemFro_9d388791b66941b0898336923286e964","upstreamArgument":"output_value","upstreamValue":"GetItemFromArrayPiece (9d388791) - Output Value","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"audio"}}},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"audio_file_path":{"fromUpstream":true,"upstreamId":"YoutubeDow_fa2a889d92994b63a0cde051b66d12aa","upstreamArgument":"file_path","upstreamValue":"YoutubeDownloadPiece (fa2a889d) - File Path","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"file"},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.1}}},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"text":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"text_file_path":{"fromUpstream":true,"upstreamId":"AudioTrans_f7912cd832ef41668b1ed07190e5c52a","upstreamArgument":"file_path_transcription_result","upstreamValue":"AudioTranscriptionPiece (f7912cd8) - File Path Transcription Result","value":null},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"string"},"openai_model":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gpt-3.5-turbo"},"chunk_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1000},"chunk_overlap_rate":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2},"completion_max_tokens":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":500},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2}}},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"email_provider":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gmail"},"email_receivers":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":""},"email_subject":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"Summary"},"subject_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"email_body":{"fromUpstream":true,"upstreamId":"TextSummar_34d5b73b34f846d5a08a24008c814b34","upstreamArgument":"string_summarized_text","upstreamValue":"TextSummarizerPiece (34d5b73b) - String Summarized Text","value":""},"body_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"attachment_path":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}}},"workflowNodes":[{"id":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","type":"CustomNode","position":{"x":188,"y":195.5},"data":{"name":"YoutubeListVideosPiece","style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":188,"y":195.5},"dragging":false},{"id":"469_9d388791-b669-41b0-8983-36923286e964","type":"CustomNode","position":{"x":427,"y":213.5},"data":{"name":"GetItemFromArrayPiece","style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":427,"y":213.5},"dragging":false},{"id":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","type":"CustomNode","position":{"x":688,"y":241.5},"data":{"name":"YoutubeDownloadPiece","style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":688,"y":241.5},"dragging":false},{"id":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","type":"CustomNode","position":{"x":932,"y":276.5},"data":{"name":"AudioTranscriptionPiece","style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":932,"y":276.5},"dragging":false},{"id":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","type":"CustomNode","position":{"x":1165,"y":289.5},"data":{"name":"TextSummarizerPiece","style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1165,"y":289.5},"dragging":false},{"id":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","type":"CustomNode","position":{"x":1446,"y":364.5},"data":{"name":"EmailSenderPiece","style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false}],"workflowEdges":[{"source":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","sourceHandle":"source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250","target":"469_9d388791-b669-41b0-8983-36923286e964","targetHandle":"target-469_9d388791-b669-41b0-8983-36923286e964","id":"reactflow__edge-494_0f4005cd-d6c5-49ac-8111-f019bafb2250source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250-469_9d388791-b669-41b0-8983-36923286e964target-469_9d388791-b669-41b0-8983-36923286e964"},{"source":"469_9d388791-b669-41b0-8983-36923286e964","sourceHandle":"source-469_9d388791-b669-41b0-8983-36923286e964","target":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","targetHandle":"target-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","id":"reactflow__edge-469_9d388791-b669-41b0-8983-36923286e964source-469_9d388791-b669-41b0-8983-36923286e964-493_fa2a889d-9299-4b63-a0cd-e051b66d12aatarget-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa"},{"source":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","sourceHandle":"source-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","target":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","targetHandle":"target-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","id":"reactflow__edge-493_fa2a889d-9299-4b63-a0cd-e051b66d12aasource-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa-475_f7912cd8-32ef-4166-8b1e-d07190e5c52atarget-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a"},{"source":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","sourceHandle":"source-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","target":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","targetHandle":"target-480_34d5b73b-34f8-46d5-a08a-24008c814b34","id":"reactflow__edge-475_f7912cd8-32ef-4166-8b1e-d07190e5c52asource-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a-480_34d5b73b-34f8-46d5-a08a-24008c814b34target-480_34d5b73b-34f8-46d5-a08a-24008c814b34"},{"source":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","sourceHandle":"source-480_34d5b73b-34f8-46d5-a08a-24008c814b34","target":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","targetHandle":"target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","id":"reactflow__edge-480_34d5b73b-34f8-46d5-a08a-24008c814b34source-480_34d5b73b-34f8-46d5-a08a-24008c814b34-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99"}]} From de7b896f45306f6c3154620248b029d862d6d509 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Fri, 24 Nov 2023 11:37:27 -0300 Subject: [PATCH 58/72] possible anyoftypes for number values - Optional numbers --- frontend/src/@types/piece/properties.d.ts | 4 ++++ .../SidebarForm/PieceForm/PieceFormItem/index.tsx | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/src/@types/piece/properties.d.ts b/frontend/src/@types/piece/properties.d.ts index 73d8f79e..95eb7260 100644 --- a/frontend/src/@types/piece/properties.d.ts +++ b/frontend/src/@types/piece/properties.d.ts @@ -75,6 +75,10 @@ export type SimpleInputSchemaProperty = type AnyOfObjectProperty = DefaultPropertyProps & { anyOf: StringProperty[]; + default: + | ArrayObjectProperty.default + | NumberProperty.default + | StringProperty.default; }; export type InputSchemaProperty = diff --git a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx index fcf56cb6..dcd35dc6 100644 --- a/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx +++ b/frontend/src/features/workflowEditor/components/SidebarForm/PieceForm/PieceFormItem/index.tsx @@ -54,6 +54,7 @@ const PieceFormItem: React.FC = ({ } } } + if (checkedFromUpstream) { let options: Option[] = []; if ( @@ -89,8 +90,9 @@ const PieceFormItem: React.FC = ({ /> ); } else if ( - "type" in schema && - (schema.type === "number" || schema.type === "float") + ("type" in schema && + (schema.type === "number" || schema.type === "float")) || + anyOfType === "float" ) { inputElement = ( @@ -100,7 +102,10 @@ const PieceFormItem: React.FC = ({ defaultValue={schema?.default ?? 10.5} /> ); - } else if ("type" in schema && schema.type === "integer") { + } else if ( + ("type" in schema && schema.type === "integer") || + anyOfType === "integer" + ) { inputElement = ( name={`inputs.${itemKey}.value`} From 9f32c07c4c9b8cdb930bf7d28b1c648288d36128 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Fri, 24 Nov 2023 12:56:17 -0300 Subject: [PATCH 59/72] fix: url differences on install on workflow editor --- frontend/src/@types/piece/piece.d.ts | 1 + .../features/workflowEditor/utils/importWorkflow.ts | 12 +++++++----- .../utils/workflows/dimensionality_reduction.json | 2 +- .../utils/workflows/image_filter_workflow.json | 2 +- .../utils/workflows/nasa_workflow.json | 2 +- .../utils/workflows/youtube_summarizer.json | 2 +- rest/schemas/responses/piece.py | 1 + rest/services/piece_service.py | 4 ++-- 8 files changed, 15 insertions(+), 11 deletions(-) diff --git a/frontend/src/@types/piece/piece.d.ts b/frontend/src/@types/piece/piece.d.ts index cbdddb72..c04098cf 100644 --- a/frontend/src/@types/piece/piece.d.ts +++ b/frontend/src/@types/piece/piece.d.ts @@ -50,6 +50,7 @@ export interface Piece { source_image: string; source_url: string | null; + repository_url: string; dependency: { docker_image: string | null; dockerfile: string | null; diff --git a/frontend/src/features/workflowEditor/utils/importWorkflow.ts b/frontend/src/features/workflowEditor/utils/importWorkflow.ts index a1baf14e..2a0bb73d 100644 --- a/frontend/src/features/workflowEditor/utils/importWorkflow.ts +++ b/frontend/src/features/workflowEditor/utils/importWorkflow.ts @@ -76,6 +76,7 @@ export const validateJsonImported = async (json: any): Promise => { id: yup.number().required(), source_image: yup.string().required(), source_url: yup.string().required(), + repository_url: yup.string().required(), input_schema: yup.object().shape({}).required(), output_schema: yup.object().shape({}).required(), }; @@ -110,8 +111,9 @@ export const findDifferencesInJsonImported = async ( const currentRepositories = new Set( Object.values((await localForage.getItem("pieces")) as any)?.map( (p: any) => - p?.source_image.replace("ghcr.io/", "").replace(/-group\d+$/g, "") || - "", + p?.repository_url.replace("https://github.com/", "") + + ":" + + p?.source_image.split(":")[1]?.replace(/-group\d+$/g, "") || "", ) || [], ); @@ -119,9 +121,9 @@ export const findDifferencesInJsonImported = async ( Object.values(json.workflowPieces) .flatMap( (next: any) => - next.source_image - .replace("ghcr.io/", "") - .replace(/-group\d+$/g, "") || null, + next.repository_url.replace("https://github.com/", "") + + ":" + + next.source_image.split(":")[1].replace(/-group\d+$/g, "") || null, ) .filter(Boolean) as string[], ); diff --git a/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json b/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json index 4867e7cd..eb506581 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json +++ b/frontend/src/features/workflowEditor/utils/workflows/dimensionality_reduction.json @@ -1 +1 @@ -{"workflowPieces":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"id":2228,"name":"ToyDatasetsPiece","description":"Load toy datasets from scikit-learn","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"DatasetName":{"enum":["iris","diabetes","digits","wine","breast_cancer","linnerrud"],"title":"DatasetName","type":"string"}},"properties":{"dataset":{"allOf":[{"$ref":"#/$defs/DatasetName"}],"default":"iris","title":"Dataset name"}},"title":"ToyDatasetsPiece","type":"object"},"output_schema":{"properties":{"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"File path"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ToyDatasetsPiece","repository_id":509},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"id":2254,"name":"PCATrainPiece","description":"Applies PCA to the input data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Train Data Path","type":"string"},"n_components":{"default":2,"description":"The number of components for PCA.","title":"Number of Components","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"PCATrainPiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"},"pca_model_path":{"default":null,"title":"Pca Model Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCATrainPiece","repository_id":513},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"id":2252,"name":"PCAInferencePiece","description":"Use the trained PCA model to transform the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"model_path":{"description":"The path to the PCA model.","from_upstream":"always","title":"Model Path","type":"string"},"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Data Path","type":"string"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["model_path","data_path"],"title":"PCAInferencePiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCAInferencePiece","repository_id":513},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"id":2251,"name":"TSNEPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to data to apply t-SNE.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions t-SNE.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"TSNEPiece","type":"object"},"output_schema":{"properties":{"tsne_data_path":{"default":null,"title":"Tsne Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TSNEPiece","repository_id":513},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"id":2255,"name":"UMAPPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the data to apply UMAP.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions for UMAP.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"UMAPPiece","type":"object"},"output_schema":{"properties":{"umap_data_path":{"default":null,"title":"Umap Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/UMAPPiece","repository_id":513}},"workflowPiecesData":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"dataset":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"breast_cancer"}}},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"model_path":{"fromUpstream":true,"upstreamId":"PCATrainPi_6a654f5c472e4cd38ad8d9bc00cce586","upstreamArgument":"pca_model_path","upstreamValue":"PCATrainPiece (6a654f5c) - Pca Model Path","value":""},"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}}},"workflowNodes":[{"id":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","type":"CustomNode","position":{"x":699,"y":278.5},"data":{"name":"ToyDatasetsPiece","style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","type":"CustomNode","position":{"x":1001,"y":30.5},"data":{"name":"PCATrainPiece","style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1001,"y":30.5},"dragging":false},{"id":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","type":"CustomNode","position":{"x":1266,"y":270.5},"data":{"name":"PCAInferencePiece","style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":1266,"y":270.5},"dragging":false},{"id":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","type":"CustomNode","position":{"x":981,"y":191.5},"data":{"name":"TSNEPiece","style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":981,"y":191.5},"dragging":false},{"id":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","type":"CustomNode","position":{"x":978,"y":368.5},"data":{"name":"UMAPPiece","style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":978,"y":368.5},"dragging":false}],"workflowEdges":[{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","targetHandle":"target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","targetHandle":"target-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2251_5ce467db-a67b-4acc-80d9-e94e94309c2dtarget-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","targetHandle":"target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"},{"source":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","sourceHandle":"source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"}]} \ No newline at end of file +{"workflowPieces":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"id":2228,"name":"ToyDatasetsPiece","description":"Load toy datasets from scikit-learn","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"DatasetName":{"enum":["iris","diabetes","digits","wine","breast_cancer","linnerrud"],"title":"DatasetName","type":"string"}},"properties":{"dataset":{"allOf":[{"$ref":"#/$defs/DatasetName"}],"default":"iris","title":"Dataset name"}},"title":"ToyDatasetsPiece","type":"object"},"output_schema":{"properties":{"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"File path"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ToyDatasetsPiece","repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","repository_id":509},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"id":2254,"name":"PCATrainPiece","description":"Applies PCA to the input data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Train Data Path","type":"string"},"n_components":{"default":2,"description":"The number of components for PCA.","title":"Number of Components","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"PCATrainPiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"},"pca_model_path":{"default":null,"title":"Pca Model Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCATrainPiece","repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","repository_id":513},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"id":2252,"name":"PCAInferencePiece","description":"Use the trained PCA model to transform the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"model_path":{"description":"The path to the PCA model.","from_upstream":"always","title":"Model Path","type":"string"},"data_path":{"description":"The path to the train data to apply PCA.","from_upstream":"always","title":"Data Path","type":"string"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["model_path","data_path"],"title":"PCAInferencePiece","type":"object"},"output_schema":{"properties":{"pca_data_path":{"default":null,"title":"Pca Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/PCAInferencePiece","repository_id":513},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"id":2251,"name":"TSNEPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to data to apply t-SNE.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions t-SNE.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"TSNEPiece","type":"object"},"output_schema":{"properties":{"tsne_data_path":{"default":null,"title":"Tsne Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TSNEPiece","repository_id":513},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"id":2255,"name":"UMAPPiece","description":"Applies t-SNE to the data","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the data to apply UMAP.","from_upstream":"always","title":"Data Path","type":"string"},"n_components":{"default":2,"description":"The number of dimensions for UMAP.","title":"Number of Dimensions","type":"integer"},"use_class_column":{"default":false,"description":"Whether to use the target column as class to plot.","title":"Use Class Column","type":"boolean"}},"required":["data_path"],"title":"UMAPPiece","type":"object"},"output_schema":{"properties":{"umap_data_path":{"default":null,"title":"Umap Data Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/UMAPPiece","repository_id":513}},"workflowPiecesData":{"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"dataset":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"breast_cancer"}}},"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"model_path":{"fromUpstream":true,"upstreamId":"PCATrainPi_6a654f5c472e4cd38ad8d9bc00cce586","upstreamArgument":"pca_model_path","upstreamValue":"PCATrainPiece (6a654f5c) - Pca Model Path","value":""},"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_4943b9258f2742128fc49e7028ca9e5b","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (4943b925) - File path","value":""},"n_components":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":2},"use_class_column":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}}},"workflowNodes":[{"id":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","type":"CustomNode","position":{"x":699,"y":278.5},"data":{"name":"ToyDatasetsPiece","style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","type":"CustomNode","position":{"x":1001,"y":30.5},"data":{"name":"PCATrainPiece","style":{"module":"PCATrainPiece","label":"PCA Train Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1001,"y":30.5},"dragging":false},{"id":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","type":"CustomNode","position":{"x":1266,"y":270.5},"data":{"name":"PCAInferencePiece","style":{"module":"PCAInferencePiece","label":"PCA Inference Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":1266,"y":270.5},"dragging":false},{"id":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","type":"CustomNode","position":{"x":981,"y":191.5},"data":{"name":"TSNEPiece","style":{"module":"TSNEPiece","label":"t-SNE Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":981,"y":191.5},"dragging":false},{"id":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","type":"CustomNode","position":{"x":978,"y":368.5},"data":{"name":"UMAPPiece","style":{"module":"UMAPPiece","label":"UMAP Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"radix-icons:dimensions","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":978,"y":368.5},"dragging":false}],"workflowEdges":[{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","targetHandle":"target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586target-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","targetHandle":"target-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2251_5ce467db-a67b-4acc-80d9-e94e94309c2dtarget-2251_5ce467db-a67b-4acc-80d9-e94e94309c2d"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","targetHandle":"target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51target-2255_7642c6f0-a73a-4447-9b7c-af99a813eb51"},{"source":"2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","sourceHandle":"source-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5bsource-2228_4943b925-8f27-4212-8fc4-9e7028ca9e5b-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"},{"source":"2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","sourceHandle":"source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586","target":"2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","targetHandle":"target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318","id":"reactflow__edge-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586source-2254_6a654f5c-472e-4cd3-8ad8-d9bc00cce586-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318target-2252_8638a24d-f0f0-44a9-bbd1-4a6780888318"}]} diff --git a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json index 4c1adb51..87120eb1 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json +++ b/frontend/src/features/workflowEditor/utils/workflows/image_filter_workflow.json @@ -1 +1 @@ -{"workflowPieces":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"id":694,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":219},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"id":695,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":219}},"workflowPiecesData":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_27dd10b0cd4b41a5bb118468b0a3c60b","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (27dd10b0) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}}},"workflowNodes":[{"id":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","type":"CustomNode","position":{"x":369,"y":188.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","type":"CustomNode","position":{"x":656,"y":161.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"dragging":false}],"workflowEdges":[{"source":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","sourceHandle":"source-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","target":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","targetHandle":"target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62","id":"reactflow__edge-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60bsource-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b-695_7a0d7be2-528e-4149-831a-d0a4308dcb62target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62"}]} \ No newline at end of file +{"workflowPieces":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"id":694,"name":"HttpRequestPiece","description":"Makes a HTTP request to a given URL.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"MethodTypes":{"enum":["GET","POST","PUT","DELETE"],"title":"MethodTypes","type":"string"}},"properties":{"url":{"description":"URL to make a request to.","title":"Url","type":"string"},"method":{"allOf":[{"$ref":"#/$defs/MethodTypes"}],"default":"GET","description":"HTTP method to use."},"bearer_token":{"default":null,"description":"Bearer token to use for authentication.","title":"Bearer Token","type":"string"},"body_json_data":{"default":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n","description":"JSON data to send in the request body.","title":"Body Json Data","type":"string","widget":"codeeditor-json"}},"required":["url"],"title":"HttpRequestPiece","type":"object"},"output_schema":{"properties":{"base64_bytes_data":{"description":"Output data as base64 encoded string.","title":"Base64 Bytes Data","type":"string"}},"required":["base64_bytes_data"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/HttpRequestPiece","repository_id":219},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"id":695,"name":"ImageFilterPiece","description":"A Piece that applies selected image filters to an image.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.7.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","base64_string","both"],"title":"OutputTypeType","type":"string"}},"properties":{"input_image":{"description":"Input image. It should be either a path to a file, or a base64 encoded string.","from_upstream":"always","title":"Input Image","type":"string"},"sepia":{"default":false,"description":"Apply sepia effect.","title":"Sepia","type":"boolean"},"black_and_white":{"default":false,"description":"Apply black and white effect.","title":"Black And White","type":"boolean"},"brightness":{"default":false,"description":"Apply brightness effect.","title":"Brightness","type":"boolean"},"darkness":{"default":false,"description":"Apply darkness effect.","title":"Darkness","type":"boolean"},"contrast":{"default":false,"description":"Apply contrast effect.","title":"Contrast","type":"boolean"},"red":{"default":false,"description":"Apply red effect.","title":"Red","type":"boolean"},"green":{"default":false,"description":"Apply green effect.","title":"Green","type":"boolean"},"blue":{"default":false,"description":"Apply blue effect.","title":"Blue","type":"boolean"},"cool":{"default":false,"description":"Apply cool effect.","title":"Cool","type":"boolean"},"warm":{"default":false,"description":"Apply warm effect.","title":"Warm","type":"boolean"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"both","description":"Format of the output image. Options are: `file`, `base64_string`, `both`."}},"required":["input_image"],"title":"ImageFilterPiece","type":"object"},"output_schema":{"properties":{"image_base64_string":{"default":"","description":"Base64 encoded string of the output image.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":"","description":"Path to the output image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ImageFilterPiece","repository_id":219}},"workflowPiecesData":{"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"https://images.pexels.com/photos/4055758/pexels-photo-4055758.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"},"method":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"GET"},"bearer_token":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"body_json_data":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"{\n \"key_1\": \"value_1\",\n \"key_2\": \"value_2\"\n}\n"}}},"695_7a0d7be2-528e-4149-831a-d0a4308dcb62":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_image":{"fromUpstream":true,"upstreamId":"HttpReques_27dd10b0cd4b41a5bb118468b0a3c60b","upstreamArgument":"base64_bytes_data","upstreamValue":"HttpRequestPiece (27dd10b0) - Base64 Bytes Data","value":""},"sepia":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"black_and_white":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true},"brightness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"darkness":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"contrast":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"red":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"green":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"blue":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"cool":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"warm":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":false},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"both"}}}},"workflowNodes":[{"id":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","type":"CustomNode","position":{"x":369,"y":188.5},"data":{"name":"HttpRequestPiece","style":{"module":"HttpRequestPiece","label":"HTTP Request","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"material-symbols:send","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false},{"id":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","type":"CustomNode","position":{"x":656,"y":161.5},"data":{"name":"ImageFilterPiece","style":{"module":"ImageFilterPiece","label":"Image Filter","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"ic:twotone-filter","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"dragging":false}],"workflowEdges":[{"source":"694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","sourceHandle":"source-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b","target":"695_7a0d7be2-528e-4149-831a-d0a4308dcb62","targetHandle":"target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62","id":"reactflow__edge-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60bsource-694_27dd10b0-cd4b-41a5-bb11-8468b0a3c60b-695_7a0d7be2-528e-4149-831a-d0a4308dcb62target-695_7a0d7be2-528e-4149-831a-d0a4308dcb62"}]} diff --git a/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json b/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json index bb0bbf32..538faf3a 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json +++ b/frontend/src/features/workflowEditor/utils/workflows/nasa_workflow.json @@ -1 +1 @@ -{"workflowPieces":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"id":705,"name":"NasaEarthImagePiece","description":"This Piece uses the NASA EPIC API to get satellite images of the Earth.\nReferences: \n- https://epic.gsfc.nasa.gov/about/api \n- https://api.nasa.gov/","dependency":{"dockerfile":null,"requirements_file":"requirements.txt"},"source_image":"ghcr.io/tauffer-consulting/data_apis_domino_pieces:0.2.0-group0","input_schema":{"$defs":{"LocationTypes":{"enum":["random","America","Atlantic Ocean","Africa","Asia","Pacific Ocean"],"title":"LocationTypes","type":"string"}},"properties":{"location":{"allOf":[{"$ref":"#/$defs/LocationTypes"}],"default":"random","description":"Retrieve image centered approximately on this location."}},"title":"NasaEarthImagePiece","type":"object"},"output_schema":{"properties":{"image_url":{"default":null,"description":"URL of the image.","title":"Image Url","type":"string"},"image_base64_string":{"default":null,"description":"Output data as base64 encoded string.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":null,"description":"Path to the image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"properties":{"NASA_API_KEY":{"default":"DEMO_KEY","description":"API key for NASA Earth Image API.","title":"Nasa Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces/tree/main/pieces/NasaEarthImagePiece","repository_id":221}},"workflowPiecesData":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"location":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"random"}}}},"workflowNodes":[{"id":"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52","type":"CustomNode","position":{"x":718,"y":212.5},"data":{"name":"NasaEarthImagePiece","style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":718,"y":212.5},"dragging":false}],"workflowEdges":[]} \ No newline at end of file +{"workflowPieces":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"id":705,"name":"NasaEarthImagePiece","description":"This Piece uses the NASA EPIC API to get satellite images of the Earth.\nReferences: \n- https://epic.gsfc.nasa.gov/about/api \n- https://api.nasa.gov/","dependency":{"dockerfile":null,"requirements_file":"requirements.txt"},"source_image":"ghcr.io/tauffer-consulting/data_apis_domino_pieces:0.2.0-group0","input_schema":{"$defs":{"LocationTypes":{"enum":["random","America","Atlantic Ocean","Africa","Asia","Pacific Ocean"],"title":"LocationTypes","type":"string"}},"properties":{"location":{"allOf":[{"$ref":"#/$defs/LocationTypes"}],"default":"random","description":"Retrieve image centered approximately on this location."}},"title":"NasaEarthImagePiece","type":"object"},"output_schema":{"properties":{"image_url":{"default":null,"description":"URL of the image.","title":"Image Url","type":"string"},"image_base64_string":{"default":null,"description":"Output data as base64 encoded string.","title":"Image Base64 String","type":"string"},"image_file_path":{"default":null,"description":"Path to the image file.","title":"Image File Path","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"properties":{"NASA_API_KEY":{"default":"DEMO_KEY","description":"API key for NASA Earth Image API.","title":"Nasa Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/data_apis_domino_pieces/tree/main/pieces/NasaEarthImagePiece","repository_id":221}},"workflowPiecesData":{"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"location":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"random"}}}},"workflowNodes":[{"id":"705_0018c3ba-8c2e-48a3-b79c-8300431e7d52","type":"CustomNode","position":{"x":718,"y":212.5},"data":{"name":"NasaEarthImagePiece","style":{"module":"NasaEarthImagePiece","label":"NASA Earth Image","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"ion:earth-sharp","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":718,"y":212.5},"dragging":false}],"workflowEdges":[]} diff --git a/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json b/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json index cf32bcc3..bd798893 100644 --- a/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json +++ b/frontend/src/features/workflowEditor/utils/workflows/youtube_summarizer.json @@ -1 +1 @@ -{"workflowPieces":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"id":494,"name":"YoutubeListVideosPiece","description":"List videos from youtube channel.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OrderBy":{"description":"The order in which the videos are returned.","enum":["date","rating","relevance","title","viewCount"],"title":"OrderBy","type":"string"},"VideoDuration":{"description":"The duration of the video.","enum":["any","long","medium","short"],"title":"VideoDuration","type":"string"}},"description":"Input data for YoutubeListVideosPiece","properties":{"channel_username":{"default":null,"description":"The username of the Youtube channel.","title":"Channel Username","type":"string"},"max_videos":{"default":10,"description":"The maximum number of videos to be returned","exclusiveMinimum":0,"title":"Max Videos","type":"integer"},"published_at_or_after":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created at or after the specified date","title":"Published At Or After"},"published_at_or_before":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created before or at the specified date","title":"Published At Or Before"},"order_by":{"allOf":[{"$ref":"#/$defs/OrderBy"}],"default":"date","description":"The order in which the videos are returned","title":"Order By"},"video_duration":{"allOf":[{"$ref":"#/$defs/VideoDuration"}],"default":"any","description":"The duration of the video","title":"Video Duration"},"return_only_urls":{"default":false,"description":"If True, only the urls of the videos will be returned","title":"Return only urls","type":"boolean"}},"title":"YoutubeListVideosPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeListVideosPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"videos_list":{"description":"A list containing information about videos.","items":{},"title":"Videos List","type":"array"}},"required":["videos_list"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for YoutubeListVideosPiece","properties":{"YOUTUBE_API_KEY":{"default":null,"description":"The Youtube Data API Key.","title":"Youtube Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeListVideosPiece","repository_id":179},"469_9d388791-b669-41b0-8983-36923286e964":{"id":469,"name":"GetItemFromArrayPiece","description":"Get one item from an array","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"IndexType":{"enum":["first","last","random","another"],"title":"IndexType","type":"string"}},"description":"GetItemFromArrayPiece Input Model","properties":{"input_array":{"description":"Input array to get item from.","from_upstream":"always","items":{},"title":"Input Array","type":"array"},"index":{"allOf":[{"$ref":"#/$defs/IndexType"}],"default":"first","description":"Index of item to get from input array."},"another_index":{"default":1,"description":"Index number of item to get from input array.","minimum":1,"title":"Another Index","type":"integer"}},"required":["input_array"],"title":"GetItemFromArrayPiece","type":"object"},"output_schema":{"description":"GetItemFromArrayPiece Output Model","properties":{"output_value":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"object"},{"format":"date","type":"string"},{"format":"time","type":"string"},{"format":"date-time","type":"string"}],"description":"Item from input array at specified index.","title":"Output Value"}},"required":["output_value"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetItemFromArrayPiece","repository_id":176},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"id":493,"name":"YoutubeDownloadPiece","description":"Downloads content from youtube videos as audio or video files.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OutputTypeType":{"enum":["audio","video"],"title":"OutputTypeType","type":"string"}},"description":"Input data for YoutubeDownloadPiece","properties":{"url":{"description":"The url of the video to be downloaded.","title":"Url","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"audio","description":"The type of output file to be downloaded."}},"required":["url"],"title":"YoutubeDownloadPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeDownloadPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"file_path":{"description":"The path to the downloaded file","title":"File Path","type":"string"}},"required":["file_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeDownloadPiece","repository_id":179},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"id":475,"name":"AudioTranscriptionPiece","description":"This Piece uses the OpenAI API to extract text transcripts from audio.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"AudioTranscriptPiece input model","properties":{"audio_file_path":{"description":"The path to the audio file to process.","title":"Audio File Path","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output for the result text"},"temperature":{"default":0.1,"description":"What sampling temperature to use, between 0 and 1","exclusiveMinimum":0,"maximum":1,"title":"Temperature","type":"number"}},"required":["audio_file_path"],"title":"AudioTranscriptionPiece","type":"object"},"output_schema":{"description":"AudioTranscriptPiece output model","properties":{"message":{"description":"Output message to log","title":"Message","type":"string"},"string_transcription_result":{"default":null,"description":"The result transcription text as a string.","title":"String Transcription Result","type":"string"},"file_path_transcription_result":{"default":null,"description":"The result transcription text as a file path.","title":"File Path Transcription Result","type":"string"}},"required":["message"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"AudioTranscriptPiece secret model","properties":{"OPENAI_API_KEY":{"description":"OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/AudioTranscriptionPiece","repository_id":177},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"id":480,"name":"TextSummarizerPiece","description":"This Piece runs a text summarizer using OpenAI API.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"LLMModelType":{"description":"OpenAI model type","enum":["gpt-3.5-turbo","gpt-4"],"title":"LLMModelType","type":"string"},"OutputTypeType":{"description":"Output type for the completion result","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"TextSummarizerPiece Input model","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text to summarize","required":false,"title":"Text"},"text_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Use it only if not using text field. File path to the text to summarize","required":false,"title":"Text File Path"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output to return"},"openai_model":{"allOf":[{"$ref":"#/$defs/LLMModelType"}],"default":"gpt-3.5-turbo","description":"OpenAI model name to use for summarization"},"chunk_size":{"default":1000,"description":"Chunk size, measured in tokens, of each pre-summary chunk","title":"Chunk Size","type":"integer"},"chunk_overlap_rate":{"default":0.2,"description":"The percentage of overlap between each chunk","title":"Chunk Overlap Rate","type":"number"},"completion_max_tokens":{"default":500,"description":"The maximum number of tokens to generate in the summary.","title":"Completion Max Tokens","type":"integer"},"temperature":{"default":0.2,"description":"Temperature of the model, between 0 (more precise) and 1 (more creative)","title":"Temperature","type":"number"}},"title":"TextSummarizerPiece","type":"object"},"output_schema":{"description":"TextSummarizerPiece Output model","properties":{"string_summarized_text":{"default":null,"description":"summarized text","title":"String Summarized Text","type":"string"},"file_path_summarized_text":{"default":null,"description":"Path to summarized text file","title":"File Path Summarized Text","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"description":"TextSummarizerPiece Secrets model","properties":{"OPENAI_API_KEY":{"description":"Your OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/TextSummarizerPiece","repository_id":177},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"id":488,"name":"EmailSenderPiece","description":"Email sender","dependency":{"dockerfile":null,"requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group0","input_schema":{"$defs":{"InnerArgModel":{"description":"Inner argument model to use in the body and subject texts","properties":{"arg_name":{"title":"Arg Name","type":"string"},"arg_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}],"title":"Arg Value"}},"required":["arg_name","arg_value"],"title":"InnerArgModel","type":"object"},"ProviderType":{"enum":["gmail","outlook","office365","yahoo"],"title":"ProviderType","type":"string"}},"description":"Input data for EmailSenderPiece","properties":{"email_provider":{"allOf":[{"$ref":"#/$defs/ProviderType"}],"default":"gmail","description":"The email provider to use"},"email_receivers":{"description":"The receivers of the email, as comma-separated values","title":"Email Receivers","type":"string"},"email_subject":{"description":"The subject of the email.","title":"Email Subject","type":"string"},"subject_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the subject of the email","title":"Subject Args"},"email_body":{"description":"The body of the email.","title":"Email Body","type":"string"},"body_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the body of the email","title":"Body Args"},"attachment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to the attachment file","title":"Attachment Path"}},"required":["email_receivers","email_subject","email_body"],"title":"EmailSenderPiece","type":"object"},"output_schema":{"description":"Output data for EmailSenderPiece","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"success":{"description":"The result of the email sending task.","title":"Success","type":"boolean"},"error":{"default":"","description":"The error message, if any.","title":"Error","type":"string"}},"required":["success"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for EmailSenderPiece","properties":{"EMAIL_SENDER_ACCOUNT":{"description":"The email sender account.","title":"Email Sender Account","type":"string"},"EMAIL_SENDER_PASSWORD":{"description":"The email sender password","title":"Email Sender Password","type":"string"}},"required":["EMAIL_SENDER_ACCOUNT","EMAIL_SENDER_PASSWORD"],"title":"SecretsModel","type":"object"},"style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/EmailSenderPiece","repository_id":179}},"workflowPiecesData":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"channel_username":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"bbcnews"},"max_videos":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"published_at_or_after":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"2023-11-01"},"published_at_or_before":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"order_by":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"date"},"video_duration":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"any"},"return_only_urls":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"469_9d388791-b669-41b0-8983-36923286e964":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_array":{"fromUpstream":true,"upstreamId":"YoutubeLis_0f4005cdd6c549ac8111f019bafb2250","upstreamArgument":"videos_list","upstreamValue":"YoutubeListVideosPiece (0f4005cd) - Videos List","value":""},"index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"first"},"another_index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1}}},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":true,"upstreamId":"GetItemFro_9d388791b66941b0898336923286e964","upstreamArgument":"output_value","upstreamValue":"GetItemFromArrayPiece (9d388791) - Output Value","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"audio"}}},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"audio_file_path":{"fromUpstream":true,"upstreamId":"YoutubeDow_fa2a889d92994b63a0cde051b66d12aa","upstreamArgument":"file_path","upstreamValue":"YoutubeDownloadPiece (fa2a889d) - File Path","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"file"},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.1}}},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"text":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"text_file_path":{"fromUpstream":true,"upstreamId":"AudioTrans_f7912cd832ef41668b1ed07190e5c52a","upstreamArgument":"file_path_transcription_result","upstreamValue":"AudioTranscriptionPiece (f7912cd8) - File Path Transcription Result","value":null},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"string"},"openai_model":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gpt-3.5-turbo"},"chunk_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1000},"chunk_overlap_rate":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2},"completion_max_tokens":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":500},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2}}},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"email_provider":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gmail"},"email_receivers":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":""},"email_subject":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"Summary"},"subject_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"email_body":{"fromUpstream":true,"upstreamId":"TextSummar_34d5b73b34f846d5a08a24008c814b34","upstreamArgument":"string_summarized_text","upstreamValue":"TextSummarizerPiece (34d5b73b) - String Summarized Text","value":""},"body_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"attachment_path":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}}},"workflowNodes":[{"id":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","type":"CustomNode","position":{"x":188,"y":195.5},"data":{"name":"YoutubeListVideosPiece","style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":188,"y":195.5},"dragging":false},{"id":"469_9d388791-b669-41b0-8983-36923286e964","type":"CustomNode","position":{"x":427,"y":213.5},"data":{"name":"GetItemFromArrayPiece","style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":427,"y":213.5},"dragging":false},{"id":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","type":"CustomNode","position":{"x":688,"y":241.5},"data":{"name":"YoutubeDownloadPiece","style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":688,"y":241.5},"dragging":false},{"id":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","type":"CustomNode","position":{"x":932,"y":276.5},"data":{"name":"AudioTranscriptionPiece","style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":932,"y":276.5},"dragging":false},{"id":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","type":"CustomNode","position":{"x":1165,"y":289.5},"data":{"name":"TextSummarizerPiece","style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1165,"y":289.5},"dragging":false},{"id":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","type":"CustomNode","position":{"x":1446,"y":364.5},"data":{"name":"EmailSenderPiece","style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false}],"workflowEdges":[{"source":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","sourceHandle":"source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250","target":"469_9d388791-b669-41b0-8983-36923286e964","targetHandle":"target-469_9d388791-b669-41b0-8983-36923286e964","id":"reactflow__edge-494_0f4005cd-d6c5-49ac-8111-f019bafb2250source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250-469_9d388791-b669-41b0-8983-36923286e964target-469_9d388791-b669-41b0-8983-36923286e964"},{"source":"469_9d388791-b669-41b0-8983-36923286e964","sourceHandle":"source-469_9d388791-b669-41b0-8983-36923286e964","target":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","targetHandle":"target-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","id":"reactflow__edge-469_9d388791-b669-41b0-8983-36923286e964source-469_9d388791-b669-41b0-8983-36923286e964-493_fa2a889d-9299-4b63-a0cd-e051b66d12aatarget-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa"},{"source":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","sourceHandle":"source-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","target":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","targetHandle":"target-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","id":"reactflow__edge-493_fa2a889d-9299-4b63-a0cd-e051b66d12aasource-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa-475_f7912cd8-32ef-4166-8b1e-d07190e5c52atarget-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a"},{"source":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","sourceHandle":"source-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","target":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","targetHandle":"target-480_34d5b73b-34f8-46d5-a08a-24008c814b34","id":"reactflow__edge-475_f7912cd8-32ef-4166-8b1e-d07190e5c52asource-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a-480_34d5b73b-34f8-46d5-a08a-24008c814b34target-480_34d5b73b-34f8-46d5-a08a-24008c814b34"},{"source":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","sourceHandle":"source-480_34d5b73b-34f8-46d5-a08a-24008c814b34","target":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","targetHandle":"target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","id":"reactflow__edge-480_34d5b73b-34f8-46d5-a08a-24008c814b34source-480_34d5b73b-34f8-46d5-a08a-24008c814b34-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99"}]} \ No newline at end of file +{"workflowPieces":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"id":494,"name":"YoutubeListVideosPiece","description":"List videos from youtube channel.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OrderBy":{"description":"The order in which the videos are returned.","enum":["date","rating","relevance","title","viewCount"],"title":"OrderBy","type":"string"},"VideoDuration":{"description":"The duration of the video.","enum":["any","long","medium","short"],"title":"VideoDuration","type":"string"}},"description":"Input data for YoutubeListVideosPiece","properties":{"channel_username":{"default":null,"description":"The username of the Youtube channel.","title":"Channel Username","type":"string"},"max_videos":{"default":10,"description":"The maximum number of videos to be returned","exclusiveMinimum":0,"title":"Max Videos","type":"integer"},"published_at_or_after":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created at or after the specified date","title":"Published At Or After"},"published_at_or_before":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Filter videos created before or at the specified date","title":"Published At Or Before"},"order_by":{"allOf":[{"$ref":"#/$defs/OrderBy"}],"default":"date","description":"The order in which the videos are returned","title":"Order By"},"video_duration":{"allOf":[{"$ref":"#/$defs/VideoDuration"}],"default":"any","description":"The duration of the video","title":"Video Duration"},"return_only_urls":{"default":false,"description":"If True, only the urls of the videos will be returned","title":"Return only urls","type":"boolean"}},"title":"YoutubeListVideosPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeListVideosPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"videos_list":{"description":"A list containing information about videos.","items":{},"title":"Videos List","type":"array"}},"required":["videos_list"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for YoutubeListVideosPiece","properties":{"YOUTUBE_API_KEY":{"default":null,"description":"The Youtube Data API Key.","title":"Youtube Api Key","type":"string"}},"title":"SecretsModel","type":"object"},"style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeListVideosPiece","repository_id":179},"469_9d388791-b669-41b0-8983-36923286e964":{"id":469,"name":"GetItemFromArrayPiece","description":"Get one item from an array","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"IndexType":{"enum":["first","last","random","another"],"title":"IndexType","type":"string"}},"description":"GetItemFromArrayPiece Input Model","properties":{"input_array":{"description":"Input array to get item from.","from_upstream":"always","items":{},"title":"Input Array","type":"array"},"index":{"allOf":[{"$ref":"#/$defs/IndexType"}],"default":"first","description":"Index of item to get from input array."},"another_index":{"default":1,"description":"Index number of item to get from input array.","minimum":1,"title":"Another Index","type":"integer"}},"required":["input_array"],"title":"GetItemFromArrayPiece","type":"object"},"output_schema":{"description":"GetItemFromArrayPiece Output Model","properties":{"output_value":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"object"},{"format":"date","type":"string"},{"format":"time","type":"string"},{"format":"date-time","type":"string"}],"description":"Item from input array at specified index.","title":"Output Value"}},"required":["output_value"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/GetItemFromArrayPiece","repository_id":176},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"id":493,"name":"YoutubeDownloadPiece","description":"Downloads content from youtube videos as audio or video files.","dependency":{"dockerfile":"Dockerfile_youtube","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group2","input_schema":{"$defs":{"OutputTypeType":{"enum":["audio","video"],"title":"OutputTypeType","type":"string"}},"description":"Input data for YoutubeDownloadPiece","properties":{"url":{"description":"The url of the video to be downloaded.","title":"Url","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"audio","description":"The type of output file to be downloaded."}},"required":["url"],"title":"YoutubeDownloadPiece","type":"object"},"output_schema":{"description":"Output data for YoutubeDownloadPiece","properties":{"message":{"default":"","description":"Output message to log","title":"Message","type":"string"},"file_path":{"description":"The path to the downloaded file","title":"File Path","type":"string"}},"required":["file_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/YoutubeDownloadPiece","repository_id":179},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"id":475,"name":"AudioTranscriptionPiece","description":"This Piece uses the OpenAI API to extract text transcripts from audio.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"OutputTypeType":{"description":"Output type for the result text","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"AudioTranscriptPiece input model","properties":{"audio_file_path":{"description":"The path to the audio file to process.","title":"Audio File Path","type":"string"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output for the result text"},"temperature":{"default":0.1,"description":"What sampling temperature to use, between 0 and 1","exclusiveMinimum":0,"maximum":1,"title":"Temperature","type":"number"}},"required":["audio_file_path"],"title":"AudioTranscriptionPiece","type":"object"},"output_schema":{"description":"AudioTranscriptPiece output model","properties":{"message":{"description":"Output message to log","title":"Message","type":"string"},"string_transcription_result":{"default":null,"description":"The result transcription text as a string.","title":"String Transcription Result","type":"string"},"file_path_transcription_result":{"default":null,"description":"The result transcription text as a file path.","title":"File Path Transcription Result","type":"string"}},"required":["message"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"AudioTranscriptPiece secret model","properties":{"OPENAI_API_KEY":{"description":"OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/AudioTranscriptionPiece","repository_id":177},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"id":480,"name":"TextSummarizerPiece","description":"This Piece runs a text summarizer using OpenAI API.","dependency":{"dockerfile":"Dockerfile_01","requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/openai_domino_pieces:0.6.0-group0","input_schema":{"$defs":{"LLMModelType":{"description":"OpenAI model type","enum":["gpt-3.5-turbo","gpt-4"],"title":"LLMModelType","type":"string"},"OutputTypeType":{"description":"Output type for the completion result","enum":["file","string","file_and_string"],"title":"OutputTypeType","type":"string"}},"description":"TextSummarizerPiece Input model","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text to summarize","required":false,"title":"Text"},"text_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Use it only if not using text field. File path to the text to summarize","required":false,"title":"Text File Path"},"output_type":{"allOf":[{"$ref":"#/$defs/OutputTypeType"}],"default":"string","description":"The type of output to return"},"openai_model":{"allOf":[{"$ref":"#/$defs/LLMModelType"}],"default":"gpt-3.5-turbo","description":"OpenAI model name to use for summarization"},"chunk_size":{"default":1000,"description":"Chunk size, measured in tokens, of each pre-summary chunk","title":"Chunk Size","type":"integer"},"chunk_overlap_rate":{"default":0.2,"description":"The percentage of overlap between each chunk","title":"Chunk Overlap Rate","type":"number"},"completion_max_tokens":{"default":500,"description":"The maximum number of tokens to generate in the summary.","title":"Completion Max Tokens","type":"integer"},"temperature":{"default":0.2,"description":"Temperature of the model, between 0 (more precise) and 1 (more creative)","title":"Temperature","type":"number"}},"title":"TextSummarizerPiece","type":"object"},"output_schema":{"description":"TextSummarizerPiece Output model","properties":{"string_summarized_text":{"default":null,"description":"summarized text","title":"String Summarized Text","type":"string"},"file_path_summarized_text":{"default":null,"description":"Path to summarized text file","title":"File Path Summarized Text","type":"string"}},"title":"OutputModel","type":"object"},"secrets_schema":{"description":"TextSummarizerPiece Secrets model","properties":{"OPENAI_API_KEY":{"description":"Your OpenAI API key","title":"Openai Api Key","type":"string"}},"required":["OPENAI_API_KEY"],"title":"SecretsModel","type":"object"},"style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/openai_domino_pieces/tree/main/pieces/TextSummarizerPiece","repository_id":177},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"id":488,"name":"EmailSenderPiece","description":"Email sender","dependency":{"dockerfile":null,"requirements_file":null},"source_image":"ghcr.io/tauffer-consulting/social_media_domino_pieces:0.4.3-group0","input_schema":{"$defs":{"InnerArgModel":{"description":"Inner argument model to use in the body and subject texts","properties":{"arg_name":{"title":"Arg Name","type":"string"},"arg_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}],"title":"Arg Value"}},"required":["arg_name","arg_value"],"title":"InnerArgModel","type":"object"},"ProviderType":{"enum":["gmail","outlook","office365","yahoo"],"title":"ProviderType","type":"string"}},"description":"Input data for EmailSenderPiece","properties":{"email_provider":{"allOf":[{"$ref":"#/$defs/ProviderType"}],"default":"gmail","description":"The email provider to use"},"email_receivers":{"description":"The receivers of the email, as comma-separated values","title":"Email Receivers","type":"string"},"email_subject":{"description":"The subject of the email.","title":"Email Subject","type":"string"},"subject_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the subject of the email","title":"Subject Args"},"email_body":{"description":"The body of the email.","title":"Email Body","type":"string"},"body_args":{"anyOf":[{"items":{"$ref":"#/$defs/InnerArgModel"},"type":"array"},{"type":"null"}],"default":null,"description":"List of arguments to insert into the body of the email","title":"Body Args"},"attachment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to the attachment file","title":"Attachment Path"}},"required":["email_receivers","email_subject","email_body"],"title":"EmailSenderPiece","type":"object"},"output_schema":{"description":"Output data for EmailSenderPiece","properties":{"message":{"default":"","description":"Output message to log.","title":"Message","type":"string"},"success":{"description":"The result of the email sending task.","title":"Success","type":"boolean"},"error":{"default":"","description":"The error message, if any.","title":"Error","type":"string"}},"required":["success"],"title":"OutputModel","type":"object"},"secrets_schema":{"description":"Secrets data for EmailSenderPiece","properties":{"EMAIL_SENDER_ACCOUNT":{"description":"The email sender account.","title":"Email Sender Account","type":"string"},"EMAIL_SENDER_PASSWORD":{"description":"The email sender password","title":"Email Sender Password","type":"string"}},"required":["EMAIL_SENDER_ACCOUNT","EMAIL_SENDER_PASSWORD"],"title":"SecretsModel","type":"object"},"style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"repository_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces","source_url":"https://github.com/Tauffer-Consulting/social_media_domino_pieces/tree/main/pieces/EmailSenderPiece","repository_id":179}},"workflowPiecesData":{"494_0f4005cd-d6c5-49ac-8111-f019bafb2250":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"channel_username":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"bbcnews"},"max_videos":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":10},"published_at_or_after":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"2023-11-01"},"published_at_or_before":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"order_by":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"date"},"video_duration":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"any"},"return_only_urls":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":true}}},"469_9d388791-b669-41b0-8983-36923286e964":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"input_array":{"fromUpstream":true,"upstreamId":"YoutubeLis_0f4005cdd6c549ac8111f019bafb2250","upstreamArgument":"videos_list","upstreamValue":"YoutubeListVideosPiece (0f4005cd) - Videos List","value":""},"index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"first"},"another_index":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1}}},"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"url":{"fromUpstream":true,"upstreamId":"GetItemFro_9d388791b66941b0898336923286e964","upstreamArgument":"output_value","upstreamValue":"GetItemFromArrayPiece (9d388791) - Output Value","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"audio"}}},"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"audio_file_path":{"fromUpstream":true,"upstreamId":"YoutubeDow_fa2a889d92994b63a0cde051b66d12aa","upstreamArgument":"file_path","upstreamValue":"YoutubeDownloadPiece (fa2a889d) - File Path","value":""},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"file"},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.1}}},"480_34d5b73b-34f8-46d5-a08a-24008c814b34":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"text":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null},"text_file_path":{"fromUpstream":true,"upstreamId":"AudioTrans_f7912cd832ef41668b1ed07190e5c52a","upstreamArgument":"file_path_transcription_result","upstreamValue":"AudioTranscriptionPiece (f7912cd8) - File Path Transcription Result","value":null},"output_type":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"string"},"openai_model":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gpt-3.5-turbo"},"chunk_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":1000},"chunk_overlap_rate":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2},"completion_max_tokens":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":500},"temperature":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.2}}},"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"email_provider":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gmail"},"email_receivers":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":""},"email_subject":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"Summary"},"subject_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"email_body":{"fromUpstream":true,"upstreamId":"TextSummar_34d5b73b34f846d5a08a24008c814b34","upstreamArgument":"string_summarized_text","upstreamValue":"TextSummarizerPiece (34d5b73b) - String Summarized Text","value":""},"body_args":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":[]},"attachment_path":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}}},"workflowNodes":[{"id":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","type":"CustomNode","position":{"x":188,"y":195.5},"data":{"name":"YoutubeListVideosPiece","style":{"module":"YoutubeListVideosPiece","label":"Youtube list videos","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-brands:youtube","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":188,"y":195.5},"dragging":false},{"id":"469_9d388791-b669-41b0-8983-36923286e964","type":"CustomNode","position":{"x":427,"y":213.5},"data":{"name":"GetItemFromArrayPiece","style":{"module":"GetItemFromArrayPiece","label":"Get Item From Array Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"fluent:tray-item-remove-24-filled","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":427,"y":213.5},"dragging":false},{"id":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","type":"CustomNode","position":{"x":688,"y":241.5},"data":{"name":"YoutubeDownloadPiece","style":{"module":"YoutubeDownloadPiece","label":"Youtube Download Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:download","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":688,"y":241.5},"dragging":false},{"id":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","type":"CustomNode","position":{"x":932,"y":276.5},"data":{"name":"AudioTranscriptionPiece","style":{"module":"AudioTranscriptionPiece","label":"OpenAI Audio Transcript","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:headset","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":932,"y":276.5},"dragging":false},{"id":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","type":"CustomNode","position":{"x":1165,"y":289.5},"data":{"name":"TextSummarizerPiece","style":{"module":"TextSummarizerPiece","label":"Text Summarizer","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:align-right","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":1165,"y":289.5},"dragging":false},{"id":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","type":"CustomNode","position":{"x":1446,"y":364.5},"data":{"name":"EmailSenderPiece","style":{"module":"EmailSenderPiece","label":"Email sender Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#ebebeb"},"useIcon":true,"iconClassName":"fa-solid:envelope","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"dragging":false}],"workflowEdges":[{"source":"494_0f4005cd-d6c5-49ac-8111-f019bafb2250","sourceHandle":"source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250","target":"469_9d388791-b669-41b0-8983-36923286e964","targetHandle":"target-469_9d388791-b669-41b0-8983-36923286e964","id":"reactflow__edge-494_0f4005cd-d6c5-49ac-8111-f019bafb2250source-494_0f4005cd-d6c5-49ac-8111-f019bafb2250-469_9d388791-b669-41b0-8983-36923286e964target-469_9d388791-b669-41b0-8983-36923286e964"},{"source":"469_9d388791-b669-41b0-8983-36923286e964","sourceHandle":"source-469_9d388791-b669-41b0-8983-36923286e964","target":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","targetHandle":"target-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","id":"reactflow__edge-469_9d388791-b669-41b0-8983-36923286e964source-469_9d388791-b669-41b0-8983-36923286e964-493_fa2a889d-9299-4b63-a0cd-e051b66d12aatarget-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa"},{"source":"493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","sourceHandle":"source-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa","target":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","targetHandle":"target-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","id":"reactflow__edge-493_fa2a889d-9299-4b63-a0cd-e051b66d12aasource-493_fa2a889d-9299-4b63-a0cd-e051b66d12aa-475_f7912cd8-32ef-4166-8b1e-d07190e5c52atarget-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a"},{"source":"475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","sourceHandle":"source-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a","target":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","targetHandle":"target-480_34d5b73b-34f8-46d5-a08a-24008c814b34","id":"reactflow__edge-475_f7912cd8-32ef-4166-8b1e-d07190e5c52asource-475_f7912cd8-32ef-4166-8b1e-d07190e5c52a-480_34d5b73b-34f8-46d5-a08a-24008c814b34target-480_34d5b73b-34f8-46d5-a08a-24008c814b34"},{"source":"480_34d5b73b-34f8-46d5-a08a-24008c814b34","sourceHandle":"source-480_34d5b73b-34f8-46d5-a08a-24008c814b34","target":"488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","targetHandle":"target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99","id":"reactflow__edge-480_34d5b73b-34f8-46d5-a08a-24008c814b34source-480_34d5b73b-34f8-46d5-a08a-24008c814b34-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99target-488_0bfa63e6-88a7-441d-ac1d-0490d0ba7f99"}]} diff --git a/rest/schemas/responses/piece.py b/rest/schemas/responses/piece.py index 88f81cda..e70ea934 100644 --- a/rest/schemas/responses/piece.py +++ b/rest/schemas/responses/piece.py @@ -13,4 +13,5 @@ class GetPiecesResponse(BaseModel): secrets_schema: Optional[Dict] = None style: Optional[Dict] = None source_url: Optional[str] = None + repository_url: str repository_id: int \ No newline at end of file diff --git a/rest/services/piece_service.py b/rest/services/piece_service.py index 56970e0d..1b5feb70 100644 --- a/rest/services/piece_service.py +++ b/rest/services/piece_service.py @@ -55,10 +55,10 @@ def list_pieces( repository_id=piece_repository_id, page=page, page_size=page_size, - filters=filters.dict(exclude_none=True), + filters=filters.model_dump(exclude_none=True), ) return [ - GetPiecesResponse(**piece.to_dict()) for piece in pieces + GetPiecesResponse(**piece.to_dict(),repository_url=piece_repository.url) for piece in pieces ] From 8a0e069009666eaf0d76f123ca845556aa31985b Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Fri, 24 Nov 2023 12:56:32 -0300 Subject: [PATCH 60/72] feat: add loading on install repositores modal --- .../components/DifferencesModal/index.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx index 3b78fd93..48db65a7 100644 --- a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx @@ -1,6 +1,7 @@ import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; import { Button, + CircularProgress, Grid, List, ListItem, @@ -12,7 +13,7 @@ import { import { Modal, type ModalRef } from "components/Modal"; import { useWorkspaces, usesPieces } from "context/workspaces"; import { type Differences } from "features/workflowEditor/utils/importWorkflow"; -import React, { forwardRef, useCallback, useMemo } from "react"; +import React, { forwardRef, useCallback, useMemo, useState } from "react"; import { Link } from "react-router-dom"; interface Props { @@ -23,6 +24,7 @@ export const DifferencesModal = forwardRef( ({ incompatiblesPieces }, ref) => { const { workspace } = useWorkspaces(); const { handleAddRepository } = usesPieces(); + const [buttonState, setButtonState] = useState<0 | 1 | 2>(0); const { installedPieces, uninstalledPieces } = useMemo(() => { return { @@ -40,7 +42,7 @@ export const DifferencesModal = forwardRef( source: "github", path: e.source, version: e.requiredVersion, - url: `http://github.com/${e.source}`, + url: `https://github.com/${e.source}`, }; handleAddRepository(addRepository) @@ -53,7 +55,13 @@ export const DifferencesModal = forwardRef( ); const handleInstallMissingRepositories = useCallback(async () => { - await Promise.allSettled(uninstalledPieces.map(installRepositories)); + await Promise.allSettled(uninstalledPieces.map(installRepositories)) + .then(() => { + setButtonState(2); + }) + .catch(() => { + setButtonState(0); + }); }, [installRepositories, uninstalledPieces]); return ( @@ -131,8 +139,11 @@ export const DifferencesModal = forwardRef( From 2084f6299985c6555a59eac7b7291aa23a81aa59 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Fri, 24 Nov 2023 14:58:52 -0300 Subject: [PATCH 61/72] fix loading --- .../components/DifferencesModal/index.tsx | 88 +++++++++++++------ 1 file changed, 60 insertions(+), 28 deletions(-) diff --git a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx index 48db65a7..eefea81e 100644 --- a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx @@ -1,3 +1,4 @@ +import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline"; import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; import { Button, @@ -15,16 +16,23 @@ import { useWorkspaces, usesPieces } from "context/workspaces"; import { type Differences } from "features/workflowEditor/utils/importWorkflow"; import React, { forwardRef, useCallback, useMemo, useState } from "react"; import { Link } from "react-router-dom"; +import { toast } from "react-toastify"; interface Props { incompatiblesPieces: Differences[]; } +enum installStateEnum { + notInstalled = 0, + installing = 1, + installed = 2, +} + export const DifferencesModal = forwardRef( ({ incompatiblesPieces }, ref) => { const { workspace } = useWorkspaces(); const { handleAddRepository } = usesPieces(); - const [buttonState, setButtonState] = useState<0 | 1 | 2>(0); + const [installState, setInstallState] = useState(0); const { installedPieces, uninstalledPieces } = useMemo(() => { return { @@ -36,7 +44,7 @@ export const DifferencesModal = forwardRef( }, [incompatiblesPieces]); const installRepositories = useCallback( - (e: Omit) => { + async (e: Omit) => { const addRepository = { workspace_id: workspace?.id ?? "", source: "github", @@ -45,23 +53,22 @@ export const DifferencesModal = forwardRef( url: `https://github.com/${e.source}`, }; - handleAddRepository(addRepository) - .catch((e) => { - console.log(e); - }) - .finally(() => {}); + return await handleAddRepository(addRepository).catch((e) => { + console.log(e); + }); }, [handleAddRepository], ); const handleInstallMissingRepositories = useCallback(async () => { - await Promise.allSettled(uninstalledPieces.map(installRepositories)) - .then(() => { - setButtonState(2); - }) - .catch(() => { - setButtonState(0); - }); + try { + setInstallState(1); + await Promise.all(uninstalledPieces.map(installRepositories)); + setInstallState(2); + } catch (e) { + toast.error(e as string); + setInstallState(0); + } }, [installRepositories, uninstalledPieces]); return ( @@ -113,21 +120,36 @@ export const DifferencesModal = forwardRef( key={`${item.source}-${item.requiredVersion}`} secondaryAction={ - - - - - Install {item.requiredVersion} - + {installState === 2 ? ( + <> + + + Installed {item.requiredVersion} + + + ) : ( + <> + + + + + Install {item.requiredVersion} + + + )} } > ))} @@ -139,11 +161,21 @@ export const DifferencesModal = forwardRef( From ef97045e98cce49aef5c78c9512737ea7b506e22 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Fri, 24 Nov 2023 14:59:57 -0300 Subject: [PATCH 62/72] update react-markdown --- frontend/package.json | 3 +- frontend/yarn.lock | 821 ++++++++++++++++++++++++++++-------------- 2 files changed, 554 insertions(+), 270 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 850fe044..52d2f0ac 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,11 +35,12 @@ "react-dom": "^18.2.0", "react-draggable": "^4.4.5", "react-hook-form": "^7.45.1", - "react-markdown": "^8.0.7", + "react-markdown": "9.0.0", "react-plotly.js": "^2.6.0", "react-router-dom": "^6.6.0", "react-toastify": "^9.1.1", "reactflow": "^11.4.0", + "remark-gfm": "^4.0.0", "swr": "^2.0.0", "typescript": "*", "uuid": "^9.0.0", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 67c14a0d..47005c9a 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1412,6 +1412,13 @@ dependencies: "@types/unist" "^2" +"@types/hast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + dependencies: + "@types/unist" "*" + "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": version "7.0.13" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" @@ -1422,12 +1429,12 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/mdast@^3.0.0": - version "3.0.13" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" - integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== +"@types/mdast@^4.0.0": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== dependencies: - "@types/unist" "^2" + "@types/unist" "*" "@types/ms@*": version "0.7.32" @@ -1454,7 +1461,7 @@ resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.1.tgz#aae6739d8f0d14a3bc9e6dd83e6d791ad75d4d76" integrity sha512-Q7jDsRbzcNHIQje15CS/piKhu6lMLb9jwjxSfEIi4KcFKXW23GoJMkwQiJ8VObyfx+VmUaDcJxXaWN+cTCjVog== -"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.7": +"@types/prop-types@*", "@types/prop-types@^15.7.7": version "15.7.8" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== @@ -1500,6 +1507,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + "@types/unist@^2", "@types/unist@^2.0.0": version "2.0.8" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" @@ -1652,6 +1664,11 @@ rehype "~12.0.1" rehype-prism-plus "1.6.3" +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@vitejs/plugin-react@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz#e4f56f46fd737c5d386bb1f1ade86ba275fe09bd" @@ -2634,10 +2651,12 @@ detect-kerning@^2.1.2: resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" dir-glob@^3.0.1: version "3.0.1" @@ -2939,6 +2958,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escodegen@^1.11.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -3874,6 +3898,21 @@ hast-util-to-html@^8.0.0: stringify-entities "^4.0.0" zwitch "^2.0.4" +hast-util-to-jsx-runtime@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz#ffd59bfcf0eb8321c6ed511bfc4b399ac3404bc2" + integrity sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + hast-util-to-parse5@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" @@ -3898,6 +3937,13 @@ hast-util-whitespace@^2.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + hastscript@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" @@ -3921,6 +3967,11 @@ hsluv@^0.0.3: resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" integrity sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ== +html-url-attributes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.0.tgz#fc4abf0c3fb437e2329c678b80abb3c62cff6f08" + integrity sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow== + html-void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" @@ -4482,11 +4533,6 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4534,6 +4580,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4603,58 +4654,151 @@ mapbox-gl@1.10.1: tinyqueue "^2.0.3" vt-pbf "^3.1.1" +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + math-log2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" integrity sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA== -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== +mdast-util-find-and-replace@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" -mdast-util-to-hast@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" - integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" + integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" -mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== dependencies: - "@types/mdast" "^3.0.0" + "@types/mdast" "^4.0.0" merge-stream@^2.0.0: version "2.0.0" @@ -4666,199 +4810,278 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== dependencies: decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== +micromark-extension-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-space@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" - integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== +micromark-extension-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-types "^2.0.0" -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-character@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" - integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== dependencies: - micromark-util-symbol "^1.0.0" + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== dependencies: - micromark-util-symbol "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== dependencies: decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== dependencies: - micromark-util-symbol "^1.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== dependencies: - micromark-util-types "^1.0.0" + micromark-util-types "^2.0.0" -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-symbol@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" - integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" - integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" micromatch@^4.0.4: version "4.0.5" @@ -4940,11 +5163,6 @@ mouse-wheel@^1.2.0: signum "^1.0.0" to-px "^1.0.1" -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5458,7 +5676,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -5547,31 +5765,27 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0, react-is@^18.2.0: +react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-markdown@^8.0.7: - version "8.0.7" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" - integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== - dependencies: - "@types/hast" "^2.0.0" - "@types/prop-types" "^15.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^2.0.0" - prop-types "^15.0.0" - property-information "^6.0.0" - react-is "^18.0.0" - remark-parse "^10.0.0" - remark-rehype "^10.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" +react-markdown@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.0.tgz#7a41bde9e1b0b1d6911f6f9f8c3cdb4a3e9f9328" + integrity sha512-v6yNf3AB8GfJ8lCpUvzxAXKxgsHpdmWPlcVRQ6Nocsezp255E/IDrF31kLQsPJeB/cKto/geUwjU36wH784FCA== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + micromark-util-sanitize-uri "^2.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" react-plotly.js@^2.6.0: version "2.6.0" @@ -5830,24 +6044,47 @@ rehype@~12.0.1: rehype-stringify "^9.0.0" unified "^10.0.0" -remark-parse@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" - integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" -remark-rehype@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" reselect@^4.1.8: version "4.1.8" @@ -5937,13 +6174,6 @@ rw@^1.3.3: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - safe-array-concat@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" @@ -6617,6 +6847,19 @@ unified@^10.0.0: trough "^2.0.0" vfile "^5.0.0" +unified@^11.0.0: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + unist-util-filter@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/unist-util-filter/-/unist-util-filter-4.0.1.tgz#fd885dd48adaad345de5f5dc706ec4ff44a8d074" @@ -6626,11 +6869,6 @@ unist-util-filter@^4.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.0.0" -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - unist-util-is@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" @@ -6638,6 +6876,13 @@ unist-util-is@^5.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-position@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" @@ -6645,6 +6890,13 @@ unist-util-position@^4.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" @@ -6652,6 +6904,13 @@ unist-util-stringify-position@^3.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: version "5.1.3" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" @@ -6660,6 +6919,14 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" @@ -6669,6 +6936,15 @@ unist-util-visit@^4.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + unplugin@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.5.0.tgz#8938ae84defe62afc7757df9ca05d27160f6c20c" @@ -6724,16 +7000,6 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - vfile-location@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" @@ -6750,6 +7016,14 @@ vfile-message@^3.0.0: "@types/unist" "^2.0.0" unist-util-stringify-position "^3.0.0" +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile@^5.0.0: version "5.3.7" resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" @@ -6760,6 +7034,15 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +vfile@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + vite-plugin-svgr@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz#9b14953955e79893ea7718089b9777a494e38fc6" From a345339b4401cb1602ee0b857846cc3d41b17eb0 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Fri, 24 Nov 2023 15:01:06 -0300 Subject: [PATCH 63/72] update react markdown version --- .../components/WorkflowDetail/CustomTabMenu/TaskResult.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx b/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx index 8312ca32..a1bf4a37 100644 --- a/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx +++ b/frontend/src/features/myWorkflows/components/WorkflowDetail/CustomTabMenu/TaskResult.tsx @@ -2,6 +2,7 @@ import { CircularProgress, Container, Typography } from "@mui/material"; import { type CSSProperties } from "react"; import ReactMarkdown from "react-markdown"; import Plot from "react-plotly.js"; +import remarkGfm from "remark-gfm"; import "./styles.css"; // import { PDFViewer, Page, Text, View, Document, StyleSheet } from '@react-pdf/renderer'; @@ -68,7 +69,10 @@ export const TaskResult = (props: ITaskResultProps) => { style={{ overflow: "auto", maxWidth: "100%", width: "100%" }} className="markdown-container" > - + {window.atob(base64_content)} ; From d4a0a52a57d4a0181be393285f6d8b22b099eea4 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Fri, 24 Nov 2023 15:17:27 -0300 Subject: [PATCH 64/72] random forest workflow --- .../components/WorkflowExamplesGalleryModal/index.tsx | 10 +++++++++- .../utils/workflows/random_forest_pipeline.json | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 frontend/src/features/workflowEditor/utils/workflows/random_forest_pipeline.json diff --git a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx index 0a5fafcb..b34acc9d 100644 --- a/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/WorkflowExamplesGalleryModal/index.tsx @@ -14,6 +14,7 @@ import { forwardRef, type ForwardedRef, useState } from "react"; import DimensionalityReductionWorkflow from "../../utils/workflows/dimensionality_reduction.json"; import ImageFilterWorkflow from "../../utils/workflows/image_filter_workflow.json"; import NasaImageWorkflow from "../../utils/workflows/nasa_workflow.json"; +import RandomForestClassifierWorkflow from "../../utils/workflows/random_forest_pipeline.json"; import YoutubeSummarizerWorkflow from "../../utils/workflows/youtube_summarizer.json"; interface WorkflowGalleryModalRef extends ModalRef {} @@ -52,10 +53,17 @@ const WorkflowExamplesGalleryModal = forwardRef( { title: "Dimensionality Reduction", description: - "A workflow that applies dimensionality reduction to a dataset. To use it, you must use Shared Storage", + "A workflow that applies dimensionality reduction to a dataset. To use it, you must use Shared Storage.", jsonFile: DimensionalityReductionWorkflow, levelTag: "Intermediate", }, + { + title: "Random Forest Classifier", + description: + "A machine learning workflow to train a random forest and use it to predict a new data. To use it, you must use Shared Storage", + jsonFile: RandomForestClassifierWorkflow, + levelTag: "Intermediate", + }, ]; const levelTagMap: any = { diff --git a/frontend/src/features/workflowEditor/utils/workflows/random_forest_pipeline.json b/frontend/src/features/workflowEditor/utils/workflows/random_forest_pipeline.json new file mode 100644 index 00000000..4e3cffb3 --- /dev/null +++ b/frontend/src/features/workflowEditor/utils/workflows/random_forest_pipeline.json @@ -0,0 +1 @@ +{"workflowPieces":{"2283_b524fe96-9706-4dd7-8b0c-26e83b30202d":{"id":2283,"name":"InferenceModelPiece","description":"Load a trained model and use it to make predictions on new data.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"Data path to inference on.","from_upstream":"always","title":"Data path","type":"string"},"model_path":{"description":"Path to the model to use for inference.","from_upstream":"always","title":"Model path","type":"string"}},"required":["data_path","model_path"],"title":"InferenceModelPiece","type":"object"},"output_schema":{"properties":{"data_path":{"title":"Data Path","type":"string"}},"required":["data_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"InferenceModelPiece","label":"Inference Model Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"carbon:machine-learning-model","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/InferenceModelPiece","repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","repository_id":517},"2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1":{"id":2276,"name":"TrainRandomForestClassifierPiece","description":"Train a Random Forest Classifier model over the input data.","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"$defs":{"Criterion":{"enum":["gini","entropy","log_loss"],"title":"Criterion","type":"string"}},"properties":{"train_data_path":{"description":"The path to the train data to train the data.","from_upstream":"always","title":"Train Data Path","type":"string"},"n_estimators":{"default":100,"description":"The number of trees in the forest.","title":"Number of Estimators","type":"integer"},"criterion":{"allOf":[{"$ref":"#/$defs/Criterion"}],"default":"gini","description":"The function to measure the quality of a split.","title":"Criterion"},"max_depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum depth of the tree.","title":"Max Depth"}},"required":["train_data_path"],"title":"TrainRandomForestClassifierPiece","type":"object"},"output_schema":{"properties":{"random_forest_model_path":{"title":"Random Forest Model Path","type":"string"}},"required":["random_forest_model_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TrainRandomForestClassifierPiece","label":"Train Random Forest Classifier Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"carbon:machine-learning-model","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TrainRandomForestClassifierPiece","repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","repository_id":517},"2280_9d3f64bf-5681-43fe-af79-da7cc08768c0":{"id":2280,"name":"TrainTestSplitPiece","description":"Split data into train and test sets","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0","input_schema":{"properties":{"data_path":{"description":"The path to the data to be split.","from_upstream":"always","title":"Data Path","type":"string"},"test_data_size":{"default":0.8,"description":"The size (%) of the test data.","title":"Test Data Size","type":"number"},"random_state":{"default":42,"description":"The random state for the split.","title":"Random State","type":"integer"}},"required":["data_path"],"title":"TrainTestSplitPiece","type":"object"},"output_schema":{"properties":{"train_data_path":{"title":"Train Data Path","type":"string"},"test_data_path":{"title":"Test Data Path","type":"string"}},"required":["train_data_path","test_data_path"],"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"TrainTestSplitPiece","label":"Split Data","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"icon-park-outline:split","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/TrainTestSplitPiece","repository_url":"https://github.com/Tauffer-Consulting/ml_domino_pieces","repository_id":517},"2228_97944871-206b-4a4a-b64b-79d8557d11db":{"id":2228,"name":"ToyDatasetsPiece","description":"Load toy datasets from scikit-learn","dependency":{"dockerfile":null,"requirements_file":"requirements_0.txt"},"source_image":"ghcr.io/tauffer-consulting/default_domino_pieces:development-group0","input_schema":{"$defs":{"DatasetName":{"enum":["iris","diabetes","digits","wine","breast_cancer","linnerrud"],"title":"DatasetName","type":"string"}},"properties":{"dataset":{"allOf":[{"$ref":"#/$defs/DatasetName"}],"default":"iris","title":"Dataset name"}},"title":"ToyDatasetsPiece","type":"object"},"output_schema":{"properties":{"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"File path"}},"title":"OutputModel","type":"object"},"secrets_schema":null,"style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"source_url":"https://github.com/Tauffer-Consulting/default_domino_pieces/tree/main/pieces/ToyDatasetsPiece","repository_url":"https://github.com/Tauffer-Consulting/default_domino_pieces","repository_id":509}},"workflowPiecesData":{"2283_b524fe96-9706-4dd7-8b0c-26e83b30202d":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"TrainTestS_9d3f64bf568143feaf79da7cc08768c0","upstreamArgument":"test_data_path","upstreamValue":"TrainTestSplitPiece (9d3f64bf) - Test Data Path","value":""},"model_path":{"fromUpstream":true,"upstreamId":"TrainRando_7c224ef73cd0436ab4a7033dba4f9ed1","upstreamArgument":"random_forest_model_path","upstreamValue":"TrainRandomForestClassifierPiece (7c224ef7) - Random Forest Model Path","value":""}}},"2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"train_data_path":{"fromUpstream":true,"upstreamId":"TrainTestS_9d3f64bf568143feaf79da7cc08768c0","upstreamArgument":"train_data_path","upstreamValue":"TrainTestSplitPiece (9d3f64bf) - Train Data Path","value":""},"n_estimators":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":100},"criterion":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"gini"},"max_depth":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":null}}},"2280_9d3f64bf-5681-43fe-af79-da7cc08768c0":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"data_path":{"fromUpstream":true,"upstreamId":"ToyDataset_97944871206b4a4ab64b79d8557d11db","upstreamArgument":"file_path","upstreamValue":"ToyDatasetsPiece (97944871) - File path","value":""},"test_data_size":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":0.8},"random_state":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":42}}},"2228_97944871-206b-4a4a-b64b-79d8557d11db":{"storage":{"storageAccessMode":"Read/Write"},"containerResources":{"cpu":{"min":100,"max":100},"memory":{"min":128,"max":128},"useGpu":false},"inputs":{"dataset":{"fromUpstream":false,"upstreamId":"","upstreamArgument":"","upstreamValue":"","value":"iris"}}}},"workflowNodes":[{"id":"2283_b524fe96-9706-4dd7-8b0c-26e83b30202d","type":"CustomNode","position":{"x":647,"y":-34.666666666666664},"data":{"name":"InferenceModelPiece","style":{"module":"InferenceModelPiece","label":"Inference Model Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"carbon:machine-learning-model","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":true,"positionAbsolute":{"x":868,"y":294.5},"dragging":false},{"id":"2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1","type":"CustomNode","position":{"x":388.7955801104973,"y":-164.65745856353595},"data":{"name":"TrainRandomForestClassifierPiece","style":{"module":"TrainRandomForestClassifierPiece","label":"Train Random Forest Classifier Piece","nodeType":"default","nodeStyle":{"backgroundColor":"#38b2be"},"useIcon":true,"iconClassName":"carbon:machine-learning-model","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":388.7955801104973,"y":-164.65745856353595},"dragging":false},{"id":"2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","type":"CustomNode","position":{"x":147,"y":-34.666666666666664},"data":{"name":"TrainTestSplitPiece","style":{"module":"TrainTestSplitPiece","label":"Split Data","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"icon-park-outline:split","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":347,"y":354.5},"dragging":false},{"id":"2228_97944871-206b-4a4a-b64b-79d8557d11db","type":"CustomNode","position":{"x":-103,"y":-34.666666666666664},"data":{"name":"ToyDatasetsPiece","style":{"module":"ToyDatasetsPiece","label":"Toy Datasets","nodeType":"default","nodeStyle":{"backgroundColor":"#b3cde8"},"useIcon":true,"iconClassName":"lucide:toy-brick","iconStyle":{"cursor":"pointer"}},"validationError":false,"orientation":"horizontal"},"width":150,"height":70,"selected":false,"positionAbsolute":{"x":31,"y":246.5},"dragging":false}],"workflowEdges":[{"source":"2228_97944871-206b-4a4a-b64b-79d8557d11db","sourceHandle":"source-2228_97944871-206b-4a4a-b64b-79d8557d11db","target":"2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","targetHandle":"target-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","id":"reactflow__edge-2228_97944871-206b-4a4a-b64b-79d8557d11dbsource-2228_97944871-206b-4a4a-b64b-79d8557d11db-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0target-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0"},{"source":"2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","sourceHandle":"source-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","target":"2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1","targetHandle":"target-2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1","id":"reactflow__edge-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0source-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0-2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1target-2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1"},{"source":"2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","sourceHandle":"source-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0","target":"2283_b524fe96-9706-4dd7-8b0c-26e83b30202d","targetHandle":"target-2283_b524fe96-9706-4dd7-8b0c-26e83b30202d","id":"reactflow__edge-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0source-2280_9d3f64bf-5681-43fe-af79-da7cc08768c0-2283_b524fe96-9706-4dd7-8b0c-26e83b30202dtarget-2283_b524fe96-9706-4dd7-8b0c-26e83b30202d"},{"source":"2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1","sourceHandle":"source-2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1","target":"2283_b524fe96-9706-4dd7-8b0c-26e83b30202d","targetHandle":"target-2283_b524fe96-9706-4dd7-8b0c-26e83b30202d","id":"reactflow__edge-2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1source-2276_7c224ef7-3cd0-436a-b4a7-033dba4f9ed1-2283_b524fe96-9706-4dd7-8b0c-26e83b30202dtarget-2283_b524fe96-9706-4dd7-8b0c-26e83b30202d"}]} \ No newline at end of file From 7e2a02d6db3072deb1123d626d64e5d5c3fee91a Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Fri, 24 Nov 2023 19:44:21 -0300 Subject: [PATCH 65/72] revert changes on docker_operator 9f32c07 --- src/domino/custom_operators/docker_operator.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/domino/custom_operators/docker_operator.py b/src/domino/custom_operators/docker_operator.py index b7d0bca4..cfcb8bdb 100644 --- a/src/domino/custom_operators/docker_operator.py +++ b/src/domino/custom_operators/docker_operator.py @@ -55,16 +55,16 @@ def __init__( mounts = [] # TODO remove - used in DEV only ####################### - dev_pieces = TRUE + dev_pieces = False if dev_pieces: piece_repo_name = repository_url.split("/")[-1] - # local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" - local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" + local_repos_path = f"/mnt/shared_storage/Github/{piece_repo_name}" + # local_repos_path = f"/home/vinicius/Documents/work/tauffer/{piece_repo_name}" mounts = [ # TODO remove - Mount(source='/Users/nathan/Developer/Tauffer-Consulting/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), + # Mount(source='/home/vinicius/Documents/work/tauffer/domino/src/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), Mount(source='/mnt/shared_storage/Github/domino', target='/usr/local/lib/python3.10/site-packages/domino/', type='bind', read_only=True), - # Mount(source=local_repos_path, target='/home/domino/pieces_repository/', type='bind', read_only=True), + Mount(source=local_repos_path, target='/home/domino/pieces_repository/', type='bind', read_only=True), ] ######################################################## From 67b4a0e3672762b6175eb436e305cfe645fbe6b6 Mon Sep 17 00:00:00 2001 From: Nathan Vieira Marcelino Date: Fri, 24 Nov 2023 19:44:49 -0300 Subject: [PATCH 66/72] fix: clear modal state onClose --- frontend/src/components/Modal/index.tsx | 7 ++++++- .../workflowEditor/components/DifferencesModal/index.tsx | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Modal/index.tsx b/frontend/src/components/Modal/index.tsx index 3b3a48bd..765e5ed3 100644 --- a/frontend/src/components/Modal/index.tsx +++ b/frontend/src/components/Modal/index.tsx @@ -18,6 +18,7 @@ interface Props { fullWidth?: boolean; confirmFn?: () => void; cancelFn?: () => void; + onClose?: () => void; confirmText?: string; cancelText?: string; } @@ -30,6 +31,7 @@ export interface ModalRef { export const Modal = React.forwardRef( ( { + onClose, cancelFn, confirmFn, title, @@ -51,9 +53,12 @@ export const Modal = React.forwardRef( if (cancelFn) { cancelFn(); } + if (onClose) { + onClose(); + } setIsOpen(false); - }, [cancelFn]); + }, [cancelFn, onClose]); const handleConfirm = useCallback(() => { if (confirmFn) { diff --git a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx index eefea81e..1a216ed1 100644 --- a/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx +++ b/frontend/src/features/workflowEditor/components/DifferencesModal/index.tsx @@ -182,6 +182,9 @@ export const DifferencesModal = forwardRef( )} } + onClose={() => { + setInstallState(0); + }} ref={ref} /> ); From 6dc4ece6191bb8f6e5c93a3a12c8dc33766cf9cc Mon Sep 17 00:00:00 2001 From: luiz Date: Mon, 27 Nov 2023 09:41:23 +0100 Subject: [PATCH 67/72] link to gallery --- .../components/workspaceSettings/RepositoriesCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx b/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx index 926b5db5..aed30a90 100644 --- a/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx +++ b/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx @@ -194,7 +194,7 @@ export const RepositoriesCard: FC = () => { - Add repository + Add repository by URL. To discover available Pieces repositories, visit the Pieces gallery. Date: Mon, 27 Nov 2023 10:23:44 +0100 Subject: [PATCH 68/72] pieces --- .../components/workspaceSettings/RepositoriesCard.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx b/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx index aed30a90..5b5f1081 100644 --- a/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx +++ b/frontend/src/features/workspaces/components/workspaceSettings/RepositoriesCard.tsx @@ -188,13 +188,13 @@ export const RepositoriesCard: FC = () => { return ( - Add repository by URL. To discover available Pieces repositories, visit the Pieces gallery. + Add Pieces repository by URL. To discover available Pieces repositories, visit the Pieces gallery. Date: Mon, 27 Nov 2023 10:31:29 +0100 Subject: [PATCH 69/72] version and changelog --- CHANGELOG.md | 10 +++++++++- src/domino/VERSION | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd9285ae..b04b797b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,15 @@ -# v0.7.1 +# v0.8.0 ### Features * Improved terminal messages for `domino platform run-compose` and `domino platform stop-compose` CLI. +* Workflows gallery with more examples and easy installation fo repositories. +* Create default user `admin@email.com`, password `admin`. +* Search on Pieces bar. +* Allow for optional secrets. + +### Fixes +* Fix validation bugs. +* Fix token expiration date bug. # v0.7.0 diff --git a/src/domino/VERSION b/src/domino/VERSION index 7deb86fe..8adc70fd 100644 --- a/src/domino/VERSION +++ b/src/domino/VERSION @@ -1 +1 @@ -0.7.1 \ No newline at end of file +0.8.0 \ No newline at end of file From 96fca8f8a071ce23cc573e721f14a40c9bece94c Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 08:02:26 -0300 Subject: [PATCH 70/72] changelog --- CHANGELOG.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b04b797b..684b6eb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,21 @@ # v0.8.0 ### Features -* Improved terminal messages for `domino platform run-compose` and `domino platform stop-compose` CLI. +* Install missing repositories from Workflows Gallery modal when importing a workflow [PR #180]. +* Create default user `admin@email.com`, password `admin` when platform is created [Issue #177]. +* Add search bar for Pieces in Workflows Editor page [Issue #168]. * Workflows gallery with more examples and easy installation fo repositories. -* Create default user `admin@email.com`, password `admin`. -* Search on Pieces bar. -* Allow for optional secrets. +* Installing multiple repositories on a new workspace if platform `github_token` provide. + ### Fixes +* Improved terminal messages for `domino platform run-compose` and `domino platform stop-compose` CLI. +* Add optional platform level github token in `run-in-compose` CLI [Issue #176]. +* Fix token expiration date bug [Issue #147]. * Fix validation bugs. -* Fix token expiration date bug. +* Performance improved on `create_piece_repository` +* Allow for optional secrets. + # v0.7.0 From 1c51df276f49408b966c056207422dba53a6dfaf Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 08:08:40 -0300 Subject: [PATCH 71/72] fixture --- rest/tests/piece/fixtures.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rest/tests/piece/fixtures.py b/rest/tests/piece/fixtures.py index e9865f3f..fbd096fd 100644 --- a/rest/tests/piece/fixtures.py +++ b/rest/tests/piece/fixtures.py @@ -45,6 +45,7 @@ def get_pieces_mock_response(piece_repository: PieceRepository): "dockerfile": "", "requirements_file": "requirements_0.txt" }, + repository_url='https://github.com/Tauffer-Consulting/default_domino_pieces_tests', source_url='https://github.com/Tauffer-Consulting/default_domino_pieces_tests/tree/main/pieces/SimpleLogPiece', source_image = "ghcr.io/tauffer-consulting/default_domino_pieces_tests:0.0.3-group0", input_schema = { From cdcfcac02de6c5ce72b01de45bd9da35e016f021 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 08:22:30 -0300 Subject: [PATCH 72/72] fix url --- rest/tests/conftest.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rest/tests/conftest.py b/rest/tests/conftest.py index 82e35d67..8e45f8bf 100644 --- a/rest/tests/conftest.py +++ b/rest/tests/conftest.py @@ -7,11 +7,11 @@ def pytest_collection_modifyitems(items): CLASS_ORDER = [ - "TestAuthRouter", - "TestWorkspaceRouter", - "TestPieceRepositoryRouter", - "TestPieceRouter", - "TestSecretRouter", + "TestAuthRouter", + "TestWorkspaceRouter", + "TestPieceRepositoryRouter", + "TestPieceRouter", + "TestSecretRouter", "TestWorkflowRouter", "TestUserRouter" ] @@ -26,7 +26,7 @@ def pytest_collection_modifyitems(items): @pytest.fixture(scope="session") def client(): base_url = os.environ.get('TESTS_API_URL', 'http://localhost/api') - with ApiTestClient(base_url=base_url) as c: + with ApiTestClient(base_url=base_url) as c: yield c @pytest.fixture(scope="session") @@ -57,7 +57,7 @@ def piece_repository(): path="Tauffer-Consulting/default_domino_pieces_tests", version="0.0.3", workspace_id=1, - url='https://github.com/Tauffer-Consulting/default_domino_pieces' + url='https://github.com/Tauffer-Consulting/default_domino_pieces_tests' ) @pytest.fixture(scope="class")