From f69fe3697eefa0141a6e1fad120a1324063fef6e Mon Sep 17 00:00:00 2001 From: Shrey Singla <62649026+shreysingla11@users.noreply.github.com> Date: Mon, 30 Dec 2024 16:37:05 +0530 Subject: [PATCH 01/14] fix: use latest tree-sitter version (#1108) --- .../tools/local/base/utils/__init__.py | 3 - .../tools/local/base/utils/grep_ast.py | 303 --------- .../tools/local/base/utils/grep_utils.py | 126 ---- .../tools/local/base/utils/repomap.py | 626 ------------------ .../codeanalysis/actions/create_codemap.py | 9 +- .../tools/local/codeanalysis/chunker.py | 34 +- .../tools/local/codeanalysis/constants.py | 1 - .../composio/tools/local/codeanalysis/tool.py | 4 +- .../local/codeanalysis/tree_sitter_related.py | 11 +- python/setup.py | 2 - python/tox.ini | 4 +- 11 files changed, 16 insertions(+), 1107 deletions(-) delete mode 100644 python/composio/tools/local/base/utils/grep_ast.py delete mode 100644 python/composio/tools/local/base/utils/grep_utils.py delete mode 100644 python/composio/tools/local/base/utils/repomap.py diff --git a/python/composio/tools/local/base/utils/__init__.py b/python/composio/tools/local/base/utils/__init__.py index 8b4fe30a8d5..ca61bb58eb4 100644 --- a/python/composio/tools/local/base/utils/__init__.py +++ b/python/composio/tools/local/base/utils/__init__.py @@ -1,5 +1,2 @@ -from .grep_ast import TreeContext -from .grep_utils import get_files_excluding_gitignore, grep_util from .parser import filename_to_lang -from .repomap import RepoMap from .utils import get_mtime, get_rel_fname, print_if_verbose, split_path, token_count diff --git a/python/composio/tools/local/base/utils/grep_ast.py b/python/composio/tools/local/base/utils/grep_ast.py deleted file mode 100644 index b5dd4461e78..00000000000 --- a/python/composio/tools/local/base/utils/grep_ast.py +++ /dev/null @@ -1,303 +0,0 @@ -# This file is based on code from -# https://github.com/paul-gauthier/aider/blob/main/aider/repomap.py - -import re - -from composio.tools.local.base.utils.parser import filename_to_lang - - -class TreeContext: - def __init__( - self, - filename, # Name of the file being processed - code, # Content of the file as a string - color=False, # Whether to use color highlighting in the output - verbose=False, # Whether to include additional detailed information in the output - line_number=False, # Whether to display line numbers in the output - parent_context=True, # Whether to include the enclosing scope (e.g., class or function) of a match - child_context=True, # Whether to include nested scopes (e.g., inner functions or classes) of a match - last_line=True, # Whether to include the closing line of each scope (e.g., end of function or class) - margin=3, # Number of additional lines to include before and after matches for context - mark_lois=True, # Whether to highlight or mark the specific lines of interest within matches - header_max=10, # Maximum number of lines to include when showing the header/beginning of a scope - show_top_of_file_parent_scope=True, # Whether to display the top-level scope of the file (e.g., module-level code) - loi_pad=1, # Number of extra lines to include around specifically marked lines of interest - ): - # Initialize TreeContext with various parameters - self.filename = filename - self.color = color - self.verbose = verbose - self.line_number = line_number - self.last_line = last_line - self.margin = margin - self.mark_lois = mark_lois - self.header_max = header_max - self.loi_pad = loi_pad - self.show_top_of_file_parent_scope = show_top_of_file_parent_scope - self.done_parent_scopes = set() - self.parent_context = parent_context - self.child_context = child_context - - # Determine the language of the file - lang = filename_to_lang(filename) - - from tree_sitter_languages import get_parser # pylint: disable=C0415 - - # Get parser based on file extension - parser = get_parser(lang) - tree = parser.parse(bytes(code, "utf8")) - - # Split the code into lines - self.lines = code.splitlines() - self.num_lines = len(self.lines) + 1 - - # Initialize data structures for storing information about the code - self.output_lines = {} # color lines, with highlighted matches - self.scopes = [ - set() for _ in range(self.num_lines) - ] # Which scopes is each line part of? - self.header = [ - [] for _ in range(self.num_lines) - ] # Which lines serve as a short "header" for the scope starting on that line - self.nodes = [[] for _ in range(self.num_lines)] - - # Walk the AST tree - root_node = tree.root_node - self.walk_tree(root_node) - scope_width = 0 - # Process headers and scopes - if self.verbose: - scope_width = max( - len(str(set(self.scopes[i]))) for i in range(self.num_lines - 1) - ) - for i in range(self.num_lines): - header = sorted(self.header[i]) - if self.verbose and i < self.num_lines - 1: - scopes = str(sorted(set(self.scopes[i]))) - print(f"{scopes.ljust(scope_width)}", i, self.lines[i]) - - if len(header) > 1: - size, head_start, head_end = header[0] - if size > self.header_max: - head_end = head_start + self.header_max - else: - head_start = i - head_end = i + 1 - - self.header[i] = head_start, head_end - - # Initialize sets for tracking lines to show and lines of interest - self.show_lines = set() - self.lines_of_interest = set() - - def grep(self, pat, ignore_case): - # Search for pattern in lines and highlight matches if color is enabled - found = set() - - # Compile the regex pattern once before the loop - flags = re.IGNORECASE if ignore_case else 0 - compiled_pat = re.compile(pat, flags) - - for i, line in enumerate(self.lines): - if compiled_pat.search(line): - if self.color: - highlighted_line = compiled_pat.sub( - lambda match: f"\033[1;31m{match.group()}\033[0m", line - ) - self.output_lines[i] = highlighted_line - found.add(i) - return found - - def add_lines_of_interest(self, line_nums): - # Add lines of interest to the set - self.lines_of_interest.update(line_nums) - - def add_context(self): - # Add context around lines of interest - if not self.lines_of_interest: - return - - self.done_parent_scopes = set() - - self.show_lines = set(self.lines_of_interest) - - # Add padding around lines of interest - if self.loi_pad: - for line in self.show_lines.copy(): - new_lines = range( - max(0, line - self.loi_pad), - min(self.num_lines, line + self.loi_pad + 1), - ) - self.show_lines.update(new_lines) - - # Add the bottom line and its parent context if required - if self.last_line: - bottom_line = self.num_lines - 2 - self.show_lines.add(bottom_line) - self.add_parent_scopes(bottom_line) - - # Add parent context for lines of interest if required - if self.parent_context: - for i in set(self.lines_of_interest): - self.add_parent_scopes(i) - - # Add child context for lines of interest if required - if self.child_context: - for i in set(self.lines_of_interest): - self.add_child_context(i) - - # Add top margin lines - if self.margin: - self.show_lines.update(range(self.margin)) - - # Close small gaps between shown lines - self.close_small_gaps() - - def add_child_context(self, i): - # Add context for child nodes - if not self.nodes[i]: - return - - last_line = self.get_last_line_of_scope(i) - size = last_line - i - if size < 5: - self.show_lines.update(range(i, last_line + 1)) - return - - children = [] - for node in self.nodes[i]: - children += self.find_all_children(node) - - children = sorted( - children, - key=lambda node: node.end_point[0] - node.start_point[0], - reverse=True, - ) - - currently_showing = len(self.show_lines) - max_to_show = 25 - min_to_show = 5 - percent_to_show = 0.10 - max_to_show = max(min(size * percent_to_show, max_to_show), min_to_show) - - for child in children: - if len(self.show_lines) > currently_showing + max_to_show: - break - child_start_line = child.start_point[0] - self.add_parent_scopes(child_start_line) - - def find_all_children(self, node): - # Recursively find all children of a node - children = [node] - for child in node.children: - children += self.find_all_children(child) - return children - - def get_last_line_of_scope(self, i): - # Get the last line of the scope starting at line i - last_line = max(node.end_point[0] for node in self.nodes[i]) - return last_line - - def close_small_gaps(self): - # Close small gaps between shown lines - closed_show = set(self.show_lines) - sorted_show = sorted(self.show_lines) - for i in range(len(sorted_show) - 1): - if sorted_show[i + 1] - sorted_show[i] == 2: - closed_show.add(sorted_show[i] + 1) - - # Pick up adjacent blank lines - for i, _ in enumerate(self.lines): - if i not in closed_show: - continue - if ( - self.lines[i].strip() - and i < self.num_lines - 2 - and not self.lines[i + 1].strip() - ): - closed_show.add(i + 1) - - self.show_lines = closed_show - - def format(self): - # Format the output with line numbers, colors, and markers - if not self.show_lines: - return "" - - output = "" - if self.color: - # reset - output += "\033[0m\n" - - dots = not (0 in self.show_lines) - for i, line in enumerate(self.lines): - if i not in self.show_lines: - if dots: - if self.line_number: - output += "...⋮...\n" - else: - output += "⋮...\n" - dots = False - continue - - if i in self.lines_of_interest and self.mark_lois: - spacer = "█" - if self.color: - spacer = f"\033[31m{spacer}\033[0m" - else: - spacer = "│" - - line_output = f"{spacer}{self.output_lines.get(i, line)}" - if self.line_number: - line_output = f"{i + 1:3}" + line_output - output += line_output + "\n" - - dots = True - - return output - - def add_parent_scopes(self, i): - # Add parent scopes for a given line - if i in self.done_parent_scopes: - return - self.done_parent_scopes.add(i) - - for line_num in self.scopes[i]: - head_start, head_end = self.header[line_num] - if head_start > 0 or self.show_top_of_file_parent_scope: - self.show_lines.update(range(head_start, head_end)) - - if self.last_line: - last_line = self.get_last_line_of_scope(line_num) - self.add_parent_scopes(last_line) - - def walk_tree(self, node, depth=0): - # Recursively walk the AST tree and populate data structures - start = node.start_point - end = node.end_point - - start_line = start[0] - end_line = end[0] - size = end_line - start_line - - self.nodes[start_line].append(node) - - if self.verbose and node.is_named: - print( - " " * depth, - node.type, - f"{start_line}-{end_line}={size + 1}", - node.text.splitlines()[0], - self.lines[start_line], - ) - - if size: - self.header[start_line].append((size, start_line, end_line)) - - for i in range(start_line, end_line + 1): - self.scopes[i].add(start_line) - - for child in node.children: - self.walk_tree(child, depth + 1) - - return start_line, end_line diff --git a/python/composio/tools/local/base/utils/grep_utils.py b/python/composio/tools/local/base/utils/grep_utils.py deleted file mode 100644 index 05ad5fec4e4..00000000000 --- a/python/composio/tools/local/base/utils/grep_utils.py +++ /dev/null @@ -1,126 +0,0 @@ -# This file is based on code from -# https://github.com/paul-gauthier/grep-ast/blob/main/grep_ast/grep_ast.py - -import os -from pathlib import Path - -from composio.tools.local.base.utils.grep_ast import TreeContext -from composio.tools.local.base.utils.parser import filename_to_lang - - -def get_files_excluding_gitignore(root_path, no_gitignore=False, file_patterns=None): - """ - Get all files matching the given patterns in the root path, excluding those specified in .gitignore. - - :param root_path: The root directory to start searching from. - :param no_gitignore: If True, ignore .gitignore file. - :param file_patterns: A list of file patterns to match. Defaults to ["*.py", "*.md"]. - :return: A list of file paths matching the patterns. - """ - root_path = Path(root_path).resolve() - gitignore = None - - if not no_gitignore: - # Check root_path first - potential_gitignore = root_path / ".gitignore" - if potential_gitignore.exists(): - gitignore = potential_gitignore - else: - # Then check parent directories - for parent in root_path.parents: - potential_gitignore = parent / ".gitignore" - if potential_gitignore.exists(): - gitignore = potential_gitignore - break - - import pathspec # TODO: simplify import # pylint: disable=C0415 - - if gitignore: - with open(gitignore, "r", encoding="utf-8") as f: - spec = pathspec.PathSpec.from_lines("gitwildmatch", f) - else: - spec = pathspec.PathSpec.from_lines("gitwildmatch", []) - - if file_patterns is None: - file_patterns = ["*.[pP][yY]", "*.[mM][dD]", "*.[rR][sS][tT]", "*.[tT][xX][tT]"] - - files = [] - for pattern in file_patterns: - for path in root_path.rglob(pattern): - # Exclude .git and other version control system folders - if any(part.startswith(".") and part != "." for part in path.parts): - continue - if path.is_file() and not spec.match_file(path): - files.append(str(path)) - - return files - - -# callable utility which works the same way as main. -def grep_util( - pattern, - filenames, - encoding="utf8", - color=None, - verbose=False, - line_number=True, - ignore_case=True, - no_gitignore=False, -): - results = [] - - for filename in filenames: - if os.path.isdir(filename): - dir_files = get_files_excluding_gitignore(filename, no_gitignore) - for file in dir_files: - results.extend( - process_file( - file, - pattern, - encoding, - ignore_case, - color, - verbose, - line_number, - ) - ) - else: - results.extend( - process_file( - filename, - pattern, - encoding, - ignore_case, - color, - verbose, - line_number, - ) - ) - - return results - - -def process_file(filename, pattern, encoding, ignore_case, color, verbose, line_number): - file_results = [] - try: - with open(filename, "r", encoding=encoding) as f: - content = f.read() - except UnicodeDecodeError: - return file_results - - lang = filename_to_lang(filename) - - if lang: - try: - tc = TreeContext( - filename, content, color=color, verbose=verbose, line_number=line_number - ) - loi = tc.grep(pattern, ignore_case) - if loi: - tc.add_lines_of_interest(loi) - tc.add_context() - file_results.append({"filename": filename, "matches": tc.format()}) - except ValueError: - pass # Skip files that can't be parsed - - return file_results diff --git a/python/composio/tools/local/base/utils/repomap.py b/python/composio/tools/local/base/utils/repomap.py deleted file mode 100644 index fd865a07d00..00000000000 --- a/python/composio/tools/local/base/utils/repomap.py +++ /dev/null @@ -1,626 +0,0 @@ -# Import necessary libraries -import math -import os -import shutil -from collections import Counter, defaultdict, namedtuple -from importlib import resources -from pathlib import Path - -from composio.tools.local.base.utils.grep_ast import TreeContext -from composio.tools.local.base.utils.parser import filename_to_lang -from composio.tools.local.base.utils.utils import ( - get_mtime, - get_rel_fname, - print_if_verbose, - token_count, -) - - -# Define a named tuple for storing tag information -Tag = namedtuple("Tag", ["rel_fname", "fname", "line", "name", "kind"]) - -""" -RepoMap: Generates a structured view of a code repository. - -Key components: -1. chat_fnames: Files active in the current conversation. - - Given high personalization priority in ranking. - - Excluded from final repo map output. - -2. mentioned_fnames: Files of particular interest. - - Given medium personalization priority in ranking. - - Included in final repo map output. - -3. other_fnames: All other repository files. - - Given low personalization priority. - - Included in output if relevant or space allows. - -Process: -1. Collect tags (definitions and references) from all files. -2. Build a graph representing relationships between files and identifiers. -3. Use PageRank with personalization to rank files and identifiers. -4. Generate a tree-like structure of the most important elements. -5. Optimize the output to fit within a specified token limit. - -The resulting repo map provides a context-aware overview of the repository, -emphasizing relevant files and code structures based on the current conversation -and mentioned points of interest. -""" - - -class RepoMap: - # Class variables for caching - CACHE_VERSION = 1 - TAGS_CACHE_DIR = f".composio.tags.cache.v{CACHE_VERSION}" - - cache_missing = False - warned_files: set[str] = set() - - def __init__( - self, - map_tokens=10240, - root=None, - repo_content_prefix=None, - verbose=False, - max_context_window=10000, - ): - """ - Initialize the RepoMap object. - - :param map_tokens: Maximum number of tokens for the repo map - :param root: Root directory of the repository - :param repo_content_prefix: Prefix for repo content - :param verbose: Enable verbose output - :param max_context_window: Maximum context window size - """ - - self.verbose = verbose - - # Set root directory - if not root: - root = os.getcwd() - self.root = root - - # Load tags cache - self.load_tags_cache() - - self.max_map_tokens = map_tokens - self.max_context_window = max_context_window - self.TAGS_CACHE = None - self.tree_cache = {} - self.token_count = token_count - self.repo_content_prefix = repo_content_prefix - - def get_repo_map( - self, chat_files, other_files, mentioned_fnames=None, mentioned_idents=None - ): - """ - Generate a repository map based on the given files and mentions. - - :param chat_files: Files currently in the chat - :param other_files: Other files in the repository - :param mentioned_fnames: Mentioned file names - :param mentioned_idents: Mentioned identifiers - :return: Repository map as a string - """ - # Early exit conditions - if self.max_map_tokens <= 0 or not other_files: - print_if_verbose( - "Exiting repo-map due to max_map_tokens <= 0 or no other_files", - self.verbose, - ) - return "error" - - # Initialize mentioned sets if not provided - mentioned_fnames = mentioned_fnames or set() - mentioned_idents = mentioned_idents or set() - - max_map_tokens = self.max_map_tokens - - # Adjust max_map_tokens when no files are in the chat - MUL = 8 - padding = 4096 - if max_map_tokens and self.max_context_window: - target = min(max_map_tokens * MUL, self.max_context_window - padding) - else: - target = 0 - if not chat_files and self.max_context_window and target > 0: - max_map_tokens = target - - try: - # Generate ranked tags map - files_listing = self.get_ranked_tags_map( - chat_files, - other_files, - max_map_tokens, - mentioned_fnames, - mentioned_idents, - ) - except RecursionError: - # Handle recursion error (possibly due to large git repo) - self.max_map_tokens = 0 - print_if_verbose("Exiting repo-map due to RecursionError", self.verbose) - return "error" - - if not files_listing: - print_if_verbose( - "Exiting repo-map due to empty files_listing", self.verbose - ) - return "error" - - # Count tokens in the files listing - num_tokens = self.token_count(files_listing) - print_if_verbose(f"Repo-map: {num_tokens / 1024:.1f} k-tokens", self.verbose) - - # Prepare repo content string - other = "other " if chat_files else "" - if self.repo_content_prefix: - repo_content = self.repo_content_prefix.format(other=other) - else: - repo_content = "" - - repo_content += files_listing - - return repo_content - - def load_tags_cache(self): - from diskcache import Cache # pylint: disable=C0415 - - path = Path(self.root) / self.TAGS_CACHE_DIR - if not path.exists(): - self.cache_missing = True - self.TAGS_CACHE = Cache(path) - - def get_tags(self, fname: str, rel_fname: str) -> list[Tag]: - """ - Get tags for a file, using cache if available. - - :param fname: Absolute file name - :param rel_fname: Relative file name - :return: List of tags - """ - file_mtime = get_mtime(fname) - if file_mtime is None: - print_if_verbose( - f"Warning: Unable to get modification time for {fname}, skipping", - self.verbose, - ) - return [] - - if self.TAGS_CACHE is None: - print_if_verbose( - "Warning: Tags cache is not initialized, something went wrong", - self.verbose, - ) - return [] - - cache_key = fname - cache_data = self.TAGS_CACHE.get(cache_key) - - if cache_data is not None and cache_data.get("mtime") == file_mtime: - return cache_data.get("data", []) - - # Cache miss or outdated: generate new tags - data = list(self.get_tags_raw(fname, rel_fname)) - - # Update cache - self.TAGS_CACHE.set(cache_key, {"mtime": file_mtime, "data": data}) - return data - - def get_tags_raw(self, fname, rel_fname): - """ - Generate tags for a file using tree-sitter and pygments. - - :param fname: Absolute file name - :param rel_fname: Relative file name - :yield: Tag objects - """ - lang = filename_to_lang(fname) - if not lang: - print_if_verbose( - "Exiting get_tags_raw due to no language detected", self.verbose - ) - return - - from tree_sitter_languages import ( # pylint: disable=C0415 - get_language, - get_parser, - ) - - language = get_language(lang) - parser = get_parser(lang) - - # Load tags query - try: - scm_fname = resources.files(__package__).joinpath( - "queries", f"tree-sitter-{lang}-tags.scm" - ) - except KeyError: - print_if_verbose( - "Exiting get_tags_raw due to KeyError in loading tags query", - self.verbose, - ) - return - - if not scm_fname.is_file(): - print_if_verbose( - "Exiting get_tags_raw due to non-existent query_scm", self.verbose - ) - return - query_scm = scm_fname.read_text() - - # Parse code - with open(fname, "r", encoding="utf-8") as file: - code = file.read().strip() - - if not code: - print_if_verbose("Exiting get_tags_raw due to empty code", self.verbose) - return - - tree = parser.parse(bytes(code, "utf-8")) - - # Run tags query - query = language.query(query_scm) - captures = query.captures(tree.root_node) - - saw = set() - for node, tag in captures: - if tag.startswith("name.definition."): - kind = "def" - elif tag.startswith("name.reference."): - kind = "ref" - else: - continue - saw.add(kind) - - yield Tag( - rel_fname=rel_fname, - fname=fname, - name=node.text.decode("utf-8"), - kind=kind, - line=node.start_point[0], - ) - - # If no references found, use pygments for additional tagging - if "ref" in saw: - print_if_verbose( - "Exiting get_tags_raw after processing references", self.verbose - ) - print_if_verbose(fname, self.verbose) - return - if "def" not in saw: - print_if_verbose( - "Exiting get_tags_raw due to no definitions found", self.verbose - ) - return - - from pygments.util import ClassNotFound # pylint: disable=C0415 - - try: - from pygments.lexers import ( # pylint: disable=C0415 - guess_lexer_for_filename, - ) - from pygments.token import Token # pylint: disable=C0415 - - lexer = guess_lexer_for_filename(fname, code) - tokens = [ - token[1] for token in lexer.get_tokens(code) if token[0] in Token.Name - ] - except ClassNotFound: - print_if_verbose( - "Exiting get_tags_raw due to ClassNotFound in lexer guessing", - self.verbose, - ) - tokens = code.split() - - for token in tokens: - yield Tag( - rel_fname=rel_fname, - fname=fname, - name=token, - kind="ref", - line=-1, - ) - - def get_ranked_tags( - self, chat_fnames, other_fnames, mentioned_fnames, mentioned_idents - ): # pylint: disable=R0915 - """ - Generate ranked tags for files in the repository. - - :param chat_fnames: Files currently in the chat - :param other_fnames: Other files in the repository - :param mentioned_fnames: Mentioned file names - :param mentioned_idents: Mentioned identifiers - :return: List of ranked tags - """ - import networkx as nx # pylint: disable=C0415 - - defines = defaultdict(set) - references = defaultdict(list) - definitions = defaultdict(set) - - personalization = {} - fnames = sorted(set(chat_fnames).union(set(other_fnames))) - chat_rel_fnames = set() - - # Improved personalization logic - chat_weight = 10.0 - mentioned_weight = 5.0 - other_weight = 1.0 - - total_weight = ( - len(chat_fnames) * chat_weight - + len(mentioned_fnames) * mentioned_weight - + len(other_fnames) * other_weight - ) - self.cache_missing = False - - # Process each file - for fname in fnames: - if not Path(fname).is_file(): - if fname not in self.warned_files: - if Path(fname).exists(): - print_if_verbose( - f"Repo-map can't include {fname}, it is not a normal file", - self.verbose, - ) - else: - print_if_verbose( - f"Repo-map can't include {fname}, it no longer exists", - self.verbose, - ) - self.warned_files.add(fname) - continue - - rel_fname = get_rel_fname(self.root, fname) - if fname in chat_fnames: - personalization[rel_fname] = chat_weight / total_weight - chat_rel_fnames.add(rel_fname) - elif rel_fname in mentioned_fnames: - personalization[rel_fname] = mentioned_weight / total_weight - else: - personalization[rel_fname] = other_weight / total_weight - - tags = self.get_tags(fname, rel_fname) - if tags is None: - continue - - for tag in tags: - if tag.kind == "def": - defines[tag.name].add(rel_fname) - key = (rel_fname, tag.name) - definitions[key].add(tag) - if tag.kind == "ref": - references[tag.name].append(rel_fname) - - # If no references, use definitions as references - if not references: - references = dict((k, list(v)) for k, v in defines.items()) - - idents = set(defines.keys()).intersection(set(references.keys())) - - # Create graph - G = nx.MultiDiGraph() - - for ident in idents: - definers = defines[ident] - mul = ( - 2.0 - if ident in mentioned_idents - else 0.5 if ident.startswith("_") else 1.0 - ) - - for referencer, num_refs in Counter(references[ident]).items(): - for definer in definers: - # Scale down high-frequency mentions - num_refs = math.sqrt(num_refs) - G.add_edge(referencer, definer, weight=mul * num_refs, ident=ident) - - # Calculate PageRank - try: - ranked = nx.pagerank(G, weight="weight", personalization=personalization) - except ZeroDivisionError: - print_if_verbose( - "Exiting get_ranked_tags due to ZeroDivisionError in PageRank calculation", - self.verbose, - ) - return [] - - # Distribute rank across edges - ranked_definitions = defaultdict(float) - for src in G.nodes: - src_rank = ranked[src] - total_weight = sum( - data["weight"] for _src, _dst, data in G.out_edges(src, data=True) - ) - for _src, dst, data in G.out_edges(src, data=True): - data["rank"] = src_rank * data["weight"] / total_weight - ident = data["ident"] - ranked_definitions[(dst, ident)] += data["rank"] - - ranked_tags = [] - ranked_definitions = sorted( - ranked_definitions.items(), reverse=True, key=lambda x: x[1] - ) - - # Generate ranked tags - for (fname, ident), rank in ranked_definitions: - if fname not in chat_rel_fnames: - ranked_tags.extend(definitions.get((fname, ident), [])) - - rel_other_fnames_without_tags = set( - get_rel_fname(self.root, fname) for fname in other_fnames - ) - - fnames_already_included = set(rt[0] for rt in ranked_tags) - - # Add remaining files to ranked tags - top_rank = sorted( - [(rank, node) for (node, rank) in ranked.items()], reverse=True - ) - for rank, fname in top_rank: - if fname in rel_other_fnames_without_tags: - rel_other_fnames_without_tags.remove(fname) - if fname not in fnames_already_included: - ranked_tags.append((fname,)) - - for fname in rel_other_fnames_without_tags: - ranked_tags.append((fname,)) - - return ranked_tags - - def get_ranked_tags_map( - self, - chat_fnames, - other_fnames=None, - max_map_tokens=None, - mentioned_fnames=None, - mentioned_idents=None, - ): - """ - Generate a ranked tags map for the repository. - - :param chat_fnames: Files currently in the chat - :param other_fnames: Other files in the repository - :param max_map_tokens: Maximum number of tokens for the map - :param mentioned_fnames: Mentioned file names - :param mentioned_idents: Mentioned identifiers - :return: Formatted string of the ranked tags map - """ - # print("Starting get_ranked_tags_map") - if not other_fnames: - other_fnames = [] - if not max_map_tokens: - max_map_tokens = self.max_map_tokens - - mentioned_fnames = mentioned_fnames or set() - mentioned_idents = mentioned_idents or set() - - ranked_tags = self.get_ranked_tags( - chat_fnames, other_fnames, mentioned_fnames, mentioned_idents - ) - - num_tags = len(ranked_tags) - lower_bound = 0 - upper_bound = num_tags - best_tree = None - best_tree_tokens = 0 - - chat_rel_fnames = [get_rel_fname(self.root, fname) for fname in chat_fnames] - middle = min(max_map_tokens // 25, num_tags) - - self.tree_cache = {} - - while lower_bound <= upper_bound: - tree = self.to_tree(ranked_tags[:middle], chat_rel_fnames) - num_tokens = self.token_count(tree) - - if best_tree_tokens < num_tokens < max_map_tokens: - best_tree = tree - best_tree_tokens = num_tokens - - if num_tokens < max_map_tokens: - lower_bound = middle + 1 - else: - upper_bound = middle - 1 - - middle = (lower_bound + upper_bound) // 2 - - return best_tree - - def render_tree(self, abs_fname, rel_fname, lois): - key = (rel_fname, tuple(sorted(lois))) - - if key in self.tree_cache: - return self.tree_cache[key] - - # use python to read the file - with open(abs_fname, "r", encoding="utf-8") as file: - code = file.read() - if not code.endswith("\n"): - code += "\n" - context = TreeContext( - rel_fname, - code, - color=False, - line_number=False, - child_context=False, - last_line=False, - margin=0, - mark_lois=False, - loi_pad=0, - # header_max=30, - show_top_of_file_parent_scope=False, - ) - - context.add_lines_of_interest(lois) - context.add_context() - res = context.format() - self.tree_cache[key] = res - return res - - def to_tree(self, tags, chat_rel_fnames): - if not tags: - return "" - - tags = [tag for tag in tags if tag[0] not in chat_rel_fnames] - tags = sorted(tags) - - cur_fname = None - cur_abs_fname = None - lois = None - output = "" - - # add a bogus tag at the end so we trip the this_fname != cur_fname... - dummy_tag = (None,) - for tag in tags + [dummy_tag]: - this_rel_fname = tag[0] - - # ... here ... to output the final real entry in the list - if this_rel_fname != cur_fname: - if lois is not None: - output += "\n" - if cur_fname is not None: - output += cur_fname + ":\n" - lang = filename_to_lang(cur_abs_fname) - if lang: - output += self.render_tree(cur_abs_fname, cur_fname, lois) - if lang is None: - # print("Skipping : ", cur_abs_fname) - continue - lois = None - elif cur_fname: - output += "\n" + cur_fname + "\n" - if isinstance(tag, Tag): - lois = [] - cur_abs_fname = tag.fname - cur_fname = this_rel_fname - - if lois is not None: - lois.append(tag.line) - - # truncate long lines, in case we get minified js or something else crazy - output = "\n".join([line[:100] for line in output.splitlines()]) + "\n" - - return output - - def delete_cache(self): - """Delete the tags cache.""" - cache_path = Path(self.root) / self.TAGS_CACHE_DIR - # print("Deleting cache: ", cache_path) - if cache_path.exists(): - # Remove all files and subdirectories - for item in cache_path.glob("*"): - if item.is_file(): - item.unlink() - elif item.is_dir(): - shutil.rmtree(item) - # print(f"Cache contents deleted: {cache_path}") - else: - # print("No cache found to delete.") - from diskcache import Cache # pylint: disable=C0415 - - # Reset the cache object - self.TAGS_CACHE = Cache(cache_path) - self.cache_missing = True diff --git a/python/composio/tools/local/codeanalysis/actions/create_codemap.py b/python/composio/tools/local/codeanalysis/actions/create_codemap.py index 96e31e5dd6a..678b7a5d5ab 100644 --- a/python/composio/tools/local/codeanalysis/actions/create_codemap.py +++ b/python/composio/tools/local/codeanalysis/actions/create_codemap.py @@ -1,6 +1,5 @@ import json import os -import shutil from enum import Enum from pathlib import Path from typing import Any, Dict @@ -9,11 +8,7 @@ from composio.tools.base.exceptions import ExecutionFailed from composio.tools.base.local import LocalAction -from composio.tools.local.codeanalysis.constants import ( - CODE_MAP_CACHE, - FQDN_FILE, - TREE_SITTER_FOLDER, -) +from composio.tools.local.codeanalysis.constants import CODE_MAP_CACHE, FQDN_FILE from composio.tools.local.codeanalysis.tool_utils import retry_handler from composio.utils.logging import get as get_logger @@ -91,7 +86,6 @@ def execute( repo_name = os.path.basename(self.REPO_DIR) self.save_dir = f"{CODE_MAP_CACHE}/{repo_name}" os.makedirs(self.save_dir, exist_ok=True) - os.makedirs(TREE_SITTER_FOLDER, exist_ok=True) self.fqdn_cache_file = os.path.join(self.save_dir, FQDN_FILE) self._process(status, metadata) @@ -172,7 +166,6 @@ def create_index(self, is_python: bool): embedder.get_vector_store_from_chunks(self.REPO_DIR, documents, ids, metadatas) logger.info(f"Successfully created index for {len(python_files)} files.") - shutil.rmtree(TREE_SITTER_FOLDER) def load_all_fqdns(self): """ diff --git a/python/composio/tools/local/codeanalysis/chunker.py b/python/composio/tools/local/codeanalysis/chunker.py index 0221bab64bc..226323bafda 100644 --- a/python/composio/tools/local/codeanalysis/chunker.py +++ b/python/composio/tools/local/codeanalysis/chunker.py @@ -1,11 +1,11 @@ -import os import re -import subprocess from typing import Any, Dict, List, Tuple, Union +import tree_sitter_python as tspython from tree_sitter import Language, Parser -from composio.tools.local.codeanalysis.constants import TREE_SITTER_FOLDER + +PY_LANGUAGE = Language(tspython.language()) class Span: @@ -224,37 +224,12 @@ class Chunking: language (Language): The loaded Python language for tree-sitter parsing. Methods: - _setup_tree_sitter(): Sets up the tree-sitter environment. - _load_language(): Loads the Python language for tree-sitter. chunk(): Chunks the given file content into smaller pieces. """ def __init__(self, repo_dir: str): - self._setup_tree_sitter() - self.language = self._load_language() self.repo_dir = repo_dir - def _setup_tree_sitter(self): - python_repo = f"{TREE_SITTER_FOLDER}/python" - if not os.path.exists(python_repo): - subprocess.run( - [ - "git", - "clone", - "https://github.com/tree-sitter/tree-sitter-python", - python_repo, - ], - check=True, - ) - - build_path = f"{TREE_SITTER_FOLDER}/build/python.so" - if not os.path.exists(build_path): - os.makedirs(os.path.dirname(build_path), exist_ok=True) - Language.build_library(build_path, [python_repo]) - - def _load_language(self) -> Language: - return Language(f"{TREE_SITTER_FOLDER}/build/python.so", "python") - def chunk( self, file_content: str, @@ -265,8 +240,7 @@ def chunk( max_chunk_size: int = 512 * 3, ) -> Tuple[List[str], List[Dict[str, Any]], List[str]]: if is_python: - parser = Parser() - parser.set_language(self.language) + parser = Parser(PY_LANGUAGE) tree = parser.parse(file_content.encode("utf-8")) source_code_bytes = file_content.encode("utf-8") diff --git a/python/composio/tools/local/codeanalysis/constants.py b/python/composio/tools/local/codeanalysis/constants.py index aca3a082935..56a3176239c 100644 --- a/python/composio/tools/local/codeanalysis/constants.py +++ b/python/composio/tools/local/codeanalysis/constants.py @@ -5,5 +5,4 @@ CODE_MAP_CACHE = os.path.join(Path.home(), ".composio/tmp") FQDN_FILE = "fqdn_cache.json" DEEPLAKE_FOLDER = "deeplake" -TREE_SITTER_FOLDER = os.path.join(CODE_MAP_CACHE, "tree_sitter_cache") EMBEDDER = "sentence-transformers/all-mpnet-base-v2" diff --git a/python/composio/tools/local/codeanalysis/tool.py b/python/composio/tools/local/codeanalysis/tool.py index 0c3defaf328..732ae18a302 100644 --- a/python/composio/tools/local/codeanalysis/tool.py +++ b/python/composio/tools/local/codeanalysis/tool.py @@ -15,10 +15,10 @@ class CodeAnalysisTool(LocalTool, autoload=True): """Code index tool.""" requires = [ - "tree_sitter==0.21.3", + "tree_sitter>=0.22.0", "deeplake>3.9,<4", "sentence-transformers", - "tree_sitter_languages", + "tree_sitter_python>=0.22.0", "git+https://github.com/DataDog/jedi.git@92d0c807b0dcd115b1ffd0a4ed21e44db127c2fb#egg=jedi", "PyJWT", # deeplake/client/client.py:41 ] diff --git a/python/composio/tools/local/codeanalysis/tree_sitter_related.py b/python/composio/tools/local/codeanalysis/tree_sitter_related.py index 7478bfb8880..d8ad05e5b02 100644 --- a/python/composio/tools/local/codeanalysis/tree_sitter_related.py +++ b/python/composio/tools/local/codeanalysis/tree_sitter_related.py @@ -1,8 +1,11 @@ import re from typing import Dict, List, Tuple -from tree_sitter import Node, Parser, Tree -from tree_sitter_languages import get_parser +import tree_sitter_python as tspython +from tree_sitter import Language, Node, Parser, Tree + + +PY_LANGUAGE = Language(tspython.language()) class SpanRelated: @@ -125,7 +128,7 @@ def fetch_nodes_of_type(file_path: str, types_allowed: List[str]) -> List[Dict]: Returns: List[Dict]: A list of dictionaries containing node details. """ - parser = get_parser("python") + parser = Parser(PY_LANGUAGE) with open(file_path, "r", encoding="utf-8") as file: test_code_str = file.read() @@ -262,7 +265,7 @@ def fetch_entity_artifacts(entity_body: str, entity_type: str) -> Dict[str, str] if entity_type not in ["class", "function"]: raise ValueError("Invalid entity_type. Must be 'class' or 'function'.") - parser = get_parser("python") + parser = Parser(PY_LANGUAGE) tree = fetch_tree(parser, entity_body) entity_node = tree.root_node diff --git a/python/setup.py b/python/setup.py index cddc2e3e128..cd4160979cd 100644 --- a/python/setup.py +++ b/python/setup.py @@ -69,8 +69,6 @@ def scan_for_package_data( ] tools_requirements = [ - "tree_sitter_languages", - "tree_sitter==0.21.3", "pygments", "pathspec", "diskcache", diff --git a/python/tox.ini b/python/tox.ini index 16107460eab..3edce8485e2 100644 --- a/python/tox.ini +++ b/python/tox.ini @@ -91,7 +91,7 @@ deps = codecov==2.1.13 pytest-codecov==0.5.1 typing_extensions>=4.10.0 - tree_sitter==0.21.3# codeanalysis + tree_sitter>=0.22.0 # codeanalysis python-dotenv==1.0.1 ; composio_langgraph==0.5.13 langgraph==0.2.16 @@ -100,7 +100,7 @@ deps = git+https://github.com/DataDog/jedi.git@92d0c807b0dcd115b1ffd0a4ed21e44db127c2fb#egg=jedi # codeanalysis libcst # codeanalysis sentence_transformers # codeanalysis - tree_sitter_languages # codeanalysis + tree_sitter_python>=0.22.0 # codeanalysis PyJWT # deeplake/client/client.py:41 e2b>=0.17.2a37 # E2B Workspace e2b-code-interpreter # E2B workspace From f496f7fa776335ae7825cad2991c9b38923271fc Mon Sep 17 00:00:00 2001 From: tushar-composio Date: Tue, 31 Dec 2024 12:30:20 +0530 Subject: [PATCH 02/14] fix: Add validation of which tools were requested by `get_tools` (#1107) --- python/composio/tools/toolset.py | 23 +++++++++++++++++ .../runtime_tools/langchain_math.py | 1 + .../autogen/composio_autogen/toolset.py | 2 +- .../plugins/camel/composio_camel/toolset.py | 1 + .../plugins/claude/composio_claude/toolset.py | 1 + .../crew_ai/composio_crewai/toolset.py | 1 + .../griptape/composio_griptape/toolset.py | 1 + .../langchain/composio_langchain/toolset.py | 1 + .../llamaindex/composio_llamaindex/toolset.py | 1 + python/plugins/lyzr/composio_lyzr/toolset.py | 1 + .../plugins/openai/composio_openai/toolset.py | 1 + .../phidata/composio_phidata/toolset.py | 1 + .../praisonai/composio_praisonai/toolset.py | 1 + python/tests/test_cli/test_connections.py | 2 +- python/tests/test_tools/test_toolset.py | 25 +++++++++++++++++++ 15 files changed, 61 insertions(+), 2 deletions(-) diff --git a/python/composio/tools/toolset.py b/python/composio/tools/toolset.py index 61637a6b33d..8d53a4f15f8 100644 --- a/python/composio/tools/toolset.py +++ b/python/composio/tools/toolset.py @@ -328,6 +328,10 @@ def _limit_file_search_response(response: t.Dict) -> t.Dict: ) self.max_retries = max_retries + # To be populated by get_tools(), from within subclasses like + # composio_openai's Toolset. + self._requested_actions: t.Optional[t.List[str]] = None + def _validating_connection_ids( self, connected_account_ids: t.Dict[AppType, str], @@ -797,6 +801,16 @@ def execute_action( :return: Output object from the function call """ action = Action(action) + if ( + self._requested_actions is not None + and action.slug not in self._requested_actions + ): + raise ComposioSDKError( + f"Action {action.slug} is being called, but was never requested by the toolset. " + "Make sure that the actions you are trying to execute are requested in your " + "`get_tools()` call." + ) + params = self._serialize_execute_params(param=params) if processors is not None: self._merge_processors(processors) @@ -932,6 +946,7 @@ def validate_tools( # NOTE: This an experimental, can convert to decorator for more convinience if not apps and not actions and not tags: return + self.workspace.check_for_missing_dependencies( apps=apps, actions=actions, @@ -945,6 +960,7 @@ def get_action_schemas( tags: t.Optional[t.Sequence[TagType]] = None, *, check_connected_accounts: bool = True, + _populate_requested: bool = False, ) -> t.List[ActionModel]: runtime_actions = t.cast( t.List[t.Type[LocalAction]], @@ -1010,6 +1026,13 @@ def get_action_schemas( if item.name == Action.ANTHROPIC_TEXT_EDITOR.slug: item.name = "str_replace_editor" + if _populate_requested: + action_names = [item.name for item in items] + if self._requested_actions is None: + self._requested_actions = [] + + self._requested_actions += action_names + return items def _process_schema(self, action_item: ActionModel) -> ActionModel: diff --git a/python/examples/miscellaneous/runtime_tools/langchain_math.py b/python/examples/miscellaneous/runtime_tools/langchain_math.py index c9e440477df..03a6890f198 100644 --- a/python/examples/miscellaneous/runtime_tools/langchain_math.py +++ b/python/examples/miscellaneous/runtime_tools/langchain_math.py @@ -6,6 +6,7 @@ from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain_openai import ChatOpenAI + @action(toolname="math", requires=["smtplib"]) def multiply(a: int, b: int, c: int) -> int: """ diff --git a/python/plugins/autogen/composio_autogen/toolset.py b/python/plugins/autogen/composio_autogen/toolset.py index e1bb0930406..6b748d46423 100644 --- a/python/plugins/autogen/composio_autogen/toolset.py +++ b/python/plugins/autogen/composio_autogen/toolset.py @@ -26,8 +26,8 @@ def register_tools( self, caller: ConversableAgent, executor: ConversableAgent, - apps: t.Optional[t.Sequence[AppType]] = None, actions: t.Optional[t.Sequence[ActionType]] = None, + apps: t.Optional[t.Sequence[AppType]] = None, tags: t.Optional[t.List[TagType]] = None, entity_id: t.Optional[str] = None, ) -> None: diff --git a/python/plugins/camel/composio_camel/toolset.py b/python/plugins/camel/composio_camel/toolset.py index 086b32c06fb..20845e09dbd 100644 --- a/python/plugins/camel/composio_camel/toolset.py +++ b/python/plugins/camel/composio_camel/toolset.py @@ -187,5 +187,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/claude/composio_claude/toolset.py b/python/plugins/claude/composio_claude/toolset.py index 10acfd14daa..c2a6a3928a3 100644 --- a/python/plugins/claude/composio_claude/toolset.py +++ b/python/plugins/claude/composio_claude/toolset.py @@ -133,6 +133,7 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/crew_ai/composio_crewai/toolset.py b/python/plugins/crew_ai/composio_crewai/toolset.py index c3aa18bb9a1..ad4ae8b538f 100644 --- a/python/plugins/crew_ai/composio_crewai/toolset.py +++ b/python/plugins/crew_ai/composio_crewai/toolset.py @@ -174,6 +174,7 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/griptape/composio_griptape/toolset.py b/python/plugins/griptape/composio_griptape/toolset.py index 6faa5fb11e4..0588b951b24 100644 --- a/python/plugins/griptape/composio_griptape/toolset.py +++ b/python/plugins/griptape/composio_griptape/toolset.py @@ -166,5 +166,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/langchain/composio_langchain/toolset.py b/python/plugins/langchain/composio_langchain/toolset.py index d517569c27c..a8740d6105b 100644 --- a/python/plugins/langchain/composio_langchain/toolset.py +++ b/python/plugins/langchain/composio_langchain/toolset.py @@ -180,5 +180,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/llamaindex/composio_llamaindex/toolset.py b/python/plugins/llamaindex/composio_llamaindex/toolset.py index b9295f0a551..38d5f01aad2 100644 --- a/python/plugins/llamaindex/composio_llamaindex/toolset.py +++ b/python/plugins/llamaindex/composio_llamaindex/toolset.py @@ -162,5 +162,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/lyzr/composio_lyzr/toolset.py b/python/plugins/lyzr/composio_lyzr/toolset.py index cf79a58f041..f22607f8ad0 100644 --- a/python/plugins/lyzr/composio_lyzr/toolset.py +++ b/python/plugins/lyzr/composio_lyzr/toolset.py @@ -121,5 +121,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/openai/composio_openai/toolset.py b/python/plugins/openai/composio_openai/toolset.py index abb1a6fc768..47e8e184371 100644 --- a/python/plugins/openai/composio_openai/toolset.py +++ b/python/plugins/openai/composio_openai/toolset.py @@ -135,6 +135,7 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/phidata/composio_phidata/toolset.py b/python/plugins/phidata/composio_phidata/toolset.py index e3931c872f7..be08d02d356 100644 --- a/python/plugins/phidata/composio_phidata/toolset.py +++ b/python/plugins/phidata/composio_phidata/toolset.py @@ -123,5 +123,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/plugins/praisonai/composio_praisonai/toolset.py b/python/plugins/praisonai/composio_praisonai/toolset.py index 5562c7ddc31..ed38e29eed0 100644 --- a/python/plugins/praisonai/composio_praisonai/toolset.py +++ b/python/plugins/praisonai/composio_praisonai/toolset.py @@ -216,5 +216,6 @@ def get_tools( apps=apps, tags=tags, check_connected_accounts=check_connected_accounts, + _populate_requested=True, ) ] diff --git a/python/tests/test_cli/test_connections.py b/python/tests/test_cli/test_connections.py index 360d8ffefe0..6f3d0bf0711 100644 --- a/python/tests/test_cli/test_connections.py +++ b/python/tests/test_cli/test_connections.py @@ -25,4 +25,4 @@ def test_list_one(self) -> None: assert ( "Id : 6f4f4191-7fe9-4b5c-b491-4b7ec56ebf5d" in result.stdout ), result.stderr - assert "Status: ACTIVE" in result.stdout, result.stderr + assert "Status: EXPIRED" in result.stdout, result.stderr diff --git a/python/tests/test_tools/test_toolset.py b/python/tests/test_tools/test_toolset.py index 95e47daad91..a1fb7728622 100644 --- a/python/tests/test_tools/test_toolset.py +++ b/python/tests/test_tools/test_toolset.py @@ -390,3 +390,28 @@ class SomeToolsetExtention(ComposioToolSet, action_name_char_limit=char_limit): ] ) assert len(t.cast(str, schema.name)) == char_limit + + +def test_invalid_handle_tool_calls() -> None: + """Test edge case where the Agent tries to call a tool that wasn't requested from get_tools().""" + toolset = LangchainToolSet() + + toolset.get_tools(actions=[Action.GMAIL_FETCH_EMAILS]) + with pytest.raises(ComposioSDKError) as exc: + with mock.patch.object(toolset, "_execute_remote"): + toolset.execute_action(Action.HACKERNEWS_GET_FRONTPAGE, {}) + + assert ( + "Action HACKERNEWS_GET_FRONTPAGE is being called, but was never requested by the toolset." + in exc.value.message + ) + + # Ensure it does NOT fail if a subsequent get_tools added that action + toolset.get_tools(actions=[Action.HACKERNEWS_GET_FRONTPAGE]) + with mock.patch.object(toolset, "_execute_remote"): + toolset.execute_action(Action.HACKERNEWS_GET_FRONTPAGE, {}) + + # Ensure it DOES NOT fail if get_tools is never called + toolset = LangchainToolSet() + with mock.patch.object(toolset, "_execute_remote"): + toolset.execute_action(Action.HACKERNEWS_GET_FRONTPAGE, {}) From a04fe24f7139b93af30396b85ceb57e6d60fe02e Mon Sep 17 00:00:00 2001 From: Viraj <35092918+angrybayblade@users.noreply.github.com> Date: Tue, 31 Dec 2024 14:24:20 +0530 Subject: [PATCH 03/14] feat: allow injection of custom auth for local tools (#1110) --- python/composio/client/collections.py | 7 ++- .../tools/local/filetool/actions/git_clone.py | 18 +++++- python/composio/tools/toolset.py | 13 +++++ python/tests/test_tools/test_toolset.py | 56 +++++++++++++++++++ 4 files changed, 90 insertions(+), 4 deletions(-) diff --git a/python/composio/client/collections.py b/python/composio/client/collections.py index 0c2ddbb0703..a8548520b5e 100644 --- a/python/composio/client/collections.py +++ b/python/composio/client/collections.py @@ -1037,7 +1037,7 @@ class ActionModel(BaseModel): description: t.Optional[str] = None -ParamPlacement = t.Literal["header", "path", "query", "subdomain"] +ParamPlacement = t.Literal["header", "path", "query", "subdomain", "metadata"] class CustomAuthParameter(te.TypedDict): @@ -1357,6 +1357,11 @@ def _serialize_auth(auth: t.Optional[CustomAuthObject]) -> t.Optional[t.Dict]: {"in": d["in_"], "name": d["name"], "value": d["value"]} for d in data["parameters"] ] + for param in data["parameters"]: + if param["in"] == "metadata": + raise ComposioClientError( + f"Param placement cannot be 'metadata' for remote action execution: {param}" + ) return data def search_for_a_task( diff --git a/python/composio/tools/local/filetool/actions/git_clone.py b/python/composio/tools/local/filetool/actions/git_clone.py index 2a7fcb08fc4..468b0669bb7 100644 --- a/python/composio/tools/local/filetool/actions/git_clone.py +++ b/python/composio/tools/local/filetool/actions/git_clone.py @@ -23,11 +23,17 @@ def git_reset_cmd(commit_id: str) -> str: return " && ".join(reset_commands) -def git_clone_cmd(repo: str, commit_id: str) -> str: +def git_clone_cmd( + repo: str, + commit_id: str, + github_access_token: t.Optional[str] = None, +) -> str: """Commands to clone github repository.""" # repo is in the format of "composiohq/composio" or "django/django" repo_name = repo.split("/")[-1] - github_access_token = os.environ.get("GITHUB_ACCESS_TOKEN", "").strip() + github_access_token = ( + github_access_token or os.environ.get("GITHUB_ACCESS_TOKEN", "").strip() + ) if not github_access_token and os.environ.get("ALLOW_CLONE_WITHOUT_REPO") != "true": raise RuntimeError("Cannot clone github repository without github access token") @@ -111,7 +117,13 @@ def execute(self, request: GitCloneRequest, metadata: t.Dict) -> GitCloneRespons command = ( git_reset_cmd(request.commit_id) if request.just_reset - else git_clone_cmd(request.repo_name, request.commit_id) + else git_clone_cmd( + request.repo_name, + request.commit_id, + github_access_token=metadata.get( + "github-access-token", + ), + ) ) current_dir = filemanager.current_dir() if pathlib.Path(current_dir, ".git").exists() and not request.just_reset: diff --git a/python/composio/tools/toolset.py b/python/composio/tools/toolset.py index 8d53a4f15f8..54886e48d29 100644 --- a/python/composio/tools/toolset.py +++ b/python/composio/tools/toolset.py @@ -486,6 +486,19 @@ def _execute_local( """Execute a local action.""" metadata = metadata or {} metadata["_toolset"] = self + custom_auth = self._custom_auth.get(App(action.app)) + if custom_auth is not None: + invalid_auth = [] + for param in custom_auth.parameters: + if param["in_"] == "metadata": + metadata[param["name"]] = param["value"] + continue + invalid_auth.append(param) + if len(invalid_auth) > 0: + raise ComposioSDKError( + f"Invalid custom auth found for {action.app}: {invalid_auth}" + ) + response = self.workspace.execute_action( action=action, request_data=params, diff --git a/python/tests/test_tools/test_toolset.py b/python/tests/test_tools/test_toolset.py index a1fb7728622..6b171795d72 100644 --- a/python/tests/test_tools/test_toolset.py +++ b/python/tests/test_tools/test_toolset.py @@ -14,6 +14,7 @@ from composio.exceptions import ApiKeyNotProvidedError, ComposioSDKError from composio.tools.base.abs import action_registry, tool_registry from composio.tools.base.runtime import action as custom_action +from composio.tools.local.filetool.tool import Filetool, FindFile from composio.tools.toolset import ComposioToolSet from composio.utils.pypi import reset_installed_list @@ -331,6 +332,61 @@ def test_execute_action_param_serialization() -> None: ) +def test_custom_auth_on_localtool(): + toolset = ComposioToolSet() + toolset.add_auth( + app=Filetool.enum, + parameters=[ + { + "in_": "metadata", + "name": "name", + "value": "value", + } + ], + ) + + def _execute(cls, request, metadata): # pylint: disable=unused-argument + return mock.MagicMock( + model_dump=lambda *_: { + "assert": metadata["name"] == "value", + }, + ) + + with mock.patch.object(FindFile, "execute", new=_execute): + response = toolset.execute_action( + action=FindFile.enum, + params={ + "pattern": "*.py", + }, + ) + assert response["data"]["assert"] + + +def test_bad_custom_auth_on_localtool(): + toolset = ComposioToolSet() + toolset.add_auth( + app=Filetool.enum, + parameters=[ + { + "in_": "query", + "name": "name", + "value": "value", + } + ], + ) + + with pytest.raises( + ComposioSDKError, + match="Invalid custom auth found for FILETOOL", + ): + toolset.execute_action( + action=FindFile.enum, + params={ + "pattern": "*.py", + }, + ) + + class TestSubclassInit: def test_runtime(self): From 692ee6ced68a2a983823f9a9c5b2bc72a32645da Mon Sep 17 00:00:00 2001 From: tushar-composio Date: Tue, 31 Dec 2024 14:51:31 +0530 Subject: [PATCH 04/14] chore: Release v0.6.9 (#1112) --- python/composio/__version__.py | 2 +- python/composio/client/enums/action.pyi | 2 ++ python/composio/client/enums/trigger.pyi | 5 ++++- python/dockerfiles/Dockerfile | 2 +- python/plugins/autogen/setup.py | 2 +- python/plugins/camel/setup.py | 2 +- python/plugins/claude/setup.py | 2 +- python/plugins/crew_ai/setup.py | 2 +- python/plugins/google/setup.py | 2 +- python/plugins/griptape/setup.py | 2 +- python/plugins/julep/setup.py | 2 +- python/plugins/langchain/setup.py | 2 +- python/plugins/langgraph/setup.py | 2 +- python/plugins/llamaindex/setup.py | 2 +- python/plugins/lyzr/setup.py | 2 +- python/plugins/openai/setup.py | 2 +- python/plugins/phidata/setup.py | 2 +- python/plugins/praisonai/setup.py | 2 +- python/setup.py | 2 +- python/swe/setup.py | 2 +- 20 files changed, 24 insertions(+), 19 deletions(-) diff --git a/python/composio/__version__.py b/python/composio/__version__.py index afd45a483cd..5c2c6c53ea8 100644 --- a/python/composio/__version__.py +++ b/python/composio/__version__.py @@ -1 +1 @@ -__version__ = "0.6.8" +__version__ = "0.6.9" diff --git a/python/composio/client/enums/action.pyi b/python/composio/client/enums/action.pyi index 65676eab248..d865385da1d 100644 --- a/python/composio/client/enums/action.pyi +++ b/python/composio/client/enums/action.pyi @@ -5636,6 +5636,7 @@ class Action(Enum[ActionData], metaclass=EnumGenerator): PEOPLEDATALABS_CLEAN_COMPANY_DATA: "Action" PEOPLEDATALABS_CLEAN_LOCATION_DATA: "Action" PEOPLEDATALABS_CLEAN_SCHOOL_DATA: "Action" + PEOPLEDATALABS_COMPANY_SEARCH_ELASTIC: "Action" PEOPLEDATALABS_ENRICH_COMPANY_DATA: "Action" PEOPLEDATALABS_ENRICH_IP_DATA: "Action" PEOPLEDATALABS_ENRICH_PERSON_DATA: "Action" @@ -5644,6 +5645,7 @@ class Action(Enum[ActionData], metaclass=EnumGenerator): PEOPLEDATALABS_GET_SCHEMA: "Action" PEOPLEDATALABS_IDENTIFY_PERSON_DATA: "Action" PEOPLEDATALABS_NATURAL_LANGUAGE_QUERY_ACTION: "Action" + PEOPLEDATALABS_PEOPLE_SEARCH_ELASTIC: "Action" PERPLEXITYAI_PERPLEXITY_AI_SEARCH: "Action" PIPEDRIVE_ADD_AN_ACTIVITY: "Action" PIPEDRIVE_ADD_AN_INSTALLMENT_SUBSCRIPTION: "Action" diff --git a/python/composio/client/enums/trigger.pyi b/python/composio/client/enums/trigger.pyi index baa801a70d6..ffe29311c63 100644 --- a/python/composio/client/enums/trigger.pyi +++ b/python/composio/client/enums/trigger.pyi @@ -39,7 +39,10 @@ class Trigger(Enum[TriggerData], metaclass=EnumGenerator): NOTION_PAGE_ADDED_TO_DATABASE: "Trigger" NOTION_PAGE_ADDED_TRIGGER: "Trigger" NOTION_PAGE_UPDATED_TRIGGER: "Trigger" - ONE_DRIVE_ONE_DRIVE_ITEM_TRIGGER: "Trigger" + ONE_DRIVE_ONE_DRIVE_DELETED_TRIGGER: "Trigger" + ONE_DRIVE_ONE_DRIVE_FILE_CREATED_TRIGGER: "Trigger" + ONE_DRIVE_ONE_DRIVE_FOLDER_CREATED_TRIGGER: "Trigger" + ONE_DRIVE_ONE_DRIVE_UPDATED_TRIGGER: "Trigger" OUTLOOK_OUTLOOK_CONTACT_TRIGGER: "Trigger" OUTLOOK_OUTLOOK_EVENT_TRIGGER: "Trigger" OUTLOOK_OUTLOOK_MESSAGE_TRIGGER: "Trigger" diff --git a/python/dockerfiles/Dockerfile b/python/dockerfiles/Dockerfile index b294020cded..953b722c77c 100644 --- a/python/dockerfiles/Dockerfile +++ b/python/dockerfiles/Dockerfile @@ -19,7 +19,7 @@ RUN /bin/python3 -m venv .composio/venv RUN export PATH=$PATH:$(pwd)/.composio/venv/bin # Install composio -RUN python -m pip install composio-core[all]==0.6.8 fastapi playwright uvicorn +RUN python -m pip install composio-core[all]==0.6.9 fastapi playwright uvicorn # Install playwright deps RUN playwright install-deps diff --git a/python/plugins/autogen/setup.py b/python/plugins/autogen/setup.py index c59aa11355a..391631d0d90 100644 --- a/python/plugins/autogen/setup.py +++ b/python/plugins/autogen/setup.py @@ -9,7 +9,7 @@ setup( name="composio_autogen", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Autogen agent.", diff --git a/python/plugins/camel/setup.py b/python/plugins/camel/setup.py index a49dfacd188..d7536426eda 100644 --- a/python/plugins/camel/setup.py +++ b/python/plugins/camel/setup.py @@ -9,7 +9,7 @@ setup( name="composio_camel", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Claude LLMs.", diff --git a/python/plugins/claude/setup.py b/python/plugins/claude/setup.py index e1efd0da2ce..9d2f75cd83c 100644 --- a/python/plugins/claude/setup.py +++ b/python/plugins/claude/setup.py @@ -9,7 +9,7 @@ setup( name="composio_claude", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Claude LLMs.", diff --git a/python/plugins/crew_ai/setup.py b/python/plugins/crew_ai/setup.py index f30b39fc5cb..8678ea57b7d 100644 --- a/python/plugins/crew_ai/setup.py +++ b/python/plugins/crew_ai/setup.py @@ -9,7 +9,7 @@ setup( name="composio_crewai", - version="0.6.8", + version="0.6.9", author="Himanshu", author_email="himanshu@composio.dev", description="Use Composio to get an array of tools with your CrewAI agent.", diff --git a/python/plugins/google/setup.py b/python/plugins/google/setup.py index 2e0dd983045..29203084943 100644 --- a/python/plugins/google/setup.py +++ b/python/plugins/google/setup.py @@ -9,7 +9,7 @@ setup( name="composio_google", - version="0.6.8", + version="0.6.9", author="Assistant", author_email="karan@composio.dev", description="Use Composio to get an array of tools with your Google AI Python Gemini model.", diff --git a/python/plugins/griptape/setup.py b/python/plugins/griptape/setup.py index 2e66c4f3c5a..315b7558328 100644 --- a/python/plugins/griptape/setup.py +++ b/python/plugins/griptape/setup.py @@ -9,7 +9,7 @@ setup( name="composio_griptape", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Griptape workflow.", diff --git a/python/plugins/julep/setup.py b/python/plugins/julep/setup.py index 9253055b260..d4a9f7364df 100644 --- a/python/plugins/julep/setup.py +++ b/python/plugins/julep/setup.py @@ -9,7 +9,7 @@ setup( name="composio_julep", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Julep workflow.", diff --git a/python/plugins/langchain/setup.py b/python/plugins/langchain/setup.py index c3003ab4391..d4d6e51dfea 100644 --- a/python/plugins/langchain/setup.py +++ b/python/plugins/langchain/setup.py @@ -9,7 +9,7 @@ setup( name="composio_langchain", - version="0.6.8", + version="0.6.9", author="Karan", author_email="karan@composio.dev", description="Use Composio to get an array of tools with your LangChain agent.", diff --git a/python/plugins/langgraph/setup.py b/python/plugins/langgraph/setup.py index 6482f8f8222..1d28bf2a499 100644 --- a/python/plugins/langgraph/setup.py +++ b/python/plugins/langgraph/setup.py @@ -9,7 +9,7 @@ setup( name="composio_langgraph", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get array of tools with LangGraph Agent Workflows", diff --git a/python/plugins/llamaindex/setup.py b/python/plugins/llamaindex/setup.py index 389edebe0bd..51abb652b90 100644 --- a/python/plugins/llamaindex/setup.py +++ b/python/plugins/llamaindex/setup.py @@ -9,7 +9,7 @@ setup( name="composio_llamaindex", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your LlamaIndex agent.", diff --git a/python/plugins/lyzr/setup.py b/python/plugins/lyzr/setup.py index 4e24057d9d1..d88996e9eb3 100644 --- a/python/plugins/lyzr/setup.py +++ b/python/plugins/lyzr/setup.py @@ -9,7 +9,7 @@ setup( name="composio_lyzr", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Lyzr workflow.", diff --git a/python/plugins/openai/setup.py b/python/plugins/openai/setup.py index fb6ff1ab119..16eaa4cdb86 100644 --- a/python/plugins/openai/setup.py +++ b/python/plugins/openai/setup.py @@ -9,7 +9,7 @@ setup( name="composio_openai", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your OpenAI Function Call.", diff --git a/python/plugins/phidata/setup.py b/python/plugins/phidata/setup.py index bb943655ec3..d3a003ef803 100644 --- a/python/plugins/phidata/setup.py +++ b/python/plugins/phidata/setup.py @@ -9,7 +9,7 @@ setup( name="composio_phidata", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Phidata Plugin.", diff --git a/python/plugins/praisonai/setup.py b/python/plugins/praisonai/setup.py index aa90dcf6e08..f2583bb1b59 100644 --- a/python/plugins/praisonai/setup.py +++ b/python/plugins/praisonai/setup.py @@ -9,7 +9,7 @@ setup( name="composio_praisonai", - version="0.6.8", + version="0.6.9", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio Tools to enhance your PraisonAI agents capabilities.", diff --git a/python/setup.py b/python/setup.py index cd4160979cd..7633d97b31f 100644 --- a/python/setup.py +++ b/python/setup.py @@ -88,7 +88,7 @@ def scan_for_package_data( setup( name="composio_core", - version="0.6.8", + version="0.6.9", author="Utkarsh", author_email="utkarsh@composio.dev", description="Core package to act as a bridge between composio platform and other services.", diff --git a/python/swe/setup.py b/python/swe/setup.py index e8139737d5f..96b1d407272 100644 --- a/python/swe/setup.py +++ b/python/swe/setup.py @@ -35,7 +35,7 @@ def scan_for_package_data( setup( name="swekit", - version="0.3.9", + version="0.3.10", author="Shubhra", author_email="shubhra@composio.dev", description="Tools for running a SWE agent using Composio platform", From 8c13934849624b20da39c845faa3cd8aa77c9379 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:50:31 +0530 Subject: [PATCH 05/14] feat: Replace ChatGPT URL with entelligence.ai link (#1113) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Soham Ganatra --- docs/mint.json | 2 +- docs/mint.json.ejs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index e4566990bfc..9503e7af111 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -73,7 +73,7 @@ }, { "name": "Chat with Code", - "url": "https://chatgpt.com/g/g-67697db23c808191a1787ea4b86ac1ce-composio" + "url": "https://entelligence.ai/ComposioHQ&composio" } ], "navigation": [ diff --git a/docs/mint.json.ejs b/docs/mint.json.ejs index dd016bea2ff..f6693dd3616 100644 --- a/docs/mint.json.ejs +++ b/docs/mint.json.ejs @@ -72,8 +72,8 @@ "url": "https://app.composio.dev/apps" }, { - "name": "Chat with Repo", - "url": "https://dub.composio.dev/composio-chat-with-repo" + "name": "Chat with Code", + "url": "https://entelligence.ai/ComposioHQ&composio" } ], "navigation": [ From 4a6546a2c7f0f1a03f93a9a6f0743279feec3f42 Mon Sep 17 00:00:00 2001 From: Viraj <35092918+angrybayblade@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:58:01 +0530 Subject: [PATCH 06/14] fix: no auth flag delegation (#1114) --- python/composio/tools/base/abs.py | 3 ++- python/composio/tools/base/local.py | 1 + python/tests/test_tools/test_base/test_abs.py | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/python/composio/tools/base/abs.py b/python/composio/tools/base/abs.py index 589f5a54ca3..0f6a26253df 100644 --- a/python/composio/tools/base/abs.py +++ b/python/composio/tools/base/abs.py @@ -397,13 +397,14 @@ def set_metadata(cls, obj: t.Type["Tool"]) -> None: setattr(obj, "_triggers", getattr(obj, "_triggers", {})) @staticmethod - def setup_children(obj: t.Type["Tool"]) -> None: + def setup_children(obj: t.Type["Tool"], no_auth: bool = False) -> None: if obj.gid not in action_registry: action_registry[obj.gid] = {} for action in obj.actions(): action.tool = obj.name action.enum = f"{obj.enum}_{action.name.upper()}" + action.no_auth = no_auth if obj.requires is not None: action.requires = list(set(obj.requires + (action.requires or []))) obj._actions[action.enum] = action # pylint: disable=protected-access diff --git a/python/composio/tools/base/local.py b/python/composio/tools/base/local.py index 1b6c2276da8..32c555d2001 100644 --- a/python/composio/tools/base/local.py +++ b/python/composio/tools/base/local.py @@ -79,6 +79,7 @@ def __init__( # pylint: disable=self-cls-assignment,unused-argument ) ToolBuilder.setup_children( obj=cls, # type: ignore + no_auth=True, ) if autoload: diff --git a/python/tests/test_tools/test_base/test_abs.py b/python/tests/test_tools/test_base/test_abs.py index 69c5574139d..b5774f4ae13 100644 --- a/python/tests/test_tools/test_base/test_abs.py +++ b/python/tests/test_tools/test_base/test_abs.py @@ -146,11 +146,12 @@ def actions(cls) -> list: ToolBuilder.validate(obj=SomeTool, name="SomeTool", methods=("actions",)) ToolBuilder.set_metadata(obj=SomeTool) - ToolBuilder.setup_children(obj=SomeTool) + ToolBuilder.setup_children(obj=SomeTool, no_auth=True) SomeTool.register() assert SomeAction.enum == "SOME_TOOL_SOME_ACTION" + assert SomeAction.no_auth is True assert isinstance(tool_registry["local"][SomeTool.enum], SomeTool) assert action_registry["local"][SomeAction.enum] is SomeAction From be6aa1f3317c2de46f0384aee7a58efb7d069ccd Mon Sep 17 00:00:00 2001 From: Prathit <67639393+Prat011@users.noreply.github.com> Date: Wed, 1 Jan 2025 21:01:23 +0530 Subject: [PATCH 07/14] feat: js agents (#1117) --- js/examples/chat-with-sheets/.gitignore | 41 + js/examples/chat-with-sheets/README.md | 40 + .../chat-with-sheets/app/api/chat/route.ts | 102 + js/examples/chat-with-sheets/app/layout.tsx | 16 + js/examples/chat-with-sheets/app/page.tsx | 138 + js/examples/chat-with-sheets/components.json | 21 + .../chat-with-sheets/components/ui/button.tsx | 57 + .../chat-with-sheets/components/ui/card.tsx | 76 + .../chat-with-sheets/components/ui/input.tsx | 22 + .../components/ui/scroll-area.tsx | 48 + js/examples/chat-with-sheets/next.config.ts | 8 + .../chat-with-sheets/package-lock.json | 5451 +++++++++++++++++ js/examples/chat-with-sheets/package.json | 34 + .../chat-with-sheets/postcss.config.js | 6 + .../chat-with-sheets/postcss.config.mjs | 8 + .../chat-with-sheets/public/favicon.ico | Bin 0 -> 25931 bytes js/examples/chat-with-sheets/public/file.svg | 1 + js/examples/chat-with-sheets/public/globe.svg | 1 + js/examples/chat-with-sheets/public/next.svg | 1 + .../chat-with-sheets/public/vercel.svg | 1 + .../chat-with-sheets/public/window.svg | 1 + .../chat-with-sheets/styles/globals.css | 72 + .../chat-with-sheets/tailwind.config.ts | 63 + js/examples/chat-with-sheets/tsconfig.json | 40 + js/examples/reddit-research/demo.mjs | 2 +- js/examples/reddit-research/package-lock.json | 25 +- js/examples/reddit-research/package.json | 2 +- .../langgraph/.env.example | 3 + .../langgraph/main.py | 75 + .../langgraph/readme.md | 29 + .../langgraph/requirements.txt | 5 + .../langgraph/setup.sh | 45 + .../llama_index/.env.example | 3 + .../llama_index/main.py | 44 + .../llama_index/readme.md | 29 + .../llama_index/requirements.txt | 3 + .../llama_index/setup.sh | 45 + .../langgraph/.env.example | 3 + .../langgraph/main.py | 75 + .../langgraph/readme.md | 29 + .../langgraph/requirements.txt | 5 + .../langgraph/setup.sh | 45 + .../llama_index/.env.example | 3 + .../llama_index/main.py | 44 + .../llama_index/readme.md | 29 + .../llama_index/requirements.txt | 3 + .../llama_index/setup.sh | 45 + 47 files changed, 6832 insertions(+), 7 deletions(-) create mode 100644 js/examples/chat-with-sheets/.gitignore create mode 100644 js/examples/chat-with-sheets/README.md create mode 100644 js/examples/chat-with-sheets/app/api/chat/route.ts create mode 100644 js/examples/chat-with-sheets/app/layout.tsx create mode 100644 js/examples/chat-with-sheets/app/page.tsx create mode 100644 js/examples/chat-with-sheets/components.json create mode 100644 js/examples/chat-with-sheets/components/ui/button.tsx create mode 100644 js/examples/chat-with-sheets/components/ui/card.tsx create mode 100644 js/examples/chat-with-sheets/components/ui/input.tsx create mode 100644 js/examples/chat-with-sheets/components/ui/scroll-area.tsx create mode 100644 js/examples/chat-with-sheets/next.config.ts create mode 100644 js/examples/chat-with-sheets/package-lock.json create mode 100644 js/examples/chat-with-sheets/package.json create mode 100644 js/examples/chat-with-sheets/postcss.config.js create mode 100644 js/examples/chat-with-sheets/postcss.config.mjs create mode 100644 js/examples/chat-with-sheets/public/favicon.ico create mode 100644 js/examples/chat-with-sheets/public/file.svg create mode 100644 js/examples/chat-with-sheets/public/globe.svg create mode 100644 js/examples/chat-with-sheets/public/next.svg create mode 100644 js/examples/chat-with-sheets/public/vercel.svg create mode 100644 js/examples/chat-with-sheets/public/window.svg create mode 100644 js/examples/chat-with-sheets/styles/globals.css create mode 100644 js/examples/chat-with-sheets/tailwind.config.ts create mode 100644 js/examples/chat-with-sheets/tsconfig.json create mode 100644 python/examples/quickstarters/transcript_insight_generator/langgraph/.env.example create mode 100644 python/examples/quickstarters/transcript_insight_generator/langgraph/main.py create mode 100644 python/examples/quickstarters/transcript_insight_generator/langgraph/readme.md create mode 100644 python/examples/quickstarters/transcript_insight_generator/langgraph/requirements.txt create mode 100644 python/examples/quickstarters/transcript_insight_generator/langgraph/setup.sh create mode 100644 python/examples/quickstarters/transcript_insight_generator/llama_index/.env.example create mode 100644 python/examples/quickstarters/transcript_insight_generator/llama_index/main.py create mode 100644 python/examples/quickstarters/transcript_insight_generator/llama_index/readme.md create mode 100644 python/examples/quickstarters/transcript_insight_generator/llama_index/requirements.txt create mode 100644 python/examples/quickstarters/transcript_insight_generator/llama_index/setup.sh create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/langgraph/.env.example create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/langgraph/main.py create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/langgraph/readme.md create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/langgraph/requirements.txt create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/langgraph/setup.sh create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/llama_index/.env.example create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/llama_index/main.py create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/llama_index/readme.md create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/llama_index/requirements.txt create mode 100644 python/examples/quickstarters/youtube_slack_summary_agent/llama_index/setup.sh diff --git a/js/examples/chat-with-sheets/.gitignore b/js/examples/chat-with-sheets/.gitignore new file mode 100644 index 00000000000..5ef6a520780 --- /dev/null +++ b/js/examples/chat-with-sheets/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/js/examples/chat-with-sheets/README.md b/js/examples/chat-with-sheets/README.md new file mode 100644 index 00000000000..ef0e47e31fa --- /dev/null +++ b/js/examples/chat-with-sheets/README.md @@ -0,0 +1,40 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/pages/api-reference/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/pages/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn-pages-router) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/pages/building-your-application/deploying) for more details. diff --git a/js/examples/chat-with-sheets/app/api/chat/route.ts b/js/examples/chat-with-sheets/app/api/chat/route.ts new file mode 100644 index 00000000000..417ebf1d885 --- /dev/null +++ b/js/examples/chat-with-sheets/app/api/chat/route.ts @@ -0,0 +1,102 @@ +import { generateText } from "ai"; +import { openai } from "@ai-sdk/openai"; +import { VercelAIToolSet } from 'composio-core'; +import { NextResponse } from "next/server"; + +export async function POST(req: Request) { + try { + const { messages } = await req.json(); + let finalResult; + + // Setup toolset + const toolset = new VercelAIToolSet({ + apiKey: process.env.COMPOSIO_API_KEY, + }); + + async function setupUserConnectionIfNotExists(entityId: string | undefined) { + const entity = await toolset.client.getEntity(entityId); + const connection = await entity.getConnection({app: "googlesheets"}); + + if (!connection) { + // If this entity/user hasn't already connected the account + const connection = await entity.initiateConnection({appName: "googlesheets"}); + console.log("Log in via: ", connection.redirectUrl); + return connection.waitUntilActive(60); + } + + return connection; + } + + async function executeAgent(entityName: string | undefined) { + // setup entity + const entity = await toolset.client.getEntity(entityName); + await setupUserConnectionIfNotExists(entity.id); + const spreadsheet_id = '1P9vE1IAZbI950cye58I6E4A3Uu8G-rcA4JAm52Pxnsw'; + // get tools based on actions + const tools = await toolset.getTools({ + actions: ["GOOGLESHEETS_BATCH_GET", + "GOOGLESHEETS_BATCH_UPDATE", + "GOOGLESHEETS_GET_SPREADSHEET_INFO", + "GOOGLESHEETS_CLEAR_VALUES", + "GOOGLESHEETS_CREATE_GOOGLE_SHEET1", + "TAVILY_TAVILY_SEARCH", + "CODEINTERPRETER_UPLOAD_FILE_CMD", + "CODEINTERPRETER_GET_FILE_CMD", + "CODEINTERPRETER_EXECUTE_CODE", + "CODEINTERPRETER_RUN_TERMINAL_CMD" + ], + }); + + // Store both the AI response and tool execution result + const aiResponse = await generateText({ + model: openai("gpt-4o"), + tools, + toolChoice: "auto", + system:`You are a sheets assistant. You have access to the user's google sheets and you can perform actions on it using the tools you have. Introduce yourself as a sheets agent. This is the id you need to perform actions on: ${spreadsheet_id}`, + messages: messages, + }); + + let finalResult = null; + if (aiResponse.toolCalls && aiResponse.toolCalls.length > 0) { + finalResult = await toolset.executeToolCall( + { + name: aiResponse.toolCalls[0].toolName, + arguments: aiResponse.toolCalls[0].args + }, + entity.id + ); + console.log(finalResult); + } + console.log(aiResponse); + + const { text } = await generateText({ + model: openai('gpt-4o'), + prompt: finalResult + ? `Given the following user request: "${messages[messages.length - 1].content}", here's what happened: ${aiResponse.text} and the result was: ${finalResult}. Reveal the result of the tool call without markdown. This is the spreadsheet id that you need to use the actions on: ${spreadsheet_id}` + : `Print this same text, without adding any other text or sentences before or after: ${aiResponse.text}`, + }); + + + return { + aitext: text, + aiResponse: aiResponse.text, + toolResult: finalResult + }; + } + + const result = await executeAgent("default"); + + // Return a structured response with both results + return NextResponse.json({ + role: 'assistant', + content: `${result.aitext}` + }); + + } catch (error) { + console.error('Error:', error); + return NextResponse.json({ + role: 'assistant', + content: 'Sorry, there was an error processing your request.' + }, { status: 500 }); + } +} diff --git a/js/examples/chat-with-sheets/app/layout.tsx b/js/examples/chat-with-sheets/app/layout.tsx new file mode 100644 index 00000000000..a14e64fcd5e --- /dev/null +++ b/js/examples/chat-with-sheets/app/layout.tsx @@ -0,0 +1,16 @@ +export const metadata = { + title: 'Next.js', + description: 'Generated by Next.js', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} diff --git a/js/examples/chat-with-sheets/app/page.tsx b/js/examples/chat-with-sheets/app/page.tsx new file mode 100644 index 00000000000..3a616552f83 --- /dev/null +++ b/js/examples/chat-with-sheets/app/page.tsx @@ -0,0 +1,138 @@ +'use client' +import React, { useState } from 'react'; +import { Send, Bot, User } from 'lucide-react'; +import "../styles/globals.css"; + +export default function ChatPage() { + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const handleSubmit = async (e) => { + e.preventDefault(); + if (!input.trim()) return; + + const userMessage = { role: 'user', content: input }; + setMessages(prev => [...prev, userMessage]); + setInput(''); + setIsLoading(true); + + try { + const response = await fetch('/api/chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + messages: [...messages, userMessage], + }), + }); + + if (!response.ok) throw new Error('Failed to fetch'); + + const data = await response.json(); + setMessages(prev => [...prev, data]); + } catch (error) { + console.error('Error:', error); + setMessages(prev => [...prev, { + role: 'assistant', + content: 'Sorry, there was an error processing your request.' + }]); + } finally { + setIsLoading(false); + } + }; + + const formatContent = (content) => { + // Split content into AI response and execution result if it contains both + const parts = content.split('\n\nExecution Result: '); + if (parts.length === 2) { + try { + const executionResult = JSON.parse(parts[1]); + return ( +
+
{parts[0]}
+
+
Execution Result:
+
+                {JSON.stringify(executionResult, null, 2)}
+              
+
+
+ ); + } catch (e) { + return content; + } + } + return content; + }; + + return ( +
+
+
+

Composio Google Sheets Agent

+
+ +
+ {messages.map((message, index) => ( +
+ {message.role === 'assistant' && ( +
+ +
+ )} + +
+ {message.role === 'assistant' + ? formatContent(message.content) + : message.content + } +
+ + {message.role === 'user' && ( +
+ +
+ )} +
+ ))} +
+ +
+
+ setInput(e.target.value)} + placeholder="Type your message..." + className="flex-1 px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" + /> + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/js/examples/chat-with-sheets/components.json b/js/examples/chat-with-sheets/components.json new file mode 100644 index 00000000000..34db7d57e30 --- /dev/null +++ b/js/examples/chat-with-sheets/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/js/examples/chat-with-sheets/components/ui/button.tsx b/js/examples/chat-with-sheets/components/ui/button.tsx new file mode 100644 index 00000000000..65d4fcd9ca7 --- /dev/null +++ b/js/examples/chat-with-sheets/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/js/examples/chat-with-sheets/components/ui/card.tsx b/js/examples/chat-with-sheets/components/ui/card.tsx new file mode 100644 index 00000000000..cabfbfc59d9 --- /dev/null +++ b/js/examples/chat-with-sheets/components/ui/card.tsx @@ -0,0 +1,76 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/js/examples/chat-with-sheets/components/ui/input.tsx b/js/examples/chat-with-sheets/components/ui/input.tsx new file mode 100644 index 00000000000..69b64fb2455 --- /dev/null +++ b/js/examples/chat-with-sheets/components/ui/input.tsx @@ -0,0 +1,22 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef>( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/js/examples/chat-with-sheets/components/ui/scroll-area.tsx b/js/examples/chat-with-sheets/components/ui/scroll-area.tsx new file mode 100644 index 00000000000..0b4a48d87fa --- /dev/null +++ b/js/examples/chat-with-sheets/components/ui/scroll-area.tsx @@ -0,0 +1,48 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/js/examples/chat-with-sheets/next.config.ts b/js/examples/chat-with-sheets/next.config.ts new file mode 100644 index 00000000000..39151635971 --- /dev/null +++ b/js/examples/chat-with-sheets/next.config.ts @@ -0,0 +1,8 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ + reactStrictMode: true, +}; + +export default nextConfig; diff --git a/js/examples/chat-with-sheets/package-lock.json b/js/examples/chat-with-sheets/package-lock.json new file mode 100644 index 00000000000..9e50b916f66 --- /dev/null +++ b/js/examples/chat-with-sheets/package-lock.json @@ -0,0 +1,5451 @@ +{ + "name": "chat-with-sheets", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chat-with-sheets", + "version": "0.1.0", + "dependencies": { + "@radix-ui/react-scroll-area": "^1.2.2", + "@radix-ui/react-slot": "^1.1.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "composio-core": "^0.5.0-rc.2", + "lucide-react": "^0.469.0", + "next": "15.1.3", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@shadcn/ui": "^0.0.4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-0.0.36.tgz", + "integrity": "sha512-6IcvR35UMuuQEQPkVjzUtqDAuz6vy+PMCEL0PAS2ufHXdPPm81OTKVetqjgOPjebsikhVP0soK1pKPEe2cztAQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.12", + "@ai-sdk/provider-utils": "1.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.12.tgz", + "integrity": "sha512-oOwPQD8i2Ynpn22cur4sk26FW3mSy6t6/X/K1Ay2yGBKYiSpRyLfObhOrZEGsXDx+3euKy4nEZ193R36NM+tpQ==", + "peer": true, + "dependencies": { + "json-schema": "0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.2.tgz", + "integrity": "sha512-57f6O4OFVNEpI8Z8o+K40tIB3YQiTw+VCql/qrAO9Utq7Ti1o6+X9tvm177DlZJL7ft0Rwzvgy48S9YhrEKgmA==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.12", + "eventsource-parser": "1.1.2", + "nanoid": "3.3.6", + "secure-json-parse": "2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/provider-utils/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/@ai-sdk/react": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-0.0.70.tgz", + "integrity": "sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider-utils": "1.0.22", + "@ai-sdk/ui-utils": "0.0.50", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", + "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "peer": true, + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", + "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "eventsource-parser": "^1.1.2", + "nanoid": "^3.3.7", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/solid": { + "version": "0.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/solid/-/solid-0.0.54.tgz", + "integrity": "sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider-utils": "1.0.22", + "@ai-sdk/ui-utils": "0.0.50" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "solid-js": "^1.7.7" + }, + "peerDependenciesMeta": { + "solid-js": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/solid/node_modules/@ai-sdk/provider": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", + "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "peer": true, + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/solid/node_modules/@ai-sdk/provider-utils": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", + "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "eventsource-parser": "^1.1.2", + "nanoid": "^3.3.7", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/svelte": { + "version": "0.0.57", + "resolved": "https://registry.npmjs.org/@ai-sdk/svelte/-/svelte-0.0.57.tgz", + "integrity": "sha512-SyF9ItIR9ALP9yDNAD+2/5Vl1IT6kchgyDH8xkmhysfJI6WrvJbtO1wdQ0nylvPLcsPoYu+cAlz1krU4lFHcYw==", + "peer": true, + "dependencies": { + "@ai-sdk/provider-utils": "1.0.22", + "@ai-sdk/ui-utils": "0.0.50", + "sswr": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/svelte/node_modules/@ai-sdk/provider": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", + "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "peer": true, + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/svelte/node_modules/@ai-sdk/provider-utils": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", + "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "eventsource-parser": "^1.1.2", + "nanoid": "^3.3.7", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/ui-utils": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-0.0.50.tgz", + "integrity": "sha512-Z5QYJVW+5XpSaJ4jYCCAVG7zIAuKOOdikhgpksneNmKvx61ACFaf98pmOd+xnjahl0pIlc/QIe6O4yVaJ1sEaw==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "@ai-sdk/provider-utils": "1.0.22", + "json-schema": "^0.4.0", + "secure-json-parse": "^2.7.0", + "zod-to-json-schema": "^3.23.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", + "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "peer": true, + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider-utils": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", + "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "eventsource-parser": "^1.1.2", + "nanoid": "^3.3.7", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/vue": { + "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@ai-sdk/vue/-/vue-0.0.59.tgz", + "integrity": "sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw==", + "peer": true, + "dependencies": { + "@ai-sdk/provider-utils": "1.0.22", + "@ai-sdk/ui-utils": "0.0.50", + "swrv": "^1.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vue": "^3.3.4" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/vue/node_modules/@ai-sdk/provider": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", + "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "peer": true, + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/vue/node_modules/@ai-sdk/provider-utils": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", + "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "eventsource-parser": "^1.1.2", + "nanoid": "^3.3.7", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "peer": true, + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20241224.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20241224.0.tgz", + "integrity": "sha512-1ZmFc8qqM7S/HUGmLplc4P8n8DoMqiJmc47r9Lr7VbuaotoqCXVljz09w1V1mc4K3pbFPgvqSy4XYStZ08HrlQ==", + "peer": true + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@hey-api/client-axios": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.2.12.tgz", + "integrity": "sha512-lBehVhbnhvm41cFguZuy1FO+4x8NO3Qy/ooL0Jw4bdqTu21n7DmZMPsXEF0gL7/gNdTt4QkJGwaojy+8ExtE8w==", + "funding": { + "url": "https://github.com/sponsors/hey-api" + }, + "peerDependencies": { + "axios": ">= 1.0.0 < 2" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", + "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@inquirer/core/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", + "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", + "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", + "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", + "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", + "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.5.0.tgz", + "integrity": "sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==", + "dependencies": { + "@inquirer/checkbox": "^2.5.0", + "@inquirer/confirm": "^3.2.0", + "@inquirer/editor": "^2.2.0", + "@inquirer/expand": "^2.3.0", + "@inquirer/input": "^2.3.0", + "@inquirer/number": "^1.1.0", + "@inquirer/password": "^2.2.0", + "@inquirer/rawlist": "^2.3.0", + "@inquirer/search": "^1.1.0", + "@inquirer/select": "^2.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", + "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", + "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", + "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@langchain/core": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.36.tgz", + "integrity": "sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg==", + "peer": true, + "dependencies": { + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.1.56-rc.1", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@langchain/openai": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.11.tgz", + "integrity": "sha512-Pu8+WfJojCgSf0bAsXb4AjqvcDyAWyoEB1AoCRNACgEnBWZuitz3hLwCo9I+6hAbeg3QJ37g82yKcmvKAg1feg==", + "peer": true, + "dependencies": { + "@langchain/core": ">=0.2.26 <0.3.0", + "js-tiktoken": "^1.0.12", + "openai": "^4.57.3", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.0.3.tgz", + "integrity": "sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==", + "peer": true, + "dependencies": { + "@langchain/core": ">0.2.0 <0.3.0", + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@next/env": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz", + "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz", + "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz", + "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz", + "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz", + "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz", + "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz", + "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz", + "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz", + "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.2.tgz", + "integrity": "sha512-EFI1N/S3YxZEW/lJ/H1jY3njlvTd8tBmgKEn4GHi51+aMm94i6NmAJstsm5cu3yJwYqYc93gpCPm21FeAbFk6g==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@shadcn/ui": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@shadcn/ui/-/ui-0.0.4.tgz", + "integrity": "sha512-0dtu/5ApsOZ24qgaZwtif8jVwqol7a4m1x5AxPuM1k5wxhqU7t/qEfBGtaSki1R8VlbTQfCj5PAlO45NKCa7Gg==", + "dev": true, + "dependencies": { + "chalk": "5.2.0", + "commander": "^10.0.0", + "execa": "^7.0.0", + "fs-extra": "^11.1.0", + "node-fetch": "^3.3.0", + "ora": "^6.1.2", + "prompts": "^2.4.2", + "zod": "^3.20.2" + }, + "bin": { + "ui": "dist/index.js" + } + }, + "node_modules/@shadcn/ui/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@shadcn/ui/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@shadcn/ui/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/diff-match-patch": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", + "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==", + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "peer": true + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "peer": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/react": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", + "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", + "devOptional": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz", + "integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==", + "devOptional": true, + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "peer": true + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "peer": true + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "peer": true, + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "peer": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "peer": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", + "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", + "peer": true, + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "peer": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ai": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/ai/-/ai-3.4.33.tgz", + "integrity": "sha512-plBlrVZKwPoRTmM8+D1sJac9Bq8eaa2jiZlHLZIWekKWI1yMWYZvCCEezY9ASPwRhULYDJB2VhKOBUUeg3S5JQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "@ai-sdk/provider-utils": "1.0.22", + "@ai-sdk/react": "0.0.70", + "@ai-sdk/solid": "0.0.54", + "@ai-sdk/svelte": "0.0.57", + "@ai-sdk/ui-utils": "0.0.50", + "@ai-sdk/vue": "0.0.59", + "@opentelemetry/api": "1.9.0", + "eventsource-parser": "1.1.2", + "json-schema": "^0.4.0", + "jsondiffpatch": "0.6.0", + "secure-json-parse": "^2.7.0", + "zod-to-json-schema": "^3.23.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "openai": "^4.42.0", + "react": "^18 || ^19 || ^19.0.0-rc", + "sswr": "^2.1.0", + "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0", + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + }, + "react": { + "optional": true + }, + "sswr": { + "optional": true + }, + "svelte": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/ai/node_modules/@ai-sdk/provider": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", + "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "peer": true, + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai/node_modules/@ai-sdk/provider-utils": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", + "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "peer": true, + "dependencies": { + "@ai-sdk/provider": "0.0.26", + "eventsource-parser": "^1.1.2", + "nanoid": "^3.3.7", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "peer": true + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "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" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-progress/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-progress/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/composio-core": { + "version": "0.5.0-rc.2", + "resolved": "https://registry.npmjs.org/composio-core/-/composio-core-0.5.0-rc.2.tgz", + "integrity": "sha512-CzWCrOF2BwxCMSuNv56vPAgTAhvvu31VUo2auZK5kLUprgNxViUsVX3OkOL1ngDoQW+GxaAjmhiPQhvnAxAcxw==", + "dependencies": { + "@hey-api/client-axios": "^0.2.3", + "axios": "^1.7.2", + "chalk": "^4", + "cli-progress": "^3.12.0", + "commander": "^12.1.0", + "inquirer": "^10.2.2", + "open": "^8.4.0", + "pusher-js": "8.4.0-rc2", + "uuid": "^10.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.2" + }, + "bin": { + "composio": "cli/index", + "composio-js": "cli/index" + }, + "peerDependencies": { + "@ai-sdk/openai": "^0.0.36", + "@cloudflare/workers-types": "^4.20240718.0", + "@langchain/core": "^0.2.18", + "@langchain/openai": "^0.2.5", + "ai": "^3.2.22", + "langchain": "^0.2.11", + "openai": "^4.50.0" + } + }, + "node_modules/composio-core/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "peer": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.76", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", + "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esm-env": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz", + "integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==", + "peer": true + }, + "node_modules/esrap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.3.2.tgz", + "integrity": "sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "peer": true + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "peer": true + }, + "node_modules/eventsource-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", + "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", + "peer": true, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/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==", + "dev": true + }, + "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==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fetch-blob/node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "peer": true + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "peer": true, + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "peer": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-10.2.2.tgz", + "integrity": "sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/prompts": "^5.5.0", + "@inquirer/type": "^1.5.3", + "@types/mute-stream": "^0.0.4", + "ansi-escapes": "^4.3.2", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "optional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.16.tgz", + "integrity": "sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==", + "peer": true, + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "peer": true + }, + "node_modules/jsondiffpatch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", + "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", + "peer": true, + "dependencies": { + "@types/diff-match-patch": "^1.0.36", + "chalk": "^5.3.0", + "diff-match-patch": "^1.0.5" + }, + "bin": { + "jsondiffpatch": "bin/jsondiffpatch.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/jsondiffpatch/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/langchain": { + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.2.20.tgz", + "integrity": "sha512-tbels6Rr524iMM3VOQ4aTGnEOOjAA1BQuBR8u/8gJ2yT48lMtIQRAN32Y4KVjKK+hEWxHHlmLBrtgLpTphFjNA==", + "peer": true, + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/openai": ">=0.1.0 <0.3.0", + "@langchain/textsplitters": "~0.0.0", + "binary-extensions": "^2.2.0", + "js-tiktoken": "^1.0.12", + "js-yaml": "^4.1.0", + "jsonpointer": "^5.0.1", + "langsmith": "^0.1.56-rc.1", + "openapi-types": "^12.1.3", + "p-retry": "4", + "uuid": "^10.0.0", + "yaml": "^2.2.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "*", + "@aws-sdk/client-sagemaker-runtime": "*", + "@aws-sdk/client-sfn": "*", + "@aws-sdk/credential-provider-node": "*", + "@azure/storage-blob": "*", + "@browserbasehq/sdk": "*", + "@gomomento/sdk": "*", + "@gomomento/sdk-core": "*", + "@gomomento/sdk-web": "^1.51.1", + "@langchain/anthropic": "*", + "@langchain/aws": "*", + "@langchain/cohere": "*", + "@langchain/google-genai": "*", + "@langchain/google-vertexai": "*", + "@langchain/groq": "*", + "@langchain/mistralai": "*", + "@langchain/ollama": "*", + "@mendable/firecrawl-js": "*", + "@notionhq/client": "*", + "@pinecone-database/pinecone": "*", + "@supabase/supabase-js": "*", + "@vercel/kv": "*", + "@xata.io/client": "*", + "apify-client": "*", + "assemblyai": "*", + "axios": "*", + "cheerio": "*", + "chromadb": "*", + "convex": "*", + "couchbase": "*", + "d3-dsv": "*", + "epub2": "*", + "fast-xml-parser": "*", + "handlebars": "^4.7.8", + "html-to-text": "*", + "ignore": "*", + "ioredis": "*", + "jsdom": "*", + "mammoth": "*", + "mongodb": "*", + "node-llama-cpp": "*", + "notion-to-md": "*", + "officeparser": "*", + "pdf-parse": "*", + "peggy": "^3.0.2", + "playwright": "*", + "puppeteer": "*", + "pyodide": ">=0.24.1 <0.27.0", + "redis": "*", + "sonix-speech-recognition": "*", + "srt-parser-2": "*", + "typeorm": "*", + "weaviate-ts-client": "*", + "web-auth-library": "*", + "ws": "*", + "youtube-transcript": "*", + "youtubei.js": "*" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-sagemaker-runtime": { + "optional": true + }, + "@aws-sdk/client-sfn": { + "optional": true + }, + "@aws-sdk/credential-provider-node": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@browserbasehq/sdk": { + "optional": true + }, + "@gomomento/sdk": { + "optional": true + }, + "@gomomento/sdk-core": { + "optional": true + }, + "@gomomento/sdk-web": { + "optional": true + }, + "@langchain/anthropic": { + "optional": true + }, + "@langchain/aws": { + "optional": true + }, + "@langchain/cohere": { + "optional": true + }, + "@langchain/google-genai": { + "optional": true + }, + "@langchain/google-vertexai": { + "optional": true + }, + "@langchain/groq": { + "optional": true + }, + "@langchain/mistralai": { + "optional": true + }, + "@langchain/ollama": { + "optional": true + }, + "@mendable/firecrawl-js": { + "optional": true + }, + "@notionhq/client": { + "optional": true + }, + "@pinecone-database/pinecone": { + "optional": true + }, + "@supabase/supabase-js": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "apify-client": { + "optional": true + }, + "assemblyai": { + "optional": true + }, + "axios": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "chromadb": { + "optional": true + }, + "convex": { + "optional": true + }, + "couchbase": { + "optional": true + }, + "d3-dsv": { + "optional": true + }, + "epub2": { + "optional": true + }, + "faiss-node": { + "optional": true + }, + "fast-xml-parser": { + "optional": true + }, + "handlebars": { + "optional": true + }, + "html-to-text": { + "optional": true + }, + "ignore": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "mammoth": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "node-llama-cpp": { + "optional": true + }, + "notion-to-md": { + "optional": true + }, + "officeparser": { + "optional": true + }, + "pdf-parse": { + "optional": true + }, + "peggy": { + "optional": true + }, + "playwright": { + "optional": true + }, + "puppeteer": { + "optional": true + }, + "pyodide": { + "optional": true + }, + "redis": { + "optional": true + }, + "sonix-speech-recognition": { + "optional": true + }, + "srt-parser-2": { + "optional": true + }, + "typeorm": { + "optional": true + }, + "weaviate-ts-client": { + "optional": true + }, + "web-auth-library": { + "optional": true + }, + "ws": { + "optional": true + }, + "youtube-transcript": { + "optional": true + }, + "youtubei.js": { + "optional": true + } + } + }, + "node_modules/langsmith": { + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.68.tgz", + "integrity": "sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ==", + "peer": true, + "dependencies": { + "@types/uuid": "^10.0.0", + "commander": "^10.0.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "openai": "*" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + } + } + }, + "node_modules/langsmith/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "peer": true + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/lucide-react": { + "version": "0.469.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz", + "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "peer": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz", + "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==", + "dependencies": { + "@next/env": "15.1.3", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.1.3", + "@next/swc-darwin-x64": "15.1.3", + "@next/swc-linux-arm64-gnu": "15.1.3", + "@next/swc-linux-arm64-musl": "15.1.3", + "@next/swc-linux-x64-gnu": "15.1.3", + "@next/swc-linux-x64-musl": "15.1.3", + "@next/swc-win32-arm64-msvc": "15.1.3", + "@next/swc-win32-x64-msvc": "15.1.3", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openai": { + "version": "4.77.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.77.0.tgz", + "integrity": "sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==", + "peer": true, + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.68", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz", + "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==", + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "peer": true + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "peer": true + }, + "node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "peer": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "peer": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pusher-js": { + "version": "8.4.0-rc2", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0-rc2.tgz", + "integrity": "sha512-d87GjOEEl9QgO5BWmViSqW0LOzPvybvX6WA9zLUstNdB57jVJuR27zHkRnrav2a3+zAMlHbP2Og8wug+rG8T+g==", + "dependencies": { + "tweetnacl": "^1.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/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==", + "dev": true + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "peer": true + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/source-map-js": { + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sswr": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sswr/-/sswr-2.1.0.tgz", + "integrity": "sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==", + "peer": true, + "dependencies": { + "swrev": "^4.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0" + } + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "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, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.16.0.tgz", + "integrity": "sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^1.3.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/swr": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz", + "integrity": "sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==", + "peer": true, + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/swrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/swrev/-/swrev-4.0.0.tgz", + "integrity": "sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==", + "peer": true + }, + "node_modules/swrv": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/swrv/-/swrv-1.0.4.tgz", + "integrity": "sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==", + "peer": true, + "peerDependencies": { + "vue": ">=3.2.26 < 4" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "peer": true + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "peer": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "peer": true + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", + "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/js/examples/chat-with-sheets/package.json b/js/examples/chat-with-sheets/package.json new file mode 100644 index 00000000000..480a89dcef6 --- /dev/null +++ b/js/examples/chat-with-sheets/package.json @@ -0,0 +1,34 @@ +{ + "name": "chat-with-sheets", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-scroll-area": "^1.2.2", + "@radix-ui/react-slot": "^1.1.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "composio-core": "^0.5.0-rc.2", + "lucide-react": "^0.469.0", + "next": "15.1.3", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@shadcn/ui": "^0.0.4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5" + } +} diff --git a/js/examples/chat-with-sheets/postcss.config.js b/js/examples/chat-with-sheets/postcss.config.js new file mode 100644 index 00000000000..33ad091d26d --- /dev/null +++ b/js/examples/chat-with-sheets/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/js/examples/chat-with-sheets/postcss.config.mjs b/js/examples/chat-with-sheets/postcss.config.mjs new file mode 100644 index 00000000000..1a69fd2a450 --- /dev/null +++ b/js/examples/chat-with-sheets/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/js/examples/chat-with-sheets/public/favicon.ico b/js/examples/chat-with-sheets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/js/examples/chat-with-sheets/public/file.svg b/js/examples/chat-with-sheets/public/file.svg new file mode 100644 index 00000000000..004145cddf3 --- /dev/null +++ b/js/examples/chat-with-sheets/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/examples/chat-with-sheets/public/globe.svg b/js/examples/chat-with-sheets/public/globe.svg new file mode 100644 index 00000000000..567f17b0d7c --- /dev/null +++ b/js/examples/chat-with-sheets/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/examples/chat-with-sheets/public/next.svg b/js/examples/chat-with-sheets/public/next.svg new file mode 100644 index 00000000000..5174b28c565 --- /dev/null +++ b/js/examples/chat-with-sheets/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/examples/chat-with-sheets/public/vercel.svg b/js/examples/chat-with-sheets/public/vercel.svg new file mode 100644 index 00000000000..77053960334 --- /dev/null +++ b/js/examples/chat-with-sheets/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/examples/chat-with-sheets/public/window.svg b/js/examples/chat-with-sheets/public/window.svg new file mode 100644 index 00000000000..b2b2a44f6eb --- /dev/null +++ b/js/examples/chat-with-sheets/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/examples/chat-with-sheets/styles/globals.css b/js/examples/chat-with-sheets/styles/globals.css new file mode 100644 index 00000000000..a23ac26b0e5 --- /dev/null +++ b/js/examples/chat-with-sheets/styles/globals.css @@ -0,0 +1,72 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: Arial, Helvetica, sans-serif; +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/js/examples/chat-with-sheets/tailwind.config.ts b/js/examples/chat-with-sheets/tailwind.config.ts new file mode 100644 index 00000000000..bd2d248f638 --- /dev/null +++ b/js/examples/chat-with-sheets/tailwind.config.ts @@ -0,0 +1,63 @@ +import type { Config } from 'tailwindcss' + +const config: Config = { + darkMode: ['class'], + content: [ + './components/**/*.{js,ts,jsx,tsx,mdx}', + './app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + } + } + } + }, + plugins: [require("tailwindcss-animate")], +} + +export default config \ No newline at end of file diff --git a/js/examples/chat-with-sheets/tsconfig.json b/js/examples/chat-with-sheets/tsconfig.json new file mode 100644 index 00000000000..786f9116e93 --- /dev/null +++ b/js/examples/chat-with-sheets/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": [ + "./*" + ] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "next-env.d.ts", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/js/examples/reddit-research/demo.mjs b/js/examples/reddit-research/demo.mjs index da4d3467c31..9252f402b11 100644 --- a/js/examples/reddit-research/demo.mjs +++ b/js/examples/reddit-research/demo.mjs @@ -31,7 +31,7 @@ async function setupUserConnectionIfNotExists(entityId) { async function executeAgent(entityName) { // Setup entity and ensure connection const entity = await toolset.client.getEntity(entityName); - await setupUserConnectionIfNotExists(entity.id); + //await setupUserConnectionIfNotExists(entity.id); // Retrieve tools for the specified app const tools = await toolset.getTools({ apps: [appName] }, entity.id); diff --git a/js/examples/reddit-research/package-lock.json b/js/examples/reddit-research/package-lock.json index bedc5dc385f..4e8abd92b60 100644 --- a/js/examples/reddit-research/package-lock.json +++ b/js/examples/reddit-research/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@ai-sdk/openai": "^0.0.36", "ai": "^3.2.24", - "composio-core": "latest", + "composio-core": "^0.4.8", "dotenv": "^16.4.5", "zod": "^3.23.8" } @@ -859,10 +859,12 @@ "license": "MIT" }, "node_modules/composio-core": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/composio-core/-/composio-core-0.4.5.tgz", - "integrity": "sha512-kRfedO+ZtOV8lbUCZ8Mpxa/zWXYEokAX+AF4orOI2vYsnmtwDwRrfkl6tSBNEamw9RBJyjGiWVdVcxI91dBfAA==", - "license": "ISC", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/composio-core/-/composio-core-0.4.8.tgz", + "integrity": "sha512-XcC3zib6M7o+zgk5gCqE/BNXKqR0uyonOaaRNO4jKbIjArihKrk0MPXC5dF1V23GvsN+qA4OF0tFmQl8poOjTA==", + "dependencies": { + "pusher-js": "8.4.0-rc2" + }, "bin": { "composio": "dist/cli/index", "composio-js": "dist/cli/index" @@ -1083,6 +1085,14 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/pusher-js": { + "version": "8.4.0-rc2", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0-rc2.tgz", + "integrity": "sha512-d87GjOEEl9QgO5BWmViSqW0LOzPvybvX6WA9zLUstNdB57jVJuR27zHkRnrav2a3+zAMlHbP2Og8wug+rG8T+g==", + "dependencies": { + "tweetnacl": "^1.0.3" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -1189,6 +1199,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "node_modules/use-sync-external-store": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", diff --git a/js/examples/reddit-research/package.json b/js/examples/reddit-research/package.json index 69c522c4e24..14bdfb36983 100644 --- a/js/examples/reddit-research/package.json +++ b/js/examples/reddit-research/package.json @@ -12,7 +12,7 @@ "dependencies": { "@ai-sdk/openai": "^0.0.36", "ai": "^3.2.24", - "composio-core": "latest", + "composio-core": "^0.4.8", "dotenv": "^16.4.5", "zod": "^3.23.8" } diff --git a/python/examples/quickstarters/transcript_insight_generator/langgraph/.env.example b/python/examples/quickstarters/transcript_insight_generator/langgraph/.env.example new file mode 100644 index 00000000000..acc425c8c4a --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/langgraph/.env.example @@ -0,0 +1,3 @@ +OPENAI_API_KEY=KEY +COMPOSIO_API_KEY=KEY +GROQ_API_KEY=KEY \ No newline at end of file diff --git a/python/examples/quickstarters/transcript_insight_generator/langgraph/main.py b/python/examples/quickstarters/transcript_insight_generator/langgraph/main.py new file mode 100644 index 00000000000..76858cfc4ef --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/langgraph/main.py @@ -0,0 +1,75 @@ +from composio import Composio, ComposioToolSet +import os +from dotenv import load_dotenv +from langchain_groq import ChatGroq +from langchain_openai import ChatOpenAI +from langgraph.checkpoint.memory import MemorySaver +from typing import Annotated +from langchain_core.messages import BaseMessage +from langchain_community.document_loaders import YoutubeLoader +from typing_extensions import TypedDict +from composio_langgraph import Action, ComposioToolSet, App, Trigger +from langgraph.graph import StateGraph, START, END +from langgraph.graph.message import add_messages +from langgraph.prebuilt import ToolNode, tools_condition +load_dotenv() + +class State(TypedDict): + messages: Annotated[list, add_messages] + +graph_builder = StateGraph(State) + +toolset = ComposioToolSet() +tools = toolset.get_tools(apps=[App.SLACK]) + +llm = ChatOpenAI(model="gpt-4o") +#llm = ChatGroq(model='llama3.3-70b-versatile') +llm_with_tools = llm.bind_tools(tools) + +def chatbot(state: State): + return {"messages": [llm_with_tools.invoke(state["messages"])]} + +graph_builder.add_node("chatbot", chatbot) + +tool_node = ToolNode(tools=tools) +graph_builder.add_node("tools", tool_node) + +graph_builder.add_conditional_edges( + "chatbot", + tools_condition, +) +# Any time a tool is called, we return to the chatbot to decide the next step +graph_builder.add_edge("tools", "chatbot") +graph_builder.add_edge(START, "chatbot") +memory = MemorySaver() + +graph = graph_builder.compile(checkpointer=memory) + + +config = {"configurable": {"thread_id": "1"}, "recursion_limit": 50} +listener = toolset.create_trigger_listener() + +@listener.callback(filters={"trigger_name": Trigger.SLACK_RECEIVE_MESSAGE}) +def handle_callback_function(event): + try: + print(event) + payload= event.payload + print(payload) + link = payload['text'][1:-2] + channel_id = payload['channel'] + documents = YoutubeLoader.from_youtube_url(link, add_video_info=False).load() + transcript='' + for i in documents: + transcript+=i.page_content + print('channel id') + user_input = f"""Summarize this transcript:{str(transcript)} and send the summary on the slack channel:{channel_id}""" + # The config is the **second positional argument** to stream() or invoke()! + events = graph.invoke( + {"messages": [("user", user_input)]}, config, stream_mode="values" + ) + print(events) + except Exception as e: + print('Youtube link not found in message') + +print("Listening") +listener.wait_forever() \ No newline at end of file diff --git a/python/examples/quickstarters/transcript_insight_generator/langgraph/readme.md b/python/examples/quickstarters/transcript_insight_generator/langgraph/readme.md new file mode 100644 index 00000000000..6f75e464de5 --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/langgraph/readme.md @@ -0,0 +1,29 @@ +# Youtube Summary Agent + +This guide provides detailed steps to create an agent that leverages Composio, agentic framework Langgraph and ChatGPT to generate summary of Youtube videos and send it to you on slack. Ensure you have Python 3.8 or higher installed. + +## Steps to Run + +**Navigate to the Project Directory:** +Change to the directory where the `setup.sh`, `main.py`, `requirements.txt`, and `README.md` files are located. For example: +```sh +cd path/to/project/directory +``` + +### 1. Run the Setup File +Make the setup.sh Script Executable (if necessary): +On Linux or macOS, you might need to make the setup.sh script executable: +```shell +chmod +x setup.sh +``` +Execute the setup.sh script to set up the environment and install dependencies: +```shell +./setup.sh +``` +Now, fill in the `.env` file with your secrets. + +### 2. Run the Python Script +```shell +python cookbook/python-examples/quickstarters/transcript_insight_generator/langgraph/main.py +``` + diff --git a/python/examples/quickstarters/transcript_insight_generator/langgraph/requirements.txt b/python/examples/quickstarters/transcript_insight_generator/langgraph/requirements.txt new file mode 100644 index 00000000000..321a5b93c1e --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/langgraph/requirements.txt @@ -0,0 +1,5 @@ +composio-langgraph +langchain-openai +langchain-groq +langchain-community +python-dotenv \ No newline at end of file diff --git a/python/examples/quickstarters/transcript_insight_generator/langgraph/setup.sh b/python/examples/quickstarters/transcript_insight_generator/langgraph/setup.sh new file mode 100644 index 00000000000..2ccc5596cab --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/langgraph/setup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Create a virtual environment named sqlagent +echo "Creating virtual environment..." +python3 -m venv transcript + +# Activate the virtual environment +echo "Activating virtual environment..." +source transcript/bin/activate + +# Install libraries from requirements.txt +echo "Installing libraries from requirements.txt..." +pip install -r requirements.txt + +# Copy env backup to .env file +if [ -f ".env.example" ]; then + echo "Copying .env.example to .env..." + cp .env.example .env +else + echo "No .env.example file found. Creating a new .env file..." + touch .env +fi + +composio login + +composio add slack + +composio triggers enable slack_receive_message + +# Prompt the user to enter the OPENAI_API_KEY +read -p "Enter your OPENAI_API_KEY: " OPENAI_API_KEY + +# Update or add the OPENAI_API_KEY line +if grep -qE "^OPENAI_API_KEY" .env; then + sed -i.bak "s/^OPENAI_API_KEY.*/OPENAI_API_KEY = $OPENAI_API_KEY/" .env && rm .env.bak +else + echo "OPENAI_API_KEY = $OPENAI_API_KEY # add your openai key here" >> .env +fi + + +echo "OPENAI_API_KEY has been set in the .env file" + +echo "Please fill in the .env file with any other necessary environment variables." + +echo "Setup completed successfully!" diff --git a/python/examples/quickstarters/transcript_insight_generator/llama_index/.env.example b/python/examples/quickstarters/transcript_insight_generator/llama_index/.env.example new file mode 100644 index 00000000000..acc425c8c4a --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/llama_index/.env.example @@ -0,0 +1,3 @@ +OPENAI_API_KEY=KEY +COMPOSIO_API_KEY=KEY +GROQ_API_KEY=KEY \ No newline at end of file diff --git a/python/examples/quickstarters/transcript_insight_generator/llama_index/main.py b/python/examples/quickstarters/transcript_insight_generator/llama_index/main.py new file mode 100644 index 00000000000..a4e65e3c603 --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/llama_index/main.py @@ -0,0 +1,44 @@ +import os +import dotenv +from composio_llamaindex import App, ComposioToolSet, Action, Trigger +from llama_index.core.agent import FunctionCallingAgentWorker +from llama_index.core.llms import ChatMessage +from llama_index.llms.openai import OpenAI +from llama_index.readers.youtube_transcript import YoutubeTranscriptReader +loader = YoutubeTranscriptReader() +dotenv.load_dotenv() + +toolset = ComposioToolSet() +tools = toolset.get_tools(actions=[Action.SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL]) +listener = toolset.create_trigger_listener() + +@listener.callback(filters={"trigger_name": Trigger.SLACK_RECEIVE_MESSAGE}) +def handle_callback_function(event): + try: + print(event) + payload= event.payload + print(payload) + link = payload['text'][1:-2] + channel_id = payload['channel'] + print('channel id') + documents = loader.load_data( + ytlinks=[link]) + print(documents) + transcript = '' + for d in documents: + transcript+=d.text + print(transcript) + llm = OpenAI(model='gpt-4o') + summarized_text = llm.complete(f"Summarize this transcript: {transcript}") + toolset.execute_action( + Action.SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL, + {}, + text=f'message: {summarized_text}, channel: {channel_id}' + ) + print('Message sent') + except Exception as E: + print("No youtube link found") + + +print("Listening") +listener.wait_forever() diff --git a/python/examples/quickstarters/transcript_insight_generator/llama_index/readme.md b/python/examples/quickstarters/transcript_insight_generator/llama_index/readme.md new file mode 100644 index 00000000000..6ef1d24b349 --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/llama_index/readme.md @@ -0,0 +1,29 @@ +# Youtube Summary Agent + +This guide provides detailed steps to create an agent that leverages Composio, agentic framework LlamaIndex and ChatGPT to generate summary of Youtube videos and send it to you on slack. Ensure you have Python 3.8 or higher installed. + +## Steps to Run + +**Navigate to the Project Directory:** +Change to the directory where the `setup.sh`, `main.py`, `requirements.txt`, and `README.md` files are located. For example: +```sh +cd path/to/project/directory +``` + +### 1. Run the Setup File +Make the setup.sh Script Executable (if necessary): +On Linux or macOS, you might need to make the setup.sh script executable: +```shell +chmod +x setup.sh +``` +Execute the setup.sh script to set up the environment and install dependencies: +```shell +./setup.sh +``` +Now, fill in the `.env` file with your secrets. + +### 2. Run the Python Script +```shell +python cookbook/python-examples/quickstarters/transcript_insight_generator/llama_index/main.py +``` + diff --git a/python/examples/quickstarters/transcript_insight_generator/llama_index/requirements.txt b/python/examples/quickstarters/transcript_insight_generator/llama_index/requirements.txt new file mode 100644 index 00000000000..53afc70fd31 --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/llama_index/requirements.txt @@ -0,0 +1,3 @@ +composio-llamaindex +llama-index-readers-youtube-transcript +python-dotenv \ No newline at end of file diff --git a/python/examples/quickstarters/transcript_insight_generator/llama_index/setup.sh b/python/examples/quickstarters/transcript_insight_generator/llama_index/setup.sh new file mode 100644 index 00000000000..2ccc5596cab --- /dev/null +++ b/python/examples/quickstarters/transcript_insight_generator/llama_index/setup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Create a virtual environment named sqlagent +echo "Creating virtual environment..." +python3 -m venv transcript + +# Activate the virtual environment +echo "Activating virtual environment..." +source transcript/bin/activate + +# Install libraries from requirements.txt +echo "Installing libraries from requirements.txt..." +pip install -r requirements.txt + +# Copy env backup to .env file +if [ -f ".env.example" ]; then + echo "Copying .env.example to .env..." + cp .env.example .env +else + echo "No .env.example file found. Creating a new .env file..." + touch .env +fi + +composio login + +composio add slack + +composio triggers enable slack_receive_message + +# Prompt the user to enter the OPENAI_API_KEY +read -p "Enter your OPENAI_API_KEY: " OPENAI_API_KEY + +# Update or add the OPENAI_API_KEY line +if grep -qE "^OPENAI_API_KEY" .env; then + sed -i.bak "s/^OPENAI_API_KEY.*/OPENAI_API_KEY = $OPENAI_API_KEY/" .env && rm .env.bak +else + echo "OPENAI_API_KEY = $OPENAI_API_KEY # add your openai key here" >> .env +fi + + +echo "OPENAI_API_KEY has been set in the .env file" + +echo "Please fill in the .env file with any other necessary environment variables." + +echo "Setup completed successfully!" diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/.env.example b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/.env.example new file mode 100644 index 00000000000..acc425c8c4a --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/.env.example @@ -0,0 +1,3 @@ +OPENAI_API_KEY=KEY +COMPOSIO_API_KEY=KEY +GROQ_API_KEY=KEY \ No newline at end of file diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/main.py b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/main.py new file mode 100644 index 00000000000..76858cfc4ef --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/main.py @@ -0,0 +1,75 @@ +from composio import Composio, ComposioToolSet +import os +from dotenv import load_dotenv +from langchain_groq import ChatGroq +from langchain_openai import ChatOpenAI +from langgraph.checkpoint.memory import MemorySaver +from typing import Annotated +from langchain_core.messages import BaseMessage +from langchain_community.document_loaders import YoutubeLoader +from typing_extensions import TypedDict +from composio_langgraph import Action, ComposioToolSet, App, Trigger +from langgraph.graph import StateGraph, START, END +from langgraph.graph.message import add_messages +from langgraph.prebuilt import ToolNode, tools_condition +load_dotenv() + +class State(TypedDict): + messages: Annotated[list, add_messages] + +graph_builder = StateGraph(State) + +toolset = ComposioToolSet() +tools = toolset.get_tools(apps=[App.SLACK]) + +llm = ChatOpenAI(model="gpt-4o") +#llm = ChatGroq(model='llama3.3-70b-versatile') +llm_with_tools = llm.bind_tools(tools) + +def chatbot(state: State): + return {"messages": [llm_with_tools.invoke(state["messages"])]} + +graph_builder.add_node("chatbot", chatbot) + +tool_node = ToolNode(tools=tools) +graph_builder.add_node("tools", tool_node) + +graph_builder.add_conditional_edges( + "chatbot", + tools_condition, +) +# Any time a tool is called, we return to the chatbot to decide the next step +graph_builder.add_edge("tools", "chatbot") +graph_builder.add_edge(START, "chatbot") +memory = MemorySaver() + +graph = graph_builder.compile(checkpointer=memory) + + +config = {"configurable": {"thread_id": "1"}, "recursion_limit": 50} +listener = toolset.create_trigger_listener() + +@listener.callback(filters={"trigger_name": Trigger.SLACK_RECEIVE_MESSAGE}) +def handle_callback_function(event): + try: + print(event) + payload= event.payload + print(payload) + link = payload['text'][1:-2] + channel_id = payload['channel'] + documents = YoutubeLoader.from_youtube_url(link, add_video_info=False).load() + transcript='' + for i in documents: + transcript+=i.page_content + print('channel id') + user_input = f"""Summarize this transcript:{str(transcript)} and send the summary on the slack channel:{channel_id}""" + # The config is the **second positional argument** to stream() or invoke()! + events = graph.invoke( + {"messages": [("user", user_input)]}, config, stream_mode="values" + ) + print(events) + except Exception as e: + print('Youtube link not found in message') + +print("Listening") +listener.wait_forever() \ No newline at end of file diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/readme.md b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/readme.md new file mode 100644 index 00000000000..6f75e464de5 --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/readme.md @@ -0,0 +1,29 @@ +# Youtube Summary Agent + +This guide provides detailed steps to create an agent that leverages Composio, agentic framework Langgraph and ChatGPT to generate summary of Youtube videos and send it to you on slack. Ensure you have Python 3.8 or higher installed. + +## Steps to Run + +**Navigate to the Project Directory:** +Change to the directory where the `setup.sh`, `main.py`, `requirements.txt`, and `README.md` files are located. For example: +```sh +cd path/to/project/directory +``` + +### 1. Run the Setup File +Make the setup.sh Script Executable (if necessary): +On Linux or macOS, you might need to make the setup.sh script executable: +```shell +chmod +x setup.sh +``` +Execute the setup.sh script to set up the environment and install dependencies: +```shell +./setup.sh +``` +Now, fill in the `.env` file with your secrets. + +### 2. Run the Python Script +```shell +python cookbook/python-examples/quickstarters/transcript_insight_generator/langgraph/main.py +``` + diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/requirements.txt b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/requirements.txt new file mode 100644 index 00000000000..321a5b93c1e --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/requirements.txt @@ -0,0 +1,5 @@ +composio-langgraph +langchain-openai +langchain-groq +langchain-community +python-dotenv \ No newline at end of file diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/setup.sh b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/setup.sh new file mode 100644 index 00000000000..2ccc5596cab --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/langgraph/setup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Create a virtual environment named sqlagent +echo "Creating virtual environment..." +python3 -m venv transcript + +# Activate the virtual environment +echo "Activating virtual environment..." +source transcript/bin/activate + +# Install libraries from requirements.txt +echo "Installing libraries from requirements.txt..." +pip install -r requirements.txt + +# Copy env backup to .env file +if [ -f ".env.example" ]; then + echo "Copying .env.example to .env..." + cp .env.example .env +else + echo "No .env.example file found. Creating a new .env file..." + touch .env +fi + +composio login + +composio add slack + +composio triggers enable slack_receive_message + +# Prompt the user to enter the OPENAI_API_KEY +read -p "Enter your OPENAI_API_KEY: " OPENAI_API_KEY + +# Update or add the OPENAI_API_KEY line +if grep -qE "^OPENAI_API_KEY" .env; then + sed -i.bak "s/^OPENAI_API_KEY.*/OPENAI_API_KEY = $OPENAI_API_KEY/" .env && rm .env.bak +else + echo "OPENAI_API_KEY = $OPENAI_API_KEY # add your openai key here" >> .env +fi + + +echo "OPENAI_API_KEY has been set in the .env file" + +echo "Please fill in the .env file with any other necessary environment variables." + +echo "Setup completed successfully!" diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/.env.example b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/.env.example new file mode 100644 index 00000000000..acc425c8c4a --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/.env.example @@ -0,0 +1,3 @@ +OPENAI_API_KEY=KEY +COMPOSIO_API_KEY=KEY +GROQ_API_KEY=KEY \ No newline at end of file diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/main.py b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/main.py new file mode 100644 index 00000000000..a4e65e3c603 --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/main.py @@ -0,0 +1,44 @@ +import os +import dotenv +from composio_llamaindex import App, ComposioToolSet, Action, Trigger +from llama_index.core.agent import FunctionCallingAgentWorker +from llama_index.core.llms import ChatMessage +from llama_index.llms.openai import OpenAI +from llama_index.readers.youtube_transcript import YoutubeTranscriptReader +loader = YoutubeTranscriptReader() +dotenv.load_dotenv() + +toolset = ComposioToolSet() +tools = toolset.get_tools(actions=[Action.SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL]) +listener = toolset.create_trigger_listener() + +@listener.callback(filters={"trigger_name": Trigger.SLACK_RECEIVE_MESSAGE}) +def handle_callback_function(event): + try: + print(event) + payload= event.payload + print(payload) + link = payload['text'][1:-2] + channel_id = payload['channel'] + print('channel id') + documents = loader.load_data( + ytlinks=[link]) + print(documents) + transcript = '' + for d in documents: + transcript+=d.text + print(transcript) + llm = OpenAI(model='gpt-4o') + summarized_text = llm.complete(f"Summarize this transcript: {transcript}") + toolset.execute_action( + Action.SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL, + {}, + text=f'message: {summarized_text}, channel: {channel_id}' + ) + print('Message sent') + except Exception as E: + print("No youtube link found") + + +print("Listening") +listener.wait_forever() diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/readme.md b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/readme.md new file mode 100644 index 00000000000..6ef1d24b349 --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/readme.md @@ -0,0 +1,29 @@ +# Youtube Summary Agent + +This guide provides detailed steps to create an agent that leverages Composio, agentic framework LlamaIndex and ChatGPT to generate summary of Youtube videos and send it to you on slack. Ensure you have Python 3.8 or higher installed. + +## Steps to Run + +**Navigate to the Project Directory:** +Change to the directory where the `setup.sh`, `main.py`, `requirements.txt`, and `README.md` files are located. For example: +```sh +cd path/to/project/directory +``` + +### 1. Run the Setup File +Make the setup.sh Script Executable (if necessary): +On Linux or macOS, you might need to make the setup.sh script executable: +```shell +chmod +x setup.sh +``` +Execute the setup.sh script to set up the environment and install dependencies: +```shell +./setup.sh +``` +Now, fill in the `.env` file with your secrets. + +### 2. Run the Python Script +```shell +python cookbook/python-examples/quickstarters/transcript_insight_generator/llama_index/main.py +``` + diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/requirements.txt b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/requirements.txt new file mode 100644 index 00000000000..53afc70fd31 --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/requirements.txt @@ -0,0 +1,3 @@ +composio-llamaindex +llama-index-readers-youtube-transcript +python-dotenv \ No newline at end of file diff --git a/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/setup.sh b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/setup.sh new file mode 100644 index 00000000000..2ccc5596cab --- /dev/null +++ b/python/examples/quickstarters/youtube_slack_summary_agent/llama_index/setup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Create a virtual environment named sqlagent +echo "Creating virtual environment..." +python3 -m venv transcript + +# Activate the virtual environment +echo "Activating virtual environment..." +source transcript/bin/activate + +# Install libraries from requirements.txt +echo "Installing libraries from requirements.txt..." +pip install -r requirements.txt + +# Copy env backup to .env file +if [ -f ".env.example" ]; then + echo "Copying .env.example to .env..." + cp .env.example .env +else + echo "No .env.example file found. Creating a new .env file..." + touch .env +fi + +composio login + +composio add slack + +composio triggers enable slack_receive_message + +# Prompt the user to enter the OPENAI_API_KEY +read -p "Enter your OPENAI_API_KEY: " OPENAI_API_KEY + +# Update or add the OPENAI_API_KEY line +if grep -qE "^OPENAI_API_KEY" .env; then + sed -i.bak "s/^OPENAI_API_KEY.*/OPENAI_API_KEY = $OPENAI_API_KEY/" .env && rm .env.bak +else + echo "OPENAI_API_KEY = $OPENAI_API_KEY # add your openai key here" >> .env +fi + + +echo "OPENAI_API_KEY has been set in the .env file" + +echo "Please fill in the .env file with any other necessary environment variables." + +echo "Setup completed successfully!" From 5bd3214ffcd87764e99bfce874d4ac70da06c4bf Mon Sep 17 00:00:00 2001 From: Himanshu Dixit Date: Thu, 2 Jan 2025 11:56:48 +0530 Subject: [PATCH 08/14] feat: 0.5.0 release (#1102) --- js/Makefile | 36 + js/TO_DOs.md | 8 +- js/bump_version.sh | 2 + js/examples/lead_outreach_agent/package.json | 2 +- .../lead_outreach_agent/pnpm-lock.yaml | 1114 ++++++++++++++++- js/examples/portfolio-generator/package.json | 2 +- .../portfolio-generator/pnpm-lock.yaml | 737 +---------- js/examples/reddit-research/package.json | 2 +- js/examples/reddit-research/pnpm-lock.yaml | 737 +---------- js/package.dist.json | 12 +- js/package.json | 26 +- js/pnpm-lock.yaml | 28 +- js/rollup.config.mjs | 17 +- js/src/constants.js | 2 +- js/src/constants.ts | 4 +- js/src/frameworks/cloudflare.ts | 12 +- js/src/frameworks/langchain.ts | 12 +- js/src/frameworks/openai.ts | 12 +- js/src/frameworks/vercel.ts | 12 +- js/src/index.ts | 2 + js/src/sdk/actionRegistry.ts | 1 + js/src/sdk/base.toolset.spec.ts | 10 +- js/src/sdk/base.toolset.ts | 93 +- js/src/sdk/client/services.gen.ts | 352 ++++-- js/src/sdk/client/types.gen.ts | 244 ++-- js/src/sdk/index.spec.ts | 26 +- js/src/sdk/index.ts | 30 +- js/src/sdk/models/Entity.ts | 227 ++-- js/src/sdk/models/actions.spec.ts | 11 +- js/src/sdk/models/actions.ts | 26 +- js/src/sdk/models/activeTriggers.ts | 10 +- js/src/sdk/models/apps.ts | 44 +- js/src/sdk/models/backendClient.spec.ts | 2 +- js/src/sdk/models/backendClient.ts | 7 +- js/src/sdk/models/connectedAccounts.ts | 156 ++- js/src/sdk/models/integrations.ts | 42 +- js/src/sdk/models/triggers.spec.ts | 24 + js/src/sdk/models/triggers.ts | 160 ++- js/src/sdk/types/connectedAccount.ts | 2 +- js/src/sdk/types/entity.ts | 10 +- js/src/sdk/types/trigger.ts | 30 +- js/src/sdk/utils/config.ts | 18 +- js/src/sdk/utils/error.ts | 6 +- js/src/sdk/utils/errors/src/constants.ts | 10 +- js/src/sdk/utils/errors/src/formatter.ts | 39 +- js/src/sdk/utils/fileUtils.ts | 68 +- js/src/sdk/utils/projectUtils.ts | 27 +- js/src/types/base_toolset.ts | 2 +- js/src/utils/common.ts | 4 +- js/src/utils/external.ts | 3 +- js/src/utils/logger.ts | 85 +- js/switch_package.sh | 13 + 52 files changed, 2413 insertions(+), 2148 deletions(-) create mode 100644 js/Makefile create mode 100755 js/switch_package.sh diff --git a/js/Makefile b/js/Makefile new file mode 100644 index 00000000000..68eeb2bad76 --- /dev/null +++ b/js/Makefile @@ -0,0 +1,36 @@ + +.PHONY: install +install: + pnpm install + +.PHONY: build +build: + pnpm run build + +.PHONY: lint +lint: + pnpm run lint + +.PHONY: setup_cli +setup_cli: + ./setup_cli.sh + +.PHONY: bump_version +bump_version: + ./bump_version.sh + +.PHONY: test +test: + pnpm run test + +.PHONY: switch_package +switch_package: + ./switch_package.sh + +## add support for publishing to npm +.PHONY: release +release: + ./switch_package.sh + ./bump_version.sh + pnpm run build + cd dist && pnpm publish diff --git a/js/TO_DOs.md b/js/TO_DOs.md index d88b6215c36..c975ab9a441 100644 --- a/js/TO_DOs.md +++ b/js/TO_DOs.md @@ -1,9 +1,11 @@ List of things to do for Composio JS SDK -- [ ] Decrease bundle size more to less than 500 kb. +- [ ] Decrease bundle size more to less than 500 kb.[DONE] +- [ ] Add support via browserify[DONE] +- [ ] Add test for connected account execution +- [ ] Add example test for cloudflare, vercel, server components. Check release with different run time - [ ] Move away from axios - [ ] Optimise code from openapi spec - [ ] Move away from class based to functional based code - [ ] Add react code library -- [ ] Add support via browserify - [ ] Add more edge cases -- [ ] Sign JS SDK CLIs +- [ ] Sign JS SDK CLIs \ No newline at end of file diff --git a/js/bump_version.sh b/js/bump_version.sh index 1de616acc2a..a2c0dfe5d3e 100755 --- a/js/bump_version.sh +++ b/js/bump_version.sh @@ -23,5 +23,7 @@ sed -i.bak "s/\"version\": \"$current_version_pkg\"/\"version\": \"$new_version\ # Update version in src/constants.js sed -i.bak "s/COMPOSIO_VERSION = \`$current_version\`/COMPOSIO_VERSION = \`$new_version\`/" src/constants.js && rm src/constants.js.bak +sed -i.bak "s/COMPOSIO_VERSION = \`$current_version\`/COMPOSIO_VERSION = \`$new_version\`/" src/constants.ts && rm src/constants.ts.bak + echo "Version updated from $current_version to $new_version in package.dist.json" echo "Version updated from $current_version_pkg to $new_version in package.json" diff --git a/js/examples/lead_outreach_agent/package.json b/js/examples/lead_outreach_agent/package.json index 5b118220b1c..e264d58bdef 100644 --- a/js/examples/lead_outreach_agent/package.json +++ b/js/examples/lead_outreach_agent/package.json @@ -11,7 +11,7 @@ "license": "ISC", "type": "module", "dependencies": { - "composio-core": "^0.4.5", + "composio-core": "0.5.0-rc.6", "dotenv": "^16.4.7", "express": "^4.19.2", "langchain": "^0.3.5", diff --git a/js/examples/lead_outreach_agent/pnpm-lock.yaml b/js/examples/lead_outreach_agent/pnpm-lock.yaml index 264a8fa07a7..d17a14c2f8b 100644 --- a/js/examples/lead_outreach_agent/pnpm-lock.yaml +++ b/js/examples/lead_outreach_agent/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: composio-core: - specifier: ^0.4.5 - version: 0.4.5 + specifier: 0.5.0-rc.6 + version: 0.5.0-rc.6(@ai-sdk/openai@0.0.36(zod@3.23.8))(@cloudflare/workers-types@4.20241230.0)(@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8)))(@langchain/openai@0.1.3)(ai@3.4.33(openai@4.68.4(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.16.0))(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8))(langchain@0.3.5(@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8)))(axios@1.7.7)(openai@4.68.4(zod@3.23.8)))(openai@4.68.4(zod@3.23.8)) dotenv: specifier: ^16.4.7 version: 16.4.7 @@ -26,6 +26,193 @@ importers: packages: + '@ai-sdk/openai@0.0.36': + resolution: {integrity: sha512-6IcvR35UMuuQEQPkVjzUtqDAuz6vy+PMCEL0PAS2ufHXdPPm81OTKVetqjgOPjebsikhVP0soK1pKPEe2cztAQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@1.0.2': + resolution: {integrity: sha512-57f6O4OFVNEpI8Z8o+K40tIB3YQiTw+VCql/qrAO9Utq7Ti1o6+X9tvm177DlZJL7ft0Rwzvgy48S9YhrEKgmA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@1.0.22': + resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider@0.0.12': + resolution: {integrity: sha512-oOwPQD8i2Ynpn22cur4sk26FW3mSy6t6/X/K1Ay2yGBKYiSpRyLfObhOrZEGsXDx+3euKy4nEZ193R36NM+tpQ==} + engines: {node: '>=18'} + + '@ai-sdk/provider@0.0.26': + resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==} + engines: {node: '>=18'} + + '@ai-sdk/react@0.0.70': + resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + + '@ai-sdk/solid@0.0.54': + resolution: {integrity: sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ==} + engines: {node: '>=18'} + peerDependencies: + solid-js: ^1.7.7 + peerDependenciesMeta: + solid-js: + optional: true + + '@ai-sdk/svelte@0.0.57': + resolution: {integrity: sha512-SyF9ItIR9ALP9yDNAD+2/5Vl1IT6kchgyDH8xkmhysfJI6WrvJbtO1wdQ0nylvPLcsPoYu+cAlz1krU4lFHcYw==} + engines: {node: '>=18'} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + '@ai-sdk/ui-utils@0.0.50': + resolution: {integrity: sha512-Z5QYJVW+5XpSaJ4jYCCAVG7zIAuKOOdikhgpksneNmKvx61ACFaf98pmOd+xnjahl0pIlc/QIe6O4yVaJ1sEaw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/vue@0.0.59': + resolution: {integrity: sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} + + '@cloudflare/workers-types@4.20241230.0': + resolution: {integrity: sha512-dtLD4jY35Lb750cCVyO1i/eIfdZJg2Z0i+B1RYX6BVeRPlgaHx/H18ImKAkYmy0g09Ow8R2jZy3hIxMgXun0WQ==} + + '@hey-api/client-axios@0.2.12': + resolution: {integrity: sha512-lBehVhbnhvm41cFguZuy1FO+4x8NO3Qy/ooL0Jw4bdqTu21n7DmZMPsXEF0gL7/gNdTt4QkJGwaojy+8ExtE8w==} + peerDependencies: + axios: '>= 1.0.0 < 2' + + '@inquirer/checkbox@2.5.0': + resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} + engines: {node: '>=18'} + + '@inquirer/confirm@3.2.0': + resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} + engines: {node: '>=18'} + + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/editor@2.2.0': + resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==} + engines: {node: '>=18'} + + '@inquirer/expand@2.3.0': + resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.9': + resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + engines: {node: '>=18'} + + '@inquirer/input@2.3.0': + resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} + engines: {node: '>=18'} + + '@inquirer/number@1.1.0': + resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==} + engines: {node: '>=18'} + + '@inquirer/password@2.2.0': + resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==} + engines: {node: '>=18'} + + '@inquirer/prompts@5.5.0': + resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==} + engines: {node: '>=18'} + + '@inquirer/rawlist@2.3.0': + resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==} + engines: {node: '>=18'} + + '@inquirer/search@1.1.0': + resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==} + engines: {node: '>=18'} + + '@inquirer/select@2.5.0': + resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} + engines: {node: '>=18'} + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@langchain/core@0.2.36': resolution: {integrity: sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg==} engines: {node: '>=18'} @@ -38,18 +225,66 @@ packages: resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==} engines: {node: '>=18'} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} '@types/node@18.19.59': resolution: {integrity: sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ==} + '@types/node@22.10.3': + resolution: {integrity: sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==} + '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -58,10 +293,53 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} + ai@3.4.33: + resolution: {integrity: sha512-plBlrVZKwPoRTmM8+D1sJac9Bq8eaa2jiZlHLZIWekKWI1yMWYZvCCEezY9ASPwRhULYDJB2VhKOBUUeg3S5JQ==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 || ^19.0.0-rc + sswr: ^2.1.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + sswr: + optional: true + svelte: + optional: true + zod: + optional: true + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} @@ -69,6 +347,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -78,6 +360,10 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -97,6 +383,36 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -105,9 +421,21 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - composio-core@0.4.5: - resolution: {integrity: sha512-kRfedO+ZtOV8lbUCZ8Mpxa/zWXYEokAX+AF4orOI2vYsnmtwDwRrfkl6tSBNEamw9RBJyjGiWVdVcxI91dBfAA==} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + composio-core@0.5.0-rc.6: + resolution: {integrity: sha512-f1+4+YapolVZq/36CBXvxPX11wqcXNy4O7LThHk+6gWBoHkNJlQAf9GWnS/wbIIFp3Eu0bfFSLPes0hn6ReAyw==} hasBin: true + peerDependencies: + '@ai-sdk/openai': ^0.0.36 + '@cloudflare/workers-types': ^4.20240718.0 + '@langchain/core': ^0.2.18 + '@langchain/openai': ^0.2.5 + ai: ^3.2.22 + langchain: ^0.2.11 + openai: ^4.50.0 content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} @@ -124,6 +452,9 @@ packages: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -140,6 +471,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -148,10 +483,17 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -159,6 +501,9 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -167,6 +512,10 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -178,6 +527,15 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + esm-env@1.2.1: + resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} + + esrap@1.3.2: + resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -189,10 +547,18 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventsource-parser@1.1.2: + resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} + engines: {node: '>=14.18'} + express@4.21.1: resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} engines: {node: '>= 0.10.0'} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} @@ -235,6 +601,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -264,10 +634,30 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inquirer@10.2.2: + resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} + engines: {node: '>=18'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + js-tiktoken@1.0.15: resolution: {integrity: sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==} @@ -275,6 +665,14 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -341,6 +739,12 @@ packages: openai: optional: true + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -375,6 +779,20 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -400,6 +818,10 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + openai@4.68.4: resolution: {integrity: sha512-LRinV8iU9VQplkr25oZlyrsYGPGasIwYN8KFMAAFTHHLHjHhejtJ5BALuLFrkGzY4wfbKhOhuT+7lcHZ+F3iEA==} hasBin: true @@ -412,6 +834,10 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -435,6 +861,13 @@ packages: path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -457,16 +890,30 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -491,10 +938,60 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + sswr@2.1.0: + resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svelte@5.16.0: + resolution: {integrity: sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==} + engines: {node: '>=18'} + + swr@2.3.0: + resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + swrev@4.0.0: + resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} + + swrv@1.0.4: + resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} + peerDependencies: + vue: '>=3.2.26 < 4' + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -502,9 +999,16 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -512,10 +1016,18 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -528,6 +1040,14 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -538,11 +1058,22 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + yaml@2.6.0: resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} engines: {node: '>= 14'} hasBin: true + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zod-to-json-schema@3.23.5: resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} peerDependencies: @@ -553,6 +1084,226 @@ packages: snapshots: + '@ai-sdk/openai@0.0.36(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.12 + '@ai-sdk/provider-utils': 1.0.2(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/provider-utils@1.0.2(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.12 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@1.0.22(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.26 + eventsource-parser: 1.1.2 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider@0.0.12': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@0.0.26': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@0.0.70(react@19.0.0)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + swr: 2.3.0(react@19.0.0) + throttleit: 2.1.0 + optionalDependencies: + react: 19.0.0 + zod: 3.23.8 + + '@ai-sdk/solid@0.0.54(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + transitivePeerDependencies: + - zod + + '@ai-sdk/svelte@0.0.57(svelte@5.16.0)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + sswr: 2.1.0(svelte@5.16.0) + optionalDependencies: + svelte: 5.16.0 + transitivePeerDependencies: + - zod + + '@ai-sdk/ui-utils@0.0.50(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.26 + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + json-schema: 0.4.0 + secure-json-parse: 2.7.0 + zod-to-json-schema: 3.23.5(zod@3.23.8) + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/vue@0.0.59(vue@3.5.13)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + swrv: 1.0.4(vue@3.5.13) + optionalDependencies: + vue: 3.5.13 + transitivePeerDependencies: + - zod + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@cloudflare/workers-types@4.20241230.0': {} + + '@hey-api/client-axios@0.2.12(axios@1.7.7)': + dependencies: + axios: 1.7.7 + + '@inquirer/checkbox@2.5.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.9 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/confirm@3.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.9 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.10.3 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/editor@2.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + external-editor: 3.1.0 + + '@inquirer/expand@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.9': {} + + '@inquirer/input@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/number@1.1.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/password@2.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@5.5.0': + dependencies: + '@inquirer/checkbox': 2.5.0 + '@inquirer/confirm': 3.2.0 + '@inquirer/editor': 2.2.0 + '@inquirer/expand': 2.3.0 + '@inquirer/input': 2.3.0 + '@inquirer/number': 1.1.0 + '@inquirer/password': 2.2.0 + '@inquirer/rawlist': 2.3.0 + '@inquirer/search': 1.1.0 + '@inquirer/select': 2.5.0 + + '@inquirer/rawlist@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@1.1.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.9 + '@inquirer/type': 1.5.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@2.5.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.9 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 @@ -586,6 +1337,16 @@ snapshots: transitivePeerDependencies: - openai + '@opentelemetry/api@1.9.0': {} + + '@types/diff-match-patch@1.0.36': {} + + '@types/estree@1.0.6': {} + + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 18.19.59 + '@types/node-fetch@2.6.11': dependencies: '@types/node': 18.19.59 @@ -595,10 +1356,70 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.10.3': + dependencies: + undici-types: 6.20.0 + '@types/retry@0.12.0': {} '@types/uuid@10.0.0': {} + '@types/wrap-ansi@3.0.0': {} + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.3 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.3 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13)': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13 + + '@vue/shared@3.5.13': {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -608,14 +1429,57 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-typescript@1.4.13(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 + ai@3.4.33(openai@4.68.4(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.16.0))(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 0.0.26 + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/react': 0.0.70(react@19.0.0)(zod@3.23.8) + '@ai-sdk/solid': 0.0.54(zod@3.23.8) + '@ai-sdk/svelte': 0.0.57(svelte@5.16.0)(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + '@ai-sdk/vue': 0.0.59(vue@3.5.13)(zod@3.23.8) + '@opentelemetry/api': 1.9.0 + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + secure-json-parse: 2.7.0 + zod-to-json-schema: 3.23.5(zod@3.23.8) + optionalDependencies: + openai: 4.68.4(zod@3.23.8) + react: 19.0.0 + sswr: 2.1.0(svelte@5.16.0) + svelte: 5.16.0 + zod: 3.23.8 + transitivePeerDependencies: + - solid-js + - vue + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + ansi-styles@5.2.0: {} argparse@2.0.1: {} + aria-query@5.3.2: {} + array-flatten@1.1.1: {} asynckit@0.4.0: {} @@ -627,7 +1491,8 @@ snapshots: proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - optional: true + + axobject-query@4.1.0: {} base64-js@1.5.1: {} @@ -660,13 +1525,59 @@ snapshots: camelcase@6.3.0: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + chardet@0.7.0: {} + + cli-progress@3.12.0: + dependencies: + string-width: 4.2.3 + + cli-width@4.1.0: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 commander@10.0.1: {} - composio-core@0.4.5: {} + commander@12.1.0: {} + + composio-core@0.5.0-rc.6(@ai-sdk/openai@0.0.36(zod@3.23.8))(@cloudflare/workers-types@4.20241230.0)(@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8)))(@langchain/openai@0.1.3)(ai@3.4.33(openai@4.68.4(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.16.0))(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8))(langchain@0.3.5(@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8)))(axios@1.7.7)(openai@4.68.4(zod@3.23.8)))(openai@4.68.4(zod@3.23.8)): + dependencies: + '@ai-sdk/openai': 0.0.36(zod@3.23.8) + '@cloudflare/workers-types': 4.20241230.0 + '@hey-api/client-axios': 0.2.12(axios@1.7.7) + '@langchain/core': 0.2.36(openai@4.68.4(zod@3.23.8)) + '@langchain/openai': 0.1.3 + ai: 3.4.33(openai@4.68.4(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.16.0))(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8) + axios: 1.7.7 + chalk: 4.1.2 + cli-progress: 3.12.0 + commander: 12.1.0 + inquirer: 10.2.2 + langchain: 0.3.5(@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8)))(axios@1.7.7)(openai@4.68.4(zod@3.23.8)) + open: 8.4.2 + openai: 4.68.4(zod@3.23.8) + pusher-js: 8.4.0-rc2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.5(zod@3.23.8) + transitivePeerDependencies: + - debug content-disposition@0.5.4: dependencies: @@ -678,6 +1589,8 @@ snapshots: cookie@0.7.1: {} + csstype@3.1.3: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -690,20 +1603,30 @@ snapshots: es-errors: 1.3.0 gopd: 1.0.1 + define-lazy-prop@2.0.0: {} + delayed-stream@1.0.0: {} depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} + diff-match-patch@1.0.5: {} + dotenv@16.4.7: {} ee-first@1.1.1: {} + emoji-regex@8.0.0: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} + entities@4.5.0: {} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 @@ -712,12 +1635,22 @@ snapshots: escape-html@1.0.3: {} + esm-env@1.2.1: {} + + esrap@1.3.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + estree-walker@2.0.2: {} + etag@1.8.1: {} event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} + eventsource-parser@1.1.2: {} + express@4.21.1: dependencies: accepts: 1.3.8 @@ -754,6 +1687,12 @@ snapshots: transitivePeerDependencies: - supports-color + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -766,8 +1705,7 @@ snapshots: transitivePeerDependencies: - supports-color - follow-redirects@1.15.9: - optional: true + follow-redirects@1.15.9: {} form-data-encoder@1.7.2: {} @@ -800,6 +1738,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 @@ -830,8 +1770,31 @@ snapshots: inherits@2.0.4: {} + inquirer@10.2.2: + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/prompts': 5.5.0 + '@inquirer/type': 1.5.5 + '@types/mute-stream': 0.0.4 + ansi-escapes: 4.3.2 + mute-stream: 1.0.0 + run-async: 3.0.0 + rxjs: 7.8.1 + ipaddr.js@1.9.1: {} + is-docker@2.2.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + js-tiktoken@1.0.15: dependencies: base64-js: 1.5.1 @@ -840,6 +1803,14 @@ snapshots: dependencies: argparse: 2.0.1 + json-schema@0.4.0: {} + + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + jsonpointer@5.0.1: {} langchain@0.3.5(@langchain/core@0.2.36(openai@4.68.4(zod@3.23.8)))(axios@1.7.7)(openai@4.68.4(zod@3.23.8)): @@ -885,6 +1856,12 @@ snapshots: optionalDependencies: openai: 4.68.4(zod@3.23.8) + locate-character@3.0.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + media-typer@0.3.0: {} merge-descriptors@1.0.3: {} @@ -905,6 +1882,12 @@ snapshots: mustache@4.2.0: {} + mute-stream@1.0.0: {} + + nanoid@3.3.6: {} + + nanoid@3.3.8: {} + negotiator@0.6.3: {} node-domexception@1.0.0: {} @@ -919,6 +1902,12 @@ snapshots: dependencies: ee-first: 1.1.1 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + openai@4.68.4(zod@3.23.8): dependencies: '@types/node': 18.19.59 @@ -935,6 +1924,8 @@ snapshots: openapi-types@12.1.3: {} + os-tmpdir@1.0.2: {} + p-finally@1.0.0: {} p-queue@6.6.2: @@ -955,13 +1946,20 @@ snapshots: path-to-regexp@0.1.10: {} + picocolors@1.1.1: {} + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: - optional: true + proxy-from-env@1.1.0: {} pusher-js@8.4.0-rc2: dependencies: @@ -980,12 +1978,22 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + react@19.0.0: {} + retry@0.13.1: {} + run-async@3.0.0: {} + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} + secure-json-parse@2.7.0: {} + semver@7.6.3: {} send@0.19.0: @@ -1033,14 +2041,76 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + sswr@2.1.0(svelte@5.16.0): + dependencies: + svelte: 5.16.0 + swrev: 4.0.0 + statuses@2.0.1: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + svelte@5.16.0: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.1 + esrap: 1.3.2 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 + + swr@2.3.0(react@19.0.0): + dependencies: + dequal: 2.0.3 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + + swrev@4.0.0: {} + + swrv@1.0.4(vue@3.5.13): + dependencies: + vue: 3.5.13 + + throttleit@2.1.0: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + toidentifier@1.0.1: {} tr46@0.0.3: {} + tslib@2.8.1: {} + tweetnacl@1.0.3: {} + type-fest@0.21.3: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -1048,14 +2118,28 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.20.0: {} + unpipe@1.0.0: {} + use-sync-external-store@1.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + utils-merge@1.0.1: {} uuid@10.0.0: {} vary@1.1.2: {} + vue@3.5.13: + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13) + '@vue/shared': 3.5.13 + web-streams-polyfill@4.0.0-beta.3: {} webidl-conversions@3.0.1: {} @@ -1065,8 +2149,18 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + yaml@2.6.0: {} + yoctocolors-cjs@2.1.2: {} + + zimmerframe@1.1.2: {} + zod-to-json-schema@3.23.5(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/js/examples/portfolio-generator/package.json b/js/examples/portfolio-generator/package.json index 3040d80717e..013c93ace0a 100644 --- a/js/examples/portfolio-generator/package.json +++ b/js/examples/portfolio-generator/package.json @@ -12,7 +12,7 @@ "dependencies": { "@ai-sdk/openai": "^0.0.36", "ai": "^3.2.24", - "composio-core": "latest", + "composio-core": "0.5.0-rc.6", "dotenv": "^16.4.5", "zod": "^3.23.8" } diff --git a/js/examples/portfolio-generator/pnpm-lock.yaml b/js/examples/portfolio-generator/pnpm-lock.yaml index 6c229e63f9a..a91347a1803 100644 --- a/js/examples/portfolio-generator/pnpm-lock.yaml +++ b/js/examples/portfolio-generator/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^3.2.24 version: 3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) composio-core: - specifier: latest - version: 0.2.9-8(@types/node@22.9.1)(bufferutil@4.0.8)(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(typescript@5.6.3)(utf-8-validate@6.0.5)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) + specifier: 0.5.0-rc.6 + version: 0.5.0-rc.6(@ai-sdk/openai@0.0.36(zod@3.23.8))(@cloudflare/workers-types@4.20241230.0)(@langchain/core@0.2.36(openai@4.73.0(zod@3.23.8)))(@langchain/openai@0.2.11)(ai@3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8))(langchain@0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)))(openai@4.73.0(zod@3.23.8)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -127,44 +127,14 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': - resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@e2b/code-interpreter@0.0.8': - resolution: {integrity: sha512-cKDFY9js9l3MfL71x0IDvaz0mAhvHIurVFnimtFRXNzuV0TxhuFqsauKabet0TMOrcDF3H3trC7pct6mNgRYTA==} - engines: {node: '>=18'} - - '@e2b/sdk@0.16.2': - resolution: {integrity: sha512-byj1NWAPcR1UjvdbLK45of/vyfp9qj4L5EhQo4eSF2rKVhlGXIRXfA/+HEnWF8eRS6084b+rkFy7ITvuCcQCUQ==} - engines: {node: '>=18'} - deprecated: 'The package @e2b/sdk has been renamed to e2b. Please uninstall the old one and install the new by running following command: npm uninstall @e2b/sdk && npm install e2b' - - '@faker-js/faker@8.4.1': - resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + '@cloudflare/workers-types@4.20241230.0': + resolution: {integrity: sha512-dtLD4jY35Lb750cCVyO1i/eIfdZJg2Z0i+B1RYX6BVeRPlgaHx/H18ImKAkYmy0g09Ow8R2jZy3hIxMgXun0WQ==} '@hey-api/client-axios@0.2.10': resolution: {integrity: sha512-EXTf9WcZCyzRIi1JEbKbJ4JvB+TLy9WsSaBKRUwd7d8c6PYQ+MRJCTnkzGJk1wXkeBLqJEwyf2IZH/qmCkDhqg==} peerDependencies: axios: '>= 1.0.0 < 2' - '@hono/node-server@1.13.7': - resolution: {integrity: sha512-kTfUMsoloVKtRA2fLiGSd9qBddmru9KadNyhJCwgKBxTiNkaAJEwkVN9KV/rS4HtmmNRtUh6P+YpmjRMl0d9vQ==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@inquirer/checkbox@2.5.0': resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} engines: {node: '>=18'} @@ -243,9 +213,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@langchain/core@0.2.36': resolution: {integrity: sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg==} engines: {node: '>=18'} @@ -262,18 +229,6 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} @@ -295,9 +250,6 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -342,10 +294,6 @@ packages: peerDependencies: acorn: '>=8.9.0' - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -392,9 +340,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -402,12 +347,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -421,27 +360,14 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - bufferutil@4.0.8: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} - buildcheck@0.0.6: - resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} - engines: {node: '>=10.0.0'} - camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -457,9 +383,6 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - cli-progress@3.12.0: resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} engines: {node: '>=4'} @@ -471,32 +394,13 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -509,29 +413,21 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - composio-core@0.2.9-8: - resolution: {integrity: sha512-3CW9PjVE7VO5sijYn7NGV1Tk9nh6KyjAKuPJPSO12LWfcrG9vwIZIb7u89joM68fP/KZBppDUCvRtTlRFFjVvw==} + composio-core@0.5.0-rc.6: + resolution: {integrity: sha512-f1+4+YapolVZq/36CBXvxPX11wqcXNy4O7LThHk+6gWBoHkNJlQAf9GWnS/wbIIFp3Eu0bfFSLPes0hn6ReAyw==} hasBin: true - - cpu-features@0.0.10: - resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} - engines: {node: '>=10.0.0'} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + peerDependencies: + '@ai-sdk/openai': ^0.0.36 + '@cloudflare/workers-types': ^4.20240718.0 + '@langchain/core': ^0.2.18 + '@langchain/openai': ^0.2.5 + ai: ^3.2.22 + langchain: ^0.2.11 + openai: ^4.50.0 csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -547,42 +443,17 @@ packages: diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - docker-modem@5.0.3: - resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==} - engines: {node: '>= 8.0'} - - dockerode@4.0.2: - resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==} - engines: {node: '>= 8.0'} - dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2: - resolution: {integrity: sha512-xKmVK4ipgVQPJ/uyyrfH9LnaawERRWt8U2UZhdhGfzdL/QU/OpBjuhoIbFCv1Uy6qXV4nIiJ6Nw4MBC4HmXf1g==} - engines: {node: '>=18'} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - enumify@2.0.0: - resolution: {integrity: sha512-hpyRdixXrBdr1sZOWH/WKBleMtHWVbM+DyVa0OqKQnKEw6x0TuUNYjcWKlp5/+tdiOsbgYiaZ/pYUeMake4k8A==} - esm-env@1.1.4: resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} @@ -607,12 +478,6 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -633,17 +498,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hono@4.6.11: - resolution: {integrity: sha512-f0LwJQFKdUUrCUAVowxSvNCjyzI7ZLt8XWYU/EApyeq5FfOvHFarBaE5rjU9HTNFk4RI0FkdB2edb3p/7xZjzQ==} - engines: {node: '>=16.9.0'} - humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -651,19 +509,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inquirer@10.2.2: resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} engines: {node: '>=18'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -676,19 +525,10 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - js-tiktoken@1.0.15: resolution: {integrity: sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==} @@ -711,9 +551,6 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - langchain@0.2.20: resolution: {integrity: sha512-tbels6Rr524iMM3VOQ4aTGnEOOjAA1BQuBR8u/8gJ2yT48lMtIQRAN32Y4KVjKK+hEWxHHlmLBrtgLpTphFjNA==} engines: {node: '>=18'} @@ -905,10 +742,6 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -916,9 +749,6 @@ packages: magic-string@0.30.13: resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -927,9 +757,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -941,9 +768,6 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - nan@2.22.0: - resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} - nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -971,16 +795,6 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -997,10 +811,6 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - openapi-typescript-fetch@1.1.3: - resolution: {integrity: sha512-smLZPck4OkKMNExcw8jMgrMOGgVGx2N/s6DbKL2ftNl77g5HfoGpZGFy79RBzU/EkaO0OZpwBnslfdBfh7ZcWg==} - engines: {node: '>= 12.0.0', npm: '>= 7.0.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -1021,23 +831,9 @@ packages: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - - path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - platform@1.3.6: - resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -1045,9 +841,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - pusher-js@8.4.0-rc2: resolution: {integrity: sha512-d87GjOEEl9QgO5BWmViSqW0LOzPvybvX6WA9zLUstNdB57jVJuR27zHkRnrav2a3+zAMlHbP2Og8wug+rG8T+g==} @@ -1055,14 +848,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - resolve-package-path@4.0.3: - resolution: {integrity: sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==} - engines: {node: '>= 12'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -1074,13 +859,6 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -1096,35 +874,19 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - split-ca@1.0.1: - resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} - - ssh2@1.16.0: - resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} - engines: {node: '>=10.16.0'} - sswr@2.1.0: resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1150,16 +912,6 @@ packages: peerDependencies: vue: '>=3.2.26 < 4' - tar-fs@2.0.1: - resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - throttleit@2.1.0: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} @@ -1171,30 +923,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -1222,16 +953,10 @@ packages: resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==} engines: {node: '>=6.14.2'} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -1250,21 +975,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} - - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} - engines: {node: '>= 12.0.0'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -1282,10 +996,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -1400,51 +1110,12 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@balena/dockerignore@1.0.2': {} - - '@colors/colors@1.6.0': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@dabh/diagnostics@2.0.3': - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - - '@e2b/code-interpreter@0.0.8(bufferutil@4.0.8)(utf-8-validate@6.0.5)': - dependencies: - e2b: 0.16.2 - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@e2b/sdk@0.16.2': - dependencies: - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) - normalize-path: 3.0.0 - openapi-typescript-fetch: 1.1.3 - path-browserify: 1.0.1 - platform: 1.3.6 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.5 - - '@faker-js/faker@8.4.1': {} + '@cloudflare/workers-types@4.20241230.0': {} '@hey-api/client-axios@0.2.10(axios@1.7.7)': dependencies: axios: 1.7.7 - '@hono/node-server@1.13.7(hono@4.6.11)': - dependencies: - hono: 4.6.11 - '@inquirer/checkbox@2.5.0': dependencies: '@inquirer/core': 9.2.1 @@ -1562,11 +1233,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/core@0.2.36(openai@4.73.0(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 @@ -1602,14 +1268,6 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - '@types/diff-match-patch@1.0.36': {} '@types/estree@1.0.6': {} @@ -1620,7 +1278,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 18.19.64 + '@types/node': 22.9.1 form-data: 4.0.1 '@types/node@18.19.64': @@ -1633,8 +1291,6 @@ snapshots: '@types/retry@0.12.0': {} - '@types/triple-beam@1.3.5': {} - '@types/uuid@10.0.0': {} '@types/wrap-ansi@3.0.0': {} @@ -1701,10 +1357,6 @@ snapshots: dependencies: acorn: 8.14.0 - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.0 - acorn@8.14.0: {} agentkeepalive@4.5.0: @@ -1748,18 +1400,10 @@ snapshots: ansi-styles@5.2.0: {} - arg@4.1.3: {} - argparse@2.0.1: {} aria-query@5.3.2: {} - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - async@3.2.6: {} - asynckit@0.4.0: {} axios@1.7.7: @@ -1774,31 +1418,13 @@ snapshots: base64-js@1.5.1: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - bufferutil@4.0.8: dependencies: node-gyp-build: 4.8.4 optional: true - buildcheck@0.0.6: - optional: true - camelcase@6.3.0: {} chalk@4.1.2: @@ -1810,8 +1436,6 @@ snapshots: chardet@0.7.0: {} - chownr@1.1.4: {} - cli-progress@3.12.0: dependencies: string-width: 4.2.3 @@ -1820,35 +1444,12 @@ snapshots: client-only@0.0.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - - colors@1.4.0: {} - - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -1857,124 +1458,31 @@ snapshots: commander@12.1.0: {} - composio-core@0.2.9-8(@types/node@22.9.1)(bufferutil@4.0.8)(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(typescript@5.6.3)(utf-8-validate@6.0.5)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)): + composio-core@0.5.0-rc.6(@ai-sdk/openai@0.0.36(zod@3.23.8))(@cloudflare/workers-types@4.20241230.0)(@langchain/core@0.2.36(openai@4.73.0(zod@3.23.8)))(@langchain/openai@0.2.11)(ai@3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8))(langchain@0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)))(openai@4.73.0(zod@3.23.8)): dependencies: '@ai-sdk/openai': 0.0.36(zod@3.23.8) - '@e2b/code-interpreter': 0.0.8(bufferutil@4.0.8)(utf-8-validate@6.0.5) - '@e2b/sdk': 0.16.2 - '@faker-js/faker': 8.4.1 + '@cloudflare/workers-types': 4.20241230.0 '@hey-api/client-axios': 0.2.10(axios@1.7.7) - '@hono/node-server': 1.13.7(hono@4.6.11) '@langchain/core': 0.2.36(openai@4.73.0(zod@3.23.8)) '@langchain/openai': 0.2.11 ai: 3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) axios: 1.7.7 chalk: 4.1.2 cli-progress: 3.12.0 - colors: 1.4.0 commander: 12.1.0 - dockerode: 4.0.2 - e2b: 0.16.2 - enumify: 2.0.0 - hono: 4.6.11 inquirer: 10.2.2 langchain: 0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) open: 8.4.2 openai: 4.73.0(zod@3.23.8) pusher-js: 8.4.0-rc2 - resolve-package-path: 4.0.3 - ts-node: 10.9.2(@types/node@22.9.1)(typescript@5.6.3) uuid: 10.0.0 - winston: 3.17.0 zod: 3.23.8 zod-to-json-schema: 3.23.5(zod@3.23.8) transitivePeerDependencies: - - '@aws-sdk/client-s3' - - '@aws-sdk/client-sagemaker-runtime' - - '@aws-sdk/client-sfn' - - '@aws-sdk/credential-provider-node' - - '@azure/storage-blob' - - '@browserbasehq/sdk' - - '@gomomento/sdk' - - '@gomomento/sdk-core' - - '@gomomento/sdk-web' - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - '@mendable/firecrawl-js' - - '@notionhq/client' - - '@pinecone-database/pinecone' - - '@supabase/supabase-js' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - '@vercel/kv' - - '@xata.io/client' - - apify-client - - assemblyai - - bufferutil - - cheerio - - chromadb - - convex - - couchbase - - d3-dsv - debug - - encoding - - epub2 - - faiss-node - - fast-xml-parser - - handlebars - - html-to-text - - ignore - - ioredis - - jsdom - - mammoth - - mongodb - - node-llama-cpp - - notion-to-md - - officeparser - - pdf-parse - - peggy - - playwright - - puppeteer - - pyodide - - react - - redis - - solid-js - - sonix-speech-recognition - - srt-parser-2 - - sswr - - supports-color - - svelte - - typeorm - - typescript - - utf-8-validate - - vue - - weaviate-ts-client - - web-auth-library - - ws - - youtube-transcript - - youtubei.js - - cpu-features@0.0.10: - dependencies: - buildcheck: 0.0.6 - nan: 2.22.0 - optional: true - - create-require@1.1.1: {} csstype@3.1.3: {} - debug@4.3.7: - dependencies: - ms: 2.1.3 - decamelize@1.2.0: {} define-lazy-prop@2.0.0: {} @@ -1983,51 +1491,12 @@ snapshots: diff-match-patch@1.0.5: {} - diff@4.0.2: {} - - docker-modem@5.0.3: - dependencies: - debug: 4.3.7 - readable-stream: 3.6.2 - split-ca: 1.0.1 - ssh2: 1.16.0 - transitivePeerDependencies: - - supports-color - - dockerode@4.0.2: - dependencies: - '@balena/dockerignore': 1.0.2 - docker-modem: 5.0.3 - tar-fs: 2.0.1 - transitivePeerDependencies: - - supports-color - dotenv@16.4.5: {} - e2b@0.16.2: - dependencies: - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) - normalize-path: 3.0.0 - openapi-typescript-fetch: 1.1.3 - path-browserify: 1.0.1 - platform: 1.3.6 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.5 - emoji-regex@8.0.0: {} - enabled@2.0.0: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - entities@4.5.0: {} - enumify@2.0.0: {} - esm-env@1.1.4: {} esrap@1.2.2: @@ -2049,10 +1518,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fecha@4.2.3: {} - - fn.name@1.1.0: {} - follow-redirects@1.15.9: {} form-data-encoder@1.7.2: {} @@ -2068,12 +1533,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - fs-constants@1.0.0: {} - has-flag@4.0.0: {} - hono@4.6.11: {} - humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -2082,10 +1543,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} - - inherits@2.0.4: {} - inquirer@10.2.2: dependencies: '@inquirer/core': 9.2.1 @@ -2097,8 +1554,6 @@ snapshots: run-async: 3.0.0 rxjs: 7.8.1 - is-arrayish@0.3.2: {} - is-docker@2.2.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2107,16 +1562,10 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-stream@2.0.1: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)): - dependencies: - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - js-tiktoken@1.0.15: dependencies: base64-js: 1.5.1 @@ -2137,8 +1586,6 @@ snapshots: jsonpointer@5.0.1: {} - kuler@2.0.0: {} - langchain@0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)): dependencies: '@langchain/core': 0.2.36(openai@4.73.0(zod@3.23.8)) @@ -2175,15 +1622,6 @@ snapshots: locate-character@3.0.0: {} - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -2192,25 +1630,18 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-error@1.3.6: {} - mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mkdirp-classic@0.5.3: {} - ms@2.1.3: {} mustache@4.2.0: {} mute-stream@1.0.0: {} - nan@2.22.0: - optional: true - nanoid@3.3.6: {} nanoid@3.3.7: {} @@ -2224,16 +1655,6 @@ snapshots: node-gyp-build@4.8.4: optional: true - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -2256,8 +1677,6 @@ snapshots: openapi-types@12.1.3: {} - openapi-typescript-fetch@1.1.3: {} - os-tmpdir@1.0.2: {} p-finally@1.0.0: {} @@ -2276,18 +1695,8 @@ snapshots: dependencies: p-finally: 1.0.0 - path-browserify@1.0.1: {} - - path-root-regex@0.1.2: {} - - path-root@0.1.1: - dependencies: - path-root-regex: 0.1.2 - picocolors@1.1.1: {} - platform@1.3.6: {} - postcss@8.4.49: dependencies: nanoid: 3.3.7 @@ -2296,11 +1705,6 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - pusher-js@8.4.0-rc2: dependencies: tweetnacl: 1.0.3 @@ -2309,16 +1713,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - resolve-package-path@4.0.3: - dependencies: - path-root: 0.1.1 - retry@0.13.1: {} run-async@3.0.0: {} @@ -2327,10 +1721,6 @@ snapshots: dependencies: tslib: 2.8.1 - safe-buffer@5.2.1: {} - - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} secure-json-parse@2.7.0: {} @@ -2339,39 +1729,19 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - source-map-js@1.2.1: {} - split-ca@1.0.1: {} - - ssh2@1.16.0: - dependencies: - asn1: 0.2.6 - bcrypt-pbkdf: 1.0.2 - optionalDependencies: - cpu-features: 0.0.10 - nan: 2.22.0 - sswr@2.1.0(svelte@5.2.7): dependencies: svelte: 5.2.7 swrev: 4.0.0 - stack-trace@0.0.10: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2408,23 +1778,6 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.6.3) - tar-fs@2.0.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - text-hex@1.0.0: {} - throttleit@2.1.0: {} tmp@0.0.33: @@ -2433,35 +1786,14 @@ snapshots: tr46@0.0.3: {} - triple-beam@1.4.1: {} - - ts-node@10.9.2(@types/node@22.9.1)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.9.1 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - tslib@2.8.1: {} - tweetnacl@0.14.5: {} - tweetnacl@1.0.3: {} type-fest@0.21.3: {} - typescript@5.6.3: {} + typescript@5.6.3: + optional: true undici-types@5.26.5: {} @@ -2476,12 +1808,8 @@ snapshots: node-gyp-build: 4.8.4 optional: true - util-deprecate@1.0.2: {} - uuid@10.0.0: {} - v8-compile-cache-lib@3.0.1: {} - vue@3.5.13(typescript@5.6.3): dependencies: '@vue/compiler-dom': 3.5.13 @@ -2501,43 +1829,20 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.17.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrappy@1.0.2: {} - ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.5 + optional: true yaml@2.6.1: {} - yn@3.1.1: {} - yoctocolors-cjs@2.1.2: {} zimmerframe@1.1.2: {} diff --git a/js/examples/reddit-research/package.json b/js/examples/reddit-research/package.json index 14bdfb36983..698329af11b 100644 --- a/js/examples/reddit-research/package.json +++ b/js/examples/reddit-research/package.json @@ -12,7 +12,7 @@ "dependencies": { "@ai-sdk/openai": "^0.0.36", "ai": "^3.2.24", - "composio-core": "^0.4.8", + "composio-core": "0.5.0-rc.6", "dotenv": "^16.4.5", "zod": "^3.23.8" } diff --git a/js/examples/reddit-research/pnpm-lock.yaml b/js/examples/reddit-research/pnpm-lock.yaml index 6c229e63f9a..a91347a1803 100644 --- a/js/examples/reddit-research/pnpm-lock.yaml +++ b/js/examples/reddit-research/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^3.2.24 version: 3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) composio-core: - specifier: latest - version: 0.2.9-8(@types/node@22.9.1)(bufferutil@4.0.8)(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(typescript@5.6.3)(utf-8-validate@6.0.5)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) + specifier: 0.5.0-rc.6 + version: 0.5.0-rc.6(@ai-sdk/openai@0.0.36(zod@3.23.8))(@cloudflare/workers-types@4.20241230.0)(@langchain/core@0.2.36(openai@4.73.0(zod@3.23.8)))(@langchain/openai@0.2.11)(ai@3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8))(langchain@0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)))(openai@4.73.0(zod@3.23.8)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -127,44 +127,14 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': - resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@e2b/code-interpreter@0.0.8': - resolution: {integrity: sha512-cKDFY9js9l3MfL71x0IDvaz0mAhvHIurVFnimtFRXNzuV0TxhuFqsauKabet0TMOrcDF3H3trC7pct6mNgRYTA==} - engines: {node: '>=18'} - - '@e2b/sdk@0.16.2': - resolution: {integrity: sha512-byj1NWAPcR1UjvdbLK45of/vyfp9qj4L5EhQo4eSF2rKVhlGXIRXfA/+HEnWF8eRS6084b+rkFy7ITvuCcQCUQ==} - engines: {node: '>=18'} - deprecated: 'The package @e2b/sdk has been renamed to e2b. Please uninstall the old one and install the new by running following command: npm uninstall @e2b/sdk && npm install e2b' - - '@faker-js/faker@8.4.1': - resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + '@cloudflare/workers-types@4.20241230.0': + resolution: {integrity: sha512-dtLD4jY35Lb750cCVyO1i/eIfdZJg2Z0i+B1RYX6BVeRPlgaHx/H18ImKAkYmy0g09Ow8R2jZy3hIxMgXun0WQ==} '@hey-api/client-axios@0.2.10': resolution: {integrity: sha512-EXTf9WcZCyzRIi1JEbKbJ4JvB+TLy9WsSaBKRUwd7d8c6PYQ+MRJCTnkzGJk1wXkeBLqJEwyf2IZH/qmCkDhqg==} peerDependencies: axios: '>= 1.0.0 < 2' - '@hono/node-server@1.13.7': - resolution: {integrity: sha512-kTfUMsoloVKtRA2fLiGSd9qBddmru9KadNyhJCwgKBxTiNkaAJEwkVN9KV/rS4HtmmNRtUh6P+YpmjRMl0d9vQ==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@inquirer/checkbox@2.5.0': resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} engines: {node: '>=18'} @@ -243,9 +213,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@langchain/core@0.2.36': resolution: {integrity: sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg==} engines: {node: '>=18'} @@ -262,18 +229,6 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} @@ -295,9 +250,6 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -342,10 +294,6 @@ packages: peerDependencies: acorn: '>=8.9.0' - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -392,9 +340,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -402,12 +347,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -421,27 +360,14 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - bufferutil@4.0.8: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} - buildcheck@0.0.6: - resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} - engines: {node: '>=10.0.0'} - camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -457,9 +383,6 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - cli-progress@3.12.0: resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} engines: {node: '>=4'} @@ -471,32 +394,13 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -509,29 +413,21 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - composio-core@0.2.9-8: - resolution: {integrity: sha512-3CW9PjVE7VO5sijYn7NGV1Tk9nh6KyjAKuPJPSO12LWfcrG9vwIZIb7u89joM68fP/KZBppDUCvRtTlRFFjVvw==} + composio-core@0.5.0-rc.6: + resolution: {integrity: sha512-f1+4+YapolVZq/36CBXvxPX11wqcXNy4O7LThHk+6gWBoHkNJlQAf9GWnS/wbIIFp3Eu0bfFSLPes0hn6ReAyw==} hasBin: true - - cpu-features@0.0.10: - resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} - engines: {node: '>=10.0.0'} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + peerDependencies: + '@ai-sdk/openai': ^0.0.36 + '@cloudflare/workers-types': ^4.20240718.0 + '@langchain/core': ^0.2.18 + '@langchain/openai': ^0.2.5 + ai: ^3.2.22 + langchain: ^0.2.11 + openai: ^4.50.0 csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -547,42 +443,17 @@ packages: diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - docker-modem@5.0.3: - resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==} - engines: {node: '>= 8.0'} - - dockerode@4.0.2: - resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==} - engines: {node: '>= 8.0'} - dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2: - resolution: {integrity: sha512-xKmVK4ipgVQPJ/uyyrfH9LnaawERRWt8U2UZhdhGfzdL/QU/OpBjuhoIbFCv1Uy6qXV4nIiJ6Nw4MBC4HmXf1g==} - engines: {node: '>=18'} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - enumify@2.0.0: - resolution: {integrity: sha512-hpyRdixXrBdr1sZOWH/WKBleMtHWVbM+DyVa0OqKQnKEw6x0TuUNYjcWKlp5/+tdiOsbgYiaZ/pYUeMake4k8A==} - esm-env@1.1.4: resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} @@ -607,12 +478,6 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -633,17 +498,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hono@4.6.11: - resolution: {integrity: sha512-f0LwJQFKdUUrCUAVowxSvNCjyzI7ZLt8XWYU/EApyeq5FfOvHFarBaE5rjU9HTNFk4RI0FkdB2edb3p/7xZjzQ==} - engines: {node: '>=16.9.0'} - humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -651,19 +509,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inquirer@10.2.2: resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} engines: {node: '>=18'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -676,19 +525,10 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - js-tiktoken@1.0.15: resolution: {integrity: sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==} @@ -711,9 +551,6 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - langchain@0.2.20: resolution: {integrity: sha512-tbels6Rr524iMM3VOQ4aTGnEOOjAA1BQuBR8u/8gJ2yT48lMtIQRAN32Y4KVjKK+hEWxHHlmLBrtgLpTphFjNA==} engines: {node: '>=18'} @@ -905,10 +742,6 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -916,9 +749,6 @@ packages: magic-string@0.30.13: resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -927,9 +757,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -941,9 +768,6 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - nan@2.22.0: - resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} - nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -971,16 +795,6 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -997,10 +811,6 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - openapi-typescript-fetch@1.1.3: - resolution: {integrity: sha512-smLZPck4OkKMNExcw8jMgrMOGgVGx2N/s6DbKL2ftNl77g5HfoGpZGFy79RBzU/EkaO0OZpwBnslfdBfh7ZcWg==} - engines: {node: '>= 12.0.0', npm: '>= 7.0.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -1021,23 +831,9 @@ packages: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - - path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - platform@1.3.6: - resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -1045,9 +841,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - pusher-js@8.4.0-rc2: resolution: {integrity: sha512-d87GjOEEl9QgO5BWmViSqW0LOzPvybvX6WA9zLUstNdB57jVJuR27zHkRnrav2a3+zAMlHbP2Og8wug+rG8T+g==} @@ -1055,14 +848,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - resolve-package-path@4.0.3: - resolution: {integrity: sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==} - engines: {node: '>= 12'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -1074,13 +859,6 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -1096,35 +874,19 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - split-ca@1.0.1: - resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} - - ssh2@1.16.0: - resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} - engines: {node: '>=10.16.0'} - sswr@2.1.0: resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1150,16 +912,6 @@ packages: peerDependencies: vue: '>=3.2.26 < 4' - tar-fs@2.0.1: - resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - throttleit@2.1.0: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} @@ -1171,30 +923,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -1222,16 +953,10 @@ packages: resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==} engines: {node: '>=6.14.2'} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -1250,21 +975,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} - - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} - engines: {node: '>= 12.0.0'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -1282,10 +996,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -1400,51 +1110,12 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@balena/dockerignore@1.0.2': {} - - '@colors/colors@1.6.0': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@dabh/diagnostics@2.0.3': - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - - '@e2b/code-interpreter@0.0.8(bufferutil@4.0.8)(utf-8-validate@6.0.5)': - dependencies: - e2b: 0.16.2 - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@e2b/sdk@0.16.2': - dependencies: - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) - normalize-path: 3.0.0 - openapi-typescript-fetch: 1.1.3 - path-browserify: 1.0.1 - platform: 1.3.6 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.5 - - '@faker-js/faker@8.4.1': {} + '@cloudflare/workers-types@4.20241230.0': {} '@hey-api/client-axios@0.2.10(axios@1.7.7)': dependencies: axios: 1.7.7 - '@hono/node-server@1.13.7(hono@4.6.11)': - dependencies: - hono: 4.6.11 - '@inquirer/checkbox@2.5.0': dependencies: '@inquirer/core': 9.2.1 @@ -1562,11 +1233,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/core@0.2.36(openai@4.73.0(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 @@ -1602,14 +1268,6 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - '@types/diff-match-patch@1.0.36': {} '@types/estree@1.0.6': {} @@ -1620,7 +1278,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 18.19.64 + '@types/node': 22.9.1 form-data: 4.0.1 '@types/node@18.19.64': @@ -1633,8 +1291,6 @@ snapshots: '@types/retry@0.12.0': {} - '@types/triple-beam@1.3.5': {} - '@types/uuid@10.0.0': {} '@types/wrap-ansi@3.0.0': {} @@ -1701,10 +1357,6 @@ snapshots: dependencies: acorn: 8.14.0 - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.0 - acorn@8.14.0: {} agentkeepalive@4.5.0: @@ -1748,18 +1400,10 @@ snapshots: ansi-styles@5.2.0: {} - arg@4.1.3: {} - argparse@2.0.1: {} aria-query@5.3.2: {} - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - async@3.2.6: {} - asynckit@0.4.0: {} axios@1.7.7: @@ -1774,31 +1418,13 @@ snapshots: base64-js@1.5.1: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - bufferutil@4.0.8: dependencies: node-gyp-build: 4.8.4 optional: true - buildcheck@0.0.6: - optional: true - camelcase@6.3.0: {} chalk@4.1.2: @@ -1810,8 +1436,6 @@ snapshots: chardet@0.7.0: {} - chownr@1.1.4: {} - cli-progress@3.12.0: dependencies: string-width: 4.2.3 @@ -1820,35 +1444,12 @@ snapshots: client-only@0.0.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - - colors@1.4.0: {} - - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -1857,124 +1458,31 @@ snapshots: commander@12.1.0: {} - composio-core@0.2.9-8(@types/node@22.9.1)(bufferutil@4.0.8)(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(typescript@5.6.3)(utf-8-validate@6.0.5)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)): + composio-core@0.5.0-rc.6(@ai-sdk/openai@0.0.36(zod@3.23.8))(@cloudflare/workers-types@4.20241230.0)(@langchain/core@0.2.36(openai@4.73.0(zod@3.23.8)))(@langchain/openai@0.2.11)(ai@3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8))(langchain@0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)))(openai@4.73.0(zod@3.23.8)): dependencies: '@ai-sdk/openai': 0.0.36(zod@3.23.8) - '@e2b/code-interpreter': 0.0.8(bufferutil@4.0.8)(utf-8-validate@6.0.5) - '@e2b/sdk': 0.16.2 - '@faker-js/faker': 8.4.1 + '@cloudflare/workers-types': 4.20241230.0 '@hey-api/client-axios': 0.2.10(axios@1.7.7) - '@hono/node-server': 1.13.7(hono@4.6.11) '@langchain/core': 0.2.36(openai@4.73.0(zod@3.23.8)) '@langchain/openai': 0.2.11 ai: 3.4.33(openai@4.73.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.7))(svelte@5.2.7)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) axios: 1.7.7 chalk: 4.1.2 cli-progress: 3.12.0 - colors: 1.4.0 commander: 12.1.0 - dockerode: 4.0.2 - e2b: 0.16.2 - enumify: 2.0.0 - hono: 4.6.11 inquirer: 10.2.2 langchain: 0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) open: 8.4.2 openai: 4.73.0(zod@3.23.8) pusher-js: 8.4.0-rc2 - resolve-package-path: 4.0.3 - ts-node: 10.9.2(@types/node@22.9.1)(typescript@5.6.3) uuid: 10.0.0 - winston: 3.17.0 zod: 3.23.8 zod-to-json-schema: 3.23.5(zod@3.23.8) transitivePeerDependencies: - - '@aws-sdk/client-s3' - - '@aws-sdk/client-sagemaker-runtime' - - '@aws-sdk/client-sfn' - - '@aws-sdk/credential-provider-node' - - '@azure/storage-blob' - - '@browserbasehq/sdk' - - '@gomomento/sdk' - - '@gomomento/sdk-core' - - '@gomomento/sdk-web' - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - '@mendable/firecrawl-js' - - '@notionhq/client' - - '@pinecone-database/pinecone' - - '@supabase/supabase-js' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - '@vercel/kv' - - '@xata.io/client' - - apify-client - - assemblyai - - bufferutil - - cheerio - - chromadb - - convex - - couchbase - - d3-dsv - debug - - encoding - - epub2 - - faiss-node - - fast-xml-parser - - handlebars - - html-to-text - - ignore - - ioredis - - jsdom - - mammoth - - mongodb - - node-llama-cpp - - notion-to-md - - officeparser - - pdf-parse - - peggy - - playwright - - puppeteer - - pyodide - - react - - redis - - solid-js - - sonix-speech-recognition - - srt-parser-2 - - sswr - - supports-color - - svelte - - typeorm - - typescript - - utf-8-validate - - vue - - weaviate-ts-client - - web-auth-library - - ws - - youtube-transcript - - youtubei.js - - cpu-features@0.0.10: - dependencies: - buildcheck: 0.0.6 - nan: 2.22.0 - optional: true - - create-require@1.1.1: {} csstype@3.1.3: {} - debug@4.3.7: - dependencies: - ms: 2.1.3 - decamelize@1.2.0: {} define-lazy-prop@2.0.0: {} @@ -1983,51 +1491,12 @@ snapshots: diff-match-patch@1.0.5: {} - diff@4.0.2: {} - - docker-modem@5.0.3: - dependencies: - debug: 4.3.7 - readable-stream: 3.6.2 - split-ca: 1.0.1 - ssh2: 1.16.0 - transitivePeerDependencies: - - supports-color - - dockerode@4.0.2: - dependencies: - '@balena/dockerignore': 1.0.2 - docker-modem: 5.0.3 - tar-fs: 2.0.1 - transitivePeerDependencies: - - supports-color - dotenv@16.4.5: {} - e2b@0.16.2: - dependencies: - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)) - normalize-path: 3.0.0 - openapi-typescript-fetch: 1.1.3 - path-browserify: 1.0.1 - platform: 1.3.6 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.5 - emoji-regex@8.0.0: {} - enabled@2.0.0: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - entities@4.5.0: {} - enumify@2.0.0: {} - esm-env@1.1.4: {} esrap@1.2.2: @@ -2049,10 +1518,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fecha@4.2.3: {} - - fn.name@1.1.0: {} - follow-redirects@1.15.9: {} form-data-encoder@1.7.2: {} @@ -2068,12 +1533,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - fs-constants@1.0.0: {} - has-flag@4.0.0: {} - hono@4.6.11: {} - humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -2082,10 +1543,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} - - inherits@2.0.4: {} - inquirer@10.2.2: dependencies: '@inquirer/core': 9.2.1 @@ -2097,8 +1554,6 @@ snapshots: run-async: 3.0.0 rxjs: 7.8.1 - is-arrayish@0.3.2: {} - is-docker@2.2.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2107,16 +1562,10 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-stream@2.0.1: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)): - dependencies: - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) - js-tiktoken@1.0.15: dependencies: base64-js: 1.5.1 @@ -2137,8 +1586,6 @@ snapshots: jsonpointer@5.0.1: {} - kuler@2.0.0: {} - langchain@0.2.20(axios@1.7.7)(openai@4.73.0(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5)): dependencies: '@langchain/core': 0.2.36(openai@4.73.0(zod@3.23.8)) @@ -2175,15 +1622,6 @@ snapshots: locate-character@3.0.0: {} - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -2192,25 +1630,18 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-error@1.3.6: {} - mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mkdirp-classic@0.5.3: {} - ms@2.1.3: {} mustache@4.2.0: {} mute-stream@1.0.0: {} - nan@2.22.0: - optional: true - nanoid@3.3.6: {} nanoid@3.3.7: {} @@ -2224,16 +1655,6 @@ snapshots: node-gyp-build@4.8.4: optional: true - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -2256,8 +1677,6 @@ snapshots: openapi-types@12.1.3: {} - openapi-typescript-fetch@1.1.3: {} - os-tmpdir@1.0.2: {} p-finally@1.0.0: {} @@ -2276,18 +1695,8 @@ snapshots: dependencies: p-finally: 1.0.0 - path-browserify@1.0.1: {} - - path-root-regex@0.1.2: {} - - path-root@0.1.1: - dependencies: - path-root-regex: 0.1.2 - picocolors@1.1.1: {} - platform@1.3.6: {} - postcss@8.4.49: dependencies: nanoid: 3.3.7 @@ -2296,11 +1705,6 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - pusher-js@8.4.0-rc2: dependencies: tweetnacl: 1.0.3 @@ -2309,16 +1713,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - resolve-package-path@4.0.3: - dependencies: - path-root: 0.1.1 - retry@0.13.1: {} run-async@3.0.0: {} @@ -2327,10 +1721,6 @@ snapshots: dependencies: tslib: 2.8.1 - safe-buffer@5.2.1: {} - - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} secure-json-parse@2.7.0: {} @@ -2339,39 +1729,19 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - source-map-js@1.2.1: {} - split-ca@1.0.1: {} - - ssh2@1.16.0: - dependencies: - asn1: 0.2.6 - bcrypt-pbkdf: 1.0.2 - optionalDependencies: - cpu-features: 0.0.10 - nan: 2.22.0 - sswr@2.1.0(svelte@5.2.7): dependencies: svelte: 5.2.7 swrev: 4.0.0 - stack-trace@0.0.10: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2408,23 +1778,6 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.6.3) - tar-fs@2.0.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - text-hex@1.0.0: {} - throttleit@2.1.0: {} tmp@0.0.33: @@ -2433,35 +1786,14 @@ snapshots: tr46@0.0.3: {} - triple-beam@1.4.1: {} - - ts-node@10.9.2(@types/node@22.9.1)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.9.1 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - tslib@2.8.1: {} - tweetnacl@0.14.5: {} - tweetnacl@1.0.3: {} type-fest@0.21.3: {} - typescript@5.6.3: {} + typescript@5.6.3: + optional: true undici-types@5.26.5: {} @@ -2476,12 +1808,8 @@ snapshots: node-gyp-build: 4.8.4 optional: true - util-deprecate@1.0.2: {} - uuid@10.0.0: {} - v8-compile-cache-lib@3.0.1: {} - vue@3.5.13(typescript@5.6.3): dependencies: '@vue/compiler-dom': 3.5.13 @@ -2501,43 +1829,20 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.17.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrappy@1.0.2: {} - ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.5 + optional: true yaml@2.6.1: {} - yn@3.1.1: {} - yoctocolors-cjs@2.1.2: {} zimmerframe@1.1.2: {} diff --git a/js/package.dist.json b/js/package.dist.json index db86eb6c7e3..89077d6f3db 100644 --- a/js/package.dist.json +++ b/js/package.dist.json @@ -1,9 +1,15 @@ { "name": "composio-core", - "version": "0.5.0-rc.1", + "version": "0.5.0", "description": "", "main": "index.js", "scripts": {}, + "browser": { + "fs": false, + "os": false, + "path": false, + "child_process": false + }, "bin": { "composio-js": "./cli/index", "composio": "./cli/index" @@ -23,7 +29,6 @@ }, "dependencies": { "chalk": "^4", - "winston": "^3.13.1", "zod": "^3.23.8", "uuid": "^10.0.0", "zod-to-json-schema": "^3.23.2", @@ -32,7 +37,8 @@ "commander": "^12.1.0", "cli-progress": "^3.12.0", "inquirer": "^10.2.2", - "open": "^8.4.0" + "open": "^8.4.0", + "@hey-api/client-axios": "^0.2.3" }, "devDependencies": {}, "publishConfig": { diff --git a/js/package.json b/js/package.json index 7a09a8f3804..a3f45c05bbb 100644 --- a/js/package.json +++ b/js/package.json @@ -1,8 +1,14 @@ { "name": "composio-core", - "version": "0.5.0-rc.1", + "version": "0.5.0", "description": "", "main": "dist/index.js", + "browser": { + "fs": false, + "os": false, + "path": false, + "child_process": false + }, "scripts": { "test": "jest --testMatch=\"**/*.spec.ts\"", "test:watch": "jest --testMatch=\"**/*.spec.ts\" --watch", @@ -28,26 +34,26 @@ "author": "Utkarsh Dixit ", "license": "ISC", "peerDependencies": { - "ai": "^3.2.22", "@ai-sdk/openai": "^0.0.36", "@cloudflare/workers-types": "^4.20240718.0", "@langchain/core": "^0.2.18", "@langchain/openai": "^0.2.5", + "ai": "^3.2.22", "langchain": "^0.2.11", "openai": "^4.50.0" }, "dependencies": { - "chalk": "^4", - "winston": "^3.13.1", - "zod": "^3.23.8", - "uuid": "^10.0.0", - "zod-to-json-schema": "^3.23.2", "axios": "^1.7.2", - "pusher-js": "8.4.0-rc2", - "commander": "^12.1.0", + "chalk": "^4", "cli-progress": "^3.12.0", + "commander": "^12.1.0", "inquirer": "^10.2.2", - "open": "^8.4.0" + "open": "^8.4.0", + "pusher-js": "8.4.0-rc2", + "rollup-plugin-visualizer": "^5.13.1", + "uuid": "^10.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.2" }, "devDependencies": { "@eslint/js": "^9.16.0", diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index 0a4c5589760..102fe296f88 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -50,12 +50,12 @@ importers: pusher-js: specifier: 8.4.0-rc2 version: 8.4.0-rc2 + rollup-plugin-visualizer: + specifier: ^5.13.1 + version: 5.13.1(rollup@4.28.1) uuid: specifier: ^10.0.0 version: 10.0.0 - winston: - specifier: ^3.13.1 - version: 3.14.0 zod: specifier: ^3.23.8 version: 3.23.8 @@ -2969,6 +2969,19 @@ packages: peerDependencies: rollup: ^2.0.0 + rollup-plugin-visualizer@5.13.1: + resolution: {integrity: sha512-vMg8i6BprL8aFm9DKvL2c8AwS8324EgymYQo9o6E26wgVvwMhsJxS37aNL6ZsU7X9iAcMYwdME7gItLfG5fwJg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + rollup@4.28.1: resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -6508,6 +6521,15 @@ snapshots: serialize-javascript: 4.0.0 terser: 5.31.1 + rollup-plugin-visualizer@5.13.1(rollup@4.28.1): + dependencies: + open: 8.4.2 + picomatch: 4.0.2 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.28.1 + rollup@4.28.1: dependencies: '@types/estree': 1.0.6 diff --git a/js/rollup.config.mjs b/js/rollup.config.mjs index 748d3bceb0c..981653ff94a 100644 --- a/js/rollup.config.mjs +++ b/js/rollup.config.mjs @@ -3,7 +3,9 @@ import resolve from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import dts from 'rollup-plugin-dts'; import json from '@rollup/plugin-json'; // Import the @rollup/plugin-json to handle JSON files +import { visualizer } from 'rollup-plugin-visualizer'; // Import the bundle analyzer plugin +const IS_VISUALIZE_BUNDLE = process.env.IS_VISUALIZE_BUNDLE === 'true'; const generateBundleAndTypeBundles = (file) => { return [{ input: `src/${file}.ts`, @@ -16,7 +18,10 @@ const generateBundleAndTypeBundles = (file) => { }, ], plugins: [ - resolve(), // Resolve node_modules + // resolve({ + // extensions: ['.ts', '.js', '.json', '.node',"node_modules"], + // resolveOnly: [/node_modules/] + // }), // Resolve node_modules commonjs(), // Convert CommonJS modules to ES6 typescript({ tsconfig: './tsconfig.json', @@ -25,10 +30,10 @@ const generateBundleAndTypeBundles = (file) => { module: 'esnext' // Ensure TypeScript produces ES Modules } }), - json() // Add the json plugin to handle JSON files + json(), // Add the json plugin to handle JSON files + ...(IS_VISUALIZE_BUNDLE ? [visualizer({ filename: `dist/${file}-bundle-analysis.html` })] : []) // Add the bundle analyzer plugin ], external: [ - // List any external dependencies here ] }, // // Type Definitions @@ -36,7 +41,6 @@ const generateBundleAndTypeBundles = (file) => { input: `src/${file}.ts`, output: { file: `dist/${file}.d.ts`, // Set the output directory for multiple chunks - }, plugins: [dts()] }] @@ -51,7 +55,10 @@ export default [ sourcemap: false, }, plugins: [ - resolve(), // Resolve node_modules + resolve({ + extensions: ['.ts', '.js', '.json', '.node',"node_modules"], + resolveOnly: [/node_modules/] + }), // Resolve node_modules commonjs(), // Convert CommonJS modules to ES6 typescript({ tsconfig: './tsconfig.json', diff --git a/js/src/constants.js b/js/src/constants.js index e3b2d479fa0..3c47d22806b 100644 --- a/js/src/constants.js +++ b/js/src/constants.js @@ -8,7 +8,7 @@ const ACTIONS = { // actions list end here }; -const COMPOSIO_VERSION = `0.4.6`; +const COMPOSIO_VERSION = `0.5.0`; module.exports = { APPS, diff --git a/js/src/constants.ts b/js/src/constants.ts index 11c8ca70dc0..b6af658f935 100644 --- a/js/src/constants.ts +++ b/js/src/constants.ts @@ -8,4 +8,6 @@ const ACTIONS = { // actions list end here }; -export { ACTIONS, APPS }; +const COMPOSIO_VERSION = `0.5.0`; + +export { ACTIONS, APPS, COMPOSIO_VERSION }; diff --git a/js/src/frameworks/cloudflare.ts b/js/src/frameworks/cloudflare.ts index a879f357a94..3cdca8be406 100644 --- a/js/src/frameworks/cloudflare.ts +++ b/js/src/frameworks/cloudflare.ts @@ -33,12 +33,12 @@ export class CloudflareToolSet extends BaseComposioToolSet { entityId?: string; } = {} ) { - super( - config.apiKey || null, - config.baseUrl || COMPOSIO_BASE_URL, - CloudflareToolSet.FRAMEWORK_NAME, - config.entityId || CloudflareToolSet.DEFAULT_ENTITY_ID - ); + super({ + apiKey: config.apiKey || null, + baseUrl: config.baseUrl || COMPOSIO_BASE_URL, + runtime: null, + entityId: config.entityId || CloudflareToolSet.DEFAULT_ENTITY_ID, + }); } /** diff --git a/js/src/frameworks/langchain.ts b/js/src/frameworks/langchain.ts index a4cb4fcf081..4eeae1ecc7a 100644 --- a/js/src/frameworks/langchain.ts +++ b/js/src/frameworks/langchain.ts @@ -31,12 +31,12 @@ export class LangchainToolSet extends BaseComposioToolSet { runtime?: string; } = {} ) { - super( - config.apiKey || null, - config.baseUrl || COMPOSIO_BASE_URL, - config?.runtime || LangchainToolSet.FRAMEWORK_NAME, - config.entityId || LangchainToolSet.DEFAULT_ENTITY_ID - ); + super({ + apiKey: config.apiKey || null, + baseUrl: config.baseUrl || COMPOSIO_BASE_URL, + runtime: config?.runtime || null, + entityId: config.entityId || LangchainToolSet.DEFAULT_ENTITY_ID, + }); } private _wrapTool( diff --git a/js/src/frameworks/openai.ts b/js/src/frameworks/openai.ts index 522a7fe7716..758dd9b748b 100644 --- a/js/src/frameworks/openai.ts +++ b/js/src/frameworks/openai.ts @@ -32,12 +32,12 @@ export class OpenAIToolSet extends BaseComposioToolSet { entityId?: string; } = {} ) { - super( - config.apiKey || null, - config.baseUrl || COMPOSIO_BASE_URL, - OpenAIToolSet.FRAMEWORK_NAME, - config.entityId || OpenAIToolSet.DEFAULT_ENTITY_ID - ); + super({ + apiKey: config.apiKey || null, + baseUrl: config.baseUrl || COMPOSIO_BASE_URL, + runtime: OpenAIToolSet.FRAMEWORK_NAME, + entityId: config.entityId || OpenAIToolSet.DEFAULT_ENTITY_ID, + }); } async getTools( diff --git a/js/src/frameworks/vercel.ts b/js/src/frameworks/vercel.ts index 6a75cec9bce..2ebda12b7c9 100644 --- a/js/src/frameworks/vercel.ts +++ b/js/src/frameworks/vercel.ts @@ -29,12 +29,12 @@ export class VercelAIToolSet extends BaseComposioToolSet { entityId?: string; } = {} ) { - super( - config.apiKey || null, - config.baseUrl || null, - "vercel-ai", - config.entityId || "default" - ); + super({ + apiKey: config.apiKey || null, + baseUrl: config.baseUrl || null, + runtime: "vercel-ai", + entityId: config.entityId || "default", + }); } private generateVercelTool(schema: RawActionData) { diff --git a/js/src/index.ts b/js/src/index.ts index df52394726d..de301a49998 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -3,6 +3,7 @@ import { LangchainToolSet } from "./frameworks/langchain"; import { LangGraphToolSet } from "./frameworks/langgraph"; import { OpenAIToolSet } from "./frameworks/openai"; import { VercelAIToolSet } from "./frameworks/vercel"; +import { ComposioToolSet } from "./sdk/base.toolset"; import { Composio } from "./sdk/index"; import { ConnectionRequest } from "./sdk/models/connectedAccounts"; import { ComposioError } from "./sdk/utils/errors/src/composioError"; @@ -21,6 +22,7 @@ export { Composio, // Classes ComposioError, + ComposioToolSet, ConnectionRequest, LangGraphToolSet, LangchainToolSet, diff --git a/js/src/sdk/actionRegistry.ts b/js/src/sdk/actionRegistry.ts index 85348fd9fd7..1d01e5b7193 100644 --- a/js/src/sdk/actionRegistry.ts +++ b/js/src/sdk/actionRegistry.ts @@ -162,6 +162,7 @@ export class ActionRegistry { COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, { message: "Callback must be a function", + description: "Please provide a valid callback function", } ); } diff --git a/js/src/sdk/base.toolset.spec.ts b/js/src/sdk/base.toolset.spec.ts index d1e138bd2d5..ad7520ef2db 100644 --- a/js/src/sdk/base.toolset.spec.ts +++ b/js/src/sdk/base.toolset.spec.ts @@ -9,10 +9,12 @@ describe("ComposioToolSet class tests", () => { const testConfig = getTestConfig(); beforeAll(() => { - toolset = new ComposioToolSet( - testConfig.COMPOSIO_API_KEY, - testConfig.BACKEND_HERMES_URL - ); + toolset = new ComposioToolSet({ + apiKey: testConfig.COMPOSIO_API_KEY, + baseUrl: testConfig.BACKEND_HERMES_URL, + runtime: "composio-ai", + entityId: "default", + }); }); it("should create a ComposioToolSet instance", async () => { diff --git a/js/src/sdk/base.toolset.ts b/js/src/sdk/base.toolset.ts index d18f291971f..e8455d185ea 100644 --- a/js/src/sdk/base.toolset.ts +++ b/js/src/sdk/base.toolset.ts @@ -11,22 +11,41 @@ import { import type { Optional, Sequence } from "../types/util"; import { getEnvVariable } from "../utils/shared"; import { ActionRegistry, CreateActionOptions } from "./actionRegistry"; -import { COMPOSIO_BASE_URL } from "./client/core/OpenAPI"; import { ActionExecutionResDto } from "./client/types.gen"; -import { ActionExecuteResponse } from "./models/actions"; +import { ActionExecuteResponse, Actions } from "./models/actions"; +import { ActiveTriggers } from "./models/activeTriggers"; +import { Apps } from "./models/apps"; +import { BackendClient } from "./models/backendClient"; +import { ConnectedAccounts } from "./models/connectedAccounts"; +import { Integrations } from "./models/integrations"; +import { Triggers } from "./models/triggers"; import { getUserDataJson } from "./utils/config"; +import { CEG } from "./utils/error"; +import { COMPOSIO_SDK_ERROR_CODES } from "./utils/errors/src/constants"; import { fileInputProcessor, fileResponseProcessor, fileSchemaProcessor, } from "./utils/processor/file"; -export type ExecuteActionParams = z.infer; +export type ExecuteActionParams = z.infer & { + // @deprecated + action?: string; + actionName?: string; +}; export class ComposioToolSet { client: Composio; apiKey: string; runtime: string | null; - entityId: string; + entityId: string = "default"; + + backendClient: BackendClient; + connectedAccounts: ConnectedAccounts; + apps: Apps; + actions: Actions; + triggers: Triggers; + integrations: Integrations; + activeTriggers: ActiveTriggers; userActionRegistry: ActionRegistry; @@ -46,12 +65,25 @@ export class ComposioToolSet { schema?: TSchemaProcessor; } = {}; - constructor( - apiKey: string | null = null, - baseUrl: string | null = COMPOSIO_BASE_URL, - runtime: string | null = null, - _entityId: string = "default" - ) { + /** + * Creates a new instance of ComposioToolSet + * @param {Object} config - Configuration object + * @param {string|null} config.apiKey - API key for authentication + * @param {string|null} config.baseUrl - Base URL for API requests + * @param {string|null} config.runtime - Runtime environment + * @param {string} config.entityId - Entity ID for operations + */ + constructor({ + apiKey, + baseUrl, + runtime, + entityId, + }: { + apiKey?: string | null; + baseUrl?: string | null; + runtime?: string | null; + entityId?: string; + } = {}) { const clientApiKey: string | undefined = apiKey || getEnvVariable("COMPOSIO_API_KEY") || @@ -62,9 +94,21 @@ export class ComposioToolSet { baseUrl: baseUrl || undefined, runtime: runtime as string, }); + + this.runtime = runtime || null; + this.backendClient = this.client.backendClient; + this.connectedAccounts = this.client.connectedAccounts; + this.apps = this.client.apps; + this.actions = this.client.actions; + this.triggers = this.client.triggers; + this.integrations = this.client.integrations; + this.activeTriggers = this.client.activeTriggers; + this.userActionRegistry = new ActionRegistry(this.client); - this.runtime = runtime; - this.entityId = _entityId; + + if (entityId) { + this.entityId = entityId; + } } async getActionsSchema( @@ -143,16 +187,36 @@ export class ComposioToolSet { .then((actions) => actions.length > 0); } + async getEntity(entityId: string) { + return this.client.getEntity(entityId); + } + async executeAction( functionParams: ExecuteActionParams ): Promise { const { action, params: inputParams = {}, - entityId = "default", + entityId = this.entityId, nlaText = "", connectedAccountId, - } = ZExecuteActionParams.parse(functionParams); + } = ZExecuteActionParams.parse({ + action: functionParams.actionName || functionParams.action, + params: functionParams.params, + entityId: functionParams.entityId, + nlaText: functionParams.nlaText, + connectedAccountId: functionParams.connectedAccountId, + }); + + if (!entityId && !connectedAccountId) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.SDK.NO_CONNECTED_ACCOUNT_FOUND, + { + message: `No entityId or connectedAccountId provided`, + description: `Please provide either entityId or connectedAccountId`, + } + ); + } let params = (inputParams as Record) || {}; @@ -195,6 +259,7 @@ export class ComposioToolSet { actionName: action, params: params, text: nlaText, + connectedAccountId: connectedAccountId, }); return this.processResponse(data, { diff --git a/js/src/sdk/client/services.gen.ts b/js/src/sdk/client/services.gen.ts index 3f0cfb74229..9236468e2bb 100644 --- a/js/src/sdk/client/services.gen.ts +++ b/js/src/sdk/client/services.gen.ts @@ -109,6 +109,10 @@ import type { InviteMemberData, InviteMemberError, InviteMemberResponse, + ListActionEnums1Error, + ListActionEnums1Response, + ListActionEnumsError, + ListActionEnumsResponse, ListActionTagsData, ListActionTagsError, ListActionTagsResponse, @@ -124,11 +128,15 @@ import type { ListApiKeysResponse, ListAppCategoriesError, ListAppCategoriesResponse, + ListAppEnumsError, + ListAppEnumsResponse, ListConnectionsData, ListConnectionsError, ListConnectionsResponse, ListMembersError, ListMembersResponse, + ListTriggerEnumsError, + ListTriggerEnumsResponse, ListTriggersData, ListTriggersError, ListTriggersResponse, @@ -368,6 +376,23 @@ export class AppsService { }); } + /** + * List app enums + * List app enums + */ + public static listAppEnums( + options?: Options + ) { + return (options?.client ?? client).get< + ListAppEnumsResponse, + ListAppEnumsError, + ThrowOnError + >({ + ...options, + url: "/api/v1/apps/list/enums", + }); + } + /** * List apps * List all apps based on the given filters, if any. This will return all available apps if no filters are provided. @@ -490,6 +515,178 @@ export class IntegrationsService { } } +export class ActionsService { + /** + * List action enums + * List action enums + */ + public static listActionEnums( + options?: Options + ) { + return (options?.client ?? client).get< + ListActionEnumsResponse, + ListActionEnumsError, + ThrowOnError + >({ + ...options, + url: "/api/v1/actions/list/enums", + }); + } + + /** + * List action tags + * List all the action tags available in composio + */ + public static listActionTags( + options?: Options + ) { + return (options?.client ?? client).get< + ListActionTagsResponse, + ListActionTagsError, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/list/tags", + }); + } + + /** + * List action enums + * List action enums + */ + public static listActionEnums1( + options?: Options + ) { + return (options?.client ?? client).get< + ListActionEnums1Response, + ListActionEnums1Error, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/list/enums", + }); + } + + /** + * List actions with complete details + * List and filter all the actions available in composio, with all the details needed for manual action execution or through function-calling. + */ + public static listActionsV2( + options?: Options + ) { + return (options?.client ?? client).get< + ListActionsV2Response, + ListActionsV2Error, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions", + }); + } + + /** + * List actions + * Retrieve a list of all actions based on query parameters. + */ + public static listActionsMinimalV2( + options?: Options + ) { + return (options?.client ?? client).get< + ListActionsMinimalV2Response, + ListActionsMinimalV2Error, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/list/all", + }); + } + + /** + * Execute an action + * Execute an action. Support both connected account and no auth auth. + */ + public static executeActionV2( + options: Options + ) { + return (options?.client ?? client).post< + ExecuteActionV2Response, + ExecuteActionV2Error, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/{actionId}/execute", + }); + } + + /** + * Get action inputs + * Get the inputs for an action with NLA + */ + public static getActionInputsV2( + options: Options + ) { + return (options?.client ?? client).post< + GetActionInputsV2Response, + GetActionInputsV2Error, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/{actionId}/execute/get.inputs", + }); + } + + /** + * Get single action + * Get action details, including the input and response schema. This is very useful for setting upfunction/tool calling with composio actions. + */ + public static getActionV2( + options: Options + ) { + return (options?.client ?? client).get< + GetActionV2Response, + GetActionV2Error, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/{actionId}", + }); + } + + /** + * Execute with HTTP Client + * Use composio as a http client to make request to the connected account service on your behalf, without managing authentication on your side. + */ + public static executeWithHttpClient( + options?: Options + ) { + return (options?.client ?? client).post< + ExecuteWithHttpClientResponse, + ExecuteWithHttpClientError, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/proxy", + }); + } + + /** + * Advanced use case search + * Perform use case search. + */ + public static advancedUseCaseSearch( + options?: Options + ) { + return (options?.client ?? client).get< + AdvancedUseCaseSearchResponse2, + AdvancedUseCaseSearchError, + ThrowOnError + >({ + ...options, + url: "/api/v2/actions/search/advanced", + }); + } +} + export class ConnectionsService { /** * List connections @@ -644,6 +841,23 @@ export class TriggersService { }); } + /** + * List trigger enums + * List trigger enums + */ + public static listTriggerEnums( + options?: Options + ) { + return (options?.client ?? client).get< + ListTriggerEnumsResponse, + ListTriggerEnumsError, + ThrowOnError + >({ + ...options, + url: "/api/v1/triggers/list/enums", + }); + } + /** * Update new webhook * Update isNewWebhook @@ -901,144 +1115,6 @@ export class LogsService { } } -export class ActionsService { - /** - * List action tags - * List all the action tags available in composio - */ - public static listActionTags( - options?: Options - ) { - return (options?.client ?? client).get< - ListActionTagsResponse, - ListActionTagsError, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/list/tags", - }); - } - - /** - * List actions with complete details - * List and filter all the actions available in composio, with all the details needed for manual action execution or through function-calling. - */ - public static listActionsV2( - options?: Options - ) { - return (options?.client ?? client).get< - ListActionsV2Response, - ListActionsV2Error, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions", - }); - } - - /** - * List actions - * Retrieve a list of all actions based on query parameters. - */ - public static listActionsMinimalV2( - options?: Options - ) { - return (options?.client ?? client).get< - ListActionsMinimalV2Response, - ListActionsMinimalV2Error, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/list/all", - }); - } - - /** - * Execute an action - * Execute an action. Support both connected account and no auth auth. - */ - public static executeActionV2( - options: Options - ) { - return (options?.client ?? client).post< - ExecuteActionV2Response, - ExecuteActionV2Error, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/{actionId}/execute", - }); - } - - /** - * Get action inputs - * Get the inputs for an action with NLA - */ - public static getActionInputsV2( - options: Options - ) { - return (options?.client ?? client).post< - GetActionInputsV2Response, - GetActionInputsV2Error, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/{actionId}/execute/get.inputs", - }); - } - - /** - * Get single action - * Get action details, including the input and response schema. This is very useful for setting upfunction/tool calling with composio actions. - */ - public static getActionV2( - options: Options - ) { - return (options?.client ?? client).get< - GetActionV2Response, - GetActionV2Error, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/{actionId}", - }); - } - - /** - * Execute with HTTP Client - * Use composio as a http client to make request to the connected account service on your behalf, without managing authentication on your side. - */ - public static executeWithHttpClient( - options?: Options - ) { - return (options?.client ?? client).post< - ExecuteWithHttpClientResponse, - ExecuteWithHttpClientError, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/proxy", - }); - } - - /** - * Advanced use case search - * Perform use case search. - */ - public static advancedUseCaseSearch( - options?: Options - ) { - return (options?.client ?? client).get< - AdvancedUseCaseSearchResponse2, - AdvancedUseCaseSearchError, - ThrowOnError - >({ - ...options, - url: "/api/v2/actions/search/advanced", - }); - } -} - export class ProjectsService { /** * Create new project diff --git a/js/src/sdk/client/types.gen.ts b/js/src/sdk/client/types.gen.ts index 955307f93b5..ebf1ecfac39 100644 --- a/js/src/sdk/client/types.gen.ts +++ b/js/src/sdk/client/types.gen.ts @@ -3299,6 +3299,10 @@ export type ListAppCategoriesResponse = AppListCategoriesResDTO; export type ListAppCategoriesError = unknown; +export type ListAppEnumsResponse = unknown; + +export type ListAppEnumsError = unknown; + export type GetAppsData = { query?: { additionalFields?: string; @@ -3370,6 +3374,128 @@ export type DeleteConnectorResponse = DeleteRowAPIDTO; export type DeleteConnectorError = unknown; +export type ListActionEnumsResponse = unknown; + +export type ListActionEnumsError = unknown; + +export type ListActionTagsData = { + query?: { + apps?: string; + }; +}; + +export type ListActionTagsResponse = ActionsTagsResponseDTO; + +export type ListActionTagsError = unknown; + +export type ListActionEnums1Response = unknown; + +export type ListActionEnums1Error = unknown; + +export type ListActionsV2Data = { + query?: { + actions?: string; + appNames?: string; + apps?: string; + filterImportantActions?: boolean; + limit?: number; + page?: number; + showAll?: boolean; + showEnabledOnly?: boolean; + tags?: string; + useCase?: string; + usecaseLimit?: number; + }; +}; + +export type ListActionsV2Response = ActionsListResponseDTO; + +export type ListActionsV2Error = unknown; + +export type ListActionsMinimalV2Data = { + query?: { + actions?: string; + apps?: string; + filterImportantActions?: boolean; + limit?: number; + page?: number; + tags?: string; + useCase?: string; + }; +}; + +export type ListActionsMinimalV2Response = ActionsListResponseDTO; + +export type ListActionsMinimalV2Error = BadRequestError; + +export type ExecuteActionV2Data = { + /** + * ActionExecutionReqDTO + */ + body?: ActionExecutionReqDTO; + path: { + actionId: string; + }; +}; + +export type ExecuteActionV2Response = ActionExecutionResDto; + +export type ExecuteActionV2Error = BadRequestError; + +export type GetActionInputsV2Data = { + /** + * ActionGetNLAInputsReqDTO + */ + body?: ActionGetNLAInputsReqDTO; + path: { + actionId: string; + }; +}; + +export type GetActionInputsV2Response = NLAArgumentsResponseDTO; + +export type GetActionInputsV2Error = unknown; + +export type GetActionV2Data = { + path: { + actionId: string; + }; +}; + +export type GetActionV2Response = ActionDetails; + +export type GetActionV2Error = ActionNotFoundError; + +export type ExecuteWithHttpClientData = { + /** + * ActionProxyRequestConfigDTO + */ + body?: ActionProxyRequestConfigDTO; +}; + +export type ExecuteWithHttpClientResponse = ActionExecutionResDto; + +export type ExecuteWithHttpClientError = unknown; + +export type AdvancedUseCaseSearchData = { + /** + * AdvancedUseCaseSearchBodyDTO + */ + body?: AdvancedUseCaseSearchBodyDTO; + query?: { + apps?: string; + filterByAvailableApps?: boolean; + limit?: number; + maxActionsPerTask?: number; + minActionsPerTask?: number; + useCase?: string; + }; +}; + +export type AdvancedUseCaseSearchResponse2 = AdvancedUseCaseSearchResponse; + +export type AdvancedUseCaseSearchError = unknown; + export type ListConnectionsData = { query?: { appNames?: string; @@ -3479,6 +3605,10 @@ export type ListTriggersResponse = Array; export type ListTriggersError = unknown; +export type ListTriggerEnumsResponse = unknown; + +export type ListTriggerEnumsError = unknown; + export type UpdateNewWebhookData = { /** * WehbookNewFormatDTO @@ -3649,120 +3779,6 @@ export type PostLogsResponse = IngestDataResponseDTO; export type PostLogsError = unknown; -export type ListActionTagsData = { - query?: { - apps?: string; - }; -}; - -export type ListActionTagsResponse = ActionsTagsResponseDTO; - -export type ListActionTagsError = unknown; - -export type ListActionsV2Data = { - query?: { - actions?: string; - appNames?: string; - apps?: string; - filterImportantActions?: boolean; - limit?: number; - page?: number; - showAll?: boolean; - showEnabledOnly?: boolean; - tags?: string; - useCase?: string; - usecaseLimit?: number; - }; -}; - -export type ListActionsV2Response = ActionsListResponseDTO; - -export type ListActionsV2Error = unknown; - -export type ListActionsMinimalV2Data = { - query?: { - actions?: string; - apps?: string; - filterImportantActions?: boolean; - limit?: number; - page?: number; - tags?: string; - useCase?: string; - }; -}; - -export type ListActionsMinimalV2Response = ActionsListResponseDTO; - -export type ListActionsMinimalV2Error = BadRequestError; - -export type ExecuteActionV2Data = { - /** - * ActionExecutionReqDTO - */ - body?: ActionExecutionReqDTO; - path: { - actionId: string; - }; -}; - -export type ExecuteActionV2Response = ActionExecutionResDto; - -export type ExecuteActionV2Error = BadRequestError; - -export type GetActionInputsV2Data = { - /** - * ActionGetNLAInputsReqDTO - */ - body?: ActionGetNLAInputsReqDTO; - path: { - actionId: string; - }; -}; - -export type GetActionInputsV2Response = NLAArgumentsResponseDTO; - -export type GetActionInputsV2Error = unknown; - -export type GetActionV2Data = { - path: { - actionId: string; - }; -}; - -export type GetActionV2Response = ActionDetails; - -export type GetActionV2Error = ActionNotFoundError; - -export type ExecuteWithHttpClientData = { - /** - * ActionProxyRequestConfigDTO - */ - body?: ActionProxyRequestConfigDTO; -}; - -export type ExecuteWithHttpClientResponse = ActionExecutionResDto; - -export type ExecuteWithHttpClientError = unknown; - -export type AdvancedUseCaseSearchData = { - /** - * AdvancedUseCaseSearchBodyDTO - */ - body?: AdvancedUseCaseSearchBodyDTO; - query?: { - apps?: string; - filterByAvailableApps?: boolean; - limit?: number; - maxActionsPerTask?: number; - minActionsPerTask?: number; - useCase?: string; - }; -}; - -export type AdvancedUseCaseSearchResponse2 = AdvancedUseCaseSearchResponse; - -export type AdvancedUseCaseSearchError = unknown; - export type CreateProjectData = { /** * ProjectReqDTO diff --git a/js/src/sdk/index.spec.ts b/js/src/sdk/index.spec.ts index c28a187b9be..4e46a66295a 100644 --- a/js/src/sdk/index.spec.ts +++ b/js/src/sdk/index.spec.ts @@ -28,11 +28,9 @@ describe("Basic SDK spec suite", () => { it("should handle 404 error gracefully", async () => { const mock = new AxiosMockAdapter(axiosClient.instance); const mockError = { - error: { - type: "NotFoundError", - name: "AppNotFoundError", - message: "Not found", - }, + type: "NotFoundError", + name: "AppNotFoundError", + message: "Not found", }; mock.onGet("/api/v1/apps").reply(404, mockError); @@ -47,8 +45,8 @@ describe("Basic SDK spec suite", () => { expect(e.errorId).toBeDefined(); expect(e.name).toBe("ComposioError"); expect(e.possibleFix).toBe(e.possibleFix); - expect(e.message).toContain(mockError.error.message); - expect(e.message).toContain(mockError.error.name); + expect(e.message).toContain(mockError.message); + expect(e.message).toContain(mockError.name); } else { throw e; } @@ -60,11 +58,9 @@ describe("Basic SDK spec suite", () => { it("should handle 400 error gracefully", async () => { const mock = new AxiosMockAdapter(axiosClient.instance); mock.onGet("/api/v1/apps").reply(400, { - error: { - type: "BadRequestError", - name: "InvalidRequestError", - message: "Invalid request for apps", - }, + type: "BadRequestError", + name: "InvalidRequestError", + message: "Invalid request for apps", }); const client = new Composio({ apiKey: COMPOSIO_API_KEY }); @@ -84,7 +80,11 @@ describe("Basic SDK spec suite", () => { it("should handle 500 and 502 error gracefully, and without backend fix", async () => { const mock = new AxiosMockAdapter(axiosClient.instance); - mock.onGet("/api/v1/apps").reply(500, { detail: "Internal Server Error" }); + mock.onGet("/api/v1/apps").reply(500, { + type: "InternalServerError", + name: "ServerError", + message: "Internal Server Error", + }); const client = new Composio({ apiKey: COMPOSIO_API_KEY }); try { await client.apps.list(); diff --git a/js/src/sdk/index.ts b/js/src/sdk/index.ts index 26c435e7027..2e8287b365b 100644 --- a/js/src/sdk/index.ts +++ b/js/src/sdk/index.ts @@ -1,5 +1,11 @@ import axios from "axios"; import { z } from "zod"; +import { COMPOSIO_VERSION } from "../constants"; +import { + ZGetExpectedParamsForUserParams, + ZGetExpectedParamsRes, +} from "../types/composio"; +import { getUUID } from "../utils/common"; import logger from "../utils/logger"; import { Entity } from "./models/Entity"; import { Actions } from "./models/actions"; @@ -9,22 +15,15 @@ import { BackendClient } from "./models/backendClient"; import { ConnectedAccounts } from "./models/connectedAccounts"; import { Integrations } from "./models/integrations"; import { Triggers } from "./models/triggers"; +import { ZAuthMode } from "./types/integration"; import ComposioSDKContext from "./utils/composioContext"; import { getSDKConfig } from "./utils/config"; import { CEG } from "./utils/error"; import { COMPOSIO_SDK_ERROR_CODES } from "./utils/errors/src/constants"; import { isNewerVersion } from "./utils/other"; -import { getPackageJsonDir } from "./utils/projectUtils"; import { TELEMETRY_LOGGER } from "./utils/telemetry"; import { TELEMETRY_EVENTS } from "./utils/telemetry/events"; -import { - ZGetExpectedParamsForUserParams, - ZGetExpectedParamsRes, -} from "../types/composio"; -import { getUUID } from "../utils/common"; -import { ZAuthMode } from "./types/integration"; - export type ComposioInputFieldsParams = z.infer< typeof ZGetExpectedParamsForUserParams >; @@ -67,11 +66,7 @@ export class Composio { ComposioSDKContext.sessionId = getUUID(); ComposioSDKContext.baseURL = baseURLParsed; ComposioSDKContext.frameworkRuntime = config?.runtime; - - //eslint-disable-next-line @typescript-eslint/no-require-imports - ComposioSDKContext.composioVersion = require( - getPackageJsonDir() + "/package.json" - ).version; + ComposioSDKContext.composioVersion = COMPOSIO_VERSION; TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_INITIALIZED, {}); @@ -114,15 +109,10 @@ export class Composio { * Checks for the latest version of the Composio SDK from NPM. * If a newer version is available, it logs a warning to the console. */ - async checkForLatestVersionFromNPM() { + private async checkForLatestVersionFromNPM() { try { const packageName = "composio-core"; - const packageJsonDir = getPackageJsonDir(); - - // eslint-disable-next-line @typescript-eslint/no-require-imports - const currentVersionFromPackageJson = require( - packageJsonDir + "/package.json" - ).version; + const currentVersionFromPackageJson = COMPOSIO_VERSION; const response = await axios.get( `https://registry.npmjs.org/${packageName}/latest` diff --git a/js/src/sdk/models/Entity.ts b/js/src/sdk/models/Entity.ts index 2318d5aa25d..1a8b37287c7 100644 --- a/js/src/sdk/models/Entity.ts +++ b/js/src/sdk/models/Entity.ts @@ -1,5 +1,4 @@ import { z } from "zod"; -import logger from "../../utils/logger"; import { GetConnectionsResponseDto } from "../client"; import { ZConnectionParams, @@ -7,7 +6,6 @@ import { ZInitiateConnectionParams, ZTriggerSubscribeParam, } from "../types/entity"; -import { ZAuthMode } from "../types/integration"; import { CEG } from "../utils/error"; import { COMPOSIO_SDK_ERROR_CODES } from "../utils/errors/src/constants"; import { TELEMETRY_LOGGER } from "../utils/telemetry"; @@ -29,10 +27,16 @@ const LABELS = { }; // Types from zod schemas -type TriggerSubscribeParam = z.infer; -type ConnectionParams = z.infer; -type InitiateConnectionParams = z.infer; -type ExecuteActionParams = z.infer; +export type TriggerSubscribeParam = z.infer; +export type ConnectionParams = z.infer & { + // @deprecated + app?: string; + appName?: string; +}; +export type InitiateConnectionParams = z.infer< + typeof ZInitiateConnectionParams +>; +export type ExecuteActionParams = z.infer; // type from API export type ConnectedAccountListRes = GetConnectionsResponseDto; @@ -60,6 +64,16 @@ export class Entity { this.activeTriggers = new ActiveTriggers(this.backendClient); } + /** + * Executes an action for an entity. + * + * @param {string} actionName The name of the action to execute. + * @param {Record} params The parameters for the action. + * @param {string} text The text to pass to the action. This can be to perform NLA execution + * @param {string} connectedAccountId The ID of the connected account to use for the action. + * @returns {Promise} A promise that resolves to the response from the action execution. + * @throws {ComposioError} If the request fails. + */ async execute({ actionName, params, @@ -125,14 +139,34 @@ export class Entity { } } - async getConnection({ app, connectedAccountId }: ConnectionParams) { + /** + * Retrieves the required parameters for a specific authentication scheme of an app in the Composio platform. + * + * This method allows clients to fetch the necessary parameters for a specific authentication scheme of an app by providing its unique key and the authentication scheme. + * + * @param {ConnectionParams} data The data for the request, including the app's unique key and the authentication scheme. + * @returns {Promise} A promise that resolves to the required parameters for the authentication scheme. + * @throws {ComposioError} If the request fails. + */ + async getConnection({ app, appName, connectedAccountId }: ConnectionParams) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "getConnection", file: this.fileName, - params: { app, connectedAccountId }, + params: { app, appName, connectedAccountId }, }); try { - ZConnectionParams.parse({ app, connectedAccountId }); + const finalApp = appName || app; + ZConnectionParams.parse({ app: finalApp, connectedAccountId }); + + if (!finalApp && !connectedAccountId) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, + { + message: "App or connectedAccountId is required", + description: "App or connectedAccountId is required", + } + ); + } if (connectedAccountId) { return await this.connectedAccounts.get({ connectedAccountId, @@ -158,7 +192,7 @@ export class Entity { if (!latestAccount) { for (const connectedAccount of connectedAccounts.items!) { if ( - app?.toLocaleLowerCase() === + finalApp?.toLocaleLowerCase() === connectedAccount.appName.toLocaleLowerCase() ) { const creationDate = new Date(connectedAccount.createdAt!); @@ -174,31 +208,65 @@ export class Entity { } } if (!latestAccount) { - return null; + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.SDK.NO_CONNECTED_ACCOUNT_FOUND, + { + message: `Could not find a connection with app='${finalApp}' and entity='${this.id}'`, + description: `Could not find a connection with app='${finalApp}' and entity='${this.id}'`, + } + ); } - return this.connectedAccounts.get({ + const connectedAccount = await this.connectedAccounts.get({ connectedAccountId: latestAccount.id!, }); + + if (!connectedAccount) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.SDK.NO_CONNECTED_ACCOUNT_FOUND, + { + message: `Could not find a connection with app='${finalApp}' and entity='${this.id}'`, + description: `Could not find a connection with app='${finalApp}' and entity='${this.id}'`, + } + ); + } + + return connectedAccount; } catch (error) { throw CEG.handleAllError(error); } } - async setupTrigger({ app, triggerName, config }: TriggerSubscribeParam) { + /** + * Retrieves the required parameters for a specific authentication scheme of an app in the Composio platform. + * + * This method allows clients to setup a trigger for an app by providing its unique key and the trigger name. + * + * @param {TriggerSubscribeParam} data The data for the request, including the app's unique key and the trigger name. + * @returns {Promise} A promise that resolves to the required parameters for the authentication scheme. + * @throws {ComposioError} If the request fails. + */ + async setupTrigger({ + app, + appName, + triggerName, + config, + }: TriggerSubscribeParam) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "setupTrigger", file: this.fileName, - params: { app, triggerName, config }, + params: { app, appName, triggerName, config }, }); try { - ZTriggerSubscribeParam.parse({ app, triggerName, config }); - const connectedAccount = await this.getConnection({ app }); + const finalApp = appName || app; + ZTriggerSubscribeParam.parse({ app: finalApp, triggerName, config }); + const connectedAccount = await this.getConnection({ app: finalApp }); if (!connectedAccount) { throw CEG.getCustomError( COMPOSIO_SDK_ERROR_CODES.SDK.NO_CONNECTED_ACCOUNT_FOUND, { - description: `Could not find a connection with app='${app}' and entity='${this.id}'`, + message: `Could not find a connection with app='${finalApp}' and entity='${this.id}'`, + description: `Could not find a connection with app='${finalApp}' and entity='${this.id}'`, } ); } @@ -213,9 +281,15 @@ export class Entity { } } - /* - deprecated - */ + /** + * Retrieves the required parameters for a specific authentication scheme of an app in the Composio platform. + * + * This method allows clients to disable a trigger by providing its trigger ID. + * + * @param {string} triggerId The ID of the trigger to disable. + * @returns {Promise<{ status: string }>} A promise that resolves to the status of the trigger disablement. + * @throws {ComposioError} If the request fails. + */ async disableTrigger(triggerId: string) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "disableTrigger", @@ -230,6 +304,12 @@ export class Entity { } } + /** + * Retrieves all connections for an entity. + * + * @returns {Promise} A promise that resolves to an array of connection items. + * @throws {ComposioError} If the request fails. + */ async getConnections(): Promise { /** * Get all connections for an entity. @@ -249,6 +329,12 @@ export class Entity { } } + /** + * Retrieves all active triggers for an entity. + * + * @returns {Promise} A promise that resolves to an array of active triggers. + * @throws {ComposioError} If the request fails. + */ async getActiveTriggers() { /** * Get all active triggers for an entity. @@ -272,6 +358,12 @@ export class Entity { } } + /** + * Initiate a connection for an entity. + * @param {InitiateConnectionParams} data The data for the request, including the app's unique key and the authentication scheme. + * @returns {Promise} A promise that resolves to the connection request. + * @throws {ComposioError} If the request fails. + */ async initiateConnection( data: InitiateConnectionParams ): Promise { @@ -281,89 +373,26 @@ export class Entity { params: { data }, }); try { - const { appName, authMode, authConfig, integrationId, connectionData } = - ZInitiateConnectionParams.parse(data); - const { redirectUrl, labels } = data.config || {}; - - if (!integrationId && !appName) { - throw CEG.getCustomError( - COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, - { - message: "Please pass appName or integrationId", - description: - "We need atleast one of the params to initiate a connection", - } - ); - } - - /* Get the integration */ - const timestamp = new Date().toISOString().replace(/[-:.]/g, ""); - - const isIntegrationIdPassed = !!integrationId; - let integration = isIntegrationIdPassed - ? await this.integrations.get({ integrationId: integrationId }) - : null; - - if (isIntegrationIdPassed && !integration) { - throw CEG.getCustomError( - COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, - { - message: "Integration not found", - description: "The integration with the given id does not exist", - } - ); - } - - /* If integration is not found, create a new integration */ - if (!isIntegrationIdPassed) { - const app = await this.apps.get({ appKey: appName! }); - - if (authMode) { - integration = await this.integrations.create({ - appId: app.appId!, - name: `integration_${timestamp}`, - authScheme: authMode as z.infer, - authConfig: authConfig, - useComposioAuth: false, - }); - } else { - const isTestConnectorAvailable = - app.testConnectors && app.testConnectors.length > 0; - - if (!isTestConnectorAvailable && app.no_auth === false) { - logger.debug( - "Auth schemes not provided, available auth schemes and authConfig" - ); - // @ts-ignore - for (const authScheme of app.auth_schemes) { - logger.debug( - "authScheme:", - authScheme.name, - "\n", - "fields:", - authScheme.fields - ); - } - - throw new Error("Please pass authMode and authConfig."); - } - - integration = await this.integrations.create({ - appId: app.appId!, - name: `integration_${timestamp}`, - useComposioAuth: true, - }); - } - } + const { + appName, + authMode, + authConfig, + integrationId, + connectionParams, + redirectUri, + labels, + } = ZInitiateConnectionParams.parse(data); // Initiate the connection process return this.connectedAccounts.initiate({ - integrationId: integration!.id!, + authMode: authMode, + authConfig: authConfig, + integrationId: integrationId, + appName: appName, entityId: this.id, - redirectUri: redirectUrl, - //@ts-ignore - data: connectionData, - labels: labels, + redirectUri: redirectUri || data.config?.redirectUrl || "", + connectionParams: connectionParams, + labels: labels || data.config?.labels || [], }); } catch (error) { throw CEG.handleAllError(error); diff --git a/js/src/sdk/models/actions.spec.ts b/js/src/sdk/models/actions.spec.ts index 706da2a571c..d380195d091 100644 --- a/js/src/sdk/models/actions.spec.ts +++ b/js/src/sdk/models/actions.spec.ts @@ -3,7 +3,7 @@ import { getBackendClient } from "../testUtils/getBackendClient"; import { Actions } from "./actions"; import { ConnectedAccounts } from "./connectedAccounts"; -describe("Apps class tests", () => { +describe("Actions class tests", () => { let backendClient; let actions: Actions; let connectedAccouns: ConnectedAccounts; @@ -72,4 +72,13 @@ describe("Apps class tests", () => { expect(executionResult.data).toHaveProperty("stdout", "Hello World\n"); expect(executionResult.data).toHaveProperty("stderr", ""); }); + + it("should get a list of actions by use case", async () => { + const actionsList = await actions.findActionEnumsByUseCase({ + apps: ["github", "notion"], + useCase: "create issue from github repo on notion", + }); + expect(actionsList).toBeInstanceOf(Array); + expect(actionsList).not.toHaveLength(0); + }); }); diff --git a/js/src/sdk/models/actions.ts b/js/src/sdk/models/actions.ts index 18d2ad755e0..6c585196471 100644 --- a/js/src/sdk/models/actions.ts +++ b/js/src/sdk/models/actions.ts @@ -26,19 +26,20 @@ import { BackendClient } from "./backendClient"; export type ActionListParams = z.infer; export type HeaderSingleParameters = z.infer; export type CustomAuth = z.infer; -export type ExecuteActionParam = z.infer; -export type GetActionItemParam = z.infer; +export type ActionxExecuteParam = z.infer; +export type ActionItemParam = z.infer; export type FindActionEnumsByUseCaseParam = z.infer< typeof ZFindActionEnumsByUseCaseParams >; -export type ExecuteReqDTO = z.infer; +export type ActionExecuteReqParam = z.infer; /** * Response types */ -export type GetActionResponse = ActionDetails; -export type GetListActionsResponse = ActionsListResponseDTO; +export type ActionItemGetRes = ActionDetails; +export type ActionItemListRes = ActionsListResponseDTO; export type ActionExecuteResponse = ActionExecutionResDto; +export type ActionFindActionEnumsByUseCaseRes = Array; export class Actions { // Remove this as we might not need it @@ -55,10 +56,10 @@ export class Actions { * The response includes the action's name, display name, description, input parameters, expected response, associated app information, and enabled status. * * @param {GetActionData} data The data for the request. - * @returns {Promise} A promise that resolves to the details of the action. + * @returns {Promise} A promise that resolves to the details of the action. * @throws {ComposioError} If the request fails. */ - async get(data: GetActionItemParam): Promise { + async get(data: ActionItemParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "get", file: this.fileName, @@ -133,6 +134,7 @@ export class Actions { /** * Executes a specific action in the Composio platform. + * This doesn't execute the local action and is wrapper over backend. Try to call this method directly from toolset * * This method allows you to trigger the execution of an action by providing its name and the necessary input parameters. The request includes the connected account ID to identify the app connection to use for the action, and the input parameters required by the action. The response provides details about the execution status and the response data returned by the action. * @@ -140,7 +142,7 @@ export class Actions { * @returns {Promise} A promise that resolves to the execution status and response data. * @throws {ComposioError} If the request fails. */ - async execute(data: ExecuteActionParam): Promise { + async execute(data: ActionxExecuteParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "execute", file: this.fileName, @@ -164,12 +166,12 @@ export class Actions { * Finds all action enums by use case. * * @param {FindActionEnumsByUseCaseParam} data The data for the request. - * @returns {Promise>} A promise that resolves to the list of action enums. + * @returns {Promise} A promise that resolves to the list of action enums. * @throws {ComposioError} If the request fails. */ async findActionEnumsByUseCase( data: FindActionEnumsByUseCaseParam - ): Promise> { + ): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "findActionEnumsByUseCase", file: this.fileName, @@ -202,7 +204,9 @@ export class Actions { * @returns {Promise} A promise that resolves to the execution status and response data. * @throws {ComposioError} If the request fails. */ - async executeRequest(data: ExecuteReqDTO): Promise { + async executeRequest( + data: ActionExecuteReqParam + ): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "executeRequest", file: this.fileName, diff --git a/js/src/sdk/models/activeTriggers.ts b/js/src/sdk/models/activeTriggers.ts index 4c18b2e7a2f..59b16564ec2 100644 --- a/js/src/sdk/models/activeTriggers.ts +++ b/js/src/sdk/models/activeTriggers.ts @@ -12,7 +12,7 @@ import { BackendClient } from "./backendClient"; export type TriggerItemParam = z.infer; export type GetActiveTriggersData = z.infer; -export type TriggerItem = z.infer; +export type TriggerItemRes = z.infer; export type TriggerChangeResponse = { status: string }; export class ActiveTriggers { // Remove this as we might not need it @@ -29,7 +29,7 @@ export class ActiveTriggers { * The response includes the trigger's name, description, input parameters, expected response, associated app information, and enabled status. * * @param {TriggerItemParam} data The data for the request. - * @returns {Promise} A promise that resolves to the details of the active trigger. + * @returns {Promise} A promise that resolves to the details of the active trigger. * @throws {ComposioError} If the request fails. */ async get({ triggerId }: TriggerItemParam) { @@ -46,7 +46,7 @@ export class ActiveTriggers { }, }); - return data?.triggers?.[0] as unknown as TriggerItem; + return data?.triggers?.[0] as unknown as TriggerItemRes; } catch (error) { throw CEG.handleAllError(error); } @@ -61,7 +61,7 @@ export class ActiveTriggers { * @returns {Promise} A promise that resolves to the list of all active triggers. * @throws {ComposioError} If the request fails. */ - async list(data: GetActiveTriggersData = {}): Promise { + async list(data: GetActiveTriggersData = {}): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "list", file: this.fileName, @@ -73,7 +73,7 @@ export class ActiveTriggers { query: parsedData, }); - return response?.triggers as unknown as TriggerItem[]; + return response?.triggers as unknown as TriggerItemRes[]; } catch (error) { throw CEG.handleAllError(error); } diff --git a/js/src/sdk/models/apps.ts b/js/src/sdk/models/apps.ts index 1b48bff2005..1c046b406bf 100644 --- a/js/src/sdk/models/apps.ts +++ b/js/src/sdk/models/apps.ts @@ -19,20 +19,26 @@ import { import { BackendClient } from "./backendClient"; // schema types generated from zod -export type GetRequiredParams = z.infer; -export type GetRequiredParamsForAuthScheme = z.infer< +export type AppGetRequiredParams = z.infer; +export type AppGetRequiredParamsForAuthSchemeParam = z.infer< typeof ZGetRequiredParamsForAuthScheme ->; -export type RequiredParamsFullResponse = z.infer< +> & { + appName?: string; + /** + * @deprecated use appName instead + */ + appId?: string; +}; +export type AppRequiredParamsFullResponse = z.infer< typeof ZRequiredParamsFullResponse >; -export type RequiredParamsResponse = z.infer; -export type GetAppDataParams = z.infer; +export type AppRequiredParamsResponse = z.infer; +export type AppGetDataParams = z.infer; // types generated from backend client export type AppItemResponse = SingleAppInfoResDTO; export type AppListResponse = AppItemListResponse[]; -export type ListAllAppsResponse = AppListResDTO; +export type AppListRes = AppListResDTO; export type AppItemListResponse = AppInfoResponseDto; export class Apps { @@ -69,11 +75,11 @@ export class Apps { * * This method allows clients to fetch detailed information about a specific app by providing its unique key. The response includes the app's name, key, status, description, logo, categories, authentication schemes, and other metadata. * - * @param {GetAppDataParams} data The data for the request, including the app's unique key. + * @param {AppGetDataParams} data The data for the request, including the app's unique key. * @returns {Promise} A promise that resolves to the details of the app. * @throws {ComposioError} If the request fails. */ - async get(data: GetAppDataParams): Promise { + async get(data: AppGetDataParams): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "get", file: this.fileName, @@ -98,10 +104,12 @@ export class Apps { * This method allows clients to fetch the necessary parameters for a specific app by providing its unique key. The response includes the app's name, key, status, description, logo, categories, authentication schemes, and other metadata. * * @param {string} appId The unique key of the app. - * @returns {Promise} A promise that resolves to the required parameters for the app. + * @returns {Promise} A promise that resolves to the required parameters for the app. * @throws {ComposioError} If the request fails. */ - async getRequiredParams(appId: string): Promise { + async getRequiredParams( + appId: string + ): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "getRequiredParams", file: this.fileName, @@ -116,7 +124,7 @@ export class Apps { authSchemes as Array<{ mode: string }> )?.map((scheme) => scheme?.mode); - const authSchemesObject: Record = {}; + const authSchemesObject: Record = {}; for (const scheme of authSchemes as Array<{ mode: string; @@ -164,22 +172,24 @@ export class Apps { * * This method allows clients to fetch the necessary parameters for a specific authentication scheme of an app by providing its unique key and the authentication scheme. * - * @param {GetRequiredParamsForAuthScheme} data The data for the request, including the app's unique key and the authentication scheme. - * @returns {Promise} A promise that resolves to the required parameters for the authentication scheme. + * @param {AppGetRequiredParamsForAuthSchemeParam} data The data for the request, including the app's unique key and the authentication scheme. + * @returns {Promise} A promise that resolves to the required parameters for the authentication scheme. * @throws {ComposioError} If the request fails. */ async getRequiredParamsForAuthScheme({ appId, + appName, authScheme, - }: GetRequiredParamsForAuthScheme): Promise { + }: AppGetRequiredParamsForAuthSchemeParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "getRequiredParamsForAuthScheme", file: this.fileName, params: { appId, authScheme }, }); try { - ZGetRequiredParamsForAuthScheme.parse({ appId, authScheme }); - const params = await this.getRequiredParams(appId); + const finalAppId = appName || appId; + ZGetRequiredParamsForAuthScheme.parse({ appId: finalAppId, authScheme }); + const params = await this.getRequiredParams(finalAppId); return params.authSchemes[authScheme]; } catch (error) { throw CEG.handleAllError(error); diff --git a/js/src/sdk/models/backendClient.spec.ts b/js/src/sdk/models/backendClient.spec.ts index 04260f279af..5188073619c 100644 --- a/js/src/sdk/models/backendClient.spec.ts +++ b/js/src/sdk/models/backendClient.spec.ts @@ -19,7 +19,7 @@ describe("Apps class tests", () => { it("should throw an error if api key is not provided", async () => { expect(() => new BackendClient("", testConfig.BACKEND_HERMES_URL)).toThrow( - "🔑 API Key Missing or Invalid" + "API key is not available" ); }); diff --git a/js/src/sdk/models/backendClient.ts b/js/src/sdk/models/backendClient.ts index 83eb25761e3..5f9a0f6387c 100644 --- a/js/src/sdk/models/backendClient.ts +++ b/js/src/sdk/models/backendClient.ts @@ -41,7 +41,12 @@ export class BackendClient { if (!apiKey) { throw CEG.getCustomError( COMPOSIO_SDK_ERROR_CODES.COMMON.API_KEY_UNAVAILABLE, - {} + { + message: "API key is not available", + description: + "The API key required for authentication is not provided. You can get the API key from the Composio dashboard.", + possibleFix: "Please provide the API key in the constructor", + } ); } diff --git a/js/src/sdk/models/connectedAccounts.ts b/js/src/sdk/models/connectedAccounts.ts index 1a5bd2aaa2f..9dced15d1d3 100644 --- a/js/src/sdk/models/connectedAccounts.ts +++ b/js/src/sdk/models/connectedAccounts.ts @@ -1,10 +1,11 @@ import { z } from "zod"; +import logger from "../../utils/logger"; import { ConnectedAccountResponseDTO, ConnectionParams, DeleteRowAPIDTO, - GetConnectionInfoResponse, GetConnectionsResponseDto, + GetConnectorInfoResDTO, } from "../client"; import { default as apiClient, default as client } from "../client/client"; import { @@ -16,6 +17,7 @@ import { } from "../types/connectedAccount"; import { ZAuthMode } from "../types/integration"; import { CEG } from "../utils/error"; +import { COMPOSIO_SDK_ERROR_CODES } from "../utils/errors/src/constants"; import { TELEMETRY_LOGGER } from "../utils/telemetry"; import { TELEMETRY_EVENTS } from "../utils/telemetry/events"; import { Apps } from "./apps"; @@ -27,9 +29,7 @@ type ConnectedAccountsListData = z.infer; type InitiateConnectionDataReq = z.infer; type SingleConnectionParam = z.infer; type SaveUserAccessDataParam = z.infer; -type InitiateConnectionPayloadDto = z.infer< - typeof ZInitiateConnectionPayloadDto ->; +type InitiateConnectionPayload = z.infer; export type ConnectedAccountListResponse = GetConnectionsResponseDto; export type SingleConnectedAccountResponse = ConnectedAccountResponseDTO; @@ -64,7 +64,7 @@ export class ConnectedAccounts { } } - async create(data: InitiateConnectionPayloadDto): Promise { + async create(data: InitiateConnectionPayload): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "create", file: this.fileName, @@ -106,6 +106,22 @@ export class ConnectedAccounts { } } + async getAuthParams(data: { connectedAccountId: string }) { + TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { + method: "getAuthParams", + file: this.fileName, + params: { data }, + }); + try { + const res = await apiClient.connections.getConnection({ + path: { connectedAccountId: data.connectedAccountId }, + }); + return res.data; + } catch (error) { + throw CEG.handleAllError(error); + } + } + async delete(data: SingleConnectionParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "delete", @@ -135,53 +151,103 @@ export class ConnectedAccounts { }); try { const { - entityId = "default", - labels, - data = {}, - redirectUri, authMode, - authConfig, appName, + entityId, + redirectUri, + labels, + authConfig, + integrationId, + connectionParams, } = payload; - let integrationId: string | undefined; - integrationId = payload.integrationId; + if (!integrationId && !appName) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, + { + message: "Please pass appName or integrationId", + description: + "We need atleast one of the params to initiate a connection", + } + ); + } - if (!integrationId && authMode) { - const timestamp = new Date().toISOString().replace(/[-:.]/g, ""); + /* Get the integration */ + const timestamp = new Date().toISOString().replace(/[-:.]/g, ""); - if (!appName) - throw new Error( - "appName is required when integrationId is not provided" - ); - if (!authMode) - throw new Error( - "authMode is required when integrationId is not provided" - ); - if (!authConfig) - throw new Error( - "authConfig is required when integrationId is not provided" - ); + const isIntegrationIdPassed = !!integrationId; + let integration = isIntegrationIdPassed + ? await this.integrations.get({ integrationId: integrationId }) + : null; - const app = await this.apps.get({ appKey: appName }); - const integration = await this.integrations.create({ - appId: app.appId!, - name: `integration_${timestamp}`, - authScheme: authMode as z.infer, - authConfig: authConfig, - useComposioAuth: false, + if (!integration && !!authMode) { + const integrations = await this.integrations.list({ + appName: appName, }); + integration = integrations.items?.find((integration) => { + return integration.authScheme === authMode; + }) as GetConnectorInfoResDTO; + } + + if (isIntegrationIdPassed && !integration) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, + { + message: "Integration not found", + description: "The integration with the given id does not exist", + } + ); + } + + /* If integration is not found, create a new integration */ + if (!isIntegrationIdPassed) { + const app = await this.apps.get({ appKey: appName! }); - integrationId = integration?.id!; + if (!!authMode && !!authConfig) { + integration = await this.integrations.create({ + appId: app.appId!, + name: `integration_${timestamp}`, + authScheme: authMode as z.infer, + authConfig: authConfig, + useComposioAuth: false, + }); + } else { + const isTestConnectorAvailable = + app.testConnectors && app.testConnectors.length > 0; + + if (!isTestConnectorAvailable && app.no_auth === false) { + logger.debug( + "Auth schemes not provided, available auth schemes and authConfig" + ); + // @ts-ignore + for (const authScheme of app.auth_schemes) { + logger.debug( + "authScheme:", + authScheme.name, + "\n", + "fields:", + authScheme.fields + ); + } + + throw new Error("Please pass authMode and authConfig."); + } + + integration = await this.integrations.create({ + appId: app.appId!, + name: `integration_${timestamp}`, + useComposioAuth: true, + }); + } } const res = await client.connections .initiateConnection({ body: { - integrationId: integrationId!, - entityId, - labels, - redirectUri, - data, + integrationId: integration?.id!, + entityId: entityId, + labels: labels, + redirectUri: redirectUri, + data: connectionParams || {}, }, }) .then((res) => res.data); @@ -239,18 +305,6 @@ export class ConnectionRequest { } } - async getAuthInfo( - data: SingleConnectionParam - ): Promise { - try { - ZSingleConnectionParams.parse(data); - const res = await client.connections.getConnectionInfo({ path: data }); - return res.data!; - } catch (error) { - throw CEG.handleAllError(error); - } - } - async waitUntilActive(timeout = 60) { try { const startTime = Date.now(); diff --git a/js/src/sdk/models/integrations.ts b/js/src/sdk/models/integrations.ts index 3a7e510b77b..8d42a27d52f 100644 --- a/js/src/sdk/models/integrations.ts +++ b/js/src/sdk/models/integrations.ts @@ -17,20 +17,20 @@ import { TELEMETRY_EVENTS } from "../utils/telemetry/events"; import { BackendClient } from "./backendClient"; // Types generated from zod schemas -export type ListAllIntegrationsData = z.infer; -export type GetIntegrationData = z.infer; -export type SingleIntegrationData = string; -type CreateIntegrationParams = z.infer; +export type IntegrationListParam = z.infer; +export type IntegrationGetParam = z.infer; +export type IntegrationListData = string; +type IntegrationCreateParams = z.infer; // API response types -export type CreateIntegrationData = { - requestBody?: CreateIntegrationParams; +export type IntegrationCreateData = { + requestBody?: IntegrationCreateParams; }; -export type IntegrationListResponse = GetConnectorListResDTO; -export type IntegrationGetResponse = GetConnectorInfoResDTO; +export type IntegrationListRes = GetConnectorListResDTO; +export type IntegrationGetRes = GetConnectorInfoResDTO; export type IntegrationRequiredParamsRes = ExpectedInputFieldsDTO[]; -export type IntegrationDeleteResponse = DeleteRowAPIDTO; +export type IntegrationDeleteRes = DeleteRowAPIDTO; export class Integrations { private backendClient: BackendClient; private fileName: string = "js/src/sdk/models/integrations.ts"; @@ -44,12 +44,10 @@ export class Integrations { * * This method allows clients to explore and discover the supported integrations. It returns an array of integration objects, each containing essential details such as the integration's key, name, description, logo, categories, and unique identifier. * - * @returns {Promise} A promise that resolves to the list of all integrations. + * @returns {Promise} A promise that resolves to the list of all integrations. * @throws {ComposioError} If the request fails. */ - async list( - data: ListAllIntegrationsData = {} - ): Promise { + async list(data: IntegrationListParam = {}): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "list", file: this.fileName, @@ -72,11 +70,11 @@ export class Integrations { * * The response includes the integration's name, display name, description, input parameters, expected response, associated app information, and enabled status. * - * @param {GetIntegrationData} data The data for the request. + * @param {IntegrationGetParam} data The data for the request. * @returns {Promise} A promise that resolves to the details of the integration. * @throws {ComposioError} If the request fails. */ - async get(data: GetIntegrationData): Promise { + async get(data: IntegrationGetParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "get", file: this.fileName, @@ -98,12 +96,12 @@ export class Integrations { * * This method is used to get the necessary input fields for a specific integration's authentication scheme. * - * @param {SingleIntegrationData} data The data for the request. + * @param {IntegrationListData} data The data for the request. * @returns {Promise} A promise that resolves to the required parameters for the integration's authentication scheme. * @throws {ComposioError} If the request fails. */ async getRequiredParams( - integrationId: SingleIntegrationData + integrationId: IntegrationListData ): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "getRequiredParams", @@ -131,11 +129,11 @@ export class Integrations { * * This method allows clients to create a new integration by providing the necessary details such as app ID, name, authentication mode, and configuration. * - * @param {CreateIntegrationParams} data The data for the request. + * @param {IntegrationCreateParams} data The data for the request. * @returns {Promise} A promise that resolves to the created integration model. * @throws {ComposioError} If the request fails. */ - async create(data: CreateIntegrationParams): Promise { + async create(data: IntegrationCreateParams): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "create", file: this.fileName, @@ -169,13 +167,13 @@ export class Integrations { * * This method allows clients to delete an existing integration by providing its integration ID. * - * @param {SingleIntegrationData} data The data for the request. + * @param {IntegrationListData} data The data for the request. * @returns {Promise} A promise that resolves to the deleted integration model. * @throws {ComposioError} If the request fails. */ async delete( - integrationId: SingleIntegrationData - ): Promise { + integrationId: IntegrationListData + ): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "delete", file: this.fileName, diff --git a/js/src/sdk/models/triggers.spec.ts b/js/src/sdk/models/triggers.spec.ts index 8f691fcffca..3edff00f50b 100644 --- a/js/src/sdk/models/triggers.spec.ts +++ b/js/src/sdk/models/triggers.spec.ts @@ -1,6 +1,7 @@ import { beforeAll, describe, expect, it } from "@jest/globals"; import { getBackendClient } from "../testUtils/getBackendClient"; +import { ComposioError } from "../utils/errors/src/composioError"; import { Entity } from "./Entity"; import { Actions } from "./actions"; import { ConnectedAccounts } from "./connectedAccounts"; @@ -92,6 +93,29 @@ describe("Apps class tests subscribe", () => { expect(trigger.status).toBe("success"); }); + it("should get the config of a trigger", async () => { + const res = await triggers.getTriggerConfig({ + triggerId: "GMAIL_NEW_GMAIL_MESSAGE", + }); + expect(res.config.title).toBe("GmailNewMessageConfigSchema"); + }); + + it("should get the payload of a trigger", async () => { + const res = await triggers.getTriggerInfo({ + triggerId: "GMAIL_NEW_GMAIL_MESSAGE", + }); + expect(res.displayName).toBe("New Gmail Message Received Trigger"); + }); + + it("should throw an error if trigger not found", async () => { + try { + await triggers.list({ triggerIds: ["INVALID_TRIGGER_ID"] }); + } catch (e: unknown) { + const error = e as ComposioError; + expect(error.message).toContain("Trigger not found"); + } + }); + // it("should subscribe to a trigger and receive a trigger", async () => { // function waitForTriggerReceived() { // return new Promise((resolve) => { diff --git a/js/src/sdk/models/triggers.ts b/js/src/sdk/models/triggers.ts index 4d6095aaa65..4995f2f515a 100644 --- a/js/src/sdk/models/triggers.ts +++ b/js/src/sdk/models/triggers.ts @@ -11,17 +11,24 @@ import { TELEMETRY_EVENTS } from "../utils/telemetry/events"; import { ListTriggersResponse } from "../client"; import { + TriggerSingleParam, + ZSingleTriggerParam, + ZSingleTriggerRes, ZTriggerInstanceItems, ZTriggerQuery, ZTriggerSetupParam, ZTriggerSubscribeParam, } from "../types/trigger"; +import { COMPOSIO_SDK_ERROR_CODES } from "../utils/errors/src/constants"; // Types inferred from zod schemas -export type TTriggerListParam = z.infer; -export type TTriggerSetupParam = z.infer; -export type TTriggerInstanceItems = z.infer; -export type TTriggerSubscribeParam = z.infer; +export type TriggerListParam = z.infer; +export type TriggerSetupParam = z.infer; +export type TriggerInstanceItems = z.infer; +export type TriggerSubscribeParam = z.infer; +export type TriggerListRes = Array>; +export type SingleTriggerRes = z.infer; +export type TriggerSingleConfig = Pick; // API response types export type TriggerListResponse = ListTriggersResponse; @@ -50,7 +57,7 @@ export class Triggers { * @returns {Promise} A promise that resolves to the list of all triggers. * @throws {ComposioError} If the request fails. */ - async list(data: TTriggerListParam = {}): Promise { + async list(data: TriggerListParam = {}): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "list", file: this.fileName, @@ -63,17 +70,96 @@ export class Triggers { connectedAccountIds, integrationIds, showEnabledOnly, + triggerInstanceIds, } = ZTriggerQuery.parse(data); + + const finalTriggerInstanceIds = + triggerIds && triggerIds.length > 0 ? triggerIds : triggerInstanceIds; const { data: response } = await apiClient.triggers.listTriggers({ query: { appNames: appNames?.join(","), - triggerIds: triggerIds?.join(","), + triggerIds: finalTriggerInstanceIds?.join(","), connectedAccountIds: connectedAccountIds?.join(","), integrationIds: integrationIds?.join(","), - showEnabledOnly: showEnabledOnly, + showEnabledOnly: showEnabledOnly || false, }, }); - return response || []; + + if (!response || response.length === 0) { + throw CEG.getCustomError(COMPOSIO_SDK_ERROR_CODES.BACKEND.NOT_FOUND, { + message: "Trigger not found with the given params", + description: "Trigger not found with the given params", + possibleFix: "Pass a check if filter params are correct", + }); + } + return response; + } catch (error) { + throw CEG.handleAllError(error); + } + } + + /** + * Retrieves information about a single trigger. + * + * @param {TriggerSingleParam} data The data for the request. + * @returns {Promise} A promise that resolves to the trigger information. + * @throws {ComposioError} If the request fails. + */ + async getTriggerInfo(data: TriggerSingleParam): Promise { + TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { + method: "getTriggerInfo", + file: this.fileName, + params: { data }, + }); + try { + const parsedData = ZSingleTriggerParam.parse(data); + const res = await apiClient.triggers.getTriggerInfoV2({ + path: { triggerName: parsedData.triggerId }, + }); + + // Bad type inference + const trigger = res.data as unknown as SingleTriggerRes; + if (!trigger) { + throw CEG.getCustomError(COMPOSIO_SDK_ERROR_CODES.BACKEND.NOT_FOUND, { + message: "Trigger info not found", + description: "Trigger info not found", + possibleFix: "Pass a check if trigger exists", + }); + } + return trigger; + } catch (error) { + throw CEG.handleAllError(error); + } + } + + /** + * Retrieves the configuration of a single trigger. + * + * @param {TriggerSingleParam} data The data for the request. + * @returns {Promise} A promise that resolves to the trigger configuration. + * @throws {ComposioError} If the request fails. + */ + async getTriggerConfig( + data: TriggerSingleParam + ): Promise { + TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { + method: "getSingleTriggerConfig", + file: this.fileName, + params: { data }, + }); + try { + const parsedData = ZSingleTriggerParam.parse(data); + + const triggerInfo = await this.getTriggerInfo(parsedData); + + if (!triggerInfo) { + throw CEG.getCustomError(COMPOSIO_SDK_ERROR_CODES.BACKEND.NOT_FOUND, { + message: "Trigger info not found", + description: "Trigger info not found", + possibleFix: "Pass a check if trigger exists", + }); + } + return { config: triggerInfo.config } as TriggerSingleConfig; } catch (error) { throw CEG.handleAllError(error); } @@ -86,7 +172,7 @@ export class Triggers { * @returns {Promise} A promise that resolves to the setup trigger response. * @throws {ComposioError} If the request fails. */ - async setup(params: TTriggerSetupParam): Promise { + async setup(params: TriggerSetupParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "setup", file: this.fileName, @@ -100,7 +186,7 @@ export class Triggers { triggerName: parsedData.triggerName, }, body: { - triggerConfig: parsedData.config, + triggerConfig: parsedData.config || {}, }, throwOnError: true, }); @@ -118,20 +204,37 @@ export class Triggers { /** * Enables a trigger for a connected account. * - * @param {TTriggerInstanceItems} data The data for the request. + * @param {triggerId,triggerInstanceId} data The data for the request. * @returns {Promise} A promise that resolves to the response of the enable request. * @throws {ComposioError} If the request fails. */ - async enable({ triggerId }: { triggerId: string }) { + async enable({ + triggerId, + triggerInstanceId, + }: { + triggerId?: string; + triggerInstanceId?: string; + }) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "enable", file: this.fileName, params: { triggerId }, }); try { + const finalTriggerId = triggerId || triggerInstanceId; + if (!finalTriggerId) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, + { + message: "Trigger ID is required", + description: "Trigger ID is required", + possibleFix: "Pass either triggerId or triggerInstanceId", + } + ); + } await apiClient.triggers.switchTriggerInstanceStatus({ path: { - triggerId: triggerId, + triggerId: finalTriggerId!, }, body: { enabled: true, @@ -148,20 +251,37 @@ export class Triggers { /** * Disables a trigger for a connected account. * - * @param {TTriggerInstanceItems} data The data for the request. + * @param {triggerId,triggerInstanceId} data The data for the request. * @returns {Promise} A promise that resolves to the response of the disable request. * @throws {ComposioError} If the request fails. */ - async disable({ triggerId }: { triggerId: string }) { + async disable({ + triggerId, + triggerInstanceId, + }: { + triggerId?: string; + triggerInstanceId?: string; + }) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "disable", file: this.fileName, - params: { triggerId }, + params: { triggerId, triggerInstanceId }, }); try { + const finalTriggerId = triggerId || triggerInstanceId; + if (!finalTriggerId) { + throw CEG.getCustomError( + COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED, + { + message: "Trigger ID is required", + description: "Trigger ID is required", + possibleFix: "Pass either triggerId or triggerInstanceId", + } + ); + } await apiClient.triggers.switchTriggerInstanceStatus({ path: { - triggerId: triggerId, + triggerId: finalTriggerId!, }, body: { enabled: false, @@ -178,11 +298,11 @@ export class Triggers { /** * Deletes a trigger for a connected account. * - * @param {TTriggerInstanceItems} data The data for the request. + * @param {TriggerInstanceItems} data The data for the request. * @returns {Promise} A promise that resolves to the response of the delete request. * @throws {ComposioError} If the request fails. */ - async delete(data: TTriggerInstanceItems) { + async delete(data: TriggerInstanceItems) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "delete", file: this.fileName, @@ -205,7 +325,7 @@ export class Triggers { async subscribe( fn: (data: TriggerData) => void, - filters: TTriggerSubscribeParam = {} + filters: TriggerSubscribeParam = {} ) { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "subscribe", diff --git a/js/src/sdk/types/connectedAccount.ts b/js/src/sdk/types/connectedAccount.ts index ee8ca5c4ec4..e53ac64f438 100644 --- a/js/src/sdk/types/connectedAccount.ts +++ b/js/src/sdk/types/connectedAccount.ts @@ -18,7 +18,7 @@ export const ZListConnectionsData = z.object({ }); export const ZInitiateConnectionDataReq = z.object({ - data: z.record(z.string(), z.unknown()).optional(), + connectionParams: z.record(z.string(), z.unknown()).optional(), entityId: z.string().optional(), labels: z.string().array().optional(), integrationId: z.string().optional(), diff --git a/js/src/sdk/types/entity.ts b/js/src/sdk/types/entity.ts index cd7ec63b078..49daebcd3c0 100644 --- a/js/src/sdk/types/entity.ts +++ b/js/src/sdk/types/entity.ts @@ -1,4 +1,5 @@ import { z } from "zod"; +import { ZAuthMode } from "./integration"; export const ZExecuteActionParams = z.object({ actionName: z.string(), @@ -11,14 +12,16 @@ export const ZInitiateConnectionParams = z.object({ appName: z.string().optional(), authConfig: z.record(z.any()).optional(), integrationId: z.string().optional(), - authMode: z.string().optional(), - connectionData: z.record(z.any()).optional(), + authMode: ZAuthMode.optional(), + connectionParams: z.record(z.any()).optional(), config: z .object({ labels: z.array(z.string()).optional(), redirectUrl: z.string().optional(), }) .optional(), + redirectUri: z.string().optional(), + labels: z.array(z.string()).optional(), }); export const ZConnectionParams = z.object({ @@ -27,7 +30,8 @@ export const ZConnectionParams = z.object({ }); export const ZTriggerSubscribeParam = z.object({ - app: z.string(), + app: z.string().optional(), + appName: z.string().optional(), triggerName: z.string(), config: z.record(z.any()), }); diff --git a/js/src/sdk/types/trigger.ts b/js/src/sdk/types/trigger.ts index fce32e0375a..8d6cfb5b522 100644 --- a/js/src/sdk/types/trigger.ts +++ b/js/src/sdk/types/trigger.ts @@ -1,7 +1,11 @@ import { z } from "zod"; export const ZTriggerQuery = z.object({ - triggerIds: z.array(z.string()).optional().describe("Trigger IDs"), + triggerIds: z.array(z.string()).optional().describe("Trigger Instance IDs"), + triggerInstanceIds: z + .array(z.string()) + .optional() + .describe("Trigger Instance IDs"), appNames: z.array(z.string()).optional().describe("App Names in lowercase"), connectedAccountIds: z .array(z.string()) @@ -21,11 +25,11 @@ export const ZTriggerInstanceItems = z.object({ export const ZTriggerSetupParam = z.object({ connectedAccountId: z.string(), triggerName: z.string(), - config: z.record(z.unknown()), + config: z.record(z.unknown()).optional(), }); -export type TTriggerListParam = z.infer; -export type TTriggerSetupParam = z.infer; +export type TriggerListParam = z.infer; +export type TriggerSetupParam = z.infer; export const ZTriggerSubscribeParam = z.object({ appName: z.string().optional(), @@ -36,3 +40,21 @@ export const ZTriggerSubscribeParam = z.object({ triggerData: z.string().optional(), entityId: z.string().optional(), }); + +export const ZSingleTriggerParam = z.object({ + triggerId: z.string(), +}); + +export type TriggerSingleParam = z.infer; + +export const ZSingleTriggerRes = z.object({ + name: z.string(), + displayName: z.string(), + description: z.string(), + type: z.string(), + appId: z.string(), + appName: z.string(), + instructions: z.string().optional(), + payload: z.record(z.unknown()), + config: z.record(z.unknown()), +}); diff --git a/js/src/sdk/utils/config.ts b/js/src/sdk/utils/config.ts index a5b72548a51..485590ee5b9 100644 --- a/js/src/sdk/utils/config.ts +++ b/js/src/sdk/utils/config.ts @@ -1,6 +1,3 @@ -import * as fs from "fs"; -import * as os from "os"; -import * as path from "path"; import { COMPOSIO_DIR, DEFAULT_BASE_URL, @@ -22,11 +19,22 @@ declare module "axios" { } // File path helpers -export const userDataPath = () => - path.join(os.homedir(), COMPOSIO_DIR, USER_DATA_FILE_NAME); +export const userDataPath = () => { + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const path = require("path"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const os = require("os"); + return path.join(os.homedir(), COMPOSIO_DIR, USER_DATA_FILE_NAME); + } catch (_error) { + return null; + } +}; export const getUserDataJson = () => { try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const fs = require("fs"); const data = fs.readFileSync(userDataPath(), "utf8"); return JSON.parse(data); } catch (_error) { diff --git a/js/src/sdk/utils/error.ts b/js/src/sdk/utils/error.ts index 372893bbad8..613de0b34ab 100644 --- a/js/src/sdk/utils/error.ts +++ b/js/src/sdk/utils/error.ts @@ -147,7 +147,7 @@ export class CEG { const errorCode = COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED; const errorMessage = error.message; const errorDescription = "The parameters passed are invalid"; - const possibleFix = "Please check the metadata.issues for more details"; + const possibleFix = "Please check error message for more details"; const metadata = { issues: error.issues, }; @@ -175,8 +175,8 @@ export class CEG { }: { type?: string; subtype?: string; - message?: string; - description?: string; + message: string; + description: string; possibleFix?: string; originalError?: unknown; metadata?: Record; diff --git a/js/src/sdk/utils/errors/src/constants.ts b/js/src/sdk/utils/errors/src/constants.ts index e5eb47acb35..361f901b852 100644 --- a/js/src/sdk/utils/errors/src/constants.ts +++ b/js/src/sdk/utils/errors/src/constants.ts @@ -28,12 +28,14 @@ export const BASE_ERROR_CODE_INFO = { [COMPOSIO_SDK_ERROR_CODES.BACKEND.NOT_FOUND]: { message: "🔍 API not found", description: "The requested resource is missing", - possibleFix: "Verify the URL or resource identifier.", + possibleFix: + "Ensure the resource id or resource identifier is correct and valid as backend returned 404", }, [COMPOSIO_SDK_ERROR_CODES.BACKEND.BAD_REQUEST]: { message: "🚫 Bad Request. The request was malformed or incorrect", description: null, - possibleFix: "Please check your request format and parameters.", + possibleFix: + "Check your parameters and request format, as the backend returned a 400 error.", }, [COMPOSIO_SDK_ERROR_CODES.BACKEND.UNAUTHORIZED]: { message: "🔑 Access Denied", @@ -45,7 +47,7 @@ export const BASE_ERROR_CODE_INFO = { message: "🕒 Request Timeout", description: "The request timed out while waiting for a response.", possibleFix: - "Please try again later. If the issue persists, contact support.", + "Please try again later. If the issue persists, contact support or check your network connection.", }, [COMPOSIO_SDK_ERROR_CODES.BACKEND.SERVER_ERROR]: { message: "💥 Oops! Internal server error", @@ -79,7 +81,7 @@ export const BASE_ERROR_CODE_INFO = { [COMPOSIO_SDK_ERROR_CODES.COMMON.INVALID_PARAMS_PASSED]: { message: "🕒 Invalid parameters passed", description: "The parameters passed are invalid", - possibleFix: "Please check the metadata.issues for more details", + possibleFix: "Please check the error message for more details", }, UNKNOWN: { message: null, diff --git a/js/src/sdk/utils/errors/src/formatter.ts b/js/src/sdk/utils/errors/src/formatter.ts index 7aa9af83b13..1771da74b53 100644 --- a/js/src/sdk/utils/errors/src/formatter.ts +++ b/js/src/sdk/utils/errors/src/formatter.ts @@ -6,11 +6,9 @@ import { } from "./constants"; export interface ErrorResponseData { - error: { - type: string; - name: string; - message: string; - }; + type: string; + name: string; + message: string; } interface ErrorDetails { @@ -31,21 +29,28 @@ export const getAPIErrorDetails = ( const defaultErrorDetails = { message: axiosError.message, - description: - axiosError.response?.data?.error?.message || - axiosError.response?.data?.error || - axiosError.message, - possibleFix: - "Please check the network connection, request parameters, and ensure the API endpoint is correct.", + description: axiosError?.response?.data?.message || axiosError.message, + possibleFix: "Please check the parameters you are passing to the API", }; const metadata = generateMetadataFromAxiosError(axiosError); - const errorNameFromBE = axiosError.response?.data?.error?.name; - const errorTypeFromBE = axiosError.response?.data?.error?.type; - const errorMessage = axiosError.response?.data?.error?.message; + const errorNameFromBE = axiosError?.response?.data?.name; + const errorTypeFromBE = axiosError?.response?.data?.type; + const errorMessage = axiosError?.response?.data?.message; - const genericMessage = `${errorNameFromBE || predefinedError.message} ${errorTypeFromBE ? `- ${errorTypeFromBE}` : ""} on ${axiosError.config?.baseURL! + axiosError.config?.url!}`; + let genericMessage = ""; + + const hasNotReceivedResponseFromBE = + errorCode === COMPOSIO_SDK_ERROR_CODES.BACKEND.UNAUTHORIZED || + errorCode === COMPOSIO_SDK_ERROR_CODES.BACKEND.RATE_LIMIT || + errorCode === COMPOSIO_SDK_ERROR_CODES.BACKEND.SERVER_UNAVAILABLE || + errorCode === COMPOSIO_SDK_ERROR_CODES.BACKEND.SERVER_UNREACHABLE; + if (hasNotReceivedResponseFromBE) { + genericMessage = predefinedError.message as string; + } else if (axiosError.config?.baseURL && axiosError.config?.url) { + genericMessage = `${errorNameFromBE || ""} ${errorTypeFromBE ? `- ${errorTypeFromBE}` : ""} on ${axiosError.config?.baseURL! + axiosError.config?.url!}`; + } switch (errorCode) { case COMPOSIO_SDK_ERROR_CODES.BACKEND.NOT_FOUND: @@ -67,9 +72,7 @@ export const getAPIErrorDetails = ( default: const message = genericMessage || axiosError.message; const description = - errorMessage || - (predefinedError.description as string) || - axiosError.message; + errorMessage || (predefinedError.description as string); const possibleFix = predefinedError.possibleFix! || (defaultErrorDetails.possibleFix as string) || diff --git a/js/src/sdk/utils/fileUtils.ts b/js/src/sdk/utils/fileUtils.ts index 4459a4c2ac5..3d95cf8e3f4 100644 --- a/js/src/sdk/utils/fileUtils.ts +++ b/js/src/sdk/utils/fileUtils.ts @@ -1,7 +1,3 @@ -import * as os from "os"; -import * as path from "path"; - -import * as fs from "fs"; import { COMPOSIO_DIR, TEMP_FILES_DIRECTORY_NAME } from "./constants"; /** @@ -10,11 +6,21 @@ import { COMPOSIO_DIR, TEMP_FILES_DIRECTORY_NAME } from "./constants"; * @returns The path to the Composio directory. */ export const getComposioDir = (createDirIfNotExists: boolean = false) => { - const composioDir = path.join(os.homedir(), COMPOSIO_DIR); - if (createDirIfNotExists && !fs.existsSync(composioDir)) { - fs.mkdirSync(composioDir, { recursive: true }); + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const os = require("os"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const path = require("path"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const fs = require("fs"); + const composioDir = path.join(os.homedir(), COMPOSIO_DIR); + if (createDirIfNotExists && !fs.existsSync(composioDir)) { + fs.mkdirSync(composioDir, { recursive: true }); + } + return composioDir; + } catch (_error) { + return null; } - return composioDir; }; /** @@ -25,15 +31,25 @@ export const getComposioDir = (createDirIfNotExists: boolean = false) => { export const getComposioTempFilesDir = ( createDirIfNotExists: boolean = false ) => { - const composioFilesDir = path.join( - os.homedir(), - COMPOSIO_DIR, - TEMP_FILES_DIRECTORY_NAME - ); - if (createDirIfNotExists && !fs.existsSync(composioFilesDir)) { - fs.mkdirSync(composioFilesDir, { recursive: true }); + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const os = require("os"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const path = require("path"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const fs = require("fs"); + const composioFilesDir = path.join( + os.homedir(), + COMPOSIO_DIR, + TEMP_FILES_DIRECTORY_NAME + ); + if (createDirIfNotExists && !fs.existsSync(composioFilesDir)) { + fs.mkdirSync(composioFilesDir, { recursive: true }); + } + return composioFilesDir; + } catch (_error) { + return null; } - return composioFilesDir; }; /** @@ -48,11 +64,19 @@ export const saveFile = ( content: string, isTempFile: boolean = false ) => { - const composioFilesDir = isTempFile - ? getComposioTempFilesDir(true) - : getComposioDir(true); - const filePath = path.join(composioFilesDir, path.basename(file)); - fs.writeFileSync(filePath, content); + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const path = require("path"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const fs = require("fs"); + const composioFilesDir = isTempFile + ? getComposioTempFilesDir(true) + : getComposioDir(true); + const filePath = path.join(composioFilesDir, path.basename(file)); + fs.writeFileSync(filePath, content); - return filePath; + return filePath; + } catch (_error) { + return null; + } }; diff --git a/js/src/sdk/utils/projectUtils.ts b/js/src/sdk/utils/projectUtils.ts index f1e4defc9bb..58fca2f1501 100644 --- a/js/src/sdk/utils/projectUtils.ts +++ b/js/src/sdk/utils/projectUtils.ts @@ -1,22 +1,27 @@ -import * as fs from "fs"; -import * as path from "path"; - /** * Finds the directory containing the package.json file by traversing up the directory tree. * @returns {string | null} The absolute path to the directory containing package.json, or null if not found. */ export function getPackageJsonDir(): string | null { - let currentDir = __dirname; + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const fs = require("fs"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const path = require("path"); + let currentDir = __dirname; + + while (currentDir !== path.parse(currentDir).root) { + const packageJsonPath = path.join(currentDir, "package.json"); - while (currentDir !== path.parse(currentDir).root) { - const packageJsonPath = path.join(currentDir, "package.json"); + if (fs.existsSync(packageJsonPath)) { + return currentDir; + } - if (fs.existsSync(packageJsonPath)) { - return currentDir; + currentDir = path.dirname(currentDir); } - currentDir = path.dirname(currentDir); + return null; + } catch (_error) { + return null; } - - return null; } diff --git a/js/src/types/base_toolset.ts b/js/src/types/base_toolset.ts index b87baa1a494..20fc6244854 100644 --- a/js/src/types/base_toolset.ts +++ b/js/src/types/base_toolset.ts @@ -37,7 +37,7 @@ export type RawActionData = z.infer; export const ZExecuteActionParams = z.object({ action: z.string(), params: z.record(z.any()).optional(), - entityId: z.string(), + entityId: z.string().optional(), nlaText: z.string().optional(), connectedAccountId: z.string().optional(), config: z diff --git a/js/src/utils/common.ts b/js/src/utils/common.ts index b8b757d3e83..83837c1e6da 100644 --- a/js/src/utils/common.ts +++ b/js/src/utils/common.ts @@ -1,5 +1,5 @@ -import crypto from "crypto"; +import { v4 as uuidv4 } from "uuid"; export const getUUID = () => { - return crypto.randomUUID(); + return uuidv4(); }; diff --git a/js/src/utils/external.ts b/js/src/utils/external.ts index bb0746539d7..13d631ac7fc 100644 --- a/js/src/utils/external.ts +++ b/js/src/utils/external.ts @@ -1,4 +1,3 @@ -import { spawn } from "child_process"; import { serializeValue } from "../sdk/utils/common"; import { IS_DEVELOPMENT_OR_CI } from "../sdk/utils/constants"; import logger from "./logger"; @@ -34,6 +33,8 @@ export function sendProcessReq(info: { try { // Use node-fetch for making HTTP requests const url = new URL(info.url); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const { spawn } = require("child_process"); const child = spawn("node", [ "-e", ` diff --git a/js/src/utils/logger.ts b/js/src/utils/logger.ts index 4eaa08c926e..ab1a1f6e020 100644 --- a/js/src/utils/logger.ts +++ b/js/src/utils/logger.ts @@ -1,4 +1,3 @@ -import winston from "winston"; import { getEnvVariable } from "./shared"; // Define log levels with corresponding priorities @@ -9,14 +8,6 @@ const LOG_LEVELS = { debug: 3, // Debug information } as const; -// Define colors for each log level for better visibility -const LOG_COLORS = { - error: "red", // Critical errors in red - warn: "yellow", // Warnings in yellow - info: "blue", // Info in blue - debug: "green", // Debug in green -}; - /** * Get the current log level from environment variables. * Defaults to 'info' if not set or invalid. @@ -32,45 +23,45 @@ export const getLogLevel = (): keyof typeof LOG_LEVELS => { : "info"; }; -// Configure winston colors -winston.addColors(LOG_COLORS); - -// Create custom log format -const logFormat = winston.format.combine( - winston.format.timestamp(), - winston.format.colorize(), - winston.format.printf(({ timestamp, level, message, ...metadata }) => { - // Format timestamp for readability - const formattedTime = timestamp.slice(5, 22).replace("T", " "); +const addTimestampToMessage = (message: string): string => { + const timestamp = new Date().toISOString(); + return `${timestamp} - ${message}`; +}; - // Handle metadata serialization - let metadataStr = ""; - if (Object.keys(metadata).length) { - try { - metadataStr = ` - ${JSON.stringify(metadata)}`; - } catch { - metadataStr = " - [Circular metadata object]"; - } - } +const formatErrorMessage = (args: unknown[]): string => { + return args + .map((arg) => (typeof arg === "object" ? JSON.stringify(arg) : arg)) + .join(" "); +}; - return `[${level}]: ${formattedTime} - ${message}${metadataStr}`; - }) -); +const getLogger = () => { + const logger = console; + const loggingLevel = getLogLevel(); + const logLevelValue = LOG_LEVELS[loggingLevel]; + const noop = () => {}; -// Create and configure logger instance -const logger = winston.createLogger({ - // This can be overridden by the user by setting the COMPOSIO_LOGGING_LEVEL environment variable - // Only this or higher priority logs will be shown - level: getLogLevel(), - levels: LOG_LEVELS, - format: logFormat, - transports: [ - new winston.transports.Console({ - handleExceptions: false, - handleRejections: false, - }), - ], - exitOnError: false, // Prevent crashes on uncaught exceptions -}); + return { + error: + logLevelValue >= LOG_LEVELS.error + ? (...args: unknown[]) => + logger.error(addTimestampToMessage(formatErrorMessage(args))) + : noop, + warn: + logLevelValue >= LOG_LEVELS.warn + ? (...args: unknown[]) => + logger.warn(addTimestampToMessage(formatErrorMessage(args))) + : noop, + info: + logLevelValue >= LOG_LEVELS.info + ? (...args: unknown[]) => + logger.info(addTimestampToMessage(formatErrorMessage(args))) + : noop, + debug: + logLevelValue >= LOG_LEVELS.debug + ? (...args: unknown[]) => + logger.debug(addTimestampToMessage(formatErrorMessage(args))) + : noop, + }; +}; -export default logger; +export default getLogger(); diff --git a/js/switch_package.sh b/js/switch_package.sh new file mode 100755 index 00000000000..a53dfa9b78d --- /dev/null +++ b/js/switch_package.sh @@ -0,0 +1,13 @@ +echo "Switching package name: Dev track will publish to npm as composio-dev-trac will publish to npm as composio-core" +echo "Is this the dev track? (yes/no)" +read dev_track + +if [ "$dev_track" = "yes" ]; then + sed -i.bak 's/"name": ".*"/"name": "composio-dev-track"/' package.json && rm package.json.bak + sed -i.bak 's/"name": ".*"/"name": "composio-dev-track"/' package.dist.json && rm package.dist.json.bak + echo "Package name changed to composio-dev-track" +else + sed -i.bak 's/"name": ".*"/"name": "composio-core"/' package.json && rm package.json.bak + sed -i.bak 's/"name": ".*"/"name": "composio-core"/' package.dist.json && rm package.dist.json.bak + echo "Package name changed to composio-core" +fi From 42d16239a91b4a13ea0e8ff93783626faec2a918 Mon Sep 17 00:00:00 2001 From: Viraj <35092918+angrybayblade@users.noreply.github.com> Date: Thu, 2 Jan 2025 12:24:36 +0530 Subject: [PATCH 09/14] feat: add support for delegating custom auth to runtime actions (#1120) --- python/composio/tools/base/runtime.py | 24 +++++-- python/composio/tools/toolset.py | 67 ++++++++++++++---- python/tests/test_tools/test_toolset.py | 90 ++++++++++++++++++++++++- 3 files changed, 160 insertions(+), 21 deletions(-) diff --git a/python/composio/tools/base/runtime.py b/python/composio/tools/base/runtime.py index 49e07f777ce..08ad0fb58c6 100644 --- a/python/composio/tools/base/runtime.py +++ b/python/composio/tools/base/runtime.py @@ -266,20 +266,32 @@ def _get_connected_account( return None -def _get_auth_params(app: str, entity_id: str) -> t.Optional[t.Dict]: +def _get_auth_params(app: str, metadata: t.Dict) -> t.Dict: try: client = Composio.get_latest() connected_account = client.connected_accounts.get( - connection_id=client.get_entity(entity_id).get_connection(app=app).id + connection_id=client.get_entity(metadata["entity_id"]) + .get_connection(app=app) + .id ) connection_params = connected_account.connectionParams return { + "entity_id": metadata["entity_id"], "headers": connection_params.headers, "base_url": connection_params.base_url, "query_params": connection_params.queryParams, } except ComposioClientError: - return None + return { + "entity_id": metadata["entity_id"], + "subdomain": metadata.pop("subdomain", {}), + "headers": metadata.pop("header", {}), + "base_url": metadata.pop("base_url", None), + "body_params": metadata.pop("body", {}), + "path_params": metadata.pop("path", {}), + "query_params": metadata.pop("query", {}), + **metadata, + } def _build_executable_from_args( # pylint: disable=too-many-statements @@ -400,9 +412,7 @@ def execute(request: BaseModel, metadata: t.Dict) -> BaseModel: _get_connected_account(app=app, entity_id=metadata["entity_id"]) or {} ) if auth_param: - kwargs["auth"] = ( - _get_auth_params(app=app, entity_id=metadata["entity_id"]) or {} - ) + kwargs["auth"] = _get_auth_params(app=app, metadata=metadata) if request_executor: toolset = t.cast("ComposioToolSet", metadata["_toolset"]) @@ -443,7 +453,7 @@ def execute_request( def _build_executable_from_request_class(f: t.Callable, app: str) -> t.Callable: def execute(request: BaseModel, metadata: t.Dict) -> BaseModel: """Wrapper for action callable.""" - auth_data = _get_auth_params(app=app, entity_id=metadata["entity_id"]) + auth_data = _get_auth_params(app=app, metadata=metadata) if auth_data is not None: metadata.update(auth_data) return f(request, metadata) diff --git a/python/composio/tools/toolset.py b/python/composio/tools/toolset.py index 54886e48d29..5c9b7a4844c 100644 --- a/python/composio/tools/toolset.py +++ b/python/composio/tools/toolset.py @@ -476,6 +476,59 @@ def check_connected_account(self, action: ActionType) -> None: f"Run `composio add {action.app.lower()}` to fix this" ) + def _get_custom_params_for_local_action( + self, + custom_auth: CustomAuthObject, + app: str, + ) -> t.Dict: + metadata = {} + invalid_auth = [] + for param in custom_auth.parameters: + if param["in_"] == "metadata": + metadata[param["name"]] = param["value"] + continue + invalid_auth.append(param) + + if len(invalid_auth) > 0: + raise ComposioSDKError( + f"Invalid custom auth found for {app}: {invalid_auth}" + ) + return metadata + + def _get_custom_params_for_runtime_action( + self, + custom_auth: CustomAuthObject, + ) -> t.Dict: + metadata: t.Dict[str, t.Any] = { + "base_url": custom_auth.base_url, + "body": custom_auth.body, + "path": {}, + "query": {}, + "header": {}, + "subdomain": {}, + } + for param in custom_auth.parameters: + if param["in_"] == "metadata": + metadata[param["name"]] = param["value"] + else: + metadata[param["in_"]][param["name"]] = param["value"] + return metadata + + def _get_custom_params_for_local_execution(self, action: Action) -> t.Dict: + custom_auth = self._custom_auth.get(App(action.app)) + if custom_auth is None: + return {} + + if action.is_runtime: + return self._get_custom_params_for_runtime_action( + custom_auth=custom_auth, + ) + + return self._get_custom_params_for_local_action( + custom_auth=custom_auth, + app=action.app, + ) + def _execute_local( self, action: Action, @@ -486,19 +539,7 @@ def _execute_local( """Execute a local action.""" metadata = metadata or {} metadata["_toolset"] = self - custom_auth = self._custom_auth.get(App(action.app)) - if custom_auth is not None: - invalid_auth = [] - for param in custom_auth.parameters: - if param["in_"] == "metadata": - metadata[param["name"]] = param["value"] - continue - invalid_auth.append(param) - if len(invalid_auth) > 0: - raise ComposioSDKError( - f"Invalid custom auth found for {action.app}: {invalid_auth}" - ) - + metadata.update(self._get_custom_params_for_local_execution(action=action)) response = self.workspace.execute_action( action=action, request_data=params, diff --git a/python/tests/test_tools/test_toolset.py b/python/tests/test_tools/test_toolset.py index 6b171795d72..e4b0efc5bf3 100644 --- a/python/tests/test_tools/test_toolset.py +++ b/python/tests/test_tools/test_toolset.py @@ -8,7 +8,7 @@ from unittest import mock import pytest -from pydantic import BaseModel +from pydantic import BaseModel, Field from composio import Action, App from composio.exceptions import ApiKeyNotProvidedError, ComposioSDKError @@ -387,6 +387,94 @@ def test_bad_custom_auth_on_localtool(): ) +def test_custom_auth_runtime_tool(): + tool = "tool" + expected_data = { + "api-key": "api-key", + "entity_id": "default", + "subdomain": {"workspace": "composio"}, + "headers": {"Authorization": "Bearer gth_...."}, + "base_url": "https://api.app.dev", + "body_params": {"address": "633"}, + "path_params": {"name": "user"}, + "query_params": {"page": "1"}, + } + + @custom_action(toolname=tool) + def action_1(auth: t.Dict) -> int: + """ + Custom action 1 + + :return exit_code: int + """ + del auth["_browsers"] + del auth["_filemanagers"] + del auth["_shells"] + del auth["_toolset"] + assert auth == expected_data + return 0 + + class Req(BaseModel): + pass + + class Res(BaseModel): + data: int = Field(...) + + @custom_action(toolname=tool) + def action_2( + request: Req, # pylint: disable=unused-argument + metadata: dict, + ) -> Res: + del metadata["_browsers"] + del metadata["_filemanagers"] + del metadata["_shells"] + del metadata["_toolset"] + assert metadata == expected_data + return Res(data=0) + + toolset = ComposioToolSet() + toolset.add_auth( + app=tool, + parameters=[ + { + "in_": "header", + "name": "Authorization", + "value": "Bearer gth_....", + }, + { + "in_": "metadata", + "name": "api-key", + "value": "api-key", + }, + { + "in_": "path", + "name": "name", + "value": "user", + }, + { + "in_": "query", + "name": "page", + "value": "1", + }, + { + "in_": "subdomain", + "name": "workspace", + "value": "composio", + }, + ], + base_url="https://api.app.dev", + body={ + "address": "633", + }, + ) + + result = toolset.execute_action(action=action_1, params={}) + assert result["successful"] + + result = toolset.execute_action(action=action_2, params={}) + assert result["successful"] + + class TestSubclassInit: def test_runtime(self): From 33beb028ad79927c2b863133f756876f14d6bc05 Mon Sep 17 00:00:00 2001 From: tushar-composio Date: Thu, 2 Jan 2025 12:34:36 +0530 Subject: [PATCH 10/14] chore: Improve debug logging, and add help links to warnings (#1111) --- python/composio/client/collections.py | 9 ++-- python/composio/tools/toolset.py | 28 +++++------ python/composio/utils/__init__.py | 48 +++++++++++++++++++ python/composio/utils/decorators.py | 4 +- .../plugins/camel/composio_camel/toolset.py | 9 +++- .../plugins/claude/composio_claude/toolset.py | 10 +++- .../crew_ai/composio_crewai/toolset.py | 11 ++++- .../plugins/google/composio_google/toolset.py | 9 +++- .../griptape/composio_griptape/toolset.py | 9 +++- .../langchain/composio_langchain/toolset.py | 9 +++- .../llamaindex/composio_llamaindex/toolset.py | 9 +++- python/plugins/lyzr/composio_lyzr/toolset.py | 9 +++- .../plugins/openai/composio_openai/toolset.py | 9 +++- .../phidata/composio_phidata/toolset.py | 9 +++- .../praisonai/composio_praisonai/toolset.py | 9 +++- 15 files changed, 160 insertions(+), 31 deletions(-) diff --git a/python/composio/client/collections.py b/python/composio/client/collections.py index a8548520b5e..71c4dc1aee1 100644 --- a/python/composio/client/collections.py +++ b/python/composio/client/collections.py @@ -34,7 +34,7 @@ ) from composio.client.exceptions import ComposioClientError, ComposioSDKError from composio.constants import PUSHER_CLUSTER, PUSHER_KEY -from composio.utils import logging +from composio.utils import help_msg, logging from composio.utils.shared import generate_request_id @@ -696,7 +696,7 @@ def handle_event(self, event: str) -> None: self.logger.error(f"Error parsing trigger payload: {event}") return - self.logger.info( + self.logger.debug( f"Received trigger event with trigger ID: {data.metadata.id} " f"and trigger name: {data.metadata.triggerName}" ) @@ -926,7 +926,7 @@ def disable(self, id: str) -> t.Dict: def subscribe(self, timeout: float = 15.0) -> TriggerSubscription: """Subscribe to a trigger and receive trigger events.""" - self.logger.info("Creating trigger subscription") + self.logger.debug("Creating trigger subscription") response = self._raise_if_required( response=self.client.http.get( url="/v1/client/auth/client_info", @@ -1150,7 +1150,8 @@ def is_action(obj): if len(apps) > 0 and len(tags) == 0 and not allow_all: warnings.warn( "Using all actions of an app is not recommended for production." - "Learn more: https://docs.composio.dev/patterns/tools/use-tools/use-specific-actions", + "Learn more: https://docs.composio.dev/patterns/tools/use-tools/use-specific-actions\n\n" + + help_msg(), UserWarning, ) tags = ["important"] diff --git a/python/composio/tools/toolset.py b/python/composio/tools/toolset.py index 5c9b7a4844c..e4155f263b6 100644 --- a/python/composio/tools/toolset.py +++ b/python/composio/tools/toolset.py @@ -64,6 +64,7 @@ from composio.tools.env.factory import HostWorkspaceConfig, WorkspaceFactory from composio.tools.local import load_local_tools from composio.tools.local.handler import LocalClient +from composio.utils import help_msg from composio.utils.enums import get_enum_key from composio.utils.logging import LogIngester, LogLevel, WithLogger from composio.utils.url import get_api_url_base @@ -175,6 +176,7 @@ def __init_subclass__( if len(args) > 0 or len(kwargs) > 0: error = ( f"Composio toolset subclass initializer got extra {args=} and {kwargs=}" + + help_msg() ) if _is_ci(): raise RuntimeError(error) @@ -274,12 +276,6 @@ def _limit_file_search_response(response: t.Dict) -> t.Dict: logging_level=logging_level, verbosity_level=verbosity_level, ) - self.logger.info( - f"Logging is set to {self._logging_level}, " - "use `logging_level` argument or " - "`COMPOSIO_LOGGING_LEVEL` change this" - ) - self.session_id = workspace_id or uuid.uuid4().hex self.entity_id = entity_id @@ -303,7 +299,7 @@ def _limit_file_search_response(response: t.Dict) -> t.Dict: if processors is not None: warnings.warn( "Setting 'processors' on the ToolSet is deprecated, they should" - "be provided to the 'get_tools()' method instead.", + "be provided to the 'get_tools()' method instead.\n", DeprecationWarning, stacklevel=2, ) @@ -318,7 +314,9 @@ def _limit_file_search_response(response: t.Dict) -> t.Dict: self._custom_auth = {} if len(kwargs) > 0: - self.logger.info(f"Extra kwargs while initializing toolset: {kwargs}") + self.logger.warning( + f"Unused kwargs while initializing toolset: {kwargs}" + help_msg() + ) self.logger.debug("Loading local tools") load_local_tools() @@ -660,7 +658,7 @@ def _write_to_file( ).hexdigest() self._ensure_output_dir_exists() outfile = self.output_dir / filename - self.logger.info(f"Writing output to: {outfile}") + self.logger.debug(f"Writing output to: {outfile}") _write_file(outfile, json.dumps(output)) return { "message": f"output written to {outfile.resolve()}", @@ -731,7 +729,7 @@ def _process( ) -> t.Union[t.Dict, _Retry]: processor = self._get_processor(key=key, type_=type_) if processor is not None: - self.logger.info( + self.logger.debug( f"Running {'request' if type_ == 'pre' else 'response' if type_ == 'post' else 'schema'}" f" through: {processor.__name__}" ) @@ -876,7 +874,7 @@ def execute_action( action=action ) - self.logger.info( + self.logger.debug( f"Executing `{action.slug}` with {params=} and {metadata=} {connected_account_id=}" ) @@ -905,14 +903,14 @@ def execute_action( else self._process_respone(action=action, response=response) ) if isinstance(processed_response, _Retry): - self.logger.info( + self.logger.debug( f"Got {processed_response=} from {action=} with {params=}, retrying..." ) failed_responses.append(response) continue response = processed_response - self.logger.info(f"Got {response=} from {action=} with {params=}") + self.logger.debug(f"Got {response=} from {action=} with {params=}") return response return SuccessExecuteActionResponseModel( @@ -978,7 +976,7 @@ def execute_request( "Please provide connection id or app name to execute a request" ) - self.logger.info( + self.logger.debug( f"Executing request to {endpoint} with method={method}, connection_id={connection_id}" ) response = self.client.actions.request( @@ -988,7 +986,7 @@ def execute_request( endpoint=endpoint, parameters=parameters, ) - self.logger.info(f"Got {response=}") + self.logger.debug(f"Got {response=}") return response def validate_tools( diff --git a/python/composio/utils/__init__.py b/python/composio/utils/__init__.py index c4f9fbe8419..72a8ae5f487 100644 --- a/python/composio/utils/__init__.py +++ b/python/composio/utils/__init__.py @@ -2,4 +2,52 @@ Helper utilities. """ +import sys + from .enums import get_enum_key + + +def blue(message: str) -> str: + return f"\033[36m{message}\033[0m" + + +def green(message: str) -> str: + return f"\033[32m{message}\033[0m" + + +help_msg_already_printed = False + + +def help_msg() -> str: + global help_msg_already_printed + if help_msg_already_printed: + return "" + + help_msg_already_printed = True + if sys.stdout.isatty(): + return ( + blue("Give Feedback / Get Help:\n") + + blue(" On GitHub: ") + + "https://github.com/ComposioHQ/composio/issues/new\n" + + blue(" On Discord: ") + + "https://dub.composio.dev/discord\n" + + blue(" On Email: ") + + "tech@composio.dev\n" + + blue(" Talk to us on Intercom: ") + + "https://composio.dev\n" + + blue(" Book a call with us: ") + + "https://calendly.com/soham-composio/30min\n" + + "If you need to debug this error, " + + green("set `COMPOSIO_LOGGING_LEVEL=debug`") + + "." + ) + + return ( + "Give Feedback / Get Help:\n" + " On GitHub: https://github.com/ComposioHQ/composio/issues/new\n" + " On Discord: https://dub.composio.dev/discord\n" + " On Email: tech@composio.dev\n" + " Talk to us on Intercom: https://composio.dev\n" + " Book a call with us: https://calendly.com/soham-composio/30min\n" + "If you need to debug this error, set `COMPOSIO_LOGGING_LEVEL=debug`." + ) diff --git a/python/composio/utils/decorators.py b/python/composio/utils/decorators.py index bf409b2f732..dae974cc87d 100644 --- a/python/composio/utils/decorators.py +++ b/python/composio/utils/decorators.py @@ -7,6 +7,8 @@ import typing_extensions as te +from composio.utils import help_msg + T = te.TypeVar("T") P = te.ParamSpec("P") @@ -27,7 +29,7 @@ def wrapper(func: t.Callable[P, T]) -> t.Callable[P, T]: def new_func(*args: P.args, **kwargs: P.kwargs) -> T: warnings.warn( f"`{func.__name__}` is deprecated and will be removed on v{version}. " - f"Use `{replacement}` method instead.", + f"Use `{replacement}` method instead." + help_msg(), UserWarning, ) return func(*args, **kwargs) diff --git a/python/plugins/camel/composio_camel/toolset.py b/python/plugins/camel/composio_camel/toolset.py index 20845e09dbd..9a4311dc07e 100644 --- a/python/plugins/camel/composio_camel/toolset.py +++ b/python/plugins/camel/composio_camel/toolset.py @@ -3,6 +3,7 @@ """ import typing as t +import warnings import typing_extensions as te @@ -14,6 +15,7 @@ from composio.tools import ComposioToolSet as BaseComposioToolSet from composio.tools.schema import OpenAISchema, SchemaType from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg # pylint: enable=E0611 @@ -131,7 +133,7 @@ def function(**kwargs: t.Any) -> t.Dict: openai_tool_schema=schema, ) - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -145,6 +147,11 @@ def get_actions( :return: Composio tools wrapped as `OpenAIFunction` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( diff --git a/python/plugins/claude/composio_claude/toolset.py b/python/plugins/claude/composio_claude/toolset.py index c2a6a3928a3..3f28ef8efc8 100644 --- a/python/plugins/claude/composio_claude/toolset.py +++ b/python/plugins/claude/composio_claude/toolset.py @@ -1,7 +1,10 @@ import typing as t +import warnings import typing_extensions as te +from composio.utils import help_msg + try: from anthropic.types.beta.tools import ToolUseBlock, ToolsBetaMessage @@ -86,7 +89,7 @@ def validate_entity_id(self, entity_id: str) -> str: entity_id = self.entity_id return entity_id - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions(self, actions: t.Sequence[ActionType]) -> t.List[ToolParam]: """ Get composio tools wrapped as `ToolParam` objects. @@ -94,6 +97,11 @@ def get_actions(self, actions: t.Sequence[ActionType]) -> t.List[ToolParam]: :param actions: List of actions to wrap :return: Composio tools wrapped as `ToolParam` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions) def get_tools( diff --git a/python/plugins/crew_ai/composio_crewai/toolset.py b/python/plugins/crew_ai/composio_crewai/toolset.py index ad4ae8b538f..b8af8c2d308 100644 --- a/python/plugins/crew_ai/composio_crewai/toolset.py +++ b/python/plugins/crew_ai/composio_crewai/toolset.py @@ -1,6 +1,10 @@ +import warnings + from crewai import __version__ from semver import Version +from composio.utils import help_msg + _BREAKING_VERSION = Version(major=0, minor=79, patch=0) _CURRENT_VERSION = Version.parse(__version__) @@ -122,7 +126,7 @@ def _run(self, *args, **kwargs): ), ) - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -136,6 +140,11 @@ def get_actions( :return: Composio tools wrapped as `StructuredTool` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( diff --git a/python/plugins/google/composio_google/toolset.py b/python/plugins/google/composio_google/toolset.py index f6e4b4fe6b3..721ee02942b 100644 --- a/python/plugins/google/composio_google/toolset.py +++ b/python/plugins/google/composio_google/toolset.py @@ -3,6 +3,7 @@ """ import typing as t +import warnings import typing_extensions as te from proto.marshal.collections.maps import MapComposite @@ -17,6 +18,7 @@ from composio import Action, ActionType, AppType, TagType from composio.constants import DEFAULT_ENTITY_ID from composio.tools import ComposioToolSet as BaseComposioToolSet +from composio.utils import help_msg from composio.utils.shared import json_schema_to_model @@ -110,7 +112,7 @@ def _wrap_tool( parameters=cleaned_parameters, ) - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -124,6 +126,11 @@ def get_actions( :return: Composio tools wrapped as `FunctionDeclaration` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tool(actions=actions, entity_id=entity_id) def get_tool( diff --git a/python/plugins/griptape/composio_griptape/toolset.py b/python/plugins/griptape/composio_griptape/toolset.py index 0588b951b24..14fa375319f 100644 --- a/python/plugins/griptape/composio_griptape/toolset.py +++ b/python/plugins/griptape/composio_griptape/toolset.py @@ -1,5 +1,6 @@ import logging import typing as t +import warnings import typing_extensions as te from griptape.tools import BaseTool @@ -9,6 +10,7 @@ from composio import Action, ActionType, AppType, TagType from composio.tools import ComposioToolSet as BaseComposioToolSet from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg from composio.utils.shared import PYDANTIC_TYPE_TO_PYTHON_TYPE @@ -116,7 +118,7 @@ def manifest(self) -> t.Dict: cls = type(name, (GripTapeTool,), {}) return cls() - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -129,6 +131,11 @@ def get_actions( :param entity_id: Entity ID to use for executing function calls. :return: Composio tools wrapped as `BaseTool` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( diff --git a/python/plugins/langchain/composio_langchain/toolset.py b/python/plugins/langchain/composio_langchain/toolset.py index a8740d6105b..c13e6e1c4a7 100644 --- a/python/plugins/langchain/composio_langchain/toolset.py +++ b/python/plugins/langchain/composio_langchain/toolset.py @@ -1,5 +1,6 @@ import types import typing as t +import warnings from inspect import Signature import pydantic @@ -10,6 +11,7 @@ from composio import ActionType, AppType, TagType from composio.tools import ComposioToolSet as BaseComposioToolSet from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg from composio.utils.pydantic import parse_pydantic_error from composio.utils.shared import ( get_signature_format_from_schema_params, @@ -129,7 +131,7 @@ def _wrap_tool( ) return tool # type: ignore - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -143,6 +145,11 @@ def get_actions( :return: Composio tools wrapped as `StructuredTool` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( diff --git a/python/plugins/llamaindex/composio_llamaindex/toolset.py b/python/plugins/llamaindex/composio_llamaindex/toolset.py index 38d5f01aad2..3716b20694d 100644 --- a/python/plugins/llamaindex/composio_llamaindex/toolset.py +++ b/python/plugins/llamaindex/composio_llamaindex/toolset.py @@ -1,5 +1,6 @@ import types import typing as t +import warnings from inspect import Signature import typing_extensions as te @@ -9,6 +10,7 @@ from composio import ComposioToolSet as BaseComposioToolSet from composio import TagType from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg from composio.utils.shared import get_pydantic_signature_format_from_schema_params @@ -111,7 +113,7 @@ def _wrap_tool( description=description, ) - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -125,6 +127,11 @@ def get_actions( :return: Composio tools wrapped as `StructuredTool` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( diff --git a/python/plugins/lyzr/composio_lyzr/toolset.py b/python/plugins/lyzr/composio_lyzr/toolset.py index f22607f8ad0..b990493ceff 100644 --- a/python/plugins/lyzr/composio_lyzr/toolset.py +++ b/python/plugins/lyzr/composio_lyzr/toolset.py @@ -4,6 +4,7 @@ import types import typing as t +import warnings from inspect import Signature import typing_extensions as te @@ -12,6 +13,7 @@ from composio import Action, ActionType, AppType, TagType from composio.tools import ComposioToolSet as BaseComposioToolSet from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg from composio.utils.shared import ( get_signature_format_from_schema_params, json_schema_to_model, @@ -72,7 +74,7 @@ def function(**kwargs: t.Any) -> t.Dict: default_params={}, ) - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -86,6 +88,11 @@ def get_actions( :return: Composio tools wrapped as `Tool` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( diff --git a/python/plugins/openai/composio_openai/toolset.py b/python/plugins/openai/composio_openai/toolset.py index 47e8e184371..e199bb9693e 100644 --- a/python/plugins/openai/composio_openai/toolset.py +++ b/python/plugins/openai/composio_openai/toolset.py @@ -5,6 +5,7 @@ import json import time import typing as t +import warnings import typing_extensions as te from openai import Client @@ -21,6 +22,7 @@ from composio.tools import ComposioToolSet as BaseComposioToolSet from composio.tools.schema import OpenAISchema, SchemaType from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg class ComposioToolSet( @@ -86,7 +88,7 @@ def validate_entity_id(self, entity_id: str) -> str: entity_id = self.entity_id return entity_id - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType] ) -> t.List[ChatCompletionToolParam]: @@ -96,6 +98,11 @@ def get_actions( :param actions: List of actions to wrap :return: Composio tools wrapped as `ChatCompletionToolParam` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions) def get_tools( diff --git a/python/plugins/phidata/composio_phidata/toolset.py b/python/plugins/phidata/composio_phidata/toolset.py index be08d02d356..6304a980691 100644 --- a/python/plugins/phidata/composio_phidata/toolset.py +++ b/python/plugins/phidata/composio_phidata/toolset.py @@ -4,6 +4,7 @@ import json import typing as t +import warnings import typing_extensions as te from phi.tools.toolkit import Toolkit @@ -13,6 +14,7 @@ from composio import ComposioToolSet as BaseComposioToolSet from composio import TagType from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg class ComposioToolSet( @@ -73,7 +75,7 @@ def function(**kwargs: t.Any) -> str: return toolkit - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions(self, actions: t.Sequence[ActionType]) -> t.List[Toolkit]: """ Get composio tools wrapped as Phidata `Toolkit` objects. @@ -84,6 +86,11 @@ def get_actions(self, actions: t.Sequence[ActionType]) -> t.List[Toolkit]: Returns: List[Toolkit]: Composio tools wrapped as `Toolkit` objects """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions) def get_tools( diff --git a/python/plugins/praisonai/composio_praisonai/toolset.py b/python/plugins/praisonai/composio_praisonai/toolset.py index ed38e29eed0..2b03d36e6e1 100644 --- a/python/plugins/praisonai/composio_praisonai/toolset.py +++ b/python/plugins/praisonai/composio_praisonai/toolset.py @@ -1,5 +1,6 @@ import os import typing as t +import warnings import typing_extensions as te @@ -7,6 +8,7 @@ from composio import ComposioToolSet as BaseComposioToolSet from composio import TagType from composio.tools.toolset import ProcessorsType +from composio.utils import help_msg _openapi_to_python = { @@ -168,7 +170,7 @@ def get_tools_section(self, tool_names: t.List) -> str: return "\n".join(tools_section_parts) - @te.deprecated("Use `ComposioToolSet.get_tools` instead") + @te.deprecated("Use `ComposioToolSet.get_tools` instead.\n", category=None) def get_actions( self, actions: t.Sequence[ActionType], @@ -181,6 +183,11 @@ def get_actions( :param entity_id: Entity ID to use for executing function calls. :return: Name of the tools written """ + warnings.warn( + "Use `ComposioToolSet.get_tools` instead.\n" + help_msg(), + DeprecationWarning, + stacklevel=2, + ) return self.get_tools(actions=actions, entity_id=entity_id) def get_tools( From 27df7e5f9eab96d2fa9d1975c4df2c0016621a77 Mon Sep 17 00:00:00 2001 From: Himanshu Dixit Date: Thu, 2 Jan 2025 12:40:36 +0530 Subject: [PATCH 11/14] fix: type typo and getTools w custom action (#1121) --- js/examples/e2e/demo.mjs | 22 +++++++++++++++------- js/examples/e2e/demo.ts | 27 ++++++++++++++++++++------- js/src/frameworks/langchain.spec.ts | 4 ++++ js/src/frameworks/langchain.ts | 2 +- js/src/sdk/actionRegistry.ts | 2 +- js/src/sdk/base.toolset.ts | 6 +++--- js/src/sdk/models/actions.ts | 4 ++-- js/src/types/base_toolset.ts | 4 ++-- 8 files changed, 48 insertions(+), 23 deletions(-) diff --git a/js/examples/e2e/demo.mjs b/js/examples/e2e/demo.mjs index f2604c7b844..d9292f31a76 100644 --- a/js/examples/e2e/demo.mjs +++ b/js/examples/e2e/demo.mjs @@ -1,24 +1,32 @@ import { Composio, LangchainToolSet } from "composio-core"; import { z } from "zod"; -const toolset = new LangchainToolSet(); +const toolset = new LangchainToolSet({}); (async() => { console.log("Creating action"); + try { await toolset.createAction({ actionName: "helloWorld", description: "This is a test action for handling hello world", - params: z.object({ + inputParams: z.object({ name: z.string().optional() }), callback: async (params) => { const { name } = params; - return `Hello ${name || "World"} from the function`; + return { + successful: true, + data: { + name: name || "World" + } + } } }); - console.log("Tools are registered", await toolset.getTools({actions: ["helloWorld"]})); - // Sending params to the action - const result = await toolset.executeAction("helloWorld", { name: "Alice" }, {}); - console.log("Action result:", result); + console.log("Tools are registered", await toolset.getTools({ + actions: ["helloWorld"] + })); + } catch (error) { + console.error("Error creating action", error); + } })(); \ No newline at end of file diff --git a/js/examples/e2e/demo.ts b/js/examples/e2e/demo.ts index aa1e8f73415..f6006455e30 100644 --- a/js/examples/e2e/demo.ts +++ b/js/examples/e2e/demo.ts @@ -1,19 +1,32 @@ - import { Composio, LangchainToolSet } from "composio-core"; +import { z } from "zod"; const toolset = new LangchainToolSet(); (async() => { console.log("Creating action"); + try { await toolset.createAction({ actionName: "helloWorld", description: "This is a test action for handling hello world", - callback: async () => { - return "Hello World from the function"; + inputParams: z.object({ + name: z.string().optional() + }), + callback: async (params) => { + const { name } = params; + return { + successful: true, + data: { + name: name || "World" + } + } } }); - console.log("Tools are registered", toolset.getTools()); -}) - - + console.log("Tools are registered", await toolset.getTools({ + actions: ["helloWorld"] + })); + } catch (error) { + console.error("Error creating action", error); + } +})(); \ No newline at end of file diff --git a/js/src/frameworks/langchain.spec.ts b/js/src/frameworks/langchain.spec.ts index bc9852b21e1..3de2c63adb6 100644 --- a/js/src/frameworks/langchain.spec.ts +++ b/js/src/frameworks/langchain.spec.ts @@ -60,6 +60,10 @@ describe("Apps class tests", () => { }, }); + langchainToolSet.getTools({ + actions: ["starRepositoryCustomAction"], + }); + const actionOuput = await langchainToolSet.executeAction({ action: "starRepositoryCustomAction", params: { diff --git a/js/src/frameworks/langchain.ts b/js/src/frameworks/langchain.ts index 4eeae1ecc7a..3d0eca25609 100644 --- a/js/src/frameworks/langchain.ts +++ b/js/src/frameworks/langchain.ts @@ -69,7 +69,7 @@ export class LangchainToolSet extends BaseComposioToolSet { } async getTools( - filters: z.infer, + filters: z.infer = {}, entityId: Optional = null ): Promise> { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { diff --git a/js/src/sdk/actionRegistry.ts b/js/src/sdk/actionRegistry.ts index 1d01e5b7193..3d13ab6b537 100644 --- a/js/src/sdk/actionRegistry.ts +++ b/js/src/sdk/actionRegistry.ts @@ -135,7 +135,7 @@ export class ActionRegistry { throw new Error(`Action with name ${name} could not be retrieved`); } - const { callback, toolName } = action.metadata; + const { callback, toolName } = action.metadata || {}; let authCredentials = {}; if (toolName) { const entity = await this.client.getEntity(metadata.entityId); diff --git a/js/src/sdk/base.toolset.ts b/js/src/sdk/base.toolset.ts index e8455d185ea..f953bc7325c 100644 --- a/js/src/sdk/base.toolset.ts +++ b/js/src/sdk/base.toolset.ts @@ -141,15 +141,15 @@ export class ComposioToolSet { const toolsWithCustomActions = ( await this.userActionRegistry.getAllActions() ).filter((action) => { - const { actionName, toolName } = action.metadata; + const { name: actionName, toolName } = action.metadata || {}; return ( (!filters.actions || filters.actions.some( - (name) => name.toLowerCase() === actionName!.toLowerCase() + (name) => name.toLowerCase() === actionName?.toLowerCase() )) && (!filters.apps || filters.apps.some( - (name) => name.toLowerCase() === toolName!.toLowerCase() + (name) => name.toLowerCase() === toolName?.toLowerCase() )) && (!filters.tags || filters.tags.some((tag) => tag.toLowerCase() === "custom")) diff --git a/js/src/sdk/models/actions.ts b/js/src/sdk/models/actions.ts index 6c585196471..231594dee67 100644 --- a/js/src/sdk/models/actions.ts +++ b/js/src/sdk/models/actions.ts @@ -26,7 +26,7 @@ import { BackendClient } from "./backendClient"; export type ActionListParams = z.infer; export type HeaderSingleParameters = z.infer; export type CustomAuth = z.infer; -export type ActionxExecuteParam = z.infer; +export type ActionExecuteParam = z.infer; export type ActionItemParam = z.infer; export type FindActionEnumsByUseCaseParam = z.infer< typeof ZFindActionEnumsByUseCaseParams @@ -142,7 +142,7 @@ export class Actions { * @returns {Promise} A promise that resolves to the execution status and response data. * @throws {ComposioError} If the request fails. */ - async execute(data: ActionxExecuteParam): Promise { + async execute(data: ActionExecuteParam): Promise { TELEMETRY_LOGGER.manualTelemetry(TELEMETRY_EVENTS.SDK_METHOD_INVOKED, { method: "execute", file: this.fileName, diff --git a/js/src/types/base_toolset.ts b/js/src/types/base_toolset.ts index 20fc6244854..8b61568e297 100644 --- a/js/src/types/base_toolset.ts +++ b/js/src/types/base_toolset.ts @@ -24,8 +24,8 @@ export const ZRawActionSchema = z.object({ }), response: z.record(z.any()), metadata: z.object({ - actionName: z.string(), - toolName: z.string(), + name: z.string(), + toolName: z.string().optional(), }), }); From 7c3d5e335b7bc9417edc9adeaaef46e27a3d0eae Mon Sep 17 00:00:00 2001 From: tushar-composio Date: Thu, 2 Jan 2025 13:51:29 +0530 Subject: [PATCH 12/14] fix: don't require API key for local tools (#1122) --- python/composio/client/collections.py | 4 ++ python/composio/tools/env/base.py | 42 ++++++++++++------- python/composio/tools/toolset.py | 12 +++++- python/tests/test_tools/test_env/test_base.py | 8 ++-- python/tests/test_tools/test_toolset.py | 6 +-- 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/python/composio/client/collections.py b/python/composio/client/collections.py index 71c4dc1aee1..4792664f2fe 100644 --- a/python/composio/client/collections.py +++ b/python/composio/client/collections.py @@ -1538,4 +1538,8 @@ class Logs(Collection[LogRecord]): def push(self, record: t.Dict) -> None: """Push logs to composio.""" + # TODO: handle this better + if self.client._api_key is None: # pylint: disable=protected-access + return + self.client.http.post(url=str(self.endpoint), json=record) diff --git a/python/composio/tools/env/base.py b/python/composio/tools/env/base.py index 081cfda1195..fc5ff25eba0 100644 --- a/python/composio/tools/env/base.py +++ b/python/composio/tools/env/base.py @@ -159,26 +159,11 @@ def __init__(self, config: WorkspaceConfigType): super().__init__() self.id = generate_id() self.access_token = uuid4().hex.replace("-", "") - self.composio_api_key = _read_env_var( - name=ENV_COMPOSIO_API_KEY, - default=config.composio_api_key, - ) - self.composio_base_url = _read_env_var( - name=ENV_COMPOSIO_BASE_URL, - default=config.composio_base_url, - ) - self.github_access_token = config.github_access_token or os.environ.get( - ENV_GITHUB_ACCESS_TOKEN, "NO_VALUE" - ) + self.persistent = config.persistent self.environment = { **(config.environment or {}), - ENV_COMPOSIO_API_KEY: self.composio_api_key, - ENV_COMPOSIO_BASE_URL: self.composio_base_url, - ENV_GITHUB_ACCESS_TOKEN: self.github_access_token, - f"_COMPOSIO_{ENV_GITHUB_ACCESS_TOKEN}": self.github_access_token, ENV_ACCESS_TOKEN: self.access_token, } - self.persistent = config.persistent def __str__(self) -> str: """String representation.""" @@ -220,6 +205,31 @@ def teardown(self) -> None: class RemoteWorkspace(Workspace): """Remote workspace client.""" + def __init__(self, config: WorkspaceConfigType): + super().__init__(config) + self.composio_api_key = _read_env_var( + name=ENV_COMPOSIO_API_KEY, + default=config.composio_api_key, + ) + self.composio_base_url = _read_env_var( + name=ENV_COMPOSIO_BASE_URL, + default=config.composio_base_url, + ) + self.github_access_token = ( + config.github_access_token + if config.github_access_token is not None + else os.environ.get(ENV_GITHUB_ACCESS_TOKEN, "NO_VALUE") + ) + self.environment.update( + { + ENV_COMPOSIO_API_KEY: self.composio_api_key, + ENV_COMPOSIO_BASE_URL: self.composio_base_url, + ENV_GITHUB_ACCESS_TOKEN: self.github_access_token, + f"_COMPOSIO_{ENV_GITHUB_ACCESS_TOKEN}": self.github_access_token, + ENV_ACCESS_TOKEN: self.access_token, + } + ) + def _request( self, endpoint: str, diff --git a/python/composio/tools/toolset.py b/python/composio/tools/toolset.py index e4155f263b6..57579b17934 100644 --- a/python/composio/tools/toolset.py +++ b/python/composio/tools/toolset.py @@ -418,12 +418,20 @@ def workspace(self) -> Workspace: workspace_config = self._workspace_config or HostWorkspaceConfig() if workspace_config.composio_api_key is None: - workspace_config.composio_api_key = self.api_key + try: + workspace_config.composio_api_key = self.api_key + except ApiKeyNotProvidedError: + warnings.warn( + "Running without a Composio API key", UserWarning, stacklevel=2 + ) if workspace_config.composio_base_url is None: workspace_config.composio_base_url = self._base_url - if workspace_config.github_access_token is None: + if ( + workspace_config.github_access_token is None + and workspace_config.composio_api_key is not None + ): workspace_config.github_access_token = ( self._try_get_github_access_token_for_current_entity() ) diff --git a/python/tests/test_tools/test_env/test_base.py b/python/tests/test_tools/test_env/test_base.py index ffe287dad05..70f632e9bf2 100644 --- a/python/tests/test_tools/test_env/test_base.py +++ b/python/tests/test_tools/test_env/test_base.py @@ -9,16 +9,16 @@ from composio.client.enums import Action, ActionType, AppType, TagType from composio.exceptions import ComposioSDKError from composio.tools.env.base import ( + RemoteWorkspace, SessionFactory, Sessionable, - Workspace, WorkspaceConfigType, ) from composio.tools.env.id import generate_id -def test_workspace() -> None: - class TestWorkspace(Workspace): +def test_remote_workspace() -> None: + class TestRemoteWorkspace(RemoteWorkspace): def check_for_missing_dependencies( self, apps: t.Optional[t.Sequence[AppType]] = None, @@ -46,7 +46,7 @@ def teardown(self) -> None: ComposioSDKError, match="Please provide value for `COMPOSIO_API_KEY`", ): - _ = TestWorkspace(config=WorkspaceConfigType()) + _ = TestRemoteWorkspace(config=WorkspaceConfigType()) def test_sessionable() -> None: diff --git a/python/tests/test_tools/test_toolset.py b/python/tests/test_tools/test_toolset.py index e4b0efc5bf3..26f261e741f 100644 --- a/python/tests/test_tools/test_toolset.py +++ b/python/tests/test_tools/test_toolset.py @@ -154,9 +154,9 @@ def _patch(*_, **kwargs): ) -def test_api_key_missing() -> None: +def test_api_key_missing(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("COMPOSIO_API_KEY", "") toolset = ComposioToolSet() - toolset._api_key = None # pylint: disable=protected-access with pytest.raises( ApiKeyNotProvidedError, match=( @@ -164,7 +164,7 @@ def test_api_key_missing() -> None: "`COMPOSIO_API_KEY` or run `composio login`" ), ): - _ = toolset.workspace + _ = toolset.execute_action(Action.HACKERNEWS_GET_FRONTPAGE, {}) def test_processors(monkeypatch: pytest.MonkeyPatch) -> None: From b5d20cd5d484f6e8a85da16f16b9e97005dada2d Mon Sep 17 00:00:00 2001 From: tushar-composio Date: Thu, 2 Jan 2025 13:55:27 +0530 Subject: [PATCH 13/14] chore: Release v0.6.10 (#1123) --- python/composio/__version__.py | 2 +- python/composio/client/enums/action.pyi | 22 ++++++++++++++++++++++ python/composio/client/enums/app.pyi | 2 ++ python/composio/client/enums/tag.pyi | 1 + python/composio/server/api.py | 6 ++---- python/dockerfiles/Dockerfile | 2 +- python/plugins/autogen/setup.py | 2 +- python/plugins/camel/setup.py | 2 +- python/plugins/claude/setup.py | 2 +- python/plugins/crew_ai/setup.py | 2 +- python/plugins/google/setup.py | 2 +- python/plugins/griptape/setup.py | 2 +- python/plugins/julep/setup.py | 2 +- python/plugins/langchain/setup.py | 2 +- python/plugins/langgraph/setup.py | 2 +- python/plugins/llamaindex/setup.py | 2 +- python/plugins/lyzr/setup.py | 2 +- python/plugins/openai/setup.py | 2 +- python/plugins/phidata/setup.py | 2 +- python/plugins/praisonai/setup.py | 2 +- python/setup.py | 2 +- python/swe/setup.py | 2 +- 22 files changed, 45 insertions(+), 22 deletions(-) diff --git a/python/composio/__version__.py b/python/composio/__version__.py index 5c2c6c53ea8..54149df1f8d 100644 --- a/python/composio/__version__.py +++ b/python/composio/__version__.py @@ -1 +1 @@ -__version__ = "0.6.9" +__version__ = "0.6.10" diff --git a/python/composio/client/enums/action.pyi b/python/composio/client/enums/action.pyi index d865385da1d..18c04cad42c 100644 --- a/python/composio/client/enums/action.pyi +++ b/python/composio/client/enums/action.pyi @@ -3815,6 +3815,10 @@ class Action(Enum[ActionData], metaclass=EnumGenerator): GOOGLETASKS_LIST_TASK_LISTS: "Action" GOOGLETASKS_PATCH_TASK: "Action" GOOGLETASKS_PATCH_TASK_LIST: "Action" + GOOGLE_MAPS_GET_DIRECTION: "Action" + GOOGLE_MAPS_GET_ROUTE: "Action" + GOOGLE_MAPS_NEARBY_SEARCH: "Action" + GOOGLE_MAPS_TEXT_SEARCH: "Action" GREPTILE_CODE_QUERY: "Action" HACKERNEWS_GET_FRONTPAGE: "Action" HACKERNEWS_GET_ITEM_WITH_ID: "Action" @@ -5272,8 +5276,11 @@ class Action(Enum[ActionData], metaclass=EnumGenerator): OUTLOOK_OUTLOOK_GET_MESSAGE: "Action" OUTLOOK_OUTLOOK_GET_PROFILE: "Action" OUTLOOK_OUTLOOK_GET_SCHEDULE: "Action" + OUTLOOK_OUTLOOK_LIST_CONTACTS: "Action" + OUTLOOK_OUTLOOK_LIST_EVENTS: "Action" OUTLOOK_OUTLOOK_LIST_MESSAGES: "Action" OUTLOOK_OUTLOOK_REPLY_EMAIL: "Action" + OUTLOOK_OUTLOOK_SEARCH_MESSAGES: "Action" OUTLOOK_OUTLOOK_SEND_EMAIL: "Action" OUTLOOK_OUTLOOK_UPDATE_CALENDAR_EVENT: "Action" OUTLOOK_OUTLOOK_UPDATE_CONTACT: "Action" @@ -7813,6 +7820,7 @@ class Action(Enum[ActionData], metaclass=EnumGenerator): ZENDESK_GET_ABOUT_ME: "Action" ZENDESK_GET_ALL_ZENDESK_ORGANIZATIONS: "Action" ZENDESK_GET_ZENDESK_ORGANIZATION: "Action" + ZENDESK_REPLY_ZENDESK_TICKET: "Action" ZENDESK_UPDATE_ZENDESK_ORGANIZATION: "Action" ZENROWS_SCRAPE_URL: "Action" ZEPTOOL_ADD_MEMORY: "Action" @@ -7825,6 +7833,20 @@ class Action(Enum[ActionData], metaclass=EnumGenerator): ZOHO_GET_ZOHO_RECORDS: "Action" ZOHO_UPDATE_RELATED_RECORDS: "Action" ZOHO_UPDATE_ZOHO_RECORD: "Action" + ZOOMINFO_ENRICH_COMPANY: "Action" + ZOOMINFO_ENRICH_CONTACT: "Action" + ZOOMINFO_ENRICH_LOCATION: "Action" + ZOOMINFO_ENRICH_TECHNOLOGY: "Action" + ZOOMINFO_SEARCH_COMPANY: "Action" + ZOOMINFO_SEARCH_COMPANY_INPUT: "Action" + ZOOMINFO_SEARCH_CONTACT: "Action" + ZOOMINFO_SEARCH_CONTACT_INPUT: "Action" + ZOOMINFO_SEARCH_INTENT: "Action" + ZOOMINFO_SEARCH_INTENT_INPUT: "Action" + ZOOMINFO_SEARCH_NEWS: "Action" + ZOOMINFO_SEARCH_NEWS_INPUT: "Action" + ZOOMINFO_SEARCH_SCOOP: "Action" + ZOOMINFO_SEARCH_SCOOP_INPUT: "Action" ZOOM_ADD_A_MEETING_REGISTRANT: "Action" ZOOM_ADD_A_NEW_DEVICE: "Action" ZOOM_ADD_A_USER_S_TSP_ACCOUNT: "Action" diff --git a/python/composio/client/enums/app.pyi b/python/composio/client/enums/app.pyi index e03c2ed5d5b..bd6f42f5c81 100644 --- a/python/composio/client/enums/app.pyi +++ b/python/composio/client/enums/app.pyi @@ -133,6 +133,7 @@ class App(Enum[AppData], metaclass=EnumGenerator): GOOGLESHEETS: "App" GOOGLETASKS: "App" GOOGLE_ANALYTICS: "App" + GOOGLE_MAPS: "App" GORGIAS: "App" GO_TO_WEBINAR: "App" GREPTILE: "App" @@ -289,3 +290,4 @@ class App(Enum[AppData], metaclass=EnumGenerator): ZOHO_INVOICE: "App" ZOHO_MAIL: "App" ZOOM: "App" + ZOOMINFO: "App" diff --git a/python/composio/client/enums/tag.pyi b/python/composio/client/enums/tag.pyi index 274c98cc455..c513d36f0e7 100644 --- a/python/composio/client/enums/tag.pyi +++ b/python/composio/client/enums/tag.pyi @@ -698,6 +698,7 @@ class Tag(Enum[TagData], metaclass=EnumGenerator): NOTION_IMPORTANT: "Tag" OUTLOOK_EMAIL: "Tag" OUTLOOK_IMPORTANT: "Tag" + OUTLOOK_SEARCH: "Tag" PAGERDUTY_ABILITIES: "Tag" PAGERDUTY_ADD_ONS: "Tag" PAGERDUTY_ALERT_GROUPING_SETTINGS: "Tag" diff --git a/python/composio/server/api.py b/python/composio/server/api.py index bd14132a82d..744db91c98d 100644 --- a/python/composio/server/api.py +++ b/python/composio/server/api.py @@ -21,7 +21,7 @@ from fastapi.responses import FileResponse from pydantic import BaseModel, Field -from composio import Action, App +from composio import Action, App, __version__ from composio.cli.context import get_context from composio.client.collections import ActionModel, AppModel from composio.client.enums.base import get_runtime_actions @@ -155,9 +155,7 @@ async def add_process_time_header(request: Request, call_next): @with_exception_handling def _api() -> GetApiResponse: """Composio tooling server API root.""" - return GetApiResponse( - version="0.3.20", - ) + return GetApiResponse(version=__version__) @app.get("/api/apps", response_model=APIResponse[t.List[AppModel]]) @with_exception_handling diff --git a/python/dockerfiles/Dockerfile b/python/dockerfiles/Dockerfile index 953b722c77c..7d90a449d2e 100644 --- a/python/dockerfiles/Dockerfile +++ b/python/dockerfiles/Dockerfile @@ -19,7 +19,7 @@ RUN /bin/python3 -m venv .composio/venv RUN export PATH=$PATH:$(pwd)/.composio/venv/bin # Install composio -RUN python -m pip install composio-core[all]==0.6.9 fastapi playwright uvicorn +RUN python -m pip install composio-core[all]==0.6.10 fastapi playwright uvicorn # Install playwright deps RUN playwright install-deps diff --git a/python/plugins/autogen/setup.py b/python/plugins/autogen/setup.py index 391631d0d90..25094bbfdec 100644 --- a/python/plugins/autogen/setup.py +++ b/python/plugins/autogen/setup.py @@ -9,7 +9,7 @@ setup( name="composio_autogen", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Autogen agent.", diff --git a/python/plugins/camel/setup.py b/python/plugins/camel/setup.py index d7536426eda..f24cb98817e 100644 --- a/python/plugins/camel/setup.py +++ b/python/plugins/camel/setup.py @@ -9,7 +9,7 @@ setup( name="composio_camel", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Claude LLMs.", diff --git a/python/plugins/claude/setup.py b/python/plugins/claude/setup.py index 9d2f75cd83c..9bbb81a8e37 100644 --- a/python/plugins/claude/setup.py +++ b/python/plugins/claude/setup.py @@ -9,7 +9,7 @@ setup( name="composio_claude", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Claude LLMs.", diff --git a/python/plugins/crew_ai/setup.py b/python/plugins/crew_ai/setup.py index 8678ea57b7d..7fc9fa824a2 100644 --- a/python/plugins/crew_ai/setup.py +++ b/python/plugins/crew_ai/setup.py @@ -9,7 +9,7 @@ setup( name="composio_crewai", - version="0.6.9", + version="0.6.10", author="Himanshu", author_email="himanshu@composio.dev", description="Use Composio to get an array of tools with your CrewAI agent.", diff --git a/python/plugins/google/setup.py b/python/plugins/google/setup.py index 29203084943..32397561d8f 100644 --- a/python/plugins/google/setup.py +++ b/python/plugins/google/setup.py @@ -9,7 +9,7 @@ setup( name="composio_google", - version="0.6.9", + version="0.6.10", author="Assistant", author_email="karan@composio.dev", description="Use Composio to get an array of tools with your Google AI Python Gemini model.", diff --git a/python/plugins/griptape/setup.py b/python/plugins/griptape/setup.py index 315b7558328..b718b66239e 100644 --- a/python/plugins/griptape/setup.py +++ b/python/plugins/griptape/setup.py @@ -9,7 +9,7 @@ setup( name="composio_griptape", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Griptape workflow.", diff --git a/python/plugins/julep/setup.py b/python/plugins/julep/setup.py index d4a9f7364df..b2ad9120d03 100644 --- a/python/plugins/julep/setup.py +++ b/python/plugins/julep/setup.py @@ -9,7 +9,7 @@ setup( name="composio_julep", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Julep workflow.", diff --git a/python/plugins/langchain/setup.py b/python/plugins/langchain/setup.py index d4d6e51dfea..f1e545e4ee4 100644 --- a/python/plugins/langchain/setup.py +++ b/python/plugins/langchain/setup.py @@ -9,7 +9,7 @@ setup( name="composio_langchain", - version="0.6.9", + version="0.6.10", author="Karan", author_email="karan@composio.dev", description="Use Composio to get an array of tools with your LangChain agent.", diff --git a/python/plugins/langgraph/setup.py b/python/plugins/langgraph/setup.py index 1d28bf2a499..ea02a928f2d 100644 --- a/python/plugins/langgraph/setup.py +++ b/python/plugins/langgraph/setup.py @@ -9,7 +9,7 @@ setup( name="composio_langgraph", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get array of tools with LangGraph Agent Workflows", diff --git a/python/plugins/llamaindex/setup.py b/python/plugins/llamaindex/setup.py index 51abb652b90..92c5c03c008 100644 --- a/python/plugins/llamaindex/setup.py +++ b/python/plugins/llamaindex/setup.py @@ -9,7 +9,7 @@ setup( name="composio_llamaindex", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your LlamaIndex agent.", diff --git a/python/plugins/lyzr/setup.py b/python/plugins/lyzr/setup.py index d88996e9eb3..199b25fa942 100644 --- a/python/plugins/lyzr/setup.py +++ b/python/plugins/lyzr/setup.py @@ -9,7 +9,7 @@ setup( name="composio_lyzr", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Lyzr workflow.", diff --git a/python/plugins/openai/setup.py b/python/plugins/openai/setup.py index 16eaa4cdb86..282472e1e04 100644 --- a/python/plugins/openai/setup.py +++ b/python/plugins/openai/setup.py @@ -9,7 +9,7 @@ setup( name="composio_openai", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your OpenAI Function Call.", diff --git a/python/plugins/phidata/setup.py b/python/plugins/phidata/setup.py index d3a003ef803..3278254a3f6 100644 --- a/python/plugins/phidata/setup.py +++ b/python/plugins/phidata/setup.py @@ -9,7 +9,7 @@ setup( name="composio_phidata", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio to get an array of tools with your Phidata Plugin.", diff --git a/python/plugins/praisonai/setup.py b/python/plugins/praisonai/setup.py index f2583bb1b59..dccd3acd665 100644 --- a/python/plugins/praisonai/setup.py +++ b/python/plugins/praisonai/setup.py @@ -9,7 +9,7 @@ setup( name="composio_praisonai", - version="0.6.9", + version="0.6.10", author="Sawradip", author_email="sawradip@composio.dev", description="Use Composio Tools to enhance your PraisonAI agents capabilities.", diff --git a/python/setup.py b/python/setup.py index 7633d97b31f..31d1a30e5d9 100644 --- a/python/setup.py +++ b/python/setup.py @@ -88,7 +88,7 @@ def scan_for_package_data( setup( name="composio_core", - version="0.6.9", + version="0.6.10", author="Utkarsh", author_email="utkarsh@composio.dev", description="Core package to act as a bridge between composio platform and other services.", diff --git a/python/swe/setup.py b/python/swe/setup.py index 96b1d407272..b67432409d8 100644 --- a/python/swe/setup.py +++ b/python/swe/setup.py @@ -35,7 +35,7 @@ def scan_for_package_data( setup( name="swekit", - version="0.3.10", + version="0.3.11", author="Shubhra", author_email="shubhra@composio.dev", description="Tools for running a SWE agent using Composio platform", From 0ca89ac6aee16bcc37f0a0c5a3c90f968d862c0e Mon Sep 17 00:00:00 2001 From: Abhishek Patil <83769052+abhishekpatil4@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:29:41 +0530 Subject: [PATCH 14/14] feat: add TS Pre, post and schema processors to doc (#1088) --- .../tools/use-tools/processing-actions.mdx | 143 +++++++++++++----- 1 file changed, 106 insertions(+), 37 deletions(-) diff --git a/docs/patterns/tools/use-tools/processing-actions.mdx b/docs/patterns/tools/use-tools/processing-actions.mdx index 52e36a17c4c..29a85a9049e 100644 --- a/docs/patterns/tools/use-tools/processing-actions.mdx +++ b/docs/patterns/tools/use-tools/processing-actions.mdx @@ -20,37 +20,27 @@ These can be applied at two levels: 1. **App-level**: Affects all actions within a specific tool. 2. **Action-level**: Tailored processing for individual actions. - + + - ```python Python from langchain.agents import create_openai_functions_agent, AgentExecutor from langchain import hub from langchain_openai import ChatOpenAI from composio_langchain import ComposioToolSet, Action, App ``` -```javascript JavaScript -Coming Soon -``` - - ```python Python prompt = hub.pull("hwchase17/openai-functions-agent") llm = ChatOpenAI() composio_toolset = ComposioToolSet() ``` -```javascript JavaScript -Coming Soon -``` - This function will be used to modify the schema of the `LINEAR_CREATE_LINEAR_ISSUE` action, we get rid of the parameters `project_id` and `team_id`, later in the program we will pass these values as inputs to the action manually. The technical term for this is **Action-level Schema Processing**. - ```python Python def linear_schema_processor(schema: dict) -> dict: # This way the agent doesn't expect a project and team ID to run the action @@ -58,27 +48,17 @@ def linear_schema_processor(schema: dict) -> dict: del schema['team_id'] return schema ``` -```javascript JavaScript -Coming Soon -``` - This function will be used to modify the input data for the `LINEAR_CREATE_LINEAR_ISSUE` action. Here we have added the values for `project_id` and `team_id` parameters to the input data. By doing this, we can avoid specifying these values in the prompt and be sure that the agent uses the correct values. The technical term for this is **Action-level Pre-Processing**. - ```python Python def linear_pre_processor(input_data: dict) -> dict: input_data['project_id'] = 'e708162b-9b1a-4901-ab93-0f0149f9d805' input_data['team_id'] = '249ee4cc-7bbb-4ff1-adbe-d3ef2f3df94e' return input_data ``` -```javascript JavaScript -Coming Soon -``` - This function will be used to modify the output data for the `LINEAR_CREATE_LINEAR_ISSUE` action. Here we are modifying the output to just return the action execution status `successful` & the `issue_id`, by doing this can keep the LLM context clean. The technical term for this is **Action-level Post-Processing**. - ```python Python def linear_post_processor(output_data: dict) -> dict: output_data = { @@ -87,15 +67,9 @@ def linear_post_processor(output_data: dict) -> dict: } return output_data ``` -```javascript JavaScript -Coming Soon -``` - When getting tools using the `get_tools()` method, we need to pass the `processors` parameter to specify the schema, pre-processing, and post-processing functions. In this example, we're setting up an Action-level preprocessor by mapping the `LINEAR_CREATE_LINEAR_ISSUE` action to our `linear_schema_processor`, `linear_pre_processor` and `linear_post_processor` functions defined above respectively in schema, pre, and post processors. - - ```python Python {2-12} tools = composio_toolset.get_tools( processors={ @@ -112,13 +86,8 @@ tools = composio_toolset.get_tools( actions=[Action.LINEAR_CREATE_LINEAR_ISSUE] ) ``` -```javascript JavaScript -Coming Soon -``` - - ```python Python task = "Create a Linear Issue to update the frontend" @@ -127,12 +96,112 @@ agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) agent_executor.invoke({"input": task}) ``` -```javascript JavaScript -Coming Soon + + + + + + +```typescript TypeScript +import { ActionExecutionResDto, LangchainToolSet, RawActionData, TPostProcessor, TPreProcessor, TSchemaProcessor } from "composio-core"; +import { ChatOpenAI } from "@langchain/openai"; +import { createOpenAIFunctionsAgent, AgentExecutor } from "langchain/agents"; +import { pull } from "langchain/hub"; +import { ChatPromptTemplate } from "@langchain/core/prompts"; +``` + + +```typescript TypeScript +const llm = new ChatOpenAI({ apiKey: "" }); +const toolset = new LangchainToolSet({ apiKey: "" }); +``` + + +This will be used to modify the schema of the `LINEAR_CREATE_LINEAR_ISSUE` action, we remove the parameters `project_id` and `team_id` as required fields, later in the program we will pass these values as inputs to the action manually. The technical term for this is **Schema Processing**. +```typescript TypeScript +const schemaProcessor: TSchemaProcessor = ({ + actionName, + toolSchema, +}: { + actionName: string; + toolSchema: RawActionData; +}) => { + const modifiedSchema = { ...toolSchema }; + modifiedSchema.parameters = { + ...modifiedSchema.parameters, + required: modifiedSchema.parameters?.required?.filter( + field => !['project_id', 'team_id'].includes(field) + ) || [] + }; + + return modifiedSchema; +}; +``` + +This will be used to modify the input data for the `LINEAR_CREATE_LINEAR_ISSUE` action. Here we have added the values for `project_id` and `team_id` parameters to the input data. By doing this, we can avoid specifying these values in the prompt and be sure that the agent uses the correct values. The technical term for this is **Pre-Processing**. +```typescript TypeScript +const preProcessor: TPreProcessor = ({ params, actionName, appName }: { + params: Record; + actionName: string; + appName: string; +}) => { + const modifiedParams = { ...params }; + + modifiedParams.project_id = "e708162b-9b1a-4901-ab93-0f0149f9d805"; + modifiedParams.team_id = "249ee4cc-7bbb-4ff1-adbe-d3ef2f3df94e"; + + return modifiedParams; +} +``` + + +This will be used to modify the output data for the `LINEAR_CREATE_LINEAR_ISSUE` action. Here we are modifying the output to just return the action execution status `successful` & the `issueId`, by doing this can keep the LLM context clean. The technical term for this is **Post-Processing**. +```typescript TypeScript +const postProcessor: TPostProcessor = ({ actionName, appName, toolResponse }: { + actionName: string; + appName: string; + toolResponse: ActionExecutionResDto; +}) => { + const issueId = toolResponse.data.id; + return { data: { id: issueId }, successful: true }; +} +``` + + +After creating the processors, we need to add them to the toolset using `addSchemaProcessor`, `addPreProcessor`, and `addPostProcessor` methods and then get the tools. Last we create the agent and execute it. +```typescript TypeScript {2-4} +async function main() { + toolset.addSchemaProcessor(schemaProcessor); + toolset.addPreProcessor(preProcessor); + toolset.addPostProcessor(postProcessor); + + const tools = await toolset.getTools({ + actions: ["LINEAR_CREATE_LINEAR_ISSUE"] + }); + + const prompt = (await pull( + "hwchase17/openai-functions-agent" + )) as ChatPromptTemplate; + + const agent = await createOpenAIFunctionsAgent({ + llm, + tools, + prompt, + }); + + const agentExecutor = new AgentExecutor({ agent, tools, verbose: true }); + + const response = await agentExecutor.invoke({ input: "Create an issue on linear to update the frontend to with new design and description 'to update the frontend with new design', estimate is 5 (L) & return the issue id" }); + console.log(response); +} + +main() ``` - + + + ### How to use processors at App-level? Above we saw how to use processors at the Action-level, below is an example of how to use them at the App-level. @@ -153,7 +222,7 @@ tools = composio_toolset.get_tools( apps=[App.] ) ``` -```javascript JavaScript +```typescript TypeScript Coming Soon ```