diff --git a/api/commands.py b/api/commands.py
index b82f7ac3f88f1b..09e69e4886c64c 100644
--- a/api/commands.py
+++ b/api/commands.py
@@ -15,36 +15,75 @@
from models.account import Tenant
from models.dataset import Dataset, DatasetCollectionBinding, DocumentSegment
from models.dataset import Document as DatasetDocument
-from models.model import Account, App, AppAnnotationSetting, AppMode, Conversation, MessageAnnotation
+from models.model import (
+ Account,
+ App,
+ AppAnnotationSetting,
+ AppMode,
+ Conversation,
+ MessageAnnotation,
+)
from models.provider import Provider, ProviderModel
+from services.account_service import RegisterService
-@click.command('reset-password', help='Reset the account password.')
-@click.option('--email', prompt=True, help='The email address of the account whose password you need to reset')
-@click.option('--new-password', prompt=True, help='the new password.')
-@click.option('--password-confirm', prompt=True, help='the new password confirm.')
+@click.command("register", help="Register a new accout")
+@click.option("--email", prompt=True, help="The email address of the account you want to register")
+@click.option("--name", prompt=True, help="The name of the account you want to register")
+@click.option("--password", prompt=True, help="The password of the account you want to register")
+def register(email, name, password):
+ """
+ Register a new accout
+ """
+ try:
+ email_validate(email)
+ except:
+ click.echo(click.style("sorry. {} is not a valid email. ".format(email), fg="red"))
+ return
+
+ try:
+ valid_password(password)
+ except:
+ click.echo(click.style("sorry. The passwords must match {} ".format(password_pattern), fg="red"))
+ return
+
+ account = db.session.query(Account).filter(Account.email == email).one_or_none()
+
+ if account:
+ click.echo(click.style("sorry. the account: [{}] already exists .".format(email), fg="red"))
+ return
+
+ account = RegisterService.register(email, name, password)
+ click.echo(click.style("Congratulations!, account has been registered.", fg="green"))
+
+
+@click.command("reset-password", help="Reset the account password.")
+@click.option(
+ "--email",
+ prompt=True,
+ help="The email address of the account whose password you need to reset",
+)
+@click.option("--new-password", prompt=True, help="the new password.")
+@click.option("--password-confirm", prompt=True, help="the new password confirm.")
def reset_password(email, new_password, password_confirm):
"""
Reset password of owner account
Only available in SELF_HOSTED mode
"""
if str(new_password).strip() != str(password_confirm).strip():
- click.echo(click.style('sorry. The two passwords do not match.', fg='red'))
+ click.echo(click.style("sorry. The two passwords do not match.", fg="red"))
return
- account = db.session.query(Account). \
- filter(Account.email == email). \
- one_or_none()
+ account = db.session.query(Account).filter(Account.email == email).one_or_none()
if not account:
- click.echo(click.style('sorry. the account: [{}] not exist .'.format(email), fg='red'))
+ click.echo(click.style("sorry. the account: [{}] not exist .".format(email), fg="red"))
return
try:
valid_password(new_password)
except:
- click.echo(
- click.style('sorry. The passwords must match {} '.format(password_pattern), fg='red'))
+ click.echo(click.style("sorry. The passwords must match {} ".format(password_pattern), fg="red"))
return
# generate password salt
@@ -57,80 +96,102 @@ def reset_password(email, new_password, password_confirm):
account.password = base64_password_hashed
account.password_salt = base64_salt
db.session.commit()
- click.echo(click.style('Congratulations!, password has been reset.', fg='green'))
+ click.echo(click.style("Congratulations!, password has been reset.", fg="green"))
-@click.command('reset-email', help='Reset the account email.')
-@click.option('--email', prompt=True, help='The old email address of the account whose email you need to reset')
-@click.option('--new-email', prompt=True, help='the new email.')
-@click.option('--email-confirm', prompt=True, help='the new email confirm.')
+@click.command("reset-email", help="Reset the account email.")
+@click.option(
+ "--email",
+ prompt=True,
+ help="The old email address of the account whose email you need to reset",
+)
+@click.option("--new-email", prompt=True, help="the new email.")
+@click.option("--email-confirm", prompt=True, help="the new email confirm.")
def reset_email(email, new_email, email_confirm):
"""
Replace account email
:return:
"""
if str(new_email).strip() != str(email_confirm).strip():
- click.echo(click.style('Sorry, new email and confirm email do not match.', fg='red'))
+ click.echo(click.style("Sorry, new email and confirm email do not match.", fg="red"))
return
- account = db.session.query(Account). \
- filter(Account.email == email). \
- one_or_none()
+ account = db.session.query(Account).filter(Account.email == email).one_or_none()
if not account:
- click.echo(click.style('sorry. the account: [{}] not exist .'.format(email), fg='red'))
+ click.echo(click.style("sorry. the account: [{}] not exist .".format(email), fg="red"))
return
try:
email_validate(new_email)
except:
- click.echo(
- click.style('sorry. {} is not a valid email. '.format(email), fg='red'))
+ click.echo(click.style("sorry. {} is not a valid email. ".format(email), fg="red"))
return
account.email = new_email
db.session.commit()
- click.echo(click.style('Congratulations!, email has been reset.', fg='green'))
-
-
-@click.command('reset-encrypt-key-pair', help='Reset the asymmetric key pair of workspace for encrypt LLM credentials. '
- 'After the reset, all LLM credentials will become invalid, '
- 'requiring re-entry.'
- 'Only support SELF_HOSTED mode.')
-@click.confirmation_option(prompt=click.style('Are you sure you want to reset encrypt key pair?'
- ' this operation cannot be rolled back!', fg='red'))
+ click.echo(click.style("Congratulations!, email has been reset.", fg="green"))
+
+
+@click.command(
+ "reset-encrypt-key-pair",
+ help="Reset the asymmetric key pair of workspace for encrypt LLM credentials. "
+ "After the reset, all LLM credentials will become invalid, "
+ "requiring re-entry."
+ "Only support SELF_HOSTED mode.",
+)
+@click.confirmation_option(
+ prompt=click.style(
+ "Are you sure you want to reset encrypt key pair?" " this operation cannot be rolled back!",
+ fg="red",
+ )
+)
def reset_encrypt_key_pair():
"""
Reset the encrypted key pair of workspace for encrypt LLM credentials.
After the reset, all LLM credentials will become invalid, requiring re-entry.
Only support SELF_HOSTED mode.
"""
- if current_app.config['EDITION'] != 'SELF_HOSTED':
- click.echo(click.style('Sorry, only support SELF_HOSTED mode.', fg='red'))
+ if current_app.config["EDITION"] != "SELF_HOSTED":
+ click.echo(click.style("Sorry, only support SELF_HOSTED mode.", fg="red"))
return
tenants = db.session.query(Tenant).all()
for tenant in tenants:
if not tenant:
- click.echo(click.style('Sorry, no workspace found. Please enter /install to initialize.', fg='red'))
+ click.echo(
+ click.style(
+ "Sorry, no workspace found. Please enter /install to initialize.",
+ fg="red",
+ )
+ )
return
tenant.encrypt_public_key = generate_key_pair(tenant.id)
- db.session.query(Provider).filter(Provider.provider_type == 'custom', Provider.tenant_id == tenant.id).delete()
+ db.session.query(Provider).filter(Provider.provider_type == "custom", Provider.tenant_id == tenant.id).delete()
db.session.query(ProviderModel).filter(ProviderModel.tenant_id == tenant.id).delete()
db.session.commit()
- click.echo(click.style('Congratulations! '
- 'the asymmetric key pair of workspace {} has been reset.'.format(tenant.id), fg='green'))
-
-
-@click.command('vdb-migrate', help='migrate vector db.')
-@click.option('--scope', default='all', prompt=False, help='The scope of vector database to migrate, Default is All.')
+ click.echo(
+ click.style(
+ "Congratulations! " "the asymmetric key pair of workspace {} has been reset.".format(tenant.id),
+ fg="green",
+ )
+ )
+
+
+@click.command("vdb-migrate", help="migrate vector db.")
+@click.option(
+ "--scope",
+ default="all",
+ prompt=False,
+ help="The scope of vector database to migrate, Default is All.",
+)
def vdb_migrate(scope: str):
- if scope in ['knowledge', 'all']:
+ if scope in ["knowledge", "all"]:
migrate_knowledge_vector_database()
- if scope in ['annotation', 'all']:
+ if scope in ["annotation", "all"]:
migrate_annotation_vector_database()
@@ -138,7 +199,7 @@ def migrate_annotation_vector_database():
"""
Migrate annotation datas to target vector database .
"""
- click.echo(click.style('Start migrate annotation data.', fg='green'))
+ click.echo(click.style("Start migrate annotation data.", fg="green"))
create_count = 0
skipped_count = 0
total_count = 0
@@ -146,42 +207,48 @@ def migrate_annotation_vector_database():
while True:
try:
# get apps info
- apps = db.session.query(App).filter(
- App.status == 'normal'
- ).order_by(App.created_at.desc()).paginate(page=page, per_page=50)
+ apps = (
+ db.session.query(App)
+ .filter(App.status == "normal")
+ .order_by(App.created_at.desc())
+ .paginate(page=page, per_page=50)
+ )
except NotFound:
break
page += 1
for app in apps:
total_count = total_count + 1
- click.echo(f'Processing the {total_count} app {app.id}. '
- + f'{create_count} created, {skipped_count} skipped.')
+ click.echo(
+ f"Processing the {total_count} app {app.id}. " + f"{create_count} created, {skipped_count} skipped."
+ )
try:
- click.echo('Create app annotation index: {}'.format(app.id))
- app_annotation_setting = db.session.query(AppAnnotationSetting).filter(
- AppAnnotationSetting.app_id == app.id
- ).first()
+ click.echo("Create app annotation index: {}".format(app.id))
+ app_annotation_setting = (
+ db.session.query(AppAnnotationSetting).filter(AppAnnotationSetting.app_id == app.id).first()
+ )
if not app_annotation_setting:
skipped_count = skipped_count + 1
- click.echo('App annotation setting is disabled: {}'.format(app.id))
+ click.echo("App annotation setting is disabled: {}".format(app.id))
continue
# get dataset_collection_binding info
- dataset_collection_binding = db.session.query(DatasetCollectionBinding).filter(
- DatasetCollectionBinding.id == app_annotation_setting.collection_binding_id
- ).first()
+ dataset_collection_binding = (
+ db.session.query(DatasetCollectionBinding)
+ .filter(DatasetCollectionBinding.id == app_annotation_setting.collection_binding_id)
+ .first()
+ )
if not dataset_collection_binding:
- click.echo('App annotation collection binding is not exist: {}'.format(app.id))
+ click.echo("App annotation collection binding is not exist: {}".format(app.id))
continue
annotations = db.session.query(MessageAnnotation).filter(MessageAnnotation.app_id == app.id).all()
dataset = Dataset(
id=app.id,
tenant_id=app.tenant_id,
- indexing_technique='high_quality',
+ indexing_technique="high_quality",
embedding_model_provider=dataset_collection_binding.provider_name,
embedding_model=dataset_collection_binding.model_name,
- collection_binding_id=dataset_collection_binding.id
+ collection_binding_id=dataset_collection_binding.id,
)
documents = []
if annotations:
@@ -191,101 +258,128 @@ def migrate_annotation_vector_database():
metadata={
"annotation_id": annotation.id,
"app_id": app.id,
- "doc_id": annotation.id
- }
+ "doc_id": annotation.id,
+ },
)
documents.append(document)
- vector = Vector(dataset, attributes=['doc_id', 'annotation_id', 'app_id'])
+ vector = Vector(dataset, attributes=["doc_id", "annotation_id", "app_id"])
click.echo(f"Start to migrate annotation, app_id: {app.id}.")
try:
vector.delete()
click.echo(
- click.style(f'Successfully delete vector index for app: {app.id}.',
- fg='green'))
+ click.style(
+ f"Successfully delete vector index for app: {app.id}.",
+ fg="green",
+ )
+ )
except Exception as e:
- click.echo(
- click.style(f'Failed to delete vector index for app {app.id}.',
- fg='red'))
+ click.echo(click.style(f"Failed to delete vector index for app {app.id}.", fg="red"))
raise e
if documents:
try:
- click.echo(click.style(
- f'Start to created vector index with {len(documents)} annotations for app {app.id}.',
- fg='green'))
+ click.echo(
+ click.style(
+ f"Start to created vector index with {len(documents)} annotations for app {app.id}.",
+ fg="green",
+ )
+ )
vector.create(documents)
click.echo(
- click.style(f'Successfully created vector index for app {app.id}.', fg='green'))
+ click.style(
+ f"Successfully created vector index for app {app.id}.",
+ fg="green",
+ )
+ )
except Exception as e:
- click.echo(click.style(f'Failed to created vector index for app {app.id}.', fg='red'))
+ click.echo(
+ click.style(
+ f"Failed to created vector index for app {app.id}.",
+ fg="red",
+ )
+ )
raise e
- click.echo(f'Successfully migrated app annotation {app.id}.')
+ click.echo(f"Successfully migrated app annotation {app.id}.")
create_count += 1
except Exception as e:
click.echo(
- click.style('Create app annotation index error: {} {}'.format(e.__class__.__name__, str(e)),
- fg='red'))
+ click.style(
+ "Create app annotation index error: {} {}".format(e.__class__.__name__, str(e)),
+ fg="red",
+ )
+ )
continue
click.echo(
- click.style(f'Congratulations! Create {create_count} app annotation indexes, and skipped {skipped_count} apps.',
- fg='green'))
+ click.style(
+ f"Congratulations! Create {create_count} app annotation indexes, and skipped {skipped_count} apps.",
+ fg="green",
+ )
+ )
def migrate_knowledge_vector_database():
"""
Migrate vector database datas to target vector database .
"""
- click.echo(click.style('Start migrate vector db.', fg='green'))
+ click.echo(click.style("Start migrate vector db.", fg="green"))
create_count = 0
skipped_count = 0
total_count = 0
config = current_app.config
- vector_type = config.get('VECTOR_STORE')
+ vector_type = config.get("VECTOR_STORE")
page = 1
while True:
try:
- datasets = db.session.query(Dataset).filter(Dataset.indexing_technique == 'high_quality') \
- .order_by(Dataset.created_at.desc()).paginate(page=page, per_page=50)
+ datasets = (
+ db.session.query(Dataset)
+ .filter(Dataset.indexing_technique == "high_quality")
+ .order_by(Dataset.created_at.desc())
+ .paginate(page=page, per_page=50)
+ )
except NotFound:
break
page += 1
for dataset in datasets:
total_count = total_count + 1
- click.echo(f'Processing the {total_count} dataset {dataset.id}. '
- + f'{create_count} created, {skipped_count} skipped.')
+ click.echo(
+ f"Processing the {total_count} dataset {dataset.id}. "
+ + f"{create_count} created, {skipped_count} skipped."
+ )
try:
- click.echo('Create dataset vdb index: {}'.format(dataset.id))
+ click.echo("Create dataset vdb index: {}".format(dataset.id))
if dataset.index_struct_dict:
- if dataset.index_struct_dict['type'] == vector_type:
+ if dataset.index_struct_dict["type"] == vector_type:
skipped_count = skipped_count + 1
continue
- collection_name = ''
+ collection_name = ""
if vector_type == "weaviate":
dataset_id = dataset.id
collection_name = Dataset.gen_collection_name_by_id(dataset_id)
index_struct_dict = {
- "type": 'weaviate',
- "vector_store": {"class_prefix": collection_name}
+ "type": "weaviate",
+ "vector_store": {"class_prefix": collection_name},
}
dataset.index_struct = json.dumps(index_struct_dict)
elif vector_type == "qdrant":
if dataset.collection_binding_id:
- dataset_collection_binding = db.session.query(DatasetCollectionBinding). \
- filter(DatasetCollectionBinding.id == dataset.collection_binding_id). \
- one_or_none()
+ dataset_collection_binding = (
+ db.session.query(DatasetCollectionBinding)
+ .filter(DatasetCollectionBinding.id == dataset.collection_binding_id)
+ .one_or_none()
+ )
if dataset_collection_binding:
collection_name = dataset_collection_binding.collection_name
else:
- raise ValueError('Dataset Collection Bindings is not exist!')
+ raise ValueError("Dataset Collection Bindings is not exist!")
else:
dataset_id = dataset.id
collection_name = Dataset.gen_collection_name_by_id(dataset_id)
index_struct_dict = {
- "type": 'qdrant',
- "vector_store": {"class_prefix": collection_name}
+ "type": "qdrant",
+ "vector_store": {"class_prefix": collection_name},
}
dataset.index_struct = json.dumps(index_struct_dict)
@@ -293,7 +387,15 @@ def migrate_knowledge_vector_database():
dataset_id = dataset.id
collection_name = Dataset.gen_collection_name_by_id(dataset_id)
index_struct_dict = {
- "type": 'milvus',
+ "type": "milvus",
+ "vector_store": {"class_prefix": collection_name},
+ }
+ dataset.index_struct = json.dumps(index_struct_dict)
+ elif vector_type == "relyt":
+ dataset_id = dataset.id
+ collection_name = Dataset.gen_collection_name_by_id(dataset_id)
+ index_struct_dict = {
+ "type": 'relyt',
"vector_store": {"class_prefix": collection_name}
}
dataset.index_struct = json.dumps(index_struct_dict)
@@ -314,29 +416,43 @@ def migrate_knowledge_vector_database():
try:
vector.delete()
click.echo(
- click.style(f'Successfully delete vector index {collection_name} for dataset {dataset.id}.',
- fg='green'))
+ click.style(
+ f"Successfully delete vector index {collection_name} for dataset {dataset.id}.",
+ fg="green",
+ )
+ )
except Exception as e:
click.echo(
- click.style(f'Failed to delete vector index {collection_name} for dataset {dataset.id}.',
- fg='red'))
+ click.style(
+ f"Failed to delete vector index {collection_name} for dataset {dataset.id}.",
+ fg="red",
+ )
+ )
raise e
- dataset_documents = db.session.query(DatasetDocument).filter(
- DatasetDocument.dataset_id == dataset.id,
- DatasetDocument.indexing_status == 'completed',
- DatasetDocument.enabled == True,
- DatasetDocument.archived == False,
- ).all()
+ dataset_documents = (
+ db.session.query(DatasetDocument)
+ .filter(
+ DatasetDocument.dataset_id == dataset.id,
+ DatasetDocument.indexing_status == "completed",
+ DatasetDocument.enabled == True,
+ DatasetDocument.archived == False,
+ )
+ .all()
+ )
documents = []
segments_count = 0
for dataset_document in dataset_documents:
- segments = db.session.query(DocumentSegment).filter(
- DocumentSegment.document_id == dataset_document.id,
- DocumentSegment.status == 'completed',
- DocumentSegment.enabled == True
- ).all()
+ segments = (
+ db.session.query(DocumentSegment)
+ .filter(
+ DocumentSegment.document_id == dataset_document.id,
+ DocumentSegment.status == "completed",
+ DocumentSegment.enabled == True,
+ )
+ .all()
+ )
for segment in segments:
document = Document(
@@ -346,7 +462,7 @@ def migrate_knowledge_vector_database():
"doc_hash": segment.index_node_hash,
"document_id": segment.document_id,
"dataset_id": segment.dataset_id,
- }
+ },
)
documents.append(document)
@@ -354,37 +470,55 @@ def migrate_knowledge_vector_database():
if documents:
try:
- click.echo(click.style(
- f'Start to created vector index with {len(documents)} documents of {segments_count} segments for dataset {dataset.id}.',
- fg='green'))
+ click.echo(
+ click.style(
+ f"Start to created vector index with {len(documents)} documents of {segments_count} segments for dataset {dataset.id}.",
+ fg="green",
+ )
+ )
vector.create(documents)
click.echo(
- click.style(f'Successfully created vector index for dataset {dataset.id}.', fg='green'))
+ click.style(
+ f"Successfully created vector index for dataset {dataset.id}.",
+ fg="green",
+ )
+ )
except Exception as e:
- click.echo(click.style(f'Failed to created vector index for dataset {dataset.id}.', fg='red'))
+ click.echo(
+ click.style(
+ f"Failed to created vector index for dataset {dataset.id}.",
+ fg="red",
+ )
+ )
raise e
db.session.add(dataset)
db.session.commit()
- click.echo(f'Successfully migrated dataset {dataset.id}.')
+ click.echo(f"Successfully migrated dataset {dataset.id}.")
create_count += 1
except Exception as e:
db.session.rollback()
click.echo(
- click.style('Create dataset index error: {} {}'.format(e.__class__.__name__, str(e)),
- fg='red'))
+ click.style(
+ "Create dataset index error: {} {}".format(e.__class__.__name__, str(e)),
+ fg="red",
+ )
+ )
continue
click.echo(
- click.style(f'Congratulations! Create {create_count} dataset indexes, and skipped {skipped_count} datasets.',
- fg='green'))
+ click.style(
+ f"Congratulations! Create {create_count} dataset indexes, and skipped {skipped_count} datasets.",
+ fg="green",
+ )
+ )
-@click.command('convert-to-agent-apps', help='Convert Agent Assistant to Agent App.')
+@click.command("convert-to-agent-apps", help="Convert Agent Assistant to Agent App.")
def convert_to_agent_apps():
"""
Convert Agent Assistant to Agent App.
"""
- click.echo(click.style('Start convert to agent apps.', fg='green'))
+ click.echo(click.style("Start convert to agent apps.", fg="green"))
proceeded_app_ids = []
@@ -419,7 +553,7 @@ def convert_to_agent_apps():
break
for app in apps:
- click.echo('Converting app: {}'.format(app.id))
+ click.echo("Converting app: {}".format(app.id))
try:
app.mode = AppMode.AGENT_CHAT.value
@@ -431,16 +565,25 @@ def convert_to_agent_apps():
)
db.session.commit()
- click.echo(click.style('Converted app: {}'.format(app.id), fg='green'))
+ click.echo(click.style("Converted app: {}".format(app.id), fg="green"))
except Exception as e:
click.echo(
- click.style('Convert app error: {} {}'.format(e.__class__.__name__,
- str(e)), fg='red'))
+ click.style(
+ "Convert app error: {} {}".format(e.__class__.__name__, str(e)),
+ fg="red",
+ )
+ )
- click.echo(click.style('Congratulations! Converted {} agent apps.'.format(len(proceeded_app_ids)), fg='green'))
+ click.echo(
+ click.style(
+ "Congratulations! Converted {} agent apps.".format(len(proceeded_app_ids)),
+ fg="green",
+ )
+ )
def register_commands(app):
+ app.cli.add_command(register)
app.cli.add_command(reset_password)
app.cli.add_command(reset_email)
app.cli.add_command(reset_encrypt_key_pair)
diff --git a/api/core/model_runtime/model_providers/_position.yaml b/api/core/model_runtime/model_providers/_position.yaml
index c06f1229849393..62cae69dbede4f 100644
--- a/api/core/model_runtime/model_providers/_position.yaml
+++ b/api/core/model_runtime/model_providers/_position.yaml
@@ -1,3 +1,5 @@
+- modelhub
+- openai_api_compatible
- openai
- anthropic
- azure_openai
@@ -26,4 +28,3 @@
- yi
- openllm
- localai
-- openai_api_compatible
diff --git a/api/core/model_runtime/model_providers/modelhub/__init__.py b/api/core/model_runtime/model_providers/modelhub/__init__.py
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/api/core/model_runtime/model_providers/modelhub/_assets/icon_l_en.svg b/api/core/model_runtime/model_providers/modelhub/_assets/icon_l_en.svg
new file mode 100644
index 00000000000000..f834befb0e3d9d
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/_assets/icon_l_en.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/api/core/model_runtime/model_providers/modelhub/_assets/icon_s_en.svg b/api/core/model_runtime/model_providers/modelhub/_assets/icon_s_en.svg
new file mode 100644
index 00000000000000..70686f9b3b58aa
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/_assets/icon_s_en.svg
@@ -0,0 +1,4 @@
+
diff --git a/api/core/model_runtime/model_providers/modelhub/_common.py b/api/core/model_runtime/model_providers/modelhub/_common.py
new file mode 100644
index 00000000000000..51950ca3778424
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/_common.py
@@ -0,0 +1,44 @@
+
+import requests
+
+from core.model_runtime.errors.invoke import (
+ InvokeAuthorizationError,
+ InvokeBadRequestError,
+ InvokeConnectionError,
+ InvokeError,
+ InvokeRateLimitError,
+ InvokeServerUnavailableError,
+)
+
+
+class _CommonOAI_API_Compat:
+ @property
+ def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
+ """
+ Map model invoke error to unified error
+ The key is the error type thrown to the caller
+ The value is the error type thrown by the model,
+ which needs to be converted into a unified error type for the caller.
+
+ :return: Invoke error mapping
+ """
+ return {
+ InvokeAuthorizationError: [
+ requests.exceptions.InvalidHeader, # Missing or Invalid API Key
+ ],
+ InvokeBadRequestError: [
+ requests.exceptions.HTTPError, # Invalid Endpoint URL or model name
+ requests.exceptions.InvalidURL, # Misconfigured request or other API error
+ ],
+ InvokeRateLimitError: [
+ requests.exceptions.RetryError # Too many requests sent in a short period of time
+ ],
+ InvokeServerUnavailableError: [
+ requests.exceptions.ConnectionError, # Engine Overloaded
+ requests.exceptions.HTTPError # Server Error
+ ],
+ InvokeConnectionError: [
+ requests.exceptions.ConnectTimeout, # Timeout
+ requests.exceptions.ReadTimeout # Timeout
+ ]
+ }
\ No newline at end of file
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/Baichuan2-Turbo.yaml b/api/core/model_runtime/model_providers/modelhub/llm/Baichuan2-Turbo.yaml
new file mode 100644
index 00000000000000..eeaabff6ea4092
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/Baichuan2-Turbo.yaml
@@ -0,0 +1,27 @@
+model: Baichuan2-Turbo
+label:
+ zh_Hans: Baichuan2-Turbo
+ en_US: Baichuan2-Turbo
+model_type: llm
+features:
+ - multi-tool-call
+ - agent-thought
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 8192
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 512
+ min: 1
+ max: 8192
+pricing:
+ input: "0.003"
+ output: "0.004"
+ unit: "0.001"
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/__init__.py b/api/core/model_runtime/model_providers/modelhub/llm/__init__.py
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/_position.yaml b/api/core/model_runtime/model_providers/modelhub/llm/_position.yaml
new file mode 100644
index 00000000000000..efa975755e5a72
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/_position.yaml
@@ -0,0 +1,4 @@
+- gpt-3.5-turbo
+- gpt-4
+- glm-3-turbo
+- glm-4
\ No newline at end of file
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/glm-3-turbo.yaml b/api/core/model_runtime/model_providers/modelhub/llm/glm-3-turbo.yaml
new file mode 100644
index 00000000000000..06b42a14ba845d
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/glm-3-turbo.yaml
@@ -0,0 +1,21 @@
+model: glm-3-turbo
+label:
+ zh_Hans: glm-3-turbo
+ en_US: glm-3-turbo
+model_type: llm
+features:
+ - multi-tool-call
+ - agent-thought
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 8192
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ default: 0.01
+pricing:
+ input: "0.003"
+ output: "0.004"
+ unit: "0.001"
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/glm-4.yaml b/api/core/model_runtime/model_providers/modelhub/llm/glm-4.yaml
new file mode 100644
index 00000000000000..c23686846a9f10
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/glm-4.yaml
@@ -0,0 +1,21 @@
+model: glm-4
+label:
+ zh_Hans: glm-4
+ en_US: glm-4
+model_type: llm
+features:
+ - multi-tool-call
+ - agent-thought
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 8192
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ default: 0.01
+pricing:
+ input: "0.003"
+ output: "0.004"
+ unit: "0.001"
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/gpt-3.5-turbo.yaml b/api/core/model_runtime/model_providers/modelhub/llm/gpt-3.5-turbo.yaml
new file mode 100644
index 00000000000000..72a3b7065dc0fc
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/gpt-3.5-turbo.yaml
@@ -0,0 +1,33 @@
+model: gpt-3.5-turbo
+label:
+ zh_Hans: gpt-3.5-turbo
+ en_US: gpt-3.5-turbo
+model_type: llm
+features:
+ - multi-tool-call
+ - agent-thought
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 8192
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 512
+ min: 1
+ max: 8192
+ - name: response_format
+ use_template: response_format
+pricing:
+ input: "0.003"
+ output: "0.004"
+ unit: "0.001"
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/gpt-4.yaml b/api/core/model_runtime/model_providers/modelhub/llm/gpt-4.yaml
new file mode 100644
index 00000000000000..415b8dd77bf598
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/gpt-4.yaml
@@ -0,0 +1,33 @@
+model: gpt-4
+label:
+ zh_Hans: gpt-4
+ en_US: gpt-4
+model_type: llm
+features:
+ - multi-tool-call
+ - agent-thought
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 8192
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 512
+ min: 1
+ max: 8192
+ - name: response_format
+ use_template: response_format
+pricing:
+ input: "0.003"
+ output: "0.004"
+ unit: "0.001"
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/llm/llm.py b/api/core/model_runtime/model_providers/modelhub/llm/llm.py
new file mode 100644
index 00000000000000..1c559077920ea0
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/llm/llm.py
@@ -0,0 +1,782 @@
+import json
+import logging
+from collections.abc import Generator
+from decimal import Decimal
+from typing import Optional, Union, cast
+from urllib.parse import urljoin
+
+import requests
+
+from core.model_runtime.entities.common_entities import I18nObject
+from core.model_runtime.entities.llm_entities import LLMMode, LLMResult, LLMResultChunk, LLMResultChunkDelta
+from core.model_runtime.entities.message_entities import (
+ AssistantPromptMessage,
+ ImagePromptMessageContent,
+ PromptMessage,
+ PromptMessageContent,
+ PromptMessageContentType,
+ PromptMessageFunction,
+ PromptMessageTool,
+ SystemPromptMessage,
+ ToolPromptMessage,
+ UserPromptMessage,
+)
+from core.model_runtime.entities.model_entities import (
+ AIModelEntity,
+ DefaultParameterName,
+ FetchFrom,
+ ModelFeature,
+ ModelPropertyKey,
+ ModelType,
+ ParameterRule,
+ ParameterType,
+ PriceConfig,
+)
+from core.model_runtime.errors.invoke import InvokeError
+from core.model_runtime.errors.validate import CredentialsValidateFailedError
+from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel
+from core.model_runtime.model_providers.modelhub._common import _CommonOAI_API_Compat
+from core.model_runtime.utils import helper
+
+logger = logging.getLogger(__name__)
+
+
+class ModelHubLargeLanguageModel(_CommonOAI_API_Compat, LargeLanguageModel):
+ """
+ Model class for OpenAI large language model.
+ """
+
+ def _invoke(self, model: str, credentials: dict,
+ prompt_messages: list[PromptMessage], model_parameters: dict,
+ tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
+ stream: bool = True, user: Optional[str] = None) \
+ -> Union[LLMResult, Generator]:
+ """
+ Invoke large language model
+
+ :param model: model name
+ :param credentials: model credentials
+ :param prompt_messages: prompt messages
+ :param model_parameters: model parameters
+ :param tools: tools for tool calling
+ :param stop: stop words
+ :param stream: is stream response
+ :param user: unique user id
+ :return: full response or stream response chunk generator result
+ """
+
+ # text completion model
+ return self._generate(
+ model=model,
+ credentials=credentials,
+ prompt_messages=prompt_messages,
+ model_parameters=model_parameters,
+ tools=tools,
+ stop=stop,
+ stream=stream,
+ user=user
+ )
+
+ def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
+ tools: Optional[list[PromptMessageTool]] = None) -> int:
+ """
+ Get number of tokens for given prompt messages
+
+ :param model:
+ :param credentials:
+ :param prompt_messages:
+ :param tools: tools for tool calling
+ :return:
+ """
+ return self._num_tokens_from_messages(model, prompt_messages, tools)
+
+ def validate_credentials(self, model: str, credentials: dict) -> None:
+ """
+ Validate model credentials using requests to ensure compatibility with all providers following OpenAI's API standard.
+
+ :param model: model name
+ :param credentials: model credentials
+ :return:
+ """
+ try:
+ headers = {
+ 'Content-Type': 'application/json'
+ }
+
+ api_key = credentials.get('api_key')
+ if api_key:
+ headers["Authorization"] = f"Bearer {api_key}"
+
+ endpoint_url = credentials['endpoint_url']
+ if not endpoint_url.endswith('/'):
+ endpoint_url += '/'
+
+ # prepare the payload for a simple ping to the model
+ data = {
+ 'model': model,
+ 'max_tokens': 5
+ }
+
+ data['messages'] = [
+ {
+ "role": "user",
+ "content": "ping"
+ },
+ ]
+ endpoint_url = urljoin(endpoint_url, 'chat/completions')
+
+ # send a post request to validate the credentials
+ response = requests.post(
+ endpoint_url,
+ headers=headers,
+ json=data,
+ timeout=(10, 60)
+ )
+
+ if response.status_code != 200:
+ raise CredentialsValidateFailedError(
+ f'Credentials validation failed with status code {response.status_code}')
+
+ try:
+ json_result = response.json()
+ except json.JSONDecodeError as e:
+ raise CredentialsValidateFailedError('Credentials validation failed: JSON decode error')
+
+ if json_result['object'] == '':
+ json_result['object'] = 'chat.completion'
+
+ if 'object' not in json_result or json_result['object'] != 'chat.completion':
+ raise CredentialsValidateFailedError(
+ 'Credentials validation failed: invalid response object, must be \'chat.completion\'')
+ except CredentialsValidateFailedError:
+ raise
+ except Exception as ex:
+ raise CredentialsValidateFailedError(f'An error occurred during credentials validation: {str(ex)}')
+
+ def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity:
+ """
+ generate custom model entities from credentials
+ """
+ features = []
+
+ function_calling_type = credentials.get('function_calling_type', 'no_call')
+ if function_calling_type in ['function_call']:
+ features.append(ModelFeature.TOOL_CALL)
+ elif function_calling_type in ['tool_call']:
+ features.append(ModelFeature.MULTI_TOOL_CALL)
+
+ stream_function_calling = credentials.get('stream_function_calling', 'supported')
+ if stream_function_calling == 'supported':
+ features.append(ModelFeature.STREAM_TOOL_CALL)
+
+ vision_support = credentials.get('vision_support', 'not_support')
+ if vision_support == 'support':
+ features.append(ModelFeature.VISION)
+
+ entity = AIModelEntity(
+ model=model,
+ label=I18nObject(en_US=model),
+ model_type=ModelType.LLM,
+ fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
+ features=features,
+ model_properties={
+ ModelPropertyKey.CONTEXT_SIZE: int(credentials.get('context_size', "4096")),
+ ModelPropertyKey.MODE: credentials.get('mode'),
+ },
+ parameter_rules=[
+ ParameterRule(
+ name=DefaultParameterName.TEMPERATURE.value,
+ label=I18nObject(en_US="Temperature"),
+ type=ParameterType.FLOAT,
+ default=float(credentials.get('temperature', 0.7)),
+ min=0,
+ max=2,
+ precision=2
+ ),
+ ParameterRule(
+ name=DefaultParameterName.TOP_P.value,
+ label=I18nObject(en_US="Top P"),
+ type=ParameterType.FLOAT,
+ default=float(credentials.get('top_p', 1)),
+ min=0,
+ max=1,
+ precision=2
+ ),
+ ParameterRule(
+ name=DefaultParameterName.FREQUENCY_PENALTY.value,
+ label=I18nObject(en_US="Frequency Penalty"),
+ type=ParameterType.FLOAT,
+ default=float(credentials.get('frequency_penalty', 0)),
+ min=-2,
+ max=2
+ ),
+ ParameterRule(
+ name=DefaultParameterName.PRESENCE_PENALTY.value,
+ label=I18nObject(en_US="Presence Penalty"),
+ type=ParameterType.FLOAT,
+ default=float(credentials.get('presence_penalty', 0)),
+ min=-2,
+ max=2
+ ),
+ ParameterRule(
+ name=DefaultParameterName.MAX_TOKENS.value,
+ label=I18nObject(en_US="Max Tokens"),
+ type=ParameterType.INT,
+ default=512,
+ min=1,
+ max=int(credentials.get('max_tokens_to_sample', 4096)),
+ )
+ ],
+ pricing=PriceConfig(
+ input=Decimal(credentials.get('input_price', 0)),
+ output=Decimal(credentials.get('output_price', 0)),
+ unit=Decimal(credentials.get('unit', 0)),
+ currency=credentials.get('currency', "USD")
+ ),
+ )
+
+ entity.model_properties[ModelPropertyKey.MODE] = LLMMode.CHAT.value
+
+ return entity
+
+ # validate_credentials method has been rewritten to use the requests library for compatibility with all providers following OpenAI's API standard.
+ def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict,
+ tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
+ stream: bool = True, \
+ user: Optional[str] = None) -> Union[LLMResult, Generator]:
+ """
+ Invoke llm completion model
+
+ :param model: model name
+ :param credentials: credentials
+ :param prompt_messages: prompt messages
+ :param model_parameters: model parameters
+ :param stop: stop words
+ :param stream: is stream response
+ :param user: unique user id
+ :return: full response or stream response chunk generator result
+ """
+ headers = {
+ 'Content-Type': 'application/json',
+ 'Accept-Charset': 'utf-8',
+ }
+
+ api_key = credentials.get('api_key')
+ if api_key:
+ headers["Authorization"] = f"Bearer {api_key}"
+
+ endpoint_url = credentials["endpoint_url"]
+ if not endpoint_url.endswith('/'):
+ endpoint_url += '/'
+
+ data = {
+ "model": model,
+ "stream": stream,
+ **model_parameters
+ }
+
+ endpoint_url = urljoin(endpoint_url, 'chat/completions')
+ data['messages'] = [self._convert_prompt_message_to_dict(m) for m in prompt_messages]
+
+ # annotate tools with names, descriptions, etc.
+ function_calling_type = credentials.get('function_calling_type', 'no_call')
+ formatted_tools = []
+ if tools:
+ if function_calling_type == 'function_call':
+ data['functions'] = [{
+ "name": tool.name,
+ "description": tool.description,
+ "parameters": tool.parameters
+ } for tool in tools]
+ elif function_calling_type == 'tool_call':
+ data["tool_choice"] = "auto"
+
+ for tool in tools:
+ formatted_tools.append(helper.dump_model(PromptMessageFunction(function=tool)))
+
+ data["tools"] = formatted_tools
+
+ if stop:
+ data["stop"] = stop
+
+ if user:
+ data["user"] = user
+
+ response = requests.post(
+ endpoint_url,
+ headers=headers,
+ json=data,
+ timeout=(10, 60),
+ stream=stream
+ )
+
+ if response.encoding is None or response.encoding == 'ISO-8859-1':
+ response.encoding = 'utf-8'
+
+ if response.status_code != 200:
+ raise InvokeError(f"API request failed with status code {response.status_code}: {response.text}")
+
+ if stream:
+ return self._handle_generate_stream_response(model, credentials, response, prompt_messages)
+
+ return self._handle_generate_response(model, credentials, response, prompt_messages)
+
+ def _handle_generate_stream_response(self, model: str, credentials: dict, response: requests.Response,
+ prompt_messages: list[PromptMessage]) -> Generator:
+ """
+ Handle llm stream response
+
+ :param model: model name
+ :param credentials: model credentials
+ :param response: streamed response
+ :param prompt_messages: prompt messages
+ :return: llm response chunk generator
+ """
+ full_assistant_content = ''
+ chunk_index = 0
+
+ def create_final_llm_result_chunk(index: int, message: AssistantPromptMessage, finish_reason: str) \
+ -> LLMResultChunk:
+ # calculate num tokens
+ prompt_tokens = self._num_tokens_from_string(model, prompt_messages[0].content)
+ completion_tokens = self._num_tokens_from_string(model, full_assistant_content)
+
+ # transform usage
+ usage = self._calc_response_usage(model, credentials, prompt_tokens, completion_tokens)
+
+ return LLMResultChunk(
+ model=model,
+ prompt_messages=prompt_messages,
+ delta=LLMResultChunkDelta(
+ index=index,
+ message=message,
+ finish_reason=finish_reason,
+ usage=usage
+ )
+ )
+
+ # delimiter for stream response, need unicode_escape
+ import codecs
+ delimiter = credentials.get("stream_mode_delimiter", "\n\n")
+ delimiter = codecs.decode(delimiter, "unicode_escape")
+
+ tools_calls: list[AssistantPromptMessage.ToolCall] = []
+
+ def increase_tool_call(new_tool_calls: list[AssistantPromptMessage.ToolCall]):
+ def get_tool_call(tool_call_id: str):
+ if not tool_call_id:
+ return tools_calls[-1]
+
+ tool_call = next((tool_call for tool_call in tools_calls if tool_call.id == tool_call_id), None)
+ if tool_call is None:
+ tool_call = AssistantPromptMessage.ToolCall(
+ id=tool_call_id,
+ type="function",
+ function=AssistantPromptMessage.ToolCall.ToolCallFunction(
+ name="",
+ arguments=""
+ )
+ )
+ tools_calls.append(tool_call)
+
+ return tool_call
+
+ for new_tool_call in new_tool_calls:
+ # get tool call
+ tool_call = get_tool_call(new_tool_call.function.name)
+ # update tool call
+ if new_tool_call.id:
+ tool_call.id = new_tool_call.id
+ if new_tool_call.type:
+ tool_call.type = new_tool_call.type
+ if new_tool_call.function.name:
+ tool_call.function.name = new_tool_call.function.name
+ if new_tool_call.function.arguments:
+ tool_call.function.arguments += new_tool_call.function.arguments
+
+ finish_reason = 'Unknown'
+
+ for chunk in response.iter_lines(decode_unicode=True, delimiter=delimiter):
+ if chunk:
+ # ignore sse comments
+ if chunk.startswith(':'):
+ continue
+ decoded_chunk = chunk.strip().lstrip('data: ').lstrip()
+
+ try:
+ chunk_json = json.loads(decoded_chunk)
+ # stream ended
+ except json.JSONDecodeError as e:
+ yield create_final_llm_result_chunk(
+ index=chunk_index + 1,
+ message=AssistantPromptMessage(content=""),
+ finish_reason="Non-JSON encountered."
+ )
+ break
+ if not chunk_json or len(chunk_json['choices']) == 0:
+ continue
+
+ choice = chunk_json['choices'][0]
+ finish_reason = chunk_json['choices'][0].get('finish_reason')
+ chunk_index += 1
+
+ if 'delta' in choice:
+ delta = choice['delta']
+ delta_content = delta.get('content')
+
+ assistant_message_tool_calls = None
+
+ if 'tool_calls' in delta and credentials.get('function_calling_type', 'no_call') == 'tool_call':
+ assistant_message_tool_calls = delta.get('tool_calls', None)
+ elif 'function_call' in delta and credentials.get('function_calling_type', 'no_call') == 'function_call':
+ assistant_message_tool_calls = [{
+ 'id': 'tool_call_id',
+ 'type': 'function',
+ 'function': delta.get('function_call', {})
+ }]
+
+ # assistant_message_function_call = delta.delta.function_call
+
+ # extract tool calls from response
+ if assistant_message_tool_calls:
+ tool_calls = self._extract_response_tool_calls(assistant_message_tool_calls)
+ increase_tool_call(tool_calls)
+
+ if delta_content is None or delta_content == '':
+ continue
+
+ # transform assistant message to prompt message
+ assistant_prompt_message = AssistantPromptMessage(
+ content=delta_content,
+ )
+
+ # reset tool calls
+ tool_calls = []
+ full_assistant_content += delta_content
+ elif 'text' in choice:
+ choice_text = choice.get('text', '')
+ if choice_text == '':
+ continue
+
+ # transform assistant message to prompt message
+ assistant_prompt_message = AssistantPromptMessage(content=choice_text)
+ full_assistant_content += choice_text
+ else:
+ continue
+
+ yield LLMResultChunk(
+ model=model,
+ prompt_messages=prompt_messages,
+ delta=LLMResultChunkDelta(
+ index=chunk_index,
+ message=assistant_prompt_message,
+ )
+ )
+
+ chunk_index += 1
+
+ if tools_calls:
+ yield LLMResultChunk(
+ model=model,
+ prompt_messages=prompt_messages,
+ delta=LLMResultChunkDelta(
+ index=chunk_index,
+ message=AssistantPromptMessage(
+ tool_calls=tools_calls,
+ content=""
+ ),
+ )
+ )
+
+ yield create_final_llm_result_chunk(
+ index=chunk_index,
+ message=AssistantPromptMessage(content=""),
+ finish_reason=finish_reason
+ )
+
+ def _handle_generate_response(self, model: str, credentials: dict, response: requests.Response,
+ prompt_messages: list[PromptMessage]) -> LLMResult:
+
+ response_json = response.json()
+
+ output = response_json['choices'][0]
+
+ response_content = ''
+ tool_calls = None
+ function_calling_type = credentials.get('function_calling_type', 'no_call')
+ response_content = output.get('message', {})['content']
+ if function_calling_type == 'tool_call':
+ tool_calls = output.get('message', {}).get('tool_calls')
+ elif function_calling_type == 'function_call':
+ tool_calls = output.get('message', {}).get('function_call')
+
+
+ assistant_message = AssistantPromptMessage(content=response_content, tool_calls=[])
+
+ if tool_calls:
+ if function_calling_type == 'tool_call':
+ assistant_message.tool_calls = self._extract_response_tool_calls(tool_calls)
+ elif function_calling_type == 'function_call':
+ assistant_message.tool_calls = [self._extract_response_function_call(tool_calls)]
+
+ usage = response_json.get("usage")
+ if usage:
+ # transform usage
+ prompt_tokens = usage["prompt_tokens"]
+ completion_tokens = usage["completion_tokens"]
+ else:
+ # calculate num tokens
+ prompt_tokens = self._num_tokens_from_string(model, prompt_messages[0].content)
+ completion_tokens = self._num_tokens_from_string(model, assistant_message.content)
+
+ # transform usage
+ usage = self._calc_response_usage(model, credentials, prompt_tokens, completion_tokens)
+
+ # transform response
+ result = LLMResult(
+ model=response_json["model"],
+ prompt_messages=prompt_messages,
+ message=assistant_message,
+ usage=usage,
+ )
+
+ return result
+
+ def _convert_prompt_message_to_dict(self, message: PromptMessage) -> dict:
+ """
+ Convert PromptMessage to dict for OpenAI API format
+ """
+ if isinstance(message, UserPromptMessage):
+ message = cast(UserPromptMessage, message)
+ if isinstance(message.content, str):
+ message_dict = {"role": "user", "content": message.content}
+ else:
+ sub_messages = []
+ for message_content in message.content:
+ if message_content.type == PromptMessageContentType.TEXT:
+ message_content = cast(PromptMessageContent, message_content)
+ sub_message_dict = {
+ "type": "text",
+ "text": message_content.data
+ }
+ sub_messages.append(sub_message_dict)
+ elif message_content.type == PromptMessageContentType.IMAGE:
+ message_content = cast(ImagePromptMessageContent, message_content)
+ sub_message_dict = {
+ "type": "image_url",
+ "image_url": {
+ "url": message_content.data,
+ "detail": message_content.detail.value
+ }
+ }
+ sub_messages.append(sub_message_dict)
+
+ message_dict = {"role": "user", "content": sub_messages}
+ elif isinstance(message, AssistantPromptMessage):
+ message = cast(AssistantPromptMessage, message)
+ message_dict = {"role": "assistant", "content": message.content}
+ if message.tool_calls:
+ # message_dict["tool_calls"] = [helper.dump_model(PromptMessageFunction(function=tool_call)) for tool_call
+ # in
+ # message.tool_calls]
+
+ function_call = message.tool_calls[0]
+ message_dict["function_call"] = {
+ "name": function_call.function.name,
+ "arguments": function_call.function.arguments,
+ }
+ elif isinstance(message, SystemPromptMessage):
+ message = cast(SystemPromptMessage, message)
+ message_dict = {"role": "system", "content": message.content}
+ elif isinstance(message, ToolPromptMessage):
+ message = cast(ToolPromptMessage, message)
+ # message_dict = {
+ # "role": "tool",
+ # "content": message.content,
+ # "tool_call_id": message.tool_call_id
+ # }
+ message_dict = {
+ "role": "function",
+ "content": message.content,
+ "name": message.tool_call_id
+ }
+ else:
+ raise ValueError(f"Got unknown type {message}")
+
+ if message.name:
+ message_dict["name"] = message.name
+
+ return message_dict
+
+ def _num_tokens_from_string(self, model: str, text: Union[str, list[PromptMessageContent]],
+ tools: Optional[list[PromptMessageTool]] = None) -> int:
+ """
+ Approximate num tokens for model with gpt2 tokenizer.
+
+ :param model: model name
+ :param text: prompt text
+ :param tools: tools for tool calling
+ :return: number of tokens
+ """
+ if isinstance(text, str):
+ full_text = text
+ else:
+ full_text = ''
+ for message_content in text:
+ if message_content.type == PromptMessageContentType.TEXT:
+ message_content = cast(PromptMessageContent, message_content)
+ full_text += message_content.data
+
+ num_tokens = self._get_num_tokens_by_gpt2(full_text)
+
+ if tools:
+ num_tokens += self._num_tokens_for_tools(tools)
+
+ return num_tokens
+
+ def _num_tokens_from_messages(self, model: str, messages: list[PromptMessage],
+ tools: Optional[list[PromptMessageTool]] = None) -> int:
+ """
+ Approximate num tokens with GPT2 tokenizer.
+ """
+
+ tokens_per_message = 3
+ tokens_per_name = 1
+
+ num_tokens = 0
+ messages_dict = [self._convert_prompt_message_to_dict(m) for m in messages]
+ for message in messages_dict:
+ num_tokens += tokens_per_message
+ for key, value in message.items():
+ # Cast str(value) in case the message value is not a string
+ # This occurs with function messages
+ # TODO: The current token calculation method for the image type is not implemented,
+ # which need to download the image and then get the resolution for calculation,
+ # and will increase the request delay
+ if isinstance(value, list):
+ text = ''
+ for item in value:
+ if isinstance(item, dict) and item['type'] == 'text':
+ text += item['text']
+
+ value = text
+
+ if key == "tool_calls":
+ for tool_call in value:
+ for t_key, t_value in tool_call.items():
+ num_tokens += self._get_num_tokens_by_gpt2(t_key)
+ if t_key == "function":
+ for f_key, f_value in t_value.items():
+ num_tokens += self._get_num_tokens_by_gpt2(f_key)
+ num_tokens += self._get_num_tokens_by_gpt2(f_value)
+ else:
+ num_tokens += self._get_num_tokens_by_gpt2(t_key)
+ num_tokens += self._get_num_tokens_by_gpt2(t_value)
+ else:
+ num_tokens += self._get_num_tokens_by_gpt2(str(value))
+
+ if key == "name":
+ num_tokens += tokens_per_name
+
+ # every reply is primed with assistant
+ num_tokens += 3
+
+ if tools:
+ num_tokens += self._num_tokens_for_tools(tools)
+
+ return num_tokens
+
+ def _num_tokens_for_tools(self, tools: list[PromptMessageTool]) -> int:
+ """
+ Calculate num tokens for tool calling with tiktoken package.
+
+ :param tools: tools for tool calling
+ :return: number of tokens
+ """
+ num_tokens = 0
+ for tool in tools:
+ num_tokens += self._get_num_tokens_by_gpt2('type')
+ num_tokens += self._get_num_tokens_by_gpt2('function')
+ num_tokens += self._get_num_tokens_by_gpt2('function')
+
+ # calculate num tokens for function object
+ num_tokens += self._get_num_tokens_by_gpt2('name')
+ num_tokens += self._get_num_tokens_by_gpt2(tool.name)
+ num_tokens += self._get_num_tokens_by_gpt2('description')
+ num_tokens += self._get_num_tokens_by_gpt2(tool.description)
+ parameters = tool.parameters
+ num_tokens += self._get_num_tokens_by_gpt2('parameters')
+ if 'title' in parameters:
+ num_tokens += self._get_num_tokens_by_gpt2('title')
+ num_tokens += self._get_num_tokens_by_gpt2(parameters.get("title"))
+ num_tokens += self._get_num_tokens_by_gpt2('type')
+ num_tokens += self._get_num_tokens_by_gpt2(parameters.get("type"))
+ if 'properties' in parameters:
+ num_tokens += self._get_num_tokens_by_gpt2('properties')
+ for key, value in parameters.get('properties').items():
+ num_tokens += self._get_num_tokens_by_gpt2(key)
+ for field_key, field_value in value.items():
+ num_tokens += self._get_num_tokens_by_gpt2(field_key)
+ if field_key == 'enum':
+ for enum_field in field_value:
+ num_tokens += 3
+ num_tokens += self._get_num_tokens_by_gpt2(enum_field)
+ else:
+ num_tokens += self._get_num_tokens_by_gpt2(field_key)
+ num_tokens += self._get_num_tokens_by_gpt2(str(field_value))
+ if 'required' in parameters:
+ num_tokens += self._get_num_tokens_by_gpt2('required')
+ for required_field in parameters['required']:
+ num_tokens += 3
+ num_tokens += self._get_num_tokens_by_gpt2(required_field)
+
+ return num_tokens
+
+ def _extract_response_tool_calls(self,
+ response_tool_calls: list[dict]) \
+ -> list[AssistantPromptMessage.ToolCall]:
+ """
+ Extract tool calls from response
+
+ :param response_tool_calls: response tool calls
+ :return: list of tool calls
+ """
+ tool_calls = []
+ if response_tool_calls:
+ for response_tool_call in response_tool_calls:
+ function = AssistantPromptMessage.ToolCall.ToolCallFunction(
+ name=response_tool_call.get("function", {}).get("name", ""),
+ arguments=response_tool_call.get("function", {}).get("arguments", "")
+ )
+
+ tool_call = AssistantPromptMessage.ToolCall(
+ id=response_tool_call.get("id", ""),
+ type=response_tool_call.get("type", ""),
+ function=function
+ )
+ tool_calls.append(tool_call)
+
+ return tool_calls
+
+ def _extract_response_function_call(self, response_function_call) \
+ -> AssistantPromptMessage.ToolCall:
+ """
+ Extract function call from response
+
+ :param response_function_call: response function call
+ :return: tool call
+ """
+ tool_call = None
+ if response_function_call:
+ function = AssistantPromptMessage.ToolCall.ToolCallFunction(
+ name=response_function_call.get('name', ''),
+ arguments=response_function_call.get('arguments', '')
+ )
+
+ tool_call = AssistantPromptMessage.ToolCall(
+ id=response_function_call.get('id', ''),
+ type="function",
+ function=function
+ )
+
+ return tool_call
diff --git a/api/core/model_runtime/model_providers/modelhub/modelhub.py b/api/core/model_runtime/model_providers/modelhub/modelhub.py
new file mode 100644
index 00000000000000..344c835308eb4a
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/modelhub.py
@@ -0,0 +1,11 @@
+import logging
+
+from core.model_runtime.model_providers.__base.model_provider import ModelProvider
+
+logger = logging.getLogger(__name__)
+
+
+class ModelHubProvider(ModelProvider):
+
+ def validate_provider_credentials(self, credentials: dict) -> None:
+ pass
diff --git a/api/core/model_runtime/model_providers/modelhub/modelhub.yaml b/api/core/model_runtime/model_providers/modelhub/modelhub.yaml
new file mode 100644
index 00000000000000..8c13bab976db9b
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/modelhub.yaml
@@ -0,0 +1,152 @@
+provider: modelhub
+label:
+ en_US: ModelHub
+description:
+ en_US: ModelHub
+ zh_Hans: ModelHub
+icon_small:
+ en_US: icon_s_en.svg
+icon_large:
+ en_US: icon_l_en.svg
+background: "#FFFFFF"
+supported_model_types:
+ - llm
+ - text-embedding
+ - rerank
+configurate_methods:
+ - predefined-model
+ - customizable-model
+model_credential_schema:
+ model:
+ label:
+ en_US: Model Name
+ zh_Hans: 模型名称
+ placeholder:
+ en_US: Enter full model name
+ zh_Hans: 输入模型全称
+ credential_form_schemas:
+ - variable: api_key
+ label:
+ en_US: API Key
+ type: secret-input
+ required: false
+ placeholder:
+ zh_Hans: 在此输入您的 API Key
+ en_US: Enter your API Key
+ - variable: endpoint_url
+ label:
+ zh_Hans: API endpoint URL
+ en_US: API endpoint URL
+ type: text-input
+ required: false
+ default: 'https://modelhub.puyuan.tech/api/v1'
+ placeholder:
+ zh_Hans: Base URL, e.g. https://api.openai.com/v1
+ en_US: Base URL, e.g. https://api.openai.com/v1
+ - variable: context_size
+ label:
+ zh_Hans: 模型上下文长度
+ en_US: Model context size
+ required: true
+ type: text-input
+ default: '4096'
+ placeholder:
+ zh_Hans: 在此输入您的模型上下文长度
+ en_US: Enter your Model context size
+ - variable: max_tokens_to_sample
+ label:
+ zh_Hans: 最大 token 上限
+ en_US: Upper bound for max tokens
+ show_on:
+ - variable: __model_type
+ value: llm
+ default: '4096'
+ type: text-input
+ - variable: function_calling_type
+ show_on:
+ - variable: __model_type
+ value: llm
+ label:
+ en_US: Function calling
+ type: select
+ required: false
+ default: no_call
+ options:
+ - value: function_call
+ label:
+ en_US: Function Call
+ zh_Hans: Function Call
+ - value: tool_call
+ label:
+ en_US: Tool Call
+ zh_Hans: Tool Call
+ - value: no_call
+ label:
+ en_US: Not Support
+ zh_Hans: 不支持
+ - variable: stream_function_calling
+ show_on:
+ - variable: __model_type
+ value: llm
+ label:
+ en_US: Stream function calling
+ type: select
+ required: false
+ default: not_supported
+ options:
+ - value: supported
+ label:
+ en_US: Support
+ zh_Hans: 支持
+ - value: not_supported
+ label:
+ en_US: Not Support
+ zh_Hans: 不支持
+ - variable: vision_support
+ show_on:
+ - variable: __model_type
+ value: llm
+ label:
+ zh_Hans: Vision 支持
+ en_US: Vision Support
+ type: select
+ required: false
+ default: no_support
+ options:
+ - value: support
+ label:
+ en_US: Support
+ zh_Hans: 支持
+ - value: no_support
+ label:
+ en_US: Not Support
+ zh_Hans: 不支持
+ - variable: stream_mode_delimiter
+ label:
+ zh_Hans: 流模式返回结果的分隔符
+ en_US: Delimiter for streaming results
+ show_on:
+ - variable: __model_type
+ value: llm
+ default: '\n\n'
+ type: text-input
+provider_credential_schema:
+ credential_form_schemas:
+ - variable: api_key
+ label:
+ en_US: API Key
+ type: secret-input
+ required: true
+ placeholder:
+ zh_Hans: 在此输入您的 API Key
+ en_US: Enter your API Key
+ - variable: endpoint_url
+ label:
+ zh_Hans: endpoint_url
+ en_US: endpoint_url
+ type: text-input
+ required: false
+ default: 'https://modelhub.puyuan.tech/api/v1'
+ placeholder:
+ zh_Hans: 在此输入您的 endpoint_url
+ en_US: Enter your endpoint_url
\ No newline at end of file
diff --git a/api/core/model_runtime/model_providers/modelhub/rerank/__init__.py b/api/core/model_runtime/model_providers/modelhub/rerank/__init__.py
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/api/core/model_runtime/model_providers/modelhub/rerank/bge-reranker-base.yaml b/api/core/model_runtime/model_providers/modelhub/rerank/bge-reranker-base.yaml
new file mode 100644
index 00000000000000..62831c8bb9776e
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/rerank/bge-reranker-base.yaml
@@ -0,0 +1,4 @@
+model: bge-reranker-base
+model_type: rerank
+model_properties:
+ context_size: 5120
diff --git a/api/core/model_runtime/model_providers/modelhub/rerank/bge-reranker-v2-m3.yaml b/api/core/model_runtime/model_providers/modelhub/rerank/bge-reranker-v2-m3.yaml
new file mode 100644
index 00000000000000..0ee6309ff29e58
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/rerank/bge-reranker-v2-m3.yaml
@@ -0,0 +1,4 @@
+model: bge-reranker-v2-m3
+model_type: rerank
+model_properties:
+ context_size: 5120
diff --git a/api/core/model_runtime/model_providers/modelhub/rerank/rerank.py b/api/core/model_runtime/model_providers/modelhub/rerank/rerank.py
new file mode 100644
index 00000000000000..2e2623eccfc683
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/rerank/rerank.py
@@ -0,0 +1,100 @@
+from typing import Optional
+
+import numpy as np
+from modelhub import ModelhubClient
+
+from core.model_runtime.entities.rerank_entities import RerankDocument, RerankResult
+from core.model_runtime.errors.invoke import (
+ InvokeError,
+)
+from core.model_runtime.errors.validate import CredentialsValidateFailedError
+from core.model_runtime.model_providers.__base.rerank_model import RerankModel
+
+
+class CohereRerankModel(RerankModel):
+ """
+ Model class for Cohere rerank model.
+ """
+
+ def _invoke(
+ self,
+ model: str,
+ credentials: dict,
+ query: str,
+ docs: list[str],
+ score_threshold: Optional[float] = None,
+ top_n: Optional[int] = None,
+ user: Optional[str] = None,
+ ) -> RerankResult:
+ """
+ Invoke rerank model
+
+ :param model: model name
+ :param credentials: model credentials
+ :param query: search query
+ :param docs: docs for reranking
+ :param score_threshold: score threshold
+ :param top_n: top n
+ :param user: unique user id
+ :return: rerank result
+ """
+ if len(docs) == 0:
+ return RerankResult(model=model, docs=docs)
+
+ user_name, user_password = credentials["api_key"].split(":")
+ client = ModelhubClient(
+ user_name=user_name,
+ user_password=user_password,
+ host=credentials["endpoint_url"].replace("v1", ""),
+ )
+ scores = client.cross_embedding(
+ [[query, doc] for doc in docs],
+ model=model,
+ ).scores
+ sort_idx = np.argsort(scores)[::-1]
+ rerank_documents = []
+ for i in sort_idx[:top_n] if top_n is not None else sort_idx:
+ rerank_document = RerankDocument(index=i, text=docs[i], score=scores[i])
+ if score_threshold is not None:
+ if scores[i] >= score_threshold:
+ rerank_documents.append(rerank_document)
+ else:
+ rerank_documents.append(rerank_document)
+
+ return RerankResult(model=model, docs=rerank_documents)
+
+ def validate_credentials(self, model: str, credentials: dict) -> None:
+ """
+ Validate model credentials
+
+ :param model: model name
+ :param credentials: model credentials
+ :return:
+ """
+ try:
+ self.invoke(
+ model=model,
+ credentials=credentials,
+ query="What is the capital of the United States?",
+ docs=[
+ "Carson City is the capital city of the American state of Nevada. At the 2010 United States "
+ "Census, Carson City had a population of 55,274.",
+ "The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that "
+ "are a political division controlled by the United States. Its capital is Saipan.",
+ ],
+ score_threshold=0.8,
+ )
+ except Exception as ex:
+ raise CredentialsValidateFailedError(str(ex))
+
+ @property
+ def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
+ """
+ Map model invoke error to unified error
+ The key is the error type thrown to the caller
+ The value is the error type thrown by the model,
+ which needs to be converted into a unified error type for the caller.
+
+ :return: Invoke error mapping
+ """
+ return {}
diff --git a/api/core/model_runtime/model_providers/modelhub/text_embedding/__init__.py b/api/core/model_runtime/model_providers/modelhub/text_embedding/__init__.py
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/api/core/model_runtime/model_providers/modelhub/text_embedding/bge-m3.yaml b/api/core/model_runtime/model_providers/modelhub/text_embedding/bge-m3.yaml
new file mode 100644
index 00000000000000..13571b282e3ab9
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/text_embedding/bge-m3.yaml
@@ -0,0 +1,9 @@
+model: bge-m3
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: '0.00013'
+ unit: '0.001'
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/text_embedding/m3e-large.yaml b/api/core/model_runtime/model_providers/modelhub/text_embedding/m3e-large.yaml
new file mode 100644
index 00000000000000..005a87f3ef9505
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/text_embedding/m3e-large.yaml
@@ -0,0 +1,9 @@
+model: m3e-large
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: '0.00013'
+ unit: '0.001'
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/text_embedding/text-embedding-3-large.yaml b/api/core/model_runtime/model_providers/modelhub/text_embedding/text-embedding-3-large.yaml
new file mode 100644
index 00000000000000..9489170fdea0b4
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/text_embedding/text-embedding-3-large.yaml
@@ -0,0 +1,9 @@
+model: text-embedding-3-large
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: '0.00013'
+ unit: '0.001'
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/text_embedding/text-embedding-3-small.yaml b/api/core/model_runtime/model_providers/modelhub/text_embedding/text-embedding-3-small.yaml
new file mode 100644
index 00000000000000..9f46210e55b970
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/text_embedding/text-embedding-3-small.yaml
@@ -0,0 +1,9 @@
+model: text-embedding-3-small
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: '0.00013'
+ unit: '0.001'
+ currency: USD
diff --git a/api/core/model_runtime/model_providers/modelhub/text_embedding/text_embedding.py b/api/core/model_runtime/model_providers/modelhub/text_embedding/text_embedding.py
new file mode 100644
index 00000000000000..a1e0e5143fb8c1
--- /dev/null
+++ b/api/core/model_runtime/model_providers/modelhub/text_embedding/text_embedding.py
@@ -0,0 +1,244 @@
+import json
+import time
+from decimal import Decimal
+from typing import Optional
+from urllib.parse import urljoin
+
+import numpy as np
+import requests
+
+from core.model_runtime.entities.common_entities import I18nObject
+from core.model_runtime.entities.model_entities import (
+ AIModelEntity,
+ FetchFrom,
+ ModelPropertyKey,
+ ModelType,
+ PriceConfig,
+ PriceType,
+)
+from core.model_runtime.entities.text_embedding_entities import EmbeddingUsage, TextEmbeddingResult
+from core.model_runtime.errors.validate import CredentialsValidateFailedError
+from core.model_runtime.model_providers.__base.text_embedding_model import TextEmbeddingModel
+from core.model_runtime.model_providers.modelhub._common import _CommonOAI_API_Compat
+
+
+class ModelHubEmbeddingModel(_CommonOAI_API_Compat, TextEmbeddingModel):
+ """
+ Model class for an OpenAI API-compatible text embedding model.
+ """
+
+ def _invoke(self, model: str, credentials: dict,
+ texts: list[str], user: Optional[str] = None) \
+ -> TextEmbeddingResult:
+ """
+ Invoke text embedding model
+
+ :param model: model name
+ :param credentials: model credentials
+ :param texts: texts to embed
+ :param user: unique user id
+ :return: embeddings result
+ """
+
+ # Prepare headers and payload for the request
+ headers = {
+ 'Content-Type': 'application/json'
+ }
+
+ api_key = credentials.get('api_key')
+ if api_key:
+ headers["Authorization"] = f"Bearer {api_key}"
+
+ endpoint_url = credentials.get('endpoint_url')
+ if not endpoint_url.endswith('/'):
+ endpoint_url += '/'
+
+ endpoint_url = urljoin(endpoint_url, 'embeddings')
+
+ extra_model_kwargs = {}
+ if user:
+ extra_model_kwargs['user'] = user
+
+ extra_model_kwargs['encoding_format'] = 'float'
+
+ # get model properties
+ context_size = self._get_context_size(model, credentials)
+ max_chunks = self._get_max_chunks(model, credentials)
+
+ inputs = []
+ indices = []
+ used_tokens = 0
+
+ for i, text in enumerate(texts):
+
+ # Here token count is only an approximation based on the GPT2 tokenizer
+ # TODO: Optimize for better token estimation and chunking
+ num_tokens = self._get_num_tokens_by_gpt2(text)
+
+ if num_tokens >= context_size:
+ cutoff = int(len(text) * (np.floor(context_size / num_tokens)))
+ # if num tokens is larger than context length, only use the start
+ inputs.append(text[0: cutoff])
+ else:
+ inputs.append(text)
+ indices += [i]
+
+ batched_embeddings = []
+ _iter = range(0, len(inputs), max_chunks)
+
+ for i in _iter:
+ # Prepare the payload for the request
+ payload = {
+ 'input': inputs[i: i + max_chunks],
+ 'model': model,
+ **extra_model_kwargs
+ }
+
+ # Make the request to the OpenAI API
+ response = requests.post(
+ endpoint_url,
+ headers=headers,
+ data=json.dumps(payload),
+ timeout=(10, 300)
+ )
+
+ response.raise_for_status() # Raise an exception for HTTP errors
+ response_data = response.json()
+
+ # Extract embeddings and used tokens from the response
+ embeddings_batch = [data['embedding'] for data in response_data['data']]
+ embedding_used_tokens = response_data['usage']['total_tokens']
+
+ used_tokens += embedding_used_tokens
+ batched_embeddings += embeddings_batch
+
+ # calc usage
+ usage = self._calc_response_usage(
+ model=model,
+ credentials=credentials,
+ tokens=used_tokens
+ )
+
+ return TextEmbeddingResult(
+ embeddings=batched_embeddings,
+ usage=usage,
+ model=model
+ )
+
+ def get_num_tokens(self, model: str, credentials: dict, texts: list[str]) -> int:
+ """
+ Approximate number of tokens for given messages using GPT2 tokenizer
+
+ :param model: model name
+ :param credentials: model credentials
+ :param texts: texts to embed
+ :return:
+ """
+ return sum(self._get_num_tokens_by_gpt2(text) for text in texts)
+
+ def validate_credentials(self, model: str, credentials: dict) -> None:
+ """
+ Validate model credentials
+
+ :param model: model name
+ :param credentials: model credentials
+ :return:
+ """
+ try:
+ headers = {
+ 'Content-Type': 'application/json'
+ }
+
+ api_key = credentials.get('api_key')
+
+ if api_key:
+ headers["Authorization"] = f"Bearer {api_key}"
+
+ endpoint_url = credentials.get('endpoint_url')
+ if not endpoint_url.endswith('/'):
+ endpoint_url += '/'
+
+ endpoint_url = urljoin(endpoint_url, 'embeddings')
+
+ payload = {
+ 'input': 'ping',
+ 'model': model
+ }
+
+ response = requests.post(
+ url=endpoint_url,
+ headers=headers,
+ data=json.dumps(payload),
+ timeout=(10, 300)
+ )
+
+ if response.status_code != 200:
+ raise CredentialsValidateFailedError(
+ f'Credentials validation failed with status code {response.status_code}')
+
+ try:
+ json_result = response.json()
+ except json.JSONDecodeError as e:
+ raise CredentialsValidateFailedError('Credentials validation failed: JSON decode error')
+
+ if 'model' not in json_result:
+ raise CredentialsValidateFailedError(
+ 'Credentials validation failed: invalid response')
+ except CredentialsValidateFailedError:
+ raise
+ except Exception as ex:
+ raise CredentialsValidateFailedError(str(ex))
+
+ def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity:
+ """
+ generate custom model entities from credentials
+ """
+ entity = AIModelEntity(
+ model=model,
+ label=I18nObject(en_US=model),
+ model_type=ModelType.TEXT_EMBEDDING,
+ fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
+ model_properties={
+ ModelPropertyKey.CONTEXT_SIZE: int(credentials.get('context_size')),
+ ModelPropertyKey.MAX_CHUNKS: 1,
+ },
+ parameter_rules=[],
+ pricing=PriceConfig(
+ input=Decimal(credentials.get('input_price', 0)),
+ unit=Decimal(credentials.get('unit', 0)),
+ currency=credentials.get('currency', "USD")
+ )
+ )
+
+ return entity
+
+
+ def _calc_response_usage(self, model: str, credentials: dict, tokens: int) -> EmbeddingUsage:
+ """
+ Calculate response usage
+
+ :param model: model name
+ :param credentials: model credentials
+ :param tokens: input tokens
+ :return: usage
+ """
+ # get input price info
+ input_price_info = self.get_price(
+ model=model,
+ credentials=credentials,
+ price_type=PriceType.INPUT,
+ tokens=tokens
+ )
+
+ # transform usage
+ usage = EmbeddingUsage(
+ tokens=tokens,
+ total_tokens=tokens,
+ unit_price=input_price_info.unit_price,
+ price_unit=input_price_info.unit,
+ total_price=input_price_info.total_amount,
+ currency=input_price_info.currency,
+ latency=time.perf_counter() - self.started_at
+ )
+
+ return usage
diff --git a/api/requirements.txt b/api/requirements.txt
index 5db66f5b354b97..39fdc1d94be4db 100644
--- a/api/requirements.txt
+++ b/api/requirements.txt
@@ -29,7 +29,7 @@ redis[hiredis]~=5.0.3
openpyxl==3.1.2
chardet~=5.1.0
python-docx~=1.1.0
-pypdfium2~=4.17.0
+pypdfium2
resend~=0.7.0
pyjwt~=2.8.0
anthropic~=0.23.1
diff --git a/docker/docker-compose.middleware.yaml b/docker/docker-compose.middleware.yaml
index f85f188bb9b407..9646b5493154d6 100644
--- a/docker/docker-compose.middleware.yaml
+++ b/docker/docker-compose.middleware.yaml
@@ -29,27 +29,27 @@ services:
- "6379:6379"
# The Weaviate vector store.
- weaviate:
- image: semitechnologies/weaviate:1.19.0
- restart: always
- volumes:
- # Mount the Weaviate data directory to the container.
- - ./volumes/weaviate:/var/lib/weaviate
- environment:
- # The Weaviate configurations
- # You can refer to the [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) documentation for more information.
- QUERY_DEFAULTS_LIMIT: 25
- AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
- PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
- DEFAULT_VECTORIZER_MODULE: 'none'
- CLUSTER_HOSTNAME: 'node1'
- AUTHENTICATION_APIKEY_ENABLED: 'true'
- AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih'
- AUTHENTICATION_APIKEY_USERS: 'hello@dify.ai'
- AUTHORIZATION_ADMINLIST_ENABLED: 'true'
- AUTHORIZATION_ADMINLIST_USERS: 'hello@dify.ai'
- ports:
- - "8080:8080"
+ # weaviate:
+ # image: semitechnologies/weaviate:1.19.0
+ # restart: always
+ # volumes:
+ # # Mount the Weaviate data directory to the container.
+ # - ./volumes/weaviate:/var/lib/weaviate
+ # environment:
+ # # The Weaviate configurations
+ # # You can refer to the [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) documentation for more information.
+ # QUERY_DEFAULTS_LIMIT: 25
+ # AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
+ # PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
+ # DEFAULT_VECTORIZER_MODULE: 'none'
+ # CLUSTER_HOSTNAME: 'node1'
+ # AUTHENTICATION_APIKEY_ENABLED: 'true'
+ # AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih'
+ # AUTHENTICATION_APIKEY_USERS: 'hello@dify.ai'
+ # AUTHORIZATION_ADMINLIST_ENABLED: 'true'
+ # AUTHORIZATION_ADMINLIST_USERS: 'hello@dify.ai'
+ # ports:
+ # - "8080:8080"
# The DifySandbox
sandbox:
diff --git a/web/package.json b/web/package.json
index bfcd93177d6067..10428991614358 100644
--- a/web/package.json
+++ b/web/package.json
@@ -5,7 +5,7 @@
"scripts": {
"dev": "next dev",
"build": "next build",
- "start": "cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public && cross-env PORT=$npm_config_port HOSTNAME=$npm_config_host node .next/standalone/server.js",
+ "start": "cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public && cross-env PORT=4544 HOSTNAME=127.0.0.1 node .next/standalone/server.js",
"lint": "next lint",
"fix": "next lint --fix",
"eslint-fix": "eslint --fix",
diff --git a/web/yarn.lock b/web/yarn.lock
index d57f3cc3e3985f..3a51a5c4a86f2e 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -105,13 +105,6 @@
resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz"
integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==
-"@emnapi/runtime@^0.45.0":
- version "0.45.0"
- resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-0.45.0.tgz#e754de04c683263f34fd0c7f32adfe718bbe4ddd"
- integrity sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==
- dependencies:
- tslib "^2.4.0"
-
"@emoji-mart/data@^1.1.2":
version "1.1.2"
resolved "https://registry.npmjs.org/@emoji-mart/data/-/data-1.1.2.tgz"
@@ -161,13 +154,6 @@
dependencies:
"@floating-ui/utils" "^0.1.1"
-"@floating-ui/dom@1.1.1":
- version "1.1.1"
- resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz"
- integrity sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==
- dependencies:
- "@floating-ui/core" "^1.1.0"
-
"@floating-ui/dom@^1.5.1":
version "1.5.1"
resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz"
@@ -176,6 +162,13 @@
"@floating-ui/core" "^1.4.1"
"@floating-ui/utils" "^0.1.1"
+"@floating-ui/dom@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz"
+ integrity sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==
+ dependencies:
+ "@floating-ui/core" "^1.1.0"
+
"@floating-ui/react-dom@^2.0.2":
version "2.0.2"
resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz"
@@ -235,147 +228,54 @@
resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
-"@img/sharp-darwin-arm64@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz#0a52a82c2169112794dac2c71bfba9e90f7c5bd1"
- integrity sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==
- optionalDependencies:
- "@img/sharp-libvips-darwin-arm64" "1.0.1"
-
-"@img/sharp-darwin-x64@0.33.2":
- version "0.33.2"
- resolved "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz"
- integrity sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==
- optionalDependencies:
- "@img/sharp-libvips-darwin-x64" "1.0.1"
-
-"@img/sharp-libvips-darwin-arm64@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz#81e83ffc2c497b3100e2f253766490f8fad479cd"
- integrity sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==
-
-"@img/sharp-libvips-darwin-x64@1.0.1":
- version "1.0.1"
- resolved "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz"
- integrity sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==
-
-"@img/sharp-libvips-linux-arm64@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz#26eb8c556a9b0db95f343fc444abc3effb67ebcf"
- integrity sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==
-
-"@img/sharp-libvips-linux-arm@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz#2a377b959ff7dd6528deee486c25461296a4fa8b"
- integrity sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==
-
-"@img/sharp-libvips-linux-s390x@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz#af28ac9ba929204467ecdf843330d791e9421e10"
- integrity sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==
-
"@img/sharp-libvips-linux-x64@1.0.1":
version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz#4273d182aa51912e655e1214ea47983d7c1f7f8d"
+ resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz"
integrity sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==
-"@img/sharp-libvips-linuxmusl-arm64@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz#d150c92151cea2e8d120ad168b9c358d09c77ce8"
- integrity sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==
-
-"@img/sharp-libvips-linuxmusl-x64@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz#e297c1a4252c670d93b0f9e51fca40a7a5b6acfd"
- integrity sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==
-
-"@img/sharp-linux-arm64@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz#af3409f801a9bee1d11d0c7e971dcd6180f80022"
- integrity sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==
- optionalDependencies:
- "@img/sharp-libvips-linux-arm64" "1.0.1"
-
-"@img/sharp-linux-arm@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz#181f7466e6ac074042a38bfb679eb82505e17083"
- integrity sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==
- optionalDependencies:
- "@img/sharp-libvips-linux-arm" "1.0.1"
-
-"@img/sharp-linux-s390x@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz#9c171f49211f96fba84410b3e237b301286fa00f"
- integrity sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==
- optionalDependencies:
- "@img/sharp-libvips-linux-s390x" "1.0.1"
-
"@img/sharp-linux-x64@0.33.2":
version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz#b956dfc092adc58c2bf0fae2077e6f01a8b2d5d7"
+ resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz"
integrity sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==
optionalDependencies:
"@img/sharp-libvips-linux-x64" "1.0.1"
-"@img/sharp-linuxmusl-arm64@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz#10e0ec5a79d1234c6a71df44c9f3b0bef0bc0f15"
- integrity sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==
- optionalDependencies:
- "@img/sharp-libvips-linuxmusl-arm64" "1.0.1"
-
-"@img/sharp-linuxmusl-x64@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz#29e0030c24aa27c38201b1fc84e3d172899fcbe0"
- integrity sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==
- optionalDependencies:
- "@img/sharp-libvips-linuxmusl-x64" "1.0.1"
-
-"@img/sharp-wasm32@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz#38d7c740a22de83a60ad1e6bcfce17462b0d4230"
- integrity sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==
+"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
dependencies:
- "@emnapi/runtime" "^0.45.0"
-
-"@img/sharp-win32-ia32@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz#09456314e223f68e5417c283b45c399635c16202"
- integrity sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==
-
-"@img/sharp-win32-x64@0.33.2":
- version "0.33.2"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz#148e96dfd6e68747da41a311b9ee4559bb1b1471"
- integrity sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==
-
-"@jridgewell/gen-mapping@^0.3.2":
- version "0.3.3"
- resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz"
- integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
- dependencies:
- "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/set-array" "^1.2.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
+ "@jridgewell/trace-mapping" "^0.3.24"
"@jridgewell/resolve-uri@^3.1.0":
version "3.1.0"
resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz"
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
-"@jridgewell/set-array@^1.0.1":
- version "1.1.2"
- resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
- integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/source-map@^0.3.3":
+ version "0.3.6"
+ resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz"
+ integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
version "1.4.15"
resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-"@jridgewell/trace-mapping@^0.3.9":
- version "0.3.22"
- resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz"
- integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==
+"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
@@ -534,7 +434,7 @@
dependencies:
"@lexical/offset" "0.12.2"
-"@mdx-js/loader@^2.3.0":
+"@mdx-js/loader@^2.3.0", "@mdx-js/loader@>=0.15.0":
version "2.3.0"
resolved "https://registry.npmjs.org/@mdx-js/loader/-/loader-2.3.0.tgz"
integrity sha512-IqsscXh7Q3Rzb+f5DXYk0HU71PK+WuFsEhf+mSV3fOhpLcEpgsHvTQ2h0T6TlZ5gHOaBeFjkXwB52by7ypMyNg==
@@ -565,7 +465,7 @@
unist-util-visit "^4.0.0"
vfile "^5.0.0"
-"@mdx-js/react@^2.3.0":
+"@mdx-js/react@^2.3.0", "@mdx-js/react@>=0.15.0":
version "2.3.0"
resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz"
integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==
@@ -611,51 +511,11 @@
dependencies:
source-map "^0.7.0"
-"@next/swc-darwin-arm64@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz#27b1854c2cd04eb1d5e75081a1a792ad91526618"
- integrity sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==
-
-"@next/swc-darwin-x64@14.0.4":
- version "14.0.4"
- resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz"
- integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==
-
-"@next/swc-linux-arm64-gnu@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz#0eafd27c8587f68ace7b4fa80695711a8434de21"
- integrity sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==
-
-"@next/swc-linux-arm64-musl@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz#2b0072adb213f36dada5394ea67d6e82069ae7dd"
- integrity sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==
-
"@next/swc-linux-x64-gnu@14.0.4":
version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz#68c67d20ebc8e3f6ced6ff23a4ba2a679dbcec32"
+ resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz"
integrity sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==
-"@next/swc-linux-x64-musl@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz#67cd81b42fb2caf313f7992fcf6d978af55a1247"
- integrity sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==
-
-"@next/swc-win32-arm64-msvc@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz#be06585906b195d755ceda28f33c633e1443f1a3"
- integrity sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==
-
-"@next/swc-win32-ia32-msvc@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz#e76cabefa9f2d891599c3d85928475bd8d3f6600"
- integrity sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==
-
-"@next/swc-win32-x64-msvc@14.0.4":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz#e74892f1a9ccf41d3bf5979ad6d3d77c07b9cba1"
- integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==
-
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
@@ -664,7 +524,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -821,7 +681,7 @@
resolved "https://registry.npmjs.org/@sentry/types/-/types-7.60.1.tgz"
integrity sha512-8lKKSCOhZ953cWxwnfZwoR3ZFFlZG4P3PQFTaFt/u4LxLh/0zYbdtgvtUqXRURjMCi5P6ddeE9Uw9FGnTJCsTw==
-"@sentry/utils@7.60.1", "@sentry/utils@^7.54.0":
+"@sentry/utils@^7.54.0", "@sentry/utils@7.60.1":
version "7.60.1"
resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.60.1.tgz"
integrity sha512-ik+5sKGBx4DWuvf6UUKPSafaDiASxP+Xvjg3C9ppop2I/JWxP1FfZ5g22n5ZmPmNahD6clTSoTWly8qyDUlUOw==
@@ -1085,6 +945,22 @@
dependencies:
"@types/ms" "*"
+"@types/eslint-scope@^3.7.3":
+ version "3.7.7"
+ resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz"
+ integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.56.9"
+ resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz"
+ integrity sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
"@types/estree-jsx@^1.0.0":
version "1.0.0"
resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz"
@@ -1092,7 +968,7 @@
dependencies:
"@types/estree" "*"
-"@types/estree@*", "@types/estree@^1.0.0":
+"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5":
version "1.0.5"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
@@ -1119,7 +995,7 @@
resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.3.tgz"
integrity sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==
-"@types/json-schema@^7.0.9":
+"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.12"
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz"
integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
@@ -1236,7 +1112,7 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@18.0.28", "@types/react@>=16":
+"@types/react@*", "@types/react@>=16", "@types/react@>=16.8", "@types/react@18.0.28":
version "18.0.28"
resolved "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz"
integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==
@@ -1260,7 +1136,7 @@
resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz"
integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
-"@types/sortablejs@^1.15.1":
+"@types/sortablejs@^1.15.1", "@types/sortablejs@1":
version "1.15.1"
resolved "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.1.tgz"
integrity sha512-g/JwBNToh6oCTAwNS8UGVmjO7NLDKsejVhvE4x1eWiPTC3uCuNsa/TD4ssvX3du+MLiM+SHPNDuijp8y76JzLQ==
@@ -1270,7 +1146,7 @@
resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz"
integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==
-"@typescript-eslint/eslint-plugin@^5.53.0":
+"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.0.0 || ^6.0.0", "@typescript-eslint/eslint-plugin@^5.53.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz"
integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
@@ -1286,7 +1162,7 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^5.53.0":
+"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^5.53.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz"
integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
@@ -1332,7 +1208,7 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.53.0":
+"@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.53.0", "@typescript-eslint/utils@5.62.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz"
integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
@@ -1354,12 +1230,148 @@
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
+"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz"
+ integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz"
+ integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==
+
+"@webassemblyjs/helper-api-error@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz"
+ integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==
+
+"@webassemblyjs/helper-buffer@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz"
+ integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==
+
+"@webassemblyjs/helper-numbers@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz"
+ integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.6"
+ "@webassemblyjs/helper-api-error" "1.11.6"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz"
+ integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==
+
+"@webassemblyjs/helper-wasm-section@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz"
+ integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-buffer" "1.12.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/wasm-gen" "1.12.1"
+
+"@webassemblyjs/ieee754@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz"
+ integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz"
+ integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz"
+ integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==
+
+"@webassemblyjs/wasm-edit@^1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz"
+ integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-buffer" "1.12.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/helper-wasm-section" "1.12.1"
+ "@webassemblyjs/wasm-gen" "1.12.1"
+ "@webassemblyjs/wasm-opt" "1.12.1"
+ "@webassemblyjs/wasm-parser" "1.12.1"
+ "@webassemblyjs/wast-printer" "1.12.1"
+
+"@webassemblyjs/wasm-gen@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz"
+ integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/ieee754" "1.11.6"
+ "@webassemblyjs/leb128" "1.11.6"
+ "@webassemblyjs/utf8" "1.11.6"
+
+"@webassemblyjs/wasm-opt@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz"
+ integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-buffer" "1.12.1"
+ "@webassemblyjs/wasm-gen" "1.12.1"
+ "@webassemblyjs/wasm-parser" "1.12.1"
+
+"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz"
+ integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-api-error" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/ieee754" "1.11.6"
+ "@webassemblyjs/leb128" "1.11.6"
+ "@webassemblyjs/utf8" "1.11.6"
+
+"@webassemblyjs/wast-printer@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz"
+ integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+acorn-import-assertions@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz"
+ integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==
+
acorn-jsx@^5.0.0, acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^8.0.0, acorn@^8.5.0, acorn@^8.9.0:
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0:
version "8.10.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz"
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
@@ -1393,7 +1405,12 @@ ahooks@^3.7.5:
screenfull "^5.0.0"
tslib "^2.4.1"
-ajv@^6.10.0, ajv@^6.12.4:
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1646,7 +1663,7 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-browserslist@^4.21.5:
+browserslist@^4.21.10, browserslist@^4.21.5, "browserslist@>= 4.21.0":
version "4.22.2"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz"
integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
@@ -1656,6 +1673,11 @@ browserslist@^4.21.5:
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
builtin-modules@^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz"
@@ -1711,11 +1733,6 @@ ccount@^2.0.0:
resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz"
integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==
-chalk@5.2.0:
- version "5.2.0"
- resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz"
- integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
-
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
@@ -1733,6 +1750,11 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz"
+ integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
+
character-entities-html4@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz"
@@ -1768,7 +1790,7 @@ character-reference-invalid@^2.0.0:
resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz"
integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==
-"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
+chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0":
version "3.5.3"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -1783,6 +1805,11 @@ character-reference-invalid@^2.0.0:
optionalDependencies:
fsevents "~2.3.2"
+chrome-trace-event@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz"
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
ci-info@^3.6.1:
version "3.8.0"
resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz"
@@ -1793,16 +1820,16 @@ classcat@^5.0.3, classcat@^5.0.4:
resolved "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz"
integrity sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==
-classnames@2.3.1:
- version "2.3.1"
- resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz"
- integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
-
classnames@^2.2.1, classnames@^2.3.2:
version "2.3.2"
resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz"
integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
+classnames@2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz"
+ integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
+
clean-regexp@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz"
@@ -1838,7 +1865,7 @@ cli-truncate@^3.1.0:
slice-ansi "^5.0.0"
string-width "^5.0.0"
-client-only@0.0.1, client-only@^0.0.1:
+client-only@^0.0.1, client-only@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz"
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
@@ -1857,16 +1884,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
color-string@^1.9.0:
version "1.9.1"
resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"
@@ -1898,16 +1925,16 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz"
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
-commander@7:
- version "7.2.0"
- resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
commander@^10.0.0:
version "10.0.1"
resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz"
integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"
@@ -1918,6 +1945,11 @@ commander@^8.3.0:
resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz"
integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+commander@7:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
@@ -1989,7 +2021,7 @@ cytoscape-fcose@^2.1.0:
dependencies:
cose-base "^2.2.0"
-cytoscape@^3.23.0:
+cytoscape@^3.2.0, cytoscape@^3.23.0:
version "3.26.0"
resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz"
integrity sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==
@@ -1997,6 +2029,13 @@ cytoscape@^3.23.0:
heap "^0.2.6"
lodash "^4.17.21"
+d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3:
+ version "3.2.4"
+ resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
+ integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
+ dependencies:
+ internmap "1 - 2"
+
"d3-array@1 - 2":
version "2.12.1"
resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz"
@@ -2004,13 +2043,6 @@ cytoscape@^3.23.0:
dependencies:
internmap "^1.0.0"
-"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0:
- version "3.2.4"
- resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
- integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
- dependencies:
- internmap "1 - 2"
-
d3-axis@3:
version "3.0.0"
resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz"
@@ -2058,7 +2090,7 @@ d3-delaunay@6:
resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz"
integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
-"d3-drag@2 - 3", d3-drag@3, d3-drag@^3.0.0:
+d3-drag@^3.0.0, "d3-drag@2 - 3", d3-drag@3:
version "3.0.0"
resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz"
integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
@@ -2120,16 +2152,16 @@ d3-hierarchy@3:
dependencies:
d3-color "1 - 3"
+d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"
+ integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
+
d3-path@1:
version "1.0.9"
resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz"
integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
-"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"
- integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
-
d3-polygon@3:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz"
@@ -2172,18 +2204,11 @@ d3-scale@4:
d3-time "2.1.1 - 3"
d3-time-format "2 - 4"
-"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0:
+d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3:
version "3.0.0"
resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz"
integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
-d3-shape@3:
- version "3.2.0"
- resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz"
- integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
- dependencies:
- d3-path "^3.1.0"
-
d3-shape@^1.2.0:
version "1.3.7"
resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz"
@@ -2191,6 +2216,13 @@ d3-shape@^1.2.0:
dependencies:
d3-path "1"
+d3-shape@3:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz"
+ integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
+ dependencies:
+ d3-path "^3.1.0"
+
"d3-time-format@2 - 4", d3-time-format@4:
version "4.1.0"
resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"
@@ -2221,7 +2253,7 @@ d3-shape@^1.2.0:
d3-interpolate "1 - 3"
d3-timer "1 - 3"
-d3-zoom@3, d3-zoom@^3.0.0:
+d3-zoom@^3.0.0, d3-zoom@3:
version "3.0.0"
resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz"
integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
@@ -2462,7 +2494,7 @@ echarts-for-react@^3.0.2:
fast-deep-equal "^3.1.3"
size-sensor "^1.0.1"
-echarts@^5.4.1:
+"echarts@^3.0.0 || ^4.0.0 || ^5.0.0", echarts@^5.4.1:
version "5.4.3"
resolved "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz"
integrity sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==
@@ -2495,10 +2527,10 @@ emoji-regex@^9.2.2:
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-enhanced-resolve@^5.12.0:
- version "5.15.0"
- resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz"
- integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==
+enhanced-resolve@^5.12.0, enhanced-resolve@^5.16.0:
+ version "5.16.0"
+ resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz"
+ integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -2580,6 +2612,11 @@ es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15:
iterator.prototype "^1.1.2"
safe-array-concat "^1.0.1"
+es-module-lexer@^1.2.1:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz"
+ integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==
+
es-set-tostringtag@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz"
@@ -2700,7 +2737,7 @@ eslint-plugin-html@^7.1.0:
dependencies:
htmlparser2 "^8.0.1"
-eslint-plugin-import@^2.27.5, eslint-plugin-import@^2.28.1:
+eslint-plugin-import@*, eslint-plugin-import@^2.27.5, eslint-plugin-import@^2.28.1:
version "2.29.1"
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz"
integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
@@ -2876,7 +2913,7 @@ eslint-rule-composer@^0.3.0:
resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz"
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
-eslint-scope@^5.1.1:
+eslint-scope@^5.1.1, eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -2921,7 +2958,7 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz"
integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
-eslint@^8.36.0:
+eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.36.0, eslint@>=4.19.1, eslint@>=5, eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=7.4.0, eslint@>=8.28.0:
version "8.36.0"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz"
integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==
@@ -3050,6 +3087,11 @@ esutils@^2.0.2:
resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
execa@^5.0.0:
version "5.1.1"
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
@@ -3195,11 +3237,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-fsevents@~2.3.2:
- version "2.3.2"
- resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
- integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
-
function-bind@^1.1.1, function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@@ -3250,7 +3287,7 @@ get-tsconfig@^4.5.0:
dependencies:
resolve-pkg-maps "^1.0.0"
-glob-parent@^5.1.2, glob-parent@~5.1.2:
+glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -3264,15 +3301,22 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-glob@7.1.6:
- version "7.1.6"
- resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+glob@^7.1.3, glob@7.1.7:
+ version "7.1.7"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -3281,10 +3325,10 @@ glob@7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@7.1.7, glob@^7.1.3:
- version "7.1.7"
- resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
- integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+glob@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -3593,7 +3637,7 @@ i18next-resources-to-backend@^1.1.3:
dependencies:
"@babel/runtime" "^7.21.5"
-i18next@^22.4.13:
+i18next@^22.4.13, "i18next@>= 19.0.0":
version "22.5.1"
resolved "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz"
integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==
@@ -3612,7 +3656,7 @@ ignore@^5.0.5, ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4:
resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
-immer@^9.0.19:
+immer@^9.0.19, immer@>=9.0.6:
version "9.0.21"
resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz"
integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
@@ -3672,16 +3716,16 @@ internal-slot@^1.0.3, internal-slot@^1.0.5:
has "^1.0.3"
side-channel "^1.0.4"
-"internmap@1 - 2":
- version "2.0.3"
- resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
- integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
-
internmap@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz"
integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
+"internmap@1 - 2":
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
+ integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+
intersection-observer@^0.12.0:
version "0.12.2"
resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz"
@@ -3992,6 +4036,11 @@ isexe@^2.0.0:
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+isomorphic.js@^0.2.4:
+ version "0.2.5"
+ resolved "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz"
+ integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==
+
iterator.prototype@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz"
@@ -4003,6 +4052,15 @@ iterator.prototype@^1.1.2:
reflect.getprototypeof "^1.0.4"
set-function-name "^2.0.1"
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
jiti@^1.18.2:
version "1.19.1"
resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz"
@@ -4050,7 +4108,7 @@ jsesc@~0.5.0:
resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
-json-parse-even-better-errors@^2.3.0:
+json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
version "2.3.1"
resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
@@ -4146,12 +4204,19 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-lexical@^0.12.2:
+lexical@^0.12.2, lexical@0.12.2:
version "0.12.2"
resolved "https://registry.npmjs.org/lexical/-/lexical-0.12.2.tgz"
integrity sha512-Kxavd+ETjxtVwG/hvPd6WZfXD44sLOKe9Vlkwxy7lBQ1qZArS+rZfs+u5iXwXe6tX9f2PIM0u3RHsrCEDDE0fw==
-lilconfig@2.1.0, lilconfig@^2.0.5, lilconfig@^2.1.0:
+lib0@^0.2.86:
+ version "0.2.93"
+ resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz"
+ integrity sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==
+ dependencies:
+ isomorphic.js "^0.2.4"
+
+lilconfig@^2.0.5, lilconfig@^2.1.0, lilconfig@2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"
integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
@@ -4194,6 +4259,11 @@ listr2@^5.0.7:
through "^2.3.8"
wrap-ansi "^7.0.0"
+loader-runner@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz"
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
+
local-pkg@^0.4.3:
version "0.4.3"
resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz"
@@ -4425,7 +4495,43 @@ mdast-util-from-markdown@^0.8.5:
parse-entities "^2.0.0"
unist-util-stringify-position "^2.0.0"
-mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0, mdast-util-from-markdown@^1.3.0:
+mdast-util-from-markdown@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz"
+ integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.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"
+
+mdast-util-from-markdown@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz"
+ integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.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"
+
+mdast-util-from-markdown@^1.3.0:
version "1.3.1"
resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz"
integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==
@@ -4610,7 +4716,14 @@ mdast-util-to-string@^2.0.0:
resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz"
integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==
-mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0:
+mdast-util-to-string@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz"
+ integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+
+mdast-util-to-string@^3.1.0:
version "3.2.0"
resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz"
integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==
@@ -5054,6 +5167,18 @@ micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2"
picomatch "^2.3.1"
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.27:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
@@ -5113,12 +5238,17 @@ miragejs@^0.1.47:
lodash.values "^4.3.0"
pretender "^3.4.7"
+"monaco-editor@>= 0.21.0 < 1", "monaco-editor@>= 0.25.0 < 1":
+ version "0.47.0"
+ resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.47.0.tgz"
+ integrity sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==
+
mri@^1.1.0:
version "1.2.0"
resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"
integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
-ms@2.1.2, ms@^2.1.1:
+ms@^2.1.1, ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -5152,9 +5282,14 @@ negotiator@^0.6.3:
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
next-nprogress-bar@^2.3.8:
version "2.3.9"
- resolved "https://registry.yarnpkg.com/next-nprogress-bar/-/next-nprogress-bar-2.3.9.tgz#f271abb7e1f6bc95b024256f8dcec041dd63bcdb"
+ resolved "https://registry.npmjs.org/next-nprogress-bar/-/next-nprogress-bar-2.3.9.tgz"
integrity sha512-X4nJqpyXcqpXwcSyCzed8hKWnOCqzLaINVHdwokKpuJ76Qj8EGB9mPqwCcFhgXsvIdlzPLAKxq6ajPI9tSYmig==
dependencies:
nprogress "^0.2.0"
@@ -5229,7 +5364,7 @@ npm-run-path@^5.1.0:
nprogress@^0.2.0:
version "0.2.0"
- resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
+ resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz"
integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==
nth-check@^2.0.1:
@@ -5321,7 +5456,14 @@ once@^1.3.0:
dependencies:
wrappy "1"
-onetime@^5.1.0, onetime@^5.1.2:
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
@@ -5552,14 +5694,6 @@ postcss-nested@^6.0.1:
dependencies:
postcss-selector-parser "^6.0.11"
-postcss-selector-parser@6.0.10, postcss-selector-parser@^6.0.9:
- version "6.0.10"
- resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
- integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
- dependencies:
- cssesc "^3.0.0"
- util-deprecate "^1.0.2"
-
postcss-selector-parser@^6.0.11:
version "6.0.13"
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
@@ -5568,12 +5702,20 @@ postcss-selector-parser@^6.0.11:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
+postcss-selector-parser@^6.0.9, postcss-selector-parser@6.0.10:
+ version "6.0.10"
+ resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
+ integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@8.4.31, postcss@^8.4.23, postcss@^8.4.31:
+postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@>=8.0.9, postcss@8.4.31:
version "8.4.31"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz"
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
@@ -5648,6 +5790,13 @@ queue-microtask@^1.2.2:
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
rc-input@~1.3.5:
version "1.3.5"
resolved "https://registry.npmjs.org/rc-input/-/rc-input-1.3.5.tgz"
@@ -5693,7 +5842,7 @@ react-18-input-autosize@^3.0.0:
dependencies:
prop-types "^15.5.8"
-react-dom@^18.2.0:
+react-dom@*, "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", "react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18.2.0, react-dom@>=16.0.0, react-dom@>=16.14.0, react-dom@>=16.8.0, react-dom@>=16.9.0, react-dom@>=17, react-dom@>=17.x:
version "18.2.0"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
@@ -5742,7 +5891,12 @@ react-is@^16.13.1, react-is@^16.7.0:
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-react-is@^18.0.0, react-is@^18.2.0:
+react-is@^18.0.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
+ integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+
+react-is@^18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
@@ -5828,7 +5982,7 @@ react-window@^1.8.9:
"@babel/runtime" "^7.0.0"
memoize-one ">=3.1.1 <6"
-react@^18.2.0:
+"react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^15.0.0 || >=16.0.0", "react@^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", "react@^16 || ^17 || ^18", "react@^16.11.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 0.14.0", "react@>= 16", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16, react@>=16.0.0, react@>=16.13.1, react@>=16.14.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@>=17, react@>=17.x, "react@15.x || 16.x || 17.x || 18.x":
version "18.2.0"
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
@@ -6020,16 +6174,7 @@ resolve-pkg-maps@^1.0.0:
resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz"
integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
-resolve@^1.1.7, resolve@^1.10.0, resolve@^1.22.1, resolve@^1.22.2:
- version "1.22.2"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz"
- integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
- dependencies:
- is-core-module "^2.11.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-resolve@^1.22.4:
+resolve@^1.1.7, resolve@^1.10.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4:
version "1.22.8"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
@@ -6125,6 +6270,11 @@ safe-array-concat@^1.0.1:
has-symbols "^1.0.3"
isarray "^2.0.5"
+safe-buffer@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
safe-regex-test@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz"
@@ -6146,7 +6296,7 @@ safe-regex@^2.1.1:
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sass@^1.61.0:
+sass@^1.3.0, sass@^1.61.0:
version "1.64.1"
resolved "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz"
integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==
@@ -6155,23 +6305,27 @@ sass@^1.61.0:
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
-scheduler@^0.23.0:
+scheduler@^0.23.0, scheduler@>=0.19.0:
version "0.23.0"
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz"
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
dependencies:
loose-envify "^1.1.0"
+schema-utils@^3.1.1, schema-utils@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz"
+ integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
screenfull@^5.0.0:
version "5.2.0"
resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz"
integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==
-"semver@2 || 3 || 4 || 5":
- version "5.7.2"
- resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
- integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-
semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
@@ -6184,6 +6338,18 @@ semver@^7.0.0, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8, semve
dependencies:
lru-cache "^6.0.0"
+"semver@2 || 3 || 4 || 5":
+ version "5.7.2"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+serialize-javascript@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
+ dependencies:
+ randombytes "^2.1.0"
+
server-only@^0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz"
@@ -6311,16 +6477,29 @@ slice-ansi@^5.0.0:
ansi-styles "^6.0.0"
is-fullwidth-code-point "^4.0.0"
-sortablejs@^1.15.0:
+sortablejs@^1.15.0, sortablejs@1:
version "1.15.0"
resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz"
integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
+source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0":
version "1.0.2"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
source-map@^0.7.0:
version "0.7.4"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz"
@@ -6377,7 +6556,16 @@ string-argv@^0.3.1:
resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz"
integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==
-string-width@^4.1.0, string-width@^4.2.0:
+string-width@^4.1.0:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -6531,6 +6719,13 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
@@ -6556,7 +6751,7 @@ tabbable@^6.0.1:
resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz"
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
-tailwindcss@^3.3.3:
+tailwindcss@^3.3.3, "tailwindcss@>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1", "tailwindcss@>=3.0.0 || insiders":
version "3.3.3"
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz"
integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==
@@ -6584,11 +6779,32 @@ tailwindcss@^3.3.3:
resolve "^1.22.2"
sucrase "^3.32.0"
-tapable@^2.2.0:
+tapable@^2.1.1, tapable@^2.2.0:
version "2.2.1"
resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+terser-webpack-plugin@^5.3.10:
+ version "5.3.10"
+ resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz"
+ integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.20"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.1"
+ terser "^5.26.0"
+
+terser@^5.26.0:
+ version "5.30.3"
+ resolved "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz"
+ integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.3"
+ acorn "^8.8.2"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
@@ -6670,11 +6886,6 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@2.3.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz"
- integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
-
tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
@@ -6685,6 +6896,11 @@ tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1, "tslib@^2.4.1 || ^1.9.3", tslib@^2.5.0
resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz"
integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==
+tslib@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz"
+ integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz"
@@ -6758,7 +6974,7 @@ typed-array-length@^1.0.4:
for-each "^0.3.3"
is-typed-array "^1.1.9"
-typescript@4.9.5:
+"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=3.3.1, typescript@>=3.9, typescript@4.9.5:
version "4.9.5"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
@@ -6894,7 +7110,7 @@ use-strict@1.0.1:
resolved "https://registry.npmjs.org/use-strict/-/use-strict-1.0.1.tgz"
integrity sha512-IeiWvvEXfW5ltKVMkxq6FvNf2LojMKvB2OCeja6+ct24S1XOmQw2dGr2JyndwACWAGJva9B7yPHwAmeA9QCqAQ==
-use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0:
+use-sync-external-store@^1.2.0, use-sync-external-store@1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
@@ -6971,6 +7187,14 @@ vue-eslint-parser@^9.3.0:
lodash "^4.17.21"
semver "^7.3.6"
+watchpack@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz"
+ integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
watchpack@2.4.0:
version "2.4.0"
resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz"
@@ -6989,6 +7213,41 @@ web-worker@^1.2.0:
resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz"
integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.1.0, webpack@>=4:
+ version "5.91.0"
+ resolved "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz"
+ integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^1.0.5"
+ "@webassemblyjs/ast" "^1.12.1"
+ "@webassemblyjs/wasm-edit" "^1.12.1"
+ "@webassemblyjs/wasm-parser" "^1.12.1"
+ acorn "^8.7.1"
+ acorn-import-assertions "^1.9.0"
+ browserslist "^4.21.10"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.16.0"
+ es-module-lexer "^1.2.1"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.11"
+ json-parse-even-better-errors "^2.3.1"
+ loader-runner "^4.2.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^3.2.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.3.10"
+ watchpack "^2.4.1"
+ webpack-sources "^3.2.3"
+
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
@@ -7098,6 +7357,13 @@ yaml@^2.0.0, yaml@^2.1.1, yaml@^2.2.2:
resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz"
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
+yjs@>=13.5.22:
+ version "13.6.14"
+ resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.14.tgz"
+ integrity sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==
+ dependencies:
+ lib0 "^0.2.86"
+
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"