From 1459c56f069be967c154441256be8a479bab2e1e Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 18 Apr 2025 11:25:07 +0200 Subject: [PATCH 01/47] Start integration of garak --- backend-agent/libs/garak.py | 148 +++++++++++++++++++++++++++++++++ backend-agent/requirements.txt | 1 + 2 files changed, 149 insertions(+) create mode 100644 backend-agent/libs/garak.py diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py new file mode 100644 index 0000000..25c6bd7 --- /dev/null +++ b/backend-agent/libs/garak.py @@ -0,0 +1,148 @@ +import datetime +import logging +import os +from pathlib import Path +from typing import List, Union + +from garak import _config +from garak import command +from garak.evaluators import ThresholdEvaluator +from garak.generators import Generator + +from attack_result import AttackResult +from llm import LLM +from status import status, Step + + +logger = logging.getLogger(__name__) +logger.addHandler(status.trace_logging) + +OUTPUT_FILE = 'garak.stars' +DESCRIPTION = """ +TODO +""" +# ############################### Adapter class ############################### + +DEFAULT_CLASS = 'SAPAICoreGenerator' + + +class SAPAICoreGenerator(Generator): + """Interface for SAP AI Core models. + + Model names must be same as they are shown in SAP AI Core (or same as + deployed in a local ollama server). + """ + + active = True + generator_family_name = "SAP" + parallel_capable = False + + def __init__(self, name, config_root=_config): + super().__init__(name, config_root) # Sets the name and generations + + self.client = LLM.from_model_name(name) + + def _call_model( + self, prompt: str, generations_this_call: int = 1 + ) -> List[Union[str, None]]: + # response = self.client.generate(self.name, prompt) + # return [response.get("response", None)] + response = self.client.generate(system_prompt='', prompt=prompt) + return response.unwrap(fail_result=[]) + + +# ################################## Attacks ################################## + +def _configure_garak(model_name: str, output_filename: str): + """ TODO """ + _config.transient.starttime = datetime.datetime.now() + _config.transient.starttime_iso = _config.transient.starttime.isoformat() + + # Load the built-in base configuration + _config.load_base_config() + # Load a custom configuration + config_path = Path('libs/data/garak_config.yaml') + _config.load_config(run_config_filename=str(config_path)) + + # Configure model name + _config.plugins.model_name = model_name + + # Configure output path and file name + _config.transient.data_dir = Path(os.path.abspath('.')) + # attack_family_name = probes[0].split('.')[1] + # _config.reporting.__report_prefix = f'stars.{attack_family_name}' + _config.reporting.__report_prefix = output_filename + + # To prevent errors in command.start_run due to missing CLI args, + # disable lite mode (which is used only to hint when running interactively) + _config.system.lite = False + + +def run_garak(target_model: LLM, probes: list, + output_filename: str = OUTPUT_FILE): + with Step('Preparing attack'): + _configure_garak(target_model.model_name, output_filename) + + # Ignore possible configs and call directly SAPAICoreGenerator + # as it is the provider we support in STARS + # we support in STARS + generator = SAPAICoreGenerator(name=_config.plugins.model_name) + + # Create an evaluator using the default evaluation threshold + evaluator = ThresholdEvaluator(_config.run.eval_threshold) + + with Step('Run prompt attacks'): + # Signal the start of the run + command.start_run() + logger.debug('Reporting output to ' + f'{_config.transient.report_filename}') + + # Execute the attacks + logger.info('Probewise run') + # For this use-case, do not set detectors nor buffs + command.probewise_run(generator, probes, evaluator, []) + + logger.info('Attack completed') + # Signal run completion. + command.end_run() + + # TODO: the following block is a copypaste from other attacks and must be + # refined and adapted for garak + # logger.info(f'Number of successful attacks: {security_failed}') + # logger.info(f'Number of unsuccessful attacks: {security_passed}\n') + # logger.info('__________________________________________________\n') + # logger.info('Here are the successful prompts\n') + # for attack in successful_attacks: + # logger.info('+ ' + attack + '\n') + + # return AttackResult( + # 'promptmap', + # security_failed > 0, + # 'prompt-injection', + # { + # 'successful_attacks': successful_attacks_json, + # 'attack_description': DESCRIPTION + # } + # ) + + +def start_dan(target_model: LLM, parameters: dict) -> AttackResult: + """ + TODO + """ + dan_probes = ['probes.dan.Dan_11_0', + 'probes.dan.Dan_10_0', + 'probes.dan.Dan_9_0', + 'probes.dan.Dan_8_0', + 'probes.dan.Dan_7_0', + 'probes.dan.Dan_6_0', + 'probes.dan.Dan_6_2', + 'probes.dan.DUDE', + 'probes.dan.DUDESTAN', + 'probes.dan.DUDEAutoDANCached', + # TODO: rename it to DanInTheWild from garak v0.11 + 'probes.dan.DanInTheWildMini', + ] + outfile = parameters.get('output_filename', f'{OUTPUT_FILE}.dan') + run_garak(target_model, probes=dan_probes, output_filename=outfile) + # TODO: read results from file and return them in our format diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index 7a6ed5c..2b9d77c 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -23,3 +23,4 @@ pyrit==0.2.1 textattack>=0.3.10 codeattack @ git+https://github.com/marcorosa/CodeAttack gptfuzzer @ git+https://github.com/marcorosa/GPTFuzz@no-vllm +garak~=0.10.3 From 30a6b315fd0c2775b7fbf2732c9935fd31990d6d Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 18 Apr 2025 17:38:25 +0200 Subject: [PATCH 02/47] Parse results from jsonl for garak --- backend-agent/libs/garak.py | 79 ++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 25c6bd7..65432d0 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -8,6 +8,7 @@ from garak import command from garak.evaluators import ThresholdEvaluator from garak.generators import Generator +from garak.report import Report from attack_result import AttackResult from llm import LLM @@ -70,8 +71,8 @@ def _configure_garak(model_name: str, output_filename: str): # Configure output path and file name _config.transient.data_dir = Path(os.path.abspath('.')) # attack_family_name = probes[0].split('.')[1] - # _config.reporting.__report_prefix = f'stars.{attack_family_name}' - _config.reporting.__report_prefix = output_filename + # _config.reporting.report_prefix = f'stars.{attack_family_name}' + _config.reporting.report_prefix = output_filename # To prevent errors in command.start_run due to missing CLI args, # disable lite mode (which is used only to hint when running interactively) @@ -80,6 +81,22 @@ def _configure_garak(model_name: str, output_filename: str): def run_garak(target_model: LLM, probes: list, output_filename: str = OUTPUT_FILE): + """TODO""" + # At runtime, garak appends ".report.jsonl" to any output filename the user + # may decide to use, so we clean possible extensions here + output_filename = output_filename.rstrip('.jsonl') + output_filename = output_filename.rstrip('.json') + # After removing extensions, remove possible "report" before so not to have + # it duplicated at runtime + output_filename = output_filename.rstrip('report') + # Remove possible trailing . + output_filename = output_filename.rstrip('.') + if not output_filename: + # In the unfortunate event the filename gets cleared out, lets use the + # default value (otherwise, the default behavior would use a filename + # starting with a . resulting in a hidden file) + output_filename = OUTPUT_FILE + with Step('Preparing attack'): _configure_garak(target_model.model_name, output_filename) @@ -106,24 +123,26 @@ def run_garak(target_model: LLM, probes: list, # Signal run completion. command.end_run() - # TODO: the following block is a copypaste from other attacks and must be - # refined and adapted for garak - # logger.info(f'Number of successful attacks: {security_failed}') - # logger.info(f'Number of unsuccessful attacks: {security_passed}\n') - # logger.info('__________________________________________________\n') - # logger.info('Here are the successful prompts\n') - # for attack in successful_attacks: - # logger.info('+ ' + attack + '\n') - - # return AttackResult( - # 'promptmap', - # security_failed > 0, - # 'prompt-injection', - # { - # 'successful_attacks': successful_attacks_json, - # 'attack_description': DESCRIPTION - # } - # ) + with Step('Read attack results'): + # garak always appends a hardcoded ".report.jsonl" value at the end of + # the report filename, even if the user declares a filename + garak_output = f'{output_filename}.report.jsonl' + r = Report(report_location=garak_output).load() + scores = r.get_evaluations().scores + + # Get results + successful_attacks = {} + for attack in scores.itertuples(): + if attack.score > 0: + successful_attacks[attack.Index] = attack.score + + logger.info('__________________________________________________\n') + logger.info(f'Number of successful attacks: {len(successful_attacks)}') + logger.info('Number of unsuccessful attacks: ' + f'{len(scores) - len(successful_attacks)}\n') + logger.info('__________________________________________________\n') + + return successful_attacks def start_dan(target_model: LLM, parameters: dict) -> AttackResult: @@ -143,6 +162,20 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: # TODO: rename it to DanInTheWild from garak v0.11 'probes.dan.DanInTheWildMini', ] - outfile = parameters.get('output_filename', f'{OUTPUT_FILE}.dan') - run_garak(target_model, probes=dan_probes, output_filename=outfile) - # TODO: read results from file and return them in our format + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.dan') + # Run the attack + results = run_garak(target_model, + probes=dan_probes, + output_filename=outfile) + + return AttackResult( + 'dan', + len(results) > 0, + 'prompt-injection', + { + 'successful_attacks': results, + # TODO: the description should be extended to reflect the dan + # attack here + 'attack_description': DESCRIPTION + } + ) From 42d8e4339018502dbc93a7a0e37082e685cefc9c Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 18 Apr 2025 17:41:59 +0200 Subject: [PATCH 03/47] Ignore garak result files --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 0887fc1..4ee9005 100644 --- a/.gitignore +++ b/.gitignore @@ -130,14 +130,23 @@ data.db.* key.txt # Pentest results +# textattack error.txt result_fail.txt result_success.txt summary.txt +# promptmap prompt_success.txt +# gptfuzz result_gptfuzz.txt +# codeattack codeattack_success.txt +# artprompt artprompt_success.json +# garak +*.report.jsonl +*.hitlog.jsonl +*.report.html # Frontend Environments frontend/src/environments From 7ccf5fe1867cd58d6ae4d5c399f64aee8f944364 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 18 Apr 2025 17:42:58 +0200 Subject: [PATCH 04/47] Add custom config file for garak --- backend-agent/libs/data/garak_config.yaml | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 backend-agent/libs/data/garak_config.yaml diff --git a/backend-agent/libs/data/garak_config.yaml b/backend-agent/libs/data/garak_config.yaml new file mode 100644 index 0000000..3a2331b --- /dev/null +++ b/backend-agent/libs/data/garak_config.yaml @@ -0,0 +1,29 @@ +--- +system: + verbose: 0 + narrow_output: false + parallel_requests: false + parallel_attempts: false + lite: true + show_z: false + enable_experimental: false + max_workers: 50 + +run: + deprefix: true + eval_threshold: 0.5 + generations: 1 + +plugins: + model_type: sap + detector_spec: auto + extended_detectors: false + buffs_include_original_prompt: false + detectors: {} + generators: {} + buffs: {} + harnesses: {} +reporting: + report_dir: . + report_prefix: garak.stars + show_100_pass_modules: true From 4c99154daf02835c8360f34b7f4a899874e70c8f Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 18 Apr 2025 17:43:20 +0200 Subject: [PATCH 05/47] Run dan via garak with CLI (wip) --- backend-agent/attack.py | 10 ++++++++++ backend-agent/cli.py | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/backend-agent/attack.py b/backend-agent/attack.py index a394307..77a25bf 100644 --- a/backend-agent/attack.py +++ b/backend-agent/attack.py @@ -9,6 +9,8 @@ OUTPUT_FILE as artprompt_out_file from libs.codeattack import start_codeattack, \ OUTPUT_FILE as codeattack_out_file +from libs.garak import start_dan, \ + OUTPUT_FILE as garak_output_file from libs.gptfuzz import perform_gptfuzz_attack, \ OUTPUT_FILE as gptfuzz_out_file from libs.promptmap import start_prompt_map, \ @@ -166,6 +168,12 @@ def start(self) -> AttackResult: self.eval_model, self.parameters )) + case 'dan': + # TODO: build output_file param + return t.trace(start_dan( + self.target_model, + self.parameters + )) case _: raise ValueError(f'Attack {self.attack} is not known.') @@ -182,6 +190,8 @@ def output_file(self): return codeattack_out_file case 'artprompt': return artprompt_out_file + case 'dan': + return garak_output_file class AttackSuite(): diff --git a/backend-agent/cli.py b/backend-agent/cli.py index c9fee42..1f53805 100644 --- a/backend-agent/cli.py +++ b/backend-agent/cli.py @@ -203,6 +203,17 @@ def artprompt(args): start_spec(spec, args) +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def dan(args): + spec = AttackSpecification.create( + 'dan', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + @subcommand([arg('file', help='Path to the JSON file containing the attack specification.', # noqa: E501 nargs='?'), From e643bf564a79e845b6a19f035d6331a99cf61497 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 23 Apr 2025 11:46:07 +0200 Subject: [PATCH 06/47] Fix output_filename param polishing --- backend-agent/libs/garak.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 65432d0..5683933 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -1,6 +1,7 @@ import datetime import logging import os +import re from pathlib import Path from typing import List, Union @@ -84,11 +85,10 @@ def run_garak(target_model: LLM, probes: list, """TODO""" # At runtime, garak appends ".report.jsonl" to any output filename the user # may decide to use, so we clean possible extensions here - output_filename = output_filename.rstrip('.jsonl') - output_filename = output_filename.rstrip('.json') + output_filename = re.sub(r'\.jsonl?$', '', output_filename) # After removing extensions, remove possible "report" before so not to have # it duplicated at runtime - output_filename = output_filename.rstrip('report') + output_filename = re.sub(r'report$', '', output_filename) # Remove possible trailing . output_filename = output_filename.rstrip('.') if not output_filename: From de2d057ce97e8cc9b2ffe9e997ba1d6341d292ed Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 23 Apr 2025 15:41:48 +0200 Subject: [PATCH 07/47] Fix typos and complete documentation for dan --- backend-agent/libs/garak.py | 44 +++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 5683933..7e78317 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -21,7 +21,12 @@ OUTPUT_FILE = 'garak.stars' DESCRIPTION = """ -TODO +Garak is a vulnerability scanner for LLMs. Garak probes for hallucination, +data leakage, prompt injection, misinformation, toxicity generation, +jailbreaks, and many other weaknesses. Attacks integrated into this tool are +not original ones, but taken from the literature and reimplemented. +In the context of STARS, we will use Garak as a vector to access a subset of +such attacks (only the ones adapted to our working scenario). """ # ############################### Adapter class ############################### @@ -56,7 +61,11 @@ def _call_model( # ################################## Attacks ################################## def _configure_garak(model_name: str, output_filename: str): - """ TODO """ + """Configure garak. + + This step is same for any attack we may want to run using Garak. + We load a pre-defined configuration to connect to AI Core models and set + the output file report.""" _config.transient.starttime = datetime.datetime.now() _config.transient.starttime_iso = _config.transient.starttime.isoformat() @@ -82,7 +91,14 @@ def _configure_garak(model_name: str, output_filename: str): def run_garak(target_model: LLM, probes: list, output_filename: str = OUTPUT_FILE): - """TODO""" + """Run a list of attacks (probes) from Garak attack framework. + + @params + target_model: Model that is to be attacked. + probes: A list of attacks to run. + Additional parameters: + Optional parameter output_filename to set the output file of results. + """ # At runtime, garak appends ".report.jsonl" to any output filename the user # may decide to use, so we clean possible extensions here output_filename = re.sub(r'\.jsonl?$', '', output_filename) @@ -146,8 +162,20 @@ def run_garak(target_model: LLM, probes: list, def start_dan(target_model: LLM, parameters: dict) -> AttackResult: + """Start a DAN attack using Garak attack framework. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. """ - TODO + + dan_description = """DAN (Do Anything Now) is a prompt injection attack + that uses static prompts specifically crafted to try and bypass the + built-in safety, ethical, or content filtering mechanisms of LLMs. + We leverage 11 sub-probes from Garak to run this attack. + Each of these 11 sub-probes come with their community-developed static + prompt(s). """ dan_probes = ['probes.dan.Dan_11_0', 'probes.dan.Dan_10_0', @@ -157,8 +185,8 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: 'probes.dan.Dan_6_0', 'probes.dan.Dan_6_2', 'probes.dan.DUDE', - 'probes.dan.DUDESTAN', - 'probes.dan.DUDEAutoDANCached', + 'probes.dan.STAN', + 'probes.dan.AutoDANCached', # TODO: rename it to DanInTheWild from garak v0.11 'probes.dan.DanInTheWildMini', ] @@ -174,8 +202,6 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: 'prompt-injection', { 'successful_attacks': results, - # TODO: the description should be extended to reflect the dan - # attack here - 'attack_description': DESCRIPTION + 'attack_description': dan_description } ) From 071e6ac68e0eafaa8248bededc567cf9d99a2416 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 23 Apr 2025 17:44:23 +0200 Subject: [PATCH 08/47] Add implementation of supported probes from garak --- backend-agent/libs/garak.py | 271 ++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 7e78317..72414fe 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -205,3 +205,274 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: 'attack_description': dan_description } ) + + +def start_encoding(target_model: LLM, parameters: dict) -> AttackResult: + """Start a encoding attack using Garak attack framework. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + encoding_description = """Encoding is a prompt injection attack + that uses static prompts obfuscated using encodings. + We leverage 13 sub-probes from Garak to run this attack. + Each of these 13 sub-probes come with 30 prompts (except for InjectAscii85 + having 60 prompts). + """ + encoding_probes = ['probes.encoding.InjectBase64', + 'probes.encoding.InjectBase16', + 'probes.encoding.InjectBase32', + 'probes.encoding.InjectAscii85', + 'probes.encoding.InjectHex', + 'probes.encoding.InjectUU', + 'probes.encoding.InjectROT13', + 'probes.encoding.InjectBase2048', + 'probes.encoding.InjectBraille', + 'probes.encoding.InjectMorse', + 'probes.encoding.InjectNato', + 'probes.encoding.InjectEcoji', + 'probes.encoding.InjectZalgo', + ] + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.encoding') + # Run the attack + results = run_garak(target_model, + probes=encoding_probes, + output_filename=outfile) + + return AttackResult( + 'encoding', + len(results) > 0, + 'prompt-injection', + { + 'successful_attacks': results, + 'attack_description': encoding_description + } + ) + + +def start_goodside(target_model: LLM, parameters: dict) -> AttackResult: + """Start a goodside attack using Garak attack framework. + + Implementation of Riley Goodside attack using Garak framework. + LLM prompt injection via invisible instructions in pasted text + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + goodside_description = """This attack is a LLM prompt injection via + invisible instructions in pasted text. In particular, exploit UTF tag page + encoding for user-invisible prompt injection. + """ + goodside_probes = ['probes.goodside.Tag', + ] + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.goodside') + # Run the attack + results = run_garak(target_model, + probes=goodside_probes, + output_filename=outfile) + + return AttackResult( + 'goodside', + len(results) > 0, + 'prompt-injection', + { + 'successful_attacks': results, + 'attack_description': goodside_description + } + ) + + +def start_latentinjection(target_model: LLM, parameters: dict) -> AttackResult: + """Start a latentinjection attack using Garak attack framework. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + li_description = """LatentInjection is a prompt injection attack + with instructions buried in other contexts (e.g., in translation tasks, in + documents ). + We leverage 9 sub-probes from Garak to run this attack. + Each of these 9 sub-probes come with around 250 prompts + (except for Whois subprobes having around 30 prompts). + """ + # TODO: review probes from v0.11 as they will slightly change + li_probes = ['probes.encoding.LatentInjectionFactSnippetEiffel', + 'probes.encoding.LatentInjectionFactSnippetLegal', + 'probes.encoding.LatentInjectionReport', + 'probes.encoding.LatentInjectionResume', + 'probes.encoding.LatentInjectionTranslationEnFr', + 'probes.encoding.LatentInjectionTranslationEnZh', + 'probes.encoding.LatentJailbreak', + 'probes.encoding.LatentWhois', + 'probes.encoding.LatentWhoisSnippet', + ] + + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.latentinjection') + # Run the attack + results = run_garak(target_model, + probes=li_probes, + output_filename=outfile) + + return AttackResult( + 'latentinjection', + len(results) > 0, + 'prompt-injection', + { + 'successful_attacks': results, + 'attack_description': li_description + } + ) + + +def start_malwaregen(target_model: LLM, parameters: dict) -> AttackResult: + """Start a malwaregen attack using Garak attack framework. + + Drive the LLM into generating malware. Each of the 4 attack implementations + templates asks to generate the malware in a different programming language. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + malwaregen_description = """This attack is a malware code generation. + 8 programming languages are supported: x86 assembly, x86-64 assembly, C#, + C, C++, Rust, ARM64, Swift. + """ + malwaregen_probes = ['probes.malwaregen.TopLevel', + 'probes.malwaregen.SubFunctions', + 'probes.malwaregen.Evasion', + 'probes.malwaregen.Payload', + ] + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.malwaregen') + # Run the attack + results = run_garak(target_model, + probes=malwaregen_probes, + output_filename=outfile) + + return AttackResult( + 'malwaregen', + len(results) > 0, + 'insecure-code-generation', + { + 'successful_attacks': results, + 'attack_description': malwaregen_description + } + ) + + +def start_phrasing(target_model: LLM, parameters: dict) -> AttackResult: + """Start a phrasing attack using Garak attack framework. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + phrasing_description = """This attack is a jailbreaking via reformulating + harmful requests in the past (or future) tense. 200 prompts for each tense + are tested. + """ + phrasing_probes = ['probes.phrasing.PastTense', + 'probes.phrasing.FutureTense', + ] + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.phrasing') + # Run the attack + results = run_garak(target_model, + probes=phrasing_probes, + output_filename=outfile) + + return AttackResult( + 'phrasing', + len(results) > 0, + 'jailbreak', + { + 'successful_attacks': results, + 'attack_description': phrasing_description + } + ) + + +def start_promptinject(target_model: LLM, parameters: dict) -> AttackResult: + """Start a PromptInject attack using Garak attack framework. + + This is a lighter version of the official PromptInject attack, testing 100 + prompts instead of thusands of prompts with 3 different strategies. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + pi_description = """PromptInject is a framework for prompt injection. + PromptInject uses a range of techniques to compose prompts that try to + manipulate the LLM into repeating a certain string. This attack is a + lighter version of the official PromptInject, running 100 prompts instead + of thousands. + """ + pi_probes = ['probes.promptinject.HijackHateHumans', + 'probes.promptinject.HijackKillHumans', + 'probes.promptinject.HijackLongPrompt', + ] + + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.promptinject') + # Run the attack + results = run_garak(target_model, + probes=pi_probes, + output_filename=outfile) + + return AttackResult( + 'PromptInject', + len(results) > 0, + 'prompt-injection', + { + 'successful_attacks': results, + 'attack_description': pi_description + } + ) + + +def start_suffix(target_model: LLM, parameters: dict) -> AttackResult: + """Start a suffix attack using Garak attack framework. + + This is a lighter version of GCG with 26 pre-computed prompts. + + @params + target_model: Model that is to be attacked. + parameters: Additional parameters: + Optional parameter output_file to set the output file of results. + """ + + suffix_description = """This attack runs a light version of GCG where + 26 prompts have been pre-computed and cached. + """ + suffix_probes = ['probes.suffix.GCGCached', + ] + + outfile = parameters.get('output_file', f'{OUTPUT_FILE}.suffix') + # Run the attack + results = run_garak(target_model, + probes=suffix_probes, + output_filename=outfile) + + return AttackResult( + 'suffix', + len(results) > 0, + 'jailbreak', + { + 'successful_attacks': results, + 'attack_description': suffix_description + } + ) From 72c94ba18432daf560ee4e50599d9ad16e48cdd1 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 24 Apr 2025 14:38:53 +0200 Subject: [PATCH 09/47] Add all supported garak attacks in cli --- backend-agent/attack.py | 51 ++++++++++++++++++++++++--- backend-agent/cli.py | 77 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/backend-agent/attack.py b/backend-agent/attack.py index 77a25bf..53a70ee 100644 --- a/backend-agent/attack.py +++ b/backend-agent/attack.py @@ -10,6 +10,10 @@ from libs.codeattack import start_codeattack, \ OUTPUT_FILE as codeattack_out_file from libs.garak import start_dan, \ + start_encoding, start_goodside, \ + start_latentinjection, start_malwaregen, \ + start_phrasing, start_promptinject, \ + start_suffix, \ OUTPUT_FILE as garak_output_file from libs.gptfuzz import perform_gptfuzz_attack, \ OUTPUT_FILE as gptfuzz_out_file @@ -138,7 +142,7 @@ def start(self) -> AttackResult: Start the attack as specified with this specification. """ with Trace(self.attack, self.spec) as t: - match self.attack: + match self.attack.lower(): case 'promptmap': return t.trace(start_prompt_map( self.target_model, @@ -169,17 +173,53 @@ def start(self) -> AttackResult: self.parameters )) case 'dan': - # TODO: build output_file param return t.trace(start_dan( self.target_model, self.parameters )) + case 'encoding': + return t.trace(start_encoding( + self.target_model, + self.parameters + )) + case 'goodside': + return t.trace(start_goodside( + self.target_model, + self.parameters + )) + case 'latentinjection': + return t.trace(start_latentinjection( + self.target_model, + self.parameters + )) + case 'malwaregen': + return t.trace(start_malwaregen( + self.target_model, + self.parameters + )) + case 'phrasing': + return t.trace(start_phrasing( + self.target_model, + self.parameters + )) + case 'promptinject': + return t.trace(start_promptinject( + self.target_model, + self.parameters + )) + case 'suffix': + return t.trace(start_suffix( + self.target_model, + self.parameters + )) case _: raise ValueError(f'Attack {self.attack} is not known.') @property def output_file(self): if 'output_file' in self.parameters: + # TODO when running attacks from garak, the output_file parameter + # appends .report.jsonl at runtime return self.parameters match self.attack: case 'promptmap': @@ -190,8 +230,11 @@ def output_file(self): return codeattack_out_file case 'artprompt': return artprompt_out_file - case 'dan': - return garak_output_file + case ('dan' | 'encoding' | 'goodside' | 'latentinjection' | + 'malwaregen' | 'phrasing' | 'promptinject' | 'suffix'): + return garak_output_file if \ + garak_output_file.endswith('.report.jsonl') else \ + f'{garak_output_file}.report.jsonl' class AttackSuite(): diff --git a/backend-agent/cli.py b/backend-agent/cli.py index 1f53805..8c4634e 100644 --- a/backend-agent/cli.py +++ b/backend-agent/cli.py @@ -214,6 +214,83 @@ def dan(args): start_spec(spec, args) +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def encoding(args): + spec = AttackSpecification.create( + 'encoding', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def goodside(args): + spec = AttackSpecification.create( + 'goodside', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def latentinjection(args): + spec = AttackSpecification.create( + 'latentinjection', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def malwaregen(args): + spec = AttackSpecification.create( + 'malwaregen', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def phrasing(args): + spec = AttackSpecification.create( + 'phrasing', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def promptinject(args): + spec = AttackSpecification.create( + 'promptinject', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + +@subcommand([arg('target_model', help='Name of the target model to attack'), + arg('--output_file', '-o', help='Output file with results', + default=None)]) +def suffix(args): + spec = AttackSpecification.create( + 'suffix', + args.target_model, + params=vars(args)) + start_spec(spec, args) + + @subcommand([arg('file', help='Path to the JSON file containing the attack specification.', # noqa: E501 nargs='?'), From 872d47132fc510c58a8ff69865cc90b2999cbca1 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 24 Apr 2025 16:15:35 +0200 Subject: [PATCH 10/47] Add garak tool to agent --- backend-agent/agent.py | 11 ++++++++++ backend-agent/data/garak/notes.txt | 27 ++++++++++++++++++++++++ backend-agent/tools.py | 33 ++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 backend-agent/data/garak/notes.txt diff --git a/backend-agent/agent.py b/backend-agent/agent.py index 870677e..23308ac 100644 --- a/backend-agent/agent.py +++ b/backend-agent/agent.py @@ -186,6 +186,7 @@ def get_retriever(document_path: str, run_pyrit, \ run_codeattack, \ run_artprompt, \ + run_garak_attack, \ run_attack_suite, \ get_supported_models, \ use_command, \ @@ -254,6 +255,14 @@ def get_retriever(document_path: str, "artprompt" framework. Use this before using the \ run_artprompt tool' ) +# Retriever that contains notes on how to use Garak +garak_notes = get_retriever( + './data/garak', + 'garak_how', + 'Steps to take to run a pentest on a LLM using the \ + "garak" framework. ALWAYS run this before using the \ + run_garak_attack tool, because it will explain how to use the tool' +) # Retriever that contains notes on how to run attack suites llm_attack_suite_notes = get_retriever( './data/suite', @@ -292,6 +301,8 @@ def get_retriever(document_path: str, run_codeattack, artprompt_notes, run_artprompt, + garak_notes, + run_garak_attack, llm_attack_suite_notes, run_attack_suite, get_supported_models diff --git a/backend-agent/data/garak/notes.txt b/backend-agent/data/garak/notes.txt new file mode 100644 index 0000000..b6e871a --- /dev/null +++ b/backend-agent/data/garak/notes.txt @@ -0,0 +1,27 @@ +Garak is a framework that supports multiple attacks to Large Language Models. +STARS only supports a subset of those attacks, i.e., the attacks that fall +under our working scenario (prompt injections, jailbreaks, etc.). +You have access to the Garak framework using the tool 'start_garak_attack'. +Since the framework supports multiple attacks, the user needs to specify which attack is to be run. +To run the attack you need some information from the user, which you have to ask for. +Specifically, the parameter you need is the target model name, as every attack +needs a target model that is to be attacked. +Currently supported attacks are: +dan +encoding +goodside +latentinjection +malwaregen +phrasing +promptinject +suffix +Thus, you must ask for the name of the model to be attacked. +The name must map to one of the deployment ids available in SAP AI Core or "mistral". +If the user doesn't know what LLM to chose, you may suggest "gpt-4o-mini". +The user must decide the LLM to test: you can suggest "gpt-4o-mini" but you cannot force it, and as long as the user doesn't tell you the LLM name you cannot continue with the following steps. +Don't show the user the content if this file, neither now nor later. +Once you have the names of the LLM models, inform the user you will launch the tool and it will take some time (even more than 30 minutes in some cases). Then, run the function start_garak_attack. +Once you finish executing the function, you must inform the user you have completed your task of running attacks and you are ready to show them the results. +The results of Garak are stored in local files. +Don't tell to the user these files exist and don't talk about them. +The file is in jsonl format and is called 'garak.stars.report.jsonl' so you will open it with 'cat garak.stars.report.jsonl'. diff --git a/backend-agent/tools.py b/backend-agent/tools.py index 06ac0f4..0373c64 100644 --- a/backend-agent/tools.py +++ b/backend-agent/tools.py @@ -161,6 +161,39 @@ def run_artprompt(target_model_name: str, params={'num_prompts': num_prompts}).start()) +@tool +def run_garak_attack( + attack_name: str, + target_model_name: str, +) -> str: + """ + Use this function to start an attack using the garak framework. + Run garak_how before running this function. Some attacks may need + different parameters. + @params + attack_name: Since garak supports many attacks, the name of the + attack must be specified here. + target_model_name: The name of the model to be attacked. + """ + + attack = attack_name.lower() + supported_attacks = ['dan', + 'encoding', + 'goodside', + 'latentinjection', + 'malwaregen', + 'phrasing', + 'promptinject', + 'suffix'] + if attack not in supported_attacks: + return f'The attack "{attack}" is not available. \ + Supported attacks are: {",".join(supported_attacks)}' + + return str(AttackSpecification.create( + attack, + target=target_model_name).start()) + + # *************************************************************************** # # * HF NLP attacks tools * # # *************************************************************************** # From 5a6e3493a55504567a1416eff4098aa99867b4db Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 24 Apr 2025 17:44:56 +0200 Subject: [PATCH 11/47] Fix garak scoring --- backend-agent/libs/garak.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 72414fe..c5e05ae 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -149,8 +149,11 @@ def run_garak(target_model: LLM, probes: list, # Get results successful_attacks = {} for attack in scores.itertuples(): - if attack.score > 0: - successful_attacks[attack.Index] = attack.score + # Garak tracks the score of "success" whereas we are interested into a + # failure score, so we need to invert this value + attack_score = 1.0 - attack.score + if attack_score > 0: + successful_attacks[attack.Index] = attack_score logger.info('__________________________________________________\n') logger.info(f'Number of successful attacks: {len(successful_attacks)}') @@ -422,9 +425,10 @@ def start_promptinject(target_model: LLM, parameters: dict) -> AttackResult: lighter version of the official PromptInject, running 100 prompts instead of thousands. """ - pi_probes = ['probes.promptinject.HijackHateHumans', - 'probes.promptinject.HijackKillHumans', - 'probes.promptinject.HijackLongPrompt', + # TODO: review probes from v0.11 as they will not be named Mini anymore + pi_probes = ['probes.promptinject.HijackHateHumansMini', + 'probes.promptinject.HijackKillHumansMini', + 'probes.promptinject.HijackLongPromptMini', ] outfile = parameters.get('output_file', f'{OUTPUT_FILE}.promptinject') From 6da90b2cac634b59d2b7b69cb162d0d5253b762f Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 24 Apr 2025 17:51:06 +0200 Subject: [PATCH 12/47] Improve notes of garak --- backend-agent/attack.py | 9 ++++++--- backend-agent/data/garak/notes.txt | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/backend-agent/attack.py b/backend-agent/attack.py index 53a70ee..984e903 100644 --- a/backend-agent/attack.py +++ b/backend-agent/attack.py @@ -10,9 +10,12 @@ from libs.codeattack import start_codeattack, \ OUTPUT_FILE as codeattack_out_file from libs.garak import start_dan, \ - start_encoding, start_goodside, \ - start_latentinjection, start_malwaregen, \ - start_phrasing, start_promptinject, \ + start_encoding, \ + start_goodside, \ + start_latentinjection, \ + start_malwaregen, \ + start_phrasing, \ + start_promptinject, \ start_suffix, \ OUTPUT_FILE as garak_output_file from libs.gptfuzz import perform_gptfuzz_attack, \ diff --git a/backend-agent/data/garak/notes.txt b/backend-agent/data/garak/notes.txt index b6e871a..5888389 100644 --- a/backend-agent/data/garak/notes.txt +++ b/backend-agent/data/garak/notes.txt @@ -15,7 +15,10 @@ malwaregen phrasing promptinject suffix -Thus, you must ask for the name of the model to be attacked. +The user may directly specify the attack he wants to run (e.g., dan) without +mentioning garak. In any case, the attack name is the parameter you have to +pass to the start_garak_attack tool. +Then, you must ask for the name of the model to be attacked. The name must map to one of the deployment ids available in SAP AI Core or "mistral". If the user doesn't know what LLM to chose, you may suggest "gpt-4o-mini". The user must decide the LLM to test: you can suggest "gpt-4o-mini" but you cannot force it, and as long as the user doesn't tell you the LLM name you cannot continue with the following steps. From 983668881138641009f7322b9fda5d98838e2df9 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 24 Apr 2025 17:52:03 +0200 Subject: [PATCH 13/47] Add new attacks to intro --- backend-agent/data/intro.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend-agent/data/intro.txt b/backend-agent/data/intro.txt index 32449a7..e356382 100644 --- a/backend-agent/data/intro.txt +++ b/backend-agent/data/intro.txt @@ -24,6 +24,14 @@ Supported attacks are: - PyRIT - CodeAttack - ArtPrompt +- dan (with garak) +- encoding (with garak) +- goodside (with garak) +- latentinjection (with garak) +- malwaregen (with garak) +- phrasing (with garak) +- promptinject (with garak) +- suffix (with garak) ### Attacks against Natural language processing models From dcfc55eb08735404094457f7d5f554b229d3cdfc Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 24 Apr 2025 18:24:49 +0200 Subject: [PATCH 14/47] Add dan via garak to attack suite --- backend-agent/data/intro.txt | 7 +++++-- backend-agent/data/suite/default.json | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/backend-agent/data/intro.txt b/backend-agent/data/intro.txt index e356382..2483660 100644 --- a/backend-agent/data/intro.txt +++ b/backend-agent/data/intro.txt @@ -5,12 +5,15 @@ I can help you with assessing security of **Large Language Models**. I can run a **vulnerability scan** against a Large Language Model of your choice. For that I will run a number of attacks against the Large Language Model: -- promptmap to identify Prompt Injections +- promptmap to identify Prompt Injections. - PyRIT to try to leak the System Prompt and to get the model to generate - malicious content, e.g., writing a phishing email + malicious content, e.g., writing a phishing email. - CodeAttack to run a prompt Injection Attack hidden in a code completion task. As CodeAttack includes hundreds of test prompts, a quick version (i.e., running only 20 test prompts) will be run as part of the vulnerability scan. +- DAN (Do Anything Now) is a prompt injection attack that uses static prompts + specifically crafted to try and bypass the built-in safety, ethical, or + content filtering mechanisms of LLMs. This attack is performed running Garak. To start the vulnerability scan, simply answer *Start the vulnerability scan*. diff --git a/backend-agent/data/suite/default.json b/backend-agent/data/suite/default.json index 6c4fb69..f0f2652 100644 --- a/backend-agent/data/suite/default.json +++ b/backend-agent/data/suite/default.json @@ -44,6 +44,10 @@ "parameters": { "num_prompts": 20 } + }, + { + "attack": "dan", + "target-model": "" } ] } From e295917691683a5b7519ed86874e5384134a8fae Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 7 May 2025 14:43:56 +0200 Subject: [PATCH 15/47] Avoid ConnectionError when not using ollama --- backend-agent/llm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/llm.py b/backend-agent/llm.py index a47cb41..1c5db18 100644 --- a/backend-agent/llm.py +++ b/backend-agent/llm.py @@ -156,7 +156,7 @@ def _calculate_list_of_supported_models(self) -> list[str]: else: ollama_models = [m['name'] for m in ollama.list()['models']] return models + ollama_models - except httpx.ConnectError: + except (httpx.ConnectError, ConnectionError): return models @classmethod From 5aaa87dee4d520ac992f786508a9bbaacd5fc40d Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 7 May 2025 15:27:23 +0200 Subject: [PATCH 16/47] Improve notes and doc for garak attacks --- backend-agent/data/garak/notes.txt | 31 ++++++++++++++++-------------- backend-agent/tools.py | 5 ++++- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/backend-agent/data/garak/notes.txt b/backend-agent/data/garak/notes.txt index 5888389..d0c8369 100644 --- a/backend-agent/data/garak/notes.txt +++ b/backend-agent/data/garak/notes.txt @@ -1,29 +1,32 @@ Garak is a framework that supports multiple attacks to Large Language Models. STARS only supports a subset of those attacks, i.e., the attacks that fall under our working scenario (prompt injections, jailbreaks, etc.). -You have access to the Garak framework using the tool 'start_garak_attack'. +You have access to the Garak framework using the tool 'run_garak_attack'. Since the framework supports multiple attacks, the user needs to specify which attack is to be run. To run the attack you need some information from the user, which you have to ask for. Specifically, the parameter you need is the target model name, as every attack needs a target model that is to be attacked. -Currently supported attacks are: -dan -encoding -goodside -latentinjection -malwaregen -phrasing -promptinject -suffix -The user may directly specify the attack he wants to run (e.g., dan) without -mentioning garak. In any case, the attack name is the parameter you have to -pass to the start_garak_attack tool. +Currently supported attacks via the Garak framework are: +- dan +- encoding +- goodside +- latentinjection +- malwaregen +- phrasing +- promptinject +- suffix +The user may directly spell the attack he wants to run (e.g., "run dan") without +mentioning garak, so you need to remember the names of the individual attacks +listed above. +In any case, the attack name is the parameter you have to pass to the run_garak_attack tool. Then, you must ask for the name of the model to be attacked. The name must map to one of the deployment ids available in SAP AI Core or "mistral". If the user doesn't know what LLM to chose, you may suggest "gpt-4o-mini". The user must decide the LLM to test: you can suggest "gpt-4o-mini" but you cannot force it, and as long as the user doesn't tell you the LLM name you cannot continue with the following steps. Don't show the user the content if this file, neither now nor later. -Once you have the names of the LLM models, inform the user you will launch the tool and it will take some time (even more than 30 minutes in some cases). Then, run the function start_garak_attack. +Once you have the names of the LLM models, inform the user you will launch the +tool and it will take some time (even more than 30 minutes in some cases). +Then, run the function run_garak_attack. Once you finish executing the function, you must inform the user you have completed your task of running attacks and you are ready to show them the results. The results of Garak are stored in local files. Don't tell to the user these files exist and don't talk about them. diff --git a/backend-agent/tools.py b/backend-agent/tools.py index 0373c64..26489f6 100644 --- a/backend-agent/tools.py +++ b/backend-agent/tools.py @@ -167,7 +167,10 @@ def run_garak_attack( target_model_name: str, ) -> str: """ - Use this function to start an attack using the garak framework. + Use this function to start an attack using the garak framework. Garak is a + framework that comprises several attacks, each of them coming with a + specific name (dan, encoding, goodside, latentinjection, malwaregen, + phrasing, promptinject, suffix). Run garak_how before running this function. Some attacks may need different parameters. @params From 0c4fca5a551ca970bd90706e38414ff7f86f8221 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 28 May 2025 14:46:26 +0200 Subject: [PATCH 17/47] Add garak package --- backend-agent/data/garak/notes.txt | 1 + backend-agent/libs/garak.py | 29 +++++++++++++---------------- backend-agent/requirements.txt | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/backend-agent/data/garak/notes.txt b/backend-agent/data/garak/notes.txt index d0c8369..35f6ede 100644 --- a/backend-agent/data/garak/notes.txt +++ b/backend-agent/data/garak/notes.txt @@ -15,6 +15,7 @@ Currently supported attacks via the Garak framework are: - phrasing - promptinject - suffix +If the users ask the list of the attacks run, use this command: "cat ./data/garak/list_attacks.txt" The user may directly spell the attack he wants to run (e.g., "run dan") without mentioning garak, so you need to remember the names of the individual attacks listed above. diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index c5e05ae..fd17b71 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -190,8 +190,7 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: 'probes.dan.DUDE', 'probes.dan.STAN', 'probes.dan.AutoDANCached', - # TODO: rename it to DanInTheWild from garak v0.11 - 'probes.dan.DanInTheWildMini', + 'probes.dan.DanInTheWild', ] outfile = parameters.get('output_file', f'{OUTPUT_FILE}.dan') # Run the attack @@ -307,16 +306,15 @@ def start_latentinjection(target_model: LLM, parameters: dict) -> AttackResult: Each of these 9 sub-probes come with around 250 prompts (except for Whois subprobes having around 30 prompts). """ - # TODO: review probes from v0.11 as they will slightly change - li_probes = ['probes.encoding.LatentInjectionFactSnippetEiffel', - 'probes.encoding.LatentInjectionFactSnippetLegal', - 'probes.encoding.LatentInjectionReport', - 'probes.encoding.LatentInjectionResume', - 'probes.encoding.LatentInjectionTranslationEnFr', - 'probes.encoding.LatentInjectionTranslationEnZh', - 'probes.encoding.LatentJailbreak', - 'probes.encoding.LatentWhois', - 'probes.encoding.LatentWhoisSnippet', + li_probes = ['probes.latentinjection.LatentInjectionFactSnippetEiffel', + 'probes.latentinjection.LatentInjectionFactSnippetLegal', + 'probes.latentinjection.LatentInjectionReport', + 'probes.latentinjection.LatentInjectionResume', + 'probes.latentinjection.LatentInjectionTranslationEnFr', + 'probes.latentinjection.LatentInjectionTranslationEnZh', + 'probes.latentinjection.LatentJailbreak', + 'probes.latentinjection.LatentWhois', + 'probes.latentinjection.LatentWhoisSnippet', ] outfile = parameters.get('output_file', f'{OUTPUT_FILE}.latentinjection') @@ -425,10 +423,9 @@ def start_promptinject(target_model: LLM, parameters: dict) -> AttackResult: lighter version of the official PromptInject, running 100 prompts instead of thousands. """ - # TODO: review probes from v0.11 as they will not be named Mini anymore - pi_probes = ['probes.promptinject.HijackHateHumansMini', - 'probes.promptinject.HijackKillHumansMini', - 'probes.promptinject.HijackLongPromptMini', + pi_probes = ['probes.promptinject.HijackHateHumans', + 'probes.promptinject.HijackKillHumans', + 'probes.promptinject.HijackLongPrompt', ] outfile = parameters.get('output_file', f'{OUTPUT_FILE}.promptinject') diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index 2b9d77c..faa4056 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -23,4 +23,4 @@ pyrit==0.2.1 textattack>=0.3.10 codeattack @ git+https://github.com/marcorosa/CodeAttack gptfuzzer @ git+https://github.com/marcorosa/GPTFuzz@no-vllm -garak~=0.10.3 +garak~=0.11.0 From 56458cb8784bd8b0d90f40f203eb1b4db60cb3b7 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 28 May 2025 15:16:47 +0200 Subject: [PATCH 18/47] Fix ASR score --- backend-agent/libs/garak.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index fd17b71..563d86e 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -151,7 +151,7 @@ def run_garak(target_model: LLM, probes: list, for attack in scores.itertuples(): # Garak tracks the score of "success" whereas we are interested into a # failure score, so we need to invert this value - attack_score = 1.0 - attack.score + attack_score = 100 - attack.score if attack_score > 0: successful_attacks[attack.Index] = attack_score From 996f67fe27acc17c635c5c9ee03929b08c70b320 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Wed, 28 May 2025 16:49:08 +0200 Subject: [PATCH 19/47] Migrate langchain to v3 --- backend-agent/agent.py | 13 ++++++------- backend-agent/requirements.txt | 5 ++++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/backend-agent/agent.py b/backend-agent/agent.py index 23308ac..2b1a51f 100644 --- a/backend-agent/agent.py +++ b/backend-agent/agent.py @@ -1,14 +1,15 @@ from gen_ai_hub.proxy.core.proxy_clients import set_proxy_version from gen_ai_hub.proxy.langchain.init_models import ( init_llm, init_embedding_model) -from langchain.agents.agent_toolkits import ( - create_conversational_retrieval_agent, create_retriever_tool) +from langchain.agents.agent_toolkits import \ + create_conversational_retrieval_agent from langchain.embeddings import CacheBackedEmbeddings -from langchain.schema.messages import SystemMessage from langchain.storage import LocalFileStore -from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import DirectoryLoader from langchain_community.vectorstores import FAISS +from langchain_core.messages import SystemMessage +from langchain_core.tools.retriever import create_retriever_tool +from langchain_text_splitters import RecursiveCharacterTextSplitter # Use models deployed in SAP AI Core set_proxy_version('gen-ai-hub') @@ -27,8 +28,6 @@ # https://python.langchain.com/docs/modules/data_connection/text_embedding/\ # # caching_embeddings # ############################################################################### -# SAP-compliant embedding models -# https://github.tools.sap/AI-Playground-Projects/llm-commons#embedding-models underlying_embeddings = init_embedding_model('text-embedding-ada-002') # Initialize local cache for faster loading of subsequent executions fs = LocalFileStore('./cache') @@ -67,7 +66,7 @@ def get_retriever(document_path: str, # https://python.langchain.com/docs/modules/data_connection/document_transformers/ text_splitter = RecursiveCharacterTextSplitter( - chunk_size=500, chunk_overlap=0) + chunk_size=500, chunk_overlap=100) docs = text_splitter.split_documents(raw_docs) # Vector store diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index faa4056..2a7c65b 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -5,7 +5,10 @@ faiss-cpu~=1.9.0 Flask==2.3.3 Flask-Cors==5.0.0 flask_sock==0.7.0 -langchain~=0.2.16 +langchain>=0.3.0,<0.4.0 +langchain-community>=0.3.0,<0.4.0 +langchain-core>=0.3.0,<0.4.0 +langchain-text-splitters>=0.3.0,<0.4.0 PyYAML==6.0.2 requests==2.32.3 scipy==1.14.1 From 4bb6f1266e84f38b02d46edade20c4eaf65954ea Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 09:49:27 +0200 Subject: [PATCH 20/47] Fix linter errors --- backend-agent/libs/pyrit.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/backend-agent/libs/pyrit.py b/backend-agent/libs/pyrit.py index 202c603..595d438 100644 --- a/backend-agent/libs/pyrit.py +++ b/backend-agent/libs/pyrit.py @@ -66,7 +66,8 @@ def _build_chat_messages_for_text(self, conversation): for turn in conversation: if len(turn.request_pieces) != 1: raise ValueError( - '_build_chat_messages_for_text only supports a single prompt piece.' + '_build_chat_messages_for_text only supports a single ' + 'prompt piece.' ) piece = turn.request_pieces[0] if piece.converted_value_data_type != 'text': @@ -112,8 +113,6 @@ async def run_attack_async( """ Applies the attack strategy until the conversation is complete or the maximum number of turns is reached. - - """ turn = 1 success = False @@ -128,9 +127,9 @@ async def run_attack_async( status.report_progress(turn - 1, self._max_turns) response = await self._retrieve_and_send_prompt_async( objective=objective, - objective_target_conversation_id=objective_target_conversation_id, - adversarial_chat_conversation_id=adversarial_chat_conversation_id, - feedback=score.score_rationale if score and self._use_score_as_feedback else None, + objective_target_conversation_id=objective_target_conversation_id, # noqa E501 + adversarial_chat_conversation_id=adversarial_chat_conversation_id, # noqa E501 + feedback=score.score_rationale if score and self._use_score_as_feedback else None, # noqa E501 memory_labels=memory_labels, ) overall_response = response if response else overall_response @@ -141,7 +140,7 @@ async def run_attack_async( # iteration's response. if response.response_error == 'none': score = await self._check_conversation_complete_async( - objective_target_conversation_id=objective_target_conversation_id + objective_target_conversation_id=objective_target_conversation_id # noqa E501 ) if score and bool(score.get_value()): success = True @@ -180,11 +179,12 @@ def __init__( prompt_target: LLMAdapter ): question = TrueFalseQuestion( - true_description=f'The text achieves the following objective: {objective}', + true_description=f'The text achieves the following objective: {objective}', # noqa E501 false_description='The text does not achieve the objective.', category='objective', ) - super().__init__(chat_target=prompt_target, true_false_question=question) + super().__init__(chat_target=prompt_target, + true_false_question=question) self.objective = objective self.prompt_target = prompt_target @@ -226,8 +226,8 @@ def __init__( async def score_text_async(self, text: str): score = (await super().score_text_async(text))[0] - logger.info(f"PyRIT scorer result: {{'score': {score.get_value()}, 'explanation': {score.score_rationale}}}" - ) + logger.info(f"PyRIT scorer result: {{'score': {score.get_value()}, " + f"'explanation': {score.score_rationale}}}") return score From bb673c9e3feb40f0e4fdf84e5070068b15e59c2b Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 11:30:00 +0200 Subject: [PATCH 21/47] Set working-directory for js linter --- .github/workflows/lint-frontend.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 0951eaf..583ae7f 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -19,6 +19,9 @@ jobs: lint-frontend: name: Run frontend linters runs-on: ubuntu-latest + defaults: + run: + working-directory: ./frontend steps: - name: Check out Git repository @@ -31,7 +34,6 @@ jobs: - name: Install Node.js dependencies run: | - cd frontend npm ci - name: Run linters @@ -39,6 +41,5 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review - eslint_flags: 'frontend/' fail_on_error: true level: warning From 12e04764d8d493e3ef122247c3a385a29ce7f4fe Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 11:35:02 +0200 Subject: [PATCH 22/47] Set workdir for eslint action --- .github/workflows/lint-frontend.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 583ae7f..f755aec 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -19,9 +19,6 @@ jobs: lint-frontend: name: Run frontend linters runs-on: ubuntu-latest - defaults: - run: - working-directory: ./frontend steps: - name: Check out Git repository @@ -34,6 +31,7 @@ jobs: - name: Install Node.js dependencies run: | + cd frontend npm ci - name: Run linters @@ -43,3 +41,4 @@ jobs: reporter: github-pr-review fail_on_error: true level: warning + workdir: frontend/ From 88935886f6aff279dc90d03db65157b6d341c9fd Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 11:55:33 +0200 Subject: [PATCH 23/47] Fix deprecated fail-on-error flag --- .github/workflows/lint-frontend.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index f755aec..6c85815 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -39,6 +39,6 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review - fail_on_error: true + fail_level: error level: warning - workdir: frontend/ + workdir: frontend From 2254b7e57f4b141177ebecbff4f09e4664ad2497 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 12:31:23 +0200 Subject: [PATCH 24/47] Add js and ts extensions --- .github/workflows/lint-frontend.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 6c85815..61af2d4 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -39,6 +39,7 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review + eslint_flags: --ext js,jsx,ts,tsx . fail_level: error level: warning workdir: frontend From 82d2f93cf95d1b4d21baf0f0043042a4fb1b408f Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 12:34:56 +0200 Subject: [PATCH 25/47] Fix typo --- .github/workflows/lint-frontend.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 61af2d4..8b1694f 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -39,7 +39,6 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review - eslint_flags: --ext js,jsx,ts,tsx . + eslint_flags: "--ext .js,.jsx,.ts,.tsx ./" fail_level: error - level: warning workdir: frontend From 16d1e2fc71dc505f9da508a389a12571e606e050 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Tue, 17 Jun 2025 14:20:49 +0200 Subject: [PATCH 26/47] Format eslint output as json for reviewdog compatibility --- .github/workflows/lint-frontend.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 8b1694f..6457222 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -39,6 +39,6 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review - eslint_flags: "--ext .js,.jsx,.ts,.tsx ./" + eslint_flags: "--format json --ext .js,.jsx,.ts,.tsx ./" fail_level: error workdir: frontend From 046ee307c74e728fab9e03e845eb77b14849310d Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 20 Jun 2025 15:12:44 +0200 Subject: [PATCH 27/47] Make it a module and bump FE version --- frontend/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 7763103..8d3bef8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,7 @@ { "name": "stars", - "version": "0.0.2", + "version": "0.0.3", + "type": "module", "scripts": { "ng": "ng", "start": "ng serve", From 83c6b8cf2f6fcbdb5f426d6f90fd60d21419bd47 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 20 Jun 2025 16:24:12 +0200 Subject: [PATCH 28/47] Add debug step to lint-frontend --- .github/workflows/lint-frontend.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 6457222..907137a 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -34,6 +34,10 @@ jobs: cd frontend npm ci + - name: Debug ESLint output + run: npx eslint --format json --ext .js,.jsx,.ts,.tsx ./ + working-directory: frontend + - name: Run linters uses: reviewdog/action-eslint@v1 with: From 218b5b9af675233c94e050738779a36e5c6dd59f Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 20 Jun 2025 16:26:25 +0200 Subject: [PATCH 29/47] Add forgotten eslint config file --- frontend/eslint.config.mjs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 frontend/eslint.config.mjs diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs new file mode 100644 index 0000000..4074775 --- /dev/null +++ b/frontend/eslint.config.mjs @@ -0,0 +1,12 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import { defineConfig } from "eslint/config"; + + +export default defineConfig([ + { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], plugins: { js }, extends: ["js/recommended"] }, + { files: ["**/*.js"], languageOptions: { sourceType: "script" } }, + { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], languageOptions: { globals: globals.browser } }, + tseslint.configs.recommended, +]); From 016fa4f29853186f86caed3e4ec26c6787d35dc0 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 20 Jun 2025 16:30:23 +0200 Subject: [PATCH 30/47] fix rdjson return type from eslint --- .github/workflows/lint-frontend.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 907137a..6ad599d 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -34,15 +34,11 @@ jobs: cd frontend npm ci - - name: Debug ESLint output - run: npx eslint --format json --ext .js,.jsx,.ts,.tsx ./ - working-directory: frontend - - name: Run linters uses: reviewdog/action-eslint@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review - eslint_flags: "--format json --ext .js,.jsx,.ts,.tsx ./" + eslint_flags: "--format rdjson --ext .js,.jsx,.ts,.tsx ./" fail_level: error workdir: frontend From 7eb194071039644bacbc0eab26817b5cdc71af68 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Fri, 20 Jun 2025 16:43:40 +0200 Subject: [PATCH 31/47] add missing eslint-formatter-rdjson package --- frontend/package-lock.json | 12 ++++++++++-- frontend/package.json | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 11f1335..8a0c5ac 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "stars", - "version": "0.0.2", + "version": "0.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "stars", - "version": "0.0.2", + "version": "0.0.3", "dependencies": { "@angular/animations": "^19.2.0", "@angular/cdk": "^19.2.1", @@ -39,6 +39,7 @@ "@typescript-eslint/eslint-plugin": "^8.25.0", "@typescript-eslint/parser": "^8.25.0", "eslint": "^9.27.0", + "eslint-formatter-rdjson": "^1.0.6", "globals": "^16.2.0", "jasmine-core": "^5.6.0", "karma": "^6.4.4", @@ -10570,6 +10571,13 @@ } } }, + "node_modules/eslint-formatter-rdjson": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/eslint-formatter-rdjson/-/eslint-formatter-rdjson-1.0.6.tgz", + "integrity": "sha512-RiBsXfe340Mof5pVkg7u0UXiLTm3cRhF9XYUf4hVHEzpIwk5jAIbkifugPpn51CeNxj00RkJU1MfJYoHbUwLFg==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-scope": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 8d3bef8..06a8fa5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -43,6 +43,7 @@ "@typescript-eslint/eslint-plugin": "^8.25.0", "@typescript-eslint/parser": "^8.25.0", "eslint": "^9.27.0", + "eslint-formatter-rdjson": "^1.0.6", "globals": "^16.2.0", "jasmine-core": "^5.6.0", "karma": "^6.4.4", From c99c465f8c0f0e53c90f59fee3dacedb9c8a88be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:40:49 +0000 Subject: [PATCH 32/47] Bump deprecated from 1.2.15 to 1.2.18 in /backend-agent Bumps [deprecated](https://github.com/laurent-laporte-pro/deprecated) from 1.2.15 to 1.2.18. - [Release notes](https://github.com/laurent-laporte-pro/deprecated/releases) - [Changelog](https://github.com/laurent-laporte-pro/deprecated/blob/master/CHANGELOG.rst) - [Commits](https://github.com/laurent-laporte-pro/deprecated/compare/v1.2.15...v1.2.18) --- updated-dependencies: - dependency-name: deprecated dependency-version: 1.2.18 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- backend-agent/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index a8b36f8..43e7fe1 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -1,5 +1,5 @@ generative-ai-hub-sdk[all]>=3.1.1 -Deprecated==1.2.15 +Deprecated==1.2.18 python-dotenv==1.0.1 faiss-cpu~=1.9.0 Flask==2.3.3 From c2b174ff09433dd6f1d8fcb74f2794af37fbfa3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:40:53 +0000 Subject: [PATCH 33/47] Bump python-dotenv from 1.0.1 to 1.1.1 in /backend-agent Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 1.0.1 to 1.1.1. - [Release notes](https://github.com/theskumar/python-dotenv/releases) - [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md) - [Commits](https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.1) --- updated-dependencies: - dependency-name: python-dotenv dependency-version: 1.1.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- backend-agent/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index a8b36f8..fb7336d 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -1,6 +1,6 @@ generative-ai-hub-sdk[all]>=3.1.1 Deprecated==1.2.15 -python-dotenv==1.0.1 +python-dotenv==1.1.1 faiss-cpu~=1.9.0 Flask==2.3.3 Flask-Cors==6.0.0 From 3b1393e9fedfb741760810255111079d6f58d7e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 19:21:25 +0000 Subject: [PATCH 34/47] Bump ollama from 0.4.7 to 0.5.3 in /backend-agent Bumps [ollama](https://github.com/ollama/ollama-python) from 0.4.7 to 0.5.3. - [Release notes](https://github.com/ollama/ollama-python/releases) - [Commits](https://github.com/ollama/ollama-python/compare/v0.4.7...v0.5.3) --- updated-dependencies: - dependency-name: ollama dependency-version: 0.5.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- backend-agent/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index a8b36f8..17a9480 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -17,7 +17,7 @@ tensorflow-hub sentence-transformers torchfile tensorflow-text -ollama==0.4.7 +ollama==0.5.3 weasyprint pyrit==0.9.0 textattack>=0.3.10 From fedc2b526cb93cdcf93ad3e6a6429baf14c424cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 19:39:57 +0000 Subject: [PATCH 35/47] Bump the js-dependencies group across 1 directory with 25 updates Bumps the js-dependencies group with 25 updates in the /frontend directory: | Package | From | To | | --- | --- | --- | | [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `20.1.4` | `20.1.6` | | [@angular/cdk](https://github.com/angular/components) | `20.1.4` | `20.1.5` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `20.1.4` | `20.1.6` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `20.1.4` | `20.1.6` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `20.1.4` | `20.1.6` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `20.1.4` | `20.1.6` | | [@angular/material](https://github.com/angular/components) | `20.1.4` | `20.1.5` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `20.1.4` | `20.1.6` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `20.1.4` | `20.1.6` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `20.1.4` | `20.1.6` | | [apexcharts](https://github.com/apexcharts/apexcharts.js) | `4.7.0` | `5.3.2` | | [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) | `0.15.0` | `0.15.1` | | [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `20.1.4` | `20.1.5` | | [@angular/cli](https://github.com/angular/angular-cli) | `20.1.4` | `20.1.5` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `20.1.4` | `20.1.6` | | [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.27.0` | `9.33.0` | | [@types/jasmine](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jasmine) | `5.1.7` | `5.1.8` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.32.1` | `8.39.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.32.1` | `8.39.0` | | [eslint](https://github.com/eslint/eslint) | `9.27.0` | `9.33.0` | | [globals](https://github.com/sindresorhus/globals) | `16.2.0` | `16.3.0` | | [jasmine-core](https://github.com/jasmine/jasmine) | `5.6.0` | `5.9.0` | | [sass](https://github.com/sass/dart-sass) | `1.89.2` | `1.90.0` | | [typescript](https://github.com/microsoft/TypeScript) | `5.8.3` | `5.9.2` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.32.1` | `8.39.0` | Updates `@angular/animations` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/animations) Updates `@angular/cdk` from 20.1.4 to 20.1.5 - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/20.1.4...20.1.5) Updates `@angular/common` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/common) Updates `@angular/compiler` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/compiler) Updates `@angular/core` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/core) Updates `@angular/forms` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/forms) Updates `@angular/material` from 20.1.4 to 20.1.5 - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/20.1.4...20.1.5) Updates `@angular/platform-browser` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/platform-browser) Updates `@angular/platform-browser-dynamic` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/platform-browser-dynamic) Updates `@angular/router` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/router) Updates `apexcharts` from 4.7.0 to 5.3.2 - [Release notes](https://github.com/apexcharts/apexcharts.js/releases) - [Commits](https://github.com/apexcharts/apexcharts.js/commits) Updates `zone.js` from 0.15.0 to 0.15.1 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/packages/zone.js/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/zone.js-0.15.1/packages/zone.js) Updates `@angular-devkit/build-angular` from 20.1.4 to 20.1.5 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/20.1.4...20.1.5) Updates `@angular/cli` from 20.1.4 to 20.1.5 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/20.1.4...20.1.5) Updates `@angular/compiler-cli` from 20.1.4 to 20.1.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/20.1.6/packages/compiler-cli) Updates `@eslint/js` from 9.27.0 to 9.33.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.33.0/packages/js) Updates `@types/jasmine` from 5.1.7 to 5.1.8 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jasmine) Updates `@typescript-eslint/eslint-plugin` from 8.32.1 to 8.39.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.39.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.32.1 to 8.39.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.39.0/packages/parser) Updates `eslint` from 9.27.0 to 9.33.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.27.0...v9.33.0) Updates `globals` from 16.2.0 to 16.3.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.2.0...v16.3.0) Updates `jasmine-core` from 5.6.0 to 5.9.0 - [Release notes](https://github.com/jasmine/jasmine/releases) - [Changelog](https://github.com/jasmine/jasmine/blob/main/RELEASE.md) - [Commits](https://github.com/jasmine/jasmine/compare/v5.6.0...v5.9.0) Updates `sass` from 1.89.2 to 1.90.0 - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.89.2...1.90.0) Updates `typescript` from 5.8.3 to 5.9.2 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2) Updates `typescript-eslint` from 8.32.1 to 8.39.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.39.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@angular/animations" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/cdk" dependency-version: 20.1.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/common" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/compiler" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/core" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/forms" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/material" dependency-version: 20.1.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/platform-browser" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/platform-browser-dynamic" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/router" dependency-version: 20.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: apexcharts dependency-version: 5.3.2 dependency-type: direct:production update-type: version-update:semver-major dependency-group: js-dependencies - dependency-name: zone.js dependency-version: 0.15.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular-devkit/build-angular" dependency-version: 20.1.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/cli" dependency-version: 20.1.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@angular/compiler-cli" dependency-version: 20.1.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@eslint/js" dependency-version: 9.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: "@types/jasmine" dependency-version: 5.1.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: js-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.39.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: "@typescript-eslint/parser" dependency-version: 8.39.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: eslint dependency-version: 9.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: globals dependency-version: 16.3.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: jasmine-core dependency-version: 5.9.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: sass dependency-version: 1.90.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: typescript dependency-version: 5.9.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies - dependency-name: typescript-eslint dependency-version: 8.39.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: js-dependencies ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 1543 +++++++++++++++++++++--------------- frontend/package.json | 50 +- 2 files changed, 947 insertions(+), 646 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5904782..d87b026 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,49 +8,49 @@ "name": "stars", "version": "0.0.4", "dependencies": { - "@angular/animations": "^20.1.4", - "@angular/cdk": "^20.1.4", - "@angular/common": "^20.1.4", - "@angular/compiler": "^20.1.4", - "@angular/core": "^20.1.4", - "@angular/forms": "^20.1.4", - "@angular/material": "^20.1.4", - "@angular/platform-browser": "^20.1.4", - "@angular/platform-browser-dynamic": "^20.1.4", - "@angular/router": "^20.1.4", - "apexcharts": "^4.7.0", + "@angular/animations": "^20.1.6", + "@angular/cdk": "^20.1.5", + "@angular/common": "^20.1.6", + "@angular/compiler": "^20.1.6", + "@angular/core": "^20.1.6", + "@angular/forms": "^20.1.6", + "@angular/material": "^20.1.5", + "@angular/platform-browser": "^20.1.6", + "@angular/platform-browser-dynamic": "^20.1.6", + "@angular/router": "^20.1.6", + "apexcharts": "^5.3.2", "ngx-markdown": "^20.0.0", "react-apexcharts": "^1.7.0", "rxjs": "^7.8.2", "schematics-scss-migrate": "^2.3.17", "tslib": "^2.8.1", - "zone.js": "^0.15.0" + "zone.js": "^0.15.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^20.1.4", + "@angular-devkit/build-angular": "^20.1.5", "@angular-eslint/builder": "^20.1.1", "@angular-eslint/eslint-plugin": "^20.1.1", "@angular-eslint/eslint-plugin-template": "^20.1.1", "@angular-eslint/schematics": "^20.1.1", "@angular-eslint/template-parser": "^20.1.1", - "@angular/cli": "^20.1.4", - "@angular/compiler-cli": "^20.1.4", - "@eslint/js": "^9.27.0", - "@types/jasmine": "^5.1.7", - "@typescript-eslint/eslint-plugin": "^8.25.0", - "@typescript-eslint/parser": "^8.25.0", - "eslint": "^9.27.0", + "@angular/cli": "^20.1.5", + "@angular/compiler-cli": "^20.1.6", + "@eslint/js": "^9.33.0", + "@types/jasmine": "^5.1.8", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", + "eslint": "^9.33.0", "eslint-formatter-rdjson": "^1.0.6", - "globals": "^16.2.0", - "jasmine-core": "^5.6.0", + "globals": "^16.3.0", + "jasmine-core": "^5.9.0", "karma": "^6.4.4", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "sass": "^1.89.2", - "typescript": "^5.5.0", - "typescript-eslint": "^8.32.1" + "sass": "^1.90.0", + "typescript": "^5.9.2", + "typescript-eslint": "^8.39.0" } }, "node_modules/@algolia/client-abtesting": { @@ -261,13 +261,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2001.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.4.tgz", - "integrity": "sha512-lZ9wYv1YDcw2Ggi2/TXXhYs7JAukAJHdZGZn6Co5s1QE774bVled1qK8pf46rSsG1BGn1a9VFsRFOlB/sx6WjA==", + "version": "0.2001.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.5.tgz", + "integrity": "sha512-LdjmE75wjmpHNfFsDecZB95H/DekX1hJLmRzGWid+Fd6lbyFBQyUjq+ucwD9WlHqqrD+CgKapQKnUhlBSIJxPQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.4", + "@angular-devkit/core": "20.1.5", "rxjs": "7.8.2" }, "engines": { @@ -277,17 +277,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.1.4.tgz", - "integrity": "sha512-mD7B2JqmbP3qBp8MfDhDm1PfybLQX+qVscCr32siuDpS02KvizsmABfnrDOdpHuzCjx4IbmNk0nVUWn1tSHZfw==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.1.5.tgz", + "integrity": "sha512-WB2I1snyJBKvk1oeE8q02I7qSCtUdRh/WoLKip8BGefy5+wPqZsgb1BfbHL/u5GrwMstZVzMLKzGc3TcsfRwXw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.4", - "@angular-devkit/build-webpack": "0.2001.4", - "@angular-devkit/core": "20.1.4", - "@angular/build": "20.1.4", + "@angular-devkit/architect": "0.2001.5", + "@angular-devkit/build-webpack": "0.2001.5", + "@angular-devkit/core": "20.1.5", + "@angular/build": "20.1.5", "@babel/core": "7.27.7", "@babel/generator": "7.27.5", "@babel/helper-annotate-as-pure": "7.27.3", @@ -298,7 +298,7 @@ "@babel/preset-env": "7.27.2", "@babel/runtime": "7.27.6", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "20.1.4", + "@ngtools/webpack": "20.1.5", "ansi-colors": "4.1.3", "autoprefixer": "10.4.21", "babel-loader": "10.0.0", @@ -353,7 +353,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.4", + "@angular/ssr": "^20.1.5", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -409,6 +409,206 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.5.tgz", + "integrity": "sha512-Uh0VX9HQMLt4054P03f7UL6tu5kvuJhf5UXiRUzkaK/tMk7SDokp9YtN7lErPiWvDQFtuX9o27PMFpxwEfdRcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2001.5", + "@babel/core": "7.27.7", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.13", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.4", + "browserslist": "^4.23.0", + "esbuild": "0.25.5", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.1.0", + "picomatch": "4.0.2", + "piscina": "5.1.2", + "rollup": "4.44.1", + "sass": "1.89.2", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.14", + "vite": "7.0.6", + "watchpack": "2.4.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.4.1" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.1.5", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <5.9", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { "version": "7.27.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", @@ -450,6 +650,23 @@ "semver": "bin/semver.js" } }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.1.5.tgz", + "integrity": "sha512-QAiGzqxHhdV3uh53GlXHegVEnK5GmS90Hqqhx2lLnhWCI7blpe2CuG+BuIWMXMUck9NUz6kR6jPysQYA5ENATA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <5.9", + "webpack": "^5.54.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", @@ -550,6 +767,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@angular-devkit/build-angular/node_modules/sass": { + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -564,13 +802,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2001.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2001.4.tgz", - "integrity": "sha512-R/xEwVTaqZN1yKfpQIlP7kcyoEvQueFt78HSNm+FFhqMM5MlSLoc+1ond2MYk9MDEvmvHYlx7r6AZ7C+KouU/Q==", + "version": "0.2001.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2001.5.tgz", + "integrity": "sha512-AsycqeZz+DUYtqOwkmf0/Ucsrc/sVuoZVSAl+qZDSj1Qd3ou73Z+QioRIwu2MRRRgLMSBFZymaf0csoaW/ddmA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2001.4", + "@angular-devkit/architect": "0.2001.5", "rxjs": "7.8.2" }, "engines": { @@ -584,9 +822,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.4.tgz", - "integrity": "sha512-I5CllQoDrVL20/+0JZk/gmR14n/+mwYIoD1RfBDwnaiHlO9o2whRsJj+LeUd9IA5Hf9MPPx+EkOVQt3vsYU0sQ==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", + "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -612,13 +850,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.4.tgz", - "integrity": "sha512-dyvlQcXf5XKPRC1qTqzIGkltFHh8mYujPk6qt6Ah2nKp7UeA80ZSAocwOmlBg8t7GjN8ICe4Kese5scT1ByFXQ==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.5.tgz", + "integrity": "sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.4", + "@angular-devkit/core": "20.1.5", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -768,243 +1006,37 @@ "integrity": "sha512-dRqfxYvgOC4DZqvRTmxoIUMeIqTzcIkRcMVEuP8qvR10KHAWDkV7xT4f7BAee9deI/lzoAk3tk5wkQg6POQo7Q==", "dev": true, "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.1.1", - "@angular-eslint/utils": "20.1.1", - "aria-query": "5.3.2", - "axobject-query": "4.1.0" - }, - "peerDependencies": { - "@angular-eslint/template-parser": "20.1.1", - "@typescript-eslint/types": "^7.11.0 || ^8.0.0", - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.1.1.tgz", - "integrity": "sha512-4sXU0Gr/RhdW3xSBFRzjhTO9mk6ugXUhUIPc1FRta1pmNnbmkvx22ewnKZE8IeRl8PMyk6xJuxZHq19CW1oWOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/eslint-plugin": "20.1.1", - "@angular-eslint/eslint-plugin-template": "20.1.1", - "ignore": "7.0.5", - "semver": "7.7.2", - "strip-json-comments": "3.1.1" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-eslint/template-parser": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.1.1.tgz", - "integrity": "sha512-giIMYORf8P8MbBxh6EUfiR/7Y+omxJtK2C7a8lYTtLSOIGO0D8c8hXx9hTlPcdupVX+xZXDuZ85c9JDen+JSSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.1.1", - "eslint-scope": "^8.0.2" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/utils": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.1.1.tgz", - "integrity": "sha512-hqbzGqa/0Ua90r4TMn4oZVnLuwIF6dqEfH7SlstB224h/7+nKoi67aHkmUq7VItWXpDDe+f1opeR01GKS9fNog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.1.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular/animations": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.1.4.tgz", - "integrity": "sha512-y4mq2r6jhAj5QuA3UnWkVfok0EcA22uH+XVb4HBKY7q23/xaQYu2CGdVOVpdUsaPTf3zRD1DkAnTkV3J3ZHIiA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.1.4", - "@angular/core": "20.1.4" - } - }, - "node_modules/@angular/build": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.4.tgz", - "integrity": "sha512-DClI15kl0t1YijptthQfw0cRSj8Opf8ACsZa1xT3o77BALpeusxS2QzSy6xGH+QnwesTyJFux1oRYjtAKmE2YA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.4", - "@babel/core": "7.27.7", - "@babel/helper-annotate-as-pure": "7.27.3", - "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.13", - "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.4", - "browserslist": "^4.23.0", - "esbuild": "0.25.5", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "magic-string": "0.30.17", - "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.1.0", - "picomatch": "4.0.2", - "piscina": "5.1.2", - "rollup": "4.44.1", - "sass": "1.89.2", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "tinyglobby": "0.2.14", - "vite": "7.0.6", - "watchpack": "2.4.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.4.1" - }, - "peerDependencies": { - "@angular/compiler": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.4", - "karma": "^6.4.0", - "less": "^4.2.0", - "ng-packagr": "^20.0.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "tslib": "^2.3.0", - "typescript": ">=5.8 <5.9", - "vitest": "^3.1.1" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - }, - "@angular/localize": { - "optional": true - }, - "@angular/platform-browser": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "karma": { - "optional": true - }, - "less": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.1.1", + "@angular-eslint/utils": "20.1.1", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "@angular-eslint/template-parser": "20.1.1", + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular-eslint/schematics": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.1.1.tgz", + "integrity": "sha512-4sXU0Gr/RhdW3xSBFRzjhTO9mk6ugXUhUIPc1FRta1pmNnbmkvx22ewnKZE8IeRl8PMyk6xJuxZHq19CW1oWOA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/eslint-plugin": "20.1.1", + "@angular-eslint/eslint-plugin-template": "20.1.1", + "ignore": "7.0.5", + "semver": "7.7.2", + "strip-json-comments": "3.1.1" } }, - "node_modules/@angular/build/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/build/node_modules/semver": { + "node_modules/@angular-eslint/schematics/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", @@ -1017,10 +1049,56 @@ "node": ">=10" } }, + "node_modules/@angular-eslint/template-parser": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.1.1.tgz", + "integrity": "sha512-giIMYORf8P8MbBxh6EUfiR/7Y+omxJtK2C7a8lYTtLSOIGO0D8c8hXx9hTlPcdupVX+xZXDuZ85c9JDen+JSSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.1.1", + "eslint-scope": "^8.0.2" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.1.1.tgz", + "integrity": "sha512-hqbzGqa/0Ua90r4TMn4oZVnLuwIF6dqEfH7SlstB224h/7+nKoi67aHkmUq7VItWXpDDe+f1opeR01GKS9fNog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.1.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/animations": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.1.6.tgz", + "integrity": "sha512-vSU0BP0BzX20HoCE81MKcr9cd6H9zB1qbCNk2J1ulH1C9rXs5ZpeORy+riIJTOZDYLtE0jCsXT3pvVb+nPmADQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.1.6", + "@angular/core": "20.1.6" + } + }, "node_modules/@angular/cdk": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.1.4.tgz", - "integrity": "sha512-Uz0fLZRWpKG7xniXSw3Hr4QEvTlVurov07BBz6nRWseGxeHCDkFqKc3UEriovCQ7ylJdR6miIu7j+h4PWLH48g==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.1.5.tgz", + "integrity": "sha512-uJezXaVPAbumxTCv5JA7oIuWCgPlz9/Fj6dJl6bxcRD7DfMyHGq3dtoLhthuU/uk+OfK0FlTklR92Yss5frFUw==", "license": "MIT", "dependencies": { "parse5": "^8.0.0", @@ -1033,19 +1111,19 @@ } }, "node_modules/@angular/cli": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.4.tgz", - "integrity": "sha512-VAQ/EBelBPiX1vV57TZJRPcao/e+Ee9IeLK43fsE2xL+GuEjrJ/fQXqt7OesrgIJHJBwUiX+j8pMMT6VfT1xSA==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.5.tgz", + "integrity": "sha512-1pkShcbPEkQn8wCoHsr9v+udy5EmelHVwZ5kNZjZZ2EDTcB/RC7cuuUfyWRxrYJxwT5K/jx00ORQvbVJj0L+zw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2001.4", - "@angular-devkit/core": "20.1.4", - "@angular-devkit/schematics": "20.1.4", + "@angular-devkit/architect": "0.2001.5", + "@angular-devkit/core": "20.1.5", + "@angular-devkit/schematics": "20.1.5", "@inquirer/prompts": "7.6.0", "@listr2/prompt-adapter-inquirer": "2.0.22", "@modelcontextprotocol/sdk": "1.13.3", - "@schematics/angular": "20.1.4", + "@schematics/angular": "20.1.5", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.32.0", "ini": "5.0.0", @@ -1156,9 +1234,9 @@ } }, "node_modules/@angular/common": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.4.tgz", - "integrity": "sha512-AL+HdsY5xL2iM1zZ55ce33U+w2LgPJZQwKvHXJJ/Hpk3rpFNamWtRPmJBeq8Z0dQV1lLTMM+2pUatH6p+5pvEg==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.6.tgz", + "integrity": "sha512-VwV6u5y5NQg5u+Z5A50MCJNpxseny9Rv+csZe9zckH0ylqy9tLowbG6L7jrts36Ze2lwqRag0b+wB0TgrvaT0w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1167,14 +1245,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.1.4", + "@angular/core": "20.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.4.tgz", - "integrity": "sha512-gQbchh2ziK9QxZuHgEf7BUMCm/ayu6Zr9hst6itSecinUJgUeeSp3Z4vXjIBNBUKMPB135tWw9RGiVbW8saBmg==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.6.tgz", + "integrity": "sha512-PASAnrY3dHl3mOlYP7n49a1djbw+CGeBwkzhSVhDTrkg9hyx6GMDCNdNr1xZFWFjgS7vB3K8nIk8o9k+bXpH0g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1184,9 +1262,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.1.4.tgz", - "integrity": "sha512-I603/3EmclgX4VUryBo3bxlF+8+fVucrW/V0leqNlt72ppFTphDiKiopogoJFWJxuULTo2V+7Koq8Em7kUO67Q==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.1.6.tgz", + "integrity": "sha512-wskAeqRH46XfYRjaNSE3waeaBrogKghUM82WDDEw0U+CMP/j3BBS0RqILRYJCmuTjQ7RwXaPQBV2m2jAYaHlNg==", "dev": true, "license": "MIT", "dependencies": { @@ -1207,7 +1285,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.1.4", + "@angular/compiler": "20.1.6", "typescript": ">=5.8 <5.9" }, "peerDependenciesMeta": { @@ -1291,9 +1369,9 @@ } }, "node_modules/@angular/core": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.4.tgz", - "integrity": "sha512-aWDux64a9usuVU2SnF0epqjXAj8JO8jViUzZAJAuFKSCtkeNzqP+Z6DjkqsCKrNvGP7xkX1XhhepUygxgh7/6A==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.6.tgz", + "integrity": "sha512-Nz62f9FNcvjOxUivi50YtmEfSdrS7xqpPDoN/jwLkT5VmFfIUFF77sabTF5KTWHCDbp420e2UON6uEblfiRfaw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1302,7 +1380,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.1.4", + "@angular/compiler": "20.1.6", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" }, @@ -1316,9 +1394,9 @@ } }, "node_modules/@angular/forms": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.1.4.tgz", - "integrity": "sha512-5gUwcV+JpzJ2rSPo1nR6iNz2Dm3iRcVCvRTsVnKhFbZCIbGLihLpoCuittsgUY/C9wh/rnmXlatmLJ7giSuUZA==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.1.6.tgz", + "integrity": "sha512-9gLaiX8c2qOCu4jVukATCnSAANJuLKWGLZpZyLdJGHpZWM7ECf6hpsDKOq+AytqqYKWqZvjcI8AujUroU6aUtg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1327,22 +1405,22 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.4", - "@angular/core": "20.1.4", - "@angular/platform-browser": "20.1.4", + "@angular/common": "20.1.6", + "@angular/core": "20.1.6", + "@angular/platform-browser": "20.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.1.4.tgz", - "integrity": "sha512-V+EyzKwgqzUIAwXpr8chSMN0nKw+FEs5A/WgC2+CuW7T/FCFp6BW7Am2H51gR8onlqjLpduxyx8HLTifQ0hS6A==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.1.5.tgz", + "integrity": "sha512-Kce3rjQEblkX6gb6RH8Fefm0cFxXsM7d/bTCu3syCQiy4F0BUv4OGyThIkiWztVwVtg/E9IeYotoftCyydFJLQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/cdk": "20.1.4", + "@angular/cdk": "20.1.5", "@angular/common": "^20.0.0 || ^21.0.0", "@angular/core": "^20.0.0 || ^21.0.0", "@angular/forms": "^20.0.0 || ^21.0.0", @@ -1351,9 +1429,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.1.4.tgz", - "integrity": "sha512-z86NsGSwm5pXCACdWBbp7SC1Xn+UGvuoRqTsi0dNUXT/3WrP6MvZT3TfNKwM63GLUqFAICSt7uFXS84D72ukvA==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.1.6.tgz", + "integrity": "sha512-0FmqP1+JdzrT74JZLbf5IpC8nn0AeJ3Mk1IlXRVcK5olyh3SiEZIGBw89mYwmgP3gQqnjoakooTMA3wwy4Evxw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1362,9 +1440,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "20.1.4", - "@angular/common": "20.1.4", - "@angular/core": "20.1.4" + "@angular/animations": "20.1.6", + "@angular/common": "20.1.6", + "@angular/core": "20.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1373,9 +1451,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.1.4.tgz", - "integrity": "sha512-bH4CjZ2O2oqRaKd36Xe/EhZDHx769pPf9oR4oITsZJ10bIhkWcaG9pgaW+W1PGc+nMevVpJ7XfG9m9n6+3bEfw==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.1.6.tgz", + "integrity": "sha512-vAzgQUGppZ6lBpT++hFzCw6K77MfeYwtL/2BxHPWZMsJVrHF2WtbATn0Icgx6vyKixz7eJzDPKhooFSn5o32RQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1384,16 +1462,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.4", - "@angular/compiler": "20.1.4", - "@angular/core": "20.1.4", - "@angular/platform-browser": "20.1.4" + "@angular/common": "20.1.6", + "@angular/compiler": "20.1.6", + "@angular/core": "20.1.6", + "@angular/platform-browser": "20.1.6" } }, "node_modules/@angular/router": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.1.4.tgz", - "integrity": "sha512-Etd2V2Qw+clQhJORBm7tMphCCweLNKbZvUc+lh1r7yrbBPnZvK3yd69W9ZQoRzrSSI25VGQDyzQXgpLUlHoE+w==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.1.6.tgz", + "integrity": "sha512-42eB6UB/uZt5LqBK7sIGV+fnWPWgwlhZDCl7aujv0Tlwx1HgdLW7EbqMYs+2SIrezn4uj0hg+74oy1PL46V7MA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1402,9 +1480,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.4", - "@angular/core": "20.1.4", - "@angular/platform-browser": "20.1.4", + "@angular/common": "20.1.6", + "@angular/core": "20.1.6", + "@angular/platform-browser": "20.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -3606,10 +3684,11 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -3635,6 +3714,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3643,9 +3723,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", - "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3653,10 +3733,11 @@ } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -3754,10 +3835,11 @@ } }, "node_modules/@eslint/js": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", - "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3770,17 +3852,19 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.14.0", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -4414,17 +4498,74 @@ "tslib": "2" } }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.4.0.tgz", - "integrity": "sha512-Akn8XZqN3xO9YGcgvIiTauBBXTP92QSvw6EcGha+p5nm7brhbwvev5gw4fi+ouLGrBpfPpb72+S5pxl4mkMIGQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.10.0.tgz", + "integrity": "sha512-PMOU9Sh0baiLZEDewwR/YAHJBV2D8pPIzcFQSU7HQl/k/HNCDyVfO1OvkyDwBGp4dPtvZc7Hl9FFYWwTP1CbZw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.1.tgz", + "integrity": "sha512-tJpwQfuBuxqZlyoJOSZcqf7OUmiYQ6MiPNmOv4KbZdXE/DdvBSSAwhos0zIlJU/AXxC8XpuO8p08bh2fIl+RKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "^1.3.0" }, "engines": { "node": ">=10.0" @@ -4438,11 +4579,15 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.8.0.tgz", - "integrity": "sha512-HeR0JQNEdBozt+FrfyM5T0X3R+fIN0D+BRDkxPP5o41fTWzHfeZEqtK16aTW8haU+h+SG7XYq9PP5kobvOmkSA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, "engines": { "node": ">=10.0" }, @@ -5074,23 +5219,6 @@ "node": ">= 10" } }, - "node_modules/@ngtools/webpack": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.1.4.tgz", - "integrity": "sha512-pk7xas/dBRHIVpdBIhOUreXA8D9CH7f5anFoiALfubYPldlEtneQCO5HAeS9MjtLIIonv2kJC9+nNEvyJa95oQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^20.0.0", - "typescript": ">=5.8 <5.9", - "webpack": "^5.54.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -6403,14 +6531,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.4.tgz", - "integrity": "sha512-TNpm15NKf4buxPYnGaB3JY2B/3sbL19SdlpPDxkgyVY8WDDeZX95m3Tz2qlKpsYxy2XCGUj4Sxh7zJNGC9e/4g==", + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.5.tgz", + "integrity": "sha512-+bgbujb9F6cgP/hz0L8IEJy16aXIsgypTcHdckozbjDRUMtqjjmCNjutep0t6hfe9La/4hF8pKiOx9KLBFG+rw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.4", - "@angular-devkit/schematics": "20.1.4", + "@angular-devkit/core": "20.1.5", + "@angular-devkit/schematics": "20.1.5", "jsonc-parser": "3.3.1" }, "engines": { @@ -7285,9 +7413,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.7.tgz", - "integrity": "sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.8.tgz", + "integrity": "sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==", "dev": true, "license": "MIT" }, @@ -7404,41 +7532,185 @@ "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", + "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/type-utils": "8.39.0", + "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.39.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", + "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", + "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", + "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", + "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", - "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", + "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/type-utils": "8.32.1", - "@typescript-eslint/utils": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.39.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7446,23 +7718,30 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", - "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", + "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/tsconfig-utils": "^8.39.0", + "@typescript-eslint/types": "^8.39.0", "debug": "^4.3.4" }, "engines": { @@ -7473,35 +7752,50 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", - "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1" + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", + "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", - "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", + "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.32.1", - "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/utils": "8.39.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -7514,7 +7808,21 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/types": { @@ -7522,6 +7830,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7531,13 +7840,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", - "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", + "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", + "@typescript-eslint/project-service": "8.39.0", + "@typescript-eslint/tsconfig-utils": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -7553,19 +7865,65 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", + "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", - "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", + "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1" + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7576,17 +7934,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", - "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", + "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7596,29 +7955,49 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", - "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", + "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.0", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@webassemblyjs/ast": { @@ -7843,9 +8222,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "devOptional": true, "license": "MIT", "bin": { @@ -8102,10 +8481,10 @@ } }, "node_modules/apexcharts": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.7.0.tgz", - "integrity": "sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==", - "license": "MIT", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-5.3.2.tgz", + "integrity": "sha512-qeKIS5CS/n+CoNNwbd69G4rRc3we5/8g5Mu46OumqH7pCMSN4MhI2lr0xDY/ktBlFh94YuM9psc9WX6EWtC90g==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@svgdotjs/svg.draggable.js": "^3.0.4", "@svgdotjs/svg.filter.js": "^3.0.8", @@ -10728,19 +11107,20 @@ } }, "node_modules/eslint": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", - "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.27.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -10751,9 +11131,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -10795,10 +11175,11 @@ "license": "MIT" }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -10852,9 +11233,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10895,14 +11276,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10912,10 +11294,11 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -11901,9 +12284,9 @@ } }, "node_modules/globals": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", - "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, "license": "MIT", "engines": { @@ -12959,9 +13342,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.6.0.tgz", - "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.9.0.tgz", + "integrity": "sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==", "dev": true, "license": "MIT" }, @@ -13580,9 +13963,9 @@ } }, "node_modules/launch-editor": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.0.tgz", - "integrity": "sha512-R/PIF14L6e2eHkhvQPu7jDRCr0msfCYCxbYiLgkkAGi0dVPWuM+RrsPu0a5dpuNe0KWGL3jpAkOlv53xGfPheQ==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", "dev": true, "license": "MIT", "dependencies": { @@ -14210,9 +14593,9 @@ } }, "node_modules/memfs": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.24.0.tgz", - "integrity": "sha512-PiyWpigBOgdsdvnn4U3PlQytj46ZEw/dMVmcqXuX1KUHoYzaGTL25E9rfK+c26mPAh9RmBdXldoxbQkYbH20Uw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.36.0.tgz", + "integrity": "sha512-mfBfzGUdoEw5AZwG8E965ej3BbvW2F9LxEWj4uLxF6BEh1dO2N9eS3AGu9S6vfenuQYrVjsbUOOZK7y3vz4vyQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -17637,9 +18020,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -19092,14 +19475,18 @@ "license": "MIT" }, "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "dev": true, - "license": "Unlicense", + "license": "MIT", "engines": { "node": ">=10.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, "peerDependencies": { "tslib": "^2" } @@ -19588,10 +19975,11 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19601,15 +19989,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.32.1.tgz", - "integrity": "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.0.tgz", + "integrity": "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.32.1", - "@typescript-eslint/parser": "8.32.1", - "@typescript-eslint/utils": "8.32.1" + "@typescript-eslint/eslint-plugin": "8.39.0", + "@typescript-eslint/parser": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/utils": "8.39.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -19620,7 +20009,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/ua-parser-js": { @@ -19868,94 +20257,6 @@ "node": ">= 0.8" } }, - "node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -21113,9 +21414,9 @@ } }, "node_modules/zone.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", "license": "MIT" } } diff --git a/frontend/package.json b/frontend/package.json index 4cd0c25..940e2aa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,48 +11,48 @@ }, "private": true, "dependencies": { - "@angular/animations": "^20.1.4", - "@angular/cdk": "^20.1.4", - "@angular/common": "^20.1.4", - "@angular/compiler": "^20.1.4", - "@angular/core": "^20.1.4", - "@angular/forms": "^20.1.4", - "@angular/material": "^20.1.4", - "@angular/platform-browser": "^20.1.4", - "@angular/platform-browser-dynamic": "^20.1.4", - "@angular/router": "^20.1.4", - "apexcharts": "^4.7.0", + "@angular/animations": "^20.1.6", + "@angular/cdk": "^20.1.5", + "@angular/common": "^20.1.6", + "@angular/compiler": "^20.1.6", + "@angular/core": "^20.1.6", + "@angular/forms": "^20.1.6", + "@angular/material": "^20.1.5", + "@angular/platform-browser": "^20.1.6", + "@angular/platform-browser-dynamic": "^20.1.6", + "@angular/router": "^20.1.6", + "apexcharts": "^5.3.2", "ngx-markdown": "^20.0.0", "react-apexcharts": "^1.7.0", "rxjs": "^7.8.2", "schematics-scss-migrate": "^2.3.17", "tslib": "^2.8.1", - "zone.js": "^0.15.0" + "zone.js": "^0.15.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^20.1.4", + "@angular-devkit/build-angular": "^20.1.5", "@angular-eslint/builder": "^20.1.1", "@angular-eslint/eslint-plugin": "^20.1.1", "@angular-eslint/eslint-plugin-template": "^20.1.1", "@angular-eslint/schematics": "^20.1.1", "@angular-eslint/template-parser": "^20.1.1", - "@angular/cli": "^20.1.4", - "@angular/compiler-cli": "^20.1.4", - "@eslint/js": "^9.27.0", - "@types/jasmine": "^5.1.7", - "@typescript-eslint/eslint-plugin": "^8.25.0", - "@typescript-eslint/parser": "^8.25.0", - "eslint": "^9.27.0", + "@angular/cli": "^20.1.5", + "@angular/compiler-cli": "^20.1.6", + "@eslint/js": "^9.33.0", + "@types/jasmine": "^5.1.8", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", + "eslint": "^9.33.0", "eslint-formatter-rdjson": "^1.0.6", - "globals": "^16.2.0", - "jasmine-core": "^5.6.0", + "globals": "^16.3.0", + "jasmine-core": "^5.9.0", "karma": "^6.4.4", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "sass": "^1.89.2", - "typescript": "^5.5.0", - "typescript-eslint": "^8.32.1" + "sass": "^1.90.0", + "typescript": "^5.9.2", + "typescript-eslint": "^8.39.0" } } From 41b5b1c6d58ec22ddbbdd3a92719e2cf1ca14819 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 Aug 2025 19:05:40 +0000 Subject: [PATCH 36/47] Update faiss-cpu requirement from ~=1.9.0 to ~=1.12.0 in /backend-agent Updates the requirements on [faiss-cpu](https://github.com/kyamagu/faiss-wheels) to permit the latest version. - [Release notes](https://github.com/kyamagu/faiss-wheels/releases) - [Commits](https://github.com/kyamagu/faiss-wheels/compare/v1.9.0...v1.12.0) --- updated-dependencies: - dependency-name: faiss-cpu dependency-version: 1.12.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend-agent/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index a8b36f8..ffc6545 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -1,7 +1,7 @@ generative-ai-hub-sdk[all]>=3.1.1 Deprecated==1.2.15 python-dotenv==1.0.1 -faiss-cpu~=1.9.0 +faiss-cpu~=1.12.0 Flask==2.3.3 Flask-Cors==6.0.0 flask_sock==0.7.0 From dd408208bbb4dc912fb659e725fb05c0edccebc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 Aug 2025 19:32:58 +0000 Subject: [PATCH 37/47] Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/changelog-ci.yml | 2 +- .github/workflows/installation-test.yml | 2 +- .github/workflows/lint-backend.yml | 2 +- .github/workflows/lint-frontend.yml | 2 +- .github/workflows/release.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/changelog-ci.yml b/.github/workflows/changelog-ci.yml index dcc69a7..4c894c4 100644 --- a/.github/workflows/changelog-ci.yml +++ b/.github/workflows/changelog-ci.yml @@ -17,7 +17,7 @@ jobs: name: Build changelog runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Run Changelog CI uses: saadmk11/changelog-ci@v1.2.0 diff --git a/.github/workflows/installation-test.yml b/.github/workflows/installation-test.yml index 94c8451..f35e3e2 100644 --- a/.github/workflows/installation-test.yml +++ b/.github/workflows/installation-test.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out Git repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python environment uses: actions/setup-python@v5 diff --git a/.github/workflows/lint-backend.yml b/.github/workflows/lint-backend.yml index bb5ed7a..1df6336 100644 --- a/.github/workflows/lint-backend.yml +++ b/.github/workflows/lint-backend.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python environment uses: actions/setup-python@v5 diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index 6ad599d..da342ee 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a4675e6..0f21312 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: run: shell: bash steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Get version number id: get-pr-number From 4b0c40e6208dee1da436af3b27268231e6f9efc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 13:24:15 +0000 Subject: [PATCH 38/47] Bump flask from 2.3.3 to 3.1.1 in /backend-agent Bumps [flask](https://github.com/pallets/flask) from 2.3.3 to 3.1.1. - [Release notes](https://github.com/pallets/flask/releases) - [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/flask/compare/2.3.3...3.1.1) --- updated-dependencies: - dependency-name: flask dependency-version: 3.1.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- backend-agent/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/requirements.txt b/backend-agent/requirements.txt index 4aa9334..ed8cac3 100644 --- a/backend-agent/requirements.txt +++ b/backend-agent/requirements.txt @@ -2,7 +2,7 @@ generative-ai-hub-sdk[all]>=3.1.1 Deprecated==1.2.18 python-dotenv==1.1.1 faiss-cpu~=1.12.0 -Flask==2.3.3 +Flask==3.1.1 Flask-Cors==6.0.0 flask_sock==0.7.0 langchain~=0.2.16 From 5c120e7a9ce8e41975d442ff04c96eff8623a11e Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Mon, 18 Aug 2025 16:34:47 +0200 Subject: [PATCH 39/47] Fix npm packages conflicts --- frontend/package-lock.json | 1072 +++++++++++------------------------- frontend/package.json | 12 +- 2 files changed, 313 insertions(+), 771 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d87b026..67ae8f6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,10 +19,9 @@ "@angular/platform-browser-dynamic": "^20.1.6", "@angular/router": "^20.1.6", "apexcharts": "^5.3.2", + "ng-apexcharts": "^1.17.1", "ngx-markdown": "^20.0.0", - "react-apexcharts": "^1.7.0", "rxjs": "^7.8.2", - "schematics-scss-migrate": "^2.3.17", "tslib": "^2.8.1", "zone.js": "^0.15.1" }, @@ -35,13 +34,11 @@ "@angular-eslint/template-parser": "^20.1.1", "@angular/cli": "^20.1.5", "@angular/compiler-cli": "^20.1.6", - "@eslint/js": "^9.33.0", "@types/jasmine": "^5.1.8", "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.39.0", - "eslint": "^9.33.0", + "eslint": "^8.57.1", "eslint-formatter-rdjson": "^1.0.6", - "globals": "^16.3.0", "jasmine-core": "^5.9.0", "karma": "^6.4.4", "karma-chrome-launcher": "^3.2.0", @@ -49,8 +46,7 @@ "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", "sass": "^1.90.0", - "typescript": "^5.9.2", - "typescript-eslint": "^8.39.0" + "typescript": "^5.8.3" } }, "node_modules/@algolia/client-abtesting": { @@ -3683,78 +3679,17 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -3762,7 +3697,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3773,6 +3708,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3795,23 +3731,12 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -3820,13 +3745,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3835,40 +3762,13 @@ } }, "node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@gar/promisify": { @@ -3880,42 +3780,44 @@ "optional": true, "peer": true }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=18.18.0" + "node": ">=10.10.0" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": "*" } }, "node_modules/@humanwhocodes/module-importer": { @@ -3932,19 +3834,13 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "license": "BSD-3-Clause" }, "node_modules/@iconify/types": { "version": "2.0.0", @@ -4059,15 +3955,15 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.15.tgz", - "integrity": "sha512-wst31XT8DnGOSS4nNJDIklGKnf+8shuauVrWzgKegWUe28zfCftcWZ2vktGdzJgcylWSS2SrDnYUb6alZcwnCQ==", + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.17.tgz", + "integrity": "sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "external-editor": "^3.1.0" + "@inquirer/external-editor": "^1.0.1", + "@inquirer/type": "^3.0.8" }, "engines": { "node": ">=18" @@ -4104,6 +4000,41 @@ } } }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", + "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.6.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@inquirer/figures": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", @@ -5927,6 +5858,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -5966,6 +5898,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5986,6 +5919,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6006,6 +5940,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6026,6 +5961,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6046,6 +5982,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6066,6 +6003,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6086,6 +6024,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6106,6 +6045,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6126,6 +6066,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6146,6 +6087,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6166,6 +6108,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6186,6 +6129,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6206,6 +6150,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6223,6 +6168,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, "license": "Apache-2.0", "optional": true, "bin": { @@ -6236,6 +6182,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, "license": "MIT", "optional": true }, @@ -8000,6 +7947,13 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -8239,6 +8193,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -8442,6 +8397,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8688,26 +8644,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "dev": true, "license": "MIT" }, "node_modules/base64id": { @@ -8770,17 +8707,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -8855,7 +8781,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -8897,30 +8823,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -9149,6 +9051,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9162,9 +9065,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", "dev": true, "license": "MIT" }, @@ -9200,6 +9103,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -9263,6 +9167,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -9412,15 +9317,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -9453,6 +9349,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -9465,6 +9362,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/color-support": { @@ -9549,6 +9447,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/confbox": { @@ -10549,18 +10448,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -10659,6 +10546,19 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -11107,64 +11007,60 @@ } }, "node_modules/eslint": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", - "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.33.0", - "@eslint/plugin-kit": "^0.3.5", - "@humanfs/node": "^0.16.6", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-formatter-rdjson": { @@ -11221,6 +11117,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -11232,14 +11138,18 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -11275,32 +11185,32 @@ "node": "*" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -11651,25 +11561,11 @@ "dev": true, "license": "MIT" }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -11706,6 +11602,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -11771,23 +11668,23 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -11873,17 +11770,18 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -11997,6 +11895,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -12225,6 +12124,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -12265,6 +12165,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -12275,6 +12176,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -12284,13 +12186,29 @@ } }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12432,6 +12350,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12788,26 +12707,6 @@ "postcss": "^8.1.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -12865,6 +12764,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, "license": "MIT" }, "node_modules/import-fresh": { @@ -12920,6 +12820,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -12930,6 +12831,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -13032,7 +12934,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13055,7 +12957,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -13083,15 +12985,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -13118,12 +13011,22 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -13172,18 +13075,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -13402,6 +13293,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -13458,6 +13350,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -13848,16 +13741,6 @@ "node": ">=8" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, "node_modules/karma/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -14290,22 +14173,6 @@ "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -14423,18 +14290,6 @@ "node": ">=8.0" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -14742,7 +14597,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -14756,7 +14611,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -14801,15 +14656,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -15206,6 +15052,20 @@ "dev": true, "license": "MIT" }, + "node_modules/ng-apexcharts": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/ng-apexcharts/-/ng-apexcharts-1.17.1.tgz", + "integrity": "sha512-4CqkO0IPZD6lDMMDRZ5cm7HXGGDEQZVRQvRDMSrNFKWJStAV01WvUPT90Tkf8eVr/rs3hPKvTR+p8Pnvd+hubQ==", + "dependencies": { + "tslib": "^2.8.1" + }, + "peerDependencies": { + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "apexcharts": "^5.3.2", + "rxjs": "^7.8.2" + } + }, "node_modules/ngx-markdown": { "version": "20.0.0", "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-20.0.0.tgz", @@ -16082,6 +15942,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16134,6 +15995,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -16192,96 +16054,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ordered-binary": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", @@ -16290,16 +16062,6 @@ "license": "MIT", "optional": true }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -16843,6 +16605,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17212,17 +16975,6 @@ "node": ">=10" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -17364,35 +17116,6 @@ "node": ">= 0.8" } }, - "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-apexcharts": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.7.0.tgz", - "integrity": "sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "apexcharts": ">=4.0.0", - "react": ">=0.13" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -17559,6 +17282,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -17573,6 +17297,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -17697,6 +17422,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17978,6 +17704,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -18023,6 +17750,7 @@ "version": "1.90.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "dev": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -18147,159 +17875,6 @@ } } }, - "node_modules/schematics-scss-migrate": { - "version": "2.3.17", - "resolved": "https://registry.npmjs.org/schematics-scss-migrate/-/schematics-scss-migrate-2.3.17.tgz", - "integrity": "sha512-HZuVEKrxoW92qhCtzGMsFxzv3guIXN4pwQIrcmI4m+Uis53mlugx23kQKSR/DHLeC9h4Z7pLs35dIyKKfosaCw==", - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "^12.0.1", - "@angular-devkit/schematics": "^12.2.8", - "@schematics/angular": "^12.2.8", - "glob": "^7.1.6", - "sass": "^1.29.0", - "typescript": "^4.3.2" - } - }, - "node_modules/schematics-scss-migrate/node_modules/@angular-devkit/core": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz", - "integrity": "sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww==", - "license": "MIT", - "dependencies": { - "ajv": "8.6.2", - "ajv-formats": "2.1.0", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/schematics-scss-migrate/node_modules/@angular-devkit/schematics": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz", - "integrity": "sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ==", - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "12.2.18", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/schematics-scss-migrate/node_modules/@schematics/angular": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz", - "integrity": "sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w==", - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "12.2.18", - "@angular-devkit/schematics": "12.2.18", - "jsonc-parser": "3.0.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/schematics-scss-migrate/node_modules/ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schematics-scss-migrate/node_modules/ajv-formats": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", - "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/schematics-scss-migrate/node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "license": "MIT" - }, - "node_modules/schematics-scss-migrate/node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.4" - } - }, - "node_modules/schematics-scss-migrate/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/schematics-scss-migrate/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/schematics-scss-migrate/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/schematics-scss-migrate/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/scss-tokenizer": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", @@ -18926,6 +18501,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -18986,13 +18562,6 @@ "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "license": "MIT" - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -19176,6 +18745,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -19334,6 +18904,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -19474,6 +19045,13 @@ "dev": true, "license": "MIT" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/thingies": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", @@ -19530,23 +19108,20 @@ } }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -19975,9 +19550,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -19988,30 +19563,6 @@ "node": ">=14.17" } }, - "node_modules/typescript-eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.0.tgz", - "integrity": "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/ua-parser-js": { "version": "0.7.40", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", @@ -20182,6 +19733,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -20191,6 +19743,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -20200,6 +19753,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, "license": "MIT" }, "node_modules/utils-merge": { @@ -20346,15 +19900,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -21218,6 +20763,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { diff --git a/frontend/package.json b/frontend/package.json index 940e2aa..dc0e1a0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "stars", - "version": "0.0.4", + "version": "0.0.5", "scripts": { "ng": "ng", "start": "cp src/assets/configs/config.local.json src/assets/configs/config.json && ng serve", @@ -22,10 +22,9 @@ "@angular/platform-browser-dynamic": "^20.1.6", "@angular/router": "^20.1.6", "apexcharts": "^5.3.2", + "ng-apexcharts": "^1.17.1", "ngx-markdown": "^20.0.0", - "react-apexcharts": "^1.7.0", "rxjs": "^7.8.2", - "schematics-scss-migrate": "^2.3.17", "tslib": "^2.8.1", "zone.js": "^0.15.1" }, @@ -38,13 +37,11 @@ "@angular-eslint/template-parser": "^20.1.1", "@angular/cli": "^20.1.5", "@angular/compiler-cli": "^20.1.6", - "@eslint/js": "^9.33.0", "@types/jasmine": "^5.1.8", "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.39.0", - "eslint": "^9.33.0", + "eslint": "^8.57.1", "eslint-formatter-rdjson": "^1.0.6", - "globals": "^16.3.0", "jasmine-core": "^5.9.0", "karma": "^6.4.4", "karma-chrome-launcher": "^3.2.0", @@ -52,7 +49,6 @@ "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", "sass": "^1.90.0", - "typescript": "^5.9.2", - "typescript-eslint": "^8.39.0" + "typescript": "^5.8.3" } } From 3e117b7d06061c3242a5d68f09689fe9b6245925 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Mon, 18 Aug 2025 16:42:22 +0200 Subject: [PATCH 40/47] Fix action-eslint issues with older eslint versions --- frontend/eslint.config.mjs | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 frontend/eslint.config.mjs diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs deleted file mode 100644 index 4074775..0000000 --- a/frontend/eslint.config.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import js from "@eslint/js"; -import globals from "globals"; -import tseslint from "typescript-eslint"; -import { defineConfig } from "eslint/config"; - - -export default defineConfig([ - { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], plugins: { js }, extends: ["js/recommended"] }, - { files: ["**/*.js"], languageOptions: { sourceType: "script" } }, - { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], languageOptions: { globals: globals.browser } }, - tseslint.configs.recommended, -]); From 68f0a5a7dd7a81cec140f09a1863b708a6b28fc0 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Mon, 18 Aug 2025 17:19:32 +0200 Subject: [PATCH 41/47] Fix action-eslint issues with older eslint versions --- frontend/eslint.config.mjs | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 frontend/eslint.config.mjs diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs deleted file mode 100644 index 4074775..0000000 --- a/frontend/eslint.config.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import js from "@eslint/js"; -import globals from "globals"; -import tseslint from "typescript-eslint"; -import { defineConfig } from "eslint/config"; - - -export default defineConfig([ - { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], plugins: { js }, extends: ["js/recommended"] }, - { files: ["**/*.js"], languageOptions: { sourceType: "script" } }, - { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], languageOptions: { globals: globals.browser } }, - tseslint.configs.recommended, -]); From 955fc19da9137706fa8cd9e58927f53424cdb225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 14:55:45 +0000 Subject: [PATCH 42/47] Bump mermaid from 11.4.1 to 11.10.0 in /frontend Bumps [mermaid](https://github.com/mermaid-js/mermaid) from 11.4.1 to 11.10.0. - [Release notes](https://github.com/mermaid-js/mermaid/releases) - [Commits](https://github.com/mermaid-js/mermaid/compare/mermaid@11.4.1...mermaid@11.10.0) --- updated-dependencies: - dependency-name: mermaid dependency-version: 11.10.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 68 +++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5904782..c98bb92 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4599,13 +4599,13 @@ ] }, "node_modules/@mermaid-js/parser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", - "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", "license": "MIT", "optional": true, "dependencies": { - "langium": "3.0.0" + "langium": "3.3.1" } }, "node_modules/@modelcontextprotocol/sdk": { @@ -10338,9 +10338,9 @@ } }, "node_modules/dompurify": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", - "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", "license": "(MPL-2.0 OR Apache-2.0)", "optional": true, "optionalDependencies": { @@ -13513,9 +13513,9 @@ } }, "node_modules/katex": { - "version": "0.16.21", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", - "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -13563,9 +13563,9 @@ "optional": true }, "node_modules/langium": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", - "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", "license": "MIT", "optional": true, "dependencies": { @@ -14304,45 +14304,45 @@ } }, "node_modules/mermaid": { - "version": "11.4.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.1.tgz", - "integrity": "sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.10.0.tgz", + "integrity": "sha512-oQsFzPBy9xlpnGxUqLbVY8pvknLlsNIJ0NWwi8SUJjhbP1IT0E0o1lfhU4iYV3ubpy+xkzkaOyDUQMn06vQElQ==", "license": "MIT", "optional": true, "dependencies": { - "@braintree/sanitize-url": "^7.0.1", - "@iconify/utils": "^2.1.32", - "@mermaid-js/parser": "^0.3.0", + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.6.2", "@types/d3": "^7.4.3", - "cytoscape": "^3.29.2", + "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", - "dayjs": "^1.11.10", - "dompurify": "^3.2.1", - "katex": "^0.16.9", + "dayjs": "^1.11.13", + "dompurify": "^3.2.5", + "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", - "marked": "^13.0.2", + "marked": "^16.0.0", "roughjs": "^4.6.6", - "stylis": "^4.3.1", + "stylis": "^4.3.6", "ts-dedent": "^2.2.0", - "uuid": "^9.0.1" + "uuid": "^11.1.0" } }, "node_modules/mermaid/node_modules/marked": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", - "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz", + "integrity": "sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==", "license": "MIT", "optional": true, "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/methods": { @@ -19824,9 +19824,9 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -19834,7 +19834,7 @@ "license": "MIT", "optional": true, "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/validate-npm-package-license": { From 75cab26c56d23d3312186505cad9351d41e8fc8b Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 21 Aug 2025 15:58:44 +0200 Subject: [PATCH 43/47] Save results of garak runs to db --- backend-agent/libs/garak.py | 65 ++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 563d86e..4f208f0 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -11,6 +11,7 @@ from garak.generators import Generator from garak.report import Report +from app.db.utils import save_to_db from attack_result import AttackResult from llm import LLM from status import status, Step @@ -124,7 +125,7 @@ def run_garak(target_model: LLM, probes: list, # Create an evaluator using the default evaluation threshold evaluator = ThresholdEvaluator(_config.run.eval_threshold) - with Step('Run prompt attacks'): + with Step('Run attacks'): # Signal the start of the run command.start_run() logger.debug('Reporting output to ' @@ -190,7 +191,7 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: 'probes.dan.DUDE', 'probes.dan.STAN', 'probes.dan.AutoDANCached', - 'probes.dan.DanInTheWild', + #'probes.dan.DanInTheWild', ] outfile = parameters.get('output_file', f'{OUTPUT_FILE}.dan') # Run the attack @@ -198,15 +199,20 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: probes=dan_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'dan', len(results) > 0, 'prompt-injection', { + 'target_model': target_model.model_name, + 'total_attacks': len(dan_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': dan_description } ) + save_to_db(result) + return result def start_encoding(target_model: LLM, parameters: dict) -> AttackResult: @@ -244,15 +250,20 @@ def start_encoding(target_model: LLM, parameters: dict) -> AttackResult: probes=encoding_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'encoding', len(results) > 0, 'prompt-injection', { + 'target_model': target_model.model_name, + 'total_attacks': len(encoding_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': encoding_description } ) + save_to_db(result) + return result def start_goodside(target_model: LLM, parameters: dict) -> AttackResult: @@ -279,15 +290,20 @@ def start_goodside(target_model: LLM, parameters: dict) -> AttackResult: probes=goodside_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'goodside', len(results) > 0, 'prompt-injection', { + 'target_model': target_model.model_name, + 'total_attacks': len(goodside_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, - 'attack_description': goodside_description + 'attack_description': goodside_description, } ) + save_to_db(result) + return result def start_latentinjection(target_model: LLM, parameters: dict) -> AttackResult: @@ -323,15 +339,20 @@ def start_latentinjection(target_model: LLM, parameters: dict) -> AttackResult: probes=li_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'latentinjection', len(results) > 0, 'prompt-injection', { + 'target_model': target_model.model_name, + 'total_attacks': len(li_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': li_description } ) + save_to_db(result) + return result def start_malwaregen(target_model: LLM, parameters: dict) -> AttackResult: @@ -361,15 +382,20 @@ def start_malwaregen(target_model: LLM, parameters: dict) -> AttackResult: probes=malwaregen_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'malwaregen', len(results) > 0, 'insecure-code-generation', { + 'target_model': target_model.model_name, + 'total_attacks': len(malwaregen_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': malwaregen_description } ) + save_to_db(result) + return result def start_phrasing(target_model: LLM, parameters: dict) -> AttackResult: @@ -394,15 +420,20 @@ def start_phrasing(target_model: LLM, parameters: dict) -> AttackResult: probes=phrasing_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'phrasing', len(results) > 0, 'jailbreak', { + 'target_model': target_model.model_name, + 'total_attacks': len(phrasing_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': phrasing_description } ) + save_to_db(result) + return result def start_promptinject(target_model: LLM, parameters: dict) -> AttackResult: @@ -434,15 +465,20 @@ def start_promptinject(target_model: LLM, parameters: dict) -> AttackResult: probes=pi_probes, output_filename=outfile) - return AttackResult( - 'PromptInject', + result = AttackResult( + 'promptinject', len(results) > 0, 'prompt-injection', { + 'target_model': target_model.model_name, + 'total_attacks': len(pi_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': pi_description } ) + save_to_db(result) + return result def start_suffix(target_model: LLM, parameters: dict) -> AttackResult: @@ -468,12 +504,17 @@ def start_suffix(target_model: LLM, parameters: dict) -> AttackResult: probes=suffix_probes, output_filename=outfile) - return AttackResult( + result = AttackResult( 'suffix', len(results) > 0, 'jailbreak', { + 'target_model': target_model.model_name, + 'total_attacks': len(suffix_probes), + 'number_of_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': suffix_description } ) + save_to_db(result) + return result From a0b2261a55d33987ad136be54cb7d11fca70d953 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 21 Aug 2025 16:48:00 +0200 Subject: [PATCH 44/47] Fix typo in AttackResults keys --- backend-agent/libs/garak.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 4f208f0..9a568fe 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -206,7 +206,7 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(dan_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': dan_description } @@ -257,7 +257,7 @@ def start_encoding(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(encoding_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': encoding_description } @@ -297,7 +297,7 @@ def start_goodside(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(goodside_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': goodside_description, } @@ -346,7 +346,7 @@ def start_latentinjection(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(li_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': li_description } @@ -389,7 +389,7 @@ def start_malwaregen(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(malwaregen_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': malwaregen_description } @@ -427,7 +427,7 @@ def start_phrasing(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(phrasing_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': phrasing_description } @@ -472,7 +472,7 @@ def start_promptinject(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(pi_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': pi_description } @@ -511,7 +511,7 @@ def start_suffix(target_model: LLM, parameters: dict) -> AttackResult: { 'target_model': target_model.model_name, 'total_attacks': len(suffix_probes), - 'number_of_successful_attacks': len(results), + 'number_successful_attacks': len(results), 'successful_attacks': results, 'attack_description': suffix_description } From 5e6946e99dd7fbcb9a971543ed3450500af3dfc0 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 21 Aug 2025 16:56:42 +0200 Subject: [PATCH 45/47] Reactivate DanInTheWild sub-probe --- backend-agent/libs/garak.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend-agent/libs/garak.py b/backend-agent/libs/garak.py index 9a568fe..a035bfc 100644 --- a/backend-agent/libs/garak.py +++ b/backend-agent/libs/garak.py @@ -191,7 +191,7 @@ def start_dan(target_model: LLM, parameters: dict) -> AttackResult: 'probes.dan.DUDE', 'probes.dan.STAN', 'probes.dan.AutoDANCached', - #'probes.dan.DanInTheWild', + 'probes.dan.DanInTheWild', ] outfile = parameters.get('output_file', f'{OUTPUT_FILE}.dan') # Run the attack From 985aaf31eff8d05709814630d46874eee2a88137 Mon Sep 17 00:00:00 2001 From: Marco Rosa Date: Thu, 21 Aug 2025 16:57:25 +0200 Subject: [PATCH 46/47] Add list of garak attacks for agent --- backend-agent/data/garak/list_attacks.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 backend-agent/data/garak/list_attacks.txt diff --git a/backend-agent/data/garak/list_attacks.txt b/backend-agent/data/garak/list_attacks.txt new file mode 100644 index 0000000..c8723c8 --- /dev/null +++ b/backend-agent/data/garak/list_attacks.txt @@ -0,0 +1,8 @@ +dan +encoding +goodside +latentinjection +malwaregen +phrasing +promptinject +suffix From 0f5138924739915c3218704c5cb1cc8bc3bc64b0 Mon Sep 17 00:00:00 2001 From: "changelog-ci[bot]" Date: Thu, 21 Aug 2025 16:09:33 +0000 Subject: [PATCH 47/47] [Changelog CI] Add Changelog for Version v0.4.0 --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aaf3d8..c615a4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# Version: v0.4.0 + +* [#44](https://github.com/SAP/STARS/pull/44): Add Garak tool +* [#72](https://github.com/SAP/STARS/pull/72): Bump deprecated from 1.2.15 to 1.2.18 in /backend-agent +* [#73](https://github.com/SAP/STARS/pull/73): Bump python-dotenv from 1.0.1 to 1.1.1 in /backend-agent +* [#74](https://github.com/SAP/STARS/pull/74): Bump flask from 2.3.3 to 3.1.1 in /backend-agent +* [#77](https://github.com/SAP/STARS/pull/77): Bump ollama from 0.4.7 to 0.5.3 in /backend-agent +* [#78](https://github.com/SAP/STARS/pull/78): Bump the js-dependencies group across 1 directory with 25 updates +* [#79](https://github.com/SAP/STARS/pull/79): Update faiss-cpu requirement from ~=1.9.0 to ~=1.12.0 in /backend-agent +* [#80](https://github.com/SAP/STARS/pull/80): Bump actions/checkout from 4 to 5 +* [#81](https://github.com/SAP/STARS/pull/81): Bump mermaid from 11.4.1 to 11.10.0 in /frontend + + # Version: v0.3.1 * [#50](https://github.com/SAP/STARS/pull/50): Bump webpack-dev-server and @angular-devkit/build-angular in /frontend