From bb198e38c015c6f7e0face338158627bc1b10f62 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Sun, 13 Apr 2025 13:56:22 -0700 Subject: [PATCH 01/47] add github connector, add alembic for db migrations, fix bug updating connectors --- surfsense_backend/.gitignore | 3 +- surfsense_backend/alembic.ini | 119 +++++++ surfsense_backend/alembic/README | 1 + surfsense_backend/alembic/env.py | 98 ++++++ surfsense_backend/alembic/script.py.mako | 28 ++ .../versions/1_add_github_connector_enum.py | 53 ++++ .../app/connectors/github_connector.py | 182 +++++++++++ surfsense_backend/app/db.py | 2 + .../routes/search_source_connectors_routes.py | 146 +++++---- .../app/schemas/search_source_connector.py | 12 +- .../app/tasks/connectors_indexing_tasks.py | 195 +++++++++++- surfsense_backend/main.py | 7 + surfsense_backend/pyproject.toml | 2 + surfsense_backend/uv.lock | 54 ++++ .../connectors/(manage)/page.tsx | 3 +- .../connectors/[connector_id]/page.tsx | 24 +- .../connectors/add/github-connector/page.tsx | 298 ++++++++++++++++++ .../[search_space_id]/connectors/add/page.tsx | 189 +++++------ 18 files changed, 1232 insertions(+), 184 deletions(-) create mode 100644 surfsense_backend/alembic.ini create mode 100644 surfsense_backend/alembic/README create mode 100644 surfsense_backend/alembic/env.py create mode 100644 surfsense_backend/alembic/script.py.mako create mode 100644 surfsense_backend/alembic/versions/1_add_github_connector_enum.py create mode 100644 surfsense_backend/app/connectors/github_connector.py create mode 100644 surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx diff --git a/surfsense_backend/.gitignore b/surfsense_backend/.gitignore index a663d9dab..ee59e4764 100644 --- a/surfsense_backend/.gitignore +++ b/surfsense_backend/.gitignore @@ -3,4 +3,5 @@ venv/ data/ __pycache__/ -.flashrank_cache \ No newline at end of file +.flashrank_cache +surf_new_backend.egg-info/ diff --git a/surfsense_backend/alembic.ini b/surfsense_backend/alembic.ini new file mode 100644 index 000000000..9b2a76fd8 --- /dev/null +++ b/surfsense_backend/alembic.ini @@ -0,0 +1,119 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts. +# Use forward slashes (/) also on windows to provide an os agnostic path +script_location = alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python>=3.9 or backports.zoneinfo library and tzdata library. +# Any required deps can installed by adding `alembic[tz]` to the pip requirements +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +# version_path_separator = newline +# +# Use os.pathsep. Default configuration used for new projects. +version_path_separator = os + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# The SQLAlchemy URL to connect to +# IMPORTANT: Replace this with your actual async database URL +sqlalchemy.url = postgresql+asyncpg://postgres:postgres@localhost:5432/surfsense + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = check --fix REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARNING +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARNING +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/surfsense_backend/alembic/README b/surfsense_backend/alembic/README new file mode 100644 index 000000000..e0d0858f2 --- /dev/null +++ b/surfsense_backend/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration with an async dbapi. \ No newline at end of file diff --git a/surfsense_backend/alembic/env.py b/surfsense_backend/alembic/env.py new file mode 100644 index 000000000..d6e7104f9 --- /dev/null +++ b/surfsense_backend/alembic/env.py @@ -0,0 +1,98 @@ +import asyncio +from logging.config import fileConfig + +import os +import sys +from sqlalchemy import pool +from sqlalchemy.engine import Connection +from sqlalchemy.ext.asyncio import async_engine_from_config + +from alembic import context + +# Ensure the app directory is in the Python path +# This allows Alembic to find your models +sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))) + +# Import your models base +from app.db import Base # Assuming your Base is defined in app.db + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +target_metadata = Base.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def do_run_migrations(connection: Connection) -> None: + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +async def run_async_migrations() -> None: + """In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + connectable = async_engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + + await connectable.dispose() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode.""" + + asyncio.run(run_async_migrations()) + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/surfsense_backend/alembic/script.py.mako b/surfsense_backend/alembic/script.py.mako new file mode 100644 index 000000000..480b130d6 --- /dev/null +++ b/surfsense_backend/alembic/script.py.mako @@ -0,0 +1,28 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + """Upgrade schema.""" + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + """Downgrade schema.""" + ${downgrades if downgrades else "pass"} diff --git a/surfsense_backend/alembic/versions/1_add_github_connector_enum.py b/surfsense_backend/alembic/versions/1_add_github_connector_enum.py new file mode 100644 index 000000000..bb72838ad --- /dev/null +++ b/surfsense_backend/alembic/versions/1_add_github_connector_enum.py @@ -0,0 +1,53 @@ +"""Add GITHUB_CONNECTOR to SearchSourceConnectorType enum + +Revision ID: 1 +Revises: +Create Date: 2023-10-27 10:00:00.000000 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +# Import pgvector if needed for other types, though not for this ENUM change +# import pgvector + + +# revision identifiers, used by Alembic. +revision: str = '1' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + + # Manually add the command to add the enum value + # Note: It's generally better to let autogenerate handle this, but we're bypassing it + op.execute("ALTER TYPE searchsourceconnectortype ADD VALUE 'GITHUB_CONNECTOR'") + + # Pass for the rest, as autogenerate didn't run to add other schema details + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + + # Downgrading removal of an enum value is complex and potentially dangerous + # if the value is in use. Often omitted or requires manual SQL based on context. + # For now, we'll just pass. If you needed to reverse this, you'd likely + # have to manually check if 'GITHUB_CONNECTOR' is used in the table + # and then potentially recreate the type without it. + op.execute("ALTER TYPE searchsourceconnectortype RENAME TO searchsourceconnectortype_old") + op.execute("CREATE TYPE searchsourceconnectortype AS ENUM('SERPER_API', 'TAVILY_API', 'SLACK_CONNECTOR', 'NOTION_CONNECTOR')") + op.execute(( + "ALTER TABLE search_source_connectors ALTER COLUMN connector_type TYPE searchsourceconnectortype USING " + "connector_type::text::searchsourceconnectortype" + )) + op.execute("DROP TYPE searchsourceconnectortype_old") + + + pass + # ### end Alembic commands ### diff --git a/surfsense_backend/app/connectors/github_connector.py b/surfsense_backend/app/connectors/github_connector.py new file mode 100644 index 000000000..d827dac15 --- /dev/null +++ b/surfsense_backend/app/connectors/github_connector.py @@ -0,0 +1,182 @@ +import base64 +import logging +from typing import List, Optional, Dict, Any, Tuple +from github3 import login as github_login, exceptions as github_exceptions +from github3.repos.repo import Repository +from github3.repos.contents import Contents +from github3.exceptions import ForbiddenError, NotFoundError + +logger = logging.getLogger(__name__) + +# List of common code file extensions to target +CODE_EXTENSIONS = { + '.py', '.js', '.jsx', '.ts', '.tsx', '.java', '.c', '.cpp', '.h', '.hpp', + '.cs', '.go', '.rb', '.php', '.swift', '.kt', '.scala', '.rs', '.m', + '.sh', '.bash', '.ps1', '.lua', '.pl', '.pm', '.r', '.dart', '.sql' +} + +# List of common documentation/text file extensions +DOC_EXTENSIONS = { + '.md', '.txt', '.rst', '.adoc', '.html', '.htm', '.xml', '.json', '.yaml', '.yml', '.toml' +} + +# Maximum file size in bytes (e.g., 1MB) +MAX_FILE_SIZE = 1 * 1024 * 1024 + +class GitHubConnector: + """Connector for interacting with the GitHub API.""" + + def __init__(self, token: str): + """ + Initializes the GitHub connector. + + Args: + token: GitHub Personal Access Token (PAT). + """ + if not token: + raise ValueError("GitHub token cannot be empty.") + try: + self.gh = github_login(token=token) + # Try a simple authenticated call to check token validity + self.gh.me() + logger.info("Successfully authenticated with GitHub API.") + except (github_exceptions.AuthenticationFailed, ForbiddenError) as e: + logger.error(f"GitHub authentication failed: {e}") + raise ValueError("Invalid GitHub token or insufficient permissions.") + except Exception as e: + logger.error(f"Failed to initialize GitHub client: {e}") + raise + + def get_user_repositories(self) -> List[Dict[str, Any]]: + """Fetches repositories accessible by the authenticated user.""" + repos_data = [] + try: + # type='owner' fetches repos owned by the user + # type='member' fetches repos the user is a collaborator on (including orgs) + # type='all' fetches both + for repo in self.gh.repositories(type='all', sort='updated'): + if isinstance(repo, Repository): + repos_data.append({ + "id": repo.id, + "name": repo.name, + "full_name": repo.full_name, + "private": repo.private, + "url": repo.html_url, + "description": repo.description or "", + "last_updated": repo.updated_at.isoformat() if repo.updated_at else None, + }) + logger.info(f"Fetched {len(repos_data)} repositories.") + return repos_data + except Exception as e: + logger.error(f"Failed to fetch GitHub repositories: {e}") + return [] # Return empty list on error + + def get_repository_files(self, repo_full_name: str, path: str = '') -> List[Dict[str, Any]]: + """ + Recursively fetches details of relevant files (code, docs) within a repository path. + + Args: + repo_full_name: The full name of the repository (e.g., 'owner/repo'). + path: The starting path within the repository (default is root). + + Returns: + A list of dictionaries, each containing file details (path, sha, url, size). + Returns an empty list if the repository or path is not found or on error. + """ + files_list = [] + try: + owner, repo_name = repo_full_name.split('/') + repo = self.gh.repository(owner, repo_name) + if not repo: + logger.warning(f"Repository '{repo_full_name}' not found.") + return [] + + contents = repo.directory_contents(path=path) # Use directory_contents for clarity + + # contents returns a list of tuples (name, content_obj) + for item_name, content_item in contents: + if not isinstance(content_item, Contents): + continue + + if content_item.type == 'dir': + # Recursively fetch contents of subdirectory + files_list.extend(self.get_repository_files(repo_full_name, path=content_item.path)) + elif content_item.type == 'file': + # Check if the file extension is relevant and size is within limits + file_extension = '.' + content_item.name.split('.')[-1].lower() if '.' in content_item.name else '' + is_code = file_extension in CODE_EXTENSIONS + is_doc = file_extension in DOC_EXTENSIONS + + if (is_code or is_doc) and content_item.size <= MAX_FILE_SIZE: + files_list.append({ + "path": content_item.path, + "sha": content_item.sha, + "url": content_item.html_url, + "size": content_item.size, + "type": "code" if is_code else "doc" + }) + elif content_item.size > MAX_FILE_SIZE: + logger.debug(f"Skipping large file: {content_item.path} ({content_item.size} bytes)") + else: + logger.debug(f"Skipping irrelevant file type: {content_item.path}") + + except (NotFoundError, ForbiddenError) as e: + logger.warning(f"Cannot access path '{path}' in '{repo_full_name}': {e}") + except Exception as e: + logger.error(f"Failed to get files for {repo_full_name} at path '{path}': {e}") + # Return what we have collected so far in case of partial failure + + return files_list + + def get_file_content(self, repo_full_name: str, file_path: str) -> Optional[str]: + """ + Fetches the decoded content of a specific file. + + Args: + repo_full_name: The full name of the repository (e.g., 'owner/repo'). + file_path: The path to the file within the repository. + + Returns: + The decoded file content as a string, or None if fetching fails or file is too large. + """ + try: + owner, repo_name = repo_full_name.split('/') + repo = self.gh.repository(owner, repo_name) + if not repo: + logger.warning(f"Repository '{repo_full_name}' not found when fetching file '{file_path}'.") + return None + + content_item = repo.file_contents(path=file_path) # Use file_contents for clarity + + if not content_item or not isinstance(content_item, Contents) or content_item.type != 'file': + logger.warning(f"File '{file_path}' not found or is not a file in '{repo_full_name}'.") + return None + + if content_item.size > MAX_FILE_SIZE: + logger.warning(f"File '{file_path}' in '{repo_full_name}' exceeds max size ({content_item.size} > {MAX_FILE_SIZE}). Skipping content fetch.") + return None + + # Content is base64 encoded + if content_item.content: + try: + decoded_content = base64.b64decode(content_item.content).decode('utf-8') + return decoded_content + except UnicodeDecodeError: + logger.warning(f"Could not decode file '{file_path}' in '{repo_full_name}' as UTF-8. Trying with 'latin-1'.") + try: + # Try a fallback encoding + decoded_content = base64.b64decode(content_item.content).decode('latin-1') + return decoded_content + except Exception as decode_err: + logger.error(f"Failed to decode file '{file_path}' with fallback encoding: {decode_err}") + return None # Give up if fallback fails + else: + logger.warning(f"No content returned for file '{file_path}' in '{repo_full_name}'. It might be empty.") + return "" # Return empty string for empty files + + except (NotFoundError, ForbiddenError) as e: + logger.warning(f"Cannot access file '{file_path}' in '{repo_full_name}': {e}") + return None + except Exception as e: + logger.error(f"Failed to get content for file '{file_path}' in '{repo_full_name}': {e}") + return None diff --git a/surfsense_backend/app/db.py b/surfsense_backend/app/db.py index b0fb2f03f..25b7bfbb4 100644 --- a/surfsense_backend/app/db.py +++ b/surfsense_backend/app/db.py @@ -40,12 +40,14 @@ class DocumentType(str, Enum): SLACK_CONNECTOR = "SLACK_CONNECTOR" NOTION_CONNECTOR = "NOTION_CONNECTOR" YOUTUBE_VIDEO = "YOUTUBE_VIDEO" + GITHUB_CONNECTOR = "GITHUB_CONNECTOR" class SearchSourceConnectorType(str, Enum): SERPER_API = "SERPER_API" TAVILY_API = "TAVILY_API" SLACK_CONNECTOR = "SLACK_CONNECTOR" NOTION_CONNECTOR = "NOTION_CONNECTOR" + GITHUB_CONNECTOR = "GITHUB_CONNECTOR" class ChatType(str, Enum): GENERAL = "GENERAL" diff --git a/surfsense_backend/app/routes/search_source_connectors_routes.py b/surfsense_backend/app/routes/search_source_connectors_routes.py index 4025f2da6..482a8259d 100644 --- a/surfsense_backend/app/routes/search_source_connectors_routes.py +++ b/surfsense_backend/app/routes/search_source_connectors_routes.py @@ -14,13 +14,13 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from sqlalchemy.exc import IntegrityError from typing import List, Dict, Any -from app.db import get_async_session, User, SearchSourceConnector, SearchSourceConnectorType, SearchSpace +from app.db import get_async_session, User, SearchSourceConnector, SearchSourceConnectorType, SearchSpace, async_session_maker from app.schemas import SearchSourceConnectorCreate, SearchSourceConnectorUpdate, SearchSourceConnectorRead from app.users import current_active_user from app.utils.check_ownership import check_ownership from pydantic import ValidationError -from app.tasks.connectors_indexing_tasks import index_slack_messages, index_notion_pages -from datetime import datetime +from app.tasks.connectors_indexing_tasks import index_slack_messages, index_notion_pages, index_github_repos +from datetime import datetime, timezone import logging # Set up logging @@ -50,13 +50,11 @@ async def create_search_source_connector( ) ) existing_connector = result.scalars().first() - if existing_connector: raise HTTPException( status_code=409, detail=f"A connector with type {connector.connector_type} already exists. Each user can have only one connector of each type." ) - db_connector = SearchSourceConnector(**connector.model_dump(), user_id=user.id) session.add(db_connector) await session.commit() @@ -239,10 +237,15 @@ async def index_connector_content( search_space = await check_ownership(session, SearchSpace, search_space_id, user) # Handle different connector types + response_message = "" + indexing_from = None + indexing_to = None + today_str = datetime.now().strftime("%Y-%m-%d") + if connector.connector_type == SearchSourceConnectorType.SLACK_CONNECTOR: # Determine the time range that will be indexed if not connector.last_indexed_at: - start_date = "365 days ago" + start_date = "365 days ago" # Or perhaps set a specific date if needed else: # Check if last_indexed_at is today today = datetime.now().date() @@ -252,33 +255,18 @@ async def index_connector_content( else: start_date = connector.last_indexed_at.strftime("%Y-%m-%d") - # Add the indexing task to background tasks - if background_tasks: - background_tasks.add_task( - run_slack_indexing_with_new_session, - connector_id, - search_space_id - ) - - return { - "success": True, - "message": "Slack indexing started in the background", - "connector_type": connector.connector_type, - "search_space": search_space.name, - "indexing_from": start_date, - "indexing_to": datetime.now().strftime("%Y-%m-%d") - } - else: - # For testing or if background tasks are not available - return { - "success": False, - "message": "Background tasks not available", - "connector_type": connector.connector_type - } + indexing_from = start_date + indexing_to = today_str + + # Run indexing in background + logger.info(f"Triggering Slack indexing for connector {connector_id} into search space {search_space_id}") + background_tasks.add_task(run_slack_indexing_with_new_session, connector_id, search_space_id) + response_message = "Slack indexing started in the background." + elif connector.connector_type == SearchSourceConnectorType.NOTION_CONNECTOR: # Determine the time range that will be indexed if not connector.last_indexed_at: - start_date = "365 days ago" + start_date = "365 days ago" # Or perhaps set a specific date else: # Check if last_indexed_at is today today = datetime.now().date() @@ -288,44 +276,46 @@ async def index_connector_content( else: start_date = connector.last_indexed_at.strftime("%Y-%m-%d") - # Add the indexing task to background tasks - if background_tasks: - background_tasks.add_task( - run_notion_indexing_with_new_session, - connector_id, - search_space_id - ) - - return { - "success": True, - "message": "Notion indexing started in the background", - "connector_type": connector.connector_type, - "search_space": search_space.name, - "indexing_from": start_date, - "indexing_to": datetime.now().strftime("%Y-%m-%d") - } - else: - # For testing or if background tasks are not available - return { - "success": False, - "message": "Background tasks not available", - "connector_type": connector.connector_type - } + indexing_from = start_date + indexing_to = today_str + + # Run indexing in background + logger.info(f"Triggering Notion indexing for connector {connector_id} into search space {search_space_id}") + background_tasks.add_task(run_notion_indexing_with_new_session, connector_id, search_space_id) + response_message = "Notion indexing started in the background." + + elif connector.connector_type == SearchSourceConnectorType.GITHUB_CONNECTOR: + # GitHub connector likely indexes everything relevant, or uses internal logic + # Setting indexing_from to None and indexing_to to today + indexing_from = None + indexing_to = today_str + + # Run indexing in background + logger.info(f"Triggering GitHub indexing for connector {connector_id} into search space {search_space_id}") + background_tasks.add_task(run_github_indexing_with_new_session, connector_id, search_space_id) + response_message = "GitHub indexing started in the background." + else: raise HTTPException( status_code=400, detail=f"Indexing not supported for connector type: {connector.connector_type}" ) - + + return { + "message": response_message, + "connector_id": connector_id, + "search_space_id": search_space_id, + "indexing_from": indexing_from, + "indexing_to": indexing_to + } except HTTPException: raise except Exception as e: - logger.error(f"Failed to start indexing: {str(e)}") + logger.error(f"Failed to initiate indexing for connector {connector_id}: {e}", exc_info=True) raise HTTPException( status_code=500, - detail=f"Failed to start indexing: {str(e)}" - ) - + detail=f"Failed to initiate indexing: {str(e)}" + ) async def update_connector_last_indexed( session: AsyncSession, @@ -361,8 +351,6 @@ async def run_slack_indexing_with_new_session( Create a new session and run the Slack indexing task. This prevents session leaks by creating a dedicated session for the background task. """ - from app.db import async_session_maker - async with async_session_maker() as session: await run_slack_indexing(session, connector_id, search_space_id) @@ -405,8 +393,6 @@ async def run_notion_indexing_with_new_session( Create a new session and run the Notion indexing task. This prevents session leaks by creating a dedicated session for the background task. """ - from app.db import async_session_maker - async with async_session_maker() as session: await run_notion_indexing(session, connector_id, search_space_id) @@ -439,4 +425,38 @@ async def run_notion_indexing( else: logger.error(f"Notion indexing failed or no documents processed: {error_or_warning}") except Exception as e: - logger.error(f"Error in background Notion indexing task: {str(e)}") \ No newline at end of file + logger.error(f"Error in background Notion indexing task: {str(e)}") + +# Add new helper functions for GitHub indexing +async def run_github_indexing_with_new_session( + connector_id: int, + search_space_id: int +): + """Wrapper to run GitHub indexing with its own database session.""" + logger.info(f"Background task started: Indexing GitHub connector {connector_id} into space {search_space_id}") + async with async_session_maker() as session: + await run_github_indexing(session, connector_id, search_space_id) + logger.info(f"Background task finished: Indexing GitHub connector {connector_id}") + +async def run_github_indexing( + session: AsyncSession, + connector_id: int, + search_space_id: int +): + """Runs the GitHub indexing task and updates the timestamp.""" + try: + indexed_count, error_message = await index_github_repos( + session, connector_id, search_space_id, update_last_indexed=False + ) + if error_message: + logger.error(f"GitHub indexing failed for connector {connector_id}: {error_message}") + # Optionally update status in DB to indicate failure + else: + logger.info(f"GitHub indexing successful for connector {connector_id}. Indexed {indexed_count} documents.") + # Update the last indexed timestamp only on success + await update_connector_last_indexed(session, connector_id) + await session.commit() # Commit timestamp update + except Exception as e: + await session.rollback() + logger.error(f"Critical error in run_github_indexing for connector {connector_id}: {e}", exc_info=True) + # Optionally update status in DB to indicate failure diff --git a/surfsense_backend/app/schemas/search_source_connector.py b/surfsense_backend/app/schemas/search_source_connector.py index f86f45d73..5386658ff 100644 --- a/surfsense_backend/app/schemas/search_source_connector.py +++ b/surfsense_backend/app/schemas/search_source_connector.py @@ -57,6 +57,16 @@ class SearchSourceConnectorBase(BaseModel): # Ensure the integration token is not empty if not config.get("NOTION_INTEGRATION_TOKEN"): raise ValueError("NOTION_INTEGRATION_TOKEN cannot be empty") + + elif connector_type == SearchSourceConnectorType.GITHUB_CONNECTOR: + # For GITHUB_CONNECTOR, only allow GITHUB_TOKEN + allowed_keys = ["GITHUB_PAT"] + if set(config.keys()) != set(allowed_keys): + raise ValueError(f"For GITHUB_CONNECTOR connector type, config must only contain these keys: {allowed_keys}") + + # Ensure the token is not empty + if not config.get("GITHUB_PAT"): + raise ValueError("GITHUB_TOKEN cannot be empty") return config @@ -70,4 +80,4 @@ class SearchSourceConnectorRead(SearchSourceConnectorBase, IDModel, TimestampMod user_id: uuid.UUID class Config: - from_attributes = True \ No newline at end of file + from_attributes = True diff --git a/surfsense_backend/app/tasks/connectors_indexing_tasks.py b/surfsense_backend/app/tasks/connectors_indexing_tasks.py index 580a5c71f..670fa26ad 100644 --- a/surfsense_backend/app/tasks/connectors_indexing_tasks.py +++ b/surfsense_backend/app/tasks/connectors_indexing_tasks.py @@ -3,12 +3,13 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.future import select from sqlalchemy import delete -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from app.db import Document, DocumentType, Chunk, SearchSourceConnector, SearchSourceConnectorType from app.config import config from app.prompts import SUMMARY_PROMPT_TEMPLATE from app.connectors.slack_history import SlackHistory from app.connectors.notion_history import NotionHistoryConnector +from app.connectors.github_connector import GitHubConnector from slack_sdk.errors import SlackApiError import logging @@ -589,3 +590,195 @@ async def index_notion_pages( await session.rollback() logger.error(f"Failed to index Notion pages: {str(e)}", exc_info=True) return 0, f"Failed to index Notion pages: {str(e)}" + +async def index_github_repos( + session: AsyncSession, + connector_id: int, + search_space_id: int, + update_last_indexed: bool = True +) -> Tuple[int, Optional[str]]: + """ + Index code and documentation files from accessible GitHub repositories. + + Args: + session: Database session + connector_id: ID of the GitHub connector + search_space_id: ID of the search space to store documents in + update_last_indexed: Whether to update the last_indexed_at timestamp (default: True) + + Returns: + Tuple containing (number of documents indexed, error message or None) + """ + documents_processed = 0 + errors = [] + + try: + # 1. Get the GitHub connector from the database + result = await session.execute( + select(SearchSourceConnector) + .filter( + SearchSourceConnector.id == connector_id, + SearchSourceConnector.connector_type == SearchSourceConnectorType.GITHUB_CONNECTOR + ) + ) + connector = result.scalars().first() + + if not connector: + return 0, f"Connector with ID {connector_id} not found or is not a GitHub connector" + + # 2. Get the GitHub PAT from the connector config + github_pat = connector.config.get("GITHUB_PAT") + if not github_pat: + return 0, "GitHub Personal Access Token (PAT) not found in connector config" + + # 3. Initialize GitHub connector client + try: + github_client = GitHubConnector(token=github_pat) + except ValueError as e: + return 0, f"Failed to initialize GitHub client: {str(e)}" + + # 4. Get list of accessible repositories + repositories = github_client.get_user_repositories() + if not repositories: + logger.info("No accessible GitHub repositories found for the provided token.") + return 0, "No accessible GitHub repositories found." + + logger.info(f"Found {len(repositories)} repositories to potentially index.") + + # 5. Get existing documents for this search space and connector type to prevent duplicates + existing_docs_result = await session.execute( + select(Document) + .filter( + Document.search_space_id == search_space_id, + Document.document_type == DocumentType.GITHUB_CONNECTOR + ) + ) + existing_docs = existing_docs_result.scalars().all() + # Create a lookup dict: key=repo_fullname/file_path, value=Document object + existing_docs_lookup = {doc.document_metadata.get("full_path"): doc for doc in existing_docs if doc.document_metadata.get("full_path")} + logger.info(f"Found {len(existing_docs_lookup)} existing GitHub documents in database for search space {search_space_id}") + + # 6. Iterate through repositories and index files + for repo_info in repositories: + repo_full_name = repo_info.get("full_name") + if not repo_full_name: + logger.warning(f"Skipping repository with missing full_name: {repo_info.get('name')}") + continue + + logger.info(f"Processing repository: {repo_full_name}") + try: + files_to_index = github_client.get_repository_files(repo_full_name) + if not files_to_index: + logger.info(f"No indexable files found in repository: {repo_full_name}") + continue + + logger.info(f"Found {len(files_to_index)} files to process in {repo_full_name}") + + for file_info in files_to_index: + file_path = file_info.get("path") + file_url = file_info.get("url") + file_sha = file_info.get("sha") + file_type = file_info.get("type") # 'code' or 'doc' + full_path_key = f"{repo_full_name}/{file_path}" + + if not file_path or not file_url or not file_sha: + logger.warning(f"Skipping file with missing info in {repo_full_name}: {file_info}") + continue + + # Check if document already exists and if content hash matches + existing_doc = existing_docs_lookup.get(full_path_key) + if existing_doc and existing_doc.document_metadata.get("sha") == file_sha: + logger.debug(f"Skipping unchanged file: {full_path_key}") + continue # Skip if SHA matches (content hasn't changed) + + # Get file content + file_content = github_client.get_file_content(repo_full_name, file_path) + + if file_content is None: + logger.warning(f"Could not retrieve content for {full_path_key}. Skipping.") + continue # Skip if content fetch failed + + # Use file_content directly for chunking, maybe summary for main content? + # For now, let's use the full content for both, might need refinement + summary_content = f"GitHub file: {full_path_key}\n\n{file_content[:1000]}..." # Simple summary + summary_embedding = config.embedding_model_instance.embed(summary_content) + + # Chunk the content + try: + chunks_data = [ + Chunk(content=chunk.text, embedding=chunk.embedding) + for chunk in config.chunker_instance.chunk(file_content) + ] + except Exception as chunk_err: + logger.error(f"Failed to chunk file {full_path_key}: {chunk_err}") + errors.append(f"Chunking failed for {full_path_key}: {chunk_err}") + continue # Skip this file if chunking fails + + doc_metadata = { + "repository_full_name": repo_full_name, + "file_path": file_path, + "full_path": full_path_key, # For easier lookup + "url": file_url, + "sha": file_sha, + "type": file_type, + "indexed_at": datetime.now(timezone.utc).isoformat() + } + + if existing_doc: + # Update existing document + logger.info(f"Updating document for file: {full_path_key}") + existing_doc.title = f"GitHub - {file_path}" + existing_doc.document_metadata = doc_metadata + existing_doc.content = summary_content # Update summary + existing_doc.embedding = summary_embedding # Update embedding + + # Delete old chunks + await session.execute( + delete(Chunk) + .where(Chunk.document_id == existing_doc.id) + ) + # Add new chunks + for chunk_obj in chunks_data: + chunk_obj.document_id = existing_doc.id + session.add(chunk_obj) + + documents_processed += 1 + else: + # Create new document + logger.info(f"Creating new document for file: {full_path_key}") + document = Document( + title=f"GitHub - {file_path}", + document_type=DocumentType.GITHUB_CONNECTOR, + document_metadata=doc_metadata, + content=summary_content, # Store summary + embedding=summary_embedding, + search_space_id=search_space_id, + chunks=chunks_data # Associate chunks directly + ) + session.add(document) + documents_processed += 1 + + # Commit periodically or at the end? For now, commit per repo + # await session.commit() + + except Exception as repo_err: + logger.error(f"Failed to process repository {repo_full_name}: {repo_err}") + errors.append(f"Failed processing {repo_full_name}: {repo_err}") + + # Commit all changes at the end + await session.commit() + logger.info(f"Finished GitHub indexing for connector {connector_id}. Processed {documents_processed} files.") + + except SQLAlchemyError as db_err: + await session.rollback() + logger.error(f"Database error during GitHub indexing for connector {connector_id}: {db_err}") + errors.append(f"Database error: {db_err}") + return documents_processed, "; ".join(errors) if errors else str(db_err) + except Exception as e: + await session.rollback() + logger.error(f"Unexpected error during GitHub indexing for connector {connector_id}: {e}", exc_info=True) + errors.append(f"Unexpected error: {e}") + return documents_processed, "; ".join(errors) if errors else str(e) + + error_message = "; ".join(errors) if errors else None + return documents_processed, error_message diff --git a/surfsense_backend/main.py b/surfsense_backend/main.py index 76d478b4f..81ef52049 100644 --- a/surfsense_backend/main.py +++ b/surfsense_backend/main.py @@ -1,5 +1,12 @@ import uvicorn import argparse +import logging + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) if __name__ == "__main__": parser = argparse.ArgumentParser(description='Run the SurfSense application') diff --git a/surfsense_backend/pyproject.toml b/surfsense_backend/pyproject.toml index 2d1e00a63..9fb5fbb2b 100644 --- a/surfsense_backend/pyproject.toml +++ b/surfsense_backend/pyproject.toml @@ -5,12 +5,14 @@ description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [ + "alembic>=1.13.0", "asyncpg>=0.30.0", "chonkie[all]>=0.4.1", "fastapi>=0.115.8", "fastapi-users[oauth,sqlalchemy]>=14.0.1", "firecrawl-py>=1.12.0", "gpt-researcher>=0.12.12", + "github3.py==4.0.1", "langchain-community>=0.3.17", "langchain-unstructured>=0.1.6", "litellm>=1.61.4", diff --git a/surfsense_backend/uv.lock b/surfsense_backend/uv.lock index e64ff3958..5211ea0d3 100644 --- a/surfsense_backend/uv.lock +++ b/surfsense_backend/uv.lock @@ -92,6 +92,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, ] +[[package]] +name = "alembic" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/57/e314c31b261d1e8a5a5f1908065b4ff98270a778ce7579bd4254477209a7/alembic-1.15.2.tar.gz", hash = "sha256:1c72391bbdeffccfe317eefba686cb9a3c078005478885413b95c3b26c57a8a7", size = 1925573 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/18/d89a443ed1ab9bcda16264716f809c663866d4ca8de218aa78fd50b38ead/alembic-1.15.2-py3-none-any.whl", hash = "sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53", size = 231911 }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -884,6 +898,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/94/758680531a00d06e471ef649e4ec2ed6bf185356a7f9fbfbb7368a40bd49/fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b", size = 184484 }, ] +[[package]] +name = "github3-py" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "uritemplate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/91/603bcaf8cd1b3927de64bf56c3a8915f6653ea7281919140c5bcff2bfe7b/github3.py-4.0.1.tar.gz", hash = "sha256:30d571076753efc389edc7f9aaef338a4fcb24b54d8968d5f39b1342f45ddd36", size = 36214038 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/2394d4fb542574678b0ba342daf734d4d811768da3c2ee0c84d509dcb26c/github3.py-4.0.1-py3-none-any.whl", hash = "sha256:a89af7de25650612d1da2f0609622bcdeb07ee8a45a1c06b2d16a05e4234e753", size = 151800 }, +] + [[package]] name = "google-api-core" version = "2.24.2" @@ -1614,6 +1643,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/a1/3e145759e776c8866488a71270c399bf7c4e554551ac2e247aa0a18a0596/makefun-1.15.6-py2.py3-none-any.whl", hash = "sha256:e69b870f0bb60304765b1e3db576aaecf2f9b3e5105afe8cfeff8f2afe6ad067", size = 22946 }, ] +[[package]] +name = "mako" +version = "1.3.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509 }, +] + [[package]] name = "markdown" version = "3.7" @@ -3228,11 +3269,13 @@ name = "surf-new-backend" version = "0.1.0" source = { virtual = "." } dependencies = [ + { name = "alembic" }, { name = "asyncpg" }, { name = "chonkie", extra = ["all"] }, { name = "fastapi" }, { name = "fastapi-users", extra = ["oauth", "sqlalchemy"] }, { name = "firecrawl-py" }, + { name = "github3-py" }, { name = "gpt-researcher" }, { name = "langchain-community" }, { name = "langchain-unstructured" }, @@ -3254,11 +3297,13 @@ dependencies = [ [package.metadata] requires-dist = [ + { name = "alembic", specifier = ">=1.13.0" }, { name = "asyncpg", specifier = ">=0.30.0" }, { name = "chonkie", extras = ["all"], specifier = ">=0.4.1" }, { name = "fastapi", specifier = ">=0.115.8" }, { name = "fastapi-users", extras = ["oauth", "sqlalchemy"], specifier = ">=14.0.1" }, { name = "firecrawl-py", specifier = ">=1.12.0" }, + { name = "github3-py", specifier = "==4.0.1" }, { name = "gpt-researcher", specifier = ">=0.12.12" }, { name = "langchain-community", specifier = ">=0.3.17" }, { name = "langchain-unstructured", specifier = ">=0.1.6" }, @@ -3658,6 +3703,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/6d/adb955ecf60811a3735d508974bbb5358e7745b635dc001329267529c6f2/unstructured.pytesseract-0.3.15-py3-none-any.whl", hash = "sha256:a3f505c5efb7ff9f10379051a7dd6aa624b3be6b0f023ed6767cc80d0b1613d1", size = 14992 }, ] +[[package]] +name = "uritemplate" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/5a/4742fdba39cd02a56226815abfa72fe0aa81c33bed16ed045647d6000eba/uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", size = 273898 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c0/7461b49cd25aeece13766f02ee576d1db528f1c37ce69aee300e075b485b/uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e", size = 10356 }, +] + [[package]] name = "urllib3" version = "2.3.0" diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx index dfc8b828a..817ca584d 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx @@ -44,6 +44,7 @@ const getConnectorTypeDisplay = (type: string): string => { "TAVILY_API": "Tavily API", "SLACK_CONNECTOR": "Slack", "NOTION_CONNECTOR": "Notion", + "GITHUB_CONNECTOR": "GitHub", // Add other connector types here as needed }; return typeMap[type] || type; @@ -253,4 +254,4 @@ export default function ConnectorsPage() { ); -} \ No newline at end of file +} diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx index 7700bc877..e841639cd 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx @@ -51,6 +51,7 @@ const getConnectorTypeDisplay = (type: string): string => { "TAVILY_API": "Tavily API", "SLACK_CONNECTOR": "Slack Connector", "NOTION_CONNECTOR": "Notion Connector", + "GITHUB_CONNECTOR": "GitHub Connector", // Add other connector types here as needed }; return typeMap[type] || type; @@ -85,7 +86,8 @@ export default function EditConnectorPage() { "SERPER_API": "SERPER_API_KEY", "TAVILY_API": "TAVILY_API_KEY", "SLACK_CONNECTOR": "SLACK_BOT_TOKEN", - "NOTION_CONNECTOR": "NOTION_INTEGRATION_TOKEN" + "NOTION_CONNECTOR": "NOTION_INTEGRATION_TOKEN", + "GITHUB_CONNECTOR": "GITHUB_PAT" }; return fieldMap[connectorType] || ""; }; @@ -136,6 +138,8 @@ export default function EditConnectorPage() { name: values.name, connector_type: connector.connector_type, config: updatedConfig, + is_indexable: connector.is_indexable, + last_indexed_at: connector.last_indexed_at, }); toast.success("Connector updated successfully!"); @@ -223,17 +227,21 @@ export default function EditConnectorPage() { ? "Slack Bot Token" : connector?.connector_type === "NOTION_CONNECTOR" ? "Notion Integration Token" - : "API Key"} + : connector?.connector_type === "GITHUB_CONNECTOR" + ? "GitHub Personal Access Token (PAT)" + : "API Key"} @@ -243,7 +251,9 @@ export default function EditConnectorPage() { ? "Enter a new Slack Bot Token or leave blank to keep your existing token." : connector?.connector_type === "NOTION_CONNECTOR" ? "Enter a new Notion Integration Token or leave blank to keep your existing token." - : "Enter a new API key or leave blank to keep your existing key."} + : connector?.connector_type === "GITHUB_CONNECTOR" + ? "Enter a new GitHub PAT or leave blank to keep your existing token." + : "Enter a new API key or leave blank to keep your existing key."} @@ -276,4 +286,4 @@ export default function EditConnectorPage() { ); -} \ No newline at end of file +} diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx new file mode 100644 index 000000000..45534d6a1 --- /dev/null +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx @@ -0,0 +1,298 @@ +"use client"; + +import { useState } from "react"; +import { useRouter, useParams } from "next/navigation"; +import { motion } from "framer-motion"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import * as z from "zod"; +import { toast } from "sonner"; +import { ArrowLeft, Check, Info, Loader2, Github } from "lucide-react"; + +// Assuming useSearchSourceConnectors hook exists and works similarly +import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + Alert, + AlertDescription, + AlertTitle, +} from "@/components/ui/alert"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; + +// Define the form schema with Zod for GitHub +const githubConnectorFormSchema = z.object({ + name: z.string().min(3, { + message: "Connector name must be at least 3 characters.", + }), + github_pat: z.string() + .min(20, { // Apply min length first + message: "GitHub Personal Access Token seems too short.", + }) + .refine(pat => pat.startsWith('ghp_') || pat.startsWith('github_pat_'), { // Then refine the pattern + message: "GitHub PAT should start with 'ghp_' or 'github_pat_'", + }), +}); + +// Define the type for the form values +type GithubConnectorFormValues = z.infer; + +export default function GithubConnectorPage() { + const router = useRouter(); + const params = useParams(); + const searchSpaceId = params.search_space_id as string; + const [isSubmitting, setIsSubmitting] = useState(false); + const { createConnector } = useSearchSourceConnectors(); // Assuming this hook exists + + // Initialize the form + const form = useForm({ + resolver: zodResolver(githubConnectorFormSchema), + defaultValues: { + name: "GitHub Connector", + github_pat: "", + }, + }); + + // Handle form submission + const onSubmit = async (values: GithubConnectorFormValues) => { + setIsSubmitting(true); + try { + await createConnector({ + name: values.name, + connector_type: "GITHUB_CONNECTOR", + config: { + GITHUB_PAT: values.github_pat, + }, + is_indexable: true, // GitHub connector is indexable + last_indexed_at: null, // New connector hasn't been indexed + }); + + toast.success("GitHub connector created successfully!"); + + // Navigate back to connectors management page (or the add page) + router.push(`/dashboard/${searchSpaceId}/connectors`); + } catch (error) { // Added type check for error + console.error("Error creating GitHub connector:", error); + // Display specific backend error message if available + const errorMessage = error instanceof Error ? error.message : "Failed to create GitHub connector. Please check the PAT and permissions."; + toast.error(errorMessage); + } finally { + setIsSubmitting(false); + } + }; + + return ( +
+ + + + + + Connect GitHub + Setup Guide + + + + + + Connect GitHub Account + + Integrate with GitHub using a Personal Access Token (PAT) to search and retrieve information from accessible repositories. This connector can index your code and documentation. + + + + + + GitHub Personal Access Token (PAT) Required + + You'll need a GitHub PAT with the appropriate scopes (e.g., 'repo') to use this connector. You can create one from your + + GitHub Developer Settings + . + + + +
+ + ( + + Connector Name + + + + + A friendly name to identify this GitHub connection. + + + + )} + /> + + ( + + GitHub Personal Access Token (PAT) + + + + + Your GitHub PAT will be encrypted and stored securely. Ensure it has the necessary 'repo' scopes. + + + + )} + /> + +
+ +
+ + +
+ +

What you get with GitHub integration:

+
    +
  • Search through code and documentation in your repositories
  • +
  • Access READMEs, Markdown files, and common code files
  • +
  • Connect your project knowledge directly to your search space
  • +
  • Index your repositories for enhanced search capabilities
  • +
+
+
+
+ + + + + GitHub Connector Setup Guide + + Learn how to generate a Personal Access Token (PAT) and connect your GitHub account. + + + +
+

How it works

+

+ The GitHub connector uses a Personal Access Token (PAT) to authenticate with the GitHub API. It fetches information about repositories accessible to the token and indexes relevant files (code, markdown, text). +

+
    +
  • The connector indexes files based on common code and documentation extensions.
  • +
  • Large files (over 1MB) are skipped during indexing.
  • +
  • Indexing runs periodically (check connector settings for frequency) to keep content up-to-date.
  • +
+
+ + + + Step 1: Create a GitHub PAT + + + + Token Security + + Treat your PAT like a password. Store it securely and consider using fine-grained tokens if possible. + + + +
+
+

Generating a Token:

+
    +
  1. Go to your GitHub Developer settings.
  2. +
  3. Click on Personal access tokens, then choose Tokens (classic) or Fine-grained tokens (recommended if available and suitable).
  4. +
  5. Click Generate new token (and choose the appropriate type).
  6. +
  7. Give your token a descriptive name (e.g., "SurfSense Connector").
  8. +
  9. Set an expiration date for the token (recommended for security).
  10. +
  11. Under Select scopes (for classic tokens) or Repository access (for fine-grained), grant the necessary permissions. At minimum, the `repo` scope (or equivalent read access to repositories for fine-grained tokens) is required to read repository content.
  12. +
  13. Click Generate token.
  14. +
  15. Important: Copy your new PAT immediately. You won't be able to see it again after leaving the page.
  16. +
+
+
+
+
+ + + Step 2: Connect in SurfSense + +
    +
  1. Paste the copied GitHub PAT into the "GitHub Personal Access Token (PAT)" field on the "Connect GitHub" tab.
  2. +
  3. Optionally, give the connector a custom name.
  4. +
  5. Click the Connect GitHub button.
  6. +
  7. If the connection is successful, you will be redirected and can start indexing from the Connectors page.
  8. +
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx index d68de69d3..f70bb6209 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx @@ -14,6 +14,7 @@ import { IconMail, IconBrandZoom, IconChevronRight, + IconWorldWww, } from "@tabler/icons-react"; import { motion, AnimatePresence } from "framer-motion"; import { useState } from "react"; @@ -22,36 +23,43 @@ import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; +import { useForm } from "react-hook-form"; + +// Define the Connector type +interface Connector { + id: string; + title: string; + description: string; + icon: React.ReactNode; + status: "available" | "coming-soon" | "connected"; // Added connected status example +} + +interface ConnectorCategory { + id: string; + title: string; + connectors: Connector[]; +} // Define connector categories and their connectors -const connectorCategories = [ +const connectorCategories: ConnectorCategory[] = [ { id: "search-engines", title: "Search Engines", - description: "Connect to search engines to enhance your research capabilities.", - icon: , connectors: [ { - id: "tavily-api", - title: "Tavily Search API", - description: "Connect to Tavily Search API to search the web.", - icon: , - status: "available", - }, - { - id: "serper-api", - title: "Serper API", - description: "Connect to Serper API to search the web.", - icon: , - status: "coming-soon", + id: "web-search", + title: "Web Search", + description: "Enable web search capabilities for broader context.", + icon: , + status: "available", // Example status + // Potentially add config form here if needed (e.g., choosing provider) }, + // Add other search engine connectors like Tavily, Serper if they have UI config ], }, { id: "team-chats", title: "Team Chats", - description: "Connect to your team communication platforms.", - icon: , connectors: [ { id: "slack-connector", @@ -79,8 +87,6 @@ const connectorCategories = [ { id: "knowledge-bases", title: "Knowledge Bases", - description: "Connect to your knowledge bases and documentation.", - icon: , connectors: [ { id: "notion-connector", @@ -88,21 +94,20 @@ const connectorCategories = [ description: "Connect to your Notion workspace to access pages and databases.", icon: , status: "available", + // No form here, assumes it links to its own page }, { - id: "github", + id: "github-connector", // Keep the id simple title: "GitHub", - description: "Connect to GitHub repositories to access code and documentation.", + description: "Connect a GitHub PAT to index code and docs from accessible repositories.", icon: , - status: "coming-soon", + status: "available", }, ], }, { id: "communication", title: "Communication", - description: "Connect to your email and meeting platforms.", - icon: , connectors: [ { id: "gmail", @@ -125,7 +130,7 @@ const connectorCategories = [ export default function ConnectorsPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; - const [expandedCategories, setExpandedCategories] = useState(["search-engines"]); + const [expandedCategories, setExpandedCategories] = useState(["search-engines", "knowledge-bases"]); const toggleCategory = (categoryId: string) => { setExpandedCategories(prev => @@ -150,104 +155,68 @@ export default function ConnectorsPage() {
- {connectorCategories.map((category, categoryIndex) => ( + {connectorCategories.map((category) => ( toggleCategory(category.id)} - className="border rounded-lg overflow-hidden bg-card" + className="space-y-2" > - - -
-
- {category.icon} -
-
-

{category.title}

-

{category.description}

-
-
- -
-
+
+

{category.title}

+ + {/* Replace with your preferred expand/collapse icon/button */} + + +
- -
- - {category.connectors.map((connector, index) => ( - -
- -
- {connector.icon} +
+ {category.connectors.map((connector) => ( +
+
+
+
+ {connector.icon} +

+ {connector.title} +

+ {connector.status === "coming-soon" && ( + + Coming soon + + )} + {/* TODO: Add 'Connected' badge based on actual state */} +
+

+ {connector.description} +

- -
-

- {connector.title} -

- {connector.status === "coming-soon" && ( - Coming soon - )} -
- -

- {connector.description} -

- - {connector.status === "available" ? ( - -
+ {/* Always render Link button if available */} + {connector.status === 'available' && ( +
+ + - ) : ( -
+ )} + {connector.status === 'coming-soon' && ( +
+ - )} - - ))} - +
+ )} + {/* TODO: Add logic for 'connected' status */} +
+ ))}
+ ))}
From 0b93c9dfef54bd8c45ca594931f4b151336f3c9d Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 13 Apr 2025 20:47:23 -0700 Subject: [PATCH 02/47] Fixed current agent citation issues and added sub_section_writer agent for upcoming SurfSense research agent --- surfsense_backend/app/agents/__init__.py | 0 .../app/agents/researcher/__init__.py | 0 .../researcher/sub_section_writer/__init__.py | 8 + .../sub_section_writer/configuration.py | 31 +++ .../researcher/sub_section_writer/graph.py | 22 ++ .../researcher/sub_section_writer/nodes.py | 244 ++++++++++++++++++ .../researcher/sub_section_writer/prompts.py | 82 ++++++ .../researcher/sub_section_writer/state.py | 23 ++ surfsense_backend/app/routes/chats_routes.py | 2 +- .../tasks/stream_connector_search_results.py | 2 +- .../app/utils/connector_service.py | 112 +++----- surfsense_backend/pyproject.toml | 1 + surfsense_backend/uv.lock | 119 +++++++++ 13 files changed, 565 insertions(+), 81 deletions(-) create mode 100644 surfsense_backend/app/agents/__init__.py create mode 100644 surfsense_backend/app/agents/researcher/__init__.py create mode 100644 surfsense_backend/app/agents/researcher/sub_section_writer/__init__.py create mode 100644 surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py create mode 100644 surfsense_backend/app/agents/researcher/sub_section_writer/graph.py create mode 100644 surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py create mode 100644 surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py create mode 100644 surfsense_backend/app/agents/researcher/sub_section_writer/state.py diff --git a/surfsense_backend/app/agents/__init__.py b/surfsense_backend/app/agents/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/surfsense_backend/app/agents/researcher/__init__.py b/surfsense_backend/app/agents/researcher/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/__init__.py b/surfsense_backend/app/agents/researcher/sub_section_writer/__init__.py new file mode 100644 index 000000000..8459b2977 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/__init__.py @@ -0,0 +1,8 @@ +"""New LangGraph Agent. + +This module defines a custom graph. +""" + +from .graph import graph + +__all__ = ["graph"] diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py b/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py new file mode 100644 index 000000000..b34090e7c --- /dev/null +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py @@ -0,0 +1,31 @@ +"""Define the configurable parameters for the agent.""" + +from __future__ import annotations + +from dataclasses import dataclass, fields +from typing import Optional, List + +from langchain_core.runnables import RunnableConfig + + +@dataclass(kw_only=True) +class Configuration: + """The configuration for the agent.""" + + # Input parameters provided at invocation + sub_section_title: str + sub_questions: List[str] + connectors_to_search: List[str] + user_id: str + search_space_id: int + top_k: int = 20 # Default top_k value + + + @classmethod + def from_runnable_config( + cls, config: Optional[RunnableConfig] = None + ) -> Configuration: + """Create a Configuration instance from a RunnableConfig object.""" + configurable = (config.get("configurable") or {}) if config else {} + _fields = {f.name for f in fields(cls) if f.init} + return cls(**{k: v for k, v in configurable.items() if k in _fields}) diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py b/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py new file mode 100644 index 000000000..e250cdee5 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py @@ -0,0 +1,22 @@ +from langgraph.graph import StateGraph +from .state import State +from .nodes import fetch_relevant_documents, write_sub_section +from .configuration import Configuration + +# Define a new graph +workflow = StateGraph(State, config_schema=Configuration) + +# Add the nodes to the graph +workflow.add_node("fetch_relevant_documents", fetch_relevant_documents) +workflow.add_node("write_sub_section", write_sub_section) + +# Entry point +workflow.add_edge("__start__", "fetch_relevant_documents") +# Connect fetch_relevant_documents to write_sub_section +workflow.add_edge("fetch_relevant_documents", "write_sub_section") +# Exit point +workflow.add_edge("write_sub_section", "__end__") + +# Compile the workflow into an executable graph +graph = workflow.compile() +graph.name = "Sub Section Writer" # This defines the custom name in LangSmith diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py new file mode 100644 index 000000000..52fa877c9 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py @@ -0,0 +1,244 @@ +from .configuration import Configuration +from langchain_core.runnables import RunnableConfig +from .state import State +from typing import Any, Dict +from app.utils.connector_service import ConnectorService +from app.utils.reranker_service import RerankerService +from app.config import config as app_config +from .prompts import citation_system_prompt +from langchain_core.messages import HumanMessage, SystemMessage + +async def fetch_relevant_documents(state: State, config: RunnableConfig) -> Dict[str, Any]: + """ + Fetch relevant documents for the sub-section using specified connectors. + + This node retrieves documents from various data sources based on the sub-questions + derived from the sub-section title. It searches across all selected connectors + (YouTube, Extension, Crawled URLs, Files, Tavily API, Slack, Notion) and reranks + the results to provide the most relevant information for the agent workflow. + + Returns: + Dict containing the reranked documents in the "relevant_documents_fetched" key. + """ + # Get configuration + configuration = Configuration.from_runnable_config(config) + + # Extract state parameters + db_session = state.db_session + + # Extract config parameters + user_id = configuration.user_id + search_space_id = configuration.search_space_id + TOP_K = configuration.top_k + + # Initialize services + connector_service = ConnectorService(db_session) + reranker_service = RerankerService.get_reranker_instance(app_config) + + all_raw_documents = [] # Store all raw documents before reranking + + for user_query in configuration.sub_questions: + # Reformulate query (optional, consider if needed for each sub-question) + # reformulated_query = await QueryService.reformulate_query(user_query) + reformulated_query = user_query # Using original sub-question for now + + # Process each selected connector + for connector in configuration.connectors_to_search: + if connector == "YOUTUBE_VIDEO": + _, youtube_chunks = await connector_service.search_youtube( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + all_raw_documents.extend(youtube_chunks) + + elif connector == "EXTENSION": + _, extension_chunks = await connector_service.search_extension( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + all_raw_documents.extend(extension_chunks) + + elif connector == "CRAWLED_URL": + _, crawled_urls_chunks = await connector_service.search_crawled_urls( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + all_raw_documents.extend(crawled_urls_chunks) + + elif connector == "FILE": + _, files_chunks = await connector_service.search_files( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + all_raw_documents.extend(files_chunks) + + elif connector == "TAVILY_API": + _, tavily_chunks = await connector_service.search_tavily( + user_query=reformulated_query, + user_id=user_id, + top_k=TOP_K + ) + all_raw_documents.extend(tavily_chunks) + + elif connector == "SLACK_CONNECTOR": + _, slack_chunks = await connector_service.search_slack( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + all_raw_documents.extend(slack_chunks) + + elif connector == "NOTION_CONNECTOR": + _, notion_chunks = await connector_service.search_notion( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + all_raw_documents.extend(notion_chunks) + + # If we have documents and a reranker is available, rerank them + # Deduplicate documents based on chunk_id or content to avoid processing duplicates + seen_chunk_ids = set() + seen_content_hashes = set() + deduplicated_docs = [] + + for doc in all_raw_documents: + chunk_id = doc.get("chunk_id") + content = doc.get("content", "") + content_hash = hash(content) + + # Skip if we've seen this chunk_id or content before + if (chunk_id and chunk_id in seen_chunk_ids) or content_hash in seen_content_hashes: + continue + + # Add to our tracking sets and keep this document + if chunk_id: + seen_chunk_ids.add(chunk_id) + seen_content_hashes.add(content_hash) + deduplicated_docs.append(doc) + + # Use deduplicated documents for reranking + reranked_docs = deduplicated_docs + if deduplicated_docs and reranker_service: + # Use the main sub_section_title for reranking context + rerank_query = configuration.sub_section_title + + # Convert documents to format expected by reranker + reranker_input_docs = [ + { + "chunk_id": doc.get("chunk_id", f"chunk_{i}"), + "content": doc.get("content", ""), + "score": doc.get("score", 0.0), + "document": { + "id": doc.get("document", {}).get("id", ""), + "title": doc.get("document", {}).get("title", ""), + "document_type": doc.get("document", {}).get("document_type", ""), + "metadata": doc.get("document", {}).get("metadata", {}) + } + } for i, doc in enumerate(deduplicated_docs) + ] + + # Rerank documents using the main title query + reranked_docs = reranker_service.rerank_documents(rerank_query, reranker_input_docs) + + # Sort by score in descending order + reranked_docs.sort(key=lambda x: x.get("score", 0), reverse=True) + + # Update state with fetched documents + return { + "relevant_documents_fetched": reranked_docs + } + + + +async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, Any]: + """ + Write the sub-section using the fetched documents. + + This node takes the relevant documents fetched in the previous node and uses + an LLM to generate a comprehensive answer to the sub-section questions with + proper citations. The citations follow IEEE format using source IDs from the + documents. + + Returns: + Dict containing the final answer in the "final_answer" key. + """ + + # Get configuration and relevant documents + configuration = Configuration.from_runnable_config(config) + documents = state.relevant_documents_fetched + + # Initialize LLM + llm = app_config.fast_llm_instance + + # If no documents were found, return a message indicating this + if not documents or len(documents) == 0: + return { + "final_answer": "No relevant documents were found to answer this question. Please try refining your search or providing more specific questions." + } + + # Prepare documents for citation formatting + formatted_documents = [] + for i, doc in enumerate(documents): + # Extract content and metadata + content = doc.get("content", "") + doc_info = doc.get("document", {}) + document_id = doc_info.get("id", f"{i+1}") # Use document ID or index+1 as source_id + + # Format document according to the citation system prompt's expected format + formatted_doc = f""" + + + {document_id} + + + {content} + + + """ + formatted_documents.append(formatted_doc) + + # Create the query that combines the section title and questions + # section_title = configuration.sub_section_title + questions = "\n".join([f"- {q}" for q in configuration.sub_questions]) + documents_text = "\n".join(formatted_documents) + + # Construct a clear, structured query for the LLM + human_message_content = f""" + Please write a comprehensive answer for the title: + + Address the following questions: + + {questions} + + + Use the provided documents as your source material and cite them properly using the IEEE citation format [X] where X is the source_id. + + {documents_text} + + """ + + # Create messages for the LLM + messages = [ + SystemMessage(content=citation_system_prompt), + HumanMessage(content=human_message_content) + ] + + # Call the LLM and get the response + response = await llm.ainvoke(messages) + final_answer = response.content + + return { + "final_answer": final_answer + } + diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py b/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py new file mode 100644 index 000000000..cc3ad6167 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py @@ -0,0 +1,82 @@ +citation_system_prompt = f""" +You are a research assistant tasked with analyzing documents and providing comprehensive answers with proper citations in IEEE format. + + +1. Carefully analyze all provided documents in the section's. +2. Extract relevant information that addresses the user's query. +3. Synthesize a comprehensive, well-structured answer using information from these documents. +4. For EVERY piece of information you include from the documents, add an IEEE-style citation in square brackets [X] where X is the source_id from the document's metadata. +5. Make sure ALL factual statements from the documents have proper citations. +6. If multiple documents support the same point, include all relevant citations [X], [Y]. +7. Present information in a logical, coherent flow. +8. Use your own words to connect ideas, but cite ALL information from the documents. +9. If documents contain conflicting information, acknowledge this and present both perspectives with appropriate citations. +10. Do not make up or include information not found in the provided documents. +11. CRITICAL: You MUST use the exact source_id value from each document's metadata for citations. Do not create your own citation numbers. +12. CRITICAL: Every citation MUST be in the IEEE format [X] where X is the exact source_id value. +13. CRITICAL: Never renumber or reorder citations - always use the original source_id values. +14. CRITICAL: Do not return citations as clickable links. +15. CRITICAL: Never format citations as markdown links like "([1](https://example.com))". Always use plain square brackets only. +16. CRITICAL: Citations must ONLY appear as [X] or [X], [Y], [Z] format - never with parentheses, hyperlinks, or other formatting. +17. CRITICAL: Never make up citation numbers. Only use source_id values that are explicitly provided in the document metadata. +18. CRITICAL: If you are unsure about a source_id, do not include a citation rather than guessing or making one up. + + + +- Write in clear, professional language suitable for academic or technical audiences +- Organize your response with appropriate paragraphs, headings, and structure +- Every fact from the documents must have an IEEE-style citation in square brackets [X] where X is the EXACT source_id from the document's metadata +- Citations should appear at the end of the sentence containing the information they support +- Multiple citations should be separated by commas: [X], [Y], [Z] +- No need to return references section. Just citation numbers in answer. +- NEVER create your own citation numbering system - use the exact source_id values from the documents. +- NEVER format citations as clickable links or as markdown links like "([1](https://example.com))". Always use plain square brackets only. +- NEVER make up citation numbers if you are unsure about the source_id. It is better to omit the citation than to guess. + + + + + + 1 + + + The Great Barrier Reef is the world's largest coral reef system, stretching over 2,300 kilometers along the coast of Queensland, Australia. It comprises over 2,900 individual reefs and 900 islands. + + + + + + 13 + + + Climate change poses a significant threat to coral reefs worldwide. Rising ocean temperatures have led to mass coral bleaching events in the Great Barrier Reef in 2016, 2017, and 2020. + + + + + + 21 + + + The Great Barrier Reef was designated a UNESCO World Heritage Site in 1981 due to its outstanding universal value and biological diversity. It is home to over 1,500 species of fish and 400 types of coral. + + + + + + The Great Barrier Reef is the world's largest coral reef system, stretching over 2,300 kilometers along the coast of Queensland, Australia [1]. It was designated a UNESCO World Heritage Site in 1981 due to its outstanding universal value and biological diversity [21]. The reef is home to over 1,500 species of fish and 400 types of coral [21]. Unfortunately, climate change poses a significant threat to coral reefs worldwide, with rising ocean temperatures leading to mass coral bleaching events in the Great Barrier Reef in 2016, 2017, and 2020 [13]. The reef system comprises over 2,900 individual reefs and 900 islands [1], making it an ecological treasure that requires protection from multiple threats [1], [13]. + + + +DO NOT use any of these incorrect citation formats: +- Using parentheses and markdown links: ([1](https://github.com/MODSetter/SurfSense)) +- Using parentheses around brackets: ([1]) +- Using hyperlinked text: [link to source 1](https://example.com) +- Using footnote style: ... reef system¹ +- Making up citation numbers when source_id is unknown + +ONLY use plain square brackets [1] or multiple citations [1], [2], [3] + + +Note that the citation numbers match exactly with the source_id values (1, 13, and 21) and are not renumbered sequentially. Citations follow IEEE style with square brackets and appear at the end of sentences. +""" \ No newline at end of file diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/state.py b/surfsense_backend/app/agents/researcher/sub_section_writer/state.py new file mode 100644 index 000000000..fb5b08e87 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/state.py @@ -0,0 +1,23 @@ +"""Define the state structures for the agent.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import List, Optional, Any +from sqlalchemy.ext.asyncio import AsyncSession + +@dataclass +class State: + """Defines the dynamic state for the agent during execution. + + This state tracks the database session and the outputs generated by the agent's nodes. + See: https://langchain-ai.github.io/langgraph/concepts/low_level/#state + for more information. + """ + # Runtime context + db_session: AsyncSession + + # OUTPUT: Populated by agent nodes + relevant_documents_fetched: Optional[List[Any]] = None + final_answer: Optional[str] = None + diff --git a/surfsense_backend/app/routes/chats_routes.py b/surfsense_backend/app/routes/chats_routes.py index d05c06027..139dd9bd9 100644 --- a/surfsense_backend/app/routes/chats_routes.py +++ b/surfsense_backend/app/routes/chats_routes.py @@ -46,7 +46,7 @@ async def handle_chat_data( response = StreamingResponse(stream_connector_search_results( user_query, user.id, - search_space_id, + int(search_space_id), session, research_mode, selected_connectors diff --git a/surfsense_backend/app/tasks/stream_connector_search_results.py b/surfsense_backend/app/tasks/stream_connector_search_results.py index 5c563dcbb..4fa1f2a74 100644 --- a/surfsense_backend/app/tasks/stream_connector_search_results.py +++ b/surfsense_backend/app/tasks/stream_connector_search_results.py @@ -14,7 +14,7 @@ from app.utils.document_converters import convert_chunks_to_langchain_documents async def stream_connector_search_results( user_query: str, - user_id: int, + user_id: str, search_space_id: int, session: AsyncSession, research_mode: str, diff --git a/surfsense_backend/app/utils/connector_service.py b/surfsense_backend/app/utils/connector_service.py index 9e676e59d..6843e1b2a 100644 --- a/surfsense_backend/app/utils/connector_service.py +++ b/surfsense_backend/app/utils/connector_service.py @@ -13,7 +13,7 @@ class ConnectorService: self.retriever = ChucksHybridSearchRetriever(session) self.source_id_counter = 1 - async def search_crawled_urls(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + async def search_crawled_urls(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: """ Search for crawled URLs and return both the source information and langchain documents @@ -28,16 +28,16 @@ class ConnectorService: document_type="CRAWLED_URL" ) - # Map crawled_urls_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(crawled_urls_chunks): - #Fix for UI + # Fix for UI crawled_urls_chunks[i]['document']['id'] = self.source_id_counter # Extract document metadata document = chunk.get('document', {}) metadata = document.get('metadata', {}) - # Create a mapped source entry + # Create a source entry source = { "id": self.source_id_counter, "title": document.get('title', 'Untitled Document'), @@ -46,14 +46,7 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use a unique identifier for tracking unique sources - source_key = source.get("url") or source.get("title") - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { @@ -63,10 +56,9 @@ class ConnectorService: "sources": sources_list, } - return result_object, crawled_urls_chunks - async def search_files(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + async def search_files(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: """ Search for files and return both the source information and langchain documents @@ -81,16 +73,16 @@ class ConnectorService: document_type="FILE" ) - # Map crawled_urls_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(files_chunks): - #Fix for UI + # Fix for UI files_chunks[i]['document']['id'] = self.source_id_counter # Extract document metadata document = chunk.get('document', {}) metadata = document.get('metadata', {}) - # Create a mapped source entry + # Create a source entry source = { "id": self.source_id_counter, "title": document.get('title', 'Untitled Document'), @@ -99,14 +91,7 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use a unique identifier for tracking unique sources - source_key = source.get("url") or source.get("title") - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { @@ -118,7 +103,7 @@ class ConnectorService: return result_object, files_chunks - async def get_connector_by_type(self, user_id: int, connector_type: SearchSourceConnectorType) -> Optional[SearchSourceConnector]: + async def get_connector_by_type(self, user_id: str, connector_type: SearchSourceConnectorType) -> Optional[SearchSourceConnector]: """ Get a connector by type for a specific user @@ -138,7 +123,7 @@ class ConnectorService: ) return result.scalars().first() - async def search_tavily(self, user_query: str, user_id: int, top_k: int = 20) -> tuple: + async def search_tavily(self, user_query: str, user_id: str, top_k: int = 20) -> tuple: """ Search using Tavily API and return both the source information and documents @@ -177,13 +162,10 @@ class ConnectorService: # Extract results from Tavily response tavily_results = response.get("results", []) - # Map Tavily results to the required format + # Process each result and create sources directly without deduplication sources_list = [] documents = [] - # Start IDs from 1000 to avoid conflicts with other connectors - base_id = 100 - for i, result in enumerate(tavily_results): # Create a source entry @@ -234,7 +216,7 @@ class ConnectorService: "sources": [], }, [] - async def search_slack(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + async def search_slack(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: """ Search for slack and return both the source information and langchain documents @@ -249,10 +231,10 @@ class ConnectorService: document_type="SLACK_CONNECTOR" ) - # Map slack_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(slack_chunks): - #Fix for UI + # Fix for UI slack_chunks[i]['document']['id'] = self.source_id_counter # Extract document metadata document = chunk.get('document', {}) @@ -286,14 +268,7 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use channel_id and content as a unique identifier for tracking unique sources - source_key = f"{channel_id}_{chunk.get('chunk_id', i)}" - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { @@ -305,7 +280,7 @@ class ConnectorService: return result_object, slack_chunks - async def search_notion(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + async def search_notion(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: """ Search for Notion pages and return both the source information and langchain documents @@ -326,8 +301,8 @@ class ConnectorService: document_type="NOTION_CONNECTOR" ) - # Map notion_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(notion_chunks): # Fix for UI notion_chunks[i]['document']['id'] = self.source_id_counter @@ -365,14 +340,7 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use page_id and content as a unique identifier for tracking unique sources - source_key = f"{page_id}_{chunk.get('chunk_id', i)}" - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { @@ -384,7 +352,7 @@ class ConnectorService: return result_object, notion_chunks - async def search_extension(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + async def search_extension(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: """ Search for extension data and return both the source information and langchain documents @@ -405,8 +373,8 @@ class ConnectorService: document_type="EXTENSION" ) - # Map extension_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(extension_chunks): # Fix for UI extension_chunks[i]['document']['id'] = self.source_id_counter @@ -462,14 +430,7 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use URL and timestamp as a unique identifier for tracking unique sources - source_key = f"{webpage_url}_{visit_date}" - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { @@ -481,7 +442,7 @@ class ConnectorService: return result_object, extension_chunks - async def search_youtube(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + async def search_youtube(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: """ Search for YouTube videos and return both the source information and langchain documents @@ -502,8 +463,8 @@ class ConnectorService: document_type="YOUTUBE_VIDEO" ) - # Map youtube_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(youtube_chunks): # Fix for UI youtube_chunks[i]['document']['id'] = self.source_id_counter @@ -541,18 +502,11 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use video_id as a unique identifier for tracking unique sources - source_key = video_id or f"youtube_{i}" - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { - "id": 6, # Assign a unique ID for the YouTube connector + "id": 7, # Assign a unique ID for the YouTube connector "name": "YouTube Videos", "type": "YOUTUBE_VIDEO", "sources": sources_list, diff --git a/surfsense_backend/pyproject.toml b/surfsense_backend/pyproject.toml index 2d1e00a63..b2fe9a5a1 100644 --- a/surfsense_backend/pyproject.toml +++ b/surfsense_backend/pyproject.toml @@ -13,6 +13,7 @@ dependencies = [ "gpt-researcher>=0.12.12", "langchain-community>=0.3.17", "langchain-unstructured>=0.1.6", + "langgraph>=0.3.29", "litellm>=1.61.4", "markdownify>=0.14.1", "notion-client>=2.3.0", diff --git a/surfsense_backend/uv.lock b/surfsense_backend/uv.lock index e64ff3958..846571cb2 100644 --- a/surfsense_backend/uv.lock +++ b/surfsense_backend/uv.lock @@ -1499,6 +1499,61 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/0e/72/a3add0e4eec4eb9e2569554f7c70f4a3c27712f40e3284d483e88094cc0e/langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0", size = 981474 } +[[package]] +name = "langgraph" +version = "0.3.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-prebuilt" }, + { name = "langgraph-sdk" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/6a38988d472835845ee6837402dc6050e012117b84ef2b838b7abd3268f1/langgraph-0.3.29.tar.gz", hash = "sha256:2bfa6d6b04541ddfcb03b56efd1fca6294a1700ff61a52c1582a8bb4f2d55a94", size = 119970 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/b4/89d81ed78efeec5b3d554a9244cdc6aa6cbf544da9c53738d7c2c6d4be57/langgraph-0.3.29-py3-none-any.whl", hash = "sha256:6045fbbe9ccc5af3fd7295a86f88e0d2b111243a36290e41248af379009e4cc1", size = 144692 }, +] + +[[package]] +name = "langgraph-checkpoint" +version = "2.0.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "ormsgpack" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/df/bacef68562ba4c391ded751eecda8e579ec78a581506064cf625e0ebd93a/langgraph_checkpoint-2.0.24.tar.gz", hash = "sha256:9596dad332344e7e871257be464df8a07c2e9bac66143081b11b9422b0167e5b", size = 37328 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/60/30397e8fd2b7dead3754aa79d708caff9dbb371f30b4cd21802c60f6b921/langgraph_checkpoint-2.0.24-py3-none-any.whl", hash = "sha256:3836e2909ef2387d1fa8d04ee3e2a353f980d519fd6c649af352676dc73d66b8", size = 42028 }, +] + +[[package]] +name = "langgraph-prebuilt" +version = "0.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/30/f31f0e076c37d097b53e4cff5d479a3686e1991f6c86a1a4727d5d1f5489/langgraph_prebuilt-0.1.8.tar.gz", hash = "sha256:4de7659151829b2b955b6798df6800e580e617782c15c2c5b29b139697491831", size = 24543 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/72/9e092665502f8f52f2708065ed14fbbba3f95d1a1b65d62049b0c5fcdf00/langgraph_prebuilt-0.1.8-py3-none-any.whl", hash = "sha256:ae97b828ae00be2cefec503423aa782e1bff165e9b94592e224da132f2526968", size = 25903 }, +] + +[[package]] +name = "langgraph-sdk" +version = "0.1.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/c6/a11de2c770e1ac2774e2f19fdbd982b8df079e4206376456e14af395a3f0/langgraph_sdk-0.1.61.tar.gz", hash = "sha256:87dd1f07ab82da8875ac343268ece8bf5414632017ebc9d1cef4b523962fd601", size = 44136 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/2b/85e796d8b4aad892c5d2bccc0def124fcdc2c9852dfa121adadfc41085b2/langgraph_sdk-0.1.61-py3-none-any.whl", hash = "sha256:f2d774b12497c428862993090622d51e0dbc3f53e0cee3d74a13c7495d835cc6", size = 47249 }, +] + [[package]] name = "langsmith" version = "0.3.8" @@ -2169,6 +2224,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, ] +[[package]] +name = "ormsgpack" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/a7/462cf8ff5e29241868b82d3a5ec124d690eb6a6a5c6fa5bb1367b839e027/ormsgpack-1.9.1.tar.gz", hash = "sha256:3da6e63d82565e590b98178545e64f0f8506137b92bd31a2d04fd7c82baf5794", size = 56887 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/f1/155a598cc8030526ccaaf91ba4d61530f87900645559487edba58b0a90a2/ormsgpack-1.9.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:1ede445fc3fdba219bb0e0d1f289df26a9c7602016b7daac6fafe8fe4e91548f", size = 383225 }, + { url = "https://files.pythonhosted.org/packages/23/1c/ef3097ba550fad55c79525f461febdd4e0d9cc18d065248044536f09488e/ormsgpack-1.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db50b9f918e25b289114312ed775794d0978b469831b992bdc65bfe20b91fe30", size = 214056 }, + { url = "https://files.pythonhosted.org/packages/27/77/64d0da25896b2cbb99505ca518c109d7dd1964d7fde14c10943731738b60/ormsgpack-1.9.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c7d8fc58e4333308f58ec720b1ee6b12b2b3fe2d2d8f0766ab751cb351e8757", size = 217339 }, + { url = "https://files.pythonhosted.org/packages/6c/10/c3a7fd0a0068b0bb52cccbfeb5656db895d69e895a3abbc210c4b3f98ff8/ormsgpack-1.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeee6d08c040db265cb8563444aba343ecb32cbdbe2414a489dcead9f70c6765", size = 223816 }, + { url = "https://files.pythonhosted.org/packages/43/e7/aee1238dba652f2116c2523d36fd1c5f9775436032be5c233108fd2a1415/ormsgpack-1.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2fbb8181c198bdc413a4e889e5200f010724eea4b6d5a9a7eee2df039ac04aca", size = 394287 }, + { url = "https://files.pythonhosted.org/packages/c7/09/1b452a92376f29d7a2da7c18fb01cf09978197a8eccbb8b204e72fd5a970/ormsgpack-1.9.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:16488f094ac0e2250cceea6caf72962614aa432ee11dd57ef45e1ad25ece3eff", size = 480709 }, + { url = "https://files.pythonhosted.org/packages/de/13/7fa9fee5a73af8a73a42bf8c2e69489605714f65f5a41454400a05e84a3b/ormsgpack-1.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:422d960bfd6ad88be20794f50ec7953d8f7a0f2df60e19d0e8feb994e2ed64ee", size = 397247 }, + { url = "https://files.pythonhosted.org/packages/a1/2d/2e87cb28110db0d3bb750edd4d8719b5068852a2eef5e96b0bf376bb8a81/ormsgpack-1.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:e6e2f9eab527cf43fb4a4293e493370276b1c8716cf305689202d646c6a782ef", size = 125368 }, + { url = "https://files.pythonhosted.org/packages/b8/54/0390d5d092831e4df29dbafe32402891fc14b3e6ffe5a644b16cbbc9d9bc/ormsgpack-1.9.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ac61c18d9dd085e8519b949f7e655f7fb07909fd09c53b4338dd33309012e289", size = 383226 }, + { url = "https://files.pythonhosted.org/packages/47/64/8b15d262d1caefead8fb22ec144f5ff7d9505fc31c22bc34598053d46fbe/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134840b8c6615da2c24ce77bd12a46098015c808197a9995c7a2d991e1904eec", size = 214057 }, + { url = "https://files.pythonhosted.org/packages/57/00/65823609266bad4d5ed29ea753d24a3bdb01c7edaf923da80967fc31f9c5/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38fd42618f626394b2c7713c5d4bcbc917254e9753d5d4cde460658b51b11a74", size = 217340 }, + { url = "https://files.pythonhosted.org/packages/a0/51/e535c50f7f87b49110233647f55300d7975139ef5e51f1adb4c55f58c124/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d36397333ad07b9eba4c2e271fa78951bd81afc059c85a6e9f6c0eb2de07cda", size = 223815 }, + { url = "https://files.pythonhosted.org/packages/0c/ee/393e4a6de2a62124bf589602648f295a9fb3907a0e2fe80061b88899d072/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:603063089597917d04e4c1b1d53988a34f7dc2ff1a03adcfd1cf4ae966d5fba6", size = 394287 }, + { url = "https://files.pythonhosted.org/packages/c6/d8/e56d7c3cb73a0e533e3e2a21ae5838b2aa36a9dac1ca9c861af6bae5a369/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:94bbf2b185e0cb721ceaba20e64b7158e6caf0cecd140ca29b9f05a8d5e91e2f", size = 480707 }, + { url = "https://files.pythonhosted.org/packages/e6/e0/6a3c6a6dc98583a721c54b02f5195bde8f801aebdeda9b601fa2ab30ad39/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38f380b1e8c96a712eb302b9349347385161a8e29046868ae2bfdfcb23e2692", size = 397246 }, + { url = "https://files.pythonhosted.org/packages/b0/60/0ee5d790f13507e1f75ac21fc82dc1ef29afe1f520bd0f249d65b2f4839b/ormsgpack-1.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:a4bc63fb30db94075611cedbbc3d261dd17cf2aa8ff75a0fd684cd45ca29cb1b", size = 125371 }, +] + [[package]] name = "packaging" version = "24.2" @@ -3236,6 +3315,7 @@ dependencies = [ { name = "gpt-researcher" }, { name = "langchain-community" }, { name = "langchain-unstructured" }, + { name = "langgraph" }, { name = "litellm" }, { name = "markdownify" }, { name = "notion-client" }, @@ -3262,6 +3342,7 @@ requires-dist = [ { name = "gpt-researcher", specifier = ">=0.12.12" }, { name = "langchain-community", specifier = ">=0.3.17" }, { name = "langchain-unstructured", specifier = ">=0.1.6" }, + { name = "langgraph", specifier = ">=0.3.29" }, { name = "litellm", specifier = ">=1.61.4" }, { name = "markdownify", specifier = ">=0.14.1" }, { name = "notion-client", specifier = ">=2.3.0" }, @@ -3884,6 +3965,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9b/07/df054f7413bdfff5e98f75056e4ed0977d0c8716424011fac2587864d1d3/XlsxWriter-3.2.2-py3-none-any.whl", hash = "sha256:272ce861e7fa5e82a4a6ebc24511f2cb952fde3461f6c6e1a1e81d3272db1471", size = 165121 }, ] +[[package]] +name = "xxhash" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787 }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959 }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006 }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326 }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380 }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934 }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301 }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351 }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294 }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674 }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022 }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170 }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040 }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796 }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795 }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792 }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950 }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980 }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324 }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370 }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911 }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352 }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410 }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322 }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725 }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070 }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 }, +] + [[package]] name = "yarl" version = "1.18.3" From aaddd5ca9cd489429edc5c45684f61317a72b1ba Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 13 Apr 2025 20:53:21 -0700 Subject: [PATCH 03/47] Refactor: Remove redundant integer conversion for search_space_id in chat data handling --- surfsense_backend/app/routes/chats_routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfsense_backend/app/routes/chats_routes.py b/surfsense_backend/app/routes/chats_routes.py index 139dd9bd9..df80ca43f 100644 --- a/surfsense_backend/app/routes/chats_routes.py +++ b/surfsense_backend/app/routes/chats_routes.py @@ -46,7 +46,7 @@ async def handle_chat_data( response = StreamingResponse(stream_connector_search_results( user_query, user.id, - int(search_space_id), + search_space_id, # Already converted to int in lines 32-37 session, research_mode, selected_connectors From a26fac435b8bcee0e189ffa422729e2c9ca9ac7c Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Sun, 13 Apr 2025 21:23:05 -0700 Subject: [PATCH 04/47] documents table migration, fix/update github indexing --- ...1_add_github_connector_to_documenttype_.py | 70 +++++++++++++++++++ .../app/connectors/github_connector.py | 57 +++++++++++---- .../tasks/stream_connector_search_results.py | 27 +++++++ .../app/utils/connector_service.py | 55 ++++++++++++++- .../documents/(manage)/page.tsx | 5 +- 5 files changed, 197 insertions(+), 17 deletions(-) create mode 100644 surfsense_backend/alembic/versions/e55302644c51_add_github_connector_to_documenttype_.py diff --git a/surfsense_backend/alembic/versions/e55302644c51_add_github_connector_to_documenttype_.py b/surfsense_backend/alembic/versions/e55302644c51_add_github_connector_to_documenttype_.py new file mode 100644 index 000000000..1f15912d4 --- /dev/null +++ b/surfsense_backend/alembic/versions/e55302644c51_add_github_connector_to_documenttype_.py @@ -0,0 +1,70 @@ +"""Add GITHUB_CONNECTOR to DocumentType enum + +Revision ID: e55302644c51 +Revises: 1 +Create Date: 2025-04-13 19:56:00.059921 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'e55302644c51' +down_revision: Union[str, None] = '1' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +# Define the ENUM type name and the new value +ENUM_NAME = 'documenttype' # Make sure this matches the name in your DB (usually lowercase class name) +NEW_VALUE = 'GITHUB_CONNECTOR' + +def upgrade() -> None: + """Upgrade schema.""" + op.execute(f"ALTER TYPE {ENUM_NAME} ADD VALUE '{NEW_VALUE}'") + + +# Warning: This will delete all rows with the new value +def downgrade() -> None: + """Downgrade schema - remove GITHUB_CONNECTOR from enum.""" + + # The old type name + old_enum_name = f"{ENUM_NAME}_old" + + # Enum values *before* GITHUB_CONNECTOR was added + old_values = ( + 'EXTENSION', + 'CRAWLED_URL', + 'FILE', + 'SLACK_CONNECTOR', + 'NOTION_CONNECTOR', + 'YOUTUBE_VIDEO' + ) + old_values_sql = ", ".join([f"'{v}'" for v in old_values]) + + # Table and column names (adjust if different) + table_name = 'documents' + column_name = 'document_type' + + # 1. Rename the current enum type + op.execute(f"ALTER TYPE {ENUM_NAME} RENAME TO {old_enum_name}") + + # 2. Create the new enum type with the old values + op.execute(f"CREATE TYPE {ENUM_NAME} AS ENUM({old_values_sql})") + + # 3. Update the table: + op.execute( + f"DELETE FROM {table_name} WHERE {column_name}::text = '{NEW_VALUE}'" + ) + + # 4. Alter the column to use the new enum type (casting old values) + op.execute( + f"ALTER TABLE {table_name} ALTER COLUMN {column_name} " + f"TYPE {ENUM_NAME} USING {column_name}::text::{ENUM_NAME}" + ) + + # 5. Drop the old enum type + op.execute(f"DROP TYPE {old_enum_name}") + # ### end Alembic commands ### diff --git a/surfsense_backend/app/connectors/github_connector.py b/surfsense_backend/app/connectors/github_connector.py index d827dac15..265f89b0a 100644 --- a/surfsense_backend/app/connectors/github_connector.py +++ b/surfsense_backend/app/connectors/github_connector.py @@ -2,7 +2,6 @@ import base64 import logging from typing import List, Optional, Dict, Any, Tuple from github3 import login as github_login, exceptions as github_exceptions -from github3.repos.repo import Repository from github3.repos.contents import Contents from github3.exceptions import ForbiddenError, NotFoundError @@ -26,6 +25,33 @@ MAX_FILE_SIZE = 1 * 1024 * 1024 class GitHubConnector: """Connector for interacting with the GitHub API.""" + # Directories to skip during file traversal + SKIPPED_DIRS = { + # Version control + '.git', + # Dependencies + 'node_modules', + 'vendor', + # Build artifacts / Caches + 'build', + 'dist', + 'target', + '__pycache__', + # Virtual environments + 'venv', + '.venv', + 'env', + # IDE/Editor config + '.vscode', + '.idea', + '.project', + '.settings', + # Temporary / Logs + 'tmp', + 'logs', + # Add other project-specific irrelevant directories if needed + } + def __init__(self, token: str): """ Initializes the GitHub connector. @@ -54,17 +80,16 @@ class GitHubConnector: # type='owner' fetches repos owned by the user # type='member' fetches repos the user is a collaborator on (including orgs) # type='all' fetches both - for repo in self.gh.repositories(type='all', sort='updated'): - if isinstance(repo, Repository): - repos_data.append({ - "id": repo.id, - "name": repo.name, - "full_name": repo.full_name, - "private": repo.private, - "url": repo.html_url, - "description": repo.description or "", - "last_updated": repo.updated_at.isoformat() if repo.updated_at else None, - }) + for repo in self.gh.repositories(type='owner', sort='updated'): + repos_data.append({ + "id": repo.id, + "name": repo.name, + "full_name": repo.full_name, + "private": repo.private, + "url": repo.html_url, + "description": repo.description or "", + "last_updated": repo.updated_at if repo.updated_at else None, + }) logger.info(f"Fetched {len(repos_data)} repositories.") return repos_data except Exception as e: @@ -90,8 +115,7 @@ class GitHubConnector: if not repo: logger.warning(f"Repository '{repo_full_name}' not found.") return [] - - contents = repo.directory_contents(path=path) # Use directory_contents for clarity + contents = repo.directory_contents(directory_path=path) # Use directory_contents for clarity # contents returns a list of tuples (name, content_obj) for item_name, content_item in contents: @@ -99,6 +123,11 @@ class GitHubConnector: continue if content_item.type == 'dir': + # Check if the directory name is in the skipped list + if content_item.name in self.SKIPPED_DIRS: + logger.debug(f"Skipping directory: {content_item.path}") + continue # Skip recursion for this directory + # Recursively fetch contents of subdirectory files_list.extend(self.get_repository_files(repo_full_name, path=content_item.path)) elif content_item.type == 'file': diff --git a/surfsense_backend/app/tasks/stream_connector_search_results.py b/surfsense_backend/app/tasks/stream_connector_search_results.py index 5c563dcbb..b9a703abc 100644 --- a/surfsense_backend/app/tasks/stream_connector_search_results.py +++ b/surfsense_backend/app/tasks/stream_connector_search_results.py @@ -244,6 +244,33 @@ async def stream_connector_search_results( all_raw_documents.extend(notion_chunks) + # Github Connector + if connector == "GITHUB_CONNECTOR": + # Send terminal message about starting search + yield streaming_service.add_terminal_message("Starting to search for GitHub connector...") + print("Starting to search for GitHub connector...") + # Search using Github API with reformulated query + result_object, github_chunks = await connector_service.search_github( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + + # Send terminal message about search results + yield streaming_service.add_terminal_message( + f"Found {len(result_object['sources'])} relevant results from Github", + "success" + ) + + # Update sources + all_sources.append(result_object) + yield streaming_service.update_sources(all_sources) + + # Add documents to collection + all_raw_documents.extend(github_chunks) + + # If we have documents to research diff --git a/surfsense_backend/app/utils/connector_service.py b/surfsense_backend/app/utils/connector_service.py index 9e676e59d..8d7a5519f 100644 --- a/surfsense_backend/app/utils/connector_service.py +++ b/surfsense_backend/app/utils/connector_service.py @@ -558,4 +558,57 @@ class ConnectorService: "sources": sources_list, } - return result_object, youtube_chunks \ No newline at end of file + return result_object, youtube_chunks + + async def search_github(self, user_query: str, user_id: int, search_space_id: int, top_k: int = 20) -> tuple: + """ + Search for GitHub documents and return both the source information and langchain documents + + Returns: + tuple: (sources_info, langchain_documents) + """ + github_chunks = await self.retriever.hybrid_search( + query_text=user_query, + top_k=top_k, + user_id=user_id, + search_space_id=search_space_id, + document_type="GITHUB_CONNECTOR" + ) + + # Map github_chunks to the required format + mapped_sources = {} + for i, chunk in enumerate(github_chunks): + # Fix for UI - assign a unique ID for citation/source tracking + github_chunks[i]['document']['id'] = self.source_id_counter + + # Extract document metadata + document = chunk.get('document', {}) + metadata = document.get('metadata', {}) + + # Create a mapped source entry + source = { + "id": self.source_id_counter, + "title": document.get('title', 'GitHub Document'), # Use specific title if available + "description": metadata.get('description', chunk.get('content', '')[:100]), # Use description or content preview + "url": metadata.get('url', '') # Use URL if available in metadata + } + + self.source_id_counter += 1 + + # Use a unique identifier for tracking unique sources (URL preferred) + source_key = source.get("url") or source.get("title") + if source_key and source_key not in mapped_sources: + mapped_sources[source_key] = source + + # Convert to list of sources + sources_list = list(mapped_sources.values()) + + # Create result object + result_object = { + "id": 7, # Assuming 7 is the next available ID + "name": "GitHub", + "type": "GITHUB_CONNECTOR", + "sources": sources_list, + } + + return result_object, github_chunks diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx index 66f8b0810..18b43579b 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx @@ -94,7 +94,7 @@ import rehypeSanitize from "rehype-sanitize"; import remarkGfm from "remark-gfm"; import { DocumentViewer } from "@/components/document-viewer"; import { JsonMetadataViewer } from "@/components/json-metadata-viewer"; -import { IconBrandNotion, IconBrandSlack, IconBrandYoutube } from "@tabler/icons-react"; +import { IconBrandGithub, IconBrandNotion, IconBrandSlack, IconBrandYoutube } from "@tabler/icons-react"; // Define animation variants for reuse const fadeInScale = { @@ -142,6 +142,7 @@ const documentTypeIcons = { NOTION_CONNECTOR: IconBrandNotion, FILE: File, YOUTUBE_VIDEO: IconBrandYoutube, + GITHUB_CONNECTOR: IconBrandGithub, } as const; const columns: ColumnDef[] = [ @@ -1028,4 +1029,4 @@ function RowActions({ row }: { row: Row }) { ); } -export { DocumentsTable } \ No newline at end of file +export { DocumentsTable } From 396c070b28b0c2d0f7a8f54a104c64f22fcd03c0 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Sun, 13 Apr 2025 21:33:10 -0700 Subject: [PATCH 05/47] addressing coderabbit PR comment --- surfsense_backend/app/schemas/search_source_connector.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/surfsense_backend/app/schemas/search_source_connector.py b/surfsense_backend/app/schemas/search_source_connector.py index 5386658ff..41e1086e7 100644 --- a/surfsense_backend/app/schemas/search_source_connector.py +++ b/surfsense_backend/app/schemas/search_source_connector.py @@ -59,14 +59,14 @@ class SearchSourceConnectorBase(BaseModel): raise ValueError("NOTION_INTEGRATION_TOKEN cannot be empty") elif connector_type == SearchSourceConnectorType.GITHUB_CONNECTOR: - # For GITHUB_CONNECTOR, only allow GITHUB_TOKEN + # For GITHUB_CONNECTOR, only allow GITHUB_PAT allowed_keys = ["GITHUB_PAT"] if set(config.keys()) != set(allowed_keys): raise ValueError(f"For GITHUB_CONNECTOR connector type, config must only contain these keys: {allowed_keys}") # Ensure the token is not empty if not config.get("GITHUB_PAT"): - raise ValueError("GITHUB_TOKEN cannot be empty") + raise ValueError("GITHUB_PAT cannot be empty") return config From 3e472c124fe323ca10ea8230b2bb20c3d0a857db Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Mon, 14 Apr 2025 17:04:43 -0700 Subject: [PATCH 06/47] sync with main and address comments --- .../app/utils/connector_service.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/surfsense_backend/app/utils/connector_service.py b/surfsense_backend/app/utils/connector_service.py index e0d632298..fe08572a2 100644 --- a/surfsense_backend/app/utils/connector_service.py +++ b/surfsense_backend/app/utils/connector_service.py @@ -529,8 +529,8 @@ class ConnectorService: document_type="GITHUB_CONNECTOR" ) - # Map github_chunks to the required format - mapped_sources = {} + # Process each chunk and create sources directly without deduplication + sources_list = [] for i, chunk in enumerate(github_chunks): # Fix for UI - assign a unique ID for citation/source tracking github_chunks[i]['document']['id'] = self.source_id_counter @@ -539,7 +539,7 @@ class ConnectorService: document = chunk.get('document', {}) metadata = document.get('metadata', {}) - # Create a mapped source entry + # Create a source entry source = { "id": self.source_id_counter, "title": document.get('title', 'GitHub Document'), # Use specific title if available @@ -548,18 +548,11 @@ class ConnectorService: } self.source_id_counter += 1 - - # Use a unique identifier for tracking unique sources (URL preferred) - source_key = source.get("url") or source.get("title") - if source_key and source_key not in mapped_sources: - mapped_sources[source_key] = source - - # Convert to list of sources - sources_list = list(mapped_sources.values()) + sources_list.append(source) # Create result object result_object = { - "id": 7, # Assuming 7 is the next available ID + "id": 8, "name": "GitHub", "type": "GITHUB_CONNECTOR", "sources": sources_list, From 37f11b152195e7ed23ecdf4abe9a6203bac2566e Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Mon, 14 Apr 2025 19:12:39 -0700 Subject: [PATCH 07/47] fix(ui) : Added back Tavily and Updated the researcher icon for GitHub --- .../[search_space_id]/connectors/add/page.tsx | 246 ++++++++++++------ .../components/ModernHeroWithGradients.tsx | 2 +- .../components/chat/ConnectorComponents.tsx | 4 +- 3 files changed, 175 insertions(+), 77 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx index f70bb6209..7329c44de 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx @@ -15,6 +15,7 @@ import { IconBrandZoom, IconChevronRight, IconWorldWww, + IconChevronDown, } from "@tabler/icons-react"; import { motion, AnimatePresence } from "framer-motion"; import { useState } from "react"; @@ -23,6 +24,8 @@ import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; +import { Badge } from "@/components/ui/badge"; +import { Card, CardContent, CardFooter, CardHeader } from "@/components/ui/card"; import { useForm } from "react-hook-form"; // Define the Connector type @@ -31,7 +34,7 @@ interface Connector { title: string; description: string; icon: React.ReactNode; - status: "available" | "coming-soon" | "connected"; // Added connected status example + status: "available" | "coming-soon" | "connected"; } interface ConnectorCategory { @@ -47,12 +50,11 @@ const connectorCategories: ConnectorCategory[] = [ title: "Search Engines", connectors: [ { - id: "web-search", - title: "Web Search", - description: "Enable web search capabilities for broader context.", + id: "tavily-api", + title: "Tavily API", + description: "Search the web using the Tavily API", icon: , - status: "available", // Example status - // Potentially add config form here if needed (e.g., choosing provider) + status: "available", }, // Add other search engine connectors like Tavily, Serper if they have UI config ], @@ -94,10 +96,9 @@ const connectorCategories: ConnectorCategory[] = [ description: "Connect to your Notion workspace to access pages and databases.", icon: , status: "available", - // No form here, assumes it links to its own page }, { - id: "github-connector", // Keep the id simple + id: "github-connector", title: "GitHub", description: "Connect a GitHub PAT to index code and docs from accessible repositories.", icon: , @@ -127,6 +128,44 @@ const connectorCategories: ConnectorCategory[] = [ }, ]; +// Animation variants +const fadeIn = { + hidden: { opacity: 0 }, + visible: { opacity: 1, transition: { duration: 0.4 } } +}; + +const staggerContainer = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1 + } + } +}; + +const cardVariants = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + type: "spring", + stiffness: 260, + damping: 20 + } + }, + hover: { + scale: 1.02, + boxShadow: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)", + transition: { + type: "spring", + stiffness: 400, + damping: 10 + } + } +}; + export default function ConnectorsPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; @@ -141,85 +180,142 @@ export default function ConnectorsPage() { }; return ( -
+
-

Connect Your Tools

-

+

+ Connect Your Tools +

+

Integrate with your favorite services to enhance your research capabilities.

-
+ {connectorCategories.map((category) => ( - toggleCategory(category.id)} - className="space-y-2" + variants={fadeIn} + className="rounded-lg border bg-card text-card-foreground shadow-sm" > -
-

{category.title}

- - {/* Replace with your preferred expand/collapse icon/button */} - - -
- -
- {category.connectors.map((connector) => ( -
-
-
-
- {connector.icon} -

- {connector.title} -

- {connector.status === "coming-soon" && ( - - Coming soon - - )} - {/* TODO: Add 'Connected' badge based on actual state */} -
-

- {connector.description} -

-
-
- {/* Always render Link button if available */} - {connector.status === 'available' && ( -
- - - -
- )} - {connector.status === 'coming-soon' && ( -
- -
- )} - {/* TODO: Add logic for 'connected' status */} -
- ))} + toggleCategory(category.id)} + className="w-full" + > +
+

{category.title}

+ + +
- - -
+ + + + + {category.connectors.map((connector) => ( + + + +
+ + {connector.icon} + +
+
+
+

{connector.title}

+ {connector.status === "coming-soon" && ( + + Coming soon + + )} + {connector.status === "connected" && ( + + Connected + + )} +
+
+
+ + +

+ {connector.description} +

+
+ + + {connector.status === 'available' && ( + + + + )} + {connector.status === 'coming-soon' && ( + + )} + {connector.status === 'connected' && ( + + )} + +
+
+ ))} +
+
+
+ + ))} -
+
); } diff --git a/surfsense_web/components/ModernHeroWithGradients.tsx b/surfsense_web/components/ModernHeroWithGradients.tsx index c0bde3fe0..bd10a50ca 100644 --- a/surfsense_web/components/ModernHeroWithGradients.tsx +++ b/surfsense_web/components/ModernHeroWithGradients.tsx @@ -36,7 +36,7 @@ export function ModernHeroWithGradients() {

- A Customizable AI Research Agent just like NotebookLM or Perplexity, but connected to external sources such as search engines (Tavily), Slack, Notion, and more. + A Customizable AI Research Agent just like NotebookLM or Perplexity, but connected to external sources such as search engines (Tavily), Slack, Notion, YouTube, GitHub and more.

{ const iconProps = { className: "h-4 w-4" }; switch(connectorType) { + case 'GITHUB_CONNECTOR': + return ; case 'YOUTUBE_VIDEO': return ; case 'CRAWLED_URL': From 61a9ceb7a0a193e61874b135ee9b7b38fd1d076a Mon Sep 17 00:00:00 2001 From: Rohan Verma <122026167+MODSetter@users.noreply.github.com> Date: Mon, 14 Apr 2025 19:26:23 -0700 Subject: [PATCH 08/47] Update README.md --- README.md | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c890b2de3..028ab03bd 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ -![headnew](https://github.com/user-attachments/assets/a44fd1e7-1861-46d0-aff7-19cf33e86baa) + +![new_header](https://github.com/user-attachments/assets/e236b764-0ddc-42ff-a1f1-8fbb3d2e0e65) # SurfSense -While tools like NotebookLM and Perplexity are impressive and highly effective for conducting research on any topic, SurfSense elevates this capability by integrating with your personal knowledge base. It is a highly customizable AI research agent, connected to external sources such as search engines (Tavily), Slack, Notion, and more to come. +While tools like NotebookLM and Perplexity are impressive and highly effective for conducting research on any topic/query, SurfSense elevates this capability by integrating with your personal knowledge base. It is a highly customizable AI research agent, connected to external sources such as search engines (Tavily), Slack, Notion, YouTube, GitHub and more to come. # Video @@ -45,6 +46,7 @@ Open source and easy to deploy locally. - Slack - Notion - Youtube Videos +- GitHub - and more to come..... #### 🔖 Cross Browser Extension @@ -150,6 +152,20 @@ For local frontend setup just fill out the `.env` file of frontend. You should see your Next.js frontend running at `localhost:3000` +#### Some FrontEnd Screens + +**Search Spaces** + +![search_spaces](https://github.com/user-attachments/assets/e254c38c-f937-44b6-9e9d-770db583d099) + +**Research Agent** + +![researcher](https://github.com/user-attachments/assets/fda3e61f-f936-4b66-b565-d84edde44a67) + + +**Agent Chat** + +![chat](https://github.com/user-attachments/assets/bb352d52-1c6d-4020-926b-722d0b98b491) --- @@ -193,12 +209,15 @@ After filling in your SurfSense API key you should be able to use extension now. ### **BackEnd** - **FastAPI**: Modern, fast web framework for building APIs with Python - + - **PostgreSQL with pgvector**: Database with vector search capabilities for similarity searches - **SQLAlchemy**: SQL toolkit and ORM (Object-Relational Mapping) for database interactions +- **Alembic**: A database migrations tool for SQLAlchemy. + - **FastAPI Users**: Authentication and user management with JWT and OAuth support + - **LangChain**: Framework for developing AI-powered applications - **GPT Integration**: Integration with LLM models through LiteLLM @@ -214,10 +233,8 @@ After filling in your SurfSense API key you should be able to use extension now. - **pgvector**: PostgreSQL extension for efficient vector similarity operations - **Chonkie**: Advanced document chunking and embedding library - -- Uses `AutoEmbeddings` for flexible embedding model selection - -- `LateChunker` for optimized document chunking based on embedding model's max sequence length + - Uses `AutoEmbeddings` for flexible embedding model selection + - `LateChunker` for optimized document chunking based on embedding model's max sequence length From dcf3bf02cdcdeed20103c9dac3bac1aa49717bb1 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Mon, 14 Apr 2025 19:32:00 -0700 Subject: [PATCH 09/47] refactor(connectors): streamline imports --- .../[search_space_id]/connectors/add/page.tsx | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx index 7329c44de..5eeaae5a8 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx @@ -1,32 +1,24 @@ "use client"; -import { cn } from "@/lib/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardFooter, CardHeader } from "@/components/ui/card"; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { - IconBrandGoogle, - IconBrandSlack, - IconBrandWindows, IconBrandDiscord, - IconSearch, - IconMessages, - IconDatabase, - IconCloud, IconBrandGithub, IconBrandNotion, - IconMail, + IconBrandSlack, + IconBrandWindows, IconBrandZoom, - IconChevronRight, - IconWorldWww, IconChevronDown, + IconChevronRight, + IconMail, + IconWorldWww, } from "@tabler/icons-react"; -import { motion, AnimatePresence } from "framer-motion"; -import { useState } from "react"; -import { useParams } from "next/navigation"; +import { AnimatePresence, motion } from "framer-motion"; import Link from "next/link"; -import { Button } from "@/components/ui/button"; -import { Separator } from "@/components/ui/separator"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import { Badge } from "@/components/ui/badge"; -import { Card, CardContent, CardFooter, CardHeader } from "@/components/ui/card"; -import { useForm } from "react-hook-form"; +import { useParams } from "next/navigation"; +import { useState } from "react"; // Define the Connector type interface Connector { From e34b444bfe08c888d5a19a59e0a2b4b9d3cb0bb6 Mon Sep 17 00:00:00 2001 From: Rohan Verma <122026167+MODSetter@users.noreply.github.com> Date: Mon, 14 Apr 2025 19:40:04 -0700 Subject: [PATCH 10/47] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 028ab03bd..4ebe65569 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,9 @@ You should see your Next.js frontend running at `localhost:3000` ![search_spaces](https://github.com/user-attachments/assets/e254c38c-f937-44b6-9e9d-770db583d099) +**Manage Documents** +![documents](https://github.com/user-attachments/assets/7001e306-eb06-4009-89c6-8fadfdc3fc4d) + **Research Agent** ![researcher](https://github.com/user-attachments/assets/fda3e61f-f936-4b66-b565-d84edde44a67) From e0eb9d4b8b337d78b859132a16ca700229c0dc11 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Tue, 15 Apr 2025 23:10:35 -0700 Subject: [PATCH 11/47] feat: Added Linear Connector --- README.md | 3 +- .../versions/2_add_linear_connector_enum.py | 45 ++ ...3_add_linear_connector_to_documenttype_.py | 71 +++ .../app/connectors/linear_connector.py | 454 ++++++++++++++++++ surfsense_backend/app/db.py | 2 + .../routes/search_source_connectors_routes.py | 77 ++- .../app/schemas/search_source_connector.py | 10 + .../app/tasks/connectors_indexing_tasks.py | 294 +++++++++++- .../tasks/stream_connector_search_results.py | 26 + .../app/utils/connector_service.py | 84 ++++ .../connectors/(manage)/page.tsx | 1 + .../connectors/add/linear-connector/page.tsx | 321 +++++++++++++ .../[search_space_id]/connectors/add/page.tsx | 24 +- .../documents/(manage)/page.tsx | 39 +- .../components/ModernHeroWithGradients.tsx | 2 +- .../components/chat/ConnectorComponents.tsx | 4 +- 16 files changed, 1419 insertions(+), 38 deletions(-) create mode 100644 surfsense_backend/alembic/versions/2_add_linear_connector_enum.py create mode 100644 surfsense_backend/alembic/versions/3_add_linear_connector_to_documenttype_.py create mode 100644 surfsense_backend/app/connectors/linear_connector.py create mode 100644 surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx diff --git a/README.md b/README.md index 4ebe65569..4b9ea5a64 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # SurfSense -While tools like NotebookLM and Perplexity are impressive and highly effective for conducting research on any topic/query, SurfSense elevates this capability by integrating with your personal knowledge base. It is a highly customizable AI research agent, connected to external sources such as search engines (Tavily), Slack, Notion, YouTube, GitHub and more to come. +While tools like NotebookLM and Perplexity are impressive and highly effective for conducting research on any topic/query, SurfSense elevates this capability by integrating with your personal knowledge base. It is a highly customizable AI research agent, connected to external sources such as search engines (Tavily), Slack, Linear, Notion, YouTube, GitHub and more to come. # Video @@ -44,6 +44,7 @@ Open source and easy to deploy locally. #### ℹ️ **External Sources** - Search Engines (Tavily) - Slack +- Linear - Notion - Youtube Videos - GitHub diff --git a/surfsense_backend/alembic/versions/2_add_linear_connector_enum.py b/surfsense_backend/alembic/versions/2_add_linear_connector_enum.py new file mode 100644 index 000000000..d3527d34a --- /dev/null +++ b/surfsense_backend/alembic/versions/2_add_linear_connector_enum.py @@ -0,0 +1,45 @@ +"""Add LINEAR_CONNECTOR to SearchSourceConnectorType enum + +Revision ID: 2 +Revises: e55302644c51 +Create Date: 2025-04-16 10:00:00.000000 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '2' +down_revision: Union[str, None] = 'e55302644c51' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + + # Manually add the command to add the enum value + op.execute("ALTER TYPE searchsourceconnectortype ADD VALUE 'LINEAR_CONNECTOR'") + + # Pass for the rest, as autogenerate didn't run to add other schema details + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + + # Downgrading removal of an enum value requires recreating the type + op.execute("ALTER TYPE searchsourceconnectortype RENAME TO searchsourceconnectortype_old") + op.execute("CREATE TYPE searchsourceconnectortype AS ENUM('SERPER_API', 'TAVILY_API', 'SLACK_CONNECTOR', 'NOTION_CONNECTOR', 'GITHUB_CONNECTOR')") + op.execute(( + "ALTER TABLE search_source_connectors ALTER COLUMN connector_type TYPE searchsourceconnectortype USING " + "connector_type::text::searchsourceconnectortype" + )) + op.execute("DROP TYPE searchsourceconnectortype_old") + + pass + # ### end Alembic commands ### \ No newline at end of file diff --git a/surfsense_backend/alembic/versions/3_add_linear_connector_to_documenttype_.py b/surfsense_backend/alembic/versions/3_add_linear_connector_to_documenttype_.py new file mode 100644 index 000000000..ab50d8550 --- /dev/null +++ b/surfsense_backend/alembic/versions/3_add_linear_connector_to_documenttype_.py @@ -0,0 +1,71 @@ +"""Add LINEAR_CONNECTOR to DocumentType enum + +Revision ID: 3 +Revises: 2 +Create Date: 2025-04-16 10:05:00.059921 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '3' +down_revision: Union[str, None] = '2' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +# Define the ENUM type name and the new value +ENUM_NAME = 'documenttype' # Make sure this matches the name in your DB (usually lowercase class name) +NEW_VALUE = 'LINEAR_CONNECTOR' + +def upgrade() -> None: + """Upgrade schema.""" + op.execute(f"ALTER TYPE {ENUM_NAME} ADD VALUE '{NEW_VALUE}'") + + +# Warning: This will delete all rows with the new value +def downgrade() -> None: + """Downgrade schema - remove LINEAR_CONNECTOR from enum.""" + + # The old type name + old_enum_name = f"{ENUM_NAME}_old" + + # Enum values *before* LINEAR_CONNECTOR was added + old_values = ( + 'EXTENSION', + 'CRAWLED_URL', + 'FILE', + 'SLACK_CONNECTOR', + 'NOTION_CONNECTOR', + 'YOUTUBE_VIDEO', + 'GITHUB_CONNECTOR' + ) + old_values_sql = ", ".join([f"'{v}'" for v in old_values]) + + # Table and column names (adjust if different) + table_name = 'documents' + column_name = 'document_type' + + # 1. Rename the current enum type + op.execute(f"ALTER TYPE {ENUM_NAME} RENAME TO {old_enum_name}") + + # 2. Create the new enum type with the old values + op.execute(f"CREATE TYPE {ENUM_NAME} AS ENUM({old_values_sql})") + + # 3. Update the table: + op.execute( + f"DELETE FROM {table_name} WHERE {column_name}::text = '{NEW_VALUE}'" + ) + + # 4. Alter the column to use the new enum type (casting old values) + op.execute( + f"ALTER TABLE {table_name} ALTER COLUMN {column_name} " + f"TYPE {ENUM_NAME} USING {column_name}::text::{ENUM_NAME}" + ) + + # 5. Drop the old enum type + op.execute(f"DROP TYPE {old_enum_name}") + # ### end Alembic commands ### \ No newline at end of file diff --git a/surfsense_backend/app/connectors/linear_connector.py b/surfsense_backend/app/connectors/linear_connector.py new file mode 100644 index 000000000..be9a1a49d --- /dev/null +++ b/surfsense_backend/app/connectors/linear_connector.py @@ -0,0 +1,454 @@ +""" +Linear Connector Module + +A module for retrieving issues and comments from Linear. +Allows fetching issue lists and their comments with date range filtering. +""" + +import requests +from datetime import datetime, timedelta +from typing import Dict, List, Optional, Tuple, Any, Union + + +class LinearConnector: + """Class for retrieving issues and comments from Linear.""" + + def __init__(self, token: str = None): + """ + Initialize the LinearConnector class. + + Args: + token: Linear API token (optional, can be set later with set_token) + """ + self.token = token + self.api_url = "https://api.linear.app/graphql" + + def set_token(self, token: str) -> None: + """ + Set the Linear API token. + + Args: + token: Linear API token + """ + self.token = token + + def get_headers(self) -> Dict[str, str]: + """ + Get headers for Linear API requests. + + Returns: + Dictionary of headers + + Raises: + ValueError: If no Linear token has been set + """ + if not self.token: + raise ValueError("Linear token not initialized. Call set_token() first.") + + return { + 'Content-Type': 'application/json', + 'Authorization': self.token + } + + def execute_graphql_query(self, query: str, variables: Dict[str, Any] = None) -> Dict[str, Any]: + """ + Execute a GraphQL query against the Linear API. + + Args: + query: GraphQL query string + variables: Variables for the GraphQL query (optional) + + Returns: + Response data from the API + + Raises: + ValueError: If no Linear token has been set + Exception: If the API request fails + """ + if not self.token: + raise ValueError("Linear token not initialized. Call set_token() first.") + + headers = self.get_headers() + payload = {'query': query} + + if variables: + payload['variables'] = variables + + response = requests.post( + self.api_url, + headers=headers, + json=payload + ) + + if response.status_code == 200: + return response.json() + else: + raise Exception(f"Query failed with status code {response.status_code}: {response.text}") + + def get_all_issues(self, include_comments: bool = True) -> List[Dict[str, Any]]: + """ + Fetch all issues from Linear. + + Args: + include_comments: Whether to include comments in the response + + Returns: + List of issue objects + + Raises: + ValueError: If no Linear token has been set + Exception: If the API request fails + """ + comments_query = "" + if include_comments: + comments_query = """ + comments { + nodes { + id + body + user { + id + name + email + } + createdAt + updatedAt + } + } + """ + + query = f""" + query {{ + issues {{ + nodes {{ + id + identifier + title + description + state {{ + id + name + type + }} + assignee {{ + id + name + email + }} + creator {{ + id + name + email + }} + createdAt + updatedAt + {comments_query} + }} + }} + }} + """ + + result = self.execute_graphql_query(query) + + # Extract issues from the response + if "data" in result and "issues" in result["data"] and "nodes" in result["data"]["issues"]: + return result["data"]["issues"]["nodes"] + + return [] + + def get_issues_by_date_range( + self, + start_date: str, + end_date: str, + include_comments: bool = True + ) -> Tuple[List[Dict[str, Any]], Optional[str]]: + """ + Fetch issues within a date range. + + Args: + start_date: Start date in YYYY-MM-DD format + end_date: End date in YYYY-MM-DD format (inclusive) + include_comments: Whether to include comments in the response + + Returns: + Tuple containing (issues list, error message or None) + """ + # Convert date strings to ISO format + try: + # For Linear API: we need to use a more specific format for the filter + # Instead of DateTime, use a string in the filter for DateTimeOrDuration + comments_query = "" + if include_comments: + comments_query = """ + comments { + nodes { + id + body + user { + id + name + email + } + createdAt + updatedAt + } + } + """ + + # Query issues that were either created OR updated within the date range + # This ensures we catch both new issues and updated existing issues + query = f""" + query IssuesByDateRange($after: String) {{ + issues( + first: 100, + after: $after, + filter: {{ + or: [ + {{ + createdAt: {{ + gte: "{start_date}T00:00:00Z" + lte: "{end_date}T23:59:59Z" + }} + }}, + {{ + updatedAt: {{ + gte: "{start_date}T00:00:00Z" + lte: "{end_date}T23:59:59Z" + }} + }} + ] + }} + ) {{ + nodes {{ + id + identifier + title + description + state {{ + id + name + type + }} + assignee {{ + id + name + email + }} + creator {{ + id + name + email + }} + createdAt + updatedAt + {comments_query} + }} + pageInfo {{ + hasNextPage + endCursor + }} + }} + }} + """ + + try: + all_issues = [] + has_next_page = True + cursor = None + + # Handle pagination to get all issues + while has_next_page: + variables = {"after": cursor} if cursor else {} + result = self.execute_graphql_query(query, variables) + + # Check for errors + if "errors" in result: + error_message = "; ".join([error.get("message", "Unknown error") for error in result["errors"]]) + return [], f"GraphQL errors: {error_message}" + + # Extract issues from the response + if "data" in result and "issues" in result["data"]: + issues_page = result["data"]["issues"] + + # Add issues from this page + if "nodes" in issues_page: + all_issues.extend(issues_page["nodes"]) + + # Check if there are more pages + if "pageInfo" in issues_page: + page_info = issues_page["pageInfo"] + has_next_page = page_info.get("hasNextPage", False) + cursor = page_info.get("endCursor") if has_next_page else None + else: + has_next_page = False + else: + has_next_page = False + + if not all_issues: + return [], "No issues found in the specified date range." + + return all_issues, None + + except Exception as e: + return [], f"Error fetching issues: {str(e)}" + + except ValueError as e: + return [], f"Invalid date format: {str(e)}. Please use YYYY-MM-DD." + + def format_issue(self, issue: Dict[str, Any]) -> Dict[str, Any]: + """ + Format an issue for easier consumption. + + Args: + issue: The issue object from Linear API + + Returns: + Formatted issue dictionary + """ + # Extract basic issue details + formatted = { + "id": issue.get("id", ""), + "identifier": issue.get("identifier", ""), + "title": issue.get("title", ""), + "description": issue.get("description", ""), + "state": issue.get("state", {}).get("name", "Unknown") if issue.get("state") else "Unknown", + "state_type": issue.get("state", {}).get("type", "Unknown") if issue.get("state") else "Unknown", + "created_at": issue.get("createdAt", ""), + "updated_at": issue.get("updatedAt", ""), + "creator": { + "id": issue.get("creator", {}).get("id", "") if issue.get("creator") else "", + "name": issue.get("creator", {}).get("name", "Unknown") if issue.get("creator") else "Unknown", + "email": issue.get("creator", {}).get("email", "") if issue.get("creator") else "" + } if issue.get("creator") else {"id": "", "name": "Unknown", "email": ""}, + "assignee": { + "id": issue.get("assignee", {}).get("id", ""), + "name": issue.get("assignee", {}).get("name", "Unknown"), + "email": issue.get("assignee", {}).get("email", "") + } if issue.get("assignee") else None, + "comments": [] + } + + # Extract comments if available + if "comments" in issue and "nodes" in issue["comments"]: + for comment in issue["comments"]["nodes"]: + formatted_comment = { + "id": comment.get("id", ""), + "body": comment.get("body", ""), + "created_at": comment.get("createdAt", ""), + "updated_at": comment.get("updatedAt", ""), + "user": { + "id": comment.get("user", {}).get("id", "") if comment.get("user") else "", + "name": comment.get("user", {}).get("name", "Unknown") if comment.get("user") else "Unknown", + "email": comment.get("user", {}).get("email", "") if comment.get("user") else "" + } if comment.get("user") else {"id": "", "name": "Unknown", "email": ""} + } + formatted["comments"].append(formatted_comment) + + return formatted + + def format_issue_to_markdown(self, issue: Dict[str, Any]) -> str: + """ + Convert an issue to markdown format. + + Args: + issue: The issue object (either raw or formatted) + + Returns: + Markdown string representation of the issue + """ + # Format the issue if it's not already formatted + if "identifier" not in issue: + issue = self.format_issue(issue) + + # Build the markdown content + markdown = f"# {issue.get('identifier', 'No ID')}: {issue.get('title', 'No Title')}\n\n" + + if issue.get('state'): + markdown += f"**Status:** {issue['state']}\n\n" + + if issue.get('assignee') and issue['assignee'].get('name'): + markdown += f"**Assignee:** {issue['assignee']['name']}\n" + + if issue.get('creator') and issue['creator'].get('name'): + markdown += f"**Created by:** {issue['creator']['name']}\n" + + if issue.get('created_at'): + created_date = self.format_date(issue['created_at']) + markdown += f"**Created:** {created_date}\n" + + if issue.get('updated_at'): + updated_date = self.format_date(issue['updated_at']) + markdown += f"**Updated:** {updated_date}\n\n" + + if issue.get('description'): + markdown += f"## Description\n\n{issue['description']}\n\n" + + if issue.get('comments'): + markdown += f"## Comments ({len(issue['comments'])})\n\n" + + for comment in issue['comments']: + user_name = "Unknown" + if comment.get('user') and comment['user'].get('name'): + user_name = comment['user']['name'] + + comment_date = "Unknown date" + if comment.get('created_at'): + comment_date = self.format_date(comment['created_at']) + + markdown += f"### {user_name} ({comment_date})\n\n{comment.get('body', '')}\n\n---\n\n" + + return markdown + + @staticmethod + def format_date(iso_date: str) -> str: + """ + Format an ISO date string to a more readable format. + + Args: + iso_date: ISO format date string + + Returns: + Formatted date string + """ + if not iso_date or not isinstance(iso_date, str): + return "Unknown date" + + try: + dt = datetime.fromisoformat(iso_date.replace('Z', '+00:00')) + return dt.strftime('%Y-%m-%d %H:%M:%S') + except ValueError: + return iso_date + + +# Example usage (uncomment to use): +""" +if __name__ == "__main__": + # Set your token here + token = "YOUR_LINEAR_API_KEY" + + linear = LinearConnector(token) + + try: + # Get all issues with comments + issues = linear.get_all_issues() + print(f"Retrieved {len(issues)} issues") + + # Format and print the first issue as markdown + if issues: + issue_md = linear.format_issue_to_markdown(issues[0]) + print("\nSample Issue in Markdown:\n") + print(issue_md) + + # Get issues by date range + start_date = "2023-01-01" + end_date = "2023-01-31" + date_issues, error = linear.get_issues_by_date_range(start_date, end_date) + + if error: + print(f"Error: {error}") + else: + print(f"\nRetrieved {len(date_issues)} issues from {start_date} to {end_date}") + + except Exception as e: + print(f"Error: {e}") +""" diff --git a/surfsense_backend/app/db.py b/surfsense_backend/app/db.py index 25b7bfbb4..4426f4ffa 100644 --- a/surfsense_backend/app/db.py +++ b/surfsense_backend/app/db.py @@ -41,6 +41,7 @@ class DocumentType(str, Enum): NOTION_CONNECTOR = "NOTION_CONNECTOR" YOUTUBE_VIDEO = "YOUTUBE_VIDEO" GITHUB_CONNECTOR = "GITHUB_CONNECTOR" + LINEAR_CONNECTOR = "LINEAR_CONNECTOR" class SearchSourceConnectorType(str, Enum): SERPER_API = "SERPER_API" @@ -48,6 +49,7 @@ class SearchSourceConnectorType(str, Enum): SLACK_CONNECTOR = "SLACK_CONNECTOR" NOTION_CONNECTOR = "NOTION_CONNECTOR" GITHUB_CONNECTOR = "GITHUB_CONNECTOR" + LINEAR_CONNECTOR = "LINEAR_CONNECTOR" class ChatType(str, Enum): GENERAL = "GENERAL" diff --git a/surfsense_backend/app/routes/search_source_connectors_routes.py b/surfsense_backend/app/routes/search_source_connectors_routes.py index 482a8259d..8a003ff55 100644 --- a/surfsense_backend/app/routes/search_source_connectors_routes.py +++ b/surfsense_backend/app/routes/search_source_connectors_routes.py @@ -7,7 +7,7 @@ PUT /search-source-connectors/{connector_id} - Update a specific connector DELETE /search-source-connectors/{connector_id} - Delete a specific connector POST /search-source-connectors/{connector_id}/index - Index content from a connector to a search space -Note: Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR, NOTION_CONNECTOR). +Note: Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR, NOTION_CONNECTOR, GITHUB_CONNECTOR, LINEAR_CONNECTOR). """ from fastapi import APIRouter, Depends, HTTPException, Query, BackgroundTasks from sqlalchemy.ext.asyncio import AsyncSession @@ -19,8 +19,8 @@ from app.schemas import SearchSourceConnectorCreate, SearchSourceConnectorUpdate from app.users import current_active_user from app.utils.check_ownership import check_ownership from pydantic import ValidationError -from app.tasks.connectors_indexing_tasks import index_slack_messages, index_notion_pages, index_github_repos -from datetime import datetime, timezone +from app.tasks.connectors_indexing_tasks import index_slack_messages, index_notion_pages, index_github_repos, index_linear_issues +from datetime import datetime, timezone, timedelta import logging # Set up logging @@ -37,7 +37,7 @@ async def create_search_source_connector( """ Create a new search source connector. - Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR). + Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR, etc.). The config must contain the appropriate keys for the connector type. """ try: @@ -131,7 +131,7 @@ async def update_search_source_connector( """ Update a search source connector. - Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR). + Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR, etc.). The config must contain the appropriate keys for the connector type. """ try: @@ -216,10 +216,10 @@ async def index_connector_content( Index content from a connector to a search space. Currently supports: - - SLACK_CONNECTOR: Indexes messages from all accessible Slack channels since the last indexing - (or the last 365 days if never indexed before) - - NOTION_CONNECTOR: Indexes pages from all accessible Notion pages since the last indexing - (or the last 365 days if never indexed before) + - SLACK_CONNECTOR: Indexes messages from all accessible Slack channels + - NOTION_CONNECTOR: Indexes pages from all accessible Notion pages + - GITHUB_CONNECTOR: Indexes code and documentation from GitHub repositories + - LINEAR_CONNECTOR: Indexes issues and comments from Linear Args: connector_id: ID of the connector to use @@ -251,7 +251,7 @@ async def index_connector_content( today = datetime.now().date() if connector.last_indexed_at.date() == today: # If last indexed today, go back 1 day to ensure we don't miss anything - start_date = (today - datetime.timedelta(days=1)).strftime("%Y-%m-%d") + start_date = (today - timedelta(days=1)).strftime("%Y-%m-%d") else: start_date = connector.last_indexed_at.strftime("%Y-%m-%d") @@ -272,7 +272,7 @@ async def index_connector_content( today = datetime.now().date() if connector.last_indexed_at.date() == today: # If last indexed today, go back 1 day to ensure we don't miss anything - start_date = (today - datetime.timedelta(days=1)).strftime("%Y-%m-%d") + start_date = (today - timedelta(days=1)).strftime("%Y-%m-%d") else: start_date = connector.last_indexed_at.strftime("%Y-%m-%d") @@ -294,6 +294,27 @@ async def index_connector_content( logger.info(f"Triggering GitHub indexing for connector {connector_id} into search space {search_space_id}") background_tasks.add_task(run_github_indexing_with_new_session, connector_id, search_space_id) response_message = "GitHub indexing started in the background." + + elif connector.connector_type == SearchSourceConnectorType.LINEAR_CONNECTOR: + # Determine the time range that will be indexed + if not connector.last_indexed_at: + start_date = "365 days ago" + else: + # Check if last_indexed_at is today + today = datetime.now().date() + if connector.last_indexed_at.date() == today: + # If last indexed today, go back 1 day to ensure we don't miss anything + start_date = (today - timedelta(days=1)).strftime("%Y-%m-%d") + else: + start_date = connector.last_indexed_at.strftime("%Y-%m-%d") + + indexing_from = start_date + indexing_to = today_str + + # Run indexing in background + logger.info(f"Triggering Linear indexing for connector {connector_id} into search space {search_space_id}") + background_tasks.add_task(run_linear_indexing_with_new_session, connector_id, search_space_id) + response_message = "Linear indexing started in the background." else: raise HTTPException( @@ -460,3 +481,37 @@ async def run_github_indexing( await session.rollback() logger.error(f"Critical error in run_github_indexing for connector {connector_id}: {e}", exc_info=True) # Optionally update status in DB to indicate failure + +# Add new helper functions for Linear indexing +async def run_linear_indexing_with_new_session( + connector_id: int, + search_space_id: int +): + """Wrapper to run Linear indexing with its own database session.""" + logger.info(f"Background task started: Indexing Linear connector {connector_id} into space {search_space_id}") + async with async_session_maker() as session: + await run_linear_indexing(session, connector_id, search_space_id) + logger.info(f"Background task finished: Indexing Linear connector {connector_id}") + +async def run_linear_indexing( + session: AsyncSession, + connector_id: int, + search_space_id: int +): + """Runs the Linear indexing task and updates the timestamp.""" + try: + indexed_count, error_message = await index_linear_issues( + session, connector_id, search_space_id, update_last_indexed=False + ) + if error_message: + logger.error(f"Linear indexing failed for connector {connector_id}: {error_message}") + # Optionally update status in DB to indicate failure + else: + logger.info(f"Linear indexing successful for connector {connector_id}. Indexed {indexed_count} documents.") + # Update the last indexed timestamp only on success + await update_connector_last_indexed(session, connector_id) + await session.commit() # Commit timestamp update + except Exception as e: + await session.rollback() + logger.error(f"Critical error in run_linear_indexing for connector {connector_id}: {e}", exc_info=True) + # Optionally update status in DB to indicate failure diff --git a/surfsense_backend/app/schemas/search_source_connector.py b/surfsense_backend/app/schemas/search_source_connector.py index 41e1086e7..032e48698 100644 --- a/surfsense_backend/app/schemas/search_source_connector.py +++ b/surfsense_backend/app/schemas/search_source_connector.py @@ -67,6 +67,16 @@ class SearchSourceConnectorBase(BaseModel): # Ensure the token is not empty if not config.get("GITHUB_PAT"): raise ValueError("GITHUB_PAT cannot be empty") + + elif connector_type == SearchSourceConnectorType.LINEAR_CONNECTOR: + # For LINEAR_CONNECTOR, only allow LINEAR_API_KEY + allowed_keys = ["LINEAR_API_KEY"] + if set(config.keys()) != set(allowed_keys): + raise ValueError(f"For LINEAR_CONNECTOR connector type, config must only contain these keys: {allowed_keys}") + + # Ensure the token is not empty + if not config.get("LINEAR_API_KEY"): + raise ValueError("LINEAR_API_KEY cannot be empty") return config diff --git a/surfsense_backend/app/tasks/connectors_indexing_tasks.py b/surfsense_backend/app/tasks/connectors_indexing_tasks.py index 670fa26ad..dbdb24c80 100644 --- a/surfsense_backend/app/tasks/connectors_indexing_tasks.py +++ b/surfsense_backend/app/tasks/connectors_indexing_tasks.py @@ -10,6 +10,7 @@ from app.prompts import SUMMARY_PROMPT_TEMPLATE from app.connectors.slack_history import SlackHistory from app.connectors.notion_history import NotionHistoryConnector from app.connectors.github_connector import GitHubConnector +from app.connectors.linear_connector import LinearConnector from slack_sdk.errors import SlackApiError import logging @@ -60,8 +61,20 @@ async def index_slack_messages( end_date = datetime.now() # Use last_indexed_at as start date if available, otherwise use 365 days ago - - start_date = end_date - timedelta(days=365) + if connector.last_indexed_at: + # Convert dates to be comparable (both timezone-naive) + last_indexed_naive = connector.last_indexed_at.replace(tzinfo=None) if connector.last_indexed_at.tzinfo else connector.last_indexed_at + + # Check if last_indexed_at is in the future or after end_date + if last_indexed_naive > end_date: + logger.warning(f"Last indexed date ({last_indexed_naive.strftime('%Y-%m-%d')}) is in the future. Using 30 days ago instead.") + start_date = end_date - timedelta(days=30) + else: + start_date = last_indexed_naive + logger.info(f"Using last_indexed_at ({start_date.strftime('%Y-%m-%d')}) as start date") + else: + start_date = end_date - timedelta(days=30) # Use 30 days instead of 365 to catch recent issues + logger.info(f"No last_indexed_at found, using {start_date.strftime('%Y-%m-%d')} (30 days ago) as start date") # Format dates for Slack API start_date_str = start_date.strftime("%Y-%m-%d") @@ -782,3 +795,280 @@ async def index_github_repos( error_message = "; ".join(errors) if errors else None return documents_processed, error_message + +async def index_linear_issues( + session: AsyncSession, + connector_id: int, + search_space_id: int, + update_last_indexed: bool = True +) -> Tuple[int, Optional[str]]: + """ + Index Linear issues and comments. + + Args: + session: Database session + connector_id: ID of the Linear connector + search_space_id: ID of the search space to store documents in + update_last_indexed: Whether to update the last_indexed_at timestamp (default: True) + + Returns: + Tuple containing (number of documents indexed, error message or None) + """ + try: + # Get the connector + result = await session.execute( + select(SearchSourceConnector) + .filter( + SearchSourceConnector.id == connector_id, + SearchSourceConnector.connector_type == SearchSourceConnectorType.LINEAR_CONNECTOR + ) + ) + connector = result.scalars().first() + + if not connector: + return 0, f"Connector with ID {connector_id} not found or is not a Linear connector" + + # Get the Linear token from the connector config + linear_token = connector.config.get("LINEAR_API_KEY") + if not linear_token: + return 0, "Linear API token not found in connector config" + + # Initialize Linear client + linear_client = LinearConnector(token=linear_token) + + # Calculate date range + end_date = datetime.now() + + # Use last_indexed_at as start date if available, otherwise use 365 days ago + if connector.last_indexed_at: + # Convert dates to be comparable (both timezone-naive) + last_indexed_naive = connector.last_indexed_at.replace(tzinfo=None) if connector.last_indexed_at.tzinfo else connector.last_indexed_at + + # Check if last_indexed_at is in the future or after end_date + if last_indexed_naive > end_date: + logger.warning(f"Last indexed date ({last_indexed_naive.strftime('%Y-%m-%d')}) is in the future. Using 30 days ago instead.") + start_date = end_date - timedelta(days=30) + else: + start_date = last_indexed_naive + logger.info(f"Using last_indexed_at ({start_date.strftime('%Y-%m-%d')}) as start date") + else: + start_date = end_date - timedelta(days=30) # Use 30 days instead of 365 to catch recent issues + logger.info(f"No last_indexed_at found, using {start_date.strftime('%Y-%m-%d')} (30 days ago) as start date") + + # Format dates for Linear API + start_date_str = start_date.strftime("%Y-%m-%d") + end_date_str = end_date.strftime("%Y-%m-%d") + + logger.info(f"Fetching Linear issues from {start_date_str} to {end_date_str}") + + # Get issues within date range + try: + issues, error = linear_client.get_issues_by_date_range( + start_date=start_date_str, + end_date=end_date_str, + include_comments=True + ) + + if error: + logger.error(f"Failed to get Linear issues: {error}") + + # Don't treat "No issues found" as an error that should stop indexing + if "No issues found" in error: + logger.info("No issues found is not a critical error, continuing with update") + if update_last_indexed: + connector.last_indexed_at = datetime.now() + await session.commit() + logger.info(f"Updated last_indexed_at to {connector.last_indexed_at} despite no issues found") + return 0, None + else: + return 0, f"Failed to get Linear issues: {error}" + + logger.info(f"Retrieved {len(issues)} issues from Linear API") + + except Exception as e: + logger.error(f"Exception when calling Linear API: {str(e)}", exc_info=True) + return 0, f"Failed to get Linear issues: {str(e)}" + + if not issues: + logger.info("No Linear issues found for the specified date range") + if update_last_indexed: + connector.last_indexed_at = datetime.now() + await session.commit() + logger.info(f"Updated last_indexed_at to {connector.last_indexed_at} despite no issues found") + return 0, None # Return None instead of error message when no issues found + + # Log issue IDs and titles for debugging + logger.info("Issues retrieved from Linear API:") + for idx, issue in enumerate(issues[:10]): # Log first 10 issues + logger.info(f" {idx+1}. {issue.get('identifier', 'Unknown')} - {issue.get('title', 'Unknown')} - Created: {issue.get('createdAt', 'Unknown')} - Updated: {issue.get('updatedAt', 'Unknown')}") + if len(issues) > 10: + logger.info(f" ...and {len(issues) - 10} more issues") + + # Get existing documents for this search space and connector type to prevent duplicates + existing_docs_result = await session.execute( + select(Document) + .filter( + Document.search_space_id == search_space_id, + Document.document_type == DocumentType.LINEAR_CONNECTOR + ) + ) + existing_docs = existing_docs_result.scalars().all() + + # Create a lookup dictionary of existing documents by issue_id + existing_docs_by_issue_id = {} + for doc in existing_docs: + if "issue_id" in doc.document_metadata: + existing_docs_by_issue_id[doc.document_metadata["issue_id"]] = doc + + logger.info(f"Found {len(existing_docs_by_issue_id)} existing Linear documents in database") + + # Log existing document IDs for debugging + if existing_docs_by_issue_id: + logger.info("Existing Linear document issue IDs in database:") + for idx, (issue_id, doc) in enumerate(list(existing_docs_by_issue_id.items())[:10]): # Log first 10 + logger.info(f" {idx+1}. {issue_id} - {doc.document_metadata.get('issue_identifier', 'Unknown')} - {doc.document_metadata.get('issue_title', 'Unknown')}") + if len(existing_docs_by_issue_id) > 10: + logger.info(f" ...and {len(existing_docs_by_issue_id) - 10} more existing documents") + + # Track the number of documents indexed + documents_indexed = 0 + documents_updated = 0 + documents_skipped = 0 + skipped_issues = [] + + # Process each issue + for issue in issues: + try: + issue_id = issue.get("id") + issue_identifier = issue.get("identifier", "") + issue_title = issue.get("title", "") + + if not issue_id or not issue_title: + logger.warning(f"Skipping issue with missing ID or title: {issue_id or 'Unknown'}") + skipped_issues.append(f"{issue_identifier or 'Unknown'} (missing data)") + documents_skipped += 1 + continue + + # Format the issue first to get well-structured data + formatted_issue = linear_client.format_issue(issue) + + # Convert issue to markdown format + issue_content = linear_client.format_issue_to_markdown(formatted_issue) + + if not issue_content: + logger.warning(f"Skipping issue with no content: {issue_identifier} - {issue_title}") + skipped_issues.append(f"{issue_identifier} (no content)") + documents_skipped += 1 + continue + + # Create a short summary for the embedding + # This avoids using the LLM and just uses the issue data directly + state = formatted_issue.get("state", "Unknown") + description = formatted_issue.get("description", "") + # Truncate description if it's too long for the summary + if description and len(description) > 500: + description = description[:497] + "..." + + # Create a simple summary from the issue data + summary_content = f"Linear Issue {issue_identifier}: {issue_title}\n\nStatus: {state}\n\n" + if description: + summary_content += f"Description: {description}\n\n" + + # Add comment count + comment_count = len(formatted_issue.get("comments", [])) + summary_content += f"Comments: {comment_count}" + + # Generate embedding for the summary + summary_embedding = config.embedding_model_instance.embed(summary_content) + + # Process chunks - using the full issue content with comments + chunks = [ + Chunk(content=chunk.text, embedding=chunk.embedding) + for chunk in config.chunker_instance.chunk(issue_content) + ] + + # Check if this issue already exists in our database + existing_document = existing_docs_by_issue_id.get(issue_id) + + if existing_document: + # Update existing document instead of creating a new one + logger.info(f"Updating existing document for issue {issue_identifier} - {issue_title}") + + # Update document fields + existing_document.title = f"Linear - {issue_identifier}: {issue_title}" + existing_document.document_metadata = { + "issue_id": issue_id, + "issue_identifier": issue_identifier, + "issue_title": issue_title, + "state": state, + "comment_count": comment_count, + "indexed_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "last_updated": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + existing_document.content = summary_content + existing_document.embedding = summary_embedding + + # Delete existing chunks and add new ones + await session.execute( + delete(Chunk) + .where(Chunk.document_id == existing_document.id) + ) + + # Assign new chunks to existing document + for chunk in chunks: + chunk.document_id = existing_document.id + session.add(chunk) + + documents_updated += 1 + else: + # Create and store new document + logger.info(f"Creating new document for issue {issue_identifier} - {issue_title}") + document = Document( + search_space_id=search_space_id, + title=f"Linear - {issue_identifier}: {issue_title}", + document_type=DocumentType.LINEAR_CONNECTOR, + document_metadata={ + "issue_id": issue_id, + "issue_identifier": issue_identifier, + "issue_title": issue_title, + "state": state, + "comment_count": comment_count, + "indexed_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + }, + content=summary_content, + embedding=summary_embedding, + chunks=chunks + ) + + session.add(document) + documents_indexed += 1 + logger.info(f"Successfully indexed new issue {issue_identifier} - {issue_title}") + + except Exception as e: + logger.error(f"Error processing issue {issue.get('identifier', 'Unknown')}: {str(e)}", exc_info=True) + skipped_issues.append(f"{issue.get('identifier', 'Unknown')} (processing error)") + documents_skipped += 1 + continue # Skip this issue and continue with others + + # Update the last_indexed_at timestamp for the connector only if requested + total_processed = documents_indexed + documents_updated + if update_last_indexed: + connector.last_indexed_at = datetime.now() + logger.info(f"Updated last_indexed_at to {connector.last_indexed_at}") + + # Commit all changes + await session.commit() + logger.info(f"Successfully committed all Linear document changes to database") + + + logger.info(f"Linear indexing completed: {documents_indexed} new issues, {documents_updated} updated, {documents_skipped} skipped") + return total_processed, None # Return None as the error message to indicate success + + except SQLAlchemyError as db_error: + await session.rollback() + logger.error(f"Database error: {str(db_error)}", exc_info=True) + return 0, f"Database error: {str(db_error)}" + except Exception as e: + await session.rollback() + logger.error(f"Failed to index Linear issues: {str(e)}", exc_info=True) + return 0, f"Failed to index Linear issues: {str(e)}" diff --git a/surfsense_backend/app/tasks/stream_connector_search_results.py b/surfsense_backend/app/tasks/stream_connector_search_results.py index fbefaedb7..a1dc0a3e2 100644 --- a/surfsense_backend/app/tasks/stream_connector_search_results.py +++ b/surfsense_backend/app/tasks/stream_connector_search_results.py @@ -270,6 +270,32 @@ async def stream_connector_search_results( # Add documents to collection all_raw_documents.extend(github_chunks) + # Linear Connector + if connector == "LINEAR_CONNECTOR": + # Send terminal message about starting search + yield streaming_service.add_terminal_message("Starting to search for Linear issues...") + + # Search using Linear API with reformulated query + result_object, linear_chunks = await connector_service.search_linear( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=TOP_K + ) + + # Send terminal message about search results + yield streaming_service.add_terminal_message( + f"Found {len(result_object['sources'])} relevant results from Linear", + "success" + ) + + # Update sources + all_sources.append(result_object) + yield streaming_service.update_sources(all_sources) + + # Add documents to collection + all_raw_documents.extend(linear_chunks) + diff --git a/surfsense_backend/app/utils/connector_service.py b/surfsense_backend/app/utils/connector_service.py index fe08572a2..9a6e13c43 100644 --- a/surfsense_backend/app/utils/connector_service.py +++ b/surfsense_backend/app/utils/connector_service.py @@ -559,3 +559,87 @@ class ConnectorService: } return result_object, github_chunks + + async def search_linear(self, user_query: str, user_id: str, search_space_id: int, top_k: int = 20) -> tuple: + """ + Search for Linear issues and comments and return both the source information and langchain documents + + Args: + user_query: The user's query + user_id: The user's ID + search_space_id: The search space ID to search in + top_k: Maximum number of results to return + + Returns: + tuple: (sources_info, langchain_documents) + """ + linear_chunks = await self.retriever.hybrid_search( + query_text=user_query, + top_k=top_k, + user_id=user_id, + search_space_id=search_space_id, + document_type="LINEAR_CONNECTOR" + ) + + # Process each chunk and create sources directly without deduplication + sources_list = [] + for i, chunk in enumerate(linear_chunks): + # Fix for UI + linear_chunks[i]['document']['id'] = self.source_id_counter + + # Extract document metadata + document = chunk.get('document', {}) + metadata = document.get('metadata', {}) + + # Extract Linear-specific metadata + issue_identifier = metadata.get('issue_identifier', '') + issue_title = metadata.get('issue_title', 'Untitled Issue') + issue_state = metadata.get('state', '') + comment_count = metadata.get('comment_count', 0) + + # Create a more descriptive title for Linear issues + title = f"Linear: {issue_identifier} - {issue_title}" + if issue_state: + title += f" ({issue_state})" + + # Create a more descriptive description for Linear issues + description = chunk.get('content', '')[:100] + if len(description) == 100: + description += "..." + + # Add comment count info to description + if comment_count: + if description: + description += f" | Comments: {comment_count}" + else: + description = f"Comments: {comment_count}" + + # For URL, we could construct a URL to the Linear issue if we have the workspace info + # For now, use a generic placeholder + url = "" + if issue_identifier: + # This is a generic format, may need to be adjusted based on actual Linear workspace + url = f"https://linear.app/issue/{issue_identifier}" + + source = { + "id": self.source_id_counter, + "title": title, + "description": description, + "url": url, + "issue_identifier": issue_identifier, + "state": issue_state, + "comment_count": comment_count + } + + self.source_id_counter += 1 + sources_list.append(source) + + # Create result object + result_object = { + "id": 9, # Assign a unique ID for the Linear connector + "name": "Linear Issues", + "type": "LINEAR_CONNECTOR", + "sources": sources_list, + } + + return result_object, linear_chunks diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx index 817ca584d..8bfec6326 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx @@ -45,6 +45,7 @@ const getConnectorTypeDisplay = (type: string): string => { "SLACK_CONNECTOR": "Slack", "NOTION_CONNECTOR": "Notion", "GITHUB_CONNECTOR": "GitHub", + "LINEAR_CONNECTOR": "Linear", // Add other connector types here as needed }; return typeMap[type] || type; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx new file mode 100644 index 000000000..a594ed31e --- /dev/null +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx @@ -0,0 +1,321 @@ +"use client"; + +import { useState } from "react"; +import { useRouter, useParams } from "next/navigation"; +import { motion } from "framer-motion"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import * as z from "zod"; +import { toast } from "sonner"; +import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; + +import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + Alert, + AlertDescription, + AlertTitle, +} from "@/components/ui/alert"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; + +// Define the form schema with Zod +const linearConnectorFormSchema = z.object({ + name: z.string().min(3, { + message: "Connector name must be at least 3 characters.", + }), + api_key: z.string().min(10, { + message: "Linear API Key is required and must be valid.", + }).regex(/^lin_api_/, { + message: "Linear API Key should start with 'lin_api_'", + }), +}); + +// Define the type for the form values +type LinearConnectorFormValues = z.infer; + +export default function LinearConnectorPage() { + const router = useRouter(); + const params = useParams(); + const searchSpaceId = params.search_space_id as string; + const [isSubmitting, setIsSubmitting] = useState(false); + const { createConnector } = useSearchSourceConnectors(); + + // Initialize the form + const form = useForm({ + resolver: zodResolver(linearConnectorFormSchema), + defaultValues: { + name: "Linear Connector", + api_key: "", + }, + }); + + // Handle form submission + const onSubmit = async (values: LinearConnectorFormValues) => { + setIsSubmitting(true); + try { + await createConnector({ + name: values.name, + connector_type: "LINEAR_CONNECTOR", + config: { + LINEAR_API_KEY: values.api_key, + }, + is_indexable: true, + last_indexed_at: null, + }); + + toast.success("Linear connector created successfully!"); + + // Navigate back to connectors page + router.push(`/dashboard/${searchSpaceId}/connectors`); + } catch (error) { + console.error("Error creating connector:", error); + toast.error(error instanceof Error ? error.message : "Failed to create connector"); + } finally { + setIsSubmitting(false); + } + }; + + return ( +
+ + + + + + Connect + Documentation + + + + + + Connect Linear Workspace + + Integrate with Linear to search and retrieve information from your issues and comments. This connector can index your Linear content for search. + + + + + + Linear API Key Required + + You'll need a Linear API Key to use this connector. You can create a Linear API key from{" "} + + Linear API Settings + + + + +
+ + ( + + Connector Name + + + + + A friendly name to identify this connector. + + + + )} + /> + + ( + + Linear API Key + + + + + Your Linear API Key will be encrypted and stored securely. It typically starts with "lin_api_". + + + + )} + /> + +
+ +
+ + +
+ +

What you get with Linear integration:

+
    +
  • Search through all your Linear issues and comments
  • +
  • Access issue titles, descriptions, and full discussion threads
  • +
  • Connect your team's project management directly to your search space
  • +
  • Keep your search results up-to-date with latest Linear content
  • +
  • Index your Linear issues for enhanced search capabilities
  • +
+
+
+
+ + + + + Linear Connector Documentation + + Learn how to set up and use the Linear connector to index your project management data. + + + +
+

How it works

+

+ The Linear connector uses the Linear GraphQL API to fetch all issues and comments that the API key has access to within a workspace. +

+
    +
  • For follow up indexing runs, the connector retrieves issues and comments that have been updated since the last indexing attempt.
  • +
  • Indexing is configured to run periodically, so updates should appear in your search results within minutes.
  • +
+
+ + + + Authorization + + + + Read-Only Access is Sufficient + + You only need a read-only API key for this connector to work. This limits the permissions to just reading your Linear data. + + + +
+
+

Step 1: Create an API key

+
    +
  1. Log in to your Linear account
  2. +
  3. Navigate to https://linear.app/settings/api in your browser.
  4. +
  5. Alternatively, click on your profile picture → Settings → API
  6. +
  7. Click the + New API key button.
  8. +
  9. Enter a description for your key (like "Search Connector").
  10. +
  11. Select "Read-only" as the permission.
  12. +
  13. Click Create to generate the API key.
  14. +
  15. Copy the generated API key that starts with 'lin_api_' as it will only be shown once.
  16. +
+
+ +
+

Step 2: Grant necessary access

+

+ The API key will have access to all issues and comments that your user account can see. If you're creating the key as an admin, it will have access to all issues in the workspace. +

+ + + Data Privacy + + Only issues and comments will be indexed. Linear attachments and linked files are not indexed by this connector. + + +
+
+
+
+ + + Indexing + +
    +
  1. Navigate to the Connector Dashboard and select the Linear Connector.
  2. +
  3. Place the API Key in the form field.
  4. +
  5. Click Connect to establish the connection.
  6. +
  7. Once connected, your Linear issues will be indexed automatically.
  8. +
+ + + + What Gets Indexed + +

The Linear connector indexes the following data:

+
    +
  • Issue titles and identifiers (e.g., PROJ-123)
  • +
  • Issue descriptions
  • +
  • Issue comments
  • +
  • Issue status and metadata
  • +
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx index 5eeaae5a8..1f7490270 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/page.tsx @@ -14,6 +14,8 @@ import { IconChevronRight, IconMail, IconWorldWww, + IconTicket, + IconLayoutKanban, } from "@tabler/icons-react"; import { AnimatePresence, motion } from "framer-motion"; import Link from "next/link"; @@ -78,6 +80,26 @@ const connectorCategories: ConnectorCategory[] = [ }, ], }, + { + id: "project-management", + title: "Project Management", + connectors: [ + { + id: "linear-connector", + title: "Linear", + description: "Connect to Linear to search issues, comments and project data.", + icon: , + status: "available", + }, + { + id: "jira-connector", + title: "Jira", + description: "Connect to Jira to search issues, tickets and project data.", + icon: , + status: "coming-soon", + }, + ], + }, { id: "knowledge-bases", title: "Knowledge Bases", @@ -161,7 +183,7 @@ const cardVariants = { export default function ConnectorsPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; - const [expandedCategories, setExpandedCategories] = useState(["search-engines", "knowledge-bases"]); + const [expandedCategories, setExpandedCategories] = useState(["search-engines", "knowledge-bases", "project-management"]); const toggleCategory = (categoryId: string) => { setExpandedCategories(prev => diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx index 18b43579b..b7b4bf3ff 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx @@ -1,6 +1,7 @@ "use client"; -import { cn } from "@/lib/utils"; +import { DocumentViewer } from "@/components/document-viewer"; +import { JsonMetadataViewer } from "@/components/json-metadata-viewer"; import { AlertDialog, AlertDialogAction, @@ -12,7 +13,6 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; -import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { @@ -43,6 +43,9 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; +import { useDocuments } from "@/hooks/use-documents"; +import { cn } from "@/lib/utils"; +import { IconBrandGithub, IconBrandNotion, IconBrandSlack, IconBrandYoutube, IconLayoutKanban } from "@tabler/icons-react"; import { ColumnDef, ColumnFiltersState, @@ -59,6 +62,7 @@ import { getSortedRowModel, useReactTable, } from "@tanstack/react-table"; +import { AnimatePresence, motion } from "framer-motion"; import { AlertCircle, ChevronDown, @@ -70,31 +74,22 @@ import { CircleAlert, CircleX, Columns3, - Filter, - ListFilter, - Plus, - FileText, - Globe, - MessageSquare, - FileX, File, - Trash, + FileX, + Filter, + Globe, + ListFilter, MoreHorizontal, - Webhook, + Trash, + Webhook } from "lucide-react"; -import { useEffect, useId, useMemo, useRef, useState, useContext } from "react"; -import { motion, AnimatePresence } from "framer-motion"; import { useParams } from "next/navigation"; -import { useDocuments } from "@/hooks/use-documents"; -import React from "react"; -import { toast } from "sonner"; +import React, { useContext, useEffect, useId, useMemo, useRef, useState } from "react"; import ReactMarkdown from "react-markdown"; import rehypeRaw from "rehype-raw"; import rehypeSanitize from "rehype-sanitize"; import remarkGfm from "remark-gfm"; -import { DocumentViewer } from "@/components/document-viewer"; -import { JsonMetadataViewer } from "@/components/json-metadata-viewer"; -import { IconBrandGithub, IconBrandNotion, IconBrandSlack, IconBrandYoutube } from "@tabler/icons-react"; +import { toast } from "sonner"; // Define animation variants for reuse const fadeInScale = { @@ -114,7 +109,7 @@ const fadeInScale = { type Document = { id: number; title: string; - document_type: "EXTENSION" | "CRAWLED_URL" | "SLACK_CONNECTOR" | "NOTION_CONNECTOR" | "FILE" | "YOUTUBE_VIDEO"; + document_type: "EXTENSION" | "CRAWLED_URL" | "SLACK_CONNECTOR" | "NOTION_CONNECTOR" | "FILE" | "YOUTUBE_VIDEO" | "LINEAR_CONNECTOR"; document_metadata: any; content: string; created_at: string; @@ -143,6 +138,7 @@ const documentTypeIcons = { FILE: File, YOUTUBE_VIDEO: IconBrandYoutube, GITHUB_CONNECTOR: IconBrandGithub, + LINEAR_CONNECTOR: IconLayoutKanban, } as const; const columns: ColumnDef[] = [ @@ -1029,4 +1025,5 @@ function RowActions({ row }: { row: Row }) { ); } -export { DocumentsTable } +export { DocumentsTable }; + diff --git a/surfsense_web/components/ModernHeroWithGradients.tsx b/surfsense_web/components/ModernHeroWithGradients.tsx index bd10a50ca..5bdf4e677 100644 --- a/surfsense_web/components/ModernHeroWithGradients.tsx +++ b/surfsense_web/components/ModernHeroWithGradients.tsx @@ -36,7 +36,7 @@ export function ModernHeroWithGradients() {

- A Customizable AI Research Agent just like NotebookLM or Perplexity, but connected to external sources such as search engines (Tavily), Slack, Notion, YouTube, GitHub and more. + A Customizable AI Research Agent just like NotebookLM or Perplexity, but connected to external sources such as search engines (Tavily), Slack, Linear, Notion, YouTube, GitHub and more.

{ const iconProps = { className: "h-4 w-4" }; switch(connectorType) { + case 'LINEAR_CONNECTOR': + return ; case 'GITHUB_CONNECTOR': return ; case 'YOUTUBE_VIDEO': From ae8c74a5aa1637243cad798d5f2db78af6f2d626 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Wed, 16 Apr 2025 19:59:38 -0700 Subject: [PATCH 12/47] select repos when adding gh connector --- .../routes/search_source_connectors_routes.py | 33 +- .../app/schemas/search_source_connector.py | 10 +- .../app/tasks/connectors_indexing_tasks.py | 29 +- .../connectors/add/github-connector/page.tsx | 396 ++++++++++++------ 4 files changed, 330 insertions(+), 138 deletions(-) diff --git a/surfsense_backend/app/routes/search_source_connectors_routes.py b/surfsense_backend/app/routes/search_source_connectors_routes.py index 482a8259d..5bfe0a955 100644 --- a/surfsense_backend/app/routes/search_source_connectors_routes.py +++ b/surfsense_backend/app/routes/search_source_connectors_routes.py @@ -9,7 +9,7 @@ POST /search-source-connectors/{connector_id}/index - Index content from a conne Note: Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR, NOTION_CONNECTOR). """ -from fastapi import APIRouter, Depends, HTTPException, Query, BackgroundTasks +from fastapi import APIRouter, Depends, HTTPException, Query, BackgroundTasks, Body from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from sqlalchemy.exc import IntegrityError @@ -18,8 +18,9 @@ from app.db import get_async_session, User, SearchSourceConnector, SearchSourceC from app.schemas import SearchSourceConnectorCreate, SearchSourceConnectorUpdate, SearchSourceConnectorRead from app.users import current_active_user from app.utils.check_ownership import check_ownership -from pydantic import ValidationError +from pydantic import ValidationError, BaseModel, Field from app.tasks.connectors_indexing_tasks import index_slack_messages, index_notion_pages, index_github_repos +from app.connectors.github_connector import GitHubConnector from datetime import datetime, timezone import logging @@ -28,6 +29,34 @@ logger = logging.getLogger(__name__) router = APIRouter() +# --- New Schema for GitHub PAT --- +class GitHubPATRequest(BaseModel): + github_pat: str = Field(..., description="GitHub Personal Access Token") + +# --- New Endpoint to list GitHub Repositories --- +@router.post("/github/repositories/", response_model=List[Dict[str, Any]]) +async def list_github_repositories( + pat_request: GitHubPATRequest, + user: User = Depends(current_active_user) # Ensure the user is logged in +): + """ + Fetches a list of repositories accessible by the provided GitHub PAT. + The PAT is used for this request only and is not stored. + """ + try: + # Initialize GitHubConnector with the provided PAT + github_client = GitHubConnector(token=pat_request.github_pat) + # Fetch repositories + repositories = github_client.get_user_repositories() + return repositories + except ValueError as e: + # Handle invalid token error specifically + logger.error(f"GitHub PAT validation failed for user {user.id}: {str(e)}") + raise HTTPException(status_code=400, detail=f"Invalid GitHub PAT: {str(e)}") + except Exception as e: + logger.error(f"Failed to fetch GitHub repositories for user {user.id}: {str(e)}") + raise HTTPException(status_code=500, detail="Failed to fetch GitHub repositories.") + @router.post("/search-source-connectors/", response_model=SearchSourceConnectorRead) async def create_search_source_connector( connector: SearchSourceConnectorCreate, diff --git a/surfsense_backend/app/schemas/search_source_connector.py b/surfsense_backend/app/schemas/search_source_connector.py index 41e1086e7..1005a63d8 100644 --- a/surfsense_backend/app/schemas/search_source_connector.py +++ b/surfsense_backend/app/schemas/search_source_connector.py @@ -4,7 +4,6 @@ from typing import Dict, Any from pydantic import BaseModel, field_validator from .base import IDModel, TimestampModel from app.db import SearchSourceConnectorType -from fastapi import HTTPException class SearchSourceConnectorBase(BaseModel): name: str @@ -59,14 +58,19 @@ class SearchSourceConnectorBase(BaseModel): raise ValueError("NOTION_INTEGRATION_TOKEN cannot be empty") elif connector_type == SearchSourceConnectorType.GITHUB_CONNECTOR: - # For GITHUB_CONNECTOR, only allow GITHUB_PAT - allowed_keys = ["GITHUB_PAT"] + # For GITHUB_CONNECTOR, only allow GITHUB_PAT and repo_full_names + allowed_keys = ["GITHUB_PAT", "repo_full_names"] if set(config.keys()) != set(allowed_keys): raise ValueError(f"For GITHUB_CONNECTOR connector type, config must only contain these keys: {allowed_keys}") # Ensure the token is not empty if not config.get("GITHUB_PAT"): raise ValueError("GITHUB_PAT cannot be empty") + + # Ensure the repo_full_names is present and is a non-empty list + repo_full_names = config.get("repo_full_names") + if not isinstance(repo_full_names, list) or not repo_full_names: + raise ValueError("repo_full_names must be a non-empty list of strings") return config diff --git a/surfsense_backend/app/tasks/connectors_indexing_tasks.py b/surfsense_backend/app/tasks/connectors_indexing_tasks.py index 670fa26ad..31a7d4d65 100644 --- a/surfsense_backend/app/tasks/connectors_indexing_tasks.py +++ b/surfsense_backend/app/tasks/connectors_indexing_tasks.py @@ -1,4 +1,4 @@ -from typing import Optional, List, Dict, Any, Tuple +from typing import Optional, Tuple from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.future import select @@ -626,10 +626,15 @@ async def index_github_repos( if not connector: return 0, f"Connector with ID {connector_id} not found or is not a GitHub connector" - # 2. Get the GitHub PAT from the connector config + # 2. Get the GitHub PAT and selected repositories from the connector config github_pat = connector.config.get("GITHUB_PAT") + repo_full_names_to_index = connector.config.get("repo_full_names") + if not github_pat: return 0, "GitHub Personal Access Token (PAT) not found in connector config" + + if not repo_full_names_to_index or not isinstance(repo_full_names_to_index, list): + return 0, "'repo_full_names' not found or is not a list in connector config" # 3. Initialize GitHub connector client try: @@ -637,13 +642,10 @@ async def index_github_repos( except ValueError as e: return 0, f"Failed to initialize GitHub client: {str(e)}" - # 4. Get list of accessible repositories - repositories = github_client.get_user_repositories() - if not repositories: - logger.info("No accessible GitHub repositories found for the provided token.") - return 0, "No accessible GitHub repositories found." - - logger.info(f"Found {len(repositories)} repositories to potentially index.") + # 4. Validate selected repositories + # For simplicity, we'll proceed with the list provided. + # If a repo is inaccessible, get_repository_files will likely fail gracefully later. + logger.info(f"Starting indexing for {len(repo_full_names_to_index)} selected repositories.") # 5. Get existing documents for this search space and connector type to prevent duplicates existing_docs_result = await session.execute( @@ -658,11 +660,10 @@ async def index_github_repos( existing_docs_lookup = {doc.document_metadata.get("full_path"): doc for doc in existing_docs if doc.document_metadata.get("full_path")} logger.info(f"Found {len(existing_docs_lookup)} existing GitHub documents in database for search space {search_space_id}") - # 6. Iterate through repositories and index files - for repo_info in repositories: - repo_full_name = repo_info.get("full_name") - if not repo_full_name: - logger.warning(f"Skipping repository with missing full_name: {repo_info.get('name')}") + # 6. Iterate through selected repositories and index files + for repo_full_name in repo_full_names_to_index: + if not repo_full_name or not isinstance(repo_full_name, str): + logger.warning(f"Skipping invalid repository entry: {repo_full_name}") continue logger.info(f"Processing repository: {repo_full_name}") diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx index 45534d6a1..fc7a60276 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx @@ -7,7 +7,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import * as z from "zod"; import { toast } from "sonner"; -import { ArrowLeft, Check, Info, Loader2, Github } from "lucide-react"; +import { ArrowLeft, Check, Info, Loader2, Github, CircleAlert, ListChecks } from "lucide-react"; // Assuming useSearchSourceConnectors hook exists and works similarly import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; @@ -42,9 +42,10 @@ import { AccordionTrigger, } from "@/components/ui/accordion"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Checkbox } from "@/components/ui/checkbox"; -// Define the form schema with Zod for GitHub -const githubConnectorFormSchema = z.object({ +// Define the form schema with Zod for GitHub PAT entry step +const githubPatFormSchema = z.object({ name: z.string().min(3, { message: "Connector name must be at least 3 characters.", }), @@ -58,61 +59,144 @@ const githubConnectorFormSchema = z.object({ }); // Define the type for the form values -type GithubConnectorFormValues = z.infer; +type GithubPatFormValues = z.infer; + +// Type for fetched GitHub repositories +interface GithubRepo { + id: number; + name: string; + full_name: string; + private: boolean; + url: string; + description: string | null; + last_updated: string | null; +} export default function GithubConnectorPage() { const router = useRouter(); const params = useParams(); const searchSpaceId = params.search_space_id as string; - const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); // Assuming this hook exists + const [step, setStep] = useState<'enter_pat' | 'select_repos'>('enter_pat'); + const [isFetchingRepos, setIsFetchingRepos] = useState(false); + const [isCreatingConnector, setIsCreatingConnector] = useState(false); + const [repositories, setRepositories] = useState([]); + const [selectedRepos, setSelectedRepos] = useState([]); + const [connectorName, setConnectorName] = useState("GitHub Connector"); + const [validatedPat, setValidatedPat] = useState(""); // Store the validated PAT - // Initialize the form - const form = useForm({ - resolver: zodResolver(githubConnectorFormSchema), + const { createConnector } = useSearchSourceConnectors(); + + // Initialize the form for PAT entry + const form = useForm({ + resolver: zodResolver(githubPatFormSchema), defaultValues: { - name: "GitHub Connector", + name: connectorName, github_pat: "", }, }); - // Handle form submission - const onSubmit = async (values: GithubConnectorFormValues) => { - setIsSubmitting(true); + // Function to fetch repositories using the new backend endpoint + const fetchRepositories = async (values: GithubPatFormValues) => { + setIsFetchingRepos(true); + setConnectorName(values.name); // Store the name + setValidatedPat(values.github_pat); // Store the PAT temporarily + try { + const token = localStorage.getItem('surfsense_bearer_token'); + if (!token) { + throw new Error('No authentication token found'); + } + + const response = await fetch( + `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/github/repositories/`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ github_pat: values.github_pat }) + } + ); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.detail || `Failed to fetch repositories: ${response.statusText}`); + } + + const data: GithubRepo[] = await response.json(); + setRepositories(data); + setStep('select_repos'); // Move to the next step + toast.success(`Found ${data.length} repositories.`); + } catch (error) { + console.error("Error fetching GitHub repositories:", error); + const errorMessage = error instanceof Error ? error.message : "Failed to fetch repositories. Please check the PAT and try again."; + toast.error(errorMessage); + } finally { + setIsFetchingRepos(false); + } + }; + + // Handle final connector creation + const handleCreateConnector = async () => { + if (selectedRepos.length === 0) { + toast.warning("Please select at least one repository to index."); + return; + } + + setIsCreatingConnector(true); try { await createConnector({ - name: values.name, + name: connectorName, // Use the stored name connector_type: "GITHUB_CONNECTOR", config: { - GITHUB_PAT: values.github_pat, + GITHUB_PAT: validatedPat, // Use the stored validated PAT + repo_full_names: selectedRepos, // Add the selected repo names }, - is_indexable: true, // GitHub connector is indexable - last_indexed_at: null, // New connector hasn't been indexed + is_indexable: true, + last_indexed_at: null, }); toast.success("GitHub connector created successfully!"); - - // Navigate back to connectors management page (or the add page) router.push(`/dashboard/${searchSpaceId}/connectors`); - } catch (error) { // Added type check for error + } catch (error) { console.error("Error creating GitHub connector:", error); - // Display specific backend error message if available - const errorMessage = error instanceof Error ? error.message : "Failed to create GitHub connector. Please check the PAT and permissions."; + const errorMessage = error instanceof Error ? error.message : "Failed to create GitHub connector."; toast.error(errorMessage); } finally { - setIsSubmitting(false); + setIsCreatingConnector(false); } }; + // Handle checkbox changes + const handleRepoSelection = (repoFullName: string, checked: boolean) => { + setSelectedRepos(prev => + checked + ? [...prev, repoFullName] + : prev.filter(name => name !== repoFullName) + ); + }; + return (
- Connect GitHub Account + + {step === 'enter_pat' ? : } + {step === 'enter_pat' ? "Connect GitHub Account" : "Select Repositories to Index"} + - Integrate with GitHub using a Personal Access Token (PAT) to search and retrieve information from accessible repositories. This connector can index your code and documentation. + {step === 'enter_pat' + ? "Provide a name and GitHub Personal Access Token (PAT) to fetch accessible repositories." + : `Select which repositories you want SurfSense to index for search. Found ${repositories.length} repositories accessible via your PAT.` + } - - - - GitHub Personal Access Token (PAT) Required - - You'll need a GitHub PAT with the appropriate scopes (e.g., 'repo') to use this connector. You can create one from your - - GitHub Developer Settings - . - - -
- - ( - - Connector Name - - - - - A friendly name to identify this GitHub connection. - - - - )} - /> + + {step === 'enter_pat' && ( + + + + GitHub Personal Access Token (PAT) Required + + You'll need a GitHub PAT with the appropriate scopes (e.g., 'repo') to fetch repositories. You can create one from your{' '} + + GitHub Developer Settings + . The PAT will be used to fetch repositories and then stored securely to enable indexing. + + - ( - - GitHub Personal Access Token (PAT) - - - - - Your GitHub PAT will be encrypted and stored securely. Ensure it has the necessary 'repo' scopes. - - - - )} - /> - -
- -
- - -
+ /> + + ( + + GitHub Personal Access Token (PAT) + + + + + Enter your GitHub PAT here to fetch your repositories. It will be stored encrypted later. + + + + )} + /> + +
+ +
+ +
+ )} + + {step === 'select_repos' && ( + + {repositories.length === 0 ? ( + + + No Repositories Found + + No repositories were found or accessible with the provided PAT. Please check the token and its permissions, then go back and try again. + + + ) : ( +
+ Repositories ({selectedRepos.length} selected) +
+ {repositories.map((repo) => ( +
+ handleRepoSelection(repo.full_name, !!checked)} + /> + +
+ ))} +
+ + Select the repositories you wish to index. Only checked repositories will be processed. + + +
+ + +
+
+ )} +
+ )} + +

What you get with GitHub integration:

    -
  • Search through code and documentation in your repositories
  • +
  • Search through code and documentation in your selected repositories
  • Access READMEs, Markdown files, and common code files
  • Connect your project knowledge directly to your search space
  • -
  • Index your repositories for enhanced search capabilities
  • +
  • Index your selected repositories for enhanced search capabilities
@@ -237,27 +398,20 @@ export default function GithubConnectorPage() {

How it works

- The GitHub connector uses a Personal Access Token (PAT) to authenticate with the GitHub API. It fetches information about repositories accessible to the token and indexes relevant files (code, markdown, text). + The GitHub connector uses a Personal Access Token (PAT) to authenticate with the GitHub API. First, it fetches a list of repositories accessible to the token. You then select which repositories you want to index. The connector indexes relevant files (code, markdown, text) from only the selected repositories.

  • The connector indexes files based on common code and documentation extensions.
  • Large files (over 1MB) are skipped during indexing.
  • +
  • Only selected repositories are indexed.
  • Indexing runs periodically (check connector settings for frequency) to keep content up-to-date.
- Step 1: Create a GitHub PAT - - - - Token Security - - Treat your PAT like a password. Store it securely and consider using fine-grained tokens if possible. - - - + Step 1: Generate GitHub PAT +

Generating a Token:

@@ -280,9 +434,13 @@ export default function GithubConnectorPage() { Step 2: Connect in SurfSense
    -
  1. Paste the copied GitHub PAT into the "GitHub Personal Access Token (PAT)" field on the "Connect GitHub" tab.
  2. -
  3. Optionally, give the connector a custom name.
  4. -
  5. Click the Connect GitHub button.
  6. +
  7. Navigate to the "Connect GitHub" tab.
  8. +
  9. Enter a name for your connector.
  10. +
  11. Paste the copied GitHub PAT into the "GitHub Personal Access Token (PAT)" field.
  12. +
  13. Click Fetch Repositories.
  14. +
  15. If the PAT is valid, you'll see a list of your accessible repositories.
  16. +
  17. Select the repositories you want SurfSense to index using the checkboxes.
  18. +
  19. Click the Create Connector button.
  20. If the connection is successful, you will be redirected and can start indexing from the Connectors page.
From 5176569e30e2e717e4305e3fd198510116985c43 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Wed, 16 Apr 2025 20:29:50 -0700 Subject: [PATCH 13/47] edit repos for gh connector --- .../routes/search_source_connectors_routes.py | 78 +++- .../app/schemas/search_source_connector.py | 12 +- .../connectors/(manage)/page.tsx | 2 +- .../connectors/[connector_id]/edit/page.tsx | 442 ++++++++++++++++++ .../connectors/[connector_id]/page.tsx | 2 +- 5 files changed, 506 insertions(+), 30 deletions(-) create mode 100644 surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx diff --git a/surfsense_backend/app/routes/search_source_connectors_routes.py b/surfsense_backend/app/routes/search_source_connectors_routes.py index 5bfe0a955..f843029e2 100644 --- a/surfsense_backend/app/routes/search_source_connectors_routes.py +++ b/surfsense_backend/app/routes/search_source_connectors_routes.py @@ -15,7 +15,7 @@ from sqlalchemy.future import select from sqlalchemy.exc import IntegrityError from typing import List, Dict, Any from app.db import get_async_session, User, SearchSourceConnector, SearchSourceConnectorType, SearchSpace, async_session_maker -from app.schemas import SearchSourceConnectorCreate, SearchSourceConnectorUpdate, SearchSourceConnectorRead +from app.schemas import SearchSourceConnectorCreate, SearchSourceConnectorUpdate, SearchSourceConnectorRead, SearchSourceConnectorBase from app.users import current_active_user from app.utils.check_ownership import check_ownership from pydantic import ValidationError, BaseModel, Field @@ -159,54 +159,84 @@ async def update_search_source_connector( ): """ Update a search source connector. - - Each user can have only one connector of each type (SERPER_API, TAVILY_API, SLACK_CONNECTOR). - The config must contain the appropriate keys for the connector type. + Handles partial updates, including merging changes into the 'config' field. """ - try: - db_connector = await check_ownership(session, SearchSourceConnector, connector_id, user) + db_connector = await check_ownership(session, SearchSourceConnector, connector_id, user) + + # Convert the sparse update data (only fields present in request) to a dict + update_data = connector_update.model_dump(exclude_unset=True) + + # Special handling for 'config' field + if "config" in update_data: + incoming_config = update_data["config"] # Config data from the request + existing_config = db_connector.config if db_connector.config else {} # Current config from DB - # If connector type is being changed, check if one of that type already exists - if connector_update.connector_type != db_connector.connector_type: + # Merge incoming config into existing config + # This preserves existing keys (like GITHUB_PAT) if they are not in the incoming data + merged_config = existing_config.copy() + merged_config.update(incoming_config) + + # -- Validation after merging -- + # Validate the *merged* config based on the connector type + # We need the connector type - use the one from the update if provided, else the existing one + current_connector_type = connector_update.connector_type if connector_update.connector_type is not None else db_connector.connector_type + + try: + # We can reuse the base validator by creating a temporary base model instance + # Note: This assumes 'name' and 'is_indexable' are not crucial for config validation itself + temp_data_for_validation = { + "name": db_connector.name, # Use existing name + "connector_type": current_connector_type, + "is_indexable": db_connector.is_indexable, # Use existing value + "last_indexed_at": db_connector.last_indexed_at, # Not used by validator + "config": merged_config + } + SearchSourceConnectorBase.model_validate(temp_data_for_validation) + except ValidationError as e: + # Raise specific validation error for the merged config + raise HTTPException( + status_code=422, + detail=f"Validation error for merged config: {str(e)}" + ) + + # If validation passes, update the main update_data dict with the merged config + update_data["config"] = merged_config + + # Apply all updates (including the potentially merged config) + for key, value in update_data.items(): + # Prevent changing connector_type if it causes a duplicate (check moved here) + if key == "connector_type" and value != db_connector.connector_type: result = await session.execute( select(SearchSourceConnector) .filter( SearchSourceConnector.user_id == user.id, - SearchSourceConnector.connector_type == connector_update.connector_type, + SearchSourceConnector.connector_type == value, SearchSourceConnector.id != connector_id ) ) existing_connector = result.scalars().first() - if existing_connector: raise HTTPException( status_code=409, - detail=f"A connector with type {connector_update.connector_type} already exists. Each user can have only one connector of each type." + detail=f"A connector with type {value} already exists. Each user can have only one connector of each type." ) - update_data = connector_update.model_dump(exclude_unset=True) - for key, value in update_data.items(): - setattr(db_connector, key, value) + setattr(db_connector, key, value) + + try: await session.commit() await session.refresh(db_connector) return db_connector - except ValidationError as e: - await session.rollback() - raise HTTPException( - status_code=422, - detail=f"Validation error: {str(e)}" - ) except IntegrityError as e: await session.rollback() + # This might occur if connector_type constraint is violated somehow after the check raise HTTPException( status_code=409, - detail=f"Integrity error: A connector with this type already exists. {str(e)}" + detail=f"Database integrity error during update: {str(e)}" ) - except HTTPException: - await session.rollback() - raise except Exception as e: await session.rollback() + logger.error(f"Failed to update search source connector {connector_id}: {e}", exc_info=True) raise HTTPException( status_code=500, detail=f"Failed to update search source connector: {str(e)}" diff --git a/surfsense_backend/app/schemas/search_source_connector.py b/surfsense_backend/app/schemas/search_source_connector.py index 1005a63d8..d0c46313b 100644 --- a/surfsense_backend/app/schemas/search_source_connector.py +++ b/surfsense_backend/app/schemas/search_source_connector.py @@ -1,6 +1,6 @@ from datetime import datetime import uuid -from typing import Dict, Any +from typing import Dict, Any, Optional from pydantic import BaseModel, field_validator from .base import IDModel, TimestampModel from app.db import SearchSourceConnectorType @@ -9,7 +9,7 @@ class SearchSourceConnectorBase(BaseModel): name: str connector_type: SearchSourceConnectorType is_indexable: bool - last_indexed_at: datetime | None + last_indexed_at: Optional[datetime] = None config: Dict[str, Any] @field_validator('config') @@ -77,8 +77,12 @@ class SearchSourceConnectorBase(BaseModel): class SearchSourceConnectorCreate(SearchSourceConnectorBase): pass -class SearchSourceConnectorUpdate(SearchSourceConnectorBase): - pass +class SearchSourceConnectorUpdate(BaseModel): + name: Optional[str] = None + connector_type: Optional[SearchSourceConnectorType] = None + is_indexable: Optional[bool] = None + last_indexed_at: Optional[datetime] = None + config: Optional[Dict[str, Any]] = None class SearchSourceConnectorRead(SearchSourceConnectorBase, IDModel, TimestampModel): user_id: uuid.UUID diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx index 817ca584d..bb890ebd5 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx @@ -205,7 +205,7 @@ export default function ConnectorsPage() { + + + + + Edit GitHub Connector + + Modify the connector name and repository selections. To change repository selections, you need to re-enter your PAT. + + + + {/* Use editForm for the main form structure */} +
+ + + {/* Connector Name Field */} + ( + + Connector Name + + + + + + )} + /> + +
+ + {/* Repository Selection Section */} +
+

Repository Selection

+ + {editMode === 'viewing' && ( +
+ Currently Indexed Repositories: + {currentSelectedRepos.length > 0 ? ( +
    + {currentSelectedRepos.map(repo =>
  • {repo}
  • )} +
+ ) : ( +

(No repositories currently selected for indexing)

+ )} + + Click "Change Selection" to re-enter your PAT and update the list. +
+ )} + + {editMode === 'editing_repos' && ( +
+ {/* PAT Input Section (No nested Form provider) */} + {/* We still use patForm fields but trigger validation manually */} +
+ ( + + Re-enter PAT to Fetch Repos + + + + + + )} + /> + +
+ + {/* Fetched Repository List (shown after fetch) */} + {isFetchingRepos && } + {!isFetchingRepos && fetchedRepos !== null && ( + fetchedRepos.length === 0 ? ( + + + No Repositories Found + Check the PAT and permissions. + + ) : ( +
+ Select Repositories to Index ({newSelectedRepos.length} selected): +
+ {fetchedRepos.map((repo) => ( +
+ handleRepoSelectionChange(repo.full_name, !!checked)} + /> + +
+ ))} +
+
+ ) + )} + +
+ )} +
+ +
+ + + + +
+ +
+
+
+ ); +} diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx index e841639cd..ad6ceb7bf 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx @@ -70,7 +70,7 @@ export default function EditConnectorPage() { const [connector, setConnector] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); - + console.log("connector", connector); // Initialize the form const form = useForm({ resolver: zodResolver(apiConnectorFormSchema), From 69eea7485b00e673bcc6fb2783a1f2280d7882b1 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Wed, 16 Apr 2025 20:38:44 -0700 Subject: [PATCH 14/47] reuse edit page for other connectors --- .../connectors/[connector_id]/edit/page.tsx | 482 +++++++++++------- 1 file changed, 295 insertions(+), 187 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx index e526976db..cc348bab7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx @@ -37,7 +37,19 @@ import { import { Checkbox } from "@/components/ui/checkbox"; import { Skeleton } from "@/components/ui/skeleton"; -// Schema for PAT input when editing repos +// Helper function to get connector type display name (copied from manage page) +const getConnectorTypeDisplay = (type: string): string => { + const typeMap: Record = { + "SERPER_API": "Serper API", + "TAVILY_API": "Tavily API", + "SLACK_CONNECTOR": "Slack", + "NOTION_CONNECTOR": "Notion", + "GITHUB_CONNECTOR": "GitHub", + }; + return typeMap[type] || type; +}; + +// Schema for PAT input when editing GitHub repos (remains separate) const githubPatSchema = z.object({ github_pat: z.string() .min(20, { message: "GitHub Personal Access Token seems too short." }) @@ -47,9 +59,15 @@ const githubPatSchema = z.object({ }); type GithubPatFormValues = z.infer; -// Schema for main edit form (just the name for now) +// Updated schema for main edit form - includes optional fields for other connector configs const editConnectorSchema = z.object({ name: z.string().min(3, { message: "Connector name must be at least 3 characters." }), + // Add optional fields for other connector types' configs + SLACK_BOT_TOKEN: z.string().optional(), + NOTION_INTEGRATION_TOKEN: z.string().optional(), + SERPER_API_KEY: z.string().optional(), + TAVILY_API_KEY: z.string().optional(), + // GITHUB_PAT is handled separately via patForm for repo editing flow }); type EditConnectorFormValues = z.infer; @@ -63,9 +81,9 @@ interface GithubRepo { last_updated: string | null; } -type EditMode = 'viewing' | 'editing_repos'; +type EditMode = 'viewing' | 'editing_repos'; // Only relevant for GitHub -export default function EditGithubConnectorPage() { +export default function EditConnectorPage() { // Renamed for clarity const router = useRouter(); const params = useParams(); const searchSpaceId = params.search_space_id as string; @@ -74,54 +92,74 @@ export default function EditGithubConnectorPage() { const { connectors, updateConnector, isLoading: connectorsLoading } = useSearchSourceConnectors(); const [connector, setConnector] = useState(null); + const [originalConfig, setOriginalConfig] = useState | null>(null); // Store original config object + + // GitHub specific state (only used if connector type is GitHub) const [currentSelectedRepos, setCurrentSelectedRepos] = useState([]); - const [originalPat, setOriginalPat] = useState(""); // State to hold the initial PAT - const [editMode, setEditMode] = useState('viewing'); - const [fetchedRepos, setFetchedRepos] = useState(null); // Null indicates not fetched yet for edit - const [newSelectedRepos, setNewSelectedRepos] = useState([]); // Tracks selections *during* edit + const [originalPat, setOriginalPat] = useState(""); + const [editMode, setEditMode] = useState('viewing'); + const [fetchedRepos, setFetchedRepos] = useState(null); + const [newSelectedRepos, setNewSelectedRepos] = useState([]); const [isFetchingRepos, setIsFetchingRepos] = useState(false); + const [isSaving, setIsSaving] = useState(false); - // Form for just the PAT input + // Form for GitHub PAT input (only used for GitHub repo editing) const patForm = useForm({ resolver: zodResolver(githubPatSchema), - defaultValues: { github_pat: "" }, // Default empty, will be reset + defaultValues: { github_pat: "" }, }); - // Form for the main connector details (e.g., name) + // Main form for connector details (name + simple config fields) const editForm = useForm({ resolver: zodResolver(editConnectorSchema), - defaultValues: { name: "" }, + defaultValues: { + name: "", + SLACK_BOT_TOKEN: "", + NOTION_INTEGRATION_TOKEN: "", + SERPER_API_KEY: "", + TAVILY_API_KEY: "", + }, }); - // Effect to find and set the current connector details on load + // Effect to load connector data useEffect(() => { - if (!connectorsLoading && connectors.length > 0 && !connector) { // Added !connector check to prevent loop + if (!connectorsLoading && connectors.length > 0 && !connector) { const currentConnector = connectors.find(c => c.id === connectorId); - if (currentConnector && currentConnector.connector_type === 'GITHUB_CONNECTOR') { + if (currentConnector) { setConnector(currentConnector); - const savedRepos = currentConnector.config?.repo_full_names || []; - const savedPat = currentConnector.config?.GITHUB_PAT || ""; - setCurrentSelectedRepos(savedRepos); - setNewSelectedRepos(savedRepos); - setOriginalPat(savedPat); // Store the original PAT - editForm.reset({ name: currentConnector.name }); - patForm.reset({ github_pat: savedPat }); // Also reset PAT form initially - } else if (currentConnector) { - toast.error("This connector is not a GitHub connector."); - router.push(`/dashboard/${searchSpaceId}/connectors`); + setOriginalConfig(currentConnector.config || {}); // Store original config + + // Reset main form with common and type-specific fields + editForm.reset({ + name: currentConnector.name, + SLACK_BOT_TOKEN: currentConnector.config?.SLACK_BOT_TOKEN || "", + NOTION_INTEGRATION_TOKEN: currentConnector.config?.NOTION_INTEGRATION_TOKEN || "", + SERPER_API_KEY: currentConnector.config?.SERPER_API_KEY || "", + TAVILY_API_KEY: currentConnector.config?.TAVILY_API_KEY || "", + }); + + // If GitHub, set up GitHub-specific state + if (currentConnector.connector_type === 'GITHUB_CONNECTOR') { + const savedRepos = currentConnector.config?.repo_full_names || []; + const savedPat = currentConnector.config?.GITHUB_PAT || ""; + setCurrentSelectedRepos(savedRepos); + setNewSelectedRepos(savedRepos); + setOriginalPat(savedPat); + patForm.reset({ github_pat: savedPat }); + setEditMode('viewing'); // Start in viewing mode for repos + } } else { toast.error("Connector not found."); router.push(`/dashboard/${searchSpaceId}/connectors`); } } - }, [connectorId, connectors, connectorsLoading, router, searchSpaceId, connector]); // Removed editForm, patForm from dependencies + }, [connectorId, connectors, connectorsLoading, router, searchSpaceId, connector, editForm, patForm]); // Fetch repositories using the entered PAT const handleFetchRepositories = async (values: GithubPatFormValues) => { setIsFetchingRepos(true); setFetchedRepos(null); - // No need for patInputValue state, values.github_pat has the submitted value try { const token = localStorage.getItem('surfsense_bearer_token'); if (!token) throw new Error('No authentication token found'); @@ -137,21 +175,17 @@ export default function EditGithubConnectorPage() { body: JSON.stringify({ github_pat: values.github_pat }) } ); - if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.detail || `Failed to fetch repositories: ${response.statusText}`); } - const data: GithubRepo[] = await response.json(); setFetchedRepos(data); - // Reset selection based on currently SAVED repos when fetching - setNewSelectedRepos(currentSelectedRepos); + setNewSelectedRepos(currentSelectedRepos); toast.success(`Found ${data.length} repositories. Select which ones to index.`); } catch (error) { console.error("Error fetching GitHub repositories:", error); toast.error(error instanceof Error ? error.message : "Failed to fetch repositories."); - // Don't clear PAT form on error, let user fix it } finally { setIsFetchingRepos(false); } @@ -166,62 +200,97 @@ export default function EditGithubConnectorPage() { ); }; - // Save all changes (name and potentially repo selection + PAT) + // Save changes - updated to handle different connector types const handleSaveChanges = async (formData: EditConnectorFormValues) => { - if (!connector) return; + if (!connector || !originalConfig) return; setIsSaving(true); const updatePayload: Partial = {}; let configChanged = false; + let newConfig: Record | null = null; // 1. Check if name changed if (formData.name !== connector.name) { updatePayload.name = formData.name; } - // 2. Check PAT and Repo changes - const currentPatInForm = patForm.getValues('github_pat'); - let patChanged = false; + // 2. Check for config changes based on connector type + switch (connector.connector_type) { + case 'GITHUB_CONNECTOR': + const currentPatInForm = patForm.getValues('github_pat'); + const patChanged = currentPatInForm !== originalPat; + const initialRepoSet = new Set(currentSelectedRepos); + const newRepoSet = new Set(newSelectedRepos); + const reposChanged = initialRepoSet.size !== newRepoSet.size || ![...initialRepoSet].every(repo => newRepoSet.has(repo)); - // Check if PAT input field was actually edited - if (editMode === 'editing_repos' && currentPatInForm !== originalPat) { - patChanged = true; + if (patChanged || (editMode === 'editing_repos' && reposChanged && fetchedRepos !== null)) { + if (!currentPatInForm || !(currentPatInForm.startsWith('ghp_') || currentPatInForm.startsWith('github_pat_'))) { + toast.error("Invalid GitHub PAT format. Cannot save."); + setIsSaving(false); return; + } + newConfig = { + GITHUB_PAT: currentPatInForm, + repo_full_names: newSelectedRepos, + }; + if (reposChanged && newSelectedRepos.length === 0) { + toast.warning("Warning: No repositories selected."); + } + } + break; + + case 'SLACK_CONNECTOR': + if (formData.SLACK_BOT_TOKEN !== originalConfig.SLACK_BOT_TOKEN) { + if (!formData.SLACK_BOT_TOKEN) { + toast.error("Slack Bot Token cannot be empty."); setIsSaving(false); return; + } + newConfig = { SLACK_BOT_TOKEN: formData.SLACK_BOT_TOKEN }; + } + break; + + case 'NOTION_CONNECTOR': + if (formData.NOTION_INTEGRATION_TOKEN !== originalConfig.NOTION_INTEGRATION_TOKEN) { + if (!formData.NOTION_INTEGRATION_TOKEN) { + toast.error("Notion Integration Token cannot be empty."); setIsSaving(false); return; + } + newConfig = { NOTION_INTEGRATION_TOKEN: formData.NOTION_INTEGRATION_TOKEN }; + } + break; + + case 'SERPER_API': + if (formData.SERPER_API_KEY !== originalConfig.SERPER_API_KEY) { + if (!formData.SERPER_API_KEY) { + toast.error("Serper API Key cannot be empty."); setIsSaving(false); return; + } + newConfig = { SERPER_API_KEY: formData.SERPER_API_KEY }; + } + break; + + case 'TAVILY_API': + if (formData.TAVILY_API_KEY !== originalConfig.TAVILY_API_KEY) { + if (!formData.TAVILY_API_KEY) { + toast.error("Tavily API Key cannot be empty."); setIsSaving(false); return; + } + newConfig = { TAVILY_API_KEY: formData.TAVILY_API_KEY }; + } + break; + + // Add cases for other connector types if necessary } - // Check if repo selection was modified - const initialRepoSet = new Set(currentSelectedRepos); - const newRepoSet = new Set(newSelectedRepos); - const reposChanged = initialRepoSet.size !== newRepoSet.size || ![...initialRepoSet].every(repo => newRepoSet.has(repo)); - - // If PAT was changed OR repos were changed (implying PAT was involved) - if (patChanged || (editMode === 'editing_repos' && reposChanged && fetchedRepos !== null)) { - // Validate the PAT from the form before including it - if (!currentPatInForm || !(currentPatInForm.startsWith('ghp_') || currentPatInForm.startsWith('github_pat_'))) { - toast.error("Invalid GitHub PAT format in the input field. Cannot save config changes."); - setIsSaving(false); - return; - } - - updatePayload.config = { - // Use the PAT value currently in the form field - GITHUB_PAT: currentPatInForm, - // Use the latest repo selection state - repo_full_names: newSelectedRepos, - }; - configChanged = true; // Mark config as changed - - if (reposChanged && newSelectedRepos.length === 0) { - toast.warning("Warning: You haven't selected any repositories. The connector won't index anything."); - } + // If config was determined to have changed, add it to the payload + if (newConfig !== null) { + updatePayload.config = newConfig; + configChanged = true; } // 3. Check if there are actual changes to save if (Object.keys(updatePayload).length === 0) { toast.info("No changes detected."); setIsSaving(false); - setEditMode('viewing'); - // Reset PAT form to original value if returning to view mode without saving PAT change - patForm.reset({ github_pat: originalPat }); + if (connector.connector_type === 'GITHUB_CONNECTOR') { + setEditMode('viewing'); + patForm.reset({ github_pat: originalPat }); + } return; } @@ -230,29 +299,38 @@ export default function EditGithubConnectorPage() { await updateConnector(connectorId, updatePayload); toast.success("Connector updated successfully!"); - // Update local state based on what was *actually* saved - if (updatePayload.config) { - setCurrentSelectedRepos(updatePayload.config.repo_full_names || []); - setOriginalPat(updatePayload.config.GITHUB_PAT || ""); - // Reset PAT form with the newly saved PAT - patForm.reset({ github_pat: updatePayload.config.GITHUB_PAT || "" }); - } else { - // If config wasn't in payload, ensure PAT form is reset to original value - patForm.reset({ github_pat: originalPat }); - } - // Update connector name state if it changed (or rely on hook refresh) + // Update local state after successful save + const newlySavedConfig = updatePayload.config || originalConfig; + setOriginalConfig(newlySavedConfig); if (updatePayload.name) { - setConnector(prev => prev ? { ...prev, name: updatePayload.name! } : null); + setConnector(prev => prev ? { ...prev, name: updatePayload.name!, config: newlySavedConfig } : null); + editForm.setValue('name', updatePayload.name); + } else { + setConnector(prev => prev ? { ...prev, config: newlySavedConfig } : null); } - // Reset edit state - setEditMode('viewing'); - setFetchedRepos(null); - // Reset working selection to match saved state (use the updated currentSelectedRepos) - setNewSelectedRepos(updatePayload.config?.repo_full_names || currentSelectedRepos); + if (connector.connector_type === 'GITHUB_CONNECTOR' && configChanged) { + const savedGitHubConfig = newlySavedConfig as { GITHUB_PAT?: string; repo_full_names?: string[] }; + setCurrentSelectedRepos(savedGitHubConfig.repo_full_names || []); + setOriginalPat(savedGitHubConfig.GITHUB_PAT || ""); + setNewSelectedRepos(savedGitHubConfig.repo_full_names || []); + patForm.reset({ github_pat: savedGitHubConfig.GITHUB_PAT || "" }); + } else if (connector.connector_type === 'SLACK_CONNECTOR' && configChanged) { + editForm.setValue('SLACK_BOT_TOKEN', newlySavedConfig.SLACK_BOT_TOKEN || ""); + } // Add similar blocks for Notion, Serper, Tavily + else if (connector.connector_type === 'NOTION_CONNECTOR' && configChanged) { + editForm.setValue('NOTION_INTEGRATION_TOKEN', newlySavedConfig.NOTION_INTEGRATION_TOKEN || ""); + } else if (connector.connector_type === 'SERPER_API' && configChanged) { + editForm.setValue('SERPER_API_KEY', newlySavedConfig.SERPER_API_KEY || ""); + } else if (connector.connector_type === 'TAVILY_API' && configChanged) { + editForm.setValue('TAVILY_API_KEY', newlySavedConfig.TAVILY_API_KEY || ""); + } - // Optionally redirect or rely on hook refresh - // router.push(`/dashboard/${searchSpaceId}/connectors`); + // Reset GitHub specific edit state + if (connector.connector_type === 'GITHUB_CONNECTOR') { + setEditMode('viewing'); + setFetchedRepos(null); + } } catch (error) { console.error("Error updating connector:", error); @@ -298,26 +376,27 @@ export default function EditGithubConnectorPage() { > - Edit GitHub Connector + {/* Title can be dynamic based on type */} + + {/* TODO: Make icon dynamic */} + Edit {getConnectorTypeDisplay(connector.connector_type)} Connector + - Modify the connector name and repository selections. To change repository selections, you need to re-enter your PAT. + Modify the connector name and configuration. - {/* Use editForm for the main form structure */}
- {/* Connector Name Field */} + {/* Name Field (Common) */} ( Connector Name - - - + )} @@ -325,108 +404,137 @@ export default function EditGithubConnectorPage() {
- {/* Repository Selection Section */} -
-

Repository Selection

+ {/* --- Conditional Configuration Section --- */} +

Configuration

- {editMode === 'viewing' && ( -
- Currently Indexed Repositories: - {currentSelectedRepos.length > 0 ? ( -
    - {currentSelectedRepos.map(repo =>
  • {repo}
  • )} -
- ) : ( -

(No repositories currently selected for indexing)

- )} - - Click "Change Selection" to re-enter your PAT and update the list. -
- )} - - {editMode === 'editing_repos' && ( -
- {/* PAT Input Section (No nested Form provider) */} - {/* We still use patForm fields but trigger validation manually */} -
- ( + {/* == GitHub == */} + {connector.connector_type === 'GITHUB_CONNECTOR' && ( +
+

Repository Selection & Access

+ {editMode === 'viewing' && ( +
+ Currently Indexed Repositories: + {currentSelectedRepos.length > 0 ? ( +
    + {currentSelectedRepos.map(repo =>
  • {repo}
  • )} +
+ ) : ( +

(No repositories currently selected)

+ )} + + To change repo selections or update the PAT, click above. +
+ )} + {editMode === 'editing_repos' && ( +
+ {/* PAT Input */} +
+ ( - Re-enter PAT to Fetch Repos - - - + GitHub PAT + + Enter PAT to fetch/update repos or if you need to update the stored token. - )} - /> - +
+ {/* Repo List */} + {isFetchingRepos && } + {!isFetchingRepos && fetchedRepos !== null && ( + fetchedRepos.length === 0 ? ( + No Repositories FoundCheck PAT & permissions. + ) : ( +
+ Select Repositories to Index ({newSelectedRepos.length} selected): +
+ {fetchedRepos.map((repo) => ( +
+ handleRepoSelectionChange(repo.full_name, !!checked)} /> + +
+ ))} +
+
+ ) + )} +
+ )} +
+ )} - {/* Fetched Repository List (shown after fetch) */} - {isFetchingRepos && } - {!isFetchingRepos && fetchedRepos !== null && ( - fetchedRepos.length === 0 ? ( - - - No Repositories Found - Check the PAT and permissions. - - ) : ( -
- Select Repositories to Index ({newSelectedRepos.length} selected): -
- {fetchedRepos.map((repo) => ( -
- handleRepoSelectionChange(repo.full_name, !!checked)} - /> - -
- ))} -
-
- ) - )} - -
- )} -
+ {/* == Slack == */} + {connector.connector_type === 'SLACK_CONNECTOR' && ( + ( + + Slack Bot Token + + Update the Slack Bot Token if needed. + + + )} + /> + )} + + {/* == Notion == */} + {connector.connector_type === 'NOTION_CONNECTOR' && ( + ( + + Notion Integration Token + + Update the Notion Integration Token if needed. + + + )} + /> + )} + + {/* == Serper API == */} + {connector.connector_type === 'SERPER_API' && ( + ( + + Serper API Key + + Update the Serper API Key if needed. + + + )} + /> + )} + + {/* == Tavily API == */} + {connector.connector_type === 'TAVILY_API' && ( + ( + + Tavily API Key + + Update the Tavily API Key if needed. + + + )} + /> + )} - - To change repo selections or update the PAT, click above. -
- )} - {editMode === 'editing_repos' && ( -
- {/* PAT Input */} -
- ( - - GitHub PAT - - Enter PAT to fetch/update repos or if you need to update the stored token. - - - )} /> - -
- {/* Repo List */} - {isFetchingRepos && } - {!isFetchingRepos && fetchedRepos !== null && ( - fetchedRepos.length === 0 ? ( - No Repositories FoundCheck PAT & permissions. - ) : ( -
- Select Repositories to Index ({newSelectedRepos.length} selected): -
- {fetchedRepos.map((repo) => ( -
- handleRepoSelectionChange(repo.full_name, !!checked)} /> - -
- ))} -
-
- ) - )} - -
- )} -
+ )} {/* == Slack == */} {connector.connector_type === 'SLACK_CONNECTOR' && ( - ( - - Slack Bot Token - - Update the Slack Bot Token if needed. - - - )} + )} {/* == Notion == */} {connector.connector_type === 'NOTION_CONNECTOR' && ( - ( - - Notion Integration Token - - Update the Notion Integration Token if needed. - - - )} + )} {/* == Serper API == */} {connector.connector_type === 'SERPER_API' && ( - ( - - Serper API Key - - Update the Serper API Key if needed. - - - )} + )} {/* == Tavily API == */} {connector.connector_type === 'TAVILY_API' && ( - ( - - Tavily API Key - - Update the Tavily API Key if needed. - - - )} + )} diff --git a/surfsense_web/components/editConnector/EditConnectorLoadingSkeleton.tsx b/surfsense_web/components/editConnector/EditConnectorLoadingSkeleton.tsx new file mode 100644 index 000000000..dc1320fa3 --- /dev/null +++ b/surfsense_web/components/editConnector/EditConnectorLoadingSkeleton.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { Skeleton } from "@/components/ui/skeleton"; +import { Card, CardContent, CardHeader } from "@/components/ui/card"; + +export function EditConnectorLoadingSkeleton() { + return ( +
+ + + + + + + + + + + +
+ ); +} diff --git a/surfsense_web/components/editConnector/EditConnectorNameForm.tsx b/surfsense_web/components/editConnector/EditConnectorNameForm.tsx new file mode 100644 index 000000000..3f1882004 --- /dev/null +++ b/surfsense_web/components/editConnector/EditConnectorNameForm.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Control } from 'react-hook-form'; +import { FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; + +// Assuming EditConnectorFormValues is defined elsewhere or passed as generic +interface EditConnectorNameFormProps { + control: Control; // Use Control if type is available +} + +export function EditConnectorNameForm({ control }: EditConnectorNameFormProps) { + return ( + ( + + Connector Name + + + + )} + /> + ); +} diff --git a/surfsense_web/components/editConnector/EditGitHubConnectorConfig.tsx b/surfsense_web/components/editConnector/EditGitHubConnectorConfig.tsx new file mode 100644 index 000000000..17f83f7ac --- /dev/null +++ b/surfsense_web/components/editConnector/EditGitHubConnectorConfig.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import { UseFormReturn } from 'react-hook-form'; +import { FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage } from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Edit, KeyRound, Loader2, CircleAlert } from 'lucide-react'; + +// Types needed from parent +interface GithubRepo { + id: number; + name: string; + full_name: string; + private: boolean; + url: string; + description: string | null; + last_updated: string | null; +} +type GithubPatFormValues = { github_pat: string; }; +type EditMode = 'viewing' | 'editing_repos'; + +interface EditGitHubConnectorConfigProps { + // State from parent + editMode: EditMode; + originalPat: string; + currentSelectedRepos: string[]; + fetchedRepos: GithubRepo[] | null; + newSelectedRepos: string[]; + isFetchingRepos: boolean; + // Forms from parent + patForm: UseFormReturn; + // Handlers from parent + setEditMode: (mode: EditMode) => void; + handleFetchRepositories: (values: GithubPatFormValues) => Promise; + handleRepoSelectionChange: (repoFullName: string, checked: boolean) => void; + setNewSelectedRepos: React.Dispatch>; + setFetchedRepos: React.Dispatch>; +} + +export function EditGitHubConnectorConfig({ + editMode, + originalPat, + currentSelectedRepos, + fetchedRepos, + newSelectedRepos, + isFetchingRepos, + patForm, + setEditMode, + handleFetchRepositories, + handleRepoSelectionChange, + setNewSelectedRepos, + setFetchedRepos +}: EditGitHubConnectorConfigProps) { + + return ( +
+

Repository Selection & Access

+ + {/* Viewing Mode */} + {editMode === 'viewing' && ( +
+ Currently Indexed Repositories: + {currentSelectedRepos.length > 0 ? ( +
    + {currentSelectedRepos.map(repo =>
  • {repo}
  • )} +
+ ) : ( +

(No repositories currently selected)

+ )} + + To change repo selections or update the PAT, click above. +
+ )} + + {/* Editing Mode */} + {editMode === 'editing_repos' && ( +
+ {/* PAT Input */} +
+ ( + + GitHub PAT + + Enter PAT to fetch/update repos or if you need to update the stored token. + + + )} + /> + +
+ + {/* Repo List */} + {isFetchingRepos && } + {!isFetchingRepos && fetchedRepos !== null && ( + fetchedRepos.length === 0 ? ( + + + No Repositories Found + Check PAT & permissions. + + ) : ( +
+ Select Repositories to Index ({newSelectedRepos.length} selected): +
+ {fetchedRepos.map((repo) => ( +
+ handleRepoSelectionChange(repo.full_name, !!checked)} + /> + +
+ ))} +
+
+ ) + )} + +
+ )} +
+ ); +} diff --git a/surfsense_web/components/editConnector/EditSimpleTokenForm.tsx b/surfsense_web/components/editConnector/EditSimpleTokenForm.tsx new file mode 100644 index 000000000..c0c803209 --- /dev/null +++ b/surfsense_web/components/editConnector/EditSimpleTokenForm.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Control } from 'react-hook-form'; +import { FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage } from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { KeyRound } from 'lucide-react'; + +// Assuming EditConnectorFormValues is defined elsewhere or passed as generic +interface EditSimpleTokenFormProps { + control: Control; + fieldName: string; // e.g., "SLACK_BOT_TOKEN" + fieldLabel: string; // e.g., "Slack Bot Token" + fieldDescription: string; + placeholder?: string; +} + +export function EditSimpleTokenForm({ + control, + fieldName, + fieldLabel, + fieldDescription, + placeholder +}: EditSimpleTokenFormProps) { + return ( + ( + + {fieldLabel} + + {fieldDescription} + + + )} + /> + ); +} From 53436370d6fdbb707e37ab86614a535a7a3ea2f8 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Wed, 16 Apr 2025 21:25:29 -0700 Subject: [PATCH 16/47] refactor edit connector page for smaller file size --- .../connectors/[connector_id]/edit/page.tsx | 400 +++--------------- .../components/editConnector/types.ts | 33 ++ surfsense_web/hooks/useConnectorEditPage.ts | 210 +++++++++ surfsense_web/lib/connectors/utils.ts | 11 + 4 files changed, 312 insertions(+), 342 deletions(-) create mode 100644 surfsense_web/components/editConnector/types.ts create mode 100644 surfsense_web/hooks/useConnectorEditPage.ts create mode 100644 surfsense_web/lib/connectors/utils.ts diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx index 2032aab05..00824bc56 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx @@ -1,372 +1,90 @@ "use client"; -import { useState, useEffect } from "react"; +import React, { useEffect } from 'react'; import { useRouter, useParams } from "next/navigation"; import { motion } from "framer-motion"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { useForm } from "react-hook-form"; -import * as z from "zod"; import { toast } from "sonner"; -import { ArrowLeft, Check, Loader2, Github, } from "lucide-react"; +import { ArrowLeft, Check, Loader2, Github } from "lucide-react"; -import { useSearchSourceConnectors, SearchSourceConnector } from "@/hooks/useSearchSourceConnectors"; -import { - Form, -} from "@/components/ui/form"; +import { Form } from "@/components/ui/form"; import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, -} from "@/components/ui/card"; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; + +// Import Utils, Types, Hook, and Components +import { getConnectorTypeDisplay } from '@/lib/connectors/utils'; +import { useConnectorEditPage } from '@/hooks/useConnectorEditPage'; import { EditConnectorLoadingSkeleton } from "@/components/editConnector/EditConnectorLoadingSkeleton"; import { EditConnectorNameForm } from "@/components/editConnector/EditConnectorNameForm"; import { EditGitHubConnectorConfig } from "@/components/editConnector/EditGitHubConnectorConfig"; import { EditSimpleTokenForm } from "@/components/editConnector/EditSimpleTokenForm"; - -// Helper function to get connector type display name (copied from manage page) -const getConnectorTypeDisplay = (type: string): string => { - const typeMap: Record = { - "SERPER_API": "Serper API", - "TAVILY_API": "Tavily API", - "SLACK_CONNECTOR": "Slack", - "NOTION_CONNECTOR": "Notion", - "GITHUB_CONNECTOR": "GitHub", - }; - return typeMap[type] || type; -}; - -// Schema for PAT input when editing GitHub repos (remains separate) -const githubPatSchema = z.object({ - github_pat: z.string() - .min(20, { message: "GitHub Personal Access Token seems too short." }) - .refine(pat => pat.startsWith('ghp_') || pat.startsWith('github_pat_'), { - message: "GitHub PAT should start with 'ghp_' or 'github_pat_'", - }), -}); -type GithubPatFormValues = z.infer; - -// Updated schema for main edit form - includes optional fields for other connector configs -const editConnectorSchema = z.object({ - name: z.string().min(3, { message: "Connector name must be at least 3 characters." }), - // Add optional fields for other connector types' configs - SLACK_BOT_TOKEN: z.string().optional(), - NOTION_INTEGRATION_TOKEN: z.string().optional(), - SERPER_API_KEY: z.string().optional(), - TAVILY_API_KEY: z.string().optional(), - // GITHUB_PAT is handled separately via patForm for repo editing flow -}); -type EditConnectorFormValues = z.infer; - -interface GithubRepo { - id: number; - name: string; - full_name: string; - private: boolean; - url: string; - description: string | null; - last_updated: string | null; -} - -type EditMode = 'viewing' | 'editing_repos'; // Only relevant for GitHub - -export default function EditConnectorPage() { // Renamed for clarity +export default function EditConnectorPage() { const router = useRouter(); const params = useParams(); const searchSpaceId = params.search_space_id as string; - const connectorId = parseInt(params.connector_id as string, 10); + // Ensure connectorId is parsed safely + const connectorIdParam = params.connector_id as string; + const connectorId = connectorIdParam ? parseInt(connectorIdParam, 10) : NaN; - const { connectors, updateConnector, isLoading: connectorsLoading } = useSearchSourceConnectors(); + // Use the custom hook to manage state and logic + const { + connectorsLoading, + connector, + isSaving, + editForm, + patForm, // Needed for GitHub child component + handleSaveChanges, + // GitHub specific props for the child component + editMode, + setEditMode, // Pass down if needed by GitHub component + originalPat, + currentSelectedRepos, + fetchedRepos, + setFetchedRepos, + newSelectedRepos, + setNewSelectedRepos, + isFetchingRepos, + handleFetchRepositories, + handleRepoSelectionChange, + } = useConnectorEditPage(connectorId, searchSpaceId); - const [connector, setConnector] = useState(null); - const [originalConfig, setOriginalConfig] = useState | null>(null); // Store original config object - - // GitHub specific state (only used if connector type is GitHub) - const [currentSelectedRepos, setCurrentSelectedRepos] = useState([]); - const [originalPat, setOriginalPat] = useState(""); - const [editMode, setEditMode] = useState('viewing'); - const [fetchedRepos, setFetchedRepos] = useState(null); - const [newSelectedRepos, setNewSelectedRepos] = useState([]); - const [isFetchingRepos, setIsFetchingRepos] = useState(false); - - const [isSaving, setIsSaving] = useState(false); - - // Form for GitHub PAT input (only used for GitHub repo editing) - const patForm = useForm({ - resolver: zodResolver(githubPatSchema), - defaultValues: { github_pat: "" }, - }); - - // Main form for connector details (name + simple config fields) - const editForm = useForm({ - resolver: zodResolver(editConnectorSchema), - defaultValues: { - name: "", - SLACK_BOT_TOKEN: "", - NOTION_INTEGRATION_TOKEN: "", - SERPER_API_KEY: "", - TAVILY_API_KEY: "", - }, - }); - - // Effect to load connector data + // Redirect if connectorId is not a valid number after parsing useEffect(() => { - if (!connectorsLoading && connectors.length > 0 && !connector) { - const currentConnector = connectors.find(c => c.id === connectorId); - if (currentConnector) { - setConnector(currentConnector); - setOriginalConfig(currentConnector.config || {}); // Store original config - - // Reset main form with common and type-specific fields - editForm.reset({ - name: currentConnector.name, - SLACK_BOT_TOKEN: currentConnector.config?.SLACK_BOT_TOKEN || "", - NOTION_INTEGRATION_TOKEN: currentConnector.config?.NOTION_INTEGRATION_TOKEN || "", - SERPER_API_KEY: currentConnector.config?.SERPER_API_KEY || "", - TAVILY_API_KEY: currentConnector.config?.TAVILY_API_KEY || "", - }); - - // If GitHub, set up GitHub-specific state - if (currentConnector.connector_type === 'GITHUB_CONNECTOR') { - const savedRepos = currentConnector.config?.repo_full_names || []; - const savedPat = currentConnector.config?.GITHUB_PAT || ""; - setCurrentSelectedRepos(savedRepos); - setNewSelectedRepos(savedRepos); - setOriginalPat(savedPat); - patForm.reset({ github_pat: savedPat }); - setEditMode('viewing'); // Start in viewing mode for repos - } - } else { - toast.error("Connector not found."); - router.push(`/dashboard/${searchSpaceId}/connectors`); - } + if (isNaN(connectorId)) { + toast.error("Invalid Connector ID."); + router.push(`/dashboard/${searchSpaceId}/connectors`); } - }, [connectorId, connectors, connectorsLoading, router, searchSpaceId, connector, editForm, patForm]); - - // Fetch repositories using the entered PAT - const handleFetchRepositories = async (values: GithubPatFormValues) => { - setIsFetchingRepos(true); - setFetchedRepos(null); - try { - const token = localStorage.getItem('surfsense_bearer_token'); - if (!token) throw new Error('No authentication token found'); - - const response = await fetch( - `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/github/repositories/`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ github_pat: values.github_pat }) - } - ); - if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.detail || `Failed to fetch repositories: ${response.statusText}`); - } - const data: GithubRepo[] = await response.json(); - setFetchedRepos(data); - setNewSelectedRepos(currentSelectedRepos); - toast.success(`Found ${data.length} repositories. Select which ones to index.`); - } catch (error) { - console.error("Error fetching GitHub repositories:", error); - toast.error(error instanceof Error ? error.message : "Failed to fetch repositories."); - } finally { - setIsFetchingRepos(false); - } - }; - - // Handle checkbox changes during editing - const handleRepoSelectionChange = (repoFullName: string, checked: boolean) => { - setNewSelectedRepos(prev => - checked - ? [...prev, repoFullName] - : prev.filter(name => name !== repoFullName) - ); - }; - - // Save changes - updated to handle different connector types - const handleSaveChanges = async (formData: EditConnectorFormValues) => { - if (!connector || !originalConfig) return; - - setIsSaving(true); - const updatePayload: Partial = {}; - let configChanged = false; - let newConfig: Record | null = null; - - // 1. Check if name changed - if (formData.name !== connector.name) { - updatePayload.name = formData.name; - } - - // 2. Check for config changes based on connector type - switch (connector.connector_type) { - case 'GITHUB_CONNECTOR': - const currentPatInForm = patForm.getValues('github_pat'); - const patChanged = currentPatInForm !== originalPat; - const initialRepoSet = new Set(currentSelectedRepos); - const newRepoSet = new Set(newSelectedRepos); - const reposChanged = initialRepoSet.size !== newRepoSet.size || ![...initialRepoSet].every(repo => newRepoSet.has(repo)); - - if (patChanged || (editMode === 'editing_repos' && reposChanged && fetchedRepos !== null)) { - if (!currentPatInForm || !(currentPatInForm.startsWith('ghp_') || currentPatInForm.startsWith('github_pat_'))) { - toast.error("Invalid GitHub PAT format. Cannot save."); - setIsSaving(false); return; - } - newConfig = { - GITHUB_PAT: currentPatInForm, - repo_full_names: newSelectedRepos, - }; - if (reposChanged && newSelectedRepos.length === 0) { - toast.warning("Warning: No repositories selected."); - } - } - break; - - case 'SLACK_CONNECTOR': - if (formData.SLACK_BOT_TOKEN !== originalConfig.SLACK_BOT_TOKEN) { - if (!formData.SLACK_BOT_TOKEN) { - toast.error("Slack Bot Token cannot be empty."); setIsSaving(false); return; - } - newConfig = { SLACK_BOT_TOKEN: formData.SLACK_BOT_TOKEN }; - } - break; - - case 'NOTION_CONNECTOR': - if (formData.NOTION_INTEGRATION_TOKEN !== originalConfig.NOTION_INTEGRATION_TOKEN) { - if (!formData.NOTION_INTEGRATION_TOKEN) { - toast.error("Notion Integration Token cannot be empty."); setIsSaving(false); return; - } - newConfig = { NOTION_INTEGRATION_TOKEN: formData.NOTION_INTEGRATION_TOKEN }; - } - break; - - case 'SERPER_API': - if (formData.SERPER_API_KEY !== originalConfig.SERPER_API_KEY) { - if (!formData.SERPER_API_KEY) { - toast.error("Serper API Key cannot be empty."); setIsSaving(false); return; - } - newConfig = { SERPER_API_KEY: formData.SERPER_API_KEY }; - } - break; - - case 'TAVILY_API': - if (formData.TAVILY_API_KEY !== originalConfig.TAVILY_API_KEY) { - if (!formData.TAVILY_API_KEY) { - toast.error("Tavily API Key cannot be empty."); setIsSaving(false); return; - } - newConfig = { TAVILY_API_KEY: formData.TAVILY_API_KEY }; - } - break; - - // Add cases for other connector types if necessary - } - - // If config was determined to have changed, add it to the payload - if (newConfig !== null) { - updatePayload.config = newConfig; - configChanged = true; - } - - // 3. Check if there are actual changes to save - if (Object.keys(updatePayload).length === 0) { - toast.info("No changes detected."); - setIsSaving(false); - if (connector.connector_type === 'GITHUB_CONNECTOR') { - setEditMode('viewing'); - patForm.reset({ github_pat: originalPat }); - } - return; - } - - // 4. Proceed with update API call - try { - await updateConnector(connectorId, updatePayload); - toast.success("Connector updated successfully!"); - - // Update local state after successful save - const newlySavedConfig = updatePayload.config || originalConfig; - setOriginalConfig(newlySavedConfig); - if (updatePayload.name) { - setConnector(prev => prev ? { ...prev, name: updatePayload.name!, config: newlySavedConfig } : null); - editForm.setValue('name', updatePayload.name); - } else { - setConnector(prev => prev ? { ...prev, config: newlySavedConfig } : null); - } - - if (connector.connector_type === 'GITHUB_CONNECTOR' && configChanged) { - const savedGitHubConfig = newlySavedConfig as { GITHUB_PAT?: string; repo_full_names?: string[] }; - setCurrentSelectedRepos(savedGitHubConfig.repo_full_names || []); - setOriginalPat(savedGitHubConfig.GITHUB_PAT || ""); - setNewSelectedRepos(savedGitHubConfig.repo_full_names || []); - patForm.reset({ github_pat: savedGitHubConfig.GITHUB_PAT || "" }); - } else if (connector.connector_type === 'SLACK_CONNECTOR' && configChanged) { - editForm.setValue('SLACK_BOT_TOKEN', newlySavedConfig.SLACK_BOT_TOKEN || ""); - } // Add similar blocks for Notion, Serper, Tavily - else if (connector.connector_type === 'NOTION_CONNECTOR' && configChanged) { - editForm.setValue('NOTION_INTEGRATION_TOKEN', newlySavedConfig.NOTION_INTEGRATION_TOKEN || ""); - } else if (connector.connector_type === 'SERPER_API' && configChanged) { - editForm.setValue('SERPER_API_KEY', newlySavedConfig.SERPER_API_KEY || ""); - } else if (connector.connector_type === 'TAVILY_API' && configChanged) { - editForm.setValue('TAVILY_API_KEY', newlySavedConfig.TAVILY_API_KEY || ""); - } - - // Reset GitHub specific edit state - if (connector.connector_type === 'GITHUB_CONNECTOR') { - setEditMode('viewing'); - setFetchedRepos(null); - } - - } catch (error) { - console.error("Error updating connector:", error); - toast.error(error instanceof Error ? error.message : "Failed to update connector."); - } finally { - setIsSaving(false); - } - }; + }, [connectorId, router, searchSpaceId]); + // Loading State if (connectorsLoading || !connector) { + // Handle NaN case before showing skeleton + if (isNaN(connectorId)) return null; return ; } + // Main Render using data/handlers from the hook return (
- - + - {/* Title can be dynamic based on type */} - {/* TODO: Make icon dynamic */} + {/* TODO: Dynamic icon */} Edit {getConnectorTypeDisplay(connector.connector_type)} Connector - - Modify the connector name and configuration. - + Modify connector name and configuration. - + + {/* Pass hook's handleSaveChanges */} - {/* Name Component */} + {/* Pass form control from hook */}
@@ -376,14 +94,15 @@ export default function EditConnectorPage() { // Renamed for clarity {/* == GitHub == */} {connector.connector_type === 'GITHUB_CONNECTOR' && ( )} - {/* == Notion == */} {connector.connector_type === 'NOTION_CONNECTOR' && ( )} - - {/* == Serper API == */} + {/* == Serper == */} {connector.connector_type === 'SERPER_API' && ( )} - - {/* == Tavily API == */} + {/* == Tavily == */} {connector.connector_type === 'TAVILY_API' && ( pat.startsWith('ghp_') || pat.startsWith('github_pat_'), { + message: "GitHub PAT should start with 'ghp_' or 'github_pat_'", + }), +}); +export type GithubPatFormValues = z.infer; + +export const editConnectorSchema = z.object({ + name: z.string().min(3, { message: "Connector name must be at least 3 characters." }), + SLACK_BOT_TOKEN: z.string().optional(), + NOTION_INTEGRATION_TOKEN: z.string().optional(), + SERPER_API_KEY: z.string().optional(), + TAVILY_API_KEY: z.string().optional(), +}); +export type EditConnectorFormValues = z.infer; diff --git a/surfsense_web/hooks/useConnectorEditPage.ts b/surfsense_web/hooks/useConnectorEditPage.ts new file mode 100644 index 000000000..e75998ef9 --- /dev/null +++ b/surfsense_web/hooks/useConnectorEditPage.ts @@ -0,0 +1,210 @@ +import { useState, useEffect, useCallback } from 'react'; +import { useRouter } from 'next/navigation'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { toast } from 'sonner'; +import { useSearchSourceConnectors, SearchSourceConnector } from '@/hooks/useSearchSourceConnectors'; +import { + GithubRepo, + EditMode, + githubPatSchema, + editConnectorSchema, + GithubPatFormValues, + EditConnectorFormValues +} from '@/components/editConnector/types'; + +export function useConnectorEditPage(connectorId: number, searchSpaceId: string) { + const router = useRouter(); + const { connectors, updateConnector, isLoading: connectorsLoading } = useSearchSourceConnectors(); + + // State managed by the hook + const [connector, setConnector] = useState(null); + const [originalConfig, setOriginalConfig] = useState | null>(null); + const [isSaving, setIsSaving] = useState(false); + const [currentSelectedRepos, setCurrentSelectedRepos] = useState([]); + const [originalPat, setOriginalPat] = useState(""); + const [editMode, setEditMode] = useState('viewing'); + const [fetchedRepos, setFetchedRepos] = useState(null); + const [newSelectedRepos, setNewSelectedRepos] = useState([]); + const [isFetchingRepos, setIsFetchingRepos] = useState(false); + + // Forms managed by the hook + const patForm = useForm({ + resolver: zodResolver(githubPatSchema), + defaultValues: { github_pat: "" }, + }); + const editForm = useForm({ + resolver: zodResolver(editConnectorSchema), + defaultValues: { name: "", SLACK_BOT_TOKEN: "", NOTION_INTEGRATION_TOKEN: "", SERPER_API_KEY: "", TAVILY_API_KEY: "" }, + }); + + // Effect to load initial data + useEffect(() => { + if (!connectorsLoading && connectors.length > 0 && !connector) { + const currentConnector = connectors.find(c => c.id === connectorId); + if (currentConnector) { + setConnector(currentConnector); + const config = currentConnector.config || {}; + setOriginalConfig(config); + editForm.reset({ + name: currentConnector.name, + SLACK_BOT_TOKEN: config.SLACK_BOT_TOKEN || "", + NOTION_INTEGRATION_TOKEN: config.NOTION_INTEGRATION_TOKEN || "", + SERPER_API_KEY: config.SERPER_API_KEY || "", + TAVILY_API_KEY: config.TAVILY_API_KEY || "", + }); + if (currentConnector.connector_type === 'GITHUB_CONNECTOR') { + const savedRepos = config.repo_full_names || []; + const savedPat = config.GITHUB_PAT || ""; + setCurrentSelectedRepos(savedRepos); + setNewSelectedRepos(savedRepos); + setOriginalPat(savedPat); + patForm.reset({ github_pat: savedPat }); + setEditMode('viewing'); + } + } else { + toast.error("Connector not found."); + router.push(`/dashboard/${searchSpaceId}/connectors`); + } + } + }, [connectorId, connectors, connectorsLoading, router, searchSpaceId, connector, editForm, patForm]); + + // Handlers managed by the hook + const handleFetchRepositories = useCallback(async (values: GithubPatFormValues) => { + setIsFetchingRepos(true); + setFetchedRepos(null); + try { + const token = localStorage.getItem('surfsense_bearer_token'); + if (!token) throw new Error('No auth token'); + const response = await fetch( + `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/github/repositories/`, + { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ github_pat: values.github_pat }) } + ); + if (!response.ok) { const err = await response.json(); throw new Error(err.detail || 'Fetch failed'); } + const data: GithubRepo[] = await response.json(); + setFetchedRepos(data); + setNewSelectedRepos(currentSelectedRepos); + toast.success(`Found ${data.length} repos.`); + } catch (error) { + console.error("Error fetching GitHub repositories:", error); + toast.error(error instanceof Error ? error.message : "Failed to fetch repositories."); + } finally { setIsFetchingRepos(false); } + }, [currentSelectedRepos]); // Added dependency + + const handleRepoSelectionChange = useCallback((repoFullName: string, checked: boolean) => { + setNewSelectedRepos(prev => checked ? [...prev, repoFullName] : prev.filter(name => name !== repoFullName)); + }, []); + + const handleSaveChanges = useCallback(async (formData: EditConnectorFormValues) => { + if (!connector || !originalConfig) return; + setIsSaving(true); + const updatePayload: Partial = {}; + let configChanged = false; + let newConfig: Record | null = null; + + if (formData.name !== connector.name) { + updatePayload.name = formData.name; + } + + switch (connector.connector_type) { + case 'GITHUB_CONNECTOR': + const currentPatInForm = patForm.getValues('github_pat'); + const patChanged = currentPatInForm !== originalPat; + const initialRepoSet = new Set(currentSelectedRepos); + const newRepoSet = new Set(newSelectedRepos); + const reposChanged = initialRepoSet.size !== newRepoSet.size || ![...initialRepoSet].every(repo => newRepoSet.has(repo)); + if (patChanged || (editMode === 'editing_repos' && reposChanged && fetchedRepos !== null)) { + if (!currentPatInForm || !(currentPatInForm.startsWith('ghp_') || currentPatInForm.startsWith('github_pat_'))) { + toast.error("Invalid GitHub PAT format. Cannot save."); setIsSaving(false); return; + } + newConfig = { GITHUB_PAT: currentPatInForm, repo_full_names: newSelectedRepos }; + if (reposChanged && newSelectedRepos.length === 0) { toast.warning("Warning: No repositories selected."); } + } + break; + case 'SLACK_CONNECTOR': + if (formData.SLACK_BOT_TOKEN !== originalConfig.SLACK_BOT_TOKEN) { + if (!formData.SLACK_BOT_TOKEN) { toast.error("Slack Token empty."); setIsSaving(false); return; } + newConfig = { SLACK_BOT_TOKEN: formData.SLACK_BOT_TOKEN }; + } + break; + // ... other cases ... + case 'NOTION_CONNECTOR': + if (formData.NOTION_INTEGRATION_TOKEN !== originalConfig.NOTION_INTEGRATION_TOKEN) { + if (!formData.NOTION_INTEGRATION_TOKEN) { toast.error("Notion Token empty."); setIsSaving(false); return; } + newConfig = { NOTION_INTEGRATION_TOKEN: formData.NOTION_INTEGRATION_TOKEN }; + } + break; + case 'SERPER_API': + if (formData.SERPER_API_KEY !== originalConfig.SERPER_API_KEY) { + if (!formData.SERPER_API_KEY) { toast.error("Serper Key empty."); setIsSaving(false); return; } + newConfig = { SERPER_API_KEY: formData.SERPER_API_KEY }; + } + break; + case 'TAVILY_API': + if (formData.TAVILY_API_KEY !== originalConfig.TAVILY_API_KEY) { + if (!formData.TAVILY_API_KEY) { toast.error("Tavily Key empty."); setIsSaving(false); return; } + newConfig = { TAVILY_API_KEY: formData.TAVILY_API_KEY }; + } + break; + } + + if (newConfig !== null) { + updatePayload.config = newConfig; + configChanged = true; + } + + if (Object.keys(updatePayload).length === 0) { + toast.info("No changes detected."); + setIsSaving(false); + if (connector.connector_type === 'GITHUB_CONNECTOR') { setEditMode('viewing'); patForm.reset({ github_pat: originalPat }); } + return; + } + + try { + await updateConnector(connectorId, updatePayload); + toast.success("Connector updated!"); + const newlySavedConfig = updatePayload.config || originalConfig; + setOriginalConfig(newlySavedConfig); + if (updatePayload.name) { + setConnector(prev => prev ? { ...prev, name: updatePayload.name!, config: newlySavedConfig } : null); + } + if (connector.connector_type === 'GITHUB_CONNECTOR' && configChanged) { + const savedGitHubConfig = newlySavedConfig as { GITHUB_PAT?: string; repo_full_names?: string[] }; + setCurrentSelectedRepos(savedGitHubConfig.repo_full_names || []); + setOriginalPat(savedGitHubConfig.GITHUB_PAT || ""); + setNewSelectedRepos(savedGitHubConfig.repo_full_names || []); + patForm.reset({ github_pat: savedGitHubConfig.GITHUB_PAT || "" }); + } + if (connector.connector_type === 'GITHUB_CONNECTOR') { + setEditMode('viewing'); + setFetchedRepos(null); + } + // Resetting simple form values is handled by useEffect if connector state updates + } catch (error) { + console.error("Error updating connector:", error); + toast.error(error instanceof Error ? error.message : "Failed to update connector."); + } finally { setIsSaving(false); } + }, [connector, originalConfig, updateConnector, connectorId, patForm, originalPat, currentSelectedRepos, newSelectedRepos, editMode, fetchedRepos]); // Added dependencies + + // Return values needed by the component + return { + connectorsLoading, + connector, + isSaving, + editForm, + patForm, + handleSaveChanges, + // GitHub specific props + editMode, + setEditMode, + originalPat, + currentSelectedRepos, + fetchedRepos, + setFetchedRepos, + newSelectedRepos, + setNewSelectedRepos, + isFetchingRepos, + handleFetchRepositories, + handleRepoSelectionChange, + }; +} diff --git a/surfsense_web/lib/connectors/utils.ts b/surfsense_web/lib/connectors/utils.ts new file mode 100644 index 000000000..f0a6dab45 --- /dev/null +++ b/surfsense_web/lib/connectors/utils.ts @@ -0,0 +1,11 @@ +// Helper function to get connector type display name +export const getConnectorTypeDisplay = (type: string): string => { + const typeMap: Record = { + "SERPER_API": "Serper API", + "TAVILY_API": "Tavily API", + "SLACK_CONNECTOR": "Slack", + "NOTION_CONNECTOR": "Notion", + "GITHUB_CONNECTOR": "GitHub", + }; + return typeMap[type] || type; +}; From 32c721113cda58763ec3e28f6b4809014952f416 Mon Sep 17 00:00:00 2001 From: Adamsmith6300 Date: Wed, 16 Apr 2025 22:06:50 -0700 Subject: [PATCH 17/47] update edit connectors page to support linear connector --- .../routes/search_source_connectors_routes.py | 6 +- .../connectors/[connector_id]/edit/page.tsx | 11 +++ .../components/editConnector/types.ts | 1 + surfsense_web/hooks/useConnectorEditPage.ts | 72 +++++++++++++------ surfsense_web/lib/connectors/utils.ts | 1 + 5 files changed, 68 insertions(+), 23 deletions(-) diff --git a/surfsense_backend/app/routes/search_source_connectors_routes.py b/surfsense_backend/app/routes/search_source_connectors_routes.py index 6c0349687..786c19dfb 100644 --- a/surfsense_backend/app/routes/search_source_connectors_routes.py +++ b/surfsense_backend/app/routes/search_source_connectors_routes.py @@ -18,8 +18,9 @@ from app.db import get_async_session, User, SearchSourceConnector, SearchSourceC from app.schemas import SearchSourceConnectorCreate, SearchSourceConnectorUpdate, SearchSourceConnectorRead, SearchSourceConnectorBase from app.users import current_active_user from app.utils.check_ownership import check_ownership -from pydantic import ValidationError +from pydantic import BaseModel, Field, ValidationError from app.tasks.connectors_indexing_tasks import index_slack_messages, index_notion_pages, index_github_repos, index_linear_issues +from app.connectors.github_connector import GitHubConnector from datetime import datetime, timezone, timedelta import logging @@ -28,7 +29,7 @@ logger = logging.getLogger(__name__) router = APIRouter() -# --- New Schema for GitHub PAT --- +# Use Pydantic's BaseModel here class GitHubPATRequest(BaseModel): github_pat: str = Field(..., description="GitHub Personal Access Token") @@ -104,6 +105,7 @@ async def create_search_source_connector( await session.rollback() raise except Exception as e: + logger.error(f"Failed to create search source connector: {str(e)}") await session.rollback() raise HTTPException( status_code=500, diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx index 00824bc56..d41295faa 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx @@ -149,6 +149,17 @@ export default function EditConnectorPage() { /> )} + {/* == Linear == */} + {connector.connector_type === 'LINEAR_CONNECTOR' && ( + + )} +
}> - + ); } \ No newline at end of file diff --git a/surfsense_web/components/sidebar/AppSidebarProvider.tsx b/surfsense_web/components/sidebar/AppSidebarProvider.tsx index c4306e98f..679157c1f 100644 --- a/surfsense_web/components/sidebar/AppSidebarProvider.tsx +++ b/surfsense_web/components/sidebar/AppSidebarProvider.tsx @@ -118,8 +118,8 @@ export function AppSidebarProvider({ if (typeof window === 'undefined') return; try { - // Use the API client instead of direct fetch - const chats: Chat[] = await apiClient.get('api/v1/chats/?limit=5&skip=0'); + // Use the API client instead of direct fetch - filter by current search space ID + const chats: Chat[] = await apiClient.get(`api/v1/chats/?limit=5&skip=0&search_space_id=${searchSpaceId}`); // Transform API response to the format expected by AppSidebar const formattedChats = chats.map(chat => ({ @@ -170,7 +170,7 @@ export function AppSidebarProvider({ // Clean up interval on component unmount return () => clearInterval(intervalId); - }, []); + }, [searchSpaceId]); // Handle delete chat const handleDeleteChat = async () => { diff --git a/surfsense_web/hooks/use-documents.ts b/surfsense_web/hooks/use-documents.ts index 923d6e04e..cfe2b0546 100644 --- a/surfsense_web/hooks/use-documents.ts +++ b/surfsense_web/hooks/use-documents.ts @@ -22,7 +22,7 @@ export function useDocuments(searchSpaceId: number) { try { setLoading(true); const response = await fetch( - `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/documents`, + `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/documents?search_space_id=${searchSpaceId}`, { headers: { Authorization: `Bearer ${localStorage.getItem('surfsense_bearer_token')}`, @@ -57,7 +57,7 @@ export function useDocuments(searchSpaceId: number) { setLoading(true); try { const response = await fetch( - `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/documents`, + `${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/api/v1/documents?search_space_id=${searchSpaceId}`, { headers: { Authorization: `Bearer ${localStorage.getItem('surfsense_bearer_token')}`, From 34300ead029c6ccd445dc6d516d5ee8b24fd95f9 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sat, 19 Apr 2025 23:25:06 -0700 Subject: [PATCH 19/47] feat: Initial version of SurfSense own LangGraph Agent. --- surfsense_backend/app/agents/__init__.py | 1 + .../app/agents/researcher/configuration.py | 30 ++ .../app/agents/researcher/graph.py | 43 ++ .../app/agents/researcher/nodes.py | 476 ++++++++++++++++++ .../app/agents/researcher/prompts.py | 91 ++++ .../app/agents/researcher/state.py | 30 ++ .../sub_section_writer/configuration.py | 7 +- .../researcher/sub_section_writer/graph.py | 12 +- .../researcher/sub_section_writer/nodes.py | 221 +++----- .../researcher/sub_section_writer/prompts.py | 4 + .../researcher/sub_section_writer/state.py | 2 +- .../app/agents/researcher/test_researcher.py | 132 +++++ surfsense_backend/app/config/__init__.py | 2 - 13 files changed, 884 insertions(+), 167 deletions(-) create mode 100644 surfsense_backend/app/agents/researcher/configuration.py create mode 100644 surfsense_backend/app/agents/researcher/graph.py create mode 100644 surfsense_backend/app/agents/researcher/nodes.py create mode 100644 surfsense_backend/app/agents/researcher/prompts.py create mode 100644 surfsense_backend/app/agents/researcher/state.py create mode 100644 surfsense_backend/app/agents/researcher/test_researcher.py diff --git a/surfsense_backend/app/agents/__init__.py b/surfsense_backend/app/agents/__init__.py index e69de29bb..944afebc6 100644 --- a/surfsense_backend/app/agents/__init__.py +++ b/surfsense_backend/app/agents/__init__.py @@ -0,0 +1 @@ +"""This is upcoming research agent. Work in progress.""" \ No newline at end of file diff --git a/surfsense_backend/app/agents/researcher/configuration.py b/surfsense_backend/app/agents/researcher/configuration.py new file mode 100644 index 000000000..8ba3849a3 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/configuration.py @@ -0,0 +1,30 @@ +"""Define the configurable parameters for the agent.""" + +from __future__ import annotations + +from dataclasses import dataclass, fields +from typing import Optional, List, Any + +from langchain_core.runnables import RunnableConfig + + +@dataclass(kw_only=True) +class Configuration: + """The configuration for the agent.""" + + # Input parameters provided at invocation + user_query: str + num_sections: int + connectors_to_search: List[str] + user_id: str + search_space_id: int + + + @classmethod + def from_runnable_config( + cls, config: Optional[RunnableConfig] = None + ) -> Configuration: + """Create a Configuration instance from a RunnableConfig object.""" + configurable = (config.get("configurable") or {}) if config else {} + _fields = {f.name for f in fields(cls) if f.init} + return cls(**{k: v for k, v in configurable.items() if k in _fields}) diff --git a/surfsense_backend/app/agents/researcher/graph.py b/surfsense_backend/app/agents/researcher/graph.py new file mode 100644 index 000000000..31835da4a --- /dev/null +++ b/surfsense_backend/app/agents/researcher/graph.py @@ -0,0 +1,43 @@ +from langgraph.graph import StateGraph +from .state import State +from .nodes import write_answer_outline, process_sections +from .configuration import Configuration +from typing import TypedDict, List, Dict, Any, Optional + +# Define what keys are in our state dict +class GraphState(TypedDict): + # Intermediate data produced during workflow + answer_outline: Optional[Any] + # Final output + final_written_report: Optional[str] + +def build_graph(): + """ + Build and return the LangGraph workflow. + + This function constructs the researcher agent graph with proper state management + and node connections following LangGraph best practices. + + Returns: + A compiled LangGraph workflow + """ + # Define a new graph with state class + workflow = StateGraph(State, config_schema=Configuration) + + # Add nodes to the graph + workflow.add_node("write_answer_outline", write_answer_outline) + workflow.add_node("process_sections", process_sections) + + # Define the edges - create a linear flow + workflow.add_edge("__start__", "write_answer_outline") + workflow.add_edge("write_answer_outline", "process_sections") + workflow.add_edge("process_sections", "__end__") + + # Compile the workflow into an executable graph + graph = workflow.compile() + graph.name = "Surfsense Researcher" # This defines the custom name in LangSmith + + return graph + +# Compile the graph once when the module is loaded +graph = build_graph() diff --git a/surfsense_backend/app/agents/researcher/nodes.py b/surfsense_backend/app/agents/researcher/nodes.py new file mode 100644 index 000000000..9a0f62cf7 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/nodes.py @@ -0,0 +1,476 @@ +from .configuration import Configuration +from langchain_core.runnables import RunnableConfig +from .state import State +from typing import Any, Dict, List +from app.config import config as app_config +from .prompts import answer_outline_system_prompt +from langchain_core.messages import HumanMessage, SystemMessage +from pydantic import BaseModel, Field +import json +import asyncio +from .sub_section_writer.graph import graph as sub_section_writer_graph +from app.utils.connector_service import ConnectorService +from app.utils.reranker_service import RerankerService +from sqlalchemy.ext.asyncio import AsyncSession +import copy + +class Section(BaseModel): + """A section in the answer outline.""" + section_id: int = Field(..., description="The zero-based index of the section") + section_title: str = Field(..., description="The title of the section") + questions: List[str] = Field(..., description="Questions to research for this section") + +class AnswerOutline(BaseModel): + """The complete answer outline with all sections.""" + answer_outline: List[Section] = Field(..., description="List of sections in the answer outline") + +async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str, Any]: + """ + Create a structured answer outline based on the user query. + + This node takes the user query and number of sections from the configuration and uses + an LLM to generate a comprehensive outline with logical sections and research questions + for each section. + + Returns: + Dict containing the answer outline in the "answer_outline" key for state update. + """ + + # Get configuration from runnable config + configuration = Configuration.from_runnable_config(config) + user_query = configuration.user_query + num_sections = configuration.num_sections + + # Initialize LLM + llm = app_config.strategic_llm_instance + + # Create the human message content + human_message_content = f""" + Now Please create an answer outline for the following query: + + User Query: {user_query} + Number of Sections: {num_sections} + + Remember to format your response as valid JSON exactly matching this structure: + {{ + "answer_outline": [ + {{ + "section_id": 0, + "section_title": "Section Title", + "questions": [ + "Question 1 to research for this section", + "Question 2 to research for this section" + ] + }} + ] + }} + + Your output MUST be valid JSON in exactly this format. Do not include any other text or explanation. + """ + + # Create messages for the LLM + messages = [ + SystemMessage(content=answer_outline_system_prompt), + HumanMessage(content=human_message_content) + ] + + # Call the LLM directly without using structured output + response = await llm.ainvoke(messages) + + # Parse the JSON response manually + try: + # Extract JSON content from the response + content = response.content + + # Find the JSON in the content (handle case where LLM might add additional text) + json_start = content.find('{') + json_end = content.rfind('}') + 1 + if json_start >= 0 and json_end > json_start: + json_str = content[json_start:json_end] + + # Parse the JSON string + parsed_data = json.loads(json_str) + + # Convert to Pydantic model + answer_outline = AnswerOutline(**parsed_data) + + print(f"Successfully generated answer outline with {len(answer_outline.answer_outline)} sections") + + # Return state update + return {"answer_outline": answer_outline} + else: + # If JSON structure not found, raise a clear error + raise ValueError(f"Could not find valid JSON in LLM response. Raw response: {content}") + + except (json.JSONDecodeError, ValueError) as e: + # Log the error and re-raise it + print(f"Error parsing LLM response: {str(e)}") + print(f"Raw response: {response.content}") + raise + +async def fetch_relevant_documents( + research_questions: List[str], + user_id: str, + search_space_id: int, + db_session: AsyncSession, + connectors_to_search: List[str], + top_k: int = 5 +) -> List[Dict[str, Any]]: + """ + Fetch relevant documents for research questions using the provided connectors. + + Args: + section_title: The title of the section being researched + research_questions: List of research questions to find documents for + user_id: The user ID + search_space_id: The search space ID + db_session: The database session + connectors_to_search: List of connectors to search + top_k: Number of top results to retrieve per connector per question + + Returns: + List of relevant documents + """ + # Initialize services + connector_service = ConnectorService(db_session) + reranker_service = RerankerService.get_reranker_instance(app_config) + + all_raw_documents = [] # Store all raw documents before reranking + + for user_query in research_questions: + # Use original research question as the query + reformulated_query = user_query + + # Process each selected connector + for connector in connectors_to_search: + try: + if connector == "YOUTUBE_VIDEO": + _, youtube_chunks = await connector_service.search_youtube( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + all_raw_documents.extend(youtube_chunks) + + elif connector == "EXTENSION": + _, extension_chunks = await connector_service.search_extension( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + all_raw_documents.extend(extension_chunks) + + elif connector == "CRAWLED_URL": + _, crawled_urls_chunks = await connector_service.search_crawled_urls( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + all_raw_documents.extend(crawled_urls_chunks) + + elif connector == "FILE": + _, files_chunks = await connector_service.search_files( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + all_raw_documents.extend(files_chunks) + + elif connector == "TAVILY_API": + _, tavily_chunks = await connector_service.search_tavily( + user_query=reformulated_query, + user_id=user_id, + top_k=top_k + ) + all_raw_documents.extend(tavily_chunks) + + elif connector == "SLACK_CONNECTOR": + _, slack_chunks = await connector_service.search_slack( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + all_raw_documents.extend(slack_chunks) + + elif connector == "NOTION_CONNECTOR": + _, notion_chunks = await connector_service.search_notion( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + all_raw_documents.extend(notion_chunks) + except Exception as e: + print(f"Error searching connector {connector}: {str(e)}") + # Continue with other connectors on error + continue + + # Deduplicate documents based on chunk_id or content + seen_chunk_ids = set() + seen_content_hashes = set() + deduplicated_docs = [] + + for doc in all_raw_documents: + chunk_id = doc.get("chunk_id") + content = doc.get("content", "") + content_hash = hash(content) + + # Skip if we've seen this chunk_id or content before + if (chunk_id and chunk_id in seen_chunk_ids) or content_hash in seen_content_hashes: + continue + + # Add to our tracking sets and keep this document + if chunk_id: + seen_chunk_ids.add(chunk_id) + seen_content_hashes.add(content_hash) + deduplicated_docs.append(doc) + + return deduplicated_docs + +async def process_section( + section_title: str, + user_id: str, + search_space_id: int, + session_maker, + research_questions: List[str], + connectors_to_search: List[str] +) -> str: + """ + Process a single section by sending it to the sub_section_writer graph. + + Args: + section_title: The title of the section + user_id: The user ID + search_space_id: The search space ID + session_maker: Factory for creating new database sessions + research_questions: List of research questions for this section + connectors_to_search: List of connectors to search + + Returns: + The written section content + """ + try: + # Create a new database session for this section + async with session_maker() as db_session: + # Fetch relevant documents using all research questions for this section + relevant_documents = await fetch_relevant_documents( + section_title=section_title, + research_questions=research_questions, + user_id=user_id, + search_space_id=search_space_id, + db_session=db_session, + connectors_to_search=connectors_to_search + ) + + # Fallback if no documents found + if not relevant_documents: + print(f"No relevant documents found for section: {section_title}") + relevant_documents = [ + { + "content": f"No specific information was found for: {question}" + for question in research_questions + } + ] + + # Call the sub_section_writer graph with the appropriate config + config = { + "configurable": { + "sub_section_title": section_title, + "relevant_documents": relevant_documents, + "user_id": user_id, + "search_space_id": search_space_id + } + } + + # Create the initial state with db_session + state = {"db_session": db_session} + + # Invoke the sub-section writer graph + print(f"Invoking sub_section_writer for: {section_title}") + result = await sub_section_writer_graph.ainvoke(state, config) + + # Return the final answer from the sub_section_writer + final_answer = result.get("final_answer", "No content was generated for this section.") + return final_answer + except Exception as e: + print(f"Error processing section '{section_title}': {str(e)}") + return f"Error processing section: {section_title}. Details: {str(e)}" + +async def process_sections(state: State, config: RunnableConfig) -> Dict[str, Any]: + """ + Process all sections in parallel and combine the results. + + This node takes the answer outline from the previous step, fetches relevant documents + for all questions across all sections once, and then processes each section in parallel + using the sub_section_writer graph with the shared document pool. + + Returns: + Dict containing the final written report in the "final_written_report" key. + """ + # Get configuration and answer outline from state + configuration = Configuration.from_runnable_config(config) + answer_outline = state.answer_outline + + print(f"Processing sections from outline: {answer_outline is not None}") + + if not answer_outline: + return { + "final_written_report": "No answer outline was provided. Cannot generate final report." + } + + # Create session maker from the engine or directly use the session + from sqlalchemy.ext.asyncio import AsyncSession + from sqlalchemy.orm import sessionmaker + + # Use the engine if available, otherwise create a new session for each task + if state.engine: + session_maker = sessionmaker( + state.engine, class_=AsyncSession, expire_on_commit=False + ) + else: + # Fallback to using the same session (less optimal but will work) + print("Warning: No engine available. Using same session for all tasks.") + # Create a mock session maker that returns the same session + async def mock_session_maker(): + class ContextManager: + async def __aenter__(self): + return state.db_session + async def __aexit__(self, exc_type, exc_val, exc_tb): + pass + return ContextManager() + session_maker = mock_session_maker + + # Collect all questions from all sections + all_questions = [] + for section in answer_outline.answer_outline: + all_questions.extend(section.questions) + + print(f"Collected {len(all_questions)} questions from all sections") + + # Fetch relevant documents once for all questions + relevant_documents = [] + async with session_maker() as db_session: + + relevant_documents = await fetch_relevant_documents( + research_questions=all_questions, + user_id=configuration.user_id, + search_space_id=configuration.search_space_id, + db_session=db_session, + connectors_to_search=configuration.connectors_to_search + ) + + print(f"Fetched {len(relevant_documents)} relevant documents for all sections") + + # Create tasks to process each section in parallel with the same document set + section_tasks = [] + for section in answer_outline.answer_outline: + section_tasks.append( + process_section_with_documents( + section_title=section.section_title, + section_questions=section.questions, + user_id=configuration.user_id, + search_space_id=configuration.search_space_id, + session_maker=session_maker, + relevant_documents=relevant_documents + ) + ) + + # Run all section processing tasks in parallel + print(f"Running {len(section_tasks)} section processing tasks in parallel") + section_results = await asyncio.gather(*section_tasks, return_exceptions=True) + + # Handle any exceptions in the results + processed_results = [] + for i, result in enumerate(section_results): + if isinstance(result, Exception): + section_title = answer_outline.answer_outline[i].section_title + error_message = f"Error processing section '{section_title}': {str(result)}" + print(error_message) + processed_results.append(error_message) + else: + processed_results.append(result) + + # Combine the results into a final report with section titles + final_report = [] + for i, (section, content) in enumerate(zip(answer_outline.answer_outline, processed_results)): + section_header = f"## {section.section_title}" + final_report.append(section_header) + final_report.append(content) + final_report.append("\n") # Add spacing between sections + + # Join all sections with newlines + final_written_report = "\n".join(final_report) + print(f"Generated final report with {len(final_report)} parts") + + return { + "final_written_report": final_written_report + } + +async def process_section_with_documents( + section_title: str, + section_questions: List[str], + user_id: str, + search_space_id: int, + session_maker, + relevant_documents: List[Dict[str, Any]] +) -> str: + """ + Process a single section using pre-fetched documents. + + Args: + section_title: The title of the section + section_questions: List of research questions for this section + user_id: The user ID + search_space_id: The search space ID + session_maker: Factory for creating new database sessions + relevant_documents: Pre-fetched documents to use for this section + + Returns: + The written section content + """ + try: + # Create a new database session for this section + async with session_maker() as db_session: + # Use the provided documents + documents_to_use = relevant_documents + + # Fallback if no documents found + if not documents_to_use: + print(f"No relevant documents found for section: {section_title}") + documents_to_use = [ + { + "content": f"No specific information was found for: {question}" + for question in section_questions + } + ] + + # Call the sub_section_writer graph with the appropriate config + config = { + "configurable": { + "sub_section_title": section_title, + "sub_section_questions": section_questions, + "relevant_documents": documents_to_use, + "user_id": user_id, + "search_space_id": search_space_id + } + } + + # Create the initial state with db_session + state = {"db_session": db_session} + + # Invoke the sub-section writer graph + print(f"Invoking sub_section_writer for: {section_title}") + result = await sub_section_writer_graph.ainvoke(state, config) + + # Return the final answer from the sub_section_writer + final_answer = result.get("final_answer", "No content was generated for this section.") + return final_answer + except Exception as e: + print(f"Error processing section '{section_title}': {str(e)}") + return f"Error processing section: {section_title}. Details: {str(e)}" + diff --git a/surfsense_backend/app/agents/researcher/prompts.py b/surfsense_backend/app/agents/researcher/prompts.py new file mode 100644 index 000000000..0895590eb --- /dev/null +++ b/surfsense_backend/app/agents/researcher/prompts.py @@ -0,0 +1,91 @@ +import datetime + + +answer_outline_system_prompt = f""" +Today's date: {datetime.datetime.now().strftime("%Y-%m-%d")} + +You are an expert research assistant specializing in structuring information. Your task is to create a detailed and logical research outline based on the user's query. This outline will serve as the blueprint for generating a comprehensive research report. + + +- user_query (string): The main question or topic the user wants researched. This guides the entire outline creation process. +- num_sections (integer): The target number of distinct sections the final research report should have. This helps control the granularity and structure of the outline. + + + +A JSON object with the following structure: +{{ + "answer_outline": [ + {{ + "section_id": 0, + "section_title": "Section Title", + "questions": [ + "Question 1 to research for this section", + "Question 2 to research for this section" + ] + }} + ] +}} + + + +1. **Deconstruct the `user_query`:** Identify the key concepts, entities, and the core information requested by the user. +2. **Determine Section Themes:** Based on the analysis and the requested `num_sections`, divide the topic into distinct, logical themes or sub-topics. Each theme will become a section. Ensure these themes collectively address the `user_query` comprehensively. +3. **Develop Sections:** For *each* of the `num_sections`: + * **Assign `section_id`:** Start with 0 and increment sequentially for each section. + * **Craft `section_title`:** Write a concise, descriptive title that clearly defines the scope and focus of the section's theme. + * **Formulate Research `questions`:** Generate 2 to 5 specific, targeted research questions for this section. These questions must: + * Directly relate to the `section_title` and explore its key aspects. + * Be answerable through focused research (e.g., searching documents, databases, or knowledge bases). + * Be distinct from each other and from questions in other sections. Avoid redundancy. + * Collectively guide the gathering of information needed to fully address the section's theme. +4. **Ensure Logical Flow:** Arrange the sections in a coherent and intuitive sequence. Consider structures like: + * General background -> Specific details -> Analysis/Comparison -> Applications/Implications + * Problem definition -> Proposed solutions -> Evaluation -> Conclusion + * Chronological progression +5. **Verify Completeness and Cohesion:** Review the entire outline (`section_titles` and `questions`) to confirm that: + * All sections together provide a complete and well-structured answer to the original `user_query`. + * There are no significant overlaps or gaps in coverage between sections. +6. **Adhere Strictly to Output Format:** Ensure the final output is a valid JSON object matching the specified structure exactly, including correct field names (`answer_outline`, `section_id`, `section_title`, `questions`) and data types. + + + +User Query: "What are the health benefits of meditation?" +Number of Sections: 3 + +{{ + "answer_outline": [ + {{ + "section_id": 0, + "section_title": "Physical Health Benefits of Meditation", + "questions": [ + "What physiological changes occur in the body during meditation?", + "How does regular meditation affect blood pressure and heart health?", + "What impact does meditation have on inflammation and immune function?", + "Can meditation help with pain management, and if so, how?" + ] + }}, + {{ + "section_id": 1, + "section_title": "Mental Health Benefits of Meditation", + "questions": [ + "How does meditation affect stress and anxiety levels?", + "What changes in brain structure or function have been observed in meditation practitioners?", + "Can meditation help with depression and mood disorders?", + "What is the relationship between meditation and cognitive function?" + ] + }}, + {{ + "section_id": 2, + "section_title": "Best Meditation Practices for Maximum Benefits", + "questions": [ + "What are the most effective meditation techniques for beginners?", + "How long and how frequently should one meditate to see benefits?", + "Are there specific meditation approaches best suited for particular health goals?", + "What common obstacles prevent people from experiencing meditation benefits?" + ] + }} + ] +}} + + +""" \ No newline at end of file diff --git a/surfsense_backend/app/agents/researcher/state.py b/surfsense_backend/app/agents/researcher/state.py new file mode 100644 index 000000000..483e96ac9 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/state.py @@ -0,0 +1,30 @@ +"""Define the state structures for the agent.""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import List, Optional, Any, Dict, Annotated +from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine +from langchain_core.messages import BaseMessage, HumanMessage +from pydantic import BaseModel + +@dataclass +class State: + """Defines the dynamic state for the agent during execution. + + This state tracks the database session and the outputs generated by the agent's nodes. + See: https://langchain-ai.github.io/langgraph/concepts/low_level/#state + for more information. + """ + # Runtime context (not part of actual graph state) + db_session: AsyncSession + engine: Optional[AsyncEngine] = None + + # Intermediate state - populated during workflow + # Using field to explicitly mark as part of state + answer_outline: Optional[Any] = field(default=None) + + # OUTPUT: Populated by agent nodes + # Using field to explicitly mark as part of state + final_written_report: Optional[str] = field(default=None) + diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py b/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py index b34090e7c..fbde94d57 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py @@ -3,7 +3,7 @@ from __future__ import annotations from dataclasses import dataclass, fields -from typing import Optional, List +from typing import Optional, List, Any from langchain_core.runnables import RunnableConfig @@ -14,11 +14,10 @@ class Configuration: # Input parameters provided at invocation sub_section_title: str - sub_questions: List[str] - connectors_to_search: List[str] + sub_section_questions: List[str] + relevant_documents: List[Any] # Documents provided directly to the agent user_id: str search_space_id: int - top_k: int = 20 # Default top_k value @classmethod diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py b/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py index e250cdee5..5a5a5bad2 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/graph.py @@ -1,20 +1,18 @@ from langgraph.graph import StateGraph from .state import State -from .nodes import fetch_relevant_documents, write_sub_section +from .nodes import write_sub_section, rerank_documents from .configuration import Configuration # Define a new graph workflow = StateGraph(State, config_schema=Configuration) # Add the nodes to the graph -workflow.add_node("fetch_relevant_documents", fetch_relevant_documents) +workflow.add_node("rerank_documents", rerank_documents) workflow.add_node("write_sub_section", write_sub_section) -# Entry point -workflow.add_edge("__start__", "fetch_relevant_documents") -# Connect fetch_relevant_documents to write_sub_section -workflow.add_edge("fetch_relevant_documents", "write_sub_section") -# Exit point +# Connect the nodes +workflow.add_edge("__start__", "rerank_documents") +workflow.add_edge("rerank_documents", "write_sub_section") workflow.add_edge("write_sub_section", "__end__") # Compile the workflow into an executable graph diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py index 52fa877c9..a3384d95c 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py @@ -1,172 +1,80 @@ from .configuration import Configuration from langchain_core.runnables import RunnableConfig from .state import State -from typing import Any, Dict -from app.utils.connector_service import ConnectorService -from app.utils.reranker_service import RerankerService +from typing import Any, Dict, List from app.config import config as app_config from .prompts import citation_system_prompt from langchain_core.messages import HumanMessage, SystemMessage -async def fetch_relevant_documents(state: State, config: RunnableConfig) -> Dict[str, Any]: +async def rerank_documents(state: State, config: RunnableConfig) -> Dict[str, Any]: """ - Fetch relevant documents for the sub-section using specified connectors. + Rerank the documents based on relevance to the sub-section title. - This node retrieves documents from various data sources based on the sub-questions - derived from the sub-section title. It searches across all selected connectors - (YouTube, Extension, Crawled URLs, Files, Tavily API, Slack, Notion) and reranks - the results to provide the most relevant information for the agent workflow. + This node takes the relevant documents provided in the configuration, + reranks them using the reranker service based on the sub-section title, + and updates the state with the reranked documents. Returns: - Dict containing the reranked documents in the "relevant_documents_fetched" key. + Dict containing the reranked documents. """ - # Get configuration + # Get configuration and relevant documents configuration = Configuration.from_runnable_config(config) - - # Extract state parameters - db_session = state.db_session - - # Extract config parameters - user_id = configuration.user_id - search_space_id = configuration.search_space_id - TOP_K = configuration.top_k - - # Initialize services - connector_service = ConnectorService(db_session) - reranker_service = RerankerService.get_reranker_instance(app_config) + documents = configuration.relevant_documents + sub_section_questions = configuration.sub_section_questions - all_raw_documents = [] # Store all raw documents before reranking + # If no documents were provided, return empty list + if not documents or len(documents) == 0: + return { + "reranked_documents": [] + } - for user_query in configuration.sub_questions: - # Reformulate query (optional, consider if needed for each sub-question) - # reformulated_query = await QueryService.reformulate_query(user_query) - reformulated_query = user_query # Using original sub-question for now - - # Process each selected connector - for connector in configuration.connectors_to_search: - if connector == "YOUTUBE_VIDEO": - _, youtube_chunks = await connector_service.search_youtube( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - all_raw_documents.extend(youtube_chunks) - - elif connector == "EXTENSION": - _, extension_chunks = await connector_service.search_extension( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - all_raw_documents.extend(extension_chunks) - - elif connector == "CRAWLED_URL": - _, crawled_urls_chunks = await connector_service.search_crawled_urls( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - all_raw_documents.extend(crawled_urls_chunks) - - elif connector == "FILE": - _, files_chunks = await connector_service.search_files( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - all_raw_documents.extend(files_chunks) - - elif connector == "TAVILY_API": - _, tavily_chunks = await connector_service.search_tavily( - user_query=reformulated_query, - user_id=user_id, - top_k=TOP_K - ) - all_raw_documents.extend(tavily_chunks) - - elif connector == "SLACK_CONNECTOR": - _, slack_chunks = await connector_service.search_slack( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - all_raw_documents.extend(slack_chunks) - - elif connector == "NOTION_CONNECTOR": - _, notion_chunks = await connector_service.search_notion( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - all_raw_documents.extend(notion_chunks) + # Get reranker service from app config + reranker_service = getattr(app_config, "reranker_service", None) - # If we have documents and a reranker is available, rerank them - # Deduplicate documents based on chunk_id or content to avoid processing duplicates - seen_chunk_ids = set() - seen_content_hashes = set() - deduplicated_docs = [] + # Use documents as is if no reranker service is available + reranked_docs = documents - for doc in all_raw_documents: - chunk_id = doc.get("chunk_id") - content = doc.get("content", "") - content_hash = hash(content) - - # Skip if we've seen this chunk_id or content before - if (chunk_id and chunk_id in seen_chunk_ids) or content_hash in seen_content_hashes: - continue + if reranker_service: + try: + # Use the sub-section questions for reranking context + rerank_query = "\n".join(sub_section_questions) - # Add to our tracking sets and keep this document - if chunk_id: - seen_chunk_ids.add(chunk_id) - seen_content_hashes.add(content_hash) - deduplicated_docs.append(doc) + # Convert documents to format expected by reranker if needed + reranker_input_docs = [ + { + "chunk_id": doc.get("chunk_id", f"chunk_{i}"), + "content": doc.get("content", ""), + "score": doc.get("score", 0.0), + "document": { + "id": doc.get("document", {}).get("id", ""), + "title": doc.get("document", {}).get("title", ""), + "document_type": doc.get("document", {}).get("document_type", ""), + "metadata": doc.get("document", {}).get("metadata", {}) + } + } for i, doc in enumerate(documents) + ] + + # Rerank documents using the section title + reranked_docs = reranker_service.rerank_documents(rerank_query, reranker_input_docs) + + # Sort by score in descending order + reranked_docs.sort(key=lambda x: x.get("score", 0), reverse=True) + + print(f"Reranked {len(reranked_docs)} documents for section: {configuration.sub_section_title}") + except Exception as e: + print(f"Error during reranking: {str(e)}") + # Use original docs if reranking fails - # Use deduplicated documents for reranking - reranked_docs = deduplicated_docs - if deduplicated_docs and reranker_service: - # Use the main sub_section_title for reranking context - rerank_query = configuration.sub_section_title - - # Convert documents to format expected by reranker - reranker_input_docs = [ - { - "chunk_id": doc.get("chunk_id", f"chunk_{i}"), - "content": doc.get("content", ""), - "score": doc.get("score", 0.0), - "document": { - "id": doc.get("document", {}).get("id", ""), - "title": doc.get("document", {}).get("title", ""), - "document_type": doc.get("document", {}).get("document_type", ""), - "metadata": doc.get("document", {}).get("metadata", {}) - } - } for i, doc in enumerate(deduplicated_docs) - ] - - # Rerank documents using the main title query - reranked_docs = reranker_service.rerank_documents(rerank_query, reranker_input_docs) - - # Sort by score in descending order - reranked_docs.sort(key=lambda x: x.get("score", 0), reverse=True) - - # Update state with fetched documents return { - "relevant_documents_fetched": reranked_docs + "reranked_documents": reranked_docs } - - async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, Any]: """ - Write the sub-section using the fetched documents. + Write the sub-section using the provided documents. - This node takes the relevant documents fetched in the previous node and uses - an LLM to generate a comprehensive answer to the sub-section questions with + This node takes the relevant documents provided in the configuration and uses + an LLM to generate a comprehensive answer to the sub-section title with proper citations. The citations follow IEEE format using source IDs from the documents. @@ -174,17 +82,17 @@ async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, A Dict containing the final answer in the "final_answer" key. """ - # Get configuration and relevant documents + # Get configuration and relevant documents from configuration configuration = Configuration.from_runnable_config(config) - documents = state.relevant_documents_fetched + documents = configuration.relevant_documents # Initialize LLM llm = app_config.fast_llm_instance - # If no documents were found, return a message indicating this + # If no documents were provided, return a message indicating this if not documents or len(documents) == 0: return { - "final_answer": "No relevant documents were found to answer this question. Please try refining your search or providing more specific questions." + "final_answer": "No relevant documents were provided to answer this question. Please provide documents or try a different approach." } # Prepare documents for citation formatting @@ -208,18 +116,25 @@ async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, A """ formatted_documents.append(formatted_doc) - # Create the query that combines the section title and questions - # section_title = configuration.sub_section_title - questions = "\n".join([f"- {q}" for q in configuration.sub_questions]) + # Create the query that uses the section title and questions + section_title = configuration.sub_section_title + sub_section_questions = configuration.sub_section_questions documents_text = "\n".join(formatted_documents) + # Format the questions as bullet points for clarity + questions_text = "\n".join([f"- {question}" for question in sub_section_questions]) + # Construct a clear, structured query for the LLM human_message_content = f""" Please write a comprehensive answer for the title: - Address the following questions: + + {section_title} + + + Focus on answering these specific questions related to the title: - {questions} + {questions_text} Use the provided documents as your source material and cite them properly using the IEEE citation format [X] where X is the source_id. diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py b/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py index cc3ad6167..b8b3442a6 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py @@ -1,4 +1,8 @@ +import datetime + + citation_system_prompt = f""" +Today's date: {datetime.datetime.now().strftime("%Y-%m-%d")} You are a research assistant tasked with analyzing documents and providing comprehensive answers with proper citations in IEEE format. diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/state.py b/surfsense_backend/app/agents/researcher/sub_section_writer/state.py index fb5b08e87..b33abe6bd 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/state.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/state.py @@ -18,6 +18,6 @@ class State: db_session: AsyncSession # OUTPUT: Populated by agent nodes - relevant_documents_fetched: Optional[List[Any]] = None + reranked_documents: Optional[List[Any]] = None final_answer: Optional[str] = None diff --git a/surfsense_backend/app/agents/researcher/test_researcher.py b/surfsense_backend/app/agents/researcher/test_researcher.py new file mode 100644 index 000000000..72fbc2058 --- /dev/null +++ b/surfsense_backend/app/agents/researcher/test_researcher.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +""" +Test script for the Researcher LangGraph agent. + +This script demonstrates how to invoke the researcher agent with a sample query. +Run this script directly from VSCode using the "Run Python File" button or +right-click and select "Run Python File in Terminal". + +Before running: +1. Make sure your Python environment has all required dependencies +2. Create a .env file with any required API keys +3. Ensure database connection is properly configured +""" + +import asyncio +import os +import sys +from pathlib import Path + +# Add project root to Python path so that 'app' can be found as a module +# Get the absolute path to the surfsense_backend directory which contains the app module +project_root = str(Path(__file__).resolve().parents[3]) # Go up 3 levels from the script: app/agents/researcher -> app/agents -> app -> surfsense_backend +print(f"Adding to Python path: {project_root}") +sys.path.insert(0, project_root) + +# Now import the modules after fixing the path +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from dotenv import load_dotenv + +# These imports should now work with the correct path +from app.agents.researcher.graph import graph +from app.agents.researcher.state import State +from app.agents.researcher.nodes import write_answer_outline, process_sections + +# Load environment variables +load_dotenv() + +# Database connection string - use a test database or mock +DATABASE_URL = "postgresql+asyncpg://postgres:postgres@localhost:5432/surfsense" + +# Create async engine and session +engine = create_async_engine(DATABASE_URL) +async_session_maker = sessionmaker( + engine, class_=AsyncSession, expire_on_commit=False +) + +async def run_test(): + """Run a test of the researcher agent.""" + print("Starting researcher agent test...") + + # Create a database session + async with async_session_maker() as db_session: + # Sample configuration + config = { + "configurable": { + "user_query": "What are the best clash royale decks recommended by Surgical Goblin?", + "num_sections": 1, + "connectors_to_search": [ + "YOUTUBE_VIDEO", + ], + "user_id": "d6ac2187-7407-4664-8734-af09926d161e", + "search_space_id": 2 + } + } + + try: + # Initialize state with database session and engine + initial_state = State(db_session=db_session, engine=engine) + + # Instead of using the graph directly, let's run the nodes manually + # to track the state transitions explicitly + print("\nSTEP 1: Running write_answer_outline node...") + outline_result = await write_answer_outline(initial_state, config) + + # Update the state with the outline + if "answer_outline" in outline_result: + initial_state.answer_outline = outline_result["answer_outline"] + print(f"Generated answer outline with {len(initial_state.answer_outline.answer_outline)} sections") + + # Print the outline + print("\nGenerated Answer Outline:") + for section in initial_state.answer_outline.answer_outline: + print(f"\nSection {section.section_id}: {section.section_title}") + print("Research Questions:") + for q in section.questions: + print(f" - {q}") + + # Run the second node with the updated state + print("\nSTEP 2: Running process_sections node...") + sections_result = await process_sections(initial_state, config) + + # Check if we got a final report + if "final_written_report" in sections_result: + final_report = sections_result["final_written_report"] + print("\nFinal Research Report generated successfully!") + print(f"Report length: {len(final_report)} characters") + + # Display the final report + print("\n==== FINAL RESEARCH REPORT ====\n") + print(final_report) + else: + print("\nNo final report was generated.") + print(f"Result keys: {list(sections_result.keys())}") + + return sections_result + + except Exception as e: + print(f"Error running researcher agent: {str(e)}") + import traceback + traceback.print_exc() + raise + +async def main(): + """Main entry point for the test script.""" + try: + result = await run_test() + print("\nTest completed successfully.") + return result + except Exception as e: + print(f"\nTest failed with error: {e}") + import traceback + traceback.print_exc() + return None + +if __name__ == "__main__": + # Run the async test + result = asyncio.run(main()) + + # Keep terminal open if run directly in VSCode + if 'VSCODE_PID' in os.environ: + input("\nPress Enter to close this window...") \ No newline at end of file diff --git a/surfsense_backend/app/config/__init__.py b/surfsense_backend/app/config/__init__.py index f4226ede8..82517a8df 100644 --- a/surfsense_backend/app/config/__init__.py +++ b/surfsense_backend/app/config/__init__.py @@ -42,10 +42,8 @@ class Config: # GPT Researcher FAST_LLM = os.getenv("FAST_LLM") - SMART_LLM = os.getenv("SMART_LLM") STRATEGIC_LLM = os.getenv("STRATEGIC_LLM") fast_llm_instance = ChatLiteLLM(model=extract_model_name(FAST_LLM)) - smart_llm_instance = ChatLiteLLM(model=extract_model_name(SMART_LLM)) strategic_llm_instance = ChatLiteLLM(model=extract_model_name(STRATEGIC_LLM)) From 154c5748fd21b937a46a654e9b693dc1ff047be7 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sat, 19 Apr 2025 23:44:42 -0700 Subject: [PATCH 20/47] refactor: coderabbit review --- .../app/agents/researcher/nodes.py | 17 ++++++----------- .../app/agents/researcher/prompts.py | 3 ++- .../researcher/sub_section_writer/nodes.py | 4 ++-- .../researcher/sub_section_writer/prompts.py | 3 ++- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/surfsense_backend/app/agents/researcher/nodes.py b/surfsense_backend/app/agents/researcher/nodes.py index 9a0f62cf7..d13e77bd0 100644 --- a/surfsense_backend/app/agents/researcher/nodes.py +++ b/surfsense_backend/app/agents/researcher/nodes.py @@ -3,7 +3,7 @@ from langchain_core.runnables import RunnableConfig from .state import State from typing import Any, Dict, List from app.config import config as app_config -from .prompts import answer_outline_system_prompt +from .prompts import get_answer_outline_system_prompt from langchain_core.messages import HumanMessage, SystemMessage from pydantic import BaseModel, Field import json @@ -70,7 +70,7 @@ async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str # Create messages for the LLM messages = [ - SystemMessage(content=answer_outline_system_prompt), + SystemMessage(content=get_answer_outline_system_prompt()), HumanMessage(content=human_message_content) ] @@ -259,7 +259,6 @@ async def process_section( async with session_maker() as db_session: # Fetch relevant documents using all research questions for this section relevant_documents = await fetch_relevant_documents( - section_title=section_title, research_questions=research_questions, user_id=user_id, search_space_id=search_space_id, @@ -271,10 +270,8 @@ async def process_section( if not relevant_documents: print(f"No relevant documents found for section: {section_title}") relevant_documents = [ - { - "content": f"No specific information was found for: {question}" - for question in research_questions - } + {"content": f"No specific information was found for: {question}"} + for question in research_questions ] # Call the sub_section_writer graph with the appropriate config @@ -443,10 +440,8 @@ async def process_section_with_documents( if not documents_to_use: print(f"No relevant documents found for section: {section_title}") documents_to_use = [ - { - "content": f"No specific information was found for: {question}" - for question in section_questions - } + {"content": f"No specific information was found for: {question}"} + for question in section_questions ] # Call the sub_section_writer graph with the appropriate config diff --git a/surfsense_backend/app/agents/researcher/prompts.py b/surfsense_backend/app/agents/researcher/prompts.py index 0895590eb..3a2a3f755 100644 --- a/surfsense_backend/app/agents/researcher/prompts.py +++ b/surfsense_backend/app/agents/researcher/prompts.py @@ -1,7 +1,8 @@ import datetime -answer_outline_system_prompt = f""" +def get_answer_outline_system_prompt(): + return f""" Today's date: {datetime.datetime.now().strftime("%Y-%m-%d")} You are an expert research assistant specializing in structuring information. Your task is to create a detailed and logical research outline based on the user's query. This outline will serve as the blueprint for generating a comprehensive research report. diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py index a3384d95c..d76b1d8ad 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py @@ -3,7 +3,7 @@ from langchain_core.runnables import RunnableConfig from .state import State from typing import Any, Dict, List from app.config import config as app_config -from .prompts import citation_system_prompt +from .prompts import get_citation_system_prompt from langchain_core.messages import HumanMessage, SystemMessage async def rerank_documents(state: State, config: RunnableConfig) -> Dict[str, Any]: @@ -145,7 +145,7 @@ async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, A # Create messages for the LLM messages = [ - SystemMessage(content=citation_system_prompt), + SystemMessage(content=get_citation_system_prompt()), HumanMessage(content=human_message_content) ] diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py b/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py index b8b3442a6..18a91eb07 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/prompts.py @@ -1,7 +1,8 @@ import datetime -citation_system_prompt = f""" +def get_citation_system_prompt(): + return f""" Today's date: {datetime.datetime.now().strftime("%Y-%m-%d")} You are a research assistant tasked with analyzing documents and providing comprehensive answers with proper citations in IEEE format. From 7be68ebf41e65af0949fa3dbd93e729aa108d574 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 20 Apr 2025 00:10:23 -0700 Subject: [PATCH 21/47] refactor: remove process_section function and streamline test workflow --- .../app/agents/researcher/nodes.py | 69 +------------------ .../app/agents/researcher/test_researcher.py | 30 ++++---- 2 files changed, 14 insertions(+), 85 deletions(-) diff --git a/surfsense_backend/app/agents/researcher/nodes.py b/surfsense_backend/app/agents/researcher/nodes.py index d13e77bd0..7099f02cb 100644 --- a/surfsense_backend/app/agents/researcher/nodes.py +++ b/surfsense_backend/app/agents/researcher/nodes.py @@ -232,71 +232,7 @@ async def fetch_relevant_documents( return deduplicated_docs -async def process_section( - section_title: str, - user_id: str, - search_space_id: int, - session_maker, - research_questions: List[str], - connectors_to_search: List[str] -) -> str: - """ - Process a single section by sending it to the sub_section_writer graph. - - Args: - section_title: The title of the section - user_id: The user ID - search_space_id: The search space ID - session_maker: Factory for creating new database sessions - research_questions: List of research questions for this section - connectors_to_search: List of connectors to search - - Returns: - The written section content - """ - try: - # Create a new database session for this section - async with session_maker() as db_session: - # Fetch relevant documents using all research questions for this section - relevant_documents = await fetch_relevant_documents( - research_questions=research_questions, - user_id=user_id, - search_space_id=search_space_id, - db_session=db_session, - connectors_to_search=connectors_to_search - ) - - # Fallback if no documents found - if not relevant_documents: - print(f"No relevant documents found for section: {section_title}") - relevant_documents = [ - {"content": f"No specific information was found for: {question}"} - for question in research_questions - ] - - # Call the sub_section_writer graph with the appropriate config - config = { - "configurable": { - "sub_section_title": section_title, - "relevant_documents": relevant_documents, - "user_id": user_id, - "search_space_id": search_space_id - } - } - - # Create the initial state with db_session - state = {"db_session": db_session} - - # Invoke the sub-section writer graph - print(f"Invoking sub_section_writer for: {section_title}") - result = await sub_section_writer_graph.ainvoke(state, config) - - # Return the final answer from the sub_section_writer - final_answer = result.get("final_answer", "No content was generated for this section.") - return final_answer - except Exception as e: - print(f"Error processing section '{section_title}': {str(e)}") - return f"Error processing section: {section_title}. Details: {str(e)}" + async def process_sections(state: State, config: RunnableConfig) -> Dict[str, Any]: """ @@ -395,8 +331,7 @@ async def process_sections(state: State, config: RunnableConfig) -> Dict[str, An # Combine the results into a final report with section titles final_report = [] for i, (section, content) in enumerate(zip(answer_outline.answer_outline, processed_results)): - section_header = f"## {section.section_title}" - final_report.append(section_header) + # Skip adding the section header since the content already contains the title final_report.append(content) final_report.append("\n") # Add spacing between sections diff --git a/surfsense_backend/app/agents/researcher/test_researcher.py b/surfsense_backend/app/agents/researcher/test_researcher.py index 72fbc2058..15c993e74 100644 --- a/surfsense_backend/app/agents/researcher/test_researcher.py +++ b/surfsense_backend/app/agents/researcher/test_researcher.py @@ -31,7 +31,7 @@ from dotenv import load_dotenv # These imports should now work with the correct path from app.agents.researcher.graph import graph from app.agents.researcher.state import State -from app.agents.researcher.nodes import write_answer_outline, process_sections + # Load environment variables load_dotenv() @@ -68,31 +68,25 @@ async def run_test(): # Initialize state with database session and engine initial_state = State(db_session=db_session, engine=engine) - # Instead of using the graph directly, let's run the nodes manually - # to track the state transitions explicitly - print("\nSTEP 1: Running write_answer_outline node...") - outline_result = await write_answer_outline(initial_state, config) + # Run the graph directly + print("\nRunning the complete researcher workflow...") + result = await graph.ainvoke(initial_state, config) - # Update the state with the outline - if "answer_outline" in outline_result: - initial_state.answer_outline = outline_result["answer_outline"] - print(f"Generated answer outline with {len(initial_state.answer_outline.answer_outline)} sections") + # Extract the answer outline for display + if "answer_outline" in result and result["answer_outline"]: + print(f"\nGenerated answer outline with {len(result['answer_outline'].answer_outline)} sections") # Print the outline print("\nGenerated Answer Outline:") - for section in initial_state.answer_outline.answer_outline: + for section in result["answer_outline"].answer_outline: print(f"\nSection {section.section_id}: {section.section_title}") print("Research Questions:") for q in section.questions: print(f" - {q}") - # Run the second node with the updated state - print("\nSTEP 2: Running process_sections node...") - sections_result = await process_sections(initial_state, config) - # Check if we got a final report - if "final_written_report" in sections_result: - final_report = sections_result["final_written_report"] + if "final_written_report" in result and result["final_written_report"]: + final_report = result["final_written_report"] print("\nFinal Research Report generated successfully!") print(f"Report length: {len(final_report)} characters") @@ -101,9 +95,9 @@ async def run_test(): print(final_report) else: print("\nNo final report was generated.") - print(f"Result keys: {list(sections_result.keys())}") + print(f"Available result keys: {list(result.keys())}") - return sections_result + return result except Exception as e: print(f"Error running researcher agent: {str(e)}") From 796e326cc8d5b7890d0fa8667feb9818b5cde951 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 20 Apr 2025 00:19:21 -0700 Subject: [PATCH 22/47] refactor: coderabbit --- .../app/agents/researcher/nodes.py | 23 +++++++++++-------- .../researcher/sub_section_writer/nodes.py | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/surfsense_backend/app/agents/researcher/nodes.py b/surfsense_backend/app/agents/researcher/nodes.py index 7099f02cb..8fa72e111 100644 --- a/surfsense_backend/app/agents/researcher/nodes.py +++ b/surfsense_backend/app/agents/researcher/nodes.py @@ -12,7 +12,6 @@ from .sub_section_writer.graph import graph as sub_section_writer_graph from app.utils.connector_service import ConnectorService from app.utils.reranker_service import RerankerService from sqlalchemy.ext.asyncio import AsyncSession -import copy class Section(BaseModel): """A section in the answer outline.""" @@ -133,7 +132,6 @@ async def fetch_relevant_documents( """ # Initialize services connector_service = ConnectorService(db_session) - reranker_service = RerankerService.get_reranker_instance(app_config) all_raw_documents = [] # Store all raw documents before reranking @@ -289,13 +287,20 @@ async def process_sections(state: State, config: RunnableConfig) -> Dict[str, An relevant_documents = [] async with session_maker() as db_session: - relevant_documents = await fetch_relevant_documents( - research_questions=all_questions, - user_id=configuration.user_id, - search_space_id=configuration.search_space_id, - db_session=db_session, - connectors_to_search=configuration.connectors_to_search - ) + try: + relevant_documents = await fetch_relevant_documents( + research_questions=all_questions, + user_id=configuration.user_id, + search_space_id=configuration.search_space_id, + db_session=db_session, + connectors_to_search=configuration.connectors_to_search + ) + except Exception as e: + print(f"Error fetching relevant documents: {str(e)}") + # Log the error and continue with an empty list of documents + # This allows the process to continue, but the report might lack information + relevant_documents = [] + # Consider adding more robust error handling or reporting if needed print(f"Fetched {len(relevant_documents)} relevant documents for all sections") diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py index d76b1d8ad..af807e386 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py @@ -1,7 +1,7 @@ from .configuration import Configuration from langchain_core.runnables import RunnableConfig from .state import State -from typing import Any, Dict, List +from typing import Any, Dict from app.config import config as app_config from .prompts import get_citation_system_prompt from langchain_core.messages import HumanMessage, SystemMessage From ebc376473e2fed9d2f9cc662cc2ac656f43448be Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 20 Apr 2025 00:23:02 -0700 Subject: [PATCH 23/47] refactor: remove unused RerankerService import from nodes.py --- surfsense_backend/app/agents/researcher/nodes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/surfsense_backend/app/agents/researcher/nodes.py b/surfsense_backend/app/agents/researcher/nodes.py index 8fa72e111..c88ad3308 100644 --- a/surfsense_backend/app/agents/researcher/nodes.py +++ b/surfsense_backend/app/agents/researcher/nodes.py @@ -10,7 +10,6 @@ import json import asyncio from .sub_section_writer.graph import graph as sub_section_writer_graph from app.utils.connector_service import ConnectorService -from app.utils.reranker_service import RerankerService from sqlalchemy.ext.asyncio import AsyncSession class Section(BaseModel): From 130f43a0fae4fd3aad6587a8f4bfb37af9fb16d1 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 20 Apr 2025 19:19:35 -0700 Subject: [PATCH 24/47] feat: Removed GPT-Researcher in favour of own SurfSense LangGraph Agent --- README.md | 11 +- surfsense_backend/.env.example | 5 +- .../app/agents/researcher/nodes.py | 398 ++++++++++++--- .../app/agents/researcher/state.py | 11 +- .../sub_section_writer/configuration.py | 1 + .../researcher/sub_section_writer/nodes.py | 16 +- .../app/agents/researcher/test_researcher.py | 126 ----- surfsense_backend/app/routes/chats_routes.py | 15 +- .../tasks/stream_connector_search_results.py | 466 ++---------------- surfsense_backend/app/utils/query_service.py | 6 +- .../app/utils/research_service.py | 211 -------- .../app/utils/streaming_service.py | 75 +-- surfsense_backend/pyproject.toml | 1 - surfsense_web/components/markdown-viewer.tsx | 15 +- 14 files changed, 439 insertions(+), 918 deletions(-) delete mode 100644 surfsense_backend/app/agents/researcher/test_researcher.py delete mode 100644 surfsense_backend/app/utils/research_service.py diff --git a/README.md b/README.md index 4b9ea5a64..aa337c7f2 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,6 @@ This is the core of SurfSense. Before we begin let's look at `.env` variables' t | RERANKERS_MODEL_NAME| Name of the reranker model for search result reranking. Eg. `ms-marco-MiniLM-L-12-v2`| | RERANKERS_MODEL_TYPE| Type of reranker model being used. Eg. `flashrank`| | FAST_LLM| LiteLLM routed Smaller, faster LLM for quick responses. Eg. `litellm:openai/gpt-4o`| -| SMART_LLM| LiteLLM routed Balanced LLM for general use. Eg. `litellm:openai/gpt-4o`| | STRATEGIC_LLM| LiteLLM routed Advanced LLM for complex reasoning tasks. Eg. `litellm:openai/gpt-4o`| | LONG_CONTEXT_LLM| LiteLLM routed LLM capable of handling longer context windows. Eg. `litellm:gemini/gemini-2.0-flash`| | UNSTRUCTURED_API_KEY| API key for Unstructured.io service for document parsing| @@ -221,15 +220,15 @@ After filling in your SurfSense API key you should be able to use extension now. - **Alembic**: A database migrations tool for SQLAlchemy. - **FastAPI Users**: Authentication and user management with JWT and OAuth support - -- **LangChain**: Framework for developing AI-powered applications -- **GPT Integration**: Integration with LLM models through LiteLLM +- **LangGraph**: Framework for developing AI-agents. + +- **LangChain**: Framework for developing AI-powered applications. + +- **LLM Integration**: Integration with LLM models through LiteLLM - **Rerankers**: Advanced result ranking for improved search relevance -- **GPT-Researcher**: Advanced research capabilities - - **Hybrid Search**: Combines vector similarity and full-text search for optimal results using Reciprocal Rank Fusion (RRF) - **Vector Embeddings**: Document and text embeddings for semantic search diff --git a/surfsense_backend/.env.example b/surfsense_backend/.env.example index 380296e65..bc3f5cebb 100644 --- a/surfsense_backend/.env.example +++ b/surfsense_backend/.env.example @@ -10,9 +10,8 @@ RERANKERS_MODEL_NAME="ms-marco-MiniLM-L-12-v2" RERANKERS_MODEL_TYPE="flashrank" FAST_LLM="litellm:openai/gpt-4o-mini" -SMART_LLM="litellm:openai/gpt-4o-mini" -STRATEGIC_LLM="litellm:openai/gpt-4o-mini" -LONG_CONTEXT_LLM="litellm:gemini/gemini-2.0-flash-thinking-exp-01-21" +STRATEGIC_LLM="litellm:openai/gpt-4o" +LONG_CONTEXT_LLM="litellm:gemini/gemini-2.0-flash" OPENAI_API_KEY="sk-proj-iA" GEMINI_API_KEY="AIzaSyB6-1641124124124124124124124124124" diff --git a/surfsense_backend/app/agents/researcher/nodes.py b/surfsense_backend/app/agents/researcher/nodes.py index c88ad3308..15935f2ea 100644 --- a/surfsense_backend/app/agents/researcher/nodes.py +++ b/surfsense_backend/app/agents/researcher/nodes.py @@ -1,17 +1,23 @@ -from .configuration import Configuration -from langchain_core.runnables import RunnableConfig -from .state import State -from typing import Any, Dict, List -from app.config import config as app_config -from .prompts import get_answer_outline_system_prompt -from langchain_core.messages import HumanMessage, SystemMessage -from pydantic import BaseModel, Field -import json import asyncio -from .sub_section_writer.graph import graph as sub_section_writer_graph +import json +from typing import Any, Dict, List + +from app.config import config as app_config +from app.db import async_session_maker from app.utils.connector_service import ConnectorService +from langchain_core.messages import HumanMessage, SystemMessage +from langchain_core.runnables import RunnableConfig +from pydantic import BaseModel, Field from sqlalchemy.ext.asyncio import AsyncSession +from .configuration import Configuration +from .prompts import get_answer_outline_system_prompt +from .state import State +from .sub_section_writer.graph import graph as sub_section_writer_graph + +from langgraph.types import StreamWriter + + class Section(BaseModel): """A section in the answer outline.""" section_id: int = Field(..., description="The zero-based index of the section") @@ -22,7 +28,7 @@ class AnswerOutline(BaseModel): """The complete answer outline with all sections.""" answer_outline: List[Section] = Field(..., description="List of sections in the answer outline") -async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str, Any]: +async def write_answer_outline(state: State, config: RunnableConfig, writer: StreamWriter) -> Dict[str, Any]: """ Create a structured answer outline based on the user query. @@ -33,12 +39,18 @@ async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str Returns: Dict containing the answer outline in the "answer_outline" key for state update. """ + streaming_service = state.streaming_service + streaming_service.only_update_terminal("Generating answer outline...") + writer({"yeild_value": streaming_service._format_annotations()}) # Get configuration from runnable config configuration = Configuration.from_runnable_config(config) user_query = configuration.user_query num_sections = configuration.num_sections + streaming_service.only_update_terminal(f"Planning research approach for query: {user_query[:100]}...") + writer({"yeild_value": streaming_service._format_annotations()}) + # Initialize LLM llm = app_config.strategic_llm_instance @@ -66,6 +78,9 @@ async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str Your output MUST be valid JSON in exactly this format. Do not include any other text or explanation. """ + streaming_service.only_update_terminal("Designing structured outline with AI...") + writer({"yeild_value": streaming_service._format_annotations()}) + # Create messages for the LLM messages = [ SystemMessage(content=get_answer_outline_system_prompt()), @@ -73,6 +88,9 @@ async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str ] # Call the LLM directly without using structured output + streaming_service.only_update_terminal("Processing answer structure...") + writer({"yeild_value": streaming_service._format_annotations()}) + response = await llm.ainvoke(messages) # Parse the JSON response manually @@ -92,16 +110,27 @@ async def write_answer_outline(state: State, config: RunnableConfig) -> Dict[str # Convert to Pydantic model answer_outline = AnswerOutline(**parsed_data) + total_questions = sum(len(section.questions) for section in answer_outline.answer_outline) + streaming_service.only_update_terminal(f"Successfully generated outline with {len(answer_outline.answer_outline)} sections and {total_questions} research questions") + writer({"yeild_value": streaming_service._format_annotations()}) + print(f"Successfully generated answer outline with {len(answer_outline.answer_outline)} sections") # Return state update return {"answer_outline": answer_outline} else: # If JSON structure not found, raise a clear error - raise ValueError(f"Could not find valid JSON in LLM response. Raw response: {content}") + error_message = f"Could not find valid JSON in LLM response. Raw response: {content}" + streaming_service.only_update_terminal(error_message, "error") + writer({"yeild_value": streaming_service._format_annotations()}) + raise ValueError(error_message) except (json.JSONDecodeError, ValueError) as e: # Log the error and re-raise it + error_message = f"Error parsing LLM response: {str(e)}" + streaming_service.only_update_terminal(error_message, "error") + writer({"yeild_value": streaming_service._format_annotations()}) + print(f"Error parsing LLM response: {str(e)}") print(f"Raw response: {response.content}") raise @@ -112,18 +141,21 @@ async def fetch_relevant_documents( search_space_id: int, db_session: AsyncSession, connectors_to_search: List[str], - top_k: int = 5 + writer: StreamWriter = None, + state: State = None, + top_k: int = 20 ) -> List[Dict[str, Any]]: """ Fetch relevant documents for research questions using the provided connectors. Args: - section_title: The title of the section being researched research_questions: List of research questions to find documents for user_id: The user ID search_space_id: The search space ID db_session: The database session connectors_to_search: List of connectors to search + writer: StreamWriter for sending progress updates + state: The current state containing the streaming service top_k: Number of top results to retrieve per connector per question Returns: @@ -131,83 +163,237 @@ async def fetch_relevant_documents( """ # Initialize services connector_service = ConnectorService(db_session) - - all_raw_documents = [] # Store all raw documents before reranking - for user_query in research_questions: + # Only use streaming if both writer and state are provided + streaming_service = state.streaming_service if state is not None else None + + # Stream initial status update + if streaming_service and writer: + streaming_service.only_update_terminal(f"Starting research on {len(research_questions)} questions using {len(connectors_to_search)} connectors...") + writer({"yeild_value": streaming_service._format_annotations()}) + + all_raw_documents = [] # Store all raw documents + all_sources = [] # Store all sources + + for i, user_query in enumerate(research_questions): + # Stream question being researched + if streaming_service and writer: + streaming_service.only_update_terminal(f"Researching question {i+1}/{len(research_questions)}: {user_query[:100]}...") + writer({"yeild_value": streaming_service._format_annotations()}) + # Use original research question as the query reformulated_query = user_query # Process each selected connector for connector in connectors_to_search: + # Stream connector being searched + if streaming_service and writer: + streaming_service.only_update_terminal(f"Searching {connector} for relevant information...") + writer({"yeild_value": streaming_service._format_annotations()}) + try: if connector == "YOUTUBE_VIDEO": - _, youtube_chunks = await connector_service.search_youtube( + source_object, youtube_chunks = await connector_service.search_youtube( user_query=reformulated_query, user_id=user_id, search_space_id=search_space_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(youtube_chunks) + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(youtube_chunks)} YouTube chunks relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + elif connector == "EXTENSION": - _, extension_chunks = await connector_service.search_extension( + source_object, extension_chunks = await connector_service.search_extension( user_query=reformulated_query, user_id=user_id, search_space_id=search_space_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(extension_chunks) + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(extension_chunks)} extension chunks relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + elif connector == "CRAWLED_URL": - _, crawled_urls_chunks = await connector_service.search_crawled_urls( + source_object, crawled_urls_chunks = await connector_service.search_crawled_urls( user_query=reformulated_query, user_id=user_id, search_space_id=search_space_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(crawled_urls_chunks) + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(crawled_urls_chunks)} crawled URL chunks relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + elif connector == "FILE": - _, files_chunks = await connector_service.search_files( + source_object, files_chunks = await connector_service.search_files( user_query=reformulated_query, user_id=user_id, search_space_id=search_space_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(files_chunks) + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(files_chunks)} file chunks relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + elif connector == "TAVILY_API": - _, tavily_chunks = await connector_service.search_tavily( + source_object, tavily_chunks = await connector_service.search_tavily( user_query=reformulated_query, user_id=user_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(tavily_chunks) + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(tavily_chunks)} web search results relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + elif connector == "SLACK_CONNECTOR": - _, slack_chunks = await connector_service.search_slack( + source_object, slack_chunks = await connector_service.search_slack( user_query=reformulated_query, user_id=user_id, search_space_id=search_space_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(slack_chunks) + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(slack_chunks)} Slack messages relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + elif connector == "NOTION_CONNECTOR": - _, notion_chunks = await connector_service.search_notion( + source_object, notion_chunks = await connector_service.search_notion( user_query=reformulated_query, user_id=user_id, search_space_id=search_space_id, top_k=top_k ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) all_raw_documents.extend(notion_chunks) + + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(notion_chunks)} Notion pages/blocks relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + + elif connector == "GITHUB_CONNECTOR": + source_object, github_chunks = await connector_service.search_github( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) + all_raw_documents.extend(github_chunks) + + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(github_chunks)} GitHub files/issues relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) + + elif connector == "LINEAR_CONNECTOR": + source_object, linear_chunks = await connector_service.search_linear( + user_query=reformulated_query, + user_id=user_id, + search_space_id=search_space_id, + top_k=top_k + ) + + # Add to sources and raw documents + if source_object: + all_sources.append(source_object) + all_raw_documents.extend(linear_chunks) + + # Stream found document count + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(linear_chunks)} Linear issues relevant to the query") + writer({"yeild_value": streaming_service._format_annotations()}) except Exception as e: - print(f"Error searching connector {connector}: {str(e)}") + error_message = f"Error searching connector {connector}: {str(e)}" + print(error_message) + + # Stream error message + if streaming_service and writer: + streaming_service.only_update_terminal(error_message, "error") + writer({"yeild_value": streaming_service._format_annotations()}) + # Continue with other connectors on error continue - # Deduplicate documents based on chunk_id or content + # Deduplicate source objects by ID before streaming + deduplicated_sources = [] + seen_source_keys = set() + + for source_obj in all_sources: + # Use combination of source ID and type as a unique identifier + # This ensures we don't accidentally deduplicate sources from different connectors + source_id = source_obj.get('id') + source_type = source_obj.get('type') + + if source_id and source_type: + source_key = f"{source_type}_{source_id}" + if source_key not in seen_source_keys: + seen_source_keys.add(source_key) + deduplicated_sources.append(source_obj) + else: + # If there's no ID or type, just add it to be safe + deduplicated_sources.append(source_obj) + + # Stream info about deduplicated sources + if streaming_service and writer: + streaming_service.only_update_terminal(f"Collected {len(deduplicated_sources)} unique sources across all connectors") + writer({"yeild_value": streaming_service._format_annotations()}) + + # After all sources are collected and deduplicated, stream them + if streaming_service and writer: + streaming_service.only_update_sources(deduplicated_sources) + writer({"yeild_value": streaming_service._format_annotations()}) + + # Deduplicate raw documents based on chunk_id or content seen_chunk_ids = set() seen_content_hashes = set() deduplicated_docs = [] @@ -227,11 +413,15 @@ async def fetch_relevant_documents( seen_content_hashes.add(content_hash) deduplicated_docs.append(doc) + # Stream info about deduplicated documents + if streaming_service and writer: + streaming_service.only_update_terminal(f"Found {len(deduplicated_docs)} unique document chunks after deduplication") + writer({"yeild_value": streaming_service._format_annotations()}) + + # Return deduplicated documents return deduplicated_docs - - -async def process_sections(state: State, config: RunnableConfig) -> Dict[str, Any]: +async def process_sections(state: State, config: RunnableConfig, writer: StreamWriter) -> Dict[str, Any]: """ Process all sections in parallel and combine the results. @@ -245,89 +435,97 @@ async def process_sections(state: State, config: RunnableConfig) -> Dict[str, An # Get configuration and answer outline from state configuration = Configuration.from_runnable_config(config) answer_outline = state.answer_outline + streaming_service = state.streaming_service + + streaming_service.only_update_terminal(f"Starting to process research sections...") + writer({"yeild_value": streaming_service._format_annotations()}) print(f"Processing sections from outline: {answer_outline is not None}") if not answer_outline: + streaming_service.only_update_terminal("Error: No answer outline was provided. Cannot generate report.", "error") + writer({"yeild_value": streaming_service._format_annotations()}) return { "final_written_report": "No answer outline was provided. Cannot generate final report." } - # Create session maker from the engine or directly use the session - from sqlalchemy.ext.asyncio import AsyncSession - from sqlalchemy.orm import sessionmaker - - # Use the engine if available, otherwise create a new session for each task - if state.engine: - session_maker = sessionmaker( - state.engine, class_=AsyncSession, expire_on_commit=False - ) - else: - # Fallback to using the same session (less optimal but will work) - print("Warning: No engine available. Using same session for all tasks.") - # Create a mock session maker that returns the same session - async def mock_session_maker(): - class ContextManager: - async def __aenter__(self): - return state.db_session - async def __aexit__(self, exc_type, exc_val, exc_tb): - pass - return ContextManager() - session_maker = mock_session_maker - # Collect all questions from all sections all_questions = [] for section in answer_outline.answer_outline: all_questions.extend(section.questions) print(f"Collected {len(all_questions)} questions from all sections") + streaming_service.only_update_terminal(f"Found {len(all_questions)} research questions across {len(answer_outline.answer_outline)} sections") + writer({"yeild_value": streaming_service._format_annotations()}) # Fetch relevant documents once for all questions + streaming_service.only_update_terminal("Searching for relevant information across all connectors...") + writer({"yeild_value": streaming_service._format_annotations()}) + relevant_documents = [] - async with session_maker() as db_session: - + async with async_session_maker() as db_session: try: relevant_documents = await fetch_relevant_documents( research_questions=all_questions, user_id=configuration.user_id, search_space_id=configuration.search_space_id, db_session=db_session, - connectors_to_search=configuration.connectors_to_search + connectors_to_search=configuration.connectors_to_search, + writer=writer, + state=state ) except Exception as e: - print(f"Error fetching relevant documents: {str(e)}") + error_message = f"Error fetching relevant documents: {str(e)}" + print(error_message) + streaming_service.only_update_terminal(error_message, "error") + writer({"yeild_value": streaming_service._format_annotations()}) # Log the error and continue with an empty list of documents # This allows the process to continue, but the report might lack information relevant_documents = [] # Consider adding more robust error handling or reporting if needed print(f"Fetched {len(relevant_documents)} relevant documents for all sections") + streaming_service.only_update_terminal(f"Starting to draft {len(answer_outline.answer_outline)} sections using {len(relevant_documents)} relevant document chunks") + writer({"yeild_value": streaming_service._format_annotations()}) # Create tasks to process each section in parallel with the same document set section_tasks = [] + streaming_service.only_update_terminal("Creating processing tasks for each section...") + writer({"yeild_value": streaming_service._format_annotations()}) + for section in answer_outline.answer_outline: section_tasks.append( process_section_with_documents( section_title=section.section_title, section_questions=section.questions, + user_query=configuration.user_query, user_id=configuration.user_id, search_space_id=configuration.search_space_id, - session_maker=session_maker, - relevant_documents=relevant_documents + relevant_documents=relevant_documents, + state=state, + writer=writer ) ) # Run all section processing tasks in parallel print(f"Running {len(section_tasks)} section processing tasks in parallel") + streaming_service.only_update_terminal(f"Processing {len(section_tasks)} sections simultaneously...") + writer({"yeild_value": streaming_service._format_annotations()}) + section_results = await asyncio.gather(*section_tasks, return_exceptions=True) # Handle any exceptions in the results + streaming_service.only_update_terminal("Combining section results into final report...") + writer({"yeild_value": streaming_service._format_annotations()}) + processed_results = [] for i, result in enumerate(section_results): if isinstance(result, Exception): section_title = answer_outline.answer_outline[i].section_title error_message = f"Error processing section '{section_title}': {str(result)}" print(error_message) + streaming_service.only_update_terminal(error_message, "error") + writer({"yeild_value": streaming_service._format_annotations()}) processed_results.append(error_message) else: processed_results.append(result) @@ -337,12 +535,33 @@ async def process_sections(state: State, config: RunnableConfig) -> Dict[str, An for i, (section, content) in enumerate(zip(answer_outline.answer_outline, processed_results)): # Skip adding the section header since the content already contains the title final_report.append(content) - final_report.append("\n") # Add spacing between sections + final_report.append("\n") + # Join all sections with newlines final_written_report = "\n".join(final_report) print(f"Generated final report with {len(final_report)} parts") + streaming_service.only_update_terminal("Final research report generated successfully!") + writer({"yeild_value": streaming_service._format_annotations()}) + + if hasattr(state, 'streaming_service') and state.streaming_service: + # Convert the final report to the expected format for UI: + # A list of strings where empty strings represent line breaks + formatted_report = [] + for section in final_report: + if section == "\n": + # Add an empty string for line breaks + formatted_report.append("") + else: + # Split any multiline content by newlines and add each line + section_lines = section.split("\n") + formatted_report.extend(section_lines) + + state.streaming_service.only_update_answer(formatted_report) + writer({"yeild_value": state.streaming_service._format_annotations()}) + + return { "final_written_report": final_written_report } @@ -352,8 +571,10 @@ async def process_section_with_documents( section_questions: List[str], user_id: str, search_space_id: int, - session_maker, - relevant_documents: List[Dict[str, Any]] + relevant_documents: List[Dict[str, Any]], + user_query: str, + state: State = None, + writer: StreamWriter = None ) -> str: """ Process a single section using pre-fetched documents. @@ -363,31 +584,42 @@ async def process_section_with_documents( section_questions: List of research questions for this section user_id: The user ID search_space_id: The search space ID - session_maker: Factory for creating new database sessions relevant_documents: Pre-fetched documents to use for this section + state: The current state + writer: StreamWriter for sending progress updates Returns: The written section content """ try: + # Use the provided documents + documents_to_use = relevant_documents + + # Send status update via streaming if available + if state and state.streaming_service and writer: + state.streaming_service.only_update_terminal(f"Writing section: {section_title} with {len(section_questions)} research questions") + writer({"yeild_value": state.streaming_service._format_annotations()}) + + # Fallback if no documents found + if not documents_to_use: + print(f"No relevant documents found for section: {section_title}") + if state and state.streaming_service and writer: + state.streaming_service.only_update_terminal(f"Warning: No relevant documents found for section: {section_title}", "warning") + writer({"yeild_value": state.streaming_service._format_annotations()}) + + documents_to_use = [ + {"content": f"No specific information was found for: {question}"} + for question in section_questions + ] + # Create a new database session for this section - async with session_maker() as db_session: - # Use the provided documents - documents_to_use = relevant_documents - - # Fallback if no documents found - if not documents_to_use: - print(f"No relevant documents found for section: {section_title}") - documents_to_use = [ - {"content": f"No specific information was found for: {question}"} - for question in section_questions - ] - + async with async_session_maker() as db_session: # Call the sub_section_writer graph with the appropriate config config = { "configurable": { "sub_section_title": section_title, "sub_section_questions": section_questions, + "user_query": user_query, "relevant_documents": documents_to_use, "user_id": user_id, "search_space_id": search_space_id @@ -395,16 +627,32 @@ async def process_section_with_documents( } # Create the initial state with db_session - state = {"db_session": db_session} + sub_state = {"db_session": db_session} # Invoke the sub-section writer graph print(f"Invoking sub_section_writer for: {section_title}") - result = await sub_section_writer_graph.ainvoke(state, config) + if state and state.streaming_service and writer: + state.streaming_service.only_update_terminal(f"Analyzing information and drafting content for section: {section_title}") + writer({"yeild_value": state.streaming_service._format_annotations()}) + + result = await sub_section_writer_graph.ainvoke(sub_state, config) # Return the final answer from the sub_section_writer final_answer = result.get("final_answer", "No content was generated for this section.") + + # Send section content update via streaming if available + if state and state.streaming_service and writer: + state.streaming_service.only_update_terminal(f"Completed writing section: {section_title}") + writer({"yeild_value": state.streaming_service._format_annotations()}) + return final_answer except Exception as e: print(f"Error processing section '{section_title}': {str(e)}") + + # Send error update via streaming if available + if state and state.streaming_service and writer: + state.streaming_service.only_update_terminal(f"Error processing section '{section_title}': {str(e)}", "error") + writer({"yeild_value": state.streaming_service._format_annotations()}) + return f"Error processing section: {section_title}. Details: {str(e)}" diff --git a/surfsense_backend/app/agents/researcher/state.py b/surfsense_backend/app/agents/researcher/state.py index 483e96ac9..dd36163b6 100644 --- a/surfsense_backend/app/agents/researcher/state.py +++ b/surfsense_backend/app/agents/researcher/state.py @@ -3,10 +3,9 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import List, Optional, Any, Dict, Annotated -from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine -from langchain_core.messages import BaseMessage, HumanMessage -from pydantic import BaseModel +from typing import Optional, Any +from sqlalchemy.ext.asyncio import AsyncSession +from app.utils.streaming_service import StreamingService @dataclass class State: @@ -18,7 +17,9 @@ class State: """ # Runtime context (not part of actual graph state) db_session: AsyncSession - engine: Optional[AsyncEngine] = None + + # Streaming service + streaming_service: StreamingService # Intermediate state - populated during workflow # Using field to explicitly mark as part of state diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py b/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py index fbde94d57..9e1ca32b5 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/configuration.py @@ -15,6 +15,7 @@ class Configuration: # Input parameters provided at invocation sub_section_title: str sub_section_questions: List[str] + user_query: str relevant_documents: List[Any] # Documents provided directly to the agent user_id: str search_space_id: int diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py index af807e386..5b11141ca 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py @@ -119,6 +119,7 @@ async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, A # Create the query that uses the section title and questions section_title = configuration.sub_section_title sub_section_questions = configuration.sub_section_questions + user_query = configuration.user_query # Get the original user query documents_text = "\n".join(formatted_documents) # Format the questions as bullet points for clarity @@ -126,17 +127,16 @@ async def write_sub_section(state: State, config: RunnableConfig) -> Dict[str, A # Construct a clear, structured query for the LLM human_message_content = f""" - Please write a comprehensive answer for the title: + Now user's query is: + + {user_query} + - + The sub-section title is: + <sub_section_title> {section_title} - + - Focus on answering these specific questions related to the title: - - {questions_text} - - Use the provided documents as your source material and cite them properly using the IEEE citation format [X] where X is the source_id. {documents_text} diff --git a/surfsense_backend/app/agents/researcher/test_researcher.py b/surfsense_backend/app/agents/researcher/test_researcher.py deleted file mode 100644 index 15c993e74..000000000 --- a/surfsense_backend/app/agents/researcher/test_researcher.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python3 -""" -Test script for the Researcher LangGraph agent. - -This script demonstrates how to invoke the researcher agent with a sample query. -Run this script directly from VSCode using the "Run Python File" button or -right-click and select "Run Python File in Terminal". - -Before running: -1. Make sure your Python environment has all required dependencies -2. Create a .env file with any required API keys -3. Ensure database connection is properly configured -""" - -import asyncio -import os -import sys -from pathlib import Path - -# Add project root to Python path so that 'app' can be found as a module -# Get the absolute path to the surfsense_backend directory which contains the app module -project_root = str(Path(__file__).resolve().parents[3]) # Go up 3 levels from the script: app/agents/researcher -> app/agents -> app -> surfsense_backend -print(f"Adding to Python path: {project_root}") -sys.path.insert(0, project_root) - -# Now import the modules after fixing the path -from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession -from sqlalchemy.orm import sessionmaker -from dotenv import load_dotenv - -# These imports should now work with the correct path -from app.agents.researcher.graph import graph -from app.agents.researcher.state import State - - -# Load environment variables -load_dotenv() - -# Database connection string - use a test database or mock -DATABASE_URL = "postgresql+asyncpg://postgres:postgres@localhost:5432/surfsense" - -# Create async engine and session -engine = create_async_engine(DATABASE_URL) -async_session_maker = sessionmaker( - engine, class_=AsyncSession, expire_on_commit=False -) - -async def run_test(): - """Run a test of the researcher agent.""" - print("Starting researcher agent test...") - - # Create a database session - async with async_session_maker() as db_session: - # Sample configuration - config = { - "configurable": { - "user_query": "What are the best clash royale decks recommended by Surgical Goblin?", - "num_sections": 1, - "connectors_to_search": [ - "YOUTUBE_VIDEO", - ], - "user_id": "d6ac2187-7407-4664-8734-af09926d161e", - "search_space_id": 2 - } - } - - try: - # Initialize state with database session and engine - initial_state = State(db_session=db_session, engine=engine) - - # Run the graph directly - print("\nRunning the complete researcher workflow...") - result = await graph.ainvoke(initial_state, config) - - # Extract the answer outline for display - if "answer_outline" in result and result["answer_outline"]: - print(f"\nGenerated answer outline with {len(result['answer_outline'].answer_outline)} sections") - - # Print the outline - print("\nGenerated Answer Outline:") - for section in result["answer_outline"].answer_outline: - print(f"\nSection {section.section_id}: {section.section_title}") - print("Research Questions:") - for q in section.questions: - print(f" - {q}") - - # Check if we got a final report - if "final_written_report" in result and result["final_written_report"]: - final_report = result["final_written_report"] - print("\nFinal Research Report generated successfully!") - print(f"Report length: {len(final_report)} characters") - - # Display the final report - print("\n==== FINAL RESEARCH REPORT ====\n") - print(final_report) - else: - print("\nNo final report was generated.") - print(f"Available result keys: {list(result.keys())}") - - return result - - except Exception as e: - print(f"Error running researcher agent: {str(e)}") - import traceback - traceback.print_exc() - raise - -async def main(): - """Main entry point for the test script.""" - try: - result = await run_test() - print("\nTest completed successfully.") - return result - except Exception as e: - print(f"\nTest failed with error: {e}") - import traceback - traceback.print_exc() - return None - -if __name__ == "__main__": - # Run the async test - result = asyncio.run(main()) - - # Keep terminal open if run directly in VSCode - if 'VSCODE_PID' in os.environ: - input("\nPress Enter to close this window...") \ No newline at end of file diff --git a/surfsense_backend/app/routes/chats_routes.py b/surfsense_backend/app/routes/chats_routes.py index e10aa50f6..74ea97b06 100644 --- a/surfsense_backend/app/routes/chats_routes.py +++ b/surfsense_backend/app/routes/chats_routes.py @@ -1,14 +1,15 @@ -from fastapi import APIRouter, Depends, HTTPException, Query -from fastapi.responses import StreamingResponse -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.future import select -from sqlalchemy.exc import IntegrityError, OperationalError from typing import List -from app.db import get_async_session, User, SearchSpace, Chat -from app.schemas import ChatCreate, ChatUpdate, ChatRead, AISDKChatRequest + +from app.db import Chat, SearchSpace, User, get_async_session +from app.schemas import AISDKChatRequest, ChatCreate, ChatRead, ChatUpdate from app.tasks.stream_connector_search_results import stream_connector_search_results from app.users import current_active_user from app.utils.check_ownership import check_ownership +from fastapi import APIRouter, Depends, HTTPException +from fastapi.responses import StreamingResponse +from sqlalchemy.exc import IntegrityError, OperationalError +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select router = APIRouter() diff --git a/surfsense_backend/app/tasks/stream_connector_search_results.py b/surfsense_backend/app/tasks/stream_connector_search_results.py index a1dc0a3e2..c7eb07627 100644 --- a/surfsense_backend/app/tasks/stream_connector_search_results.py +++ b/surfsense_backend/app/tasks/stream_connector_search_results.py @@ -1,20 +1,15 @@ -import json -from sqlalchemy.ext.asyncio import AsyncSession -from typing import List, AsyncGenerator, Dict, Any -import asyncio -import re +from typing import AsyncGenerator, List, Union +from uuid import UUID -from app.utils.connector_service import ConnectorService -from app.utils.research_service import ResearchService +from app.agents.researcher.graph import graph as researcher_graph +from app.agents.researcher.state import State from app.utils.streaming_service import StreamingService -from app.utils.reranker_service import RerankerService -from app.utils.query_service import QueryService -from app.config import config -from app.utils.document_converters import convert_chunks_to_langchain_documents +from sqlalchemy.ext.asyncio import AsyncSession + async def stream_connector_search_results( user_query: str, - user_id: str, + user_id: Union[str, UUID], search_space_id: int, session: AsyncSession, research_mode: str, @@ -25,7 +20,7 @@ async def stream_connector_search_results( Args: user_query: The user's query - user_id: The user's ID + user_id: The user's ID (can be UUID object or string) search_space_id: The search space ID session: The database session research_mode: The research mode @@ -34,418 +29,45 @@ async def stream_connector_search_results( Yields: str: Formatted response strings """ - # Initialize services - connector_service = ConnectorService(session) streaming_service = StreamingService() - - # Reformulate the user query using the strategic LLM - yield streaming_service.add_terminal_message("Reformulating your query for better results...", "info") - reformulated_query = await QueryService.reformulate_query(user_query) - yield streaming_service.add_terminal_message(f"Searching for: {reformulated_query}", "success") - - reranker_service = RerankerService.get_reranker_instance(config) - - all_raw_documents = [] # Store all raw documents before reranking - all_sources = [] - TOP_K = 20 - if research_mode == "GENERAL": - TOP_K = 20 + NUM_SECTIONS = 1 elif research_mode == "DEEP": - TOP_K = 40 + NUM_SECTIONS = 3 elif research_mode == "DEEPER": - TOP_K = 60 + NUM_SECTIONS = 6 - - # Process each selected connector - for connector in selected_connectors: - if connector == "YOUTUBE_VIDEO": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for youtube videos...") - - # Search for YouTube videos using reformulated query - result_object, youtube_chunks = await connector_service.search_youtube( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant YouTube videos", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(youtube_chunks) - - - # Extension Docs - if connector == "EXTENSION": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for extension...") - - # Search for crawled URLs using reformulated query - result_object, extension_chunks = await connector_service.search_extension( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant extension documents", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(extension_chunks) - - - # Crawled URLs - if connector == "CRAWLED_URL": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for crawled URLs...") - - # Search for crawled URLs using reformulated query - result_object, crawled_urls_chunks = await connector_service.search_crawled_urls( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant crawled URLs", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(crawled_urls_chunks) - - - # Files - if connector == "FILE": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for files...") - - # Search for files using reformulated query - result_object, files_chunks = await connector_service.search_files( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant files", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(files_chunks) - - # Tavily Connector - if connector == "TAVILY_API": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search with Tavily API...") - - # Search using Tavily API with reformulated query - result_object, tavily_chunks = await connector_service.search_tavily( - user_query=reformulated_query, - user_id=user_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant results from Tavily", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(tavily_chunks) - - # Slack Connector - if connector == "SLACK_CONNECTOR": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for slack connector...") - - # Search using Slack API with reformulated query - result_object, slack_chunks = await connector_service.search_slack( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant results from Slack", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(slack_chunks) - - - # Notion Connector - if connector == "NOTION_CONNECTOR": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for notion connector...") - - # Search using Notion API with reformulated query - result_object, notion_chunks = await connector_service.search_notion( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant results from Notion", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(notion_chunks) - - - # Github Connector - if connector == "GITHUB_CONNECTOR": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for GitHub connector...") - print("Starting to search for GitHub connector...") - # Search using Github API with reformulated query - result_object, github_chunks = await connector_service.search_github( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant results from Github", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(github_chunks) - - # Linear Connector - if connector == "LINEAR_CONNECTOR": - # Send terminal message about starting search - yield streaming_service.add_terminal_message("Starting to search for Linear issues...") - - # Search using Linear API with reformulated query - result_object, linear_chunks = await connector_service.search_linear( - user_query=reformulated_query, - user_id=user_id, - search_space_id=search_space_id, - top_k=TOP_K - ) - - # Send terminal message about search results - yield streaming_service.add_terminal_message( - f"Found {len(result_object['sources'])} relevant results from Linear", - "success" - ) - - # Update sources - all_sources.append(result_object) - yield streaming_service.update_sources(all_sources) - - # Add documents to collection - all_raw_documents.extend(linear_chunks) - - + # Convert UUID to string if needed + user_id_str = str(user_id) if isinstance(user_id, UUID) else user_id - - # If we have documents to research - if all_raw_documents: - # Rerank all documents if reranker is available - if reranker_service: - yield streaming_service.add_terminal_message("Reranking documents for better relevance...", "info") - - # Convert documents to format expected by reranker - reranker_input_docs = [ - { - "chunk_id": doc.get("chunk_id", f"chunk_{i}"), - "content": doc.get("content", ""), - "score": doc.get("score", 0.0), - "document": { - "id": doc.get("document", {}).get("id", ""), - "title": doc.get("document", {}).get("title", ""), - "document_type": doc.get("document", {}).get("document_type", ""), - "metadata": doc.get("document", {}).get("metadata", {}) - } - } for i, doc in enumerate(all_raw_documents) - ] - - # Rerank documents using the reformulated query - reranked_docs = reranker_service.rerank_documents(reformulated_query, reranker_input_docs) - - # Sort by score in descending order - reranked_docs.sort(key=lambda x: x.get("score", 0), reverse=True) - - - - # Convert back to langchain documents format - from langchain.schema import Document as LangchainDocument - all_langchain_documents_to_research = [ - LangchainDocument( - page_content= f"""{doc.get("document", {}).get("id", "")}{doc.get("content", "")}""", - metadata={ - # **doc.get("document", {}).get("metadata", {}), - # "score": doc.get("score", 0.0), - # "rank": doc.get("rank", 0), - # "document_id": doc.get("document", {}).get("id", ""), - # "document_title": doc.get("document", {}).get("title", ""), - # "document_type": doc.get("document", {}).get("document_type", ""), - # # Explicitly set source_id for citation purposes - "source_id": str(doc.get("document", {}).get("id", "")) - } - ) for doc in reranked_docs - ] - - yield streaming_service.add_terminal_message(f"Reranked {len(all_langchain_documents_to_research)} documents", "success") - else: - # Use raw documents if no reranker is available - all_langchain_documents_to_research = convert_chunks_to_langchain_documents(all_raw_documents) - - # Send terminal message about starting research - yield streaming_service.add_terminal_message("Starting to research...", "info") - - # Create a buffer to collect report content - report_buffer = [] - - - # Use the streaming research method - yield streaming_service.add_terminal_message("Generating report...", "info") - - # Create a wrapper to handle the streaming - class StreamHandler: - def __init__(self): - self.queue = asyncio.Queue() - - async def handle_progress(self, data): - result = None - if data.get("type") == "logs": - # Handle log messages - result = streaming_service.add_terminal_message(data.get("output", ""), "info") - elif data.get("type") == "report": - # Handle report content - content = data.get("output", "") - - # Fix incorrect citation formats using regex - - # More specific pattern to match only numeric citations in markdown-style links - # This matches patterns like ([1](https://github.com/...)) but not general links like ([Click here](https://...)) - pattern = r'\(\[(\d+)\]\((https?://[^\)]+)\)\)' - - # Replace with just [X] where X is the number - content = re.sub(pattern, r'[\1]', content) - - # Also match other incorrect formats like ([1]) and convert to [1] - # Only match if the content inside brackets is a number - content = re.sub(r'\(\[(\d+)\]\)', r'[\1]', content) - - report_buffer.append(content) - # Update the answer with the accumulated content - result = streaming_service.update_answer(report_buffer) - - if result: - await self.queue.put(result) - return result - - async def get_next(self): - try: - return await self.queue.get() - except Exception as e: - print(f"Error getting next item from queue: {e}") - return None - - def task_done(self): - self.queue.task_done() - - # Create the stream handler - stream_handler = StreamHandler() - - # Start the research process in a separate task - research_task = asyncio.create_task( - ResearchService.stream_research( - user_query=reformulated_query, - documents=all_langchain_documents_to_research, - on_progress=stream_handler.handle_progress, - research_mode=research_mode - ) - ) - - # Stream results as they become available - while not research_task.done() or not stream_handler.queue.empty(): - try: - # Get the next result with a timeout - result = await asyncio.wait_for(stream_handler.get_next(), timeout=0.1) - stream_handler.task_done() - yield result - except asyncio.TimeoutError: - # No result available yet, check if the research task is done - if research_task.done(): - # If the queue is empty and the task is done, we're finished - if stream_handler.queue.empty(): - break - - # Get the final report - try: - final_report = await research_task - - # Send terminal message about research completion - yield streaming_service.add_terminal_message("Research completed", "success") - - # Update the answer with the final report - final_report_lines = final_report.split('\n') - yield streaming_service.update_answer(final_report_lines) - except Exception as e: - # Handle any exceptions - yield streaming_service.add_terminal_message(f"Error during research: {str(e)}", "error") - - # Send completion message - yield streaming_service.format_completion() + # Sample configuration + config = { + "configurable": { + "user_query": user_query, + "num_sections": NUM_SECTIONS, + "connectors_to_search": selected_connectors, + "user_id": user_id_str, + "search_space_id": search_space_id + } + } + # Initialize state with database session and streaming service + initial_state = State( + db_session=session, + streaming_service=streaming_service + ) + + # Run the graph directly + print("\nRunning the complete researcher workflow...") + + # Use streaming with config parameter + async for chunk in researcher_graph.astream( + initial_state, + config=config, + stream_mode="custom", + ): + # If the chunk contains a 'yeild_value' key, print its value + # Note: there's a typo in 'yeild_value' in the code, but we need to match it + if isinstance(chunk, dict) and 'yeild_value' in chunk: + yield chunk['yeild_value'] + + yield streaming_service.format_completion() \ No newline at end of file diff --git a/surfsense_backend/app/utils/query_service.py b/surfsense_backend/app/utils/query_service.py index b5df744a5..760f0c8fa 100644 --- a/surfsense_backend/app/utils/query_service.py +++ b/surfsense_backend/app/utils/query_service.py @@ -1,5 +1,7 @@ -from typing import Dict, Any -from langchain.schema import LLMResult, HumanMessage, SystemMessage +""" +NOTE: This is not used anymore. Might be removed in the future. +""" +from langchain.schema import HumanMessage, SystemMessage from app.config import config class QueryService: diff --git a/surfsense_backend/app/utils/research_service.py b/surfsense_backend/app/utils/research_service.py deleted file mode 100644 index c0034fd28..000000000 --- a/surfsense_backend/app/utils/research_service.py +++ /dev/null @@ -1,211 +0,0 @@ -import asyncio -import re -from typing import List, Dict, Any, AsyncGenerator, Callable, Optional -from langchain.schema import Document -from gpt_researcher.agent import GPTResearcher -from gpt_researcher.utils.enum import ReportType, Tone, ReportSource -from dotenv import load_dotenv - -load_dotenv() - -class ResearchService: - @staticmethod - async def create_custom_prompt(user_query: str) -> str: - citation_prompt = f""" - You are a research assistant tasked with analyzing documents and providing comprehensive answers with proper citations in IEEE format. - - - 1. Carefully analyze all provided documents in the section's. - 2. Extract relevant information that addresses the user's query. - 3. Synthesize a comprehensive, well-structured answer using information from these documents. - 4. For EVERY piece of information you include from the documents, add an IEEE-style citation in square brackets [X] where X is the source_id from the document's metadata. - 5. Make sure ALL factual statements from the documents have proper citations. - 6. If multiple documents support the same point, include all relevant citations [X], [Y]. - 7. Present information in a logical, coherent flow. - 8. Use your own words to connect ideas, but cite ALL information from the documents. - 9. If documents contain conflicting information, acknowledge this and present both perspectives with appropriate citations. - 10. Do not make up or include information not found in the provided documents. - 11. CRITICAL: You MUST use the exact source_id value from each document's metadata for citations. Do not create your own citation numbers. - 12. CRITICAL: Every citation MUST be in the IEEE format [X] where X is the exact source_id value. - 13. CRITICAL: Never renumber or reorder citations - always use the original source_id values. - 14. CRITICAL: Do not return citations as clickable links. - 15. CRITICAL: Never format citations as markdown links like "([1](https://example.com))". Always use plain square brackets only. - 16. CRITICAL: Citations must ONLY appear as [X] or [X], [Y], [Z] format - never with parentheses, hyperlinks, or other formatting. - 17. CRITICAL: Never make up citation numbers. Only use source_id values that are explicitly provided in the document metadata. - 18. CRITICAL: If you are unsure about a source_id, do not include a citation rather than guessing or making one up. - - - - - Write in clear, professional language suitable for academic or technical audiences - - Organize your response with appropriate paragraphs, headings, and structure - - Every fact from the documents must have an IEEE-style citation in square brackets [X] where X is the EXACT source_id from the document's metadata - - Citations should appear at the end of the sentence containing the information they support - - Multiple citations should be separated by commas: [X], [Y], [Z] - - No need to return references section. Just citation numbers in answer. - - NEVER create your own citation numbering system - use the exact source_id values from the documents. - - NEVER format citations as clickable links or as markdown links like "([1](https://example.com))". Always use plain square brackets only. - - NEVER make up citation numbers if you are unsure about the source_id. It is better to omit the citation than to guess. - - - - - - 1 - - - - The Great Barrier Reef is the world's largest coral reef system, stretching over 2,300 kilometers along the coast of Queensland, Australia. It comprises over 2,900 individual reefs and 900 islands. - - - - - - - 13 - - - - Climate change poses a significant threat to coral reefs worldwide. Rising ocean temperatures have led to mass coral bleaching events in the Great Barrier Reef in 2016, 2017, and 2020. - - - - - - - 21 - - - - The Great Barrier Reef was designated a UNESCO World Heritage Site in 1981 due to its outstanding universal value and biological diversity. It is home to over 1,500 species of fish and 400 types of coral. - - - - - - - The Great Barrier Reef is the world's largest coral reef system, stretching over 2,300 kilometers along the coast of Queensland, Australia [1]. It was designated a UNESCO World Heritage Site in 1981 due to its outstanding universal value and biological diversity [21]. The reef is home to over 1,500 species of fish and 400 types of coral [21]. Unfortunately, climate change poses a significant threat to coral reefs worldwide, with rising ocean temperatures leading to mass coral bleaching events in the Great Barrier Reef in 2016, 2017, and 2020 [13]. The reef system comprises over 2,900 individual reefs and 900 islands [1], making it an ecological treasure that requires protection from multiple threats [1], [13]. - - - - DO NOT use any of these incorrect citation formats: - - Using parentheses and markdown links: ([1](https://github.com/MODSetter/SurfSense)) - - Using parentheses around brackets: ([1]) - - Using hyperlinked text: [link to source 1](https://example.com) - - Using footnote style: ... reef system¹ - - Making up citation numbers when source_id is unknown - - ONLY use plain square brackets [1] or multiple citations [1], [2], [3] - - - Note that the citation numbers match exactly with the source_id values (1, 13, and 21) and are not renumbered sequentially. Citations follow IEEE style with square brackets and appear at the end of sentences. - - Now, please research the following query: - - - {user_query} - - """ - - return citation_prompt - - - @staticmethod - async def stream_research( - user_query: str, - documents: List[Document] = None, - on_progress: Optional[Callable] = None, - research_mode: str = "GENERAL" - ) -> str: - """ - Stream the research process using GPTResearcher - - Args: - user_query: The user's query - documents: List of Document objects to use for research - on_progress: Optional callback for progress updates - research_mode: Research mode to use - - Returns: - str: The final research report - """ - # Create a custom websocket-like object to capture streaming output - class StreamingWebsocket: - async def send_json(self, data): - if on_progress: - try: - # Filter out excessive logging of the prompt - if data.get("type") == "logs": - output = data.get("output", "") - # Check if this is a verbose prompt log - if "You are a research assistant tasked with analyzing documents" in output and len(output) > 500: - # Replace with a shorter message - data["output"] = f"Processing research for query: {user_query}" - - result = await on_progress(data) - return result - except Exception as e: - print(f"Error in on_progress callback: {e}") - return None - - streaming_websocket = StreamingWebsocket() - - custom_prompt_for_ieee_citations = await ResearchService.create_custom_prompt(user_query) - - if(research_mode == "GENERAL"): - research_report_type = ReportType.CustomReport.value - elif(research_mode == "DEEP"): - research_report_type = ReportType.ResearchReport.value - elif(research_mode == "DEEPER"): - research_report_type = ReportType.DetailedReport.value - # elif(research_mode == "DEEPEST"): - # research_report_type = ReportType.DeepResearch.value - - # Initialize GPTResearcher with the streaming websocket - researcher = GPTResearcher( - query=custom_prompt_for_ieee_citations, - report_type=research_report_type, - report_format="IEEE", - report_source=ReportSource.LangChainDocuments.value, - tone=Tone.Formal, - documents=documents, - verbose=True, - websocket=streaming_websocket - ) - - # Conduct research - await researcher.conduct_research() - - # Generate report with streaming - report = await researcher.write_report() - - # Fix citation format - report = ResearchService.fix_citation_format(report) - - return report - - @staticmethod - def fix_citation_format(text: str) -> str: - """ - Fix any incorrectly formatted citations in the text. - - Args: - text: The text to fix - - Returns: - str: The text with fixed citations - """ - if not text: - return text - - # More specific pattern to match only numeric citations in markdown-style links - # This matches patterns like ([1](https://github.com/...)) but not general links like ([Click here](https://...)) - pattern = r'\(\[(\d+)\]\((https?://[^\)]+)\)\)' - - # Replace with just [X] where X is the number - text = re.sub(pattern, r'[\1]', text) - - # Also match other incorrect formats like ([1]) and convert to [1] - # Only match if the content inside brackets is a number - text = re.sub(r'\(\[(\d+)\]\)', r'[\1]', text) - - return text \ No newline at end of file diff --git a/surfsense_backend/app/utils/streaming_service.py b/surfsense_backend/app/utils/streaming_service.py index 4f2b7d9c2..08a47a943 100644 --- a/surfsense_backend/app/utils/streaming_service.py +++ b/surfsense_backend/app/utils/streaming_service.py @@ -1,5 +1,6 @@ import json -from typing import List, Dict, Any, Generator +from typing import Any, Dict, List + class StreamingService: def __init__(self): @@ -18,55 +19,7 @@ class StreamingService: "content": [] } ] - - def add_terminal_message(self, text: str, message_type: str = "info") -> str: - """ - Add a terminal message to the annotations and return the formatted response - - Args: - text: The message text - message_type: The message type (info, success, error) - - Returns: - str: The formatted response string - """ - self.message_annotations[0]["content"].append({ - "id": self.terminal_idx, - "text": text, - "type": message_type - }) - self.terminal_idx += 1 - return self._format_annotations() - - def update_sources(self, sources: List[Dict[str, Any]]) -> str: - """ - Update the sources in the annotations and return the formatted response - - Args: - sources: List of source objects - - Returns: - str: The formatted response string - """ - self.message_annotations[1]["content"] = sources - return self._format_annotations() - - def update_answer(self, answer_content: List[str]) -> str: - """ - Update the answer in the annotations and return the formatted response - - Args: - answer_content: The answer content as a list of strings - - Returns: - str: The formatted response string - """ - self.message_annotations[2] = { - "type": "ANSWER", - "content": answer_content - } - return self._format_annotations() - + # It is used to send annotations to the frontend def _format_annotations(self) -> str: """ Format the annotations as a string @@ -76,6 +29,7 @@ class StreamingService: """ return f'8:{json.dumps(self.message_annotations)}\n' + # It is used to end Streaming def format_completion(self, prompt_tokens: int = 156, completion_tokens: int = 204) -> str: """ Format a completion message @@ -96,4 +50,23 @@ class StreamingService: "totalTokens": total_tokens } } - return f'd:{json.dumps(completion_data)}\n' \ No newline at end of file + return f'd:{json.dumps(completion_data)}\n' + + def only_update_terminal(self, text: str, message_type: str = "info") -> str: + self.message_annotations[0]["content"].append({ + "id": self.terminal_idx, + "text": text, + "type": message_type + }) + self.terminal_idx += 1 + return self.message_annotations + + def only_update_sources(self, sources: List[Dict[str, Any]]) -> str: + self.message_annotations[1]["content"] = sources + return self.message_annotations + + def only_update_answer(self, answer: List[str]) -> str: + self.message_annotations[2]["content"] = answer + return self.message_annotations + + \ No newline at end of file diff --git a/surfsense_backend/pyproject.toml b/surfsense_backend/pyproject.toml index 0d8682eb2..95b111e22 100644 --- a/surfsense_backend/pyproject.toml +++ b/surfsense_backend/pyproject.toml @@ -11,7 +11,6 @@ dependencies = [ "fastapi>=0.115.8", "fastapi-users[oauth,sqlalchemy]>=14.0.1", "firecrawl-py>=1.12.0", - "gpt-researcher>=0.12.12", "github3.py==4.0.1", "langchain-community>=0.3.17", "langchain-unstructured>=0.1.6", diff --git a/surfsense_web/components/markdown-viewer.tsx b/surfsense_web/components/markdown-viewer.tsx index 4398d1067..03fe7bada 100644 --- a/surfsense_web/components/markdown-viewer.tsx +++ b/surfsense_web/components/markdown-viewer.tsx @@ -117,13 +117,21 @@ function processCitationsInReactChildren(children: React.ReactNode, getCitationS // Process citation references in text content function processCitationsInText(text: string, getCitationSource: (id: number) => Source | null): React.ReactNode[] { + // Use improved regex to catch citation numbers more reliably + // This will match patterns like [1], [42], etc. including when they appear at the end of a line or sentence const citationRegex = /\[(\d+)\]/g; const parts: React.ReactNode[] = []; let lastIndex = 0; let match; let position = 0; + // Debug log for troubleshooting + console.log("Processing citations in text:", text); + while ((match = citationRegex.exec(text)) !== null) { + // Log each match for debugging + console.log("Citation match found:", match[0], "at index", match.index); + // Add text before the citation if (match.index > lastIndex) { parts.push(text.substring(lastIndex, match.index)); @@ -131,13 +139,18 @@ function processCitationsInText(text: string, getCitationSource: (id: number) => // Add the citation component const citationId = parseInt(match[1], 10); + const source = getCitationSource(citationId); + + // Log the citation details + console.log("Citation ID:", citationId, "Source:", source ? "found" : "not found"); + parts.push( ); From a1aad295bb1b8398df63c1f3e247f5931358a02b Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 20 Apr 2025 23:34:21 -0700 Subject: [PATCH 25/47] chore: cleanup --- README.md | 8 ++++---- surfsense_backend/.env.example | 9 ++++++--- .../researcher/sub_section_writer/nodes.py | 5 +++-- surfsense_backend/app/config/__init__.py | 17 +++-------------- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index aa337c7f2..d8c9cad61 100644 --- a/README.md +++ b/README.md @@ -119,13 +119,13 @@ This is the core of SurfSense. Before we begin let's look at `.env` variables' t | EMBEDDING_MODEL| Name of the embedding model to use for vector embeddings. Currently works with Sentence Transformers only. Expect other embeddings soon. Eg. `mixedbread-ai/mxbai-embed-large-v1`| | RERANKERS_MODEL_NAME| Name of the reranker model for search result reranking. Eg. `ms-marco-MiniLM-L-12-v2`| | RERANKERS_MODEL_TYPE| Type of reranker model being used. Eg. `flashrank`| -| FAST_LLM| LiteLLM routed Smaller, faster LLM for quick responses. Eg. `litellm:openai/gpt-4o`| -| STRATEGIC_LLM| LiteLLM routed Advanced LLM for complex reasoning tasks. Eg. `litellm:openai/gpt-4o`| -| LONG_CONTEXT_LLM| LiteLLM routed LLM capable of handling longer context windows. Eg. `litellm:gemini/gemini-2.0-flash`| +| FAST_LLM| LiteLLM routed Smaller, faster LLM for quick responses. Eg. `openai/gpt-4o-mini`, `ollama/deepseek-r1:8b`| +| STRATEGIC_LLM| LiteLLM routed Advanced LLM for complex reasoning tasks. Eg. `openai/gpt-4o`, `ollama/gemma3:12b`| +| LONG_CONTEXT_LLM| LiteLLM routed LLM capable of handling longer context windows. Eg. `gemini/gemini-2.0-flash`, `ollama/deepseek-r1:8b`| | UNSTRUCTURED_API_KEY| API key for Unstructured.io service for document parsing| | FIRECRAWL_API_KEY| API key for Firecrawl service for web crawling and data extraction| -IMPORTANT: Since LLM calls are routed through LiteLLM make sure to include API keys of LLM models you are using. For example if you used `litellm:openai/gpt-4o` make sure to include OpenAI API Key `OPENAI_API_KEY` or if you use `litellm:gemini/gemini-2.0-flash` then you include `GEMINI_API_KEY`. +IMPORTANT: Since LLM calls are routed through LiteLLM make sure to include API keys of LLM models you are using. For example if you used `openai/gpt-4o` make sure to include OpenAI API Key `OPENAI_API_KEY` or if you use `gemini/gemini-2.0-flash` then you include `GEMINI_API_KEY`. You can also integrate any LLM just follow this https://docs.litellm.ai/docs/providers diff --git a/surfsense_backend/.env.example b/surfsense_backend/.env.example index bc3f5cebb..2eee50d08 100644 --- a/surfsense_backend/.env.example +++ b/surfsense_backend/.env.example @@ -4,15 +4,18 @@ SECRET_KEY="SECRET" GOOGLE_OAUTH_CLIENT_ID="924507538m" GOOGLE_OAUTH_CLIENT_SECRET="GOCSV" NEXT_FRONTEND_URL="http://localhost:3000" + EMBEDDING_MODEL="mixedbread-ai/mxbai-embed-large-v1" RERANKERS_MODEL_NAME="ms-marco-MiniLM-L-12-v2" RERANKERS_MODEL_TYPE="flashrank" -FAST_LLM="litellm:openai/gpt-4o-mini" -STRATEGIC_LLM="litellm:openai/gpt-4o" -LONG_CONTEXT_LLM="litellm:gemini/gemini-2.0-flash" +# https://docs.litellm.ai/docs/providers +FAST_LLM="openai/gpt-4o-mini" +STRATEGIC_LLM="openai/gpt-4o" +LONG_CONTEXT_LLM="gemini/gemini-2.0-flash" +# Chosen LiteLLM Providers Keys OPENAI_API_KEY="sk-proj-iA" GEMINI_API_KEY="AIzaSyB6-1641124124124124124124124124124" diff --git a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py index 5b11141ca..0bec4618c 100644 --- a/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py +++ b/surfsense_backend/app/agents/researcher/sub_section_writer/nodes.py @@ -37,8 +37,9 @@ async def rerank_documents(state: State, config: RunnableConfig) -> Dict[str, An if reranker_service: try: # Use the sub-section questions for reranking context - rerank_query = "\n".join(sub_section_questions) - + # rerank_query = "\n".join(sub_section_questions) + rerank_query = configuration.user_query + # Convert documents to format expected by reranker if needed reranker_input_docs = [ { diff --git a/surfsense_backend/app/config/__init__.py b/surfsense_backend/app/config/__init__.py index 82517a8df..c7f842b71 100644 --- a/surfsense_backend/app/config/__init__.py +++ b/surfsense_backend/app/config/__init__.py @@ -15,17 +15,6 @@ env_file = BASE_DIR / ".env" load_dotenv(env_file) -def extract_model_name(llm_string: str) -> str: - """Extract the model name from an LLM string. - Example: "litellm:openai/gpt-4o-mini" -> "openai/gpt-4o-mini" - - Args: - llm_string: The LLM string with optional prefix - - Returns: - str: The extracted model name - """ - return llm_string.split(":", 1)[1] if ":" in llm_string else llm_string class Config: # Database @@ -38,13 +27,13 @@ class Config: # LONG-CONTEXT LLMS LONG_CONTEXT_LLM = os.getenv("LONG_CONTEXT_LLM") - long_context_llm_instance = ChatLiteLLM(model=extract_model_name(LONG_CONTEXT_LLM)) + long_context_llm_instance = ChatLiteLLM(model=LONG_CONTEXT_LLM) # GPT Researcher FAST_LLM = os.getenv("FAST_LLM") STRATEGIC_LLM = os.getenv("STRATEGIC_LLM") - fast_llm_instance = ChatLiteLLM(model=extract_model_name(FAST_LLM)) - strategic_llm_instance = ChatLiteLLM(model=extract_model_name(STRATEGIC_LLM)) + fast_llm_instance = ChatLiteLLM(model=FAST_LLM) + strategic_llm_instance = ChatLiteLLM(model=STRATEGIC_LLM) # Chonkie Configuration | Edit this to your needs From 5fecca945763419f8db58a94b377dda46c025105 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Mon, 21 Apr 2025 01:36:19 -0700 Subject: [PATCH 26/47] feat: Added envs for LLM Observability --- surfsense_backend/.env.example | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/surfsense_backend/.env.example b/surfsense_backend/.env.example index 2eee50d08..6dfcc9967 100644 --- a/surfsense_backend/.env.example +++ b/surfsense_backend/.env.example @@ -21,3 +21,9 @@ GEMINI_API_KEY="AIzaSyB6-1641124124124124124124124124124" UNSTRUCTURED_API_KEY="Tpu3P0U8iy" FIRECRAWL_API_KEY="fcr-01J0000000000000000000000" + +#OPTIONAL: Add these for LangSmith Observability +LANGSMITH_TRACING=true +LANGSMITH_ENDPOINT="https://api.smith.langchain.com" +LANGSMITH_API_KEY="lsv2_pt_....." +LANGSMITH_PROJECT="surfsense" From b19e241ca2d174d25c0eb74c6638a80f412a0d7a Mon Sep 17 00:00:00 2001 From: Rohan Verma <122026167+MODSetter@users.noreply.github.com> Date: Mon, 21 Apr 2025 01:42:38 -0700 Subject: [PATCH 27/47] Update README.md Basic LangSmith Info --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index d8c9cad61..4cb51fa42 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,16 @@ SurfSense now only works with Google OAuth. Make sure to set your OAuth Client a ![gauth](https://github.com/user-attachments/assets/80d60fe5-889b-48a6-b947-200fdaf544c1) +#### LLM Observability +One easy way to observe SurfSense Researcher Agent is to use LangSmith. Get its API KEY from https://smith.langchain.com/ + +**Open AI LLMS** +![openai_langraph](https://github.com/user-attachments/assets/b1f4c7a1-0a66-4d21-9053-2e09a5634f95) + + +**Ollama LLMS** +![ollama_langgraph](https://github.com/user-attachments/assets/5b6c870e-095c-4368-86e6-f7488e0fca28) + #### Crawler Support SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) right now. Playwright crawler support will be added soon. From 3155e7b0ac1b51732f7ea3f6ca610a141024007d Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Mon, 21 Apr 2025 23:58:32 -0700 Subject: [PATCH 28/47] chore: Added Versions --- surfsense_backend/pyproject.toml | 4 +- surfsense_backend/uv.lock | 364 +---------------------- surfsense_browser_extension/package.json | 6 +- surfsense_web/package.json | 5 +- 4 files changed, 9 insertions(+), 370 deletions(-) diff --git a/surfsense_backend/pyproject.toml b/surfsense_backend/pyproject.toml index 95b111e22..7b7a6f900 100644 --- a/surfsense_backend/pyproject.toml +++ b/surfsense_backend/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "surf-new-backend" -version = "0.1.0" -description = "Add your description here" +version = "0.0.6" +description = "SurfSense Backend" readme = "README.md" requires-python = ">=3.12" dependencies = [ diff --git a/surfsense_backend/uv.lock b/surfsense_backend/uv.lock index 6e9c3b51a..9b485b0df 100644 --- a/surfsense_backend/uv.lock +++ b/surfsense_backend/uv.lock @@ -168,19 +168,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, ] -[[package]] -name = "arxiv" -version = "2.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "feedparser" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/59/fe41f54bdfed776c2e9bcd6289e4c71349eb938241d89b4c97d0f33e8013/arxiv-2.1.3.tar.gz", hash = "sha256:32365221994d2cf05657c1fadf63a26efc8ccdec18590281ee03515bfef8bc4e", size = 16747 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/7b/7bf42178d227b26d3daf94cdd22a72a4ed5bf235548c4f5aea49c51c6458/arxiv-2.1.3-py3-none-any.whl", hash = "sha256:6f43673ab770a9e848d7d4fc1894824df55edeac3c3572ea280c9ba2e3c0f39f", size = 11478 }, -] - [[package]] name = "asyncpg" version = "0.30.0" @@ -279,61 +266,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] -[[package]] -name = "brotli" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693 }, - { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489 }, - { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081 }, - { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244 }, - { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505 }, - { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152 }, - { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252 }, - { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955 }, - { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304 }, - { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452 }, - { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751 }, - { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757 }, - { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146 }, - { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055 }, - { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102 }, - { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029 }, - { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276 }, - { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255 }, - { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681 }, - { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475 }, - { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173 }, - { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803 }, - { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946 }, - { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707 }, - { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231 }, - { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157 }, - { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122 }, - { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206 }, - { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804 }, - { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517 }, -] - -[[package]] -name = "brotlicffi" -version = "1.1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/95/9d/70caa61192f570fcf0352766331b735afa931b4c6bc9a348a0925cc13288/brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13", size = 465192 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/11/7b96009d3dcc2c931e828ce1e157f03824a69fb728d06bfd7b2fc6f93718/brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851", size = 453786 }, - { url = "https://files.pythonhosted.org/packages/d6/e6/a8f46f4a4ee7856fbd6ac0c6fb0dc65ed181ba46cd77875b8d9bbe494d9e/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b", size = 2911165 }, - { url = "https://files.pythonhosted.org/packages/be/20/201559dff14e83ba345a5ec03335607e47467b6633c210607e693aefac40/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814", size = 2927895 }, - { url = "https://files.pythonhosted.org/packages/cd/15/695b1409264143be3c933f708a3f81d53c4a1e1ebbc06f46331decbf6563/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820", size = 2851834 }, - { url = "https://files.pythonhosted.org/packages/b4/40/b961a702463b6005baf952794c2e9e0099bde657d0d7e007f923883b907f/brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb", size = 341731 }, - { url = "https://files.pythonhosted.org/packages/1c/fa/5408a03c041114ceab628ce21766a4ea882aa6f6f0a800e04ee3a30ec6b9/brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613", size = 366783 }, -] - [[package]] name = "cachetools" version = "5.5.2" @@ -559,19 +491,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/05/5533d30f53f10239616a357f080892026db2d550a40c393d0a8a7af834a9/cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f", size = 3207303 }, ] -[[package]] -name = "cssselect2" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tinycss2" }, - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454 }, -] - [[package]] name = "cycler" version = "0.12.1" @@ -633,12 +552,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, ] -[[package]] -name = "docopt" -version = "0.6.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901 } - [[package]] name = "effdet" version = "0.4.1" @@ -747,18 +660,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/08/9968963c1fb8c34627b7f1fbcdfe9438540f87dc7c9bfb59bb4fd19a4ecf/fastapi_users_db_sqlalchemy-7.0.0-py3-none-any.whl", hash = "sha256:5fceac018e7cfa69efc70834dd3035b3de7988eb4274154a0dbe8b14f5aa001e", size = 6891 }, ] -[[package]] -name = "feedparser" -version = "6.0.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sgmllib3k" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/aa/7af346ebeb42a76bf108027fe7f3328bb4e57a3a96e53e21fd9ef9dd6dd0/feedparser-6.0.11.tar.gz", hash = "sha256:c9d0407b64c6f2a065d0ebb292c2b35c01050cc0dc33757461aaabdc4c4184d5", size = 286197 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/d4/8c31aad9cc18f451c49f7f9cfb5799dadffc88177f7917bc90a66459b1d7/feedparser-6.0.11-py3-none-any.whl", hash = "sha256:0be7ee7b395572b19ebeb1d6aafb0028dee11169f1c934e0ed67d54992f4ad45", size = 81343 }, -] - [[package]] name = "filelock" version = "3.17.0" @@ -843,13 +744,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/ff/44934a031ce5a39125415eb405b9efb76fe7f9586b75291d66ae5cbfc4e6/fonttools-4.56.0-py3-none-any.whl", hash = "sha256:1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14", size = 1089800 }, ] -[package.optional-dependencies] -woff = [ - { name = "brotli", marker = "platform_python_implementation == 'CPython'" }, - { name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" }, - { name = "zopfli" }, -] - [[package]] name = "frozenlist" version = "1.5.0" @@ -976,42 +870,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/53/d35476d547a286506f0a6a634ccf1e5d288fffd53d48f0bd5fef61d68684/googleapis_common_protos-1.69.2-py3-none-any.whl", hash = "sha256:0b30452ff9c7a27d80bfc5718954063e8ab53dd3697093d3bc99581f5fd24212", size = 293215 }, ] -[[package]] -name = "gpt-researcher" -version = "0.12.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiofiles" }, - { name = "arxiv" }, - { name = "beautifulsoup4" }, - { name = "colorama" }, - { name = "htmldocx" }, - { name = "json-repair" }, - { name = "json5" }, - { name = "langchain" }, - { name = "langchain-community" }, - { name = "langchain-openai" }, - { name = "loguru" }, - { name = "lxml-html-clean" }, - { name = "markdown" }, - { name = "md2pdf" }, - { name = "mistune" }, - { name = "pydantic" }, - { name = "pymupdf" }, - { name = "python-docx" }, - { name = "python-dotenv" }, - { name = "python-multipart" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tiktoken" }, - { name = "unstructured" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/d2/3a1acfd8b71ead6ab9a6833bcd1725e468e65817e7b04c233cd2d5e0a629/gpt_researcher-0.12.12.tar.gz", hash = "sha256:e3fa6faae4a3dc7e4280521eceb94a081a0aae277eb1ded25152579f65195844", size = 123669 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/0b/80ade14566946ca2253d1718746b63059f5bb1a2e489804c87e24332082d/gpt_researcher-0.12.12-py3-none-any.whl", hash = "sha256:3db51994406844d8acb28cb2a4897b9e9aaa34f0127edd7f8ded103fe2e544d4", size = 161671 }, -] - [[package]] name = "greenlet" version = "3.1.1" @@ -1109,19 +967,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173 }, ] -[[package]] -name = "htmldocx" -version = "0.0.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "python-docx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/61/91a6b70ee576a4b07310d81efd4c688fe2e6f63ea42ec95b8f1d436b887e/htmldocx-0.0.6.tar.gz", hash = "sha256:b4bcec895f86d7a50ffc7133ca24d85c24f3614db2b37d33a30d9d04654a5486", size = 9418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/da/c70fc2ce54c1d1ce7c16f9656589273a6c94cbbc8867b3a512618d977309/htmldocx-0.0.6-py3-none-any.whl", hash = "sha256:adf5e95ad8ba8121e606cf138c614de13327a1192a5782acdb4a0abdc23db1b7", size = 9490 }, -] - [[package]] name = "httpcore" version = "1.0.7" @@ -1300,24 +1145,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, ] -[[package]] -name = "json-repair" -version = "0.39.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/60/6d1599bc01070d9fe3840d245ae80fd24b981c732d962842825ce7a9fde6/json_repair-0.39.1.tar.gz", hash = "sha256:e90a489f247e1a8fc86612a5c719872a3dbf9cbaffd6d55f238ec571a77740fa", size = 30040 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/b9/2e445481555422b907dab468b53574bc1e995099ca1a1201d0d876ca05e9/json_repair-0.39.1-py3-none-any.whl", hash = "sha256:3001409a2f319249f13e13d6c622117a5b70ea7e0c6f43864a0233cdffc3a599", size = 20686 }, -] - -[[package]] -name = "json5" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/3d/bbe62f3d0c05a689c711cff57b2e3ac3d3e526380adb7c781989f075115c/json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559", size = 48202 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", size = 34049 }, -] - [[package]] name = "jsonpatch" version = "1.33" @@ -1479,20 +1306,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/0e/ddf9f5dc46b178df5c101666bb3bc7fc526d68cd81cdd60cbe1b6b438b30/langchain_core-0.3.43-py3-none-any.whl", hash = "sha256:caa6bc1f4c6ab71d3c2e400f8b62e1cd6dc5ac2c37e03f12f3e2c60befd5b273", size = 415421 }, ] -[[package]] -name = "langchain-openai" -version = "0.3.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "openai" }, - { name = "tiktoken" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2e/04/ae071af0b04d1c3a8040498714091afd21149f6f8ae1dbab584317d9dfd7/langchain_openai-0.3.8.tar.gz", hash = "sha256:4d73727eda8102d1d07a2ca036278fccab0bb5e0abf353cec9c3973eb72550ec", size = 256898 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/43/9c6a1101bcd751d52a3328a06956f85122f9aaa31da1b15a8e0f99a70317/langchain_openai-0.3.8-py3-none-any.whl", hash = "sha256:9004dc8ef853aece0d8f0feca7753dc97f710fa3e53874c8db66466520436dbb", size = 55446 }, -] - [[package]] name = "langchain-text-splitters" version = "0.3.6" @@ -1622,19 +1435,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/c2/1b6c502909b7af9054736af61e27558a3341e8c1ba28e7f82473e6dd936f/litellm-1.61.4-py3-none-any.whl", hash = "sha256:e87e0d397a191795b4217f9299fc9b21eaacaab91409695f0a4780cceccda6e1", size = 6814517 }, ] -[[package]] -name = "loguru" -version = "0.7.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "win32-setctime", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, -] - [[package]] name = "lxml" version = "5.3.1" @@ -1677,18 +1477,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/80/83/8c54533b3576f4391eebea88454738978669a6cad0d8e23266224007939d/lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332", size = 3814484 }, ] -[[package]] -name = "lxml-html-clean" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lxml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/81/f2/fe319e3c5cb505a361b95d1e0d0d793fe28d4dcc2fc39d3cae9324dc4233/lxml_html_clean-0.4.1.tar.gz", hash = "sha256:40c838bbcf1fc72ba4ce811fbb3135913017b27820d7c16e8bc412ae1d8bc00b", size = 21378 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ba/2af7a60b45bf21375e111c1e2d5d721108d06c80e3d9a3cc1d767afe1731/lxml_html_clean-0.4.1-py3-none-any.whl", hash = "sha256:b704f2757e61d793b1c08bf5ad69e4c0b68d6696f4c3c1429982caf90050bcaf", size = 14114 }, -] - [[package]] name = "makefun" version = "1.15.6" @@ -1731,15 +1519,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, ] -[[package]] -name = "markdown2" -version = "2.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/52/d7dcc6284d59edb8301b8400435fbb4926a9b0f13a12b5cbaf3a4a54bb7b/markdown2-2.5.3.tar.gz", hash = "sha256:4d502953a4633408b0ab3ec503c5d6984d1b14307e32b325ec7d16ea57524895", size = 141676 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/37/0a13c83ccf5365b8e08ea572dfbc04b8cb87cadd359b2451a567f5248878/markdown2-2.5.3-py3-none-any.whl", hash = "sha256:a8ebb7e84b8519c37bf7382b3db600f1798a22c245bfd754a1f87ca8d7ea63b3", size = 48550 }, -] - [[package]] name = "markdownify" version = "0.14.1" @@ -1840,17 +1619,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, ] -[[package]] -name = "md2pdf" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docopt" }, - { name = "markdown2" }, - { name = "weasyprint" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/de/b0/adbef5356f97a6d33c7811805b06e3774c7a58ea70dc28039ae4ad1ba1be/md2pdf-1.0.1.tar.gz", hash = "sha256:3d5aab77dcd5b6f5827b193819ab1a8c1cec506ce5f6c777c3411b703352cd98", size = 6377 } - [[package]] name = "mdurl" version = "0.1.2" @@ -1860,15 +1628,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] -[[package]] -name = "mistune" -version = "3.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/f7/f6d06304c61c2a73213c0a4815280f70d985429cda26272f490e42119c1a/mistune-3.1.2.tar.gz", hash = "sha256:733bf018ba007e8b5f2d3a9eb624034f6ee26c4ea769a98ec533ee111d504dff", size = 94613 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/92/30b4e54c4d7c48c06db61595cffbbf4f19588ea177896f9b78f0fbe021fd/mistune-3.1.2-py3-none-any.whl", hash = "sha256:4b47731332315cdca99e0ded46fc0004001c1299ff773dfb48fbe1fd226de319", size = 53696 }, -] - [[package]] name = "model2vec" version = "0.4.0" @@ -2692,15 +2451,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 }, ] -[[package]] -name = "pydyf" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/c2/97fc6ce4ce0045080dc99446def812081b57750ed8aa67bfdfafa4561fe5/pydyf-0.11.0.tar.gz", hash = "sha256:394dddf619cca9d0c55715e3c55ea121a9bf9cbc780cdc1201a2427917b86b64", size = 17769 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/ac/d5db977deaf28c6ecbc61bbca269eb3e8f0b3a1f55c8549e5333e606e005/pydyf-0.11.0-py3-none-any.whl", hash = "sha256:0aaf9e2ebbe786ec7a78ec3fbffa4cdcecde53fd6f563221d53c6bc1328848a3", size = 8104 }, -] - [[package]] name = "pyee" version = "12.1.1" @@ -2736,21 +2486,6 @@ crypto = [ { name = "cryptography" }, ] -[[package]] -name = "pymupdf" -version = "1.25.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/47/b61c1c44b87cbdaeecdec3f43ce524ed6b3c72172bc6184eb82c94fbc43d/pymupdf-1.25.3.tar.gz", hash = "sha256:b640187c64c5ac5d97505a92e836da299da79c2f689f3f94a67a37a493492193", size = 67259841 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/9b/98ef4b98309e9db3baa9fe572f0e61b6130bb9852d13189970f35b703499/pymupdf-1.25.3-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:96878e1b748f9c2011aecb2028c5f96b5a347a9a91169130ad0133053d97915e", size = 19343576 }, - { url = "https://files.pythonhosted.org/packages/14/62/4e12126db174c8cfbf692281cda971cc4046c5f5226032c2cfaa6f83e08d/pymupdf-1.25.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:6ef753005b72ebfd23470f72f7e30f61e21b0b5e748045ec5b8f89e6e3068d62", size = 18580114 }, - { url = "https://files.pythonhosted.org/packages/ec/c5/cf7ecf005e4f8ba3664d6aaa0613adeba4c2ab524832c452c69857e7184f/pymupdf-1.25.3-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cbff443d899f37b17f1e67563cc03673d50b4bf33ccc237e73d34f18f3a07ccf", size = 19442580 }, - { url = "https://files.pythonhosted.org/packages/52/de/bd1418e31f73d37b8381cd5deacfd681e6be702b8890e123e83724569ee1/pymupdf-1.25.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46d90c4f9e62d1856e8db4b9f04a202ff4a7f086a816af73abdc86adb7f5e25a", size = 19999825 }, - { url = "https://files.pythonhosted.org/packages/42/ee/3c449b0de061440ba1ac984aa845315e9e2dca0ff2003c5adfc6febff203/pymupdf-1.25.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5de51efdbe4d486b6c1111c84e8a231cbfb426f3d6ff31ab530ad70e6f39756", size = 21123157 }, - { url = "https://files.pythonhosted.org/packages/83/53/71faaaf91c56f2883b13f3dd849bf2697f012eb35eb7b952d62734cff41f/pymupdf-1.25.3-cp39-abi3-win32.whl", hash = "sha256:bca72e6089f985d800596e22973f79cc08af6cbff1d93e5bda9248326a03857c", size = 15094211 }, - { url = "https://files.pythonhosted.org/packages/09/e0/d72e88a1d5e23aa381fd463057dc3d0fb29090e1e7308a870c334716579c/pymupdf-1.25.3-cp39-abi3-win_amd64.whl", hash = "sha256:4fb357438c9129fbf939b5af85323434df64e36759c399c376b62ad6da95498c", size = 16542949 }, -] - [[package]] name = "pypandoc" version = "1.15" @@ -2798,15 +2533,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/6b/2706497c86e8d69fb76afe5ea857fe1794621aa0f3b1d863feb953fe0f22/pypdfium2-4.30.1-py3-none-win_arm64.whl", hash = "sha256:c2b6d63f6d425d9416c08d2511822b54b8e3ac38e639fc41164b1d75584b3a8c", size = 2814810 }, ] -[[package]] -name = "pyphen" -version = "0.17.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/56/e4d7e1bd70d997713649c5ce530b2d15a5fc2245a74ca820fc2d51d89d4d/pyphen-0.17.2.tar.gz", hash = "sha256:f60647a9c9b30ec6c59910097af82bc5dd2d36576b918e44148d8b07ef3b4aa3", size = 2079470 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/1f/c2142d2edf833a90728e5cdeb10bdbdc094dde8dbac078cee0cf33f5e11b/pyphen-0.17.2-py3-none-any.whl", hash = "sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd", size = 2079358 }, -] - [[package]] name = "pyreadline3" version = "3.5.4" @@ -3255,12 +2981,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, ] -[[package]] -name = "sgmllib3k" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/bd/3704a8c3e0942d711c1299ebf7b9091930adae6675d7c8f476a7ce48653c/sgmllib3k-1.0.0.tar.gz", hash = "sha256:7868fb1c8bfa764c1ac563d3cf369c381d1325d36124933a726f29fcdaa812e9", size = 5750 } - [[package]] name = "six" version = "1.17.0" @@ -3345,7 +3065,7 @@ wheels = [ [[package]] name = "surf-new-backend" -version = "0.1.0" +version = "0.0.6" source = { virtual = "." } dependencies = [ { name = "alembic" }, @@ -3355,7 +3075,6 @@ dependencies = [ { name = "fastapi-users", extra = ["oauth", "sqlalchemy"] }, { name = "firecrawl-py" }, { name = "github3-py" }, - { name = "gpt-researcher" }, { name = "langchain-community" }, { name = "langchain-unstructured" }, { name = "langgraph" }, @@ -3384,7 +3103,6 @@ requires-dist = [ { name = "fastapi-users", extras = ["oauth", "sqlalchemy"], specifier = ">=14.0.1" }, { name = "firecrawl-py", specifier = ">=1.12.0" }, { name = "github3-py", specifier = "==4.0.1" }, - { name = "gpt-researcher", specifier = ">=0.12.12" }, { name = "langchain-community", specifier = ">=0.3.17" }, { name = "langchain-unstructured", specifier = ">=0.1.6" }, { name = "langgraph", specifier = ">=0.3.29" }, @@ -3488,30 +3206,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/d0/179abca8b984b3deefd996f362b612c39da73b60f685921e6cd58b6125b4/timm-1.0.15-py3-none-any.whl", hash = "sha256:5a3dc460c24e322ecc7fd1f3e3eb112423ddee320cb059cc1956fbc9731748ef", size = 2361373 }, ] -[[package]] -name = "tinycss2" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, -] - -[[package]] -name = "tinyhtml5" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/03/6111ed99e9bf7dfa1c30baeef0e0fb7e0bd387bd07f8e5b270776fe1de3f/tinyhtml5-2.0.0.tar.gz", hash = "sha256:086f998833da24c300c414d9fe81d9b368fd04cb9d2596a008421cbc705fcfcc", size = 179507 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/de/27c57899297163a4a84104d5cec0af3b1ac5faf62f44667e506373c6b8ce/tinyhtml5-2.0.0-py3-none-any.whl", hash = "sha256:13683277c5b176d070f82d099d977194b7a1e26815b016114f581a74bbfbf47e", size = 39793 }, -] - [[package]] name = "tokenizers" version = "0.21.0" @@ -3891,25 +3585,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, ] -[[package]] -name = "weasyprint" -version = "64.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, - { name = "cssselect2" }, - { name = "fonttools", extra = ["woff"] }, - { name = "pillow" }, - { name = "pydyf" }, - { name = "pyphen" }, - { name = "tinycss2" }, - { name = "tinyhtml5" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/a0/f6b3ef688e747488b17b3b39d27fe7438d3ec88d1b79d5524485a5458020/weasyprint-64.1.tar.gz", hash = "sha256:28b02f2c6409bafce1b1220d9d76a7345875bd3bd08c4f6dfbf510bb92a94757", size = 498647 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/95/bf333fbbaf73c1c211b6b801b9ac2563db8e2225f69902d1ba8b25c70e9c/weasyprint-64.1-py3-none-any.whl", hash = "sha256:f7c88ea8ce0ce0c527cbb9c802689e035fae50016d7efc5dfdaba4b75abf68f4", size = 302025 }, -] - [[package]] name = "webencodings" version = "0.5.1" @@ -3950,15 +3625,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/c8/d529f8a32ce40d98309f4470780631e971a5a842b60aec864833b3615786/websockets-14.2-py3-none-any.whl", hash = "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b", size = 157416 }, ] -[[package]] -name = "win32-setctime" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, -] - [[package]] name = "wrapt" version = "1.17.2" @@ -4125,34 +3791,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, ] -[[package]] -name = "zopfli" -version = "0.2.3.post1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/7c/a8f6696e694709e2abcbccd27d05ef761e9b6efae217e11d977471555b62/zopfli-0.2.3.post1.tar.gz", hash = "sha256:96484dc0f48be1c5d7ae9f38ed1ce41e3675fd506b27c11a6607f14b49101e99", size = 175629 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/ce/b6441cc01881d06e0b5883f32c44e7cc9772e0d04e3e59277f59f80b9a19/zopfli-0.2.3.post1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3f0197b6aa6eb3086ae9e66d6dd86c4d502b6c68b0ec490496348ae8c05ecaef", size = 295489 }, - { url = "https://files.pythonhosted.org/packages/93/f0/24dd708f00ae0a925bc5c9edae858641c80f6a81a516810dc4d21688a930/zopfli-0.2.3.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fcfc0dc2761e4fcc15ad5d273b4d58c2e8e059d3214a7390d4d3c8e2aee644e", size = 163010 }, - { url = "https://files.pythonhosted.org/packages/65/57/0378eeeb5e3e1e83b1b0958616b2bf954f102ba5b0755b9747dafbd8cb72/zopfli-0.2.3.post1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cac2b37ab21c2b36a10b685b1893ebd6b0f83ae26004838ac817680881576567", size = 823649 }, - { url = "https://files.pythonhosted.org/packages/ab/8a/3ab8a616d4655acf5cf63c40ca84e434289d7d95518a1a42d28b4a7228f8/zopfli-0.2.3.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d5ab297d660b75c159190ce6d73035502310e40fd35170aed7d1a1aea7ddd65", size = 826557 }, - { url = "https://files.pythonhosted.org/packages/ed/4d/7f6820af119c4fec6efaf007bffee7bc9052f695853a711a951be7afd26b/zopfli-0.2.3.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba214f4f45bec195ee8559651154d3ac2932470b9d91c5715fc29c013349f8c", size = 851127 }, - { url = "https://files.pythonhosted.org/packages/e1/db/1ef5353ab06f9f2fb0c25ed0cddf1418fe275cc2ee548bc4a29340c44fe1/zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1e0ed5d84ffa2d677cc9582fc01e61dab2e7ef8b8996e055f0a76167b1b94df", size = 1754183 }, - { url = "https://files.pythonhosted.org/packages/39/03/44f8f39950354d330fa798e4bab1ac8e38ec787d3fde25d5b9c7770065a2/zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bfa1eb759e07d8b7aa7a310a2bc535e127ee70addf90dc8d4b946b593c3e51a8", size = 1905945 }, - { url = "https://files.pythonhosted.org/packages/74/7b/94b920c33cc64255f59e3cfc77c829b5c6e60805d189baeada728854a342/zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd2c002f160502608dcc822ed2441a0f4509c52e86fcfd1a09e937278ed1ca14", size = 1835885 }, - { url = "https://files.pythonhosted.org/packages/ad/89/c869ac844351e285a6165e2da79b715b0619a122e3160d183805adf8ab45/zopfli-0.2.3.post1-cp312-cp312-win32.whl", hash = "sha256:7be5cc6732eb7b4df17305d8a7b293223f934a31783a874a01164703bc1be6cd", size = 82743 }, - { url = "https://files.pythonhosted.org/packages/29/e6/c98912fd3a589d8a7316c408fd91519f72c237805c4400b753e3942fda0b/zopfli-0.2.3.post1-cp312-cp312-win_amd64.whl", hash = "sha256:4e50ffac74842c1c1018b9b73875a0d0a877c066ab06bf7cccbaa84af97e754f", size = 99403 }, - { url = "https://files.pythonhosted.org/packages/2b/24/0e552e2efce9a20625b56e9609d1e33c2966be33fc008681121ec267daec/zopfli-0.2.3.post1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecb7572df5372abce8073df078207d9d1749f20b8b136089916a4a0868d56051", size = 295485 }, - { url = "https://files.pythonhosted.org/packages/08/83/b2564369fb98797a617fe2796097b1d719a4937234375757ad2a3febc04b/zopfli-0.2.3.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1cf720896d2ce998bc8e051d4b4ce0d8bec007aab6243102e8e1d22a0b2fb3f", size = 163000 }, - { url = "https://files.pythonhosted.org/packages/3c/55/81d419739c2aab35e19b58bce5498dcb58e6446e5eb69f2d3c748b1c9151/zopfli-0.2.3.post1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aad740b4d4fcbaaae4887823925166ffd062db3b248b3f432198fc287381d1a", size = 823699 }, - { url = "https://files.pythonhosted.org/packages/9e/91/89f07c8ea3c9bc64099b3461627b07a8384302235ee0f357eaa86f98f509/zopfli-0.2.3.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6617fb10f9e4393b331941861d73afb119cd847e88e4974bdbe8068ceef3f73f", size = 826612 }, - { url = "https://files.pythonhosted.org/packages/41/31/46670fc0c7805d42bc89702440fa9b73491d68abbc39e28d687180755178/zopfli-0.2.3.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53b18797cdef27e019db595d66c4b077325afe2fd62145953275f53d84ce40c", size = 851148 }, - { url = "https://files.pythonhosted.org/packages/22/00/71ad39277bbb88f9fd20fb786bd3ff2ea4025c53b31652a0da796fb546cd/zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b78008a69300d929ca2efeffec951b64a312e9a811e265ea4a907ab546d79fa6", size = 1754215 }, - { url = "https://files.pythonhosted.org/packages/d0/4e/e542c508d20c3dfbef1b90fcf726f824f505e725747f777b0b7b7d1deb95/zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa5f90d6298bda02a95bc8dc8c3c19004d5a4e44bda00b67ca7431d857b4b54", size = 1905988 }, - { url = "https://files.pythonhosted.org/packages/ba/a5/817ac1ecc888723e91dc172e8c6eeab9f48a1e52285803b965084e11bbd5/zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2768c877f76c8a0e7519b1c86c93757f3c01492ddde55751e9988afb7eff64e1", size = 1835907 }, - { url = "https://files.pythonhosted.org/packages/cd/35/2525f90c972d8aafc39784a8c00244eeee8e8221b26cbc576748ee9dc1cd/zopfli-0.2.3.post1-cp313-cp313-win32.whl", hash = "sha256:71390dbd3fbf6ebea9a5d85ffed8c26ee1453ee09248e9b88486e30e0397b775", size = 82742 }, - { url = "https://files.pythonhosted.org/packages/2f/c6/49b27570923956d52d37363e8f5df3a31a61bd7719bb8718527a9df3ae5f/zopfli-0.2.3.post1-cp313-cp313-win_amd64.whl", hash = "sha256:a86eb88e06bd87e1fff31dac878965c26b0c26db59ddcf78bb0379a954b120de", size = 99408 }, -] - [[package]] name = "zstandard" version = "0.23.0" diff --git a/surfsense_browser_extension/package.json b/surfsense_browser_extension/package.json index 25600ce12..3d2d04002 100644 --- a/surfsense_browser_extension/package.json +++ b/surfsense_browser_extension/package.json @@ -1,7 +1,7 @@ { - "name": "surfsense", - "displayName": "Surfsense", - "version": "0.0.1", + "name": "surfsense_browser_extension", + "displayName": "Surfsense Browser Extension", + "version": "0.0.6", "description": "Extension to collect Browsing History for SurfSense.", "author": "https://github.com/MODSetter", "scripts": { diff --git a/surfsense_web/package.json b/surfsense_web/package.json index bffae6cb6..e2047644a 100644 --- a/surfsense_web/package.json +++ b/surfsense_web/package.json @@ -1,7 +1,8 @@ { - "name": "surf_new_frontend", - "version": "0.1.0", + "name": "surfsense_web", + "version": "0.0.6", "private": true, + "description": "SurfSense Frontend", "scripts": { "dev": "next dev --turbopack", "build": "next build", From 0436d2ab64f084dc13264bc97a32e2b6f67d9c99 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Tue, 22 Apr 2025 02:24:13 -0700 Subject: [PATCH 29/47] feat: Added FumaDocs --- surfsense_web/.source/index.ts | 5 + surfsense_web/.source/source.config.mjs | 8 + surfsense_web/app/api/search/route.ts | 4 + surfsense_web/app/docs/[[...slug]]/page.tsx | 46 + surfsense_web/app/docs/layout.tsx | 12 + surfsense_web/app/globals.css | 4 +- surfsense_web/app/layout.config.tsx | 7 + surfsense_web/app/layout.tsx | 7 +- surfsense_web/content/docs/index.mdx | 7 + surfsense_web/lib/source.ts | 7 + surfsense_web/mdx-components.tsx | 9 + surfsense_web/next.config.ts | 6 +- surfsense_web/package.json | 10 +- surfsense_web/pnpm-lock.yaml | 1788 ++++++++++++++++++- surfsense_web/source.config.ts | 5 + surfsense_web/tsconfig.json | 2 +- 16 files changed, 1919 insertions(+), 8 deletions(-) create mode 100644 surfsense_web/.source/index.ts create mode 100644 surfsense_web/.source/source.config.mjs create mode 100644 surfsense_web/app/api/search/route.ts create mode 100644 surfsense_web/app/docs/[[...slug]]/page.tsx create mode 100644 surfsense_web/app/docs/layout.tsx create mode 100644 surfsense_web/app/layout.config.tsx create mode 100644 surfsense_web/content/docs/index.mdx create mode 100644 surfsense_web/lib/source.ts create mode 100644 surfsense_web/mdx-components.tsx create mode 100644 surfsense_web/source.config.ts diff --git a/surfsense_web/.source/index.ts b/surfsense_web/.source/index.ts new file mode 100644 index 000000000..0002966e0 --- /dev/null +++ b/surfsense_web/.source/index.ts @@ -0,0 +1,5 @@ +// @ts-nocheck -- skip type checking +import * as docs_0 from "../content/docs/index.mdx?collection=docs&hash=1745310068376" +import { _runtime } from "fumadocs-mdx" +import * as _source from "../source.config" +export const docs = _runtime.docs([{ info: {"path":"index.mdx","absolutePath":"C:/Users/91882/Documents/SurfSense/surfsense_web/content/docs/index.mdx"}, data: docs_0 }], []) \ No newline at end of file diff --git a/surfsense_web/.source/source.config.mjs b/surfsense_web/.source/source.config.mjs new file mode 100644 index 000000000..ae67114fd --- /dev/null +++ b/surfsense_web/.source/source.config.mjs @@ -0,0 +1,8 @@ +// source.config.ts +import { defineDocs } from "fumadocs-mdx/config"; +var docs = defineDocs({ + dir: "content/docs" +}); +export { + docs +}; diff --git a/surfsense_web/app/api/search/route.ts b/surfsense_web/app/api/search/route.ts new file mode 100644 index 000000000..01401b7f5 --- /dev/null +++ b/surfsense_web/app/api/search/route.ts @@ -0,0 +1,4 @@ +import { source } from '@/lib/source'; +import { createFromSource } from 'fumadocs-core/search/server'; + +export const { GET } = createFromSource(source); \ No newline at end of file diff --git a/surfsense_web/app/docs/[[...slug]]/page.tsx b/surfsense_web/app/docs/[[...slug]]/page.tsx new file mode 100644 index 000000000..6c8574d87 --- /dev/null +++ b/surfsense_web/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,46 @@ +import { source } from '@/lib/source'; +import { + DocsBody, + DocsDescription, + DocsPage, + DocsTitle, +} from 'fumadocs-ui/page'; +import { notFound } from 'next/navigation'; +import { getMDXComponents } from '@/mdx-components'; + +export default async function Page(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + + return ( + + {page.data.title} + {page.data.description} + + + + + ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + }; +} \ No newline at end of file diff --git a/surfsense_web/app/docs/layout.tsx b/surfsense_web/app/docs/layout.tsx new file mode 100644 index 000000000..e818c1f68 --- /dev/null +++ b/surfsense_web/app/docs/layout.tsx @@ -0,0 +1,12 @@ +import { source } from '@/lib/source'; +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import type { ReactNode } from 'react'; +import { baseOptions } from '@/app/layout.config'; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/surfsense_web/app/globals.css b/surfsense_web/app/globals.css index 8fdefeca5..98e4411fb 100644 --- a/surfsense_web/app/globals.css +++ b/surfsense_web/app/globals.css @@ -1,4 +1,6 @@ -@import "tailwindcss"; +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; @plugin "tailwindcss-animate"; diff --git a/surfsense_web/app/layout.config.tsx b/surfsense_web/app/layout.config.tsx new file mode 100644 index 000000000..ef0500157 --- /dev/null +++ b/surfsense_web/app/layout.config.tsx @@ -0,0 +1,7 @@ +import { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; + +export const baseOptions: BaseLayoutProps = { + nav: { + title: 'SurfSense Documentation', + }, +}; \ No newline at end of file diff --git a/surfsense_web/app/layout.tsx b/surfsense_web/app/layout.tsx index be0b18079..6b60891a4 100644 --- a/surfsense_web/app/layout.tsx +++ b/surfsense_web/app/layout.tsx @@ -5,6 +5,7 @@ import { Roboto } from "next/font/google"; import { Toaster } from "@/components/ui/sonner"; import { ThemeProvider } from "@/components/theme/theme-provider"; +import { RootProvider } from 'fumadocs-ui/provider'; const roboto = Roboto({ subsets: ["latin"], @@ -64,8 +65,10 @@ export default async function RootLayout({ disableTransitionOnChange defaultTheme="light" > - {children} - + + {children} + + diff --git a/surfsense_web/content/docs/index.mdx b/surfsense_web/content/docs/index.mdx new file mode 100644 index 000000000..e99f597dc --- /dev/null +++ b/surfsense_web/content/docs/index.mdx @@ -0,0 +1,7 @@ +--- +title: Welcome Docs +--- + +## Introduction + +I love Docs. \ No newline at end of file diff --git a/surfsense_web/lib/source.ts b/surfsense_web/lib/source.ts new file mode 100644 index 000000000..d80ab8edd --- /dev/null +++ b/surfsense_web/lib/source.ts @@ -0,0 +1,7 @@ +import { docs } from '@/.source'; +import { loader } from 'fumadocs-core/source'; + +export const source = loader({ + baseUrl: '/docs', + source: docs.toFumadocsSource(), +}); \ No newline at end of file diff --git a/surfsense_web/mdx-components.tsx b/surfsense_web/mdx-components.tsx new file mode 100644 index 000000000..f190f3ced --- /dev/null +++ b/surfsense_web/mdx-components.tsx @@ -0,0 +1,9 @@ +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import type { MDXComponents } from 'mdx/types'; + +export function getMDXComponents(components?: MDXComponents): MDXComponents { + return { + ...defaultMdxComponents, + ...components, + }; +} \ No newline at end of file diff --git a/surfsense_web/next.config.ts b/surfsense_web/next.config.ts index 5cb563cd9..9ba7df975 100644 --- a/surfsense_web/next.config.ts +++ b/surfsense_web/next.config.ts @@ -1,4 +1,5 @@ import type { NextConfig } from "next"; +import { createMDX } from 'fumadocs-mdx/next'; const nextConfig: NextConfig = { typescript: { @@ -9,4 +10,7 @@ const nextConfig: NextConfig = { }, }; -export default nextConfig; +// Wrap the config with createMDX +const withMDX = createMDX({}); + +export default withMDX(nextConfig); diff --git a/surfsense_web/package.json b/surfsense_web/package.json index e2047644a..07fcb5549 100644 --- a/surfsense_web/package.json +++ b/surfsense_web/package.json @@ -4,13 +4,15 @@ "private": true, "description": "SurfSense Frontend", "scripts": { - "dev": "next dev --turbopack", + "dev": "next dev", + "dev:turbopack": "next dev --turbopack", "build": "next build", "start": "next start", "lint": "next lint", "debug": "cross-env NODE_OPTIONS=--inspect next dev --turbopack", "debug:browser": "cross-env NODE_OPTIONS=--inspect next dev --turbopack", - "debug:server": "cross-env NODE_OPTIONS=--inspect=0.0.0.0:9229 next dev --turbopack" + "debug:server": "cross-env NODE_OPTIONS=--inspect=0.0.0.0:9229 next dev --turbopack", + "postinstall": "fumadocs-mdx" }, "dependencies": { "@ai-sdk/react": "^1.1.21", @@ -31,12 +33,16 @@ "@radix-ui/react-tooltip": "^1.1.8", "@tabler/icons-react": "^3.30.0", "@tanstack/react-table": "^8.21.2", + "@types/mdx": "^2.0.13", "ai": "^4.1.54", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0", "emblor": "^1.4.7", "framer-motion": "^12.4.7", + "fumadocs-core": "^15.2.9", + "fumadocs-mdx": "^11.6.1", + "fumadocs-ui": "^15.2.9", "geist": "^1.3.1", "lucide-react": "^0.477.0", "next": "15.2.3", diff --git a/surfsense_web/pnpm-lock.yaml b/surfsense_web/pnpm-lock.yaml index 081a1b9dd..a8eb3c82a 100644 --- a/surfsense_web/pnpm-lock.yaml +++ b/surfsense_web/pnpm-lock.yaml @@ -62,6 +62,9 @@ importers: '@tanstack/react-table': specifier: ^8.21.2 version: 8.21.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 ai: specifier: ^4.1.54 version: 4.1.54(react@19.0.0)(zod@3.24.2) @@ -80,6 +83,15 @@ importers: framer-motion: specifier: ^12.4.7 version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + fumadocs-core: + specifier: ^15.2.9 + version: 15.2.9(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + fumadocs-mdx: + specifier: ^11.6.1 + version: 11.6.1(acorn@8.14.0)(fumadocs-core@15.2.9(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + fumadocs-ui: + specifier: ^15.2.9 + version: 15.2.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tailwindcss@4.0.9) geist: specifier: ^1.3.1 version: 1.3.1(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) @@ -216,138 +228,288 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -397,6 +559,9 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@formatjs/intl-localematcher@0.6.1': + resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} + '@hookform/resolvers@4.1.3': resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} peerDependencies: @@ -549,6 +714,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + '@next/env@15.2.3': resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} @@ -623,6 +791,10 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} + '@orama/orama@3.1.6': + resolution: {integrity: sha512-qtSrqCqRU93SjEBedz987tvWao1YQSELjBhGkHYGVP7Dg0lBWP6d+uZEIt5gxTAYio/YWWlhivmRABvRfPLmnQ==} + engines: {node: '>= 16.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -630,6 +802,9 @@ packages: '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@radix-ui/primitive@1.0.0': resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} @@ -639,6 +814,9 @@ packages: '@radix-ui/primitive@1.1.1': resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + '@radix-ui/react-accordion@1.2.3': resolution: {integrity: sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==} peerDependencies: @@ -652,6 +830,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-accordion@1.2.7': + resolution: {integrity: sha512-stDPylBV/3kFHBAFQK/GeyIFaN7q60zWaXthA5/p6egu8AclIN79zG+bv+Ps+exB4JE5rtW/u3Z7SDvmFuTzgA==} + 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 + '@radix-ui/react-alert-dialog@1.1.6': resolution: {integrity: sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ==} peerDependencies: @@ -678,6 +869,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-arrow@1.1.4': + resolution: {integrity: sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw==} + 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 + '@radix-ui/react-avatar@1.1.3': resolution: {integrity: sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==} peerDependencies: @@ -717,6 +921,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collapsible@1.1.7': + resolution: {integrity: sha512-zGFsPcFJNdQa/UNd6MOgF40BS054FIGj32oOWBllixz42f+AkQg3QJ1YT9pw7vs+Ai+EgWkh839h69GEK8oH2A==} + 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 + '@radix-ui/react-collection@1.1.2': resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} peerDependencies: @@ -730,6 +947,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collection@1.1.4': + resolution: {integrity: sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg==} + 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 + '@radix-ui/react-compose-refs@1.0.0': resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -753,6 +983,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.0.0': resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: @@ -776,6 +1015,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.0.0': resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: @@ -795,6 +1043,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dialog@1.1.10': + resolution: {integrity: sha512-m6pZb0gEM5uHPSb+i2nKKGQi/HMSVjARMsLMWQfKDP+eJ6B+uqryHnXhpnohTWElw+vEcMk/o4wJODtdRKHwqg==} + 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 + '@radix-ui/react-dialog@1.1.6': resolution: {integrity: sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==} peerDependencies: @@ -817,6 +1078,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.0.0': resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} peerDependencies: @@ -849,6 +1119,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.7': + resolution: {integrity: sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw==} + 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 + '@radix-ui/react-dropdown-menu@2.1.6': resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==} peerDependencies: @@ -885,6 +1168,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.0': resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: @@ -917,6 +1209,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-focus-scope@1.1.4': + resolution: {integrity: sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA==} + 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 + '@radix-ui/react-id@1.0.0': resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} peerDependencies: @@ -940,6 +1245,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-label@2.1.2': resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} peerDependencies: @@ -966,6 +1280,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-navigation-menu@1.2.9': + resolution: {integrity: sha512-Z7lefjA5VAmEB5ZClxeHGWGQAqhGWgEc6u0MYviUmIVrgGCVLv5mv/jsfUY3tJWI71cVhpQ7dnf/Q6RtM3ylVA==} + 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 + + '@radix-ui/react-popover@1.1.10': + resolution: {integrity: sha512-IZN7b3sXqajiPsOzKuNJBSP9obF4MX5/5UhTgWNofw4r1H+eATWb0SyMlaxPD/kzA4vadFgy1s7Z1AEJ6WMyHQ==} + 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 + '@radix-ui/react-popover@1.1.6': resolution: {integrity: sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==} peerDependencies: @@ -992,6 +1332,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.4': + resolution: {integrity: sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA==} + 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 + '@radix-ui/react-portal@1.0.0': resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} peerDependencies: @@ -1024,6 +1377,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-portal@1.1.6': + resolution: {integrity: sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw==} + 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 + '@radix-ui/react-presence@1.0.0': resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} peerDependencies: @@ -1056,6 +1422,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.3': + resolution: {integrity: sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==} + 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 + '@radix-ui/react-primitive@1.0.0': resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} peerDependencies: @@ -1088,6 +1467,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.1.0': + resolution: {integrity: sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw==} + 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 + '@radix-ui/react-roving-focus@1.1.2': resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} peerDependencies: @@ -1101,6 +1493,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.7': + resolution: {integrity: sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q==} + 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 + + '@radix-ui/react-scroll-area@1.2.5': + resolution: {integrity: sha512-VyLjxI8/gXYn+Wij1FLpXjZp6Z/uNklUFQQ75tOpJNESeNaZ2kCRfjiEDmHgWmLeUPeJGwrqbgRmcdFjtYEkMA==} + 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 + '@radix-ui/react-select@2.1.6': resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} peerDependencies: @@ -1150,6 +1568,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-tabs@1.1.3': resolution: {integrity: sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==} peerDependencies: @@ -1163,6 +1590,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-tabs@1.1.8': + resolution: {integrity: sha512-4iUaN9SYtG+/E+hJ7jRks/Nv90f+uAsRHbLYA6BcA9EsR6GNWgsvtS4iwU2SP0tOZfDGAyqIT0yz7ckgohEIFA==} + 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 + '@radix-ui/react-tooltip@1.1.8': resolution: {integrity: sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==} peerDependencies: @@ -1199,6 +1639,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.0.0': resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: @@ -1222,6 +1671,24 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.0.0': resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} peerDependencies: @@ -1245,6 +1712,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.0.0': resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: @@ -1268,6 +1744,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-previous@1.1.0': resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} peerDependencies: @@ -1277,6 +1762,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-rect@1.1.0': resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} peerDependencies: @@ -1286,6 +1780,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-size@1.1.0': resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} peerDependencies: @@ -1295,6 +1798,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-visually-hidden@1.1.2': resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} peerDependencies: @@ -1308,15 +1820,61 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-visually-hidden@1.2.0': + resolution: {integrity: sha512-rQj0aAWOpCdCMRbI6pLQm8r7S2BM3YhTa0SzOYD55k+hJA8oo9J+H+9wLM9oMlZWOX/wJWPTzfDfmZkf7LvCfg==} + 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 + '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@shikijs/core@3.3.0': + resolution: {integrity: sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ==} + + '@shikijs/engine-javascript@3.3.0': + resolution: {integrity: sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q==} + + '@shikijs/engine-oniguruma@3.3.0': + resolution: {integrity: sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A==} + + '@shikijs/langs@3.3.0': + resolution: {integrity: sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g==} + + '@shikijs/rehype@3.3.0': + resolution: {integrity: sha512-m9clrxedJHyKDwYoAkIUJ7thWGSZwZbA0PeGDST7NHCTGeS227BFn8Hoq2olAtxXo14k5T1JcUCDgyaRZfI4Hw==} + + '@shikijs/themes@3.3.0': + resolution: {integrity: sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg==} + + '@shikijs/transformers@3.3.0': + resolution: {integrity: sha512-PIknEyxfkT7i7at/78ynVmuZEv4+7IcS37f6abxMjQ0pVIPEya8n+KNl7XtfbhNL+U9ElR3UzfSzuD5l5Iu+nw==} + + '@shikijs/types@3.3.0': + resolution: {integrity: sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -1450,6 +2008,9 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -1568,6 +2129,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1625,6 +2189,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -1728,6 +2296,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1744,6 +2316,9 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1765,6 +2340,9 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1880,6 +2458,9 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1926,11 +2507,22 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2039,6 +2631,11 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -2051,9 +2648,30 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.3.3: + resolution: {integrity: sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2066,6 +2684,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2161,6 +2783,48 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fumadocs-core@15.2.9: + resolution: {integrity: sha512-CMclwgXDDdqIA6ZZxEfFvFtkWTN5+X75vIvBlW7BAV4On8oCUOtBl5Whr02rpc7glyKQfOvdKXvHX5xbMHV5WA==} + peerDependencies: + '@oramacloud/client': 1.x.x || 2.x.x + algoliasearch: 4.24.0 + next: 14.x.x || 15.x.x + react: 18.x.x || 19.x.x + react-dom: 18.x.x || 19.x.x + peerDependenciesMeta: + '@oramacloud/client': + optional: true + algoliasearch: + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + + fumadocs-mdx@11.6.1: + resolution: {integrity: sha512-z+H/eOJC4II0VW7rgf6btqeEkD9DEG1SNToNCYKMklCJAc9Y6l+NuQozKuknP2Ey6NK+Qqhvwhi2MOq38YLSeQ==} + hasBin: true + peerDependencies: + '@fumadocs/mdx-remote': ^1.2.0 + fumadocs-core: ^14.0.0 || ^15.0.0 + next: ^15.3.0 + peerDependenciesMeta: + '@fumadocs/mdx-remote': + optional: true + + fumadocs-ui@15.2.9: + resolution: {integrity: sha512-6bCbWEFc19x6sMi1k+bEKWumOhaPN7N//ih0fNF5OUh6GY3Dfa7NUuGHCfyxFRNAz2dcQQ6YL89L9E35fxoHvg==} + peerDependencies: + next: 14.x.x || 15.x.x + react: 18.x.x || 19.x.x + react-dom: 18.x.x || 19.x.x + tailwindcss: ^3.4.14 || ^4.0.0 + peerDependenciesMeta: + tailwindcss: + optional: true + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -2199,6 +2863,9 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2233,6 +2900,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -2272,12 +2943,21 @@ packages: hast-util-sanitize@5.0.2: resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -2298,6 +2978,11 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2364,6 +3049,10 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2467,6 +3156,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2499,6 +3192,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -2617,11 +3314,24 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + lucide-react@0.477.0: resolution: {integrity: sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-react@0.488.0: + resolution: {integrity: sha512-ronlL0MyKut4CEzBY/ai2ZpKPxyWO4jUqdAkm2GNK5Zn3Rj+swDz+3lvyAUXN0PNqPKIX6XM9Xadwz/skLs/pQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -2659,6 +3369,9 @@ packages: mdast-util-mdx-jsx@3.2.0: resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} @@ -2705,12 +3418,30 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} @@ -2741,6 +3472,9 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -2812,12 +3546,22 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + next-themes@0.4.4: resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next@15.2.3: resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -2892,6 +3636,12 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + oniguruma-parser@0.11.2: + resolution: {integrity: sha512-F7Ld4oDZJCI5/wCZ8AOffQbqjSzIRpKH7I/iuSs1SkhZeCj0wS6PMZ4W6VA16TWHrAo0Y9bBKEJOe7tvwcTXnw==} + + oniguruma-to-es@4.2.0: + resolution: {integrity: sha512-MDPs6KSOLS0tKQ7joqg44dRIRZUyotfTy0r+7oEEs6VwWWP0+E2PPDYWMFN0aqOjRyWHBYq7RfKw9GQk2S2z5g==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2975,6 +3725,10 @@ packages: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -3060,6 +3814,12 @@ packages: '@types/react': '>=18' react: '>=18' + react-medium-image-zoom@5.2.14: + resolution: {integrity: sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -3124,6 +3884,22 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -3131,6 +3907,15 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -3138,12 +3923,18 @@ packages: rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-sanitize@6.0.0: resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -3153,6 +3944,9 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3200,6 +3994,13 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -3239,6 +4040,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@3.3.0: + resolution: {integrity: sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -3279,6 +4083,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -3286,6 +4094,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stable-hash@0.0.4: resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} @@ -3335,6 +4146,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3387,6 +4202,9 @@ packages: tailwind-merge@3.0.2: resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + tailwind-merge@3.2.0: + resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} + tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: @@ -3510,6 +4328,9 @@ packages: unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} @@ -3653,6 +4474,9 @@ packages: zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3700,72 +4524,147 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.25.2': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true + '@esbuild/android-arm64@0.25.2': + optional: true + '@esbuild/android-arm@0.17.19': optional: true + '@esbuild/android-arm@0.25.2': + optional: true + '@esbuild/android-x64@0.17.19': optional: true + '@esbuild/android-x64@0.25.2': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true + '@esbuild/darwin-arm64@0.25.2': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true + '@esbuild/darwin-x64@0.25.2': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true + '@esbuild/freebsd-arm64@0.25.2': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true + '@esbuild/freebsd-x64@0.25.2': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true + '@esbuild/linux-arm64@0.25.2': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true + '@esbuild/linux-arm@0.25.2': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true + '@esbuild/linux-ia32@0.25.2': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true + '@esbuild/linux-loong64@0.25.2': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true + '@esbuild/linux-mips64el@0.25.2': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true + '@esbuild/linux-ppc64@0.25.2': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true + '@esbuild/linux-riscv64@0.25.2': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true + '@esbuild/linux-s390x@0.25.2': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true + '@esbuild/linux-x64@0.25.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.2': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true + '@esbuild/netbsd-x64@0.25.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.2': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true + '@esbuild/openbsd-x64@0.25.2': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true + '@esbuild/sunos-x64@0.25.2': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true + '@esbuild/win32-arm64@0.25.2': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true + '@esbuild/win32-ia32@0.25.2': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true + '@esbuild/win32-x64@0.25.2': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@2.4.2))': dependencies: eslint: 9.21.0(jiti@2.4.2) @@ -3825,6 +4724,10 @@ snapshots: '@floating-ui/utils@0.2.9': {} + '@formatjs/intl-localematcher@0.6.1': + dependencies: + tslib: 2.8.1 + '@hookform/resolvers@4.1.3(react-hook-form@7.54.2(react@19.0.0))': dependencies: '@standard-schema/utils': 0.3.0 @@ -3944,6 +4847,36 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + '@next/env@15.2.3': {} '@next/eslint-plugin-next@15.2.0': @@ -3990,11 +4923,15 @@ snapshots: '@opentelemetry/api@1.9.0': {} + '@orama/orama@3.1.6': {} + '@pkgjs/parseargs@0.11.0': optional: true '@radix-ui/number@1.1.0': {} + '@radix-ui/number@1.1.1': {} + '@radix-ui/primitive@1.0.0': dependencies: '@babel/runtime': 7.26.9 @@ -4005,6 +4942,8 @@ snapshots: '@radix-ui/primitive@1.1.1': {} + '@radix-ui/primitive@1.1.2': {} + '@radix-ui/react-accordion@1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4022,6 +4961,23 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-accordion@1.2.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collapsible': 1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-alert-dialog@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4045,6 +5001,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-arrow@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-avatar@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) @@ -4089,6 +5054,22 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-collapsible@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) @@ -4101,6 +5082,18 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-collection@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-compose-refs@1.0.0(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4119,6 +5112,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-context@1.0.0(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4137,6 +5136,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-context@1.1.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-dialog@1.0.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4182,6 +5187,28 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-dialog@1.1.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-dialog@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4210,6 +5237,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-direction@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-dismissable-layer@1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4248,6 +5281,19 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4281,6 +5327,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-focus-scope@1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4313,6 +5365,17 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-id@1.0.0(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4334,6 +5397,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-id@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -4369,6 +5439,51 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-navigation-menu@1.2.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-popover@1.1.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-popover@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4410,6 +5525,24 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-popper@1.2.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/rect': 1.1.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-portal@1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4437,6 +5570,16 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-portal@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-presence@1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4466,6 +5609,16 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-presence@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-primitive@1.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4492,6 +5645,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-primitive@2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.2.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4509,6 +5671,40 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-scroll-area@1.2.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 @@ -4568,6 +5764,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-slot@1.2.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-tabs@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4584,6 +5787,22 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-tabs@1.1.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-tooltip@1.1.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -4622,6 +5841,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-controllable-state@1.0.0(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4643,6 +5868,21 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-escape-keydown@1.0.0(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4664,6 +5904,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-layout-effect@1.0.0(react@19.0.0)': dependencies: '@babel/runtime': 7.26.9 @@ -4682,12 +5929,24 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-previous@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: '@radix-ui/rect': 1.1.0 @@ -4695,6 +5954,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-rect@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) @@ -4702,6 +5968,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-size@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -4711,12 +5984,72 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-visually-hidden@1.2.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/rect@1.1.0': {} + '@radix-ui/rect@1.1.1': {} + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.5': {} + '@shikijs/core@3.3.0': + dependencies: + '@shikijs/types': 3.3.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.3.0': + dependencies: + '@shikijs/types': 3.3.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.2.0 + + '@shikijs/engine-oniguruma@3.3.0': + dependencies: + '@shikijs/types': 3.3.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.3.0': + dependencies: + '@shikijs/types': 3.3.0 + + '@shikijs/rehype@3.3.0': + dependencies: + '@shikijs/types': 3.3.0 + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + shiki: 3.3.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + '@shikijs/themes@3.3.0': + dependencies: + '@shikijs/types': 3.3.0 + + '@shikijs/transformers@3.3.0': + dependencies: + '@shikijs/core': 3.3.0 + '@shikijs/types': 3.3.0 + + '@shikijs/types@3.3.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@standard-schema/spec@1.0.0': {} + '@standard-schema/utils@0.3.0': {} '@swc/counter@0.1.3': {} @@ -4834,6 +6167,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} + '@types/ms@2.1.0': {} '@types/node@20.17.22': @@ -4973,6 +6308,10 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-hidden@1.2.4: @@ -5053,6 +6392,8 @@ snapshots: ast-types-flow@0.0.8: {} + astring@1.9.0: {} + async-function@1.0.0: {} attr-accept@2.2.5: {} @@ -5147,6 +6488,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -5163,6 +6508,8 @@ snapshots: transitivePeerDependencies: - '@types/react' + collapse-white-space@2.1.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -5185,6 +6532,8 @@ snapshots: commander@4.1.1: {} + compute-scroll-into-view@3.1.1: {} + concat-map@0.0.1: {} cross-env@7.0.3: @@ -5297,7 +6646,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-easy-sort: 1.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - tailwind-merge: 3.0.2 + tailwind-merge: 3.2.0 tsup: 6.7.0(postcss@8.5.3)(typescript@5.8.2) transitivePeerDependencies: - '@swc/core' @@ -5308,6 +6657,8 @@ snapshots: - ts-node - typescript + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -5417,6 +6768,20 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -5442,6 +6807,34 @@ snapshots: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 + esbuild@0.25.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -5630,6 +7023,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -5640,8 +7035,43 @@ snapshots: estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-value-to-estree@3.3.3: + dependencies: + '@types/estree': 1.0.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + esutils@2.0.3: {} eventsource-parser@3.0.0: {} @@ -5658,6 +7088,10 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -5763,6 +7197,82 @@ snapshots: fsevents@2.3.3: optional: true + fumadocs-core@15.2.9(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@formatjs/intl-localematcher': 0.6.1 + '@orama/orama': 3.1.6 + '@shikijs/rehype': 3.3.0 + '@shikijs/transformers': 3.3.0 + github-slugger: 2.0.0 + hast-util-to-estree: 3.1.3 + hast-util-to-jsx-runtime: 2.3.6 + image-size: 2.0.2 + negotiator: 1.0.0 + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + remark: 15.0.1 + remark-gfm: 4.0.1 + scroll-into-view-if-needed: 3.1.0 + shiki: 3.3.0 + unist-util-visit: 5.0.0 + optionalDependencies: + next: 15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - supports-color + + fumadocs-mdx@11.6.1(acorn@8.14.0)(fumadocs-core@15.2.9(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)): + dependencies: + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@standard-schema/spec': 1.0.0 + chokidar: 4.0.3 + cross-spawn: 7.0.6 + esbuild: 0.25.2 + estree-util-value-to-estree: 3.3.3 + fast-glob: 3.3.3 + fumadocs-core: 15.2.9(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + gray-matter: 4.0.3 + lru-cache: 11.1.0 + next: 15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + picocolors: 1.1.1 + unist-util-visit: 5.0.0 + zod: 3.24.3 + transitivePeerDependencies: + - acorn + - supports-color + + fumadocs-ui@15.2.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tailwindcss@4.0.9): + dependencies: + '@radix-ui/react-accordion': 1.2.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collapsible': 1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dialog': 1.1.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-navigation-menu': 1.2.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-popover': 1.1.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-scroll-area': 1.2.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-tabs': 1.1.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + class-variance-authority: 0.7.1 + fumadocs-core: 15.2.9(@types/react@19.0.10)(next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + lodash.merge: 4.6.2 + lucide-react: 0.488.0(react@19.0.0) + next: 15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + postcss-selector-parser: 7.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-medium-image-zoom: 5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + tailwind-merge: 3.2.0 + optionalDependencies: + tailwindcss: 4.0.9 + transitivePeerDependencies: + - '@oramacloud/client' + - '@types/react' + - '@types/react-dom' + - algoliasearch + - supports-color + function-bind@1.1.2: {} function.prototype.name@1.1.8: @@ -5812,6 +7322,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5851,6 +7363,13 @@ snapshots: graphemer@1.4.0: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -5910,6 +7429,41 @@ snapshots: '@ungap/structured-clone': 1.3.0 unist-util-position: 5.0.0 + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.6 @@ -5940,6 +7494,10 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -5960,6 +7518,8 @@ snapshots: ignore@5.3.2: {} + image-size@2.0.2: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -6035,6 +7595,8 @@ snapshots: is-decimal@2.0.1: {} + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -6133,6 +7695,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -6166,6 +7733,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -6252,10 +7821,18 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lucide-react@0.477.0(react@19.0.0): dependencies: react: 19.0.0 + lucide-react@0.488.0(react@19.0.0): + dependencies: + react: 19.0.0 + + markdown-extensions@2.0.0: {} + markdown-table@3.0.4: {} math-intrinsics@1.1.0: {} @@ -6369,6 +7946,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -6494,6 +8081,57 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -6507,6 +8145,18 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -6559,6 +8209,16 @@ snapshots: micromark-util-encode@2.0.1: {} + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + micromark-util-html-tag-name@2.0.1: {} micromark-util-normalize-identifier@2.0.1: @@ -6647,11 +8307,18 @@ snapshots: natural-compare@1.4.0: {} + negotiator@1.0.0: {} + next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) + next-themes@0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 15.2.3 @@ -6733,6 +8400,15 @@ snapshots: dependencies: mimic-fn: 2.1.0 + oniguruma-parser@0.11.2: {} + + oniguruma-to-es@4.2.0: + dependencies: + emoji-regex-xs: 1.0.0 + oniguruma-parser: 0.11.2 + regex: 6.0.1 + regex-recursion: 6.0.2 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6811,6 +8487,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss@8.4.31: dependencies: nanoid: 3.3.11 @@ -6913,6 +8594,11 @@ snapshots: transitivePeerDependencies: - supports-color + react-medium-image-zoom@5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 @@ -6977,6 +8663,38 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -6990,6 +8708,16 @@ snapshots: regenerator-runtime@0.14.1: {} + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -7005,6 +8733,14 @@ snapshots: hast-util-raw: 9.1.0 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + rehype-sanitize@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -7021,6 +8757,13 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -7044,6 +8787,15 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -7093,6 +8845,15 @@ snapshots: scheduler@0.25.0: {} + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + secure-json-parse@2.7.0: {} semver@6.3.1: {} @@ -7156,6 +8917,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@3.3.0: + dependencies: + '@shikijs/core': 3.3.0 + '@shikijs/engine-javascript': 3.3.0 + '@shikijs/engine-oniguruma': 3.3.0 + '@shikijs/langs': 3.3.0 + '@shikijs/themes': 3.3.0 + '@shikijs/types': 3.3.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -7202,12 +8974,16 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.7.4: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 space-separated-tokens@2.0.2: {} + sprintf-js@1.0.3: {} + stable-hash@0.0.4: {} streamsearch@1.1.0: {} @@ -7287,6 +9063,8 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} strip-final-newline@2.0.0: {} @@ -7330,6 +9108,8 @@ snapshots: tailwind-merge@3.0.2: {} + tailwind-merge@3.2.0: {} + tailwindcss-animate@1.0.7(tailwindcss@4.0.9): dependencies: tailwindcss: 4.0.9 @@ -7473,6 +9253,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -7636,4 +9420,6 @@ snapshots: zod@3.24.2: {} + zod@3.24.3: {} + zwitch@2.0.4: {} diff --git a/surfsense_web/source.config.ts b/surfsense_web/source.config.ts new file mode 100644 index 000000000..250c23a07 --- /dev/null +++ b/surfsense_web/source.config.ts @@ -0,0 +1,5 @@ +import { defineDocs } from 'fumadocs-mdx/config'; + +export const docs = defineDocs({ + dir: 'content/docs', +}); \ No newline at end of file diff --git a/surfsense_web/tsconfig.json b/surfsense_web/tsconfig.json index d8b93235f..b3de9e41f 100644 --- a/surfsense_web/tsconfig.json +++ b/surfsense_web/tsconfig.json @@ -22,6 +22,6 @@ "@/*": ["./*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "next.config.mjs"], "exclude": ["node_modules"] } From 02cf7d9828801f2edc9a76c02a9d08ca197c3fc3 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Tue, 22 Apr 2025 02:37:49 -0700 Subject: [PATCH 30/47] chore: Stop tracking .source directory --- surfsense_web/.source/index.ts | 5 ----- surfsense_web/.source/source.config.mjs | 8 -------- 2 files changed, 13 deletions(-) delete mode 100644 surfsense_web/.source/index.ts delete mode 100644 surfsense_web/.source/source.config.mjs diff --git a/surfsense_web/.source/index.ts b/surfsense_web/.source/index.ts deleted file mode 100644 index 0002966e0..000000000 --- a/surfsense_web/.source/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// @ts-nocheck -- skip type checking -import * as docs_0 from "../content/docs/index.mdx?collection=docs&hash=1745310068376" -import { _runtime } from "fumadocs-mdx" -import * as _source from "../source.config" -export const docs = _runtime.docs([{ info: {"path":"index.mdx","absolutePath":"C:/Users/91882/Documents/SurfSense/surfsense_web/content/docs/index.mdx"}, data: docs_0 }], []) \ No newline at end of file diff --git a/surfsense_web/.source/source.config.mjs b/surfsense_web/.source/source.config.mjs deleted file mode 100644 index ae67114fd..000000000 --- a/surfsense_web/.source/source.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -// source.config.ts -import { defineDocs } from "fumadocs-mdx/config"; -var docs = defineDocs({ - dir: "content/docs" -}); -export { - docs -}; From b2f47d28030f0cb57a0b494560d246eaa0867116 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Tue, 22 Apr 2025 02:40:45 -0700 Subject: [PATCH 31/47] updated .gitignore --- surfsense_web/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/surfsense_web/.gitignore b/surfsense_web/.gitignore index e72b4d6a4..c78e9de6c 100644 --- a/surfsense_web/.gitignore +++ b/surfsense_web/.gitignore @@ -39,3 +39,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# source +/.source/ From 340911e631c284d33dfeda6e95bf10943af98cbb Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Wed, 23 Apr 2025 12:05:32 -0700 Subject: [PATCH 32/47] docs stuff --- surfsense_backend/draw.py | 5 + surfsense_web/content/docs/index.mdx | 90 +++++++++++++++++- surfsense_web/content/docs/meta.json | 9 ++ .../public/docs/google_oauth_client.png | Bin 0 -> 99948 bytes surfsense_web/public/docs/people_api.png | Bin 0 -> 70041 bytes surfsense_web/public/docs/unstructured.png | Bin 0 -> 110477 bytes 6 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 surfsense_backend/draw.py create mode 100644 surfsense_web/content/docs/meta.json create mode 100644 surfsense_web/public/docs/google_oauth_client.png create mode 100644 surfsense_web/public/docs/people_api.png create mode 100644 surfsense_web/public/docs/unstructured.png diff --git a/surfsense_backend/draw.py b/surfsense_backend/draw.py new file mode 100644 index 000000000..ec55f79a5 --- /dev/null +++ b/surfsense_backend/draw.py @@ -0,0 +1,5 @@ +from app.agents.researcher.graph import graph as researcher_graph +from app.agents.researcher.sub_section_writer.graph import graph as sub_section_writer_graph + +print(researcher_graph.get_graph().draw_mermaid()) +print(sub_section_writer_graph.get_graph().draw_mermaid()) \ No newline at end of file diff --git a/surfsense_web/content/docs/index.mdx b/surfsense_web/content/docs/index.mdx index e99f597dc..b2a96d62b 100644 --- a/surfsense_web/content/docs/index.mdx +++ b/surfsense_web/content/docs/index.mdx @@ -1,7 +1,87 @@ --- -title: Welcome Docs +title: Prerequisites +description: Required setup's before setting up SurfSense +full: true --- - -## Introduction - -I love Docs. \ No newline at end of file + +## PGVector installation Guide + +SurfSense requires the pgvector extension for PostgreSQL: + +### Linux and Mac + +Compile and install the extension (supports Postgres 13+) + +```sh +cd /tmp +git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git +cd pgvector +make +make install # may need sudo +``` + +See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---linux-and-mac) if you run into issues + +### Windows + +Ensure [C++ support in Visual Studio](https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170#download-and-install-the-tools) is installed, and run: + +```cmd +call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" +``` + +Note: The exact path will vary depending on your Visual Studio version and edition + +Then use `nmake` to build: + +```cmd +set "PGROOT=C:\Program Files\PostgreSQL\16" +cd %TEMP% +git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git +cd pgvector +nmake /F Makefile.win +nmake /F Makefile.win install +``` + +See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---windows) if you run into issues + + + +## File Upload's + +Files are converted to LLM friendly formats using [Unstructured](https://github.com/Unstructured-IO/unstructured) + +1. Get an Unstructured.io API key from [Unstructured Platform](https://platform.unstructured.io/) +2. You should be able to generate API keys once registered +![Image](/docs/unstructured.png) + +## Google OAuth Setup + +SurfSense user management and authentication works on Google OAuth. + +1. Set up OAuth Client at [Google Developer Console](https://developers.google.com/identity/protocols/oauth2) +2. Enable People API. +3. Note your OAuth Client. + +## LLM Observability (Optional) + +For monitoring LLM interactions: + +1. Get a LangSmith API key from [smith.langchain.com](https://smith.langchain.com/) +2. This helps in observing SurfSense Researcher Agent operations + +## Crawler Support + +SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. + +## API Keys + +Prepare the following API keys: + +1. LLM API keys (OpenAI, Gemini, etc.) based on your selected models +2. Unstructured.io API key +3. Firecrawl API key (if using the crawler) + +## Next Steps + +Once you have all prerequisites in place, proceed to the [installation guide](/docs/installation) to set up SurfSense. \ No newline at end of file diff --git a/surfsense_web/content/docs/meta.json b/surfsense_web/content/docs/meta.json new file mode 100644 index 000000000..e5bb280a4 --- /dev/null +++ b/surfsense_web/content/docs/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Setup", + "description": "The setup guide for Surfsense", + "root": true, + "pages": [ + "---Setup---", + "index" + ] + } \ No newline at end of file diff --git a/surfsense_web/public/docs/google_oauth_client.png b/surfsense_web/public/docs/google_oauth_client.png new file mode 100644 index 0000000000000000000000000000000000000000..f49650b5dc8428c5c13d99f842a76be6e794c93f GIT binary patch literal 99948 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%0A+`*iCW^n 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 DXjIlt literal 0 HcmV?d00001 diff --git a/surfsense_web/public/docs/unstructured.png b/surfsense_web/public/docs/unstructured.png new file mode 100644 index 0000000000000000000000000000000000000000..861a847feff3ba3ada4e96093619728ec2607714 GIT binary patch literal 110477 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 qv}=y|5`;B#-s`3*Z1iwQ ziLPc(aoQ(#eDA#JqN{U%!4nDjQXhKDKM(LhyxoM$4-_n+oO7oybZXOcm9YNY{ogAy z2?X(1KvIDXrdE*Sx%6V+Y|Ka!Ot3-E&Oj~Khhvt=2z%Gj=E3B1dlaJ62f`AyBv8c(>;mK@(=W1WfX!C`~&49}Jv zynzwG_g-{<^D(IT{z|Kd%i-51wOUlZ5sQhGnXN#WaO9Y^{fXT>&U00CWiM6E^5&%> zo0&y+0?&fyQ+XdXcJ(&{u5N1hF~K)8941`s>XWAc76Hg%QwMXI=|qY!#zD@yc8x6{ zwl+?$uVD550KieB4{Vj*;0@anIPK+CwZk4#tnv2-oe(6FkL4J)&sbJ&fFQ5?j4sTwFY? z3>Y2Xo7HW3j!+5dDO^u$9&CIk^<8Pmbe%oSBbXws|q=!ubqw)`Dy(vc&>iyq(2e=ivyLM<4vbQGlyGiC8+v(S>7MCQe zKEdIePx3IELwXNs3P>&QytDO5h(8=OUQB)0wA|?-MY2_C+fB2yCH(M%AA32?1GuA1Ia--}w9-7oR?cW@6@;-W_?}b>5gohAa|_>jqmL+rlCQrM z@@&hP$sZZDZ|lRXRypDRQ?mngy?N#DvmOrsL`|o;KNUz^nayXYK}$kBD8fAMoHR~K zrL6^FJzv8M>Y{jdJyzYqt_^!HuV}t`O-$^gxr)}(^U+qN@$)sK-|_>!Py{x-$fnIO zS3i539c#CEKWOXr_BmEp6u+ZF^A_GZU8~?>%VC9*f`Iw|!&aGq&id#~?_DdwJ)K$I3@!shA!S-ytLxR2R;eLvgd4n(7^y(Tml zrPof1crGy0Qt0)Gp9SeDkq!^UX_a|^Sp!_FCQ*DWrPaR?1NZuFH*2ExpLhva)C3Zu& zDw`g~!D$b})y2EzV7JZ6<}`|no%g`??{=4rbm6xnh{I_Kuut*fY2r?wCRz6qasUHF zlShC)n#Q2B!oStBU98VzHyKK7jgK@^Y*xFpg%UZfF^1au9lQ&yK~1;LGduihljKB~ z++Y0h>^>jwv0cB+crfZYUZvAC?oxquu+g+rKjXt99aPr4q2a|*w;7p8*?s6+PXLav zUyFs(kC~RStnA=B9ujZVBd*Mbct6e*f&EiZ1#*h};nNkfrMaqrR3%aD9BzlfS`+HQ zt?RW2`_Gr|s0I&eE-QiH6i*>(F2~whRY%)&bb*=&qLI7+^nCaBMAQbJ#FQHv`d0w zPc!uSF!ZCXf!C*lDPA7d)0||$%~}G|gL!z5>^SwG+Mk#UNHGCs8U`goALDui4|RDn zr_xLF!*$o$wwG@dCAe?`vThA(Jxl*`6eZpqj&zhb0c<;N0!JDUos#T$ubv^_tLQmS zOvO9x7-w2R_coF-2174^kfzyVkLinTVJkct2aNRlOQi;j#7QkJ!J|_b5wX|%g-FF7 zd)F6S81~vY5{9FF-WOk-GZJglfaTeM%V1-^A;w+zbj~(t_k|fTe*9``4&f z<*+J~lvX~N9sF3D?si?uWILe>!SW?M9&g~k9=vAm(^+aG=3fGfn|8H&c>piO6=QI5 z{x*MN?W9~S#u{B3*VrSq@O?&RcvcfCOWY|Q4i&L!NXiGoI93ma0s-Pl)$8b>8t*q% zL&x>rtB+@3D%_MQABYXGQC_xyiLB^vML71o$d>14EAw&JH4QH*N4D56mxh?#OjYh= zEUxCP1K7-07$p|Jiugc`^}W`__=f6|YS)r-eD35TjnUa*CvtG@*5K4A-9B#M0y2aC zNPKVyr-ec1ahtUh_+*X1dgi)oQp9J1+{SB7R7J_xq(vxZ1SwOv!u=w%(PMSj{`fYp z4wbB6M-t0FTC# zH&s`CB+>>*+(_+&mU^z5wm3sk6h)Aiw1pBa0Lp`2M50~s>&w=+=k=!Xx;+-PBU{(R z*|P#}VvT5eJ^Y7k)X^v@4#dj|{9#os*6uq**|S$+Pz*}(;PNHWFcVeZ33&mSzq6&a zxt9n29W-dx`+UC+jyHpZ7AMlK5uA6TeQn978`GUvba0PNbC`c5DiQ+lY4$zKL|wUt zx?eQRW0HFj8^CsISFeR<-215D)^jwG&D(1}kl3rVC0N7+bp^v=Q2Q~$9Sjp|OY7=z z4{D@PU{OgKH(`6jvTHn&=7akeXE5hk^ykknOiWCSk6%n8C~hYdQO^kFLt1Mt-S0|k zSDa7<-WymQ8*L)I=A#$OKIy0E_T6(`&C`5K=#c#tpU7Ou7OrXEk0`^-5Rn?2HSRd)lJ!n=(Qi(hS4@ZpU z=FOi|a(%I1g3H8n?X0VbGMz_nh6J}#e*P79Jwx0OLLyCx2 z&^I|s-!pN6UbmUSe}zMcvgc=lH(_^eoD4oeCW=CnD;nu?fBYg@Ig{vViaYFm{OjbI&W{RVntu=~uW7%DIS}Nh;4pdg-DzJDnH&? zfAAC5zUVglTd4N$YsJ4I5?V05MnrhFJ|lyO4gdKP(%t93^|?N__@8~h=rGS^QRljj zSZ&r}zT)Ru`L*87E5v$>$7cg9BraIVl#7-aWLQ4@;tijrvh9q(6YRf92Z%Ms8M1yx zhi}nG(nNoa=`Z_STwInmHVQ0=!@bcwaQj7&{kemkqdzKJi1q&i&hUR+*nWHW@{oa{ U;33l^B*dSrl;W#0Nkjkt0gE12$N&HU literal 0 HcmV?d00001 From cb1ad76a2ab0acfefd8db6eb66a18410e1b2e2d8 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Wed, 23 Apr 2025 12:06:29 -0700 Subject: [PATCH 33/47] docs stuff --- surfsense_backend/draw.py | 5 + surfsense_web/content/docs/index.mdx | 90 +++++++++++++++++- surfsense_web/content/docs/meta.json | 9 ++ .../public/docs/google_oauth_client.png | Bin 0 -> 99948 bytes surfsense_web/public/docs/people_api.png | Bin 0 -> 70041 bytes surfsense_web/public/docs/unstructured.png | Bin 0 -> 110477 bytes 6 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 surfsense_backend/draw.py create mode 100644 surfsense_web/content/docs/meta.json create mode 100644 surfsense_web/public/docs/google_oauth_client.png create mode 100644 surfsense_web/public/docs/people_api.png create mode 100644 surfsense_web/public/docs/unstructured.png diff --git a/surfsense_backend/draw.py b/surfsense_backend/draw.py new file mode 100644 index 000000000..ec55f79a5 --- /dev/null +++ b/surfsense_backend/draw.py @@ -0,0 +1,5 @@ +from app.agents.researcher.graph import graph as researcher_graph +from app.agents.researcher.sub_section_writer.graph import graph as sub_section_writer_graph + +print(researcher_graph.get_graph().draw_mermaid()) +print(sub_section_writer_graph.get_graph().draw_mermaid()) \ No newline at end of file diff --git a/surfsense_web/content/docs/index.mdx b/surfsense_web/content/docs/index.mdx index e99f597dc..b2a96d62b 100644 --- a/surfsense_web/content/docs/index.mdx +++ b/surfsense_web/content/docs/index.mdx @@ -1,7 +1,87 @@ --- -title: Welcome Docs +title: Prerequisites +description: Required setup's before setting up SurfSense +full: true --- - -## Introduction - -I love Docs. \ No newline at end of file + +## PGVector installation Guide + +SurfSense requires the pgvector extension for PostgreSQL: + +### Linux and Mac + +Compile and install the extension (supports Postgres 13+) + +```sh +cd /tmp +git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git +cd pgvector +make +make install # may need sudo +``` + +See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---linux-and-mac) if you run into issues + +### Windows + +Ensure [C++ support in Visual Studio](https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170#download-and-install-the-tools) is installed, and run: + +```cmd +call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" +``` + +Note: The exact path will vary depending on your Visual Studio version and edition + +Then use `nmake` to build: + +```cmd +set "PGROOT=C:\Program Files\PostgreSQL\16" +cd %TEMP% +git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git +cd pgvector +nmake /F Makefile.win +nmake /F Makefile.win install +``` + +See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---windows) if you run into issues + + + +## File Upload's + +Files are converted to LLM friendly formats using [Unstructured](https://github.com/Unstructured-IO/unstructured) + +1. Get an Unstructured.io API key from [Unstructured Platform](https://platform.unstructured.io/) +2. You should be able to generate API keys once registered +![Image](/docs/unstructured.png) + +## Google OAuth Setup + +SurfSense user management and authentication works on Google OAuth. + +1. Set up OAuth Client at [Google Developer Console](https://developers.google.com/identity/protocols/oauth2) +2. Enable People API. +3. Note your OAuth Client. + +## LLM Observability (Optional) + +For monitoring LLM interactions: + +1. Get a LangSmith API key from [smith.langchain.com](https://smith.langchain.com/) +2. This helps in observing SurfSense Researcher Agent operations + +## Crawler Support + +SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. + +## API Keys + +Prepare the following API keys: + +1. LLM API keys (OpenAI, Gemini, etc.) based on your selected models +2. Unstructured.io API key +3. Firecrawl API key (if using the crawler) + +## Next Steps + +Once you have all prerequisites in place, proceed to the [installation guide](/docs/installation) to set up SurfSense. \ No newline at end of file diff --git a/surfsense_web/content/docs/meta.json b/surfsense_web/content/docs/meta.json new file mode 100644 index 000000000..e5bb280a4 --- /dev/null +++ b/surfsense_web/content/docs/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Setup", + "description": "The setup guide for Surfsense", + "root": true, + "pages": [ + "---Setup---", + "index" + ] + } \ No newline at end of file diff --git a/surfsense_web/public/docs/google_oauth_client.png b/surfsense_web/public/docs/google_oauth_client.png new file mode 100644 index 0000000000000000000000000000000000000000..f49650b5dc8428c5c13d99f842a76be6e794c93f GIT binary patch literal 99948 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%0A+`*iCW^n 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 DXjIlt literal 0 HcmV?d00001 diff --git a/surfsense_web/public/docs/unstructured.png b/surfsense_web/public/docs/unstructured.png new file mode 100644 index 0000000000000000000000000000000000000000..861a847feff3ba3ada4e96093619728ec2607714 GIT binary patch literal 110477 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 qv}=y|5`;B#-s`3*Z1iwQ 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 U;33l^B*dSrl;W#0Nkjkt0gE12$N&HU literal 0 HcmV?d00001 From 663e4666d35c49d8a754bf60cdd204a092cc563b Mon Sep 17 00:00:00 2001 From: "Exceeds_Lenovo\\rohan" Date: Wed, 23 Apr 2025 15:10:49 -0700 Subject: [PATCH 34/47] chore: docs --- surfsense_web/content/docs/index.mdx | 46 +++++++++++------- .../public/docs/google_oauth_config.png | Bin 0 -> 47780 bytes ...le_api.png => google_oauth_people_api.png} | Bin .../public/docs/google_oauth_screen.png | Bin 0 -> 72927 bytes surfsense_web/public/docs/langsmith.png | Bin 0 -> 308274 bytes 5 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 surfsense_web/public/docs/google_oauth_config.png rename surfsense_web/public/docs/{people_api.png => google_oauth_people_api.png} (100%) create mode 100644 surfsense_web/public/docs/google_oauth_screen.png create mode 100644 surfsense_web/public/docs/langsmith.png diff --git a/surfsense_web/content/docs/index.mdx b/surfsense_web/content/docs/index.mdx index b2a96d62b..f3411b897 100644 --- a/surfsense_web/content/docs/index.mdx +++ b/surfsense_web/content/docs/index.mdx @@ -45,7 +45,23 @@ nmake /F Makefile.win install See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---windows) if you run into issues +--- +## Google OAuth Setup + +SurfSense user management and authentication works on Google OAuth. Lets set it up. + +1. Login to your [Google Developer Console](https://console.cloud.google.com/) +2. Enable People API. +![Google Developer Console People API](/docs/google_oauth_people_api.png) +3. Set up OAuth consent screen. +![Google Developer Console OAuth consent screen](/docs/google_oauth_screen.png) +4. Create OAuth client ID and secret. +![Google Developer Console OAuth client ID](/docs/google_oauth_client.png) +5. It should look like this. +![Google Developer Console Config](/docs/google_oauth_config.png) + +--- ## File Upload's @@ -53,34 +69,30 @@ Files are converted to LLM friendly formats using [Unstructured](https://github. 1. Get an Unstructured.io API key from [Unstructured Platform](https://platform.unstructured.io/) 2. You should be able to generate API keys once registered -![Image](/docs/unstructured.png) +![Unstructured Dashboard](/docs/unstructured.png) -## Google OAuth Setup - -SurfSense user management and authentication works on Google OAuth. - -1. Set up OAuth Client at [Google Developer Console](https://developers.google.com/identity/protocols/oauth2) -2. Enable People API. -3. Note your OAuth Client. +--- ## LLM Observability (Optional) -For monitoring LLM interactions: +This is not required for SurfSense to work. But it is always a good idea to monitor LLM interactions. So we do not have those WTH moments. 1. Get a LangSmith API key from [smith.langchain.com](https://smith.langchain.com/) -2. This helps in observing SurfSense Researcher Agent operations +2. This helps in observing SurfSense Researcher Agent. +![LangSmith](/docs/langsmith.png) -## Crawler Support +--- -SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. +## Crawler -## API Keys +SurfSense have 2 options for saving webpages: +- [SurfSense Extension](https://github.com/MODSetter/SurfSense/tree/main/surfsense_browser_extension) (Overall better experience & ability to save private webpages, recommended) +- Crawler (If you want to save public webpages) -Prepare the following API keys: +**NOTE:** SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. If you plan on using the crawler, you will need to create a Firecrawl account and get an API key. -1. LLM API keys (OpenAI, Gemini, etc.) based on your selected models -2. Unstructured.io API key -3. Firecrawl API key (if using the crawler) + +--- ## Next Steps diff --git a/surfsense_web/public/docs/google_oauth_config.png b/surfsense_web/public/docs/google_oauth_config.png new file mode 100644 index 0000000000000000000000000000000000000000..58b1216cd9944aa6964238f8aa41742b0a39d1a7 GIT binary patch literal 47780 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

A*0_{ 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

N-yBJjUGp*O-7og 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

IBZGMcL5bO&++Evnh>0hp2oP({Ga@N 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 !aN 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ⓈwS#VCUyGimNcULn&B-+&ufB~CFvrS$0euvbU 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 z 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 OKQE<}UKC3h2mU`)&gZ89 literal 0 HcmV?d00001 From 7044eae027a5ddcfc7b23c37a671c82443bf3992 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Wed, 23 Apr 2025 15:22:43 -0700 Subject: [PATCH 35/47] docs stuff --- surfsense_backend/draw.py | 5 + surfsense_web/content/docs/index.mdx | 90 +++++++++++++++++- surfsense_web/content/docs/meta.json | 9 ++ .../public/docs/google_oauth_client.png | Bin 0 -> 99948 bytes surfsense_web/public/docs/people_api.png | Bin 0 -> 70041 bytes surfsense_web/public/docs/unstructured.png | Bin 0 -> 110477 bytes 6 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 surfsense_backend/draw.py create mode 100644 surfsense_web/content/docs/meta.json create mode 100644 surfsense_web/public/docs/google_oauth_client.png create mode 100644 surfsense_web/public/docs/people_api.png create mode 100644 surfsense_web/public/docs/unstructured.png diff --git a/surfsense_backend/draw.py b/surfsense_backend/draw.py new file mode 100644 index 000000000..ec55f79a5 --- /dev/null +++ b/surfsense_backend/draw.py @@ -0,0 +1,5 @@ +from app.agents.researcher.graph import graph as researcher_graph +from app.agents.researcher.sub_section_writer.graph import graph as sub_section_writer_graph + +print(researcher_graph.get_graph().draw_mermaid()) +print(sub_section_writer_graph.get_graph().draw_mermaid()) \ No newline at end of file diff --git a/surfsense_web/content/docs/index.mdx b/surfsense_web/content/docs/index.mdx index e99f597dc..b2a96d62b 100644 --- a/surfsense_web/content/docs/index.mdx +++ b/surfsense_web/content/docs/index.mdx @@ -1,7 +1,87 @@ --- -title: Welcome Docs +title: Prerequisites +description: Required setup's before setting up SurfSense +full: true --- - -## Introduction - -I love Docs. \ No newline at end of file + +## PGVector installation Guide + +SurfSense requires the pgvector extension for PostgreSQL: + +### Linux and Mac + +Compile and install the extension (supports Postgres 13+) + +```sh +cd /tmp +git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git +cd pgvector +make +make install # may need sudo +``` + +See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---linux-and-mac) if you run into issues + +### Windows + +Ensure [C++ support in Visual Studio](https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170#download-and-install-the-tools) is installed, and run: + +```cmd +call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" +``` + +Note: The exact path will vary depending on your Visual Studio version and edition + +Then use `nmake` to build: + +```cmd +set "PGROOT=C:\Program Files\PostgreSQL\16" +cd %TEMP% +git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git +cd pgvector +nmake /F Makefile.win +nmake /F Makefile.win install +``` + +See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---windows) if you run into issues + + + +## File Upload's + +Files are converted to LLM friendly formats using [Unstructured](https://github.com/Unstructured-IO/unstructured) + +1. Get an Unstructured.io API key from [Unstructured Platform](https://platform.unstructured.io/) +2. You should be able to generate API keys once registered +![Image](/docs/unstructured.png) + +## Google OAuth Setup + +SurfSense user management and authentication works on Google OAuth. + +1. Set up OAuth Client at [Google Developer Console](https://developers.google.com/identity/protocols/oauth2) +2. Enable People API. +3. Note your OAuth Client. + +## LLM Observability (Optional) + +For monitoring LLM interactions: + +1. Get a LangSmith API key from [smith.langchain.com](https://smith.langchain.com/) +2. This helps in observing SurfSense Researcher Agent operations + +## Crawler Support + +SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. + +## API Keys + +Prepare the following API keys: + +1. LLM API keys (OpenAI, Gemini, etc.) based on your selected models +2. Unstructured.io API key +3. Firecrawl API key (if using the crawler) + +## Next Steps + +Once you have all prerequisites in place, proceed to the [installation guide](/docs/installation) to set up SurfSense. \ No newline at end of file diff --git a/surfsense_web/content/docs/meta.json b/surfsense_web/content/docs/meta.json new file mode 100644 index 000000000..e5bb280a4 --- /dev/null +++ b/surfsense_web/content/docs/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Setup", + "description": "The setup guide for Surfsense", + "root": true, + "pages": [ + "---Setup---", + "index" + ] + } \ No newline at end of file diff --git a/surfsense_web/public/docs/google_oauth_client.png b/surfsense_web/public/docs/google_oauth_client.png new file mode 100644 index 0000000000000000000000000000000000000000..f49650b5dc8428c5c13d99f842a76be6e794c93f GIT binary patch literal 99948 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%0A+`*iCW^n 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 DXjIlt literal 0 HcmV?d00001 diff --git a/surfsense_web/public/docs/unstructured.png b/surfsense_web/public/docs/unstructured.png new file mode 100644 index 0000000000000000000000000000000000000000..861a847feff3ba3ada4e96093619728ec2607714 GIT binary patch literal 110477 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 qv}=y|5`;B#-s`3*Z1iwQ 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 U;33l^B*dSrl;W#0Nkjkt0gE12$N&HU literal 0 HcmV?d00001 From f445a2b130700a1cf22d89e8b6b063d9a9771d8c Mon Sep 17 00:00:00 2001 From: "Exceeds_Lenovo\\rohan" Date: Wed, 23 Apr 2025 15:22:43 -0700 Subject: [PATCH 36/47] chore: docs --- surfsense_web/content/docs/index.mdx | 46 +++++++++++------- .../public/docs/google_oauth_config.png | Bin 0 -> 47780 bytes ...le_api.png => google_oauth_people_api.png} | Bin .../public/docs/google_oauth_screen.png | Bin 0 -> 72927 bytes surfsense_web/public/docs/langsmith.png | Bin 0 -> 308274 bytes 5 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 surfsense_web/public/docs/google_oauth_config.png rename surfsense_web/public/docs/{people_api.png => google_oauth_people_api.png} (100%) create mode 100644 surfsense_web/public/docs/google_oauth_screen.png create mode 100644 surfsense_web/public/docs/langsmith.png diff --git a/surfsense_web/content/docs/index.mdx b/surfsense_web/content/docs/index.mdx index b2a96d62b..f3411b897 100644 --- a/surfsense_web/content/docs/index.mdx +++ b/surfsense_web/content/docs/index.mdx @@ -45,7 +45,23 @@ nmake /F Makefile.win install See the [installation notes](https://github.com/pgvector/pgvector/tree/master#installation-notes---windows) if you run into issues +--- +## Google OAuth Setup + +SurfSense user management and authentication works on Google OAuth. Lets set it up. + +1. Login to your [Google Developer Console](https://console.cloud.google.com/) +2. Enable People API. +![Google Developer Console People API](/docs/google_oauth_people_api.png) +3. Set up OAuth consent screen. +![Google Developer Console OAuth consent screen](/docs/google_oauth_screen.png) +4. Create OAuth client ID and secret. +![Google Developer Console OAuth client ID](/docs/google_oauth_client.png) +5. It should look like this. +![Google Developer Console Config](/docs/google_oauth_config.png) + +--- ## File Upload's @@ -53,34 +69,30 @@ Files are converted to LLM friendly formats using [Unstructured](https://github. 1. Get an Unstructured.io API key from [Unstructured Platform](https://platform.unstructured.io/) 2. You should be able to generate API keys once registered -![Image](/docs/unstructured.png) +![Unstructured Dashboard](/docs/unstructured.png) -## Google OAuth Setup - -SurfSense user management and authentication works on Google OAuth. - -1. Set up OAuth Client at [Google Developer Console](https://developers.google.com/identity/protocols/oauth2) -2. Enable People API. -3. Note your OAuth Client. +--- ## LLM Observability (Optional) -For monitoring LLM interactions: +This is not required for SurfSense to work. But it is always a good idea to monitor LLM interactions. So we do not have those WTH moments. 1. Get a LangSmith API key from [smith.langchain.com](https://smith.langchain.com/) -2. This helps in observing SurfSense Researcher Agent operations +2. This helps in observing SurfSense Researcher Agent. +![LangSmith](/docs/langsmith.png) -## Crawler Support +--- -SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. +## Crawler -## API Keys +SurfSense have 2 options for saving webpages: +- [SurfSense Extension](https://github.com/MODSetter/SurfSense/tree/main/surfsense_browser_extension) (Overall better experience & ability to save private webpages, recommended) +- Crawler (If you want to save public webpages) -Prepare the following API keys: +**NOTE:** SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) for web crawling. If you plan on using the crawler, you will need to create a Firecrawl account and get an API key. -1. LLM API keys (OpenAI, Gemini, etc.) based on your selected models -2. Unstructured.io API key -3. Firecrawl API key (if using the crawler) + +--- ## Next Steps diff --git a/surfsense_web/public/docs/google_oauth_config.png b/surfsense_web/public/docs/google_oauth_config.png new file mode 100644 index 0000000000000000000000000000000000000000..58b1216cd9944aa6964238f8aa41742b0a39d1a7 GIT binary patch literal 47780 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

A*0_{ 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�_T`+?`3=dEO+3!SY%g-h#Ei2pG## zj-%nMwLg>EmM)Kec$r1aZTI?v5R)N#SiI`f7#OOeObuU;;*4v-TS$bTmN&gGBAFeD>owfqcVG?`FBEh8I9V6)9Y z8+6F<_dFaZOl-c5_ky=lnVrKJnfQG4dDp z>W!~k$B2`h^`U>#E$?(wfq3O1YfQ+w1^W@mKN$1U?xOpNt#i0@pr!G|22j~@dY zmdQm%VSc%PX7qaO7%v4q3MlSW4YPI-drZEc>i)MySKyW*Qpi0@y2 zp3lqAf!2g)-iL+xb>l^0tn}6=1d2O z)sMW~lYJ^Upq*Fr#4_fL3ga2XEpaKOktqII^8QLBvmt6cX}&0KW4cxFX4&6;E6qvF zh{ijh(WuIcU`%pG-o1NLfs;K4S?ulg+6-QRM`Vs3&*V#Tdg4M@*#*(_-@9T>Ozk3u zvKhGEE$M76pOZ>*h5)^Lr_bB}D$4DHumr@FcfrSu9mbF8DmtIDusNO=PQQG>Yx$Qr zJ4f1-=aBnKr1h(R9a?>5YNSPi&bu! zas4${V{tRRN8M4cSsW*=m)bZu+u6#NjUv5~!p?&K>6>hK|F_;<-ea2r(!;;RiJVq) zTK(H7`RE`GrJ$hIYX9xY3v!Ho0FazTNeLlmINNZLgFz04Z6HVwaxlojAP0kd8Ej)f zE+DtbAm@p4o+#&ua-JyXiL!`(QaZ?aqLd190V$<|91Po3kb^-EhHVN+4{|Wb!5{~N zd>P0vAm1%X=^*Ec+i3WI42E?NAs@?#q;+<7szD`_>i8~SFQn+a%pZ80I94P2D@ zi8VoD?|5=oOQ`h9cA3x^@?XKp{Aac=6lx|Ih^+!PCbUef3+~=cFa;8J{lhTUr+{ir zZEb34jxaKF=1DE|uL`p00YL9-!J!%L=+6{n`N4n-FX2CBbf7gpR=@+#tnBosX)Lr| zW@^x4b15J|r?s`!StwMed*dc2Cy9~0ugae6C*@9#t<8 literal 0 HcmV?d00001 diff --git a/surfsense_web/public/docs/langsmith.png b/surfsense_web/public/docs/langsmith.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc7b43e675f8dcc3bba5800d9ed5bf5d1ce6cb3 GIT binary patch literal 308274 zcmcG$cUTkO_AX9QP(Tnt5D-w1CS7`0LFu3%y@_<`CG;X9y-AZ^q)P84bP(wTrG*|K zK%|D600D9bKIh!u_ng1(^Ly^i^CS~yCNq21UVH6#z3bhCzfqIFLqto2gM)KNQ9(`v z2ZzuN2M53S76GtlWrM08*xPIWBtx#>;d@7qoadagJ) zq(86TxP6X4%yDqA1&VSn-gz2tFL?RBn_R|Xb>bCSiAfZ0Q9ce&xuu}{G%}ujN?{i7 zQZ{~cAdI7k^TuD-#Kbp-hAMAO zA1B)&>bCK=StCqRIZN~CBSWRT?l6jpAe!t$I z{Gg;nsi@sEG(_yk=y>isl5&C1{&cU(#@sAddQFH&PT@Pb(`Q zfc-@OeR2cvkSV?wO`gjVW=RvBzldR`2gkLQFYL;$AL)NLsF*aMR;FPnS@2n73}A%! zExxyb9mZW<<__FcwMQ0H`nxOYjy`uW;jgYaPj@zs<6s#r`s(5L4 z-G}VwDcpI3nn_r4*XVl}{^dOR_ki1BKjEC8pYQGOcg@Yw?cufVp-|nc@SyDM)XvUF zpA87;JgBcb^doSf@Z@84weH97Cm;D27Z*=%5D>JPmn9zH;RiLj?dMiE_3rY4)=9CD zlhd^Q{o~%b)#%uP{mRPNIrQbFWw-1s#e34FRj?%d`#;Y6v8)0KqE#CD*7YSMWUR)* zX~P}0t!GyIw6U}pIdp8N^3hw>@8W##`1se{T>8D%ocu2XGT! zoh0O4$mqy+x?dJCUWB1=d0tJyeQPjxZ@%KO5c$*~#rXJOOy(3}T3TIVEVwfti|NLT z{^fp({V>!n{_ycaD`Q??kJHDWD#GV;x_T08jG;;JZ2!SH+72A9b8GWw=nUggP9(!K z?Zw|y=E9nfb9&zIN?JjPE$$_>Q zP2Y27oQG20iFxv|TDsa$arf=#eKGXkBM`+7n39rGA9)VV1>29$QumGz@mtwB+9O8X zQ{!!056Nk1U&GqbAF2frrIl(2qXGU=lirKdD%WoD^zA~&!jSFIg3QLy!k+~j?`KIn z0Wip}c$9_1yDo0okJNurK+jXKsr>+b-BR@Q^f8N*_dA={Ts!17Z0gs2XHg$OKD$8o zK>n)l^*>KW%V!XJQEz5S|wq5<^MsuqS~6t+$5wSfFi$320qhyh|o1pC4KIJ6@J` z#^!Er&$L5qMtl{$(|%x{Cllcrs#|~tXnr$DdDk7mA|RTX4U<|r=opQ{X6OVkSfoc> zocWV^O`0uJwk8Ucsdrl{d2z6(>cYjv#i-)c>nM}2RDx-2DQ%E7Sto-NxcF!$cjt1R zTlJNm!}9Crhh6Om8cB*z6Ne~RqY#rii17*|38$zEDX#*Rw(8}Yo9C5)qHBl#I zuP+>^OzlLObo*AJJ!d3B948@oO2#@kATCL{H$iMO?TtInr#YloSe3HR>EFl*23xOD zNr6BqA9tF_()^_!e|My!6*|kU{WgYNDpJN`o$>Mmuf#z|O$csRo&Ej4E(_bxr}-R) zXOP$6P~^s}A;c8R#(0Pn*j3$uPQwmeHD-j|{?r&`7{COi6`30+gCu>?+~)rAiZ5)2 zBC^cjr}nFUS-nN_^Vy+;CNhCHU}yMTA&5GyQQUd6fi+~dMN3^CDAi#hCEh`V7j%rvU2r_UI%0b}F4q&ApoPnrx5 z3+s>W$#R+e)fV&TPhOu=kxVatW_3|bv$+XbBg@7H4NgIxV>H6~j%%i$xDUz>>@K7Q zg^tsF(WwuhmvCQN^fBAy%BkpYL-#sCjbzHuhi^u%LIPi^O5)NhQ&ZD=yqWPLb5^e~Q!@S=BN+Ki?$o zV(ACb3Uht$eghTz2oclY)o0#uafzvY-_=bU++2V9E>IJl(_%yMn~Kq-k8%j|9J)GE zbvtN4>{}l~f^5a?piq9B3|y|so(`K`PjQ(U;=ftj<~OBda$r2$(yJ*tE&sP+S}cTx zC+HEpm)im--P2)Tm=9#y|K-W9{mtZvN1p_I&!&d#L=A6vTt+0nu7hs}=)27Auo6j| z^eQ|0jkGbx(~Ld-s;u+q(Grm!@-oXJJLBf(9gqishBY00(F%>bg?5twRGv|5+_n3IC+jqBrQ9aFs zlHYzfrP{Ri#Z-tI$@z~JxGa|d%tYaX2yp|k@USIas-x=rr6WP7huOS#U)&pTEQfV! z^)MK^Z7Gj}1M$m4_?ki) z38~1;htnFKwC>#tLhkhJ1l~MnvlT(Mqwd*q8oaH?0|3FEFqL+&Z3=N>NVVF}5SAuC zM?t%3IG15lSU3e+VvM`1e}`={MnM7&j*8l;WD!4`?Nar#*@facCWtIb$BdBw^-gc) zXw^`NWSsxpI6w^S=GGS~+Ee<@yjP!mDvB2Ja<$!R=>2IT>!U9i{8zXQ3MX=!8e?pE@|1 z%^gAdl%B71qcv-5`zl$$?@O`4Yk^jtH9j*l=?&~3hE#kmII)sH?W<+M#5t3(VLLZ4 z+A&rK6N)PS7Muu&NH}@2U#aa}!^rsslJQ`(R5@A;lxuT%*ec^kGAbpK{Z8N25ys>6 zo+hD4<-=wowW5@(1exTytd9ZIRsbZKpmQ17=@W8~(LwU*r{JYrw3p3+C#(7?JysH$ zMM!X5qZ3SKvD*2*W~!}!l>?r7K1P7YEE`SuW5T|R>I4;#!Ora*5Yr-ks=RyWgqlOM zR{%8VX*^@P1~FA6vEFrm&@{DGbjp10;=~4V@QEAHWaal7eAa&Jgj|-Oo^2~Lwbko4 z5u1nrXj4Vlyvrzvf%RDczUFmP741YFzPrA&g>!JeqaH;Ak^B~!qselJnfB+~6um*A zFt4m9u{5tIprtg^-zn(DC5JcjsB#(pI@)RD5|5MzSibl4>1OneT1JCDEHZGe+U3h4 z)JQV)PxsBf4L{m%;98d%TU_*aruzO9QRAyHvu`kSIlL66=H}@nX`m+0=c!WDwmE|} z(?$4dlkJ+rJhZ4(Tcn<2pVD8E0uF+ccUnq@XpTVJ({VBM67O`ibqw)G0r2ZZLMvkL z4J%(r6|mak8ZIZ(YBPpP4A&D5%XhK3IgkL^V%JdQ%E}6DTRRp5!ydq}{&$`yu)gU1 zc%8EryWXB(SR^}%Sl~43HvEJ(UKdI5|LN%8k+y&%;~nmSJvSggS*vR@@`bvs?0)aC zSl9}$yV+F0-6-FHfLxC5&t=c6Y1RfW{Rou2*cA82u1eL}ZpOm6cfd&M4)|IeN^^d; zU8+$YwVo_+4~)?!wsci?=-`cm@%p4G^U+i$p;Fm;&hr?s^o zWtb_pR!Uh8zyGMbvSoX^^SfokZRoz5v7J)UV$kVMHgwvqGI;CFp zDbBf*{C$9p-9G}}64ZyO|NH2RtwHMK_xjQhG)&*|4o-^;ZjK`MkK!m@s%oPuqsn zs+K$T^YO(F^T9j|pVRx><|@d=BZdQULY|jSeFmrKc=-+bg>-%i2#){!qQsvyNvaC- z_TjwipIS(Z5r663KT^n{KSzvb`W`GQ&x`E6CBT}K%yr<+x_?lp8xpI$OqY>d%v}6) z@!)X8k!EoY&numVVj;E*AM~a8mpys-{ z${{^_avLk*MdX-3Z7f}3pK0PlLuR7(ekexnwcC?t`80_3`Occu!&5{fPS*)xO4AM- z{J}+(YfJW&j>--3XPGW8Q#A({SSMwe3BSdZ#yTXWcN9rVkVgJKIG36 zr_y@x%I@Rnr$4*`=*fasLDPqdWb&r_Lc%4fVYe`J0Hf;hpmg(V_}p16q5!Py1)6ny zaB*~3T8s6Jk|$+pGGXBhc8QcJ1|^kODh#@?pPNY>Zwd&j;;;%BCWMKz~1J7+|Ll z(^Y-SR@6Tt>c_3B KVgiCj#QMZe2If?v1sY1g5wVP~YAx^HOBim|s}yY@KN6hl zyk{$^;5A18U}-@00mN!J`ZoqDk%LHCPU&D3`lxo;Z3 zcN-SX^O5)UM@~#i-?tW>Obj{}orpSpe5IJQm@NU;pua#S39&`SVH$XnM)%%L! zmB#Hic!}cpRGVRFq0TK`O_eCbb$lP|J;ZPCx~PBIisbB!b$^Th$V`Zr*F<%5X1BG~ zO$gb3c+aEprnS;|e+@I`Lq(QfVwo;T_Z#>+c*s?-$0B?Ic!SvmbUrOr)qq_}^JW7p z_?ti$BxX{<%>ahgYjofS$dC8kU-rL*Hd;X|Ms*t$w!C;NWixu-6dvy9KDY?3W`v`@F+AA7R?%ST?5r%(|(s?tFa=leB3&D#0CW5`W5ONX07^mFj@mp~E7%cp! zA~^W7D>UXvMaDa-iE*{Ybn^kLdS;I@Z^uwFw4bANCDn@cF1a&dz&ZS7O>KvuHk4jd zhT+s%qTSo--l%G7&qT7Z`M5K}6@EH<QFX>bj!+4t9Vu#mULnKv)ZA_b#P7EujFJ%*otD@-(AE=qOQoX+fJG# zEgylPHJCIE?i*b__v%-@xKA%WSETCh;Fqm$FBw7TWtVaGpsm@R>HLx{C5e=u+2p-L zdF)l0AbRLn(bb@Vgq4+*;M38O8ze()t6HT5@GW6CfPzVRxe$ME?*PxS(l+4MY(k-G z`Vt%-92-ma>lYM(xTe2W*HJWBDcfw&QC4U)$RpvTd#F{?hbt&rixkUIMOfz_=s{On zvP^_9dQFII_q>VI(RmjmI7+ACxl!EJb8H>UXw_f2X>Ye7*wi_Rr)Eiykm*xzrqnj7 z$6pxqB)W2<*8p4QI`VuCv*i0nq#)1EPYHXxQf;-eF@{ikcG({KtHTH~W)tvXRNiO9 zO^1-+$@#Q}xx)-?vq|=8<^JAeRkD%ZT^fnRejFdg=jbPe!!+uKnq~$qQ?chEVBYfx zHP)PdrArnBTT*#GJ%srrG?qUnTB?Tl?SyR1Xsk2eDr5D8LhUlW<#vK%rk ztvRR4vxugX%!|~9slM|7N&ymDmNfXy9IviQ<{240C7ES zU*`xAsFER(`}?tpbj#k%&SW4u>0yw|9T2h&dihY~%gRdW8;#G6jj`1wO2d``4sFNU zosqdr(f^dBiUSN3F3>bNEFQ6*1MNKJvU66KvDLDK&-j{|lf_;J-p}DES1QtRQ0{QT z*j2+aXLo9>K=lQOa)`28d#_zm4D{5iRME3F+bj)XdK9xeBpZA2jX5bg8(-97ji|GD zhs1yTEk@XsG(h*9jzHaaVY*pqQ}B0rSW&$#HJ5IGcW~rYFlur4({7HbV9P>vkY_d@ z!D{MV>6sk@JOe~tI^40`VO)HSu;u|uJ&A8#I-nGVFHiCH>zacleB4}S`r2XD@cS?Y zonKvzm;FUL-U8lJOzRN6p0aEhM1;|Cg;||>Bv8{pdP!i8OfjuCOwW~yf33^XybZ&O zy+I^gRCSpW+_d^?II}iUPX;+W6MNay96%SVVf;s?@j%bCattmFLl6}`{VS_A$vR)! zkh^nk=J8l6OTTAcFERzQeL?(tm7sk_9GF>J7yQF3_Cs(0U<@dUv$ zYCASHan(E-V*ma<;8zkJ%;lsY!rURK?>9f@Ou$v}x{!Ld@!|l} zH!!nL^tPz>hxIeN(Wf&0XVV+`5A9!##m9=dpWKp2KBw&9U4)NvM)h$xZk^ZXo9uQ? z(94UuZ;O_$q{o3j3Mbfl83Kt380<;pAeA&(u(VVImyoXz$A7IOAIktrZpYaaVrnVCfuK}Hg6!P+N zbo-Lve3r~|gDu?)or(5Dx9zlw)JXX2&a|CbG*qS6XVW8yxWSIy;>HXj-(WoIrV8>) z=?lK1Fwcq2y}a??lp2;D!$U)w3SkF9obo5D(KY0qBeP_z%geY=MvRp*{Dw7uU8W3n zwBvR-$a;Bn>E2^t9I_=gS*!oGHC>%!Y5UjvCShaA)Weq*xbm+gqX$O@IEb?|Oe0f-c9Pe5o-O{>KTf*sK+`=VaN4`_F*5cnK=*T+I6zVF{cJbdxL7i( zyN$*54D{3ZF~-}EJtGOl9y``tW=6+W`nfrD{lZ)4&P4bxr4ijK+~IcG?XW5yROu@$ zEVo&x>vzR`WEj$VKJ-T4>02elaLepY^h7-arhc=ulk)DZWS(y^zeSF*cU*n4&1Z%i ze>g}R(rAuP)j7C?Ynm7=SpJWygyCyrowFvq+wDRR+6Ulvr%L!h38St{W7?@QFyiIx zUuz8QG6ZG|xYJC%t`*eiJ{-wJBd}7uka*C)@H8i+6>N z(PW)-ed#MJ_bR4&w7fP~tE!xuJ&>=rrpm>7CN-A3lQy_Rw_a$h7rbeTkaGH{Mrd+baq4 zdODdX<8l!A=DHwBK;ZG0StNz1>mh22cX= z&xw4Tacn+ab>m+&^2T@(8Guor-m&%AnSJ%TmxqeSaFu`6sL??cypb$*vquz9ADXkK zAGlM$$*EaN{XH`5n}?H0DB*Tsh2xBV^P;q|XG>Y-Rv8*~3~+XR_G#;P(nYF}ozn2{ zYnZahyIJa&&Hm_;a={BgS{bv=yG+*CW5#3dn72((BJ0w*_L9xb#kYg+&}nBWzI>Qe zfS4%NsdV{enb&jrx$;wEBN;Gm;kzx!<#fk(Q}phrsPoE~>eOp6{4TdSpv7k@9K+y1 zhMnnV0|1H|N_bt)X5c$=o&Cq=v36I+HjA@O2L&mBeJ{TO~0Qa)18#^$&=txz$PK?*PWVd2?#aY0_q; z=Qe|Uzm|K2ZMmO~IY|WFOH?YanD?2Jji{{&9ki6I3RD(n&}>=Jc;6q!w zdE-}dtFIlAo$;TiI+Gw_S+3b!9~|03!8jw<3#?(-OIMCkhi*RVzECBApHO(+TcH%d z29!I(=C?CU%Wa*uip$#T?PhAaL52XHTL1e{xMK#iem@&}S;s$Nsjr z?yYwk&63*Um#g^LlJ;ZEN51$}==k{XCv^3ei}H3Qru3JNa%ho{m)G*nj#;I9na?|* z9<_`B~gM$%pE!6Npt^@+G z2L}2#pwhoVo8yQqeZrRd+lE^P_70CKS)S%{dVG21vPCvKHvFNhZ}n&J5cSE~F!Z5> zf8vG7w#Yx%W73c%a@*4MTa;KV+gwRIJ2?SBIs8G~)~nlZG&EFz`|DI17c@2LI*MQU zN7#hMp@IIJH%?ilug-GJjrRFZf7jX6HWRybAU9VCG_Fy6{xZk!a`k49GN0zc>qd)& zu&SoH9B*EUVXVvIX^C##stXXE)O~z?lnG`+`-T0VugA+ZJI^e!IIXR%QCb@K#>U2g z?xxAErR=|yNgs=TRDI3u=Da~5#ILP*2iSc7u}AbOIQYL+GpKe<1&*Vmu}Au2=c!tQX@Q39@t@wkdsm@$oqNy4 zuy5>aX-QlEMKRHT%da#(=*l%(C~yM8qQ?soQ&L8nSDqM0moNaO1_U^)CMLjL?{8}7 z<^wvBl@Ad_#9+G?K%ey8pbc-~>DZn8>nP*P$o_AE6}Z~^zjQ|bpJuCHRhB~Vx39V?o`;xpvWUNz3Tl!C9NdEmiT5M=>CZ;>zD;6uSKWVHWEcV#RGsXO1DuoeO6bh%?8%YljohA#Y|nxX_?RLa&W1 z=uZ3HhkjBgMOlimMVh6}g2Xkjm3QU`-+yZT0xJab$t9;3$k(aXs-3ql0D7eeIg0q| zV0SH$`**WkC_cUmbf`3L(*?V*5RyL30m4J?CbHnSgv32>D|xeh)fG~GF+#+;IiG_j z0}faW74RS3<=`G|d1v8m-fMpEBkRT*i=l7TzNapYH6a?*wl#+JfYTQe;VM%%#ZzqGkw^!Ea#G}~TYwwLGA6^ZXs4dp2Kbd>9*D`2|csI&8v zExZb&sj{r)7pnbSQ{$S7U-7GsQvavGlR4p)#bQUm7L&q>WtW)%CyW;L}NP$PWya+$9mt<*X*G}s@myp*uU+deYE?B`rgs-dCmxz0G zKW!g>kr4$O>cK#d&yT^n-P_?@R%!+|dg6kOlD55e&8)4Y3%ymo%i|D6hc z35Y}kTak|^OjNP4Y&F3?Vu+fVCTmH!Hn^v#Aa+FQY&dl0-Z5*!3UgJHal-jU{`oq; zWkGWy?pt_rwWlZc08zabcbR;uk_8SogdXg97D7~6t37^Tgm`P>TKW$EWey)8;;v!} zc>e9^+q72TKHe0bg3oqlKtp^*M8gydr4XyzK`ws&-q{04HISP;4v z7hd=Km1s1YfbRPii7U95-4I%w!fC4m+gzc@z7LF1rRTu@1Z+)wYXIZ1Xl|ntvs;nh zb4VCFP8misMZ8PwnP6g%%wWR0=dY#~s_9>^3rNVWNoCY&x z@g6=$H`Cp1`nqTC$jgM zv9~ew)P6)VeURPGb8Z}_8DU5KfHiU0r6kLZQgsGj3?t7UDBohS*&$SkZa|C3moJZzl;SdB zAPGhD$ZnOSaNawOTSBI$vS`kOTmlxsMp8wu_Sm8GA-Xsv+~SnYk?#>D``{Cn6;n&_ zQT-fnMFf!G8VrWqv$;{cR@LZIe<5V!%;H z^~P=E-Y+5FL#%$QpCA9t8%wq}5hen}xa9_i_UonxGIKxI&INkcnKZ&X4FWzDD^l1Y z+Q0v8L9#a(eedx+)KUey(lh;nPsrvo_!l>&ADW&Ti;*#_RT8opqfDq|1a!$w8rFFy zADtJDhWh9LX$AoHB8V#Y7CfMkBEw>n$t~(TLTfbw!=TI$r}{wJOd8|oD7=AmV5-xU ze<=ZaaRo7Io~^r$g0DlGgpG(Z(MtV7p?zUg`1$4C-pm<_69fw8(4_Z;yCn z`HBg}|BFzdnw;xFs-!OocP7X~ zZTv4hvY7x?PpAk;Azrd=$TpC3@NPu;eCqGXhEv?_$GZCuilk!Ky9X+pKGaVcq!7O` z)a}1tnncXjv64OSh0 zH=pCpn=x?>lgAU9D4S5gymZ1f4iHXY(j@}E(w3I8cr0r_%iLOXSN^cy*C&QL?Xxp( zi2{$3u@uIY!P9C?86l(4kmKyG^=;;d^GSmtT9GMYtW#1;ED_p}W4rWM{D;V5JKjbX zr_k6u)yTX4n>8YxNlfbB4;!Z|Xorlg;12SmD&I*`_Ho7fNUJ>hB+B&pf~uW&rIeew z^N+TwLZkg^934?kmrMHA_w{BC|7F{XP&L0O7O1*xmVq2?Mu38{xa6@i-fZ3SyIw2G z4AHlhxV!a~)KnTyD>sUsNi*lD(p{Z!E~`(Q9v&76xa@OhQ}X0X3@GzUzg(f~~q2n`&~|C)tR0O7huzRAtSB=A}C*t$P7MU?P|bk^aPVTELk zr{$)^`p~Qb--OAJqN3UMPerCP{63A;ZfnxCRDZcQ!`}_3x@T@@C}5lI9c4pTQ%xmC zG)(o9$@{LvlepC+#;=E`gu_uH{z|^9S9>n{QMU>b6F7T`D<7dBH0)w z_#@}HyPV{yX!5Av&qn!JA!}gl1HJ})bv~UJxjORV`%aXqTu-%S1u%|z0*u;hzS_bM zpxB=i`L_!@aRAhnP{|7{iQq9lf#_;E0vl3b1Os^taOAjDMeEGMO_rb;#^xpeG+SB> znAAzq4}3Qghaf^8wk#mhSQs?C{dV5YIA=gy=wvD~ZTQPC*4p#f>X6Kej`_ykabyLG z#P_4P@>G5`uLP_hn=03TpNKdcM5bmR3KeizIT>t(ahayi8BZqlZH7C$MSG?!k0;j% z+so*g7*vblFH*gIa_Rqgz#%X5P%(YuJ8y{nl!+nw-?KH{ulx!sR#5$(vEi*#8AqM7 z3)Q^;0kxwU-KfcRE+2D)cdUY{{ZmJR6HI7I>7s#=*nMUp+<0ME^?EbHa|zl?)8Go5 z*a}n2i;uqtguAXvuV0#|v-FEtKk_6=x}F+spLDE!wHO~7u8EH=ZHh)d(_2~!I z<%u4bVYR*(7N$N^vjWn17KL1xXw?mAn@Y5eYO87quG6&5l5RBFS@)csFDmcYm84*e645e zXkh;E4DZRzv$b9Qi)UlE7GA#xQ2W7yb?qm0nyN)cF|0OIbap40zK4L|^8-nJYNWeU zzgK`Ms_1@a+_-3Dw|F!=n$T+dv$fA7gQAf5^S;KJRx=SFXbk@ZkXV_r7G=QF(s3&j z{3rH_1q4H?nWcP*1SM0o0V(yC)cGx+(=#O{)f#Lw`DGcR9k827WpLP%C6`y`NKYmi_YZ@TG zcItq7+XBipU>d@DeHl6IyYh@Z+NfrGuutu*|@-2K+4sU=WgwaiNCuih1J9pCx~ zj>rfz`QxF5`ZJ4n$KQ^vCw{z5au5kRxLkl_#s3SVK=TU;47C zRVBG4FFfMb<0oe}!YZzMoFbB0#l(#47t+|1A{;Kgto2)J+&z+Loo}&GJaa{WrF3E+ zHJDNIld(K=d&6BQ@pMzA@-I8n+?Tro=k$fmWl3~YGQq)Qq8+1by!g{%+0ht!(?k1x zE`JY#+Y1>!U!GadN(|GD1@$jhKOtd!t-i2*os9!@4WHr9d3nvlRFB_-MMc|4{9y@e zmeoqOF7op!{gYc$=UxQ(4z3SN`$L3y)64Q^R-CQ9+(7HXsx&|U2C!(z%(-|I zRa)`GWYV?VpGGL+xyRApKldHld|)_?r6pDn@>VbTm?@^=`t;*X?;1NC%kHz$_pT`N z7<%dM>TR-=8JP*`=xQJvsf0LhS0}PCTEfrMpXGZn31ClzZMAurycBM%=h1AJdQRog z&h|ud(8R=bQF+Jc_CU-~{_DQ2VfhR(biuAPWha?t=B}I8#)inhMPiA#nv0fJSGSQ+ zgJ3K~BpSAlTSbL`dgX4;@nznpi6NZNB~(ze^T3D4r*)|!fv*6z<%Ld_T0<(?lro=eS+;?BYpGy9X#2IZcTYv)mT&cqmunY+3E?Ojw?gojyA7 zex4QMHVPJl`phEe-auZ9yY0Sf09mV_Fem7>!A@VN2d9`MW}B)z*gZxct+&i40Puyj zv?SjunJ0fZZQwE*SrY(nk<8>9p3YwcjvW~7D!$zPgE?lJv>+nNAFwwqU<_-@2OIesmpezv&tJBfQyxx*c z#mwQ#cuj>-SGhV?f%QiMmI)UIwkYj&ELY4xu|-S1>e>BTVRJL?r=0k7r#{*O95(Vc z(+0^dI+8ECk5tXYibzG~Ft<_aeCtTPktX@E5!i&0KATz+&;MDF=;isZZ4{-u8&c2pl0G z91h$kVq|bL4k`73KJUVU?z{~X@p7lKp(yA3#F0GduN&w0Gn5z&0+KDt2G8`S&=KIQ zqNh6xF($wIG%QTYtY(*H^2JOv8W&!DFp;JE@s=@nC1ZyZoaImwK#KM=%%;$>uvfyo zJv-a0Q`d^wP&_s!bf`R4f@q?=Ia*jDwm#g8{{BGU4F^|#6rOY$BFnFz6FO&ifUaiss zN6?mg}RRPlP?_yg^b;;sC>v0FM&pW=Aek<(F z6<;&s=A+W80N@oa3G$;5rr++KlsTvt!MI~U`sLx*6zttHvGWmda( zcp6G$foq$2n`Qlb%Pr>+@RXf!p>e6zE=IRjI1UwD9evg93Vs}2q6zPYzG~MuL&Isr zg1)GY0E_&nNo(9Ux878YShxsi3k3L`c4Ys|%6REAI%O!n&yYavbs}o%DLIhG$Wkc( zV5AJ3k7W){yl)YJWRvU&OA!w71C%WL!zPYg_v6y^0o4W$F%_4fcD2KTe#jkVocBQ4 z?Py~>bZ-yUYYEB)$gO?-x>4PCh>SefOijL)r!=r}-PIRNw$j*CBovulNz$<_NO9D zCp|i{SHK}@2uuH8OrEH;9NF_re+~b`2epO-yf|{vCcP`m7em>7-{j9s)&;!QS<&eD zZg{G=NNUgG_X5T-LQH4Syi^vWvX|>jmO!F{VI{~*(Uy!)Xm-WZaKY;wB>$=&b9XRD zk2qC0pYZXEinSPYwXu+)`bQU1jEhwyps>n`=|#|#&Da3>qiyn*iTj;0npzr{QVzjWNgY;2E&&|leMzkA4BZ4)(9$i^*Y?2Uuryl#> za0_jC_ybb6y%6O13~OIj5`RGlvw(HUK2goouJAogt3S8d5pQ(y2-4k0Ie7;pD8=&c zL3%|8kEgujxoxTUxDj^*tn_)U{$rq`4 zX(Ioj!VM?M2cyw|;ppLXQiK=!V8)M1Q>jPekD?ZzrHW8^EFk!9oK z#8d-m)@p&T*}bdA9hUYs^mj#)cLE+N<zzST>i}u`xdMyC2zhnCisz}{3q(CR}ZjZwu61w}| z@6ZjxhsK5q!J0sp@;kWLASPjA<`T3!wQ=sdx>@4q+13!a8-B4(yzxRk`FWL6;I6su z;UaOtxSZyyF547ns%HDxp|*S$j5aFx}sH>ZBxC5Zh__Q`8qmZ02XRJ#N&s&7@Njs zbJ&tKRF0>JY(pJt2aK5n1_`WBW|FhOse7HS)f2OY1q83Hd#}&j=xj+9iwQkq29*W!Z z42>L8`1|+Zgd~>QmbH{kdRS2Yt|4lEwc0U&(;LNZ>r)PM{Z2;KIRs56X0sK3iQf2P z${=fixV69#L_k++m`LVkz_8GdY&6IJ-EbI75o)T+0m!)noj*UszAJ|}S8Crq2&=ncX-qDx`TJF2E=YA6@ct%#=nt*cr z*qR=Cdqz`VJF~2+##KjK=YECh?qZuyDd+Y8H+Oy7swISsqP2&bTy`+YsEbj>5 zU81l4#td%J@`0;F;MmLVIzNt!DD&UE96QFY?^Mqg;ejd$J(IU?Jxe|yMGJ8LR8oM+ z6*j4{&|C)exP_Emq)xx|erEkenO;`!81r3@%A&@*44y&1Yc(HY_g6F##vRUM`*Gxb z)>iYE%=_yR3Ok~*Gl-TMe4`>ni=JnDdN6v$@E#w&m664FN3Ak{UVH>OfD<2q9G}|y z%M?b8Bc{6TrT*G9#Mhfj!?V0U_hr+lA80PzCUaExJn^o{*r|a^49<=VErST!{u&-a zUjr^l66JKR7IPxR5d-=#LLT&B%WzA?fxLrm;`b5c8ACnMyQ=>)pP_&VdP22^+2NxpNg&+%ILwN0IRlO)I!#xgm#cyK*O* z5K!2Nob*vZ)XhhU`Cv2p$3@ZSQIx$4u*Jp8%YBR30#z=!Wy?jMmaHsTWQ;~A8*%>j z<8&y8ii`26D@M`z5;g;-@H1g=$>LXkA~Cg5J|Olo^=$r;e9Bh4dT3Z^YWA`x-tb$= zvk#{n;oJ+}cP)pQ{U+UBvr2aDg(v78kSU}|GzbpYXHE~+$!}Md?qT{8YWnsI8^u0% zjjB4|4%+D!*Et5^R1;e!0uyLndI~BGz8@kpTvzUe+8E+~OXA~S5n3N5yD{@K>i93~ zy85|LESsUvp2qVnZAxvAkXO_|p$2eahjA`m6F6$Wv83hTj=`9F4U0WnC9hwcyzzW@ z9OsLp%MFTm4N4B*>py*(iXl4;S13?|4h!9=E$r+hD$;h3Spn_(2pm$*^8i7Td&%B9 ztJ@I4zS2DPD6nE2@KC*WU$3MF08e-u2B2TBfR3LoQuC~6tu{QcFZaBEe>1OCTfPqERKv#fmzOb64V z&iu&Tf%OQJ*qR1l&BWiussF{0!pLOC9QOKNJy7KgT!D+$LK~%I;CME z0@5X&(y;;3FuEJ0VZ`%Af8O{1c;d~o7Xyy5?dt0j=XrkCh5?`Pbv2Ezm;zuS0x+_s znyNY{T{A79t0Ql#bxU*78kQb)758;)x#{&%JeGtl_ZDd*x$Z)dM|S=4RJxz5qze1H znse|*?3Ui}=YnHyjK>nA!z}i(>(t`J9jp2ebu3`1Wr1VVCE%NmU&?x>9F!tkd4VY? zK!l%kouANtt>D*{R~^XP2=d@MI0+Bq!h>bmhdVO?8+l8RvdzR}4<;Mn;xMM9cJ^}S z$jUM3H%iz}XwQcvmwEB&X~NBCYKe934*{3-2hUbZk;YV-N9=EL0g}o1!Xs;ks~Xc# zpM+^IpXaO|4j`S(EBLotI``fw!==B10rG;9*o82B!TS;bE1NZNXzi^~j za^1QOS$fY`fa7f4>vY|(?kIp>#1bSNY{VE{B+xe(Q;q0Yfp-3~TN$pP zg=)?;7!iak)tK%Sx`%yw7oEpB!IzxjI;04!F%N9(`EV=;L@E0>72o8NfV@h6x(41! zv{q}HB3Iw80i+)Y+W2$Qmfg9^Y<4hlBBI5!lx_P5MBDTM7t3RZ@Knfq^J$(DoeCN_ z!7=0GCyOK(={3<3?%GG9XH{%F5DISk3d6eClseC~1l3u6%WGptN`Km%5&r+lP>4Mk zG~mj34a7&e#t4qZpRNifMM~c$FB_+B^RDeU=u^La{+cfGgzzDCM|rzkU-i!Njz01} z5UG$%`Fz|GQ4>{`?wXu+R=DPm)4fa^f&y`1bJe-YUlpbQnc(VrYE}S{9-tXBf z(`7b@bb5zkpd2Q*IJbb_c|9cXj-*>G-a!b@w>uXk13AFXpr9_3Xb+c7slJ^QTeA`X zj{3v4kJXcWxxSw7Bv7w1265ao3j!TpuSaqhLUu|lF3inEw2yy?pf@; zHT?Z`_6)z@`z8-})+Fw(gYk23Z}oo~MiY_`0y6A$sgZswb3})(CEx*7Ip=wqy?PwS z7Ht(_&TVRBIoipBWH&PYHCyUEt=e~+(}B2>1RYn$dB+^HRQ7m}Wn>Ck-zIM#zt{hS z_;eS=QQFQJ;qjav&!jjFKpu4W>4$)-th0R zkP}Y%qNi0x+uLg~lWVe>tR-u=@2@`B6`Gi~A?k#+#+Iy11P zR^!4Mf2_a>XLW5BoakAExCP$VO{+AqWHZ-w9)=pxT_pXY(!4&h{^aS}{o|eKpl`%m zj4-qh+sjt0k7LOk0SOrNhOyUE-{&sJ0W78m7JUmx#A5MpkBL>=R|2{9zwn&&3rgm`wJ^$CQ{)hu&d3B$6vOe91oiz7pgD*37fR8H1ED zpM@hG?A$RK3r9jk!8jx;in3JvN!_I5!19ZZHr|_#W+8zaWI#|H-fAE967ZKQGdjq# ziiybLPj!71>cM_hT>%j=NmR#+t^z%XrIc1govl~*TE(1ep1@U(%(i90gxvGMCWAFg zJ9Exfw13gFyVtx}DAtwAJ=fg))UeKkl_(Zd-->Mp2o&@cm*4H6xV%+0vCoDafOGTp z4%@SYsZrx?L)xyle0HMnPccj%L$f(uFw@}))M#_St9Cb!KH7C0$ISi=zcxl~JT!hK zp-hHsV48_xmz>aXhK&et=5nb>pd zE;0w4p?W+MBR(fD1eTp;8A|9z2)+dUXsPki_Q+Um=F9YPtukMD3!IaTk=|1m+8K2@ zy;7qb?~NBL_kQN@9(Z)AP#9jErZHGU5QX)J+G1Q$B?NeY-o%^n++C(^D=VGzN!qZE zc@Fw1n*@ls1&`QqXBqr5d|Ui;8Mtou?0oomm;fG&$3Q-?`)*eJ8yCx>kFe6*s)qTC07Kw+gmNwP;M2v9Rjnjg!;}u9 za?x!*!^l=J%Yyr5$g=Y(z7Z>Xp7{j3Z8ij$nr&SK5^DZZPD0Qp=CdKWRe$pR`_F#} zud@-yrZU&t$L_1HBw|7G7r)Q#hyTi!;{gy;Ag=yIHW1*90`mfBC4t&3HI;>G7vbv6cQ0*Qs@#fJ_O zVrI*qIf|UA*P`44nxZTKhlR|zh%NqYtC{(G;?aZ#dnnQPpecnjraeZnD0X9!Qc8Yd z%5563r+zkUPA~d&+4OYHsql#TUSZWZ+rU-WRvIGoPinoBU)vVUrS{U>jCnEQ`9}D7 z*N-gz{A~?$(Qo}iC7S#YahN`sgBIQ?ZHTQmOO0Q}NA#*pV!;i`5viOwf7uu@fxD8qtzaD-NuRC8tE|$#>QKc6>SM z&$s0osD1_OhS-)@-TGc{Sae_3f>U)5`^ChUH36lWt>OHUbKO+3aIvkaDy7W{F?1Yu z90*jEWNo;><;r%mZ|BjI6ftAka6|9-7L`xAyPxA5&n6^(e=aY_GE{oYo*`@l+*o+& zR*N3GbY~4u>Zkytxw*9aIWP-?{lHGXnKw}{1U zgVW06XBIzci5jfm`YyiVpmjExt>-)5gs9cwd{Kjn1Ha(`tOVnU5`!)SaO0 zIeeoRnCdmkACC_w;&Zk)G>Ps{OiCOI?Q2`{t?b<+jF=0YbidwQN>3D&2#-XOOaDn2 z=*$gsMCoAvlv~i>tU0S52SoSNTzA0x(_F#zqWtWzA8IXlMz-jUs+X_3t8gQYcjWPY zLfp6uZ*J~c-Dvw{AS_8!VTV=JW!@9E;|T*#7h@_zFEIK(GFPHG3YZDEfq29)*tjFW zRpA+DxQN?RbO_K-Wwb$f)hgF*RivqqoVLUPF9bQ=Qlda@B0FF-HveYo!ksysvirqJ z=NlIa=VoSDvfk(pMQsr>Es3wit4EwSSfl`H?2ngm?N`i29=E!^C`Jo-qWReXpM$5%3oK{P zJL9D&CBj4WXO7u!GUCMa<<2$srzR+J8hJSTJNn|$HQZ+zG%7dcLlV`GWovbAgTQsQUB+GSwE+^}-?=#E26079!f69sZ zEH54bJ~EIgCF~nv>Lj3=3-#wYqBuF@vCLCKMM>oT2Jvk3<;`?L;nv~4@)4H#0i2!7 zq&M=OZTn#mJ#+iRfZa!U94#klD~{R(`Bgx$6XlNdH-pXzupWj>LvTE2Yz*`L(GPARDW&m@k)+hiZL*Gai4PxNdA?bzhL!hz3>)y zCv6?Luy%?{Z(_^r+#h(B#XEy#HuS?aS>PK+Y!gUMGLU{ zpr_?^E|IkAIY*HSp_Iw+Y(m++@uJPQrd>(Kr*4Ybm@;yZN@qp6Ijk2wzs~{~QWXl5 zVxJnE>V6_?j%bMrW2n&MMGeLS*;iJGS@m6-5do+wLkOk8dTK3TA;oc9F#=u?omn-= zz(8(N&zqd|qQl4|LI;y|wOle_bFm)BJ&szU#_vR@>w3l=dHHy#o^PC^^q0DfqIa76 z13w_P*%vwLy!t1bS9v=)5t9vpdThOjeoJo1F>vC6MSjWsWnkD+Zz*?GWaNT#_ zwgaO2g7yn2g1LTk4XzwOQedgoAC;=69yhJ&V}Rag60DrYg+!WkvA5kLtAEol`dSPL zBzq`&!9RwZqCU-(-63I1Um+u2t=u+JqD1GeX$dQyHPzzp+1M}wdCf=-4NdOmyz-t( zKvK_r9nGX9C1$EeEn_ey?>z_QCW#2g7{iXUxk&2IEdF1|KTxK&ANksIbAIH*Fnrc^ zA8Ql*C+)63vBJaJ;?w2w~pphrf41(avaOp=; zRvVks2fBdamsShC&95UAF zhrm1H+uw(X`Ag*c^!4N8yYLEUO+{;s>gs+b?)+lAI(LzSy%I)HdSoCcX0v-1hbQB}%{4O(^!57%b41Eaqp z@!QNog%8L&9vJU=yPApBhgwLu2G&)@b*(@}*G_fqy&Kc}8Et};77Q=|+@o}Snac!4 z4%R_l)wX=9aOAiA5wcgw+q>IJzzZwBnoXPPuR8V+FuEM$VgQ#`6KPdc=*gpd7xv-@ z)#^f-g`wqY1H~m4fwqJiObmZ<#TMzjQva~zYIIHxq~2HueZ-o>Y6#F^vL-llA51-a zvH5~LI(K~UN`oqEn=v6dWRJGPS;k_Vak$yuW?AQ*zG!UXeSoMK3lJHZjDKC%6-Gjr z8<;a2?vin7(=FA1@@%UUABy?foqqt(_!C_*$b4SGM3b#X4c_Yx+|cKgY&OVCNHtiW z#j9jZNFQ3tY|vfcxQiq_JhNeF;vdn~YP+d4zOA>M_zt$+Jwv%?Gkvi83)EF0TkPJA ztABZEb<=Q7cenfsb=IS_Z@nWPFRN%0CV#x26?fvqvb?$)v^s#BF5xw*jrKBpA<+x6 zXB~N|K@MO=XNGB$A?9Lgq{TjU4VoE2h~vV4JK7r8|X z%jp6fk(r)5Y#%!m84N(SxHb6{C3mNn=9h?~imxim6<2b>b;~a7E8d-B{U=-#uR6W1 z;17bTJ1{=XDs}@zS9bEyagT?w3V6$pAle>T&rWNPZ9J&9RRR9$ojuOFYlId6 zP|jskiRe5T82zS@L+2TeiS_%a*p%|nV`<&$4wtO0ulV;H|5@=sd_KQ5FV8yX=N^FJ z0l*<XLMD&M2bHYD>W))oUBsN@^EqGfZq)xNIQPH{ z4=z>XH*#qP*=TXLq~;VV=5+&n!}UJQm7@YaV;3V%7h)o5jZ$O*7;50P_MpaiKvwPk zQ-emCU#|0u^J^Gg1s==5k2~=1DQykz10QIXCRfM$Qy|6Ys>4SfN`zZ^u&(Ak;rl$hK# z{|PW`=lm8Qfm0zhuzERhz}0cH<#u&tt=J2)QC42}>D`xuM#7d{m4_dWP!A42E}7Ko zBB6Q!_y$Kuc@nQpDDHM3aw$-xpl{*o#Hsd3FXF08Fh{@NzRj$qfanl{qf(mHt#5TJw`B=P?= z+k*3ieB%=1feAlyad}yZZQq^c-JAPbr9>u`28)L|1(AIXRM+)7n-?Dh`RY#R>yFr?VZx2gSj3msmS^^ee|Zs)&uaz2_ja&ms0XN&&_>AcdVb>?5< z`|?>c;}bMAP0*P0uOInAZC}4So_)lb{rg#Oe^uq(Yd^L^gF8$9rF!+iTM^podUJE) zyjFARU%ot3&b`Eg+-q#yf!<(aVtxhM=jMqdN&9=c%8PNPUDrBoUIxpQ0KCk=sU34x z+XJ83qGK=K^stg9;M+U3!b?4qvFtAn8Ny15mZ|YS6#eCxS$;oyS(Bghf-%0d{Jfqk z#mmCd!V++B?;f!p0E1L-f22k;_xpEzYUttFm;a;5b{m{cU%%-5>19EQDyqS)Un@GG zpQ_Ag=zaP2Z|8+;sVcb*!t=!4nB%wGN2<==F**;9INSc;-a6ZL9NOPC`j4U$8@%vh zrD={#n)=VD*qS<%ZSd!+>GS6{|LyR<=g~klBcmauuC`Q6Y)ozI9NN$^^G@6g13`K99OgWZ3|#e%i*uRU$WTx<5J{JUg^SiBu;K{;StJ9~)!9l7n& zz{l;BMt`v`7T9NsnU@RsuqWZ2ZEZoN!__t-CGVRoi(EzkG2`(fo$j5f%5vS}E=z|4 zr(Lnn3bRK}8DgI`w4mZ=WdM$)tsN0S2g?w2xDW8m%d95MyVh1mUr{r^f&Oa{aM{NG z&w`t<_qPS!3Ala_Kn^(oD_ncItmkbCQ-;WVFQAT1B6`ksa|E>pRRPNfF;!-aii(a+ z&vR5(UO)Q9e0{i7gMI%7{K8_OEvuI`3YS3uBziO|*z%>C~1qjSIB9iHkJd0M&!o2YdjxuuP+MC&3gq?}KJ@=F{`p_^`XMX+pAYjLkY zcxA-u7|%v$9x47k9Rz>*Ueg&fU=Mq68_A2JdLUXF3VlTbF3))R3-lZyQ#aACA|m%C zKRn~zCQ({SsF^w#f7td#A6n9qb#+KAeJ3*a4Jv|M8AX{Wyf;e!U-oLcVb9<8Y;RWQ zV7jpD?`ckOL4~N=<_X5}Y}D1$kX;`q4DXauR_1k`pG|An--C;t&Ar^Ho5Zr4v*!AF80*sA=Wh)MhaKjET;c+ zlaLOc=j?sjubG)kikdZINQ+V$kubO1;vRcD9{R+vXh&~)+bW=dEzy zeZ0W7Ft^s^E8So3$HJdlB|hCp;y$B&P;qK*V)ZL3x%qS{D|UB5iU|2W1mFRd9Zhx@ zT`bcQ-Tt<5p+Y8W&`JB(Sr3vb(&Gyq3kqS(Gd?m$;%Qd_VKptEmjiRI$z~pji=1* zz9}2kyOWug)_+BEX$2l4b zN(36QN*=tS_+mgDheGv`AwtyAaF8}yeeV+d$9>S$3RuZcle~`j*dX%oo0? ztW<@W4IjP;1l-%76lF49lL&D{yu9C#2njF|5`C0eG0?gk>sgQh=o6r7?7|yxAyN~Q zfoJT>P_Mtgl?IHDdfRCJsKN^pYL#D$ubE$z+o^v9s+gQkYf|^2E770f`ma#M#y~q0N6*f=@ucWN zB8g5gj5lGz^9cL3;%f`sU3{RN6ZM!9R zVqvprHeT&zxAx;Mm>E3kFgq9`kqWy4=2!r}IIGN(d~Jb7-*rYGXw9#dspf%eT0*U+ z=pnu~fX5vy$`4+Xlqca@jB#?MU)#CfX~379ka@-xCVwdO11@x3^|KOhn4zaDE91yt z<;ud9D)4m0BFQ<<%H(uMCn2FWq#lQK?N7A>#t2tL`klZ`wZY(vUw=S!wk|kC8@RV- zv{>&wtA=rm#-Lh|g;xLJ(!UV9l`f6XRZisG&o9@~?BrE5I}%=SaN10VE2nUO-fwR3 ztGl{i{kd=Un4vBZ|Cj3nF*_a*T+y74)LJMtTBrg;0dH24Yi#` zB3u)@#oBwwOZ6+Lllmde+LTtZK!3AJJ>uhTn^{S1b;H)B3IMtZjjn|3a<9QXQYT}! z#JW6wcUm$sb^I!{^1Nh(f%_GBUISUMNiG$>*3Vx>C&Uy}RQyhOb=XIEO5rv4eI6VK zAD^7&$2BlcPw)=FE26(e?Zhg-dG}nq^4zIuo1kC$+5r!iyve=vup5`!SVR9gzEskA zR#)!W8rfDeaB_Yz2Gj)rj5IfJk=LmFF@?z92cXp#-ZWmOl1D8}Y?e@K+RXk}3@CP5 zUY?{cU8wSIUsswBE&)XjepQ$$fhxmudE4EQY%)ljE~pVx4n%U5ahiCyD9wK=`m7s?*om`96G(SvL9 zq}TUY2Y!%|8_4~JUF$I;v>2bPJ@19PWxTfA?^fiI5++Oaw7>ia3M}vEg)3yyv=XxK zzVK9)YGA@AGr=3tqVDUWAcOnKV^wEE&rZ&Sjc$753;*{oW+QMfG6xudPR`K@?9PHuc?OWb`nLL>z{H=}n! z1>)OR@pLOY-q~H-^TC~J#`X!F+Fq14OZ2;+B9Lfy>?G}9Xntdpi3i|he=UEy8he5V zLLTzlipYo)VCxG8NiLplCr`G2+&#ceyk8dTinjvVoC#2uOU`WARC1K|7~<*Z%5w5# z$u2WIqwg~X%^U9J&8sab*7Q=ZO3GtP_k$TqJ`=xBZo}fZ8rSxkRY~T|1mufrgZ@@& z8ZIMa9V!mPKz7!l)dCt1LqGce4#*pGpfJ(LBw`tvnE|#MUXEEsMMZfP6}H)G+gU}R z_C;gk7mJbHu6DPC3K1;57}BF&>%KkH+qRz+tq*jN>xgiEW%JGfueM7L6Y~KFezm%Q z_z;8kWr;Eub8#APL!+@i)8I9j@o1q%I_Bme3`oQr-C(2t5LD6abBexKZVpMVp&_ql zC>L566d@MvyHFl{OKQlWl$qAvm5nb%pVEm%RPH8AD+YJ}#+C`=O|nQ}`EfI$to!-V zY@GJhZwLOt4YlnN3m7?Hh`wBWB&m*e0Biw!gfiR30cUnLkUQ7zseTXrtU9#$2I9yy zlCw{87Dk?ImE2&zNDHd^b7S)2mje1P40q0hEvX4Ba~?peV0GKoU=&B{H$_*A-Km7U z0|9y=TMKT$GDiq{kV+g|i>QF7b=O*|^N$&if(3j?5!ChV+FNV=c*`VJ57Do0D7#Js z;hqwt@W-HRbb;ViUux{AX8yo(mN)J{#3rLk%oenfyf&-Y8U4WoVisLVCytaD*S|qT z5~E?T313)i3J#J{?L;Q_97%k>iuyWG7iJ^^&zem;KT5x_F6twfx|_dwk$-Xfg0Uvm z*%_9xs5{T*sKcb3(|PM%Fb;VbaOaHAF1FvU0cC~UfE8aTq+1hK-^u;_m>cSw{Cd^1 z{SMOK3kF%{mKRt8B#HSEXd{lr=)uEPxBAn}KIW%XDz}+52Pf;+@bA6Xa(9XxK|*#< zEDTAuo99Ih%+<^?C*|O!&R7tLV-%0Iwp8&%Rf#3F<=6i))b-C^5*u}&jxuA^17aG* zX?mYeOSTU2F6-+gNq(jVaNvWmohbi;p5qmGG-p0x``cE!5CkR{uYlJfov+uho#Mx- zj4YkRt=gB9_3Pz8Tz82BV{gw(74C5ZYKSWZ6V3hSeWoV?c%E0L_19#&emfp@QCuT) z#+}PqJD$6?!7aF)0q~HJpFo*|bW7`5?GA3&ZtlmlFzurXA#Z|**fiXu_b*6c9y^cT zi0b!;!MtuCwrk6U$mNp%(SfmjhUp|$uFV=4T%G;pORM&3F0d2Fhtap}OpJ^b3sqW5HI#_A3V=1w-$1kKa|gQE zMO^WvXy1c$XDO!=SXz64ba|(3Y_fK5QQ5&2(>X<1vW;^w?2~1G(*4ugs1e351+XqI zPFzvb#E$@Cs!MPk%1v?rEE&GHOZM4fFc#mK(Y3vF(*wHf>}u$GIndim_E_a>x0Mc8 z%QJu!E>$%S zzE>Eo-mQnf*}E~GB}k6U86nrB_(eo1LMlL0gXyUVJ#k#3d@Y zzUn*qBZ6W-QE|f!@ij5mPHO<8GPqNtR-Zt2dEG0*>N9+iK45gTNQaG!(T3r$b3ouy zqRfhPcS4e)1-JZEov>PJbfJ5!b9G~j++JI-y0sWWN-__bH+JtJI8F!jAne%c{C2v23x0N~zngK)V=w*1Xt6p#IdH-oB@K!T&MlCHXi+(>hVz12^U8bQK+i4VkV8ItPjD#->xX&kyL^ z+=nJ|17>6Da#d5*5cTI=*>M|E;_ggGLS|@fa%F2xr1Ym{F*Tm#dJ=srZ_>2m06of? zVNRC^R&#nXZ|3m_%yY|~^~el~UU4r>1r?FL9uEj4+%I#JVJ$8~PLsye^LUYK^gt&B4RrNf$9(_^Vs#T@GVz(0j27hlbw!=48?O4_mrr61fPGt2 zW3yf|id5Sy4+*piq*%{ZM@GB&ZXOsb@MTc(1xf6naSnZ{0 z_T|MN|21}>Wtn#yCyVP?@@~hk$lf8PdD6w~7hdL&SLsWib>S<*ddz@fJQf25 zFh8->*q(l2~@*FmcO(8zlyw9`U zdl+hT@En=VbcLCM!995xwtW6Xj%THLV#@WWRFa_FS90-yj#_-{khg9da%!BGOK!op zE5=|-v@?civ)S!R^uQX#ZSm{z+b^PeKeSO_L=G8+kY07AM?bSxC2}VM9FCE_9}-EnwmQB(f+@kfXXrvZMRu}nwcsSu)&ghXQy+vphqw1t zs(;g3yloZ!kqkFikvRa;^0GiH(uqhD%(P(Pp22fe0kh6qn|?d0I_Uwy`pZm0eNyM^ z(2nm;G=a=6{86{9fIRLxaZv+LHM2Koq6X`QT3A5DGqQ6cvUjC_tPp^${@IB6!RU{i z90Kc~K)p+bae&fEp`oY6%p<(>&uK%bnEtrk)RkaG-!|AwAN0a?ErI71m0(-rUgAk< zL@23g-B@O~=7XWIWG&)Y(MAa_LsjsCw*$79BQE*uG=G9MuBvNP@`E>LQ>eW0P$hB} zrn3fBC^;N8mL?|Sry$bLwjm>4K?Hs6lc&Oi9vyhmA}}>U*XOSt06X%DWzLwTJRyfgpO_427_JHT;3`NRs!?Yd4Oivxu{o)8}m0e~MqBrsPT zqk`-YLkAz)dX|s)Rt*KD8(y^qU0bJbc)*8Al2RW@#&*<3sFqBhl%Y0gm|}#T$7(UhOY>ge6&b_s%~2M?e3al9b#K=8DbI@Aqmkai9-cOlzF`#mYsm zz)~LFJT6__<6d6rAZT8F(Gw54u&+8iUzXM71m9OPIHM~YQS*{3F5O37e!o+WZFB^{ zRgnxZQ#(|@PUk9n+O-6{Y}U!pN>nf)50927 z99rrf;_j`n`RJDdRv;#Trz{ha#8Y-ZP`p*Uh9JV3#pbfz$@}1uY;#2_8)?dl?#~(8 zkCGhhpaR6@SAjSd^#`VQCNmwsSMNkS$XgT4lqnwvU2NOHpn|F0`v8%r!)w?8wYreq zuwl#Ur=TpKYiH>uqD~AInmQ22XJKk!Be(NOOIvVms7#zySI$FR=HyzUO;%KK5T6`b zt?EjuvD0>8e2Si)a_@BH|O`Nu};cAmH`HQ&&h~(``6%|3Ao~*Tzme`H0o1rEKX#a#q_A7fvjSh zax<@u<u0PC9AE5vQ(fWk(DqG67Cu*X$K%gyBc*xn& z;O&{``blq*h&3u}$CU{ISJYC1XtzuYO%}Zn>O^hk4~XGVm1Qtv<$1JSJ!6YhM?E=O2+@eW7&SL3DKC4D3QuXUF~hAWXezarHqajA?KQ(!n?! zJ%z!0ZPFG*8;;*+>sCOEQOFr$-bhliRq?}WJ=V}crg#$Ee`w2ta+?*CwWtjbKPcYoBFfX<#$f+QgFWF+%?ffJ za7eBFa9^tMWhl?Nr&K8cq4KB$f8G^XztJM*NB3fQfv+LPO71C zS4AMql?aYqv&0X%wo~v^$_Alo+TgV=3%$anZS_5m=c(Uo39Q|2afmpyI|>pob|hDW zSceS-_UxCFTNpF00Q_o`2Pp`Ur6|&41ray)e)|n_Glr?%lkbJ0P7_p`Jm6ZyCj@-I z!VrShbX!s*X-q`)^uthZe;l6R$0Ka1fuweo=l+_L`l-J*i6h8)f)%jLWAG_4XH66` zDOE`L54mgVs*40Rt;Cs<9-4UQ^~^U#F?6BhZbE9}EU;)!YxX%IZmh3oO-LJ_ea`bt zD+d>uSrq4A$ zSQcORCcbOpHA|bYtbMmlF~xj{LkQyRWY+^)x>GOb60!Cx4;$*_ig_!6-Z5pUHMWO1 z5SVm72WjF6XpSZ>CM+gwF4C5%uWKXZpmauV&G=Ao03RIi-Eb;ytfZt6uIz;Avl( zJ|%jhZc1l`px_pP8>t8WQI`WQjD}^wM+8RjWR-~r=G-E8K5Hm_S`|=-5B+Ob%g@8u z@<6oDC&7@EqD=8ri?l<1%xtqZ?Pl&C^q*8cE9C%c)6< z14A*x-Mf7wph}@jc6W6{0NK1+R1Z45MdWtqm6Z zAEB;1Gl%FR(C92aouch4&JhauV=W)p=!Rx`U$XRko+d)>ojA4hHe?g#$q4kxOCX9_&(nTjmG0CNbd3l*I%rUYAStL-f}Y5CZk4>7-DMB0=_iDSITYqdMc#io(b@w!^>PUx-k1OMa?bhWL}4=<@dAFU&sN;&+WKP z3nlZp4#W70`Ca>}^~OEV($_Q$7O%FW zcxKPf>Vw&WY?0fX8ZhxyG0i(#f0eBhhY7p%14+{YxmHSVL6u9EGafGu4J06le0c3t z>^H7$chxMs1(ad|9FNFXIJsOWIn~_T&tYgi@X5X|9KsL{feP5DinUWo>~=4)h4oBX z{xE0Ku+_U>2Nd9hhCpR(9tdwZq05h5P4Abk(-~^wd3rGXSm4!Yftf^WA*YR%zw= zm%!Jq=xP@E{uj2=gOiI;2eW&%Qo#&*XuUs|OA=}Wz-6~fStr`7*o&RY`+-9|;=d*< zRQba7JC@J@7;5Y<6ndCjDv1(sLf57Fw|DdGr7&$EVICD;v?QXI*eJ$4nRGO5vX?A) zBOJ!O%ZxYw>n2yw2~zg$qrWm9P+RVNe@B#YlfB;Yk@az-3g3=1#04vf?~6kuq9u4T z9onhEJ%yy&dNMqY!F02@EmCX#*wqP{5MJp$&kS#3R;N(Nw}3^SWM2CFN1-Yajr&}( zK=|uGZV$W?;*S5gH=t=&)dCMP?+(n0^|-26vc*aB&aXGsUdBNK<@9H4ER-U=!7*6K zDX!Tnwo|L*r;)22jIzR|#%bZ&np zA^x~)kBN7^@d$Zx+1m~i#w_V)4KWb!XpSg`c?b^NT!|i$cqi?5kJE->$f0bn^VpgY zt@|J8ERza22)__1oWuYe`}`*Wj_7@}Q|#BT!PKOB@80#?`BI(0wK8uA22=`76R+C; z3E4+RF{I`Tb@u{g90rgOg&jbs*VOww#L?=jrV9V&6M-r7_ehf$dfdgQCh^ z>w@(_JXuWA&yctW!naj8VNORBO{Y z){}DLSsmEXt_jMNHd>1_{7Q$8oc#XJG0A-C7!S#R#V5Zjd@)juG!L+`q0=FTSx)Ixl zA@!Q?-(&6rGT++34eb>>{yi7^AD*mliv8+#XVz1H;Ow^hw_E{>)5{mS7)nCp^m*wf zj@pjN?J-#?9b}H;$DlUt6%wA1NiT#oE+m;0jEk5|uc~fK|GX9>h2cbaeN!u}@9iY@ z{QVhX7xH%h40+Tn4jptJauzE+LuM#iDq4=)r9ZS#L;TLM5*s=q-}$b|c9yGCITnja z=%?GnmsK^srbj%4irU)v@m@0j^4nKwox3oIZO0E*bU)$Mm{S#0fx5JA!SK;hk+3-F z84XlI=7ooTICEGvkSi#Uew|||WudgTXf95*N9ywZ){6V+-{MkJ!ihV+>1a)BlfCRy z8GybW7ndWKx;WwnDl4^Pm1WFP$TbPx%#^*GdTgojg?3>`;LN$%v6EP?sqNz}tv*M5 zMa;y>G)1?;?tGzp<#~7Z73B1>R*AJaybZsrsyAI%Bzm(F@^q0T5MS!yYt}HaA@Ac2 z8rS_98U}`-<6~ZK?gX|lL)l=)9u)QIBKwDVc{fcmIF)^ywo5m5J@_^k@;1 zW}6*_WT@=upm74s_IWf0SAR12b|W_0EN)?={ z`l>+%=BlL)d4vdo&{S zl`BiOALi^@iH&P~R4;UHS*(}lcB7UU*cg2qjAb;R);Zr;%V&^{>I>JG1H?LaXfF4i zukx)Ql&#UPziC~Arv_RXtW&GL`xY#%^Z0fo^H8{k)}S=|SI4SDQ|g(^X#F7i@_Ft( z{mEB|UrHB?dD1ed)%=Wg<5O^@*eFS0Jluk2YqOd@NiJqGTzT92m;757!$0e_@TgKr z`We%#D?Zon)=lI0jK9rKeO=#_Xcl#F6#$t)QT`ylNF23~X#f4zaQLg#CTX1DeuG3P zk9BKInOVffC^o{whNS#}r7N1EYsGjU~(kA>BaEn3l`CCF&oWBtV*XDhtt^v zvw>_3;WCp#dvU3_{Hlq?D2x^kyFtBE?PHbY@YRfCbHICoMnmfd)2>xC2)Ryd`}D&w!6z!*BoBw znQ86RrBr2%Pt7_xhy%gv^8U?+;d2$|AhrWA>aLKb!$0Z{NvR{T=)%z5)NbP_TYUS| z{o$N-bWBIUc5l64uX_zi~4s}%VoahT4Th=^u% zcD6Gulcut%(fGR#=)mBP75DtL4{-2x|9WoQvZiYuZoDS<1gNb_hMS)0o@U@6FQ%|@ ze)ee0HkB=SC{*d3=V#y=sKrE8#O(U0+_W9qu_(U7t#>)YaZ^S(ujDf`l>J~FqUyK3o zD(cPoP(^wO!^i(LJih%!np^%?;vyM9+*yG@uIHgI%w6z(GI zT9)@)j&LpPW3zb;|>1b=B4P`cjo(pD(L9zG$M zkYd)5;HW(a{T7m3kDfHSwcSyh1WOlBg*Iwq@UjYCkh)qp1%0#YuwpW^W)8VXxv|Kz zRt6tZU#YV2!yv)T1o8@567Eo=@&)jVhi={YS@BJbfI)5NKA{HvjuhH$1Td9sGY5;O`>| z!IA#A`TxEJTpufkw)^(~<)aq6nDTZdSsp+~BqR9{Ju|aX8nizKrP?$ zVT_J{X8W*UKlz+cSoENO|8MBPv;AM+G0o-v{XP0{X}#jLq#CJE z$Z5Y^2CQ^(rpE(s5p&&GOVZboocsqd(wuN4WLgCIS9 z7-0RtJa%-s2B>?^Mw-@!C=L_{86Q;xnN|8cz8ifjpolL zM)^SE7$)=I7$w?v_yp>tu^I8XTN3clqay^4}}kk#ix^Z7ryX&#OEyRGB(_ zIHJ-t7~P*Adb)m1mTr)EZik#Ym}U@h6Ex%z|D*AhMabo+t^Vl9TT40Rc$k!8QoRg5{*BM%HecI~0Xg{88gAx?F*6x3tGpW0F})>Wt!F>DP&m^u()X@l~Bm zr*T|xIzK${O%t*R>Jj$(6A(qWsb=HlMS{AKQyCW=KdX_x)ytwP{;MW7;z<5a9hL5r z34a<7PF!Y$`qUQd796?9gSpH%XqiLOut2#rt+Mi|BmHWX+KhpQrfJH2S2Mnbfz0zr z^!4-MaCW&1LzJdq+uD$WhY6a+LyPcIt9Q6MR62V6#SaB;57zvR?PY|A+sVfQ(AThB z(&=HPk3HH%bkBtG$SK1}=3_3Mw(g&bLRu=4i?L)+mp8CI^9LmTa4yrB;#(1m^kg8h zWM78P2lVhDJ{+jBR%lK8At%rL>};ueZ1v_vXET!i_DJ(Yy@l_IgfKr)4`XX6FY3uE z@0wBL&hWHJSHGZ=^YtDFOV(O{duTXyrYK``H70Lbn&|oMy2o>00ZUM&d4)Nf|Jky} z=9gtOr3nlf{FfhY9Z3%+%UC{^#5Lov)kX2`*GPm+)E12vZ28qVDsyEZ}Sb-9d#sS!k;4rMF)Ps5cQV19apigSj36CDs`Dk)f~)Zf?r!+B;wR$jDR=( z>frJA*`UL(Z9+LfP z9D#nem@!Sb;fg7h>qRzOfEufzymoFgTv`8_@CWsW0KeW+<3sTRl+SwcB!Q z8U>jP261<30@CgZ!uw&8_Sdw%Qwo7|1ekS(_os``E-t!8N28{TRe++9EK9P#J30F` zbN^V+lOHVv+y1I(A2GILd+ULb(WFUvWFfWpCY5phHPWvgof|vTE_=+oU;a(98<%x0 zrZY{1T76OEwyJ!M1Whm>?aUqc02u!;66dD54FVkbn=|~;?lZ#k=V&L(g|ign>b-X4 z-7nHT(;4KGjXr#h*FFh99?G(cX8fXHwwEIJN5n;(kA+oEw43Xm@yuxoCy^-fo(T=) zut!}MHt%FS0;N<(f@FHXd&WbhgpQdc1hOmo-o|8I;_yN7twtq2967T-fv}mle?1{7 z&bIW*Dy-%f18p!{xsrHh6%}nRUI{{23s;)FSkFj#C4fl!HYa^v!J@U7$XIaKM4c^h zuIw#^fu8!9%PQ!#5yRz01J1O8o|;$3!c}Xl_3o>09zZhlO}~8b!)!Ixs%=!79w|+O z8t4RhDhIU!-F4^7VYmWmUaj4STqs)Ye%GS^JGa70#E{D+_ngYHt=_R3F?&z=4zWY@i>T(t32Bx`p$_ zhmue`d&`NY*q{}u?8y+n6{{#mw=CJEsH^5|Uow_f;>VorF2T1M{g{9FGm%O5%g4+U zNakhue50A@L{R|^e~jOoGa3n@%#^L$vrT{oH+5?;p~`ZeY3!}XzaB`eC#BIueWnL2 z#LgroLOtU*N5@yT72}T@o+EZ^DbTlw2cic^Er~8naB*6&yyx<@9?sOF_sj=<=$bw6 z5|nvPGf+FDaE%#J7{;I(dK-;t_YJLBQC#-kp6#dp$c1(zcp?`rHRv4LlT!8i>dNnR z^xERuwDX|z0inxe3X)Y=6Y8SQ^kxMGGoZw1mWG}mx{;q_FxAUqCYuvZv-#a96nVKj zpa1GiAVZFgMY3{P_~!{VI?URkLOOmb*~$2=pS}))O!jv|h$ITlM0_B0y|@B;eG1%e?zurcOeFo;tZls>sHkk;6LAT% zz^>rBpHG6fRyVx0(q;upt`RzP+OUf6Eof6LbakUI!n8-CWQV~1#U93!HKL+8&C6kM zZGAbFmcAM`w_EOz-@$iBPoE|q-EVR%+CP!OT;}MU(u32_uetAKTY4fheDwN~=O0~V zB8o)FjW1^uF>+<8yDSdh9E%=A9<#eio5-fVJ%Aa0-*2NC0ZX85>@d^1@^qTQg4j01 z68=zY5sbZa3(^rCjveV@MNde7I3;jc#}t2Wu=UfaP2G*r4UFRcso&?LePn0Ufg2bn z7q?YE!T+yB1nXbLo}_0;1B@Yt?*AUDU4?;){eZLHwrB~?mpaO5<)#VO&5j$#+GN2} zM+F*!xE7Oz4>r{GLM<|qR)bwv=OgZ#9fG34^i@`d+XilP3%XF>uYv9 ze#v51*)1c}9AqC-(~ma2SPW@+1sA{HykDVNq7cY{O1LoS*TnQ<3M8nZv9lUOp(a`L zW@2mT1(WQ^;j$R+o-!QgvgNFZo0{rM4S@#Yj2sH(gyCHPP4yCFzN!>@k!*}he#}*0}NJLRyqGock?Kweu|iv*mWINypSC*YQxOf z@CMTq6mXPdZ_v-Lq|y+<#&?a)qWLRmZy+3phG?{RxdH)mTj73X?&;}S`E4mXzD3G7 zZaAb(Y3@-@*hJSjv?v?S2pmuPQs-Y5g|IgM4YuIqV>C`iW(i$%V^I{ur@fG$Ilx0$wQ+7Nw`DQ7gcjk7~eRhr0O2 z4bxK0_C`?iVKGcpLHu_*hd?0QV_t223-^-bFxvPw=&D%Z<(6^6wY%5;NGseSe5 z_({%}Ki}_^e7{13hco`Ye#pSB_Brmno~LqT);E~tX}9iPoybd_$@W_RQA0J_N$jJ} zdOpTxV*M44uJ|hU#rxGFoT8GX>Y4+MaJ|h~f+pwM%{Ns-XM|Vz45I^jo5$+Q3d8ZomMQ-gI+?{VVc>AD+ zQjgK*ltpEgVjvUpZg@+)MV>Y@q~McxL)_cl%`BeCPt77~Y%~%JiQM|_N~)!UW5;{u zx?eLfiAhRsu6G52$+BNhOiv5z=ny(Oib+WQ8qdjIwn=_ie9z>_FFF|&`LS{IC%g8d zwoA{IPj@lDtZat;7Fb@S4naIbT-e(haQ0p0wKX#}Mx}yAlMBkL17HI=mt+FGb@J?Q zyq`~e&JT+DYm(RR@=*7G`&2YwiV+iqd|{76ML3~Dz8|9B)m^>x-Y&M4-{;HQX0X_L z>_{V=x3ogf&YF!AaM4w5Mmd0sAk|n*BdQvbCHV+9sw*qS-tvOTAap=KIFyIwcZUHxFU*ZAMuj-8x#pviF3|;_yVv| zqVe+bvU7259v+5AMMYIMDl#%KPlpf1G1T$j#6-K@o}$7St2tP1m032N&jVee_hRGY zVX(22A1YCjA8-|^;sDJXYl}>%2iHb_rozKbnZ`tN~=SR(}4@d6-DB{7mO z%q%kPe2RT%RMFoB{7}S@j_rwJWMKHtaD(wZK0eUT&#&^95e9}TDO)r6%dh9BhxhLd z%Nogl2P~bQZtY4^*m5crw17AVbuqk>h)xDr#;L-3CHx?XnH5eRElylK2iO>~;%@y< z#;hN`*M_tR6Y>|(_-wbmnQ_5CxrYuFR%ZVOlg?E(@-^v74uvTr_dZdx&um{$zkK{o z1&NQ3Po>t@v0T6mF47#LN{LC0{YitF`~63SUDhb00<*&h!I>di;{Yue`TC7pz6~WK zb7L8SW=&jRzBodCz(&63+i`^p1*l}K%DcOJl*RC|KhkCNrD$fO2zRuXXpL%61m20| zY5vj5Wkp|Dw$6)%U_TDgW`~C(B+038i-?M%U&9kgAiIIz5_KP}0~gU9FZJk9tDryk zgmTx3F5Yk}V?Ou1eO7Ns4&!nWPy8>q^$UozoTHXPuMdbdvC>jyP;?-C(5X;(P9-3@M8Sxl&E;o##-phOte$M)DUv z;)CRm4qLYzXy-+P+;k)wSmvs~re%sto#iJmI$yk+w+7FD%>r7v`{K%TW{mc&iG~Mp zHa$gH0Ln&EKThL6le?jm+Y)#z3GbLObGF%cc6J8zvvBD-^Sc~; z^f=T^i5n{oA&E1ZB!0j)Ay)4mHWxg4%TYdww^PK1Ut)iq1NFvs@0C>jegbCn20wD)Wb({98yZHb~`%$qy=>(A@O{11ExS z7Mzvk&#H08jK0HT)^)129Q~|BgQyF6>1xw+6D~|nA)l#m9f^7@E^t$O+jP9v2lnzR za5p8>B0rH=#%x%5CB{o2Fbk()ud*nudt@$4ewY5gjco^-Vj^IFqq8 z^@_OY#GA2Anjd7+w0cCAUWiuR>dJ$_7gs<3EDRYCYTlS8{u^+1RWgHZq&ET^nV6UW z$0F5Q%XxGwK%vr;4tb5=Kd$-{TMc_O7ca5Y(QV$kCgK{~hPA$ctDqTkgQ`GY2O}mt|7M!6NLA^1VEk(s+ySZ?4q9Yb{Kv zC>!3V2gHywiF;@~!ou-`(+VxKwB6+mfEKih^N7_IxwKY=n!Yjx6-e9dEy>KUg^<3~gjS%7Fgtge z8hd#qT5Oq*S#`hGj6?j_4g2Sy5z9$WI!5a7^9X1LkzwjFK1tI?bHE3`Jxa^>uCXVT z&h?Ti(Co490Y3gU-p7oP_^faAJSL94BM=NWVx!o8)rSykGF8YP7tXVsV4i|CmS|Sz zdtY8>EvUV_A0Enxm{5J=9vx`B+6*x=t;fHFl#i=ZQTw^Ht*72IqOU4Bn9hG}IuF>J z8~;|fQq-qmGp(R(l;HDp#ReEixe!*~j7r@tm&bB%L~7%RJV~A-A$c{vaMrk2jSNIT zp_N`0Rj*xqmp!w}tigq-Yp`Yd8hm)feQh(_7khyBcrR+SDHUhR?1@A@V{LE*=I~t7 z%(e8@YoQBI#sI4v)Kxfd2^im2cf4z_q*oA#XYvr+)I3V_;@tx7dDo8Gj4nl`xWvB_I|=6#&v?OZ*WNOebM<_UcG(|y}3FclAiNTt?}N61`$V8R`iI!p4j>c z>Md^q+6Rtn9CH%U1@8hLc~`E+hQw@MpGXV!TnUhY`&xknnP&~Xfy&_rZqDS32W3llkJkO+M^nLT1n zQ)GX?KcXnk-7^aO!G6Ef-wk~LKM7O*h{&%2IL8DLWo|so`ka0g|sAzkdh-mV!>=$#mxWg zh4?D?cvfH*d~ZxMV6@tO^~8@E;jD0ZWl5zr-8-_Pj*etfSzgmM(vd6yfl*p$WFz`5 zeRFRklXxpKIrJLj8iAXE57`uv66T{qUi9&4u(hA-{q%LaPat2E7wno*7!vt@YbXw4 zi~WrE@d8}mTNHe!`0Az7n))$NE#*>#VV_8kBh&zHB8&GYgKu5zuaUyHXmAcNALWyO zjMDEf{LRn(5g6Ch*NvpA7X&BUO&BT5S(eF-X_AHfOK_~xX(JuWV3CGpEv(LGNi%+& zgj#8n$#buhH}?RoTCILaSMslxSg$Qg)q-$CsVtjnlzEv?SJt|jnV(93Te zXqENC#%J&w_inZ1%+J%WqI1PP*0*cdvxe-(Hx}SW(Yy0T<`2-@wqvi^{kj^f3`7Sf z_PoG>&`pm#U4aq$ovJ#&o z(NOXO1^c!7-_!Db&Mrp2FU(O7s-Kl^FL8q z9=JN6{pq~B5}7P0skx8jvjmI~Y{P>kDdifV(PwFldUso^rFi@6G$Maw9u_gEljW|uqd3-YLbM*yVFPRF*w;g2tla7e2BLNNkcbX-68^?p^*@^yW6z^SPm z$0vg^=5S}0BEH1C4)`R(=I?f1n&r)eJ#3RE+t|K42gewlvPRFTsr;47z0U%mh~I1f zZbeG6($icVQD^ecke9cbdS%6&J?;$rNBnowwvTqoXJS*eD z)os)#B>H>b3sUXv<%C6^pZ_N$M1IzA*E`#U=gSf}T3W-&jY{V1x+yg+uh{5>(KD2# z=O1(5A|ZKOmM%r&v%sai(kI1& zbknzcs@KD*BbP~&cW0?M^<8akCsZ@#PAX$!m^NGk(nV`ijr87rVX6&t85?PMjfs{T zvaWclte3sHP4Fy=142jI!W|83Y8x?rY~~Y^YS4)@_8qycv?A}z62sj5#-4WriBB-0OoTqu#Bch=i!;UIR?TEV(#wGVY{%u!Hw4T*q8DX$&}6 z-t}egRs=$hL6U5jQRCb8^yb9|@|bIF(JK-31ygASEsELoq#TF3GhyTM z$}u-L&EeqQH3wWB$ylEJ^H zO7t|cQsR$-h@#JMol*hMZD6y0^c#tTNQ|KOzNl%F>c1BIg?gS0%Hok{! zdl?#FFE?c&XmgffpLXbac;PO{Z4~`QnBwbU$!U-2q(#m>Uf7?{w3_-Y_WukPKoGl2+5ch zPS5U|HKt`}T6dMk!)iT0VTer!XqG8b?=IVpx|SdYD(I+ulInG`&$24RrZLk|V&rZ6 zK)?1!jjat=zk_pt*E?q@6`Q2T-Q5KQ&c8wUYVFwz!O?KxZ)&bP45;{n!*aOSneo9) zZHY_Vi?2J}EPL%`?uZ?9Qhxk?X>kNu2k(QrQjkm+gnS9UGSqhce^=1VPrQ2Oih-+r@UnX=v z=T9SF@Qg=sq&E{YIPzGIPM@6?+0#@*dcCteU%V)CaD>p$RNMF}_kLL+AR>z2-F)C+ zv`5gPxs9AewsbXdq*(Q7iIum`)8wlR9J^}ZbUpjxZFu!8S%8>!x~qcDKCmIICq$;U z&inCuJLR)uMUZ4utL}>PFx4n!igAVODCy&;BtkiO-N~2RvmqWu<>OoFv%bM&V%Y47I4(?Gtcy-0 z+o}?D9w-5|DqGF%2LFotvlCiw^f)c*MyC@{jZ@cf*6!6jUFmi^C5vsuDSl8~&E1^f zT6>}86C3uRNIC)zm)~c6t@37{$Wmrl^xLq!VYbC=G0@n%7na5OT4PA*99eted8PDh zHM~be`5UVaZ&+#YV_BQqc49ACAdq`=tsYxJSavRTPw-< z4(?}uewNC%c>W}6?!wSfDvwhjRB?;hh0m(}T889rm;<#5$z0Qzh6RqH%?uuQ*Sx~w zU3D^Bn2V_GbtfrElf8=%w#`UFr8KFsdeJ-%(zWb4ttx+{+`xEd^kf4mk=@>PAZg=^mY_!fnN}0$ z`?#jAWd&ia1|}P0R^_D-&K#PNo{~zA0daBghUd{z1GPuX(&M|_VRXjoj)r*3x|fI# zoEh{3DKn0}d6tknFC#6zAQ4hat0|#AZtV-lKN0Q4osj-~*~#RQITY#c`9&}lgyqw0 zd3Me#AE|@EAri1UL$zIR2X|6p4AwgZ)}7J*x%#o4L^UG^qj6^De}dfs#XdS<6RpM2 zx#_B2hG*g*70Kl)YBpB6+ve#`^vc2>BD9M=!?U zi|G@8l)|&nL^s$!YW^T>>pAlgGW+m5SgH+;ZAh{5N}07TQxlgB^!O-w9IC%CtvQ2zit8Kah7M<;Wr<>8F$^wbwoP}u?Fi8SR%Fh|z z0zkUCq0l>%29sX?j3;uZ{6@kCufDy}{3!7agA1~X`(lhM2h2)!#|Ki3O9Tc62(hh4 z7s3hW2_jvF)hFhpZ8E#mHr=m+EMno3uN54m5PYZLOCIX+(Qh)Rl@FYm?m%I>63pl$ zHszZ>d2P(ONzgEX$y;B(D10GWmo=`%6H1)ny{o9IGPvB8zkP^ORNks|wR-~(Gzw;`7(QT6EBfmDSMuU?`CC#mhT>t{VHy(?(RNF?${ILN`-kl*6`lgmw1cus`R6-(;!p`dj-Udi0+q-SD-X0!LkZX|I1^c^ z%J{zNlwOV3CeP)_cR!C(*fFbz%p0gK&-&ZSSP>T)I!SJ3L_KVEP%#|Sv_BR{lDtX9 z5NdBHQ_rnAdy8Q7lvnCci}(4aQC;b+a!ViDCu)cjV{kH_azqQ9W=%S6N~bF4c-X?- zOd0v7u@tg9ZCN%?sBdr1Pe3IoWgIbV)F^jq)aEm#(!ri;R^N^}2)i zE^Y3}%v{hIO6FreD|lijW8Chy43Nk0W?g99clUh!Qn4jQc31P$TV|Als*%YD{E?IG z)0XxS;-$s4;aDv4UIsoy%Em$~we&v6X`a`Ju~BkU3fAxli1YZ^%GSl^Tbh=WkrQvp zF1s7gfrp5A>(|y#$-dXhAGMo9{i@g|Ti^6>m3^P?O)-03ado~P@}NZa zwf`TLws(=dphqC_KtrCd9 zo73*eWi>TYZ5J$OMmu4tZF)xk<4|JMOaW*-hq{mE7Z3i%We{X+wgY=(Rl{+l-GWg;S=h%KCaULJbFJ-;h?gDdk&WZpNP{YKROKssmvwPX4W~L|w_7Zk;?;Nq$}PRR(DmyTvx}`l@mxg? z7Oj-b`EbddlvYznMU}wqfwq?B5(}k87)YCapFr;^wJfp43f;iOt4paEbZJ&NEuM#Y zY*pUa^zE)n;0|EHf;9H(nisvYHA|cBeC_q^6Nmu8=x`#{>a)Ky{r!|rS1e}SRSkTY z*2DFYTD2)r5Hg|hWS;bE=wUJnQ`Qt#tBuq3E*kaf@7G6M6fTn+gWs)tg-Y<+osZ&z zdJ*%3r17}OJT|zz*}azdHrH~<5K=E)yZ3qK6YgE~Lx7Bqg}|7uES1nuepEhN>$j$L z-UA46Bx}zxwaL!G97bcdYo@#udV}7FiIx*2kg{3$4ur7Ea2{jrH%1i$Gz<&@{*7UW zhPJV0GP2nNp~&~yK1%PbZetumeAA(kc-}eD`?kFl^a(7dGPo#$YX2<8uW0@oXfTAM zqho9jF)}A7C#m6A2Ki`1L;gVfaW*2M5HeXcU@hncMv+cXoYn#Gl}W^Q&M+K5hi0+LK*{J5(bH>rtPYTM*Ao6KAItOz zl~el1I4%3AYR7)HzTV`}UhyT#u_a~n&BH(l)u}7Pvl3l0MBF~n&98UvU&+(plUMF2 zS!`Cq0gelO1A{@64CwJpKX?!bRNvS*0ldoay2fT@t(8i0Cv)f}LfR_i!r&Hf>lC?bZP;fBJcX0T@7^~>TmCaOkPaOr_a z--z|p3MZb+PA$SBX!=;5Y9WaULhS|%Li!EfEZhMzuBwk#lV&h^{)h_|H57tWtPy=+ z+Y1E~)2FQCjUFOHL$N>Ubom9b%m+vw_frV1>5C`Kt6~9_+|e9ZWT0X}Tvk?8MMXu8 zMgm()OKW1%!7DpDKL~kJOqRMi4JF%fY;tmEz3Y=v#qUs%rscv@Rpl<@>d8tEplV`! zaO%)%zRu9t=Kkjj040P_#wYa z=~+}fHKllYMf#Ec=<@1HTv}QQlaGu=i8f~`fI=APIwopfr2Y?L;T@N#2kidBB6V0& zkt*}eQ~l?o>Mt*Z8Nwi%@nJx_*2Zc%Ej8ihq**F z!BfZeu1gILDb>}VoKIGU%k{cUXG*ZAix=fv8u5pdSq$dN^#GDzT%bc$8rNN925lp? z-N!iQ0VGF_k*i!%Sk;X-;c*6f<*73FSn*|?$@(nv&p{n`PwU~s>M<(0ogeTKhKdxL zoSjO-Sx!i*=EFY}m^jga2)iCjNWTQQn!~U=r3+3y#6` zwQ|s!VF_IH>GX!iMUCoudcsfx)d+z85Tg9xcMKnkli>@p#s*{KQWpEi+xLp>?#C0c z@ZQudUHq=@8yo*2SNCpmb`};Nf7nay&F~YVc@3unngfxLxKgbp2Y5H0a>C)a#&=bA zi)eoGz8M8lNyCk9@KyP0$4RS>g8^b3HQz{+6wX$ft0TUdbd2nsQN~q$Vr2G<6?&Fa zHVm2TnEO6|`+9^7+#bUVbzlabJgIu=rgS!udGNddq&`F9r~Z{YJERT>Zp*ZYIqiwp z;4D>F`Jv`#mqVic{L~ZzFsq`3UP9{0$v{JRW~&9qJn0mfla&^6$;qk0>B7Y1WJ(tw zd*|)@ZH#W=p~IDkn_y zk@!t|di5b{uP_%qq%qs8l2fEZ>9iMb{paRBG9%0l%8$|Ng>2N3HUK2r$g|FdOCdQ4 zBINPzi2M1qE^ZU?r<^G(F0TPT*qd^fo0G??4SevjvUdefaucPmI8@;AV%N&a&M7GS zPmO9aLDDaxIhC9eRIav$cj*u-E^I)Tw( zeB54wBr2eZhQ0FgMWe3^`~^Oel6}bwN7^$(26R;di&FrF-sR;bBP(kMa5Yeo2Q~)` z!bZbwtM6WXOK-&X!!n=3?8+-qk04^{;nYngwu`%TGxd9~HKqhmuAY1;NLiZ0Ts=8D z+E%GpDo47D6``n@1;fD|(xi+u)5cOnnkir3`id-4{o$AW3m$yDC)ig!2kzFBhmF>K zB0s36a+*0TH1yX_hL7=dk(^>trR7|CdZ7YT5+}>|tAp8`FW4wJIAHp=Lo%jw!mVRy zP8=`zO}70>p<+u{C+d2PL2ZZ|PSs*5QzklqTnlKl)2M(yd;+WDW^n}lh*J#bN0>u) zMZj-GrQ%<_vmMhCZ8L;Mw*+y3W93&{Kh64iYbe<|DNJ+Iy z#?WrZ->6qR)1~m*>DYggJwTZjKY-N~nD|c2@Q?f0yh_E32*s=bl(!~HUS`&l`wxH!s_ULZJ{h(xez z#>u?szA$4E*sAGu2(ha{#g^8e8(6J1@9q+oFnWgOXVQar;lUf^GrU`Ym2Z536K)q^ zW=?U~)YXKwJYe0OU4tgEMzG#Ln^zk?H?uCOT~TJFzY5zXWNM3nTYq`@3T-lJ>v*Ow z)yCQFjnzMet~*}Nck!@bcYQGLiSt7QJ}T<2APr7l(wO<-?Uc<#950K$THE#OICp7% z( z_UHEmNyBqmA(=O18BzoTDfv5_RqJP`@7J)psKD8pG>S&>o*5dY3n`AfV@RT+PL zP$+~xVFd*g-gjGAbULjiOQf=X8YHGZ7QD2uL7xwxAFJmO0akm2jAr!BtgMpzdfo~h zmmJyj9K-wy(rntg?S}OS7Jl?*a+f|TXZX(+07sb~we}V=gHPxC8B!KK*ELU1e0tP{ z#gtKlWR!ZASc0OK*Aci~jS6y2Cy?7wX7CbDy8`76p4{r!+FWwe^Z@Y^6j;g_a79we@cZ zF3#^m@|&}w%IfO=XEn%WVyff6h)lrmZdPF%6Q-U5)G3{CLte=#LqZ>F>b_?s*6}?BPf?(#$tf zBwIsdt(p%0d=o6B_}rd*lX-N3jmh_1KUT{~S;q@jWCbiTMNbU;JCmT-ZZ0}b%y+%wQ?I=kZBlff2yT~T!gI0j~ zQxhk^%?0O}@%8oJ--0K~E@2yi9NL$_udBVSv+MZ#b6gO%_nmGsTJ`OP@KM7?_x_iK zI!aM5pw&?%dk5+g?G)atRf@jl7qo_-CE#DG)BYZ_7e%xA&$zt>(P-@I?fWoMV|rzJ zBPlP<%}XDKLdo!pV(K6GM;!Zw$1Pv+(Uy&jk1QvqGk>F^-P7rrJK+2W0?68np04$XMoDEs+u{VGZeeP~qqG2X#GwL1;1&=C z5@hFZ@X?&EIP#e`#MBgy7?@Zoy(a0~Al%*W-(#m_Qt3o?JHk2q ztxTg2icCrh7{XF~{STG_BmZC2L-3c6P+Q>@{{atPqMNc4ITjbtQN2C`2l(LgM)&tX z3A~EP4NFv?gP|cnlAQd5h{QpX0bWV%?r&**bM!xO#d!X@;NM90e>~e*@82cZ+O+?B zAvX2@4^%rT)tD8~AQdG2&)xp_|Fli$tq_+>#%k?0djkUN`hdD&pd}c9i_%oP>ioBS zR3Lal_BX!0S^YQI{f`ov&=$POecedtb&2Zj?LFUS0$uAS57P=j(L5+SK>xF=WC2+P z;PL-eyu0uDSqlkuqenGPBl)EPmG9G|Y5yOeF7&eoP&q(f3l?B#eSLkRYH4Kvq-1?( zM-+Jf^z3XMfN_DzM&thPdu+MAZgjuDk7c0^$96&3xL3WkY^$@OvWOiJ<%Art7k@_QX5 zN;i-kBf`VSCslsjukr3zD-!T{3W@m9=l!#08&0`7IfB^BOa+&S3=|rXm!DV$2E@U} zvZX?=8-LFdO#!W#vhM?v=)Xv8p*?^$8)f54F4YfIAr4Kz$> zi~2{LHm(dz4a1S%4T>$Jq3*`_{s)rJcKi*|KXa#uOG4Xs8k&4bC&c)ePz0<+|Q(*^BT$$z8P^*!6xzDU;amkwAT zIINQanzW_L%xZf(rA4RrAv*CPqf1mdP00E%xg8vpR11g~T_tUuY zyc5mTsEDQ%7k6<>e3nxq{iCYTC#NTS=IS9`tjQ^g)5U=C#98c`zod{BYyV5e0Aw?X z{>&+!AE;2x$eO%+&~fmeFU?l{{Wt?t;r_Q80Ode7{%-t$(gkFxb_*w0I}bpO0LYuk zZ$wLNiGB5d_xnBE?0VqJzm7XmsI-U(3=jqZZP0{HyJ9 zMJbUSt@bmS?XO~B8zjsM4gGJ$3aGoOLF~K~)RDaZEQbG>GMm~n9P86@ZrPk8p z%(#-wpym`xef|GXbMQzQXX0XDd=~M8h35Q*)vi$**CV@=vD&Z7BBDkGaPz$DgEi_I z5Bf98h0sl#p#*^D=x#SBiU8j7!v68rE)t)s7m#(GTg5@O|51+wq|9SHKFaSI;c{y%aX&4xkf1>6<;59srC1p>LbB&w6Yq z0rg|9Qb3dSz3E~$TsBL?`|95ejXxrAS&b9^GOTn@ib+UxPgJ@J%vyVFBtFRMU!N@S zwc&ALGn=y;z#toNLX1=&9fssLRaIuWBK42~oaqUoT~Uu_i@7q(i8htyXgo{x zEfckEr!7BNnxGdH+w+|l+m4@Z1(c;MGOCjOyKV-n#z{46ee37haR5r8imY_t4fBxW zX%y`WUiK%*V`Cu>bf*YF8Ir0BUMVmI2UD%8H$}^eg}K4upW%PR8LnvMIeT88COp^v zI|RAEX;Ks!#YA63P8MZ8QLgSR)|VP>+y8)n626Q=oop zp4WmqYY+<6q`Lq-FJfExxDRw}Ccyjtg^jyqI;nHH2VVh#>p54r$=O6PV|$W){wQ?E zxEyNQ->G)Lp}c5&7?$?cSn1Zr{=8G|i)Q*sc(dmLDq^Dyx!KpU zi)d2Sxv(yl74uEG4CF&KM$wa71VSDdM{aHkc0HxCJ5W zHkiT5m3qz@>1i!~*Z6BkST)zfp)o---R`{!7G}tiVs?uTT*PfpeIQOrU)Z-}&0f<> z7c7)SVe7?lhFVGK1Yu0+ie7HSQbUCcXbs}?pc5g>J??U}$5KN=Drz`M1z?w)8Co&WsSIl1>&ZGgEjC^ASIT5GLZ@^Cg zP9|+&AcAPV$sYFSRKY~4D-);H@|$RWgMVFmfJC}4g)IhZx=cN3IDvs$v%xB+K%W!{ zCz?wsrmv;xfN#Yyh;E-@v}H+dr5mkLAO)VRu?N&0c^IL6j?fhv$&e=Zj0PKf^RqdE zWQJtfR*XeArG8%Rc=-0F?rEMItLLkyocPVZhU0^L6>jYPsoy zr;`mthsh$|M&uX}Dl3g4S$-8sNFkBAPPeP61R4V8`m@x<4wks(E7iI7v=?HmW~@|= zq#(%ws|$7P>r2=N%3W641n7nam+5j%464EhZk`!c&VW&7S7CnamXnZ?dXv*xm(=|_ z5ggct2DZYb%)+OeOTaHS4t*v=3~GI)3td^^qr||B{R!&2h&GX2mf*miMr+2)a9m>M z%D#YAhYC#>?Z6dZm+}uH#QoJNAUvcoKebchQ;`_^=*qU-9*Y)slm<7M3dh|BPJNsB zYGcY><;ZlD=r(cCyMgN2$#C=npWuz%R;N*HLuPojl<5RHkjSzHX9JxaNTF8j%gtfV z#ndid>|g?~^}CjtIc--)%rmc^!hA^Yb+eYe5M6RxXcODF7AM+vmJIG9dtq!tkcS1QlDhcBejhp^SNf4Xu<)QLDY5N#E(^416cePdFJQ zqk>M}X4VxMAK>#RJ2Si!g%95|16RX638H2Kwa*B){Z!M0MZMq1D{-{Et#V_?5&C&| zeV!fGDA+y1iS;>;sXpEsW%>uBpVyiDTE?cj1WOpsDdcgTtq27zUKv=hzQ=psD*U}H za3;UBk`i1@j4vj^eNqhpLkYf7P_yr{IEXZ#_crU>-&+UW(eG8pt7M`Xs?Xn^7D0*g z`Ye~cVn#Yxu-R`)BEh}Z8T)QN<rdsPR_l+Wj>E-VRv?AMlg}uD@zf9mU zuO^7>h>Fxw7Ke8i4I;5PO(_ta+W*ok`e_Z5L+ImdUpzTxf4{zL>g|qIH)0Jn6KdWa z8GKA`KKE^H#QMwyHO7mmR_}&l>Na`Fbm;!>`oV3YPX@l)RP9z%MV($qYz)d}8brwP zM7-_W&Kh-a%CH~p9$Cw`;qx)RQtJAn|7f$iLaohLEsM176{Fbr8K^QUw-?$(+0*b= zF~sFZf4gsuI4`x2d&`43#Krce1dw{j53xsmFUO&GV^Lxo$aWkdMhO&*{CxJzLH?D% z!jP=|?u5kWTp_R}p>z=#G(?vQMNT{s`ARg%%~`fPhw*=aZ|%RpcLI%KfjGHi0w97# z(YC!cpDsU2<_9^*_h_9sJJlBG&N6zgqG~^E&V2`Vr+w_hfue-hhYo^|Dw)42epVhSX44Ww>vO&h=e zq7(A8#u05GWXsl*5JMmkY(A)C&yA&?+orsIa{cJ|Dxq}x0B5k^PKisaKJnX`Zk1ip z@mlJw=?m=9VWv}=bpY)%s&BdK>Fu@>PAS09WE_L;UMLt>#Xp)luk+Pq4kQ{LsXy3b zENhjq$V6;8UBzYC?(6CP;w0OlHJNt3HMm=rYdBSl=E=W^%X(GJ5X)4`Ml8bSDbe<# zi~01$xJ>&l*N9Y+r&MdtOpFh2Y;E&rZH>2n1M|pOnvb^UTf1*$V=<0Ev4Swnp6_DU zY$q#TN5oQ3*;=mr0>^JdmozhxoCJV$8~t79}>;Pmg2eZ9mA9m)MC`zt5frGzIb86YF3nQe51HTpsd2*|?}V=KgHdmCV8}sn6x87lM8qcEjuMMt3`d#d z)A19#?V{mjx$F|8PF~+gx$KFVvOTlII6I@7S7uXg?eLbB*5zRca5I?o^W4x1E{fs$k*+O z+#I>JALouPA$PTAVy{B;7u!I|!Ovyu!8}No0j1gb>OM!Csg>=a_lu0q2h$=^d&n3uStolv*n+5vL@}X3OJo5|1`HH5TDZ zP}0s5W3LBe~MvJXM)eVikV3k^zbeB$-hFv`k_)_H5!Q$aQV!Be= zKdP90wRVk-Fw^NPovFU{bbvZ^N|%enGP7|St|)b|vYryi4Y5?v)r}LXs!ECoK&2(Y z0SP#`1@8Pzf4p?4bq6gC^RM-0msPCGXbBZ2CeuS{e_SZl)$}Zu?HdLHp)#It_&t|o z7%f6wkwLWWvm(zGO43$Ni=lOsUHtu*A_5!H%(m3ad;eDvfr*&>?ay_9;rD=JC#2Y*E)&@+U!N3!d2f57_KS z+XL-CB@4Un5bJv1b+z%vX)fha^PV+(_UZGOJPVlN1W%V{^cn@J=sDajpdEqQ`VbE$V)7Zw&O0!*x}a7acspXQ0?Za ziV7Q8?d3{j1y$0Z4>^?{J&0NPy9a$M+y;lWAF8FuFjszbHy^Bd!ptQnuNrTj8a9g~pUd~hg3j+V-PF z&d2%^9ixSDpQ|Im6z@6c-ovIk7`vXmb_6A*!J4Bu417+PcO6;Bn7`r3f@s5%~SYjTL`76)(~4mi?PPi?}?WL6)RJ-+)Ad{0V-Bb z=p2gbeV7<)CF@87=N9nESU=+Gm#>i1-{^veKK+ncApO=L@6pi>h(ic z5Psg`@aE@LkH`z?KCL7%7afTJe`WN>zL)!yTHkTN zsKTB%i-HIotuzqY@KTF}FPAaWNdjueJt+YZN2toT-ddT+5(|UXRtw{fl5u^(lM*`I zN7@F17w;RWiT0>03AZay78)R`H`bbe-j~vOv3XN^{v@=Kws$Y3sfhTotxW%V_^B?v z=l0RZcVudlK#MAxVaLqTFPB&Gk}2KLn$-o6fj-^KE>DEg{aL{4d$G-hQD?;vUK7NqVW?E z-Xw!BC_wCJQr1QCBbm6cd+R4~u9f}WY1U`jO(8oeY}A^6ess@yp0E85aA z);}1iyaNCPlM>}?{!P5O%w`7}s7JkN6gX?W<|w9V>6Q`Ex<2o6roMq*r=)812Dz@i zhLuE-L9_i*pD(7Q{bF3i&v;I%ng_OMS@MZVgF07TNP@9Tj7QXvw(njfb~6$$7wU#X zgvaJ9!WE5zay)`5@WIVBQvj0TN#8J!{P>gMq_TNoz* zd@Rz5JXx)3m>4ov&YnNl3Q6I2oPyoZZ}Ow|@FQs}Bu))!0R+HV3e3=oS+yZCU`~bI zVSx{+_f5Nf5@q{6w$#+g70$#qH-v_97}n~E0pmMU7pWl_;*-H{EqMIEsqO8@lg&SN zQLG%k|H7$_XmT@S%1$I}JWB!5oBe_Abe$spC7TII4n~73b&m0>L?U~GqN?mRasl;X z8MEs~j|j2AQ@Ac4d)p8h8SmC?4v9_1*O2efnu9jYsmZ_7^~~~I>Q2TZMadu^HOA5- z$zF6TINdde#Yk?jVePyHt$DAEHcgEG%A$eU{0Jc04m{4Zp=d-L`lkbEL?~#E3HoPY zcGqdj$6@k$HMWKL`I78pt#nmi5}+XP@%k2T;q1HN7iD7_A;L1QeW-AP*2tBNJ_DrrM$(uSVyJPzFNL z6^A1GUyrNne16hti^?R+jvI@KxlvGFB_0G-EQ&_BD>?6Yr6bNyU7xthwV$0*Ix~Kd zGwV9V+92x0c<(e%miyY##?)u&e$?A&WQ*^jA@V*dBgq6st6H^mg#g`VZAfS5+5@I~ zFfzCP*oMXJ#t=pvD0aTIAD(QZcp?HPJmHSQ$L3u^=y*P-pKa}l%c%t8*-Yd{Yvok9 zB)6K$2iM%kNwy7#@TUmsHV>@?g?hYym^VEhdoUi8VeEre&Nu_FNd2=y#lrwA)ZkyR zg?Acws6iLGh1!9&WjY;ErH2>X9HkLHF7C2?gev~O#Z?}!4A-mVr4}3$dNyl*txSZ^ z&$JKy{DCC(Cb`T1hdKR=2|*S-y-89{^V@!KXsUMYtR~=fk)2#p_$+>7t@*8K~360}C`Vk2Yn};GJ!m6AWHD{g`G-_P|+uLNjHYuJK_S z#|*RVKC}_D<+l}vyywXfg{P)u!5v=+{<;Xi}~?xdbjD;H_y zvUdL9{@_+nfMQd9@*CLL!V^DRnr-gvi;n(9INoRxGM3HAD&6EpNpti%IF>XcR}Jkm zBCL-8PReflu>@19}U!t2zDxSCjVapQGMZ(g8 zWNnLPl@fp+A(#En9Z#K`=xjm0#RHaba1u4$wD*KQf3;T?)(xE7}QJh3Q17psVi_gz*tN-T<$CM-*Rc7JiT-GinSS*fwY@WyGB$;ZE9 zpp#D3@%t35lqx2py2(Y|GGe9BQEyd?Go#rrr=53|{Q2C*FlZyA z)=Hx;S=`w0L+A>{&50_IY5o-ZN~eTj7|1K{66ty6nT(jKB=ECl=4oM+cdgp$Gw?=`h`Yhy!(flZvJHl_aq z6?9X}AqsHGh{ge@iEvVUN6BAs5Vc~P`f9$gg z4XiIIt65mSiRmh+;QX1LMW-Vosu<8xQNam|NXfJEyk_K^FV~!l5oq`Pi?ai$dVAd$ zE?=DLQd8;00PzX|%hXcPI5O4a_uqY@4m3LIG~doI(O1QjxR}ljAxQoN8XH%XTA`ud zElf1Y3;Kf;?#H19N~D&9he~aZF@NSghli=;FnK+joHo$wko7=k2zCZ6uzSSWx$W2q zr+g=tHtuC7boP%uiUOvU(pdoAo!BPY8>2|F!n3G|Ibjd0D#W{H<*X7g6D=N4}i3ZvZZZ_S@+Z;dD){d+7hwg<*b=4XCw0>A_`c~AG`(+e$z_7@&uz{<<-mA~}T>HNmXZ7?0?is>ZPulHUVh;v`_l zio-7hJP2H?RXHvsRE*l6NBj_P6Qo1`Lf%qi={oMc0}((77FvK~EmQ{+f;8oLKlIg( z;Ox@^_bCp|KiZ8k;lDzTqnv+9-|z8dUtIl2tOt1~3xfF5*9KlX6VSqX{%P278GYmN zpVAHH{&TJZK(Lh41aQq?R{#v2nX?2KMffp~=l>FL1CA(;^~Mp?pc?(WU015X7668O zlQP9#xmHyT7deWvIkU-O$e_L2HX5}Wr(Rh0Zc}-BG%Mey0+_d6;YezL-WKM={L5EY z2K~!&Q_DNRw+w&(&uaY+;M%bOC#p?UC&?C_c8{;5A8d@KX`l!a{fgivp87lWf2sC=Nz1>7=K9C}SDN?#Jam$Ut@e)`Zs;J; zxI-29KSmDUkn-KrlH|u*+rv>=f3O-4zxAb)QP(_9Pd~)|3o73gA%2Z|M1e`VVrXjnpkU`(6V<`BB&SM$Hm z`M+gtfNFztkMYbJh%ZaG1P{d||37KT2OV{=^5p%&^Acb&>b=Q~mtCfVKtiJM_b1${5~?a; zd)a__C7;Kgc+axw*?PD4Uv&?lq)qsX)B{rztRUX#<=$&P+!I>>2q&Iy*L;UJ@k+eh zzZ%EdjP_a<<8ruxuv?QqG3?l93Xc9Ew>>z+N=NyI1`bO4wtBYzrP3^dm;n`4DrZ7I~AKS zkLe0UI>*}H<5hQq(_I^rrBT1ewE1k;2Uc0mg1*4r3BoPSWEIRl=Bs){3j#~D*E{zA*TS>ea~2kq(M@8_{R zla^0!QWJSZ-JA|uT!|m0^xW9ABeU8rmdR8L>a~ijO~W5L;gEg%I^lLX%$ABVv2Xj&WB9f-SC>CU&&(M&l~&X~yQBa)~WBtdTu434n`K>#gZ} zd~{X?)F*^Qdq!~-9>Y8TqYtYY0lZZm>)qx5+biYU!TF(VvsSGM2|)gxXGd2Z9_}~& z65Czu$hfSPw!AZJaj|B^m~^hvp@yJkaRC;bSesd|h8NCfpS4CdlZPv~AKXY&Ii2Cx z&o;=1OA6WksUfA4lz4I_avY5KbZiR(TqZsyPtr#^&n&XYFK`Q<6x15#a79vT7$4X_ zHQ#-G2>fP_BY>f;?!)aLnTVHpoGi&FsB(G)OSES4ht+sx>q*!*AMeQimZ8mlNqs3r ziz`-rg{oRr{T|uwgbi!3kHM>%O+#Jzf+MwOaoq)~W^b z_m2%iyK_LqX~(;l?`OnyS)c|es@z|nvCqP46!My)&Qr1=Adf9b@+d~Bi=BviQofDt zE}~C(STSL}MnFk=s^udti_Q}Xf? zg!?n~BILe~si^YTJbRAy8YUb|=UKdgjq#MEQU>}@Z2Y;~|al_YbkmpjHx=2G7= z`C|GRcZO4dkTp0*hpayS84f zY*jj9W%+N~%>DVEuEr-LGuMg&4qUs-B@<59`#;1A8{KUu^rvmFO_!-PjgJg&LE=oS zM{%lmDh}^%Sp+UG+kHG+oGk+UYWUJHp9M+7!%p>go#&Pd$vJhpN1qKT8&w-XVzu&K z)5WwCL_r&?#jvC+emocBF{^pce_ohs-dJmi-EWu!H%#x^0KmMqfce88%2&g$Mm(%= zcGOTTw|bh4Q3#YC3D=%teZ@~d_aky)h2ooqZ7O_(1+sFyuED{ezh19^s>_(|pS2oz zt1RXP>R;K|#P-awO3RpUqYhF}*4cw!lrJxdNu-NP`5kVH)h6sOJkV{>jJtn#U+uFb z|7gxR=59*JUgbHr&YGxA;h#xrXuk2rS|Jdi3x4lgj=}yIZhTW_ez)t6OmZ;MfK;#9 zV!UcX`WQx)C*y5pF|+}mk!W#?&j`K10=3b!i-JssYUFlhPh^*15b|1Y2trgmKMM6QG0e`bhqlrlv~f))4%#)48HOJ z9t4fGyKxmp-v0as^F{+vB;eMCa*}hMrjYg^Hd{&iCvufzeaNlj87Y3x?&#J++c?o+ zI;Cv?^h%UHtd;}v=+XukU3|T!%jI)wzLf78{E4Yw@uT=|^Q_GRcyR`WV2=OR8Wz7b%IGB(bo?L? zeowAJb0}@jYwx4sczps^++P56>y2SOd3$*1M(A1Xp7|B<2CHzvOlw zIY8#iqfz%GxSMN}@SWLm8Y z0eq(yoel2*NsBkf+{t4W``{)d^Rj54(*V6z%#6hC=U~P)zC+IIw48LBG26bfYN>?4 zL!*oTLlt#vxsd1F{KZa8|a@fCV3DOX^PjclrvO}Dg;^pf$bY3(Ek zYk21OYmMBmz}@ph%e}8lEpIz~uy|P^(?!O*cIz#ektZBct|J0$YBg5K?KN57MXyq^ zhGUD{IigBWrK`hNddrMcw#?#O-=2MaH_x@D%_}XxVcjy-8bUGWb02St;}3#%OT)Kh-MjsU zXC!>-*|t$wwt7K(clmI%4snHhQcK`Ww-!8S_uPzd0*-VRzo48Htp|x)--R->$sBSL z%{dhnBRae3T50S>ms9bj0ry#$dh--rZ-K|ah?_p|F0V+FB&XkzI9hxJiKW^<2SsFF z8N$x=U8-w=PU@)(ckFEB_nRC_k*iWVwec^*SBOw}i|tDpE}(R~lC;{HvQ%Z;ZKu$kD^_LJ6T9_lk zzg1{LY&7~ryT?m?h5W?Dc1)4UOUCwQz$HlQZl<|g&2k*u7d2a){3I;#zJxshfwl8IU2L4C`}EMhne?cT|p2Q6G4afB~DR&O8466m?7tht_S5OeHv8lyk| zY{#2Xa<-P`IvL^3<~>m9a+02GIE)Dt#jPd%* zurem4lb7{$OMu%UkqmvnaYy*m90b;t3ETaUPjxdP1J?OjjoI_lN!iwAhb_YB2eWT< z;g?Ob0hyBd7TmKIU9E-!12p$=ov$A7%I&98I>~Iq6(`foyBIdv%}l4%w2xzkqqp@1*?W=` znUF{y6ePll$ddDo;~|gHvCOZ&_JcQeaY${PAxN;$wO~s_ehVdo>$l51onsiZf7_Fx=U zz9k@_88Gz@<<}`Q%{bEdH+u$f=f9AQloajR01>AMS+V6~g9*FMsBLOiLY}?#8knFS z=xB3^eFT1WpA~gx`t^G6#^!yk6G_V3)xy((dPfUWYScpo1@(F*@l8mnemHX0+fjDF za-1u;iUg7S<_NvV#65>ZRl}LM`&VT{4P>1K{ZviXOi$%m57)|}moPh&NRu-Fb6(wY z(Ch9Y()ez$!-?MP70~&5*C%)*VpQ2$;-dt%?3`{>R1x0s2$C!b?UxaZs#RqMd+UdT zhPM&@9heOeb4t;xe7aFh-~wv4=2c+oSsxRz*~Fv}!Fo3rB*agg?>!gIA`lfuzhehk5zUPBJqT%Bm7PBiY z`9s-9VlfRgxdynZzM}M0I$m#r&7@k;B9J{@DK)yYqNebL0RH56ySn6BYbTX6 zL4X~9>$<|)O*N+9ru~@Uw6=&7v0Tot**^@}r^MHJF`m4OEnNEhvMhQBKX0j;T}JCd zLmXW&BX~fFL3Zms1TQ=Qb!q6(qrE(^u`=r4_qBF^x`xD>w=Q>TGERfs&vPob0jckK zsEyI@jBGxIlucN@Q6KLWs%`2mB5d&Da%czH<3!^%^{#hgCWEH~N$|j*4W~w~_YZ~X zTegjqz`ksqL)DVeqc`p8yqe91WN~AbC%))im9v*sneI<1ZA9#Nf^C)7SKhEer-HTR zvr!Ga5@lt_)1Zk_O{|_xf{sy*x=^%E=y}#6S;cV1GE@IGC0r(?5978UgCKja;lYc| zkxW1Xm}r6z^g39h^Odr(S~D>&?&0E=yiM5XhrRTqxy>i;*bl6?g^r&H)MD94Z-_M! zAF!G}0bbNz_Zz>EgAg*j>d%;`B_)ALy6 zW4AKj_cj=sb3Q`rkLtG|vl}f1`Cetm*VfsJK-wEu;hKu;Z4r8%)=bBD&st#Xb8s7H z9>GH|kJ1g=865LP-q@0;)&eWbWk>pOG;}HV+rk0%C?4I*7A9C<>4BWB^+B-$;SW)* zJ(bo!_f|(kEJ`e&I=CTtUSPU8N6RIu(G>^yT6F9?ixHa!Z=&zxawm3NwNXtZ;h?q%U|!Up zlL!YR^VsuLP};!o8Ck-QQ3q<0pqRI7$9wjjDV=dvYav3~^@})m|AgAD+fwA~HMUyF z9Hv0&8&%#(dnM95T@=r9nzMU_y1mDGZ_PWC{^`*zqz`saOj`0YUG=-i%7X7MQFM^>V z_U6`>xQxsv4vvKIQS5e(7n9Qg^$#axQyls>SCy%2dA>9L%?-A_uGZ|voaG!RbxN6~ z1h2~3;H+BPM4}SIOMo)JrIrT0k>f?Rc>=8(R>RpuWQ*Z&NO)j05s_dhA6Ib(mh%2B z+NS=izI0zH1~V{=DxKPeLek zU37m%KrC7&E%qyMv`f(zqay>B`}6yFzpd1+AqvzNI~-Fxa=RlK52G0_l+D5&hLG1D zJP3|y_NiWvN@Ul={HJ9xNT25n^gzp}YQs<_XkNo&eh+?K4EEhFvCME9ysn4h6LGDr z2uP}$8A+ck$|7cG4a+JW`_I$)VNd(h0wm}10$XFTtyfbBc*_F(f*9Fp#o@%D$VwPr zq(7XP5tF}JichO)xNk~hv}Rr-6*!b>^YXMY8)&g7V(U5Fnc{&IV5@GYu*9DAo$-|9?%CflqXF?BP z*QVDh4J&&7Y*`cWIKTl_r=PgppiyxB%^;kk>D-eoX^u}pEnc+>-eNeoq&(kEr?90e zSFky$Sc(^5T^g*0>~`cnjLoE@+4$M_C|TT2c2v?VOqqzgzEpx#r)x?hn~}Dk8WMh< zP}-T95Sy_%*f;me)!~L=hc;|!$9!6#n@Zym_zrt zGEjf#Ay4#y8Om$kiRH&`ie|L~s}Y3`9?WcH-@;_@aagN5zb#Jn;WP0z`2i=m59pRq zyeI2$<@T<+Rq+o(Ht(ei#(C{=f z?&f-al|6vj=x5UjG0VQ=;cJDnUEfMI)G#lF7X(2cl7aS>A5^}xlxGseK z=ph(kA6t5HWdqA6Y`EN))Shws}Ah{IV6>L7Qn<+d;BX&Kl`uM<-Etn{G^~ytXuBz#pJGc3K z#TMB!#Kmq)fYLH&bkwSYOl!*+k`K$ES>HF%LR()}R#nGIp}lbX)Dvu*ly5IMy^bg9 z#kIXBYVEk{Ny?s57m}@ld$vx^)*>Ts<@$lz0;>UU$2wE;nUMLt^r2MlbLV^c#}-wl ztPjQ|-ukr}a33;yaa6Xzv5iMTWS%ijg zMys6&06-VS03%o1Q^<=nNr z{;8&CF5L;Iqa#?M_^AoyihZ`fDXk}E)9`R0u-Yh#Sc20oeXM56*V44L!Jg{Z7*R9} zR^`w>;N@yyaE_>WyMqn3{*mT+w&s&5rhK@WLulukHbtl60RICHX6A5v4@-6h7=}wlK>kvR$OHnP#Nqt!-l0tBrF$V?T*Rl`OZ* zQ}(sZW;1{$2w}&FYVDIpCh(eTw+NwDudTmZ(CEfY+$GwDZ(k_+&RC~fI~1acwFMjOeKuzyOI5YgQ!4WUWr1>r?W$dY=F7? zEPkj&l~S5Ydt!$F@tT78)I(-`j!ZePaB3g!pv?P&6}ZQwAz~2rsK^YbC=N%Vb7ORV zOlq#qp4D%K?Bw|HqtBuE7_4)O#e(z+``RhK9H_8ykXcdG# zxvQS#ThLw6sbk=r2%;jA==Rxi_V#`H2s;fAzP^&MV{Q6B(FIq{^}r+WIuqP562)A; z^>eMxE;lc6oM}t}+P82Sq3Wiq8!PU8mVSzP!X9-6CQ1<8>oD z>-Zel|87B9O-u0;QT?Jg6^*9!gSk`exMesZXNuT@Js3485S^Qy zUK*+E&oVUPNSn7DwHJgxyOhqZ)H3b;n_vHVZSM`m4L+R@N>}JSCv0zj0+bP1ufgkv zpTjXagyj^p~%F+5)aI<>mDb{2p=T^U8Y zFF{@SvoNB{jbBEp)jrg*W&<-2Uk>%;5*5_dKILt1vzL2E(0x|T$c>@(QLwKBmCIG8 ztJz$;qi8jD!;_7rVv?AO?EZ987F=CqDQU4Z(|35p9P2ndo-Ms9VS2kV8lU7_w>WSL zs%C)2c%?4uz#R-1AUPncOS3}3fN40U`e+1avxreASzzx3rhd3N7Wa&j?=#U{UoPf~ zmI5mF%Z_tnmS;5Tp(+#6>&i^OU0g&uootQ#I9F6F5@?a_l~*|Z6RlJ=lRT-VP)QNF zxHBTwb3*^#&)@z~u{6ryio5<`W^Fox8f%JTzVTEB^3Wh27nNJ>pBLI@ZKSGVE_Ec} zu}qC{7xXb}T;o?-Cx*0;cik16sE)_%kazj0{#& z6Z$LWs?*7MYQ;!gP6N?OLZ>ZiMHu?t-uuuiuTaNO5teYQ$stpueK^~HZ5*-Y^f123s z;(1fLGV;PzcoAU-A`I%*oLs0c>5DQ@%5*FI<57)_L3hG=%na46L1m+*heT+NVLEC6lpacb z4QU=3sS2gBn3KFi&AJFxmxkX==@c47Vr))?y1vYWUVJK$j8U>Isorh=U5{g86rHK3 zmrB$b{qp6PHTgA1HU+n4TK6-1q=B9~nna$W;xQe85Cz@<7~N#`SZ^2P(u<6QF3=5! zuEdmd*3dThqoSg#yu$kbgn~D}&Z21MhM#%lIszFrgtV_QTZ*K6p9&Pn&Y_C5tdnm@ z`{PF{xVc!Z0;a!v_XMwD4&1)(NnvX`hLh@Sw20bORS^i;XB$yi%swex8%pEODMBvG zDqJ31w@<$sQH;n*@MkZ#V(s#6b{xhh6#RN1?6G*Pe7b*gO3D0Not&`vwF%9*cJV`t z(#3ht$)(_%*8;|fRE}JcR?yRf5^sVqf<2Nt#r%u2o>49w~is6 z{Snm%Z-uu9f);dY9IR1iOVvz-c5sVE1L2WSxF}PPBtDKW4`*^law;+ZOdmYd4UCr5 zC6;xF)VSv#tZ{L29Bm#NvvdZfpWPY{2C){n^0vrCeFW9P8qN(=nWP(J{4tpdp2w2; zLM1YvW28*~>3tkOOeB`40IY=H3mo^*ZJJA}MAYKFx8^n`4=cG81J2KPA+WvtM|-UZ z*OBBy;-#+diwa?}z8D+`b^SJn3wIs6#YZDTkEX62wANrE{sdLP{TPIai36TrTns@= z03VVM>759L(Jp)v-4P8e_dvwP#FS#P{E=tHAM?}vvO8S4F5#w@jNQYz?4sN66-7Q@REFu8=83m4ba#7Vfp?(_*a>)IyCkO0MtIk?_L@-- ztuT^qYabBY4+|>SaF!e3=d>qXkuZ;N$15}2j42Z6qw$5niYGJNXfy!+_T2MR2aW#! zW9u!Ts_MSCQ56Ld0qF)60qO1%>24|MZplNVbR*p@-QA#ccX!93I}dz||NZ^$_l^7A zcZ_$a#6EkkHTRs)e4e@H{GCm#yE-d`KIwr?EGu9%8*Mdp3#E^%IsM$*X<-AY`gpgG zt^98CT>}*O6EZ&5uCCtTzb(?6&qV{t!aO8*tc-=!PpzI!by9q+v?G;^K-i*t=_7*P z?8tMuV`>Zs%|&O@=DU9Y%Bu zFG;yoywpt(%^3ChB#j0P>~Y#(G-z3cGOoW#S|qZug>+{f86BES>#NkE*zWNipK{4- zE^I2&L2Qh7HUi(euT!QVjgDpAQx%H)=ktLhfol?SaW2s0sE7u-Mwz%n@x%KzR)SPzx7SDMlzca7XLM=ZJ zC+0Y{()SooE6BwOt;z`L><)J-?R5N4_v_nwD$&SiV?yZT*|;$?;O(A=l$!!4 zl$x@$KMU^~<^M@krnBAjMWP+{cm3gviu2cRb#>F(k^2m6-Fjb>@2HD#ABe(B2a{iv zb0W9k^|!6O>+(<}>BnK`WGO9Oi!VM;!0oE{SN=gn(l@7^5n`$RtC6BDfo~T_2a!|| zCBjO9h?bCCau0IyZoeROhKT&Afc|}KJ ztMb$d70rdb$%&!XGcyZr{-~PFW6hPZEwPemlC*Qfr^*|kKU?+rcO4o-I%TqYUkIFyD-riwaXB~)$^;bu|F1>2mG&C+H$`~0BpmsvQCk1wpt5P>g?A7sYj};((Li3b z^Wz0?aSvB{bUo6BfRZz@+6>icz%mo!b|hs{8gG)pc~#|y3q^(R-4GhAX&ZZv_JeG~ zw+Vk;1ZBOjH7|x;wX#2@#*MnmgfyW#RJ?ZwXY_W|^_7pBMIJ9AuUu5(#CjUCdiLS_ zheh2!!9tif6g8-egFgzGg=?SdW_n{vrkeb&u%K8Df#Acpa_CsXO3i#dmUghjpd!WOaN z-F=_y?)ZB{D{!xSt?o2VJt6g8Vj|?nch)85qmx=!3tiEp#EtJW18Xtebr;S^@NdsE z4+~$mK=36nmuLb>L>B#R2JEgVf+XH*Rwg`F!o1^ccwh5856!jG_2?e1Zy7>5@-^Fg zMex40wUyc-Z8*qgNQsUrs&qXeM#w3h{VeSBd?R{mDnpJ<7E=#H+s-Z)8^ZZ}F-F|R z&b%Kv7X`ty)OZz{U~VHzlJO1G(d$!3I?vw?hkXuFtrS$f33qlxC%pU8GqU<7-@p0o z$DkQ#t$s^L{82_ntT-8ttPc%S#iwW-{qUuEC@e&6H{8FOvx{f_n;XrQhO@ku&HV(C zc$K?tqSSns5*$OM&0fz(__uMTI6Ow{cunRDMs{!zuVX#&CVpBiLIb_V(fwVHv}?Sf zA2hFXKR9>eZ%@b0B}xT;%5%o%CJ)nFbjIqxLwSxHUo)Kk_kL65?|mb>Tfe2S+1LD<=n=$aQL}maJEgRY z$VXS%9o#`ARW|c*Z(*4h=eb7vwl0pSjzx-zoS)yy%tY?sw>JKW*zI^-4mG_Q*h^vT z%*nvYKFaN=oB3*Rv@7H?O_Qw znU8)PA4N50ATmzYb(`Q!N9+8x)Oz!7;cF|bozT5Iqw`5=z1^RduP9B86*siSMvwg* zMg_oEicKGmN_VA)vr|2Cb1jjI8dLRIn@#JHz|=)Z8d3Z48-$&C3Za(E9fENc`p&y3 zSpu&mChUbFm#|4a_4en~V`BHx5b>qtmRst6>*U;rA!fbTWsT9>e8wXeCdU_<2ZM9e z+R!WW19$ic9p&Lz^jahncEPcY@f!TMPt1mo=N|?>eRb812iT3)i-y8)#hJS8ek9Ti zabL}x{`cD|`O;p%GSP68tNvE2kdY%DNeN2avG&hO>5c_5pEaS1EqiHPxkhk&`=X)h z)VTjGy&09Lk5S6jc~ln*U7V{_@L!^rjT-tsA%8YQj~^@$#19MVN$n`T{!XbMC4lm& znB&AsA4ZueTuRYMz6OE)wh!0V&B!6T{dm@9TggT?NZM^CQgTwbR?3HV41W_w8CUS# zekaIm)?=+p`u`kPe?=LepTIe*c5~4y!D6N2Kjx{mvVvEgZu;aYShv4uLcX!t=E&sF z?{nG;!@l^sg|UAb{8plBN1EmqQQObSekki;6woEMl{it=*oHNkhj7D5=b27N{440^ zAE(MHuF#|!~=9qptT;SRe#Q?uE2iCCPw4KFh=?9aYhAMSRI`Fs3*HRPUTJ=nlXXqGBP)qg<(qgFtjA=~8Nv`rUdgBP zy6|x;?{}M%mLjh6>#rFjI3qBVUO3Fll6AZ#s-$8-)!$}?65l65PnSu{?f=#|B6Ojc zi(fv86KE7inoO2!f`99@IPU9xWm+;m27JEX!|E~~xWXS%hPM_J6jTGV;6>2}vVY@i z{g>EYg`q#!#M*rQeRHC3PLXEs_138$_yV`+_rian@h?x2UO}_?<5i=&LWyl|k-ekq z?TNIbu!)KpTkf|04SQx<)Z6mJ@@;hnZ_hQJ=3Pm3Qm`yL!=3D`I#me&Y79KZ&wt z);e{%FN{WokYsL+{brVeOj176$p$o4&1i6_(Fk*h_| z4(44SB@y4(!s}?_J$+wqeT+i*s2&DcAwGb6j2O%AKfdooO67IWY~It(W=NgJ6e0c( ze~?}R-cXNs&ov#O|Gsb954_3;N7XNLYD*aY&z-zIdSyTD%=34WT-5b!xq@Oceo5Z2 znjOhn030moagJ@TG?uM~Ai`g7L`C9y>fQTg+40Nxo;2k!oc`Aw9R9N!@-H1?VreyU z%2A79bD&?;otDTcwn#hDfBB3i?Z@VyR*S=0WsTcuH{oNfBb7M9J7p(|k%v?`F<47E znZm*H4N|6B&2F9Jxw6X^x0{b;Yn_sE6$au#*wlSl{^3p+&}_#@&y@dI`+u(7&~_bi zvjo>blGSE%9saKnUD#Qx0GFPhvP&{6vx!dq<f1Nlqr5ZS_br1dsp!T@A&T_K$wxUQlPjz4TJ5cx{vW@uq)1xqj8<$&2$#^FI#q zI`5txuEFd5y(?DNSz=p{;D1(h0=$4y7eB4!LwVagBc&7wcelwL;O&BE6V0q&tkehI z<0gDMV*Ky2{@31~o(B^JZ3GtHPpRQ$ycsHB2`xY;Dp1T6bdaF63_i(&k5-?HRgj!7 zs42w!1%9BHQsX1!|KOhg_mzA_r0Olw+i>xVKSf0UD=>5Di($@IE!UfCe0uW8)`vdw zgDZ2fY}9Jdl7tB$J_ePH_+rXVZuLTu%@(QNt;xyOXP<9{IYUPqWZ_BVU?eM1cbvH5 z+9nnl|53+Q1xa(hW4~No{{OMsAlCm`KPSw83k?_eC-X4|57+DD^jesNFKM-!IMO_| zeDPTi#JN0kM!XtIB`}3=oy8}6zTfQ3n?2)Mc2C)EEHx!g|83nc{r+Y>UsX}%KMTue z@-dzIbz7_Ce_XdGwily&JP!p3Y3d~OOQmQ zq!g#@hbF|wGuW)XyoXVY6l<^(^Lw;`b0*bM?qxJIG$!LY$kk@EXPa@_r{I4*-4jlB ztA!DnTY34ZLN{k-tEHyw=DV!PDpL$>TJ;WaV5{EsiddyotFyNk(cIjehK5R^@SEjR z&*_Kz`pb-G9GslGy7Cc8?AD`A&dklb{46y!Y@n-jLJ$@$hiA(V;vK5_3@~|+#bo3s zI4}1hMxr_@|5gbcKF!mprNg3%Zyj&R<{9?;o!vT^%G+? z1(w6oL1zUW^ScVXF813!5rP9r>~X2Qt-5{Dz55IG-hmhtCKT@a?S9Ccj}OC1!~CT$ zzkHi=KlnsaWi*(`WIh%C5@A>cR-{%Lr0u~OTv{6LcpC0kp(W^#GP!giPr&EK@$Fk| zkw$G;rSb5K<3-5BTig}N?V&@rM;In_syNF%z7Mi|1Nz17jAXcsdzz@%T1nqsKDN)! zin~rPv)S*+ffk>F0C&Z+(f$S>X-4r}IPG@T-?YkVF_BSUr1h-j0$kPYDy8+(D21=f zPD8cjp#h`P2-Y*L4H;XC@jvAot=z5!xYi}g?wApu--FN_9(iKvUfzk|$`7)t8QUnG zG&PXG9PE6ywX(aL(R|ljQCe=bYItpi)gqVu z&WgxOexE(V6ewAkPP_-02;s$iQ;mmfTpimnqb>Hdqg!9wzV z`Ivr3a()`MkX~qOZ{=aWRX{zO!PS+8F9$+^9Cw!!nCy&y(S#&<0iC4OUJ9XB@i6@7 z^$xg}fd+@YnFdy`B=&Ji&_7*9Mn*_j7#;IG3t9)B6Ac4nuqT4_+3PpA5qWuHUEw66 zU)$u@)=`Egr~UX=tX|=GfIpPN-43+O1b$CqY;5d;CXH&d z-l^gwF)1F=?+eenLhz!t-C;0_3YQBibc|s%0s`+i6^JrE5)zWpP;zesslS-iy)W>5 zqXo)`f==MeTf=GH;DVgaryKzObxci(RBOj26XHcg$P0;xpuJ-V1T!qaPbJ%XYd!poUmCtgzhm$!KCyn~p5?FS*Gc!MOIzV4)d%~(kc!yKC z1yyH)c%JV7Aj0JN!1MG38G<&~H^^f%N1Kx=J3A?#$REB+NwK)!p35JM^KFlga+~Ve0s*g#bvuAN4Pzd(mSqlrmv^h2F3w!*ngHWCShS@)IHr0C*-sh z+pagAEFjyP^4;5~f3*qxU`IIrLms0`Q@Y(up$a{?F+4`S_ySL1A&U&taq4+$Ab=g|E>Nb%)5Rh_N~Q7yrg`$^oHdNKJQlR3Rq)FsbNq6@yNry#MiLOf; z-Sy=7N3H~xfkNhvirrybDv<2^(<$XcFAr_}F_{}vFmMd~_q0uu1yfa~;CTT`h^wx^v5$p6x53!o!28mg#(W7EZ!%bh6e7?k~Z7 z+Lm8`Yr1vxtkL@g6oJ8X3?h{n?MiE|-3?94icZ4=VJ^uL=5Wys-u%Lp>0OEr`c@%v0*|YR^7dnN3U(brg+?+h@ub$tq&xOTg+7vi*{o_ zyFYG6tui^m+U$$bANwQz5Hlz%f)p)?77rb#ANa2nH-Ra9cU@qYEB}4IRRMph-!wTgxUa*=?bhNG6 zJu50I0udYq>V0zov?#JRIxo;;sxF6 zS)i0Ld~Ln?$p8MGu@Yxa7Z}PWu@&E(4Y%egKYn$E;d5) z6*?o2T9SI|Y}UVYa}HZ;HeMY}Ytu)?#)^n^k^ITgS_ggp;{h&%91?Ol?thVxpb88O zwBMgW1NMvG4U(T&tHp-MM3)q>aI4U{R4nS)UF5gml}QE72SEFNl24yL9p7xnD7(MY znXQm>xjGbfxs?Xr7Y8?_yqyD5TrY>(l!9a+0$M?5Crn_S)WFKY&Ucu9rn?TJHj?tM8F0TOV$zr%N=~ z!ALl8`RP^|CQxb)Q?<=tXlT+xgQ0WUESj`g*No0)zA4kWcX#)D^DV*QVM+ow1f^8Fbqk!G2axg?zyx|`>L~e25@0Io?gA$S{~J3yJGlPu z#KeNR92VORu@`V~V3Hj8h4yF~wMfvfm%(J@%i22XNiRj$`O$Lt?FG@!d@a3|RS9S} zVF#TsEzxT31E-3C?eX7SOj9p3#z79oNIc^GN=xZcN%%hT@ufzRNix}FwwmPx-`_ep zI>s(F;Mx`guPU_OqL3?N2>_lru-@hCrSvDkVJB7OxdS^RBPE0Nf$i1KXv**3@Aw{@ zm=F=WosL(Y!y(+7xrvNS%QV;@E(G?)6#m#%V9J$A`Pb7EP}*WvGN&zvr>Lly|Ggf4 zXvk7&m)m~lOMfg#J+gZYhV$jyW3`%FvMpvS?(ffRXlVG1*E$ecte4)NasqtxO?~c2 zDPJKWJ)J~Z`=^+=I2itNG+RUaHA3_OM!?(3{ic8E3ID%DR&(c*H8KDJR@;2f2)Qu3 zL3}^uxu4z!`58d;z>$A*a&cUpw|2ETH+ey?)nw2eX3_$y!2zQR{|yX8KOvD^S?vbU z_IS1etE02?`O4~O;78#g@K#ltOdool@88gZejI<43uE!K41x6oMMWVMt8?0{{C(aR zO&RPh=#I~3AqG$!FnBs}xeVE~7OAucQh9mqo}N0vI6BQdt!DfuTshen_^mj3rV&C9 zZZ20cj?S!l)WE{RCpQ-%HI?`&so`=k0}1Eg?zr)JY`shhm)IwC$Ah4*?(VqfaPZ|u zgZLnTpukVu%vCEn9)*#;*I`<0^laZ5&8m05Lp7Vo%V1msi<*EyrQBc8^{pj8OdU zvLu9r|9QSrP}2OP5^C4vuyY!pyYfv7DuBEjmBUm&_NHh<58C}g|1LjrW7E8TTH}al z`{%N*5=}{wE+XJ*Bo5}P5mB{sU5>y(difSNXC9t~eD!K7 zu!Xvh53si+d|pe<&1z-ueXg$sUCzE4>*;;x-N$+}v&hp9>7*vwWt{9QQ_p{qD!r)jd3rfP#L6IwSA-t(IG) zK?+kHkLGA?ExIV#nnl4dR7V`}Fe1$3#G&bv{fjs#vJZ2*r$vD4L z;Lr+7=9fKX^}%&SLL*BJ?{^{&>1P%i9D+eQ&#c?_65Ny@xHsUnqqmp7K8Njg1Y*R; zM=NCmlZ=wj>SA!aew`zeBH`%BhD^|R#0lD&tE##UH97w)IIA-qH!4sWZqCta^%w+T z{P=?COREQ;fq}vC^@;vub%nd@OAsltTrQv;okSa8kR~7xa51y$TJKLKtrqHrG6emV z4ZkXTumex(lWU9vy08qc{PXS|XzG4?K46G6U?kn{ST-Jm&ND47-a3ap?2L?l5dPtR z{Tc^Q1`Tq!V7O3svcF8Py{EMZB9v-{K_Jy5@Hh%hPK@~Mv9j~(awP0kbT^uXAivE9 z0sL}*w$Q8)4EL;eW=?s7MU@wp`_nFeZz)|#u5}zDD=52&)Tf~VAXP-KZ9I=N6WE4y z$+!~WY=@osNH?Ydh+U{-dyY$qs^}DVZ^)xAg6ia z1*qx@OFgr;A)*2o<6En%0+R*b?#~tLpj;@(nts`ahM~jqHiIbB4+3tboiPj8$87LdA75W!&3)ie0Jx;4 zRw)_d`wqPHb#37|{Lx9JDlUi55Z$Aj`xPV$ncpHz_W)9_t>9|DBzUKa@|KM4Sv+KGBN2;~0W-eHKWDf=pBvX_9+eTai0oXL@daa#U2-Rqr1BDHf&fg7}vQTfJZJym1!U#ja${2CPy# zMf@Edm`|4c2pf(`PftkZPxGmFeg%(usegBAY0YA$Oy0i=5~sN&)=w1LTcxcJnZih- zmxrN-YaJ)RJ{Z|7=cK@49}u|T$fojS2zcKDmg%Vz6p#CD2!Ie~Jkc`J%|ifdJO?-+ z!t8Fg(zxD%I%Sx@R;M?Tj7F^@AUW9>OwvmZ33&^^x-;yS6@W=_c!&?6WJbn_r|c)Jg6lN2>^qtz%51yw zdMM@2S2#G<P>KEWUyy6*E7A z7~s{>U&sxpQN5A$U;8uVidYkrpRFALKJEn39B>YKLm({(2h7cvo71g=m9G9cdKRer z_RtfDrDn1hq@kfv>3+u+OQ#tU5y80Z$sYmb~}Jg72qGwT*!z z=JB|X2iY2Fj0EeHh!nVez*w=I%1HoXD2zy+#d0pXGZ?4bavmFaYX-IlA?{rS!<~_T z`}4K_fLh}O{#4s@F;Kw!p2Z81l9IB?0~x?4?o+NihP|5X2pTmlTC^98gTx^%hG z%dFKBT{=#P1NqJWP$zx1C0$-qlcQE?6ir9FI+8(JaHXUW+iEhZ2jGl1RO{|^lN#i5 zCKGv#jgAL;(=nZt; zZz4P0yc+B*VCcZ8#{SmNFU!oQ=^7l)^Z?o|u*Cd9SAB#G1ysWAq3KS(tAKN1CAb-d z?BRM3n4idRZc0i-eSQ7OxOZ>NC^Us*ypX>;y7yb(U@Ku9;+ z47*wA9(RC>=K_t*8J+-pb)fP>qr>0P$2h&M2jfVJW-8Kq%9KUL{u5<7l=&_ zkjR$G@PYc!tpi2BXk~5uK)7ZjQFJu?fu`B@-3*WY){xgb4+vQDFFWibWb@sKeger2 zio9ip;EmLGm)6(Q15*D@``xh^a_PjAv*GUY^70JP@HQAYT$#}h2#HjH=oQK{Up+A$ zfFP{2HN+*8z{~<{95Ae7Aomn_q`wBvB3B5J^kCl}pHYtm%vmy?`jRR3p;ercLLG;=!BVt+oAetm_+F^$ii|@{ihJqhJ!@>$IE=DFNM-K@J zVY$`0fU*Jh3?5`jYjN7>fGT}?a^jz-J{bgN#@ep@<(pJ5f3;aW)Y0*hl$2DfsfU*T z?|Qcaz>z7|Kh`aQH(~{EkJCK|``=tE0P~7e(L?~1v^!Ny5D_u2*6e}>cn&bYmu?{qw(AfH&xj^ORu(lg3j#DfC$s4iX#jXV?=x;Xp8@{T0|Vq0oij7>Pp}Sp z7aJQ3Fef+UXe*^nH4O~?v;%phkgK-M5)VU zz>Jbc@xpcDXn?2e1SYiPlsFMX-G05BoA$%bu5)4{THCWZ^Tahfo$rC%VN`gUmzMt~ zrQhoi`PEgU*U^7GAhq@qA@BiO&5;P_F@Rfs4r1#V9u137FgES=er3?i{Jh=GDcRVV z)ku~o1k9kzdb0zi*0{WcS5ko+QXd)OS;&+a3;j zY!T-M47=r>W;>Puv796ZFaaRw8BH#$Kh8ihLhSOt4$-elUC-ec#_}e#T#--gbZk%t zEfJd#?7VCq9p5AQ>JbFWDqlOJjk%s^fT7=;-T5W_YKu>S0XuDhNz7#Y5+}qN&2S zuuR1}$EqW6CI?C8W8q?OIq9Rov3y#1Ix5cpQ%_hUy;KUf zp?`gD&K4;^L>1X$8E`*$96y*JcWF9b7uhyC7A6cZGo!MHFAb;Zp0uF80F{b-+->I1!Ofw0LAsT|zwczBlt~vGFh~e7 zZz2-T5VQ5t_sJSywr6)ot%_A9@{?e|L`Kr# zDs2r6NP#p-q*&bnm(AiOp!+k_D!1T?jy5I|ff<6lPNGkqVv*i~JnDAhwYhVzP zqIu|D172rl2WT{pVm>tUyT;7}j0Pms1ys{Mh#1Gm$4b(TcNtHd*yTRwLbGc)bn@&m zrqKSX#LY!-bB7T#%Lf3v+}Jmt&=F&(dPPa$W@cuN0c*(P@`w9NjscL0%JsWt8=wxY1MVC2bFTcME0(GQYj(ZDWit4TjL)KXeH`)h!GKdb z?IwW$#*u5Ne(N<`HVB0vp|$}V?j0i$$^DHTkj8}p7gqOU)oVz;y050*c2i~2wbuG5C~aA1QfVIuuU&xF z25{|(!nnWR*z?EFbUrhhDA5e|Mp!o)`-69QNKD9OFGl)IS&n2I8Ja1nu8#lY`08?J z=jKML&2c8Hnj~&gB;Bw4?r&2*T(P)24AWaX0ELzuth=3^oz#TL@A(;}ER)ep10y4| zKkQ0TQ_{0Vkq%C_iN))SK7EpR3QLTp(u-DmBCIG~?zP~?kw$0@6zzM0c z7dYi6=`$|`GCE+YQbF=&y5H(_^1>5#@lzpN0&k-A0(SU0&jaf52!jVecdU+Nes)&A zWFgnU5bNHMS@X28)zOnizAXUo`-%spK-Wogzf?=5FG}XLOGH2=j*N)NIJwETUiNt6 zb*`_SQXKNMm!G4eLPA?&(g2O3XKvmO7TShDuw(po1!J@r}fW zM+>_uqJG|@M5_O5=o_zNGz~z3t*pEX!Dj`1`Wjjs3UmgfQKVD)wvfKeA-2KOkwfFm zd7N}nNWXIKe11$(>0|^ABrA8`zSW?6Y(0V$a>hIP`Y10wQ+2!zt8NUlJ+VbcY-BqX zETzIfGM+W1>HoOK;d=50C%m)FGzW5+M>wn|bQrEb>tv06$Tis6FHZRVj>xjCo0~(# zW1troyWo_tt?Wb}Z!b5XA}{Qy<4?6sa&vsgEUYkLLcICyr4xcR#fPWsSsLq>9u5Qr ztgoDYFf+B?wIs>rTA~S&Ycjrfj183|_?DEb#dtqL;WGoXDIzMJ*TNC!Q!~AAGMkGvQxp-OmEsfQ(7A_>tPU%b`|WX7Nx~l_+x~9y=+6*Q zh}RQp%`iqAN!2izLbWbzAG;i`Q1yL1A%re6`kh_4ne2XOGvfl5N-+q}Gjw0t+oexO zGq4GDmVHoSMzutNGp_j9Bdb4=(f&7~==e%*V>{GRJZ}fLD`-T#4h{vbo7t{vi?LqH zhL|G?i$H&d0BtCfviV2P)dALpCPD8~o^(+H?+atQX9)LRZ6+spxRb|5!aGv;_*=1) z&D$(fLi@(;pE|F3?Qr~tQR1c{$_(u(RpgH>kbl-)=-|5)F8Um2A`KfdsBCgs^EjW)Ek$Nx|&D#UT-XDZ!K zZIeEYd2=UPglyy#oOAuk7cIRf>wTmPaYzc0Oox@GL)6NM9eyz8QQ_iL-@_V@Eh0hY zWo1vdmzH81=JvNx2l^L+aSRLM)Af@s;dmZFcG1HRFNWDU)Kz?vL=(_T-D+sbY(`(i zT5|sFl@fO4QvcFRzk`J@GV;ZL!EPcy?w+tX$%nM(ZmvgX$|9uKRcq94NqIWxlt;9p zYZ*>)f0vCcIbiWFaH-B`)odKS5jClEK=-r;bi=c<)<)~~mfW9-53r3FbUe5J`b{L_ zI7yxF)w#9iw9i=&nRAKh4_yl}++V!3r{}uQ#GAEV`uSj#b4Rj%U_Kdd@MF2cag+Vk zWJo+O-W|UldCG#;NIF^KUf%?h8?K)^^e^xzxYLSMdAQO_aaTxk@Jv2+TVV)?TL-b6hc?l8QJpjOiC^6MihKj`32 zkyB9?e<;EtfyQr}6@;%?QN|KiQU=|IWu|K%P;c?&zQIf-Nbf9p^<7YOFSK8ElRh9n zcyvf!n_#)-uqDc(7154nG^oFEmb>a*fqMmS7t`Go(CZ#wm$uK_s# z?o;I0#>U3)n3&GqD2mV8Ej%E_*xD;??V6tUPxDak{{?qvIwJ=ZZ9$L|&o((@NXF9q z0eUT9G{qP%mXJWrtk~B!##A2XAW$^o=I(xdyH~1KrbBFFbBD`iU*_oO{FL7I^bj>U zog@S5`1EEQ+oiwBME*6v$sZVwT>($&-P}w>Ch5@zu(H$rb@|dd36E0`MVi}J!2Rbb z7h*p=VB{+ZpP^z|KIv-r*N7=x4o?&iARPSvd4pjAS=@lgpOi`MK3S*0M9nQmL{$6I z=xB+@?MOqwRz$(ZMlSnvMgIxB&(3;|)!T`xSDOX;`o02U`}Vjj|D>2off8j?lZzbC zPS)P7do^KV?QSQC~MHHa)7ll+51>rAPUx03G z9^4`Y#wD;paoN8oUeUXR;AcrT{N`$c*b=EKsJ3= z%z2xWlLqKt>QvtTRX|RFpL|14Pd{0Iy+uIJcO!I#*$2>_z{d!=ED`BveyAiOn|+D@ zUXX1@kIdIvx6jStV_;wa-A7!g<6CEd+2FLbhKLCKdRJ(!<@}SjL7bdCSEetD+0w%I zY#^R71tehWn`CJ#Puh=MrVt|7@3sWyTydF}BAX#lJEUh_%4i%MBz5@~WO+2Sn^#eQ z3fW3xYkgob>@)B~jcc9S2D$e=zb+7QIm>>{q5-R0g?fO09pX7;>qoW`Q=ggxJ-!(PzEj<3xGWDt8vq1xQ&af0DfeJctG z)C;o2!P(}ijKjsllh2V-3$?VK2iTrc;ZMNj7EjRq@YT^P+v*sG*ljX!J|2yFApNi< zDd7v&+<-DFij|?4KhhA~nKpi2g{6Z9As2Irr(NHJbMSz_4(AWjMx2|m9IA!J7)0fy zRbEm*X*jIm7vGJ_jSk;^--})qIJKecEf~2^`r@IUjk{~6{%Rh7(gw;Ky+w{%ABW6l z>6YMVfgDB1zbeqh%TSwp7A;4v_FPp@Ba5p>8B0==GW_TaZi#hOzzD_Atm+?R>xHmf z)te|s%WZ_=+h|v}U{~1zQ)aSf?2XWw87Q%(k=$L~z?zQG`;?~-7a>ROn_1`LiuSg{ z6woxRcWcSA+caKivdlIP=z+#=yr>^J<7ne^*kaFmmsUanqVf}hrqV

N-yBJjUGp*O-7og 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

IBZGMcL5bO&++Evnh>0hp2oP({Ga@N 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 !aN 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ⓈwS#VCUyGimNcULn&B-+&ufB~CFvrS$0euvbU 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 z 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 OKQE<}UKC3h2mU`)&gZ89 literal 0 HcmV?d00001 From da2d606a43ac119e91d121b3ce3119316459ca29 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 01:39:56 -0700 Subject: [PATCH 37/47] feat: new docs --- README.md | 130 +-------- surfsense_web/components/Navbar.tsx | 95 ++++--- .../content/docs/docker-installation.mdx | 158 +++++++++++ surfsense_web/content/docs/installation.mdx | 21 ++ .../content/docs/manual-installation.mdx | 258 ++++++++++++++++++ surfsense_web/content/docs/meta.json | 5 +- 6 files changed, 501 insertions(+), 166 deletions(-) create mode 100644 surfsense_web/content/docs/docker-installation.mdx create mode 100644 surfsense_web/content/docs/installation.mdx create mode 100644 surfsense_web/content/docs/manual-installation.mdx diff --git a/README.md b/README.md index 4cb51fa42..7ac8299fb 100644 --- a/README.md +++ b/README.md @@ -72,97 +72,23 @@ Join the [SurfSense Discord](https://discord.gg/ejRNvftDp9) and help shape the f ## How to get started? -### PRE-START CHECKS +### Installation Options -#### PGVector -Make sure pgvector extension is installed on your machine. Setup Guide https://github.com/pgvector/pgvector?tab=readme-ov-file#installation +SurfSense provides two installation methods: -#### File Uploading Support -For File uploading you need Unstructured.io API key. You can get it at http://platform.unstructured.io/ +1. **[Docker Installation (Recommended)](https://www.surfsense.net/docs/docker-installation)** - The easiest way to get SurfSense up and running with all dependencies containerized. -#### Auth -SurfSense now only works with Google OAuth. Make sure to set your OAuth Client at https://developers.google.com/identity/protocols/oauth2 . We need client id and client secret for backend. Make sure to enable people api and add the required scopes under data access (openid, userinfo.email, userinfo.profile) +2. **[Manual Installation](https://www.surfsense.net/docs/manual-installation)** - For users who prefer more control over their setup or need to customize their deployment. -![gauth](https://github.com/user-attachments/assets/80d60fe5-889b-48a6-b947-200fdaf544c1) +Both installation guides include detailed OS-specific instructions for Windows, macOS, and Linux. -#### LLM Observability -One easy way to observe SurfSense Researcher Agent is to use LangSmith. Get its API KEY from https://smith.langchain.com/ +Before installation, make sure to complete the [prerequisite setup steps](https://www.surfsense.net/docs/) including: +- PGVector setup +- Google OAuth configuration +- Unstructured.io API key +- Other required API keys -**Open AI LLMS** -![openai_langraph](https://github.com/user-attachments/assets/b1f4c7a1-0a66-4d21-9053-2e09a5634f95) - - -**Ollama LLMS** -![ollama_langgraph](https://github.com/user-attachments/assets/5b6c870e-095c-4368-86e6-f7488e0fca28) - - -#### Crawler Support -SurfSense currently uses [Firecrawl.py](https://www.firecrawl.dev/) right now. Playwright crawler support will be added soon. - - -## Quick Start - -### Preferred Method: Docker Setup -The recommended way to run SurfSense is using Docker, which ensures consistent environment across different systems. - -1. Make sure you have Docker and Docker Compose installed -2. Follow the detailed instructions in our [Docker Setup Guide](DOCKER_SETUP.md) - -```bash -# Start all services with one command -docker-compose up --build -``` - ---- -### Alternative: Manual Setup - -### Backend (./surfsense_backend) -This is the core of SurfSense. Before we begin let's look at `.env` variables' that we need to successfully setup SurfSense. - -|ENV VARIABLE|DESCRIPTION| -|--|--| -| DATABASE_URL| Your PostgreSQL database connection string. Eg. `postgresql+asyncpg://postgres:postgres@localhost:5432/surfsense`| -| SECRET_KEY| JWT Secret key used for authentication. Should be a secure random string. Eg. `SURFSENSE_SECRET_KEY_123456789`| -| GOOGLE_OAUTH_CLIENT_ID| Google OAuth client ID obtained from Google Cloud Console when setting up OAuth authentication| -| GOOGLE_OAUTH_CLIENT_SECRET| Google OAuth client secret obtained from Google Cloud Console when setting up OAuth authentication| -| NEXT_FRONTEND_URL| URL where your frontend application is hosted. Eg. `http://localhost:3000`| -| EMBEDDING_MODEL| Name of the embedding model to use for vector embeddings. Currently works with Sentence Transformers only. Expect other embeddings soon. Eg. `mixedbread-ai/mxbai-embed-large-v1`| -| RERANKERS_MODEL_NAME| Name of the reranker model for search result reranking. Eg. `ms-marco-MiniLM-L-12-v2`| -| RERANKERS_MODEL_TYPE| Type of reranker model being used. Eg. `flashrank`| -| FAST_LLM| LiteLLM routed Smaller, faster LLM for quick responses. Eg. `openai/gpt-4o-mini`, `ollama/deepseek-r1:8b`| -| STRATEGIC_LLM| LiteLLM routed Advanced LLM for complex reasoning tasks. Eg. `openai/gpt-4o`, `ollama/gemma3:12b`| -| LONG_CONTEXT_LLM| LiteLLM routed LLM capable of handling longer context windows. Eg. `gemini/gemini-2.0-flash`, `ollama/deepseek-r1:8b`| -| UNSTRUCTURED_API_KEY| API key for Unstructured.io service for document parsing| -| FIRECRAWL_API_KEY| API key for Firecrawl service for web crawling and data extraction| - -IMPORTANT: Since LLM calls are routed through LiteLLM make sure to include API keys of LLM models you are using. For example if you used `openai/gpt-4o` make sure to include OpenAI API Key `OPENAI_API_KEY` or if you use `gemini/gemini-2.0-flash` then you include `GEMINI_API_KEY`. - -You can also integrate any LLM just follow this https://docs.litellm.ai/docs/providers - -Now once you have everything let's proceed to run SurfSense. -1. Install `uv` : https://docs.astral.sh/uv/getting-started/installation/ -2. Now just run this command to install dependencies i.e `uv sync` -3. That's it. Now just run the `main.py` file using `uv run main.py`. You can also optionally pass `--reload` as an argument to enable hot reloading. -4. If everything worked fine you should see screen like this. - -![backend](https://i.ibb.co/542Vhqw/backendrunning.png) - ---- - -### FrontEnd (./surfsense_web) - -For local frontend setup just fill out the `.env` file of frontend. - -|ENV VARIABLE|DESCRIPTION| -|--|--| -| NEXT_PUBLIC_FASTAPI_BACKEND_URL | Give hosted backend url here. Eg. `http://localhost:8000`| - -1. Now install dependencies using `pnpm install` -2. Run it using `pnpm run dev` - -You should see your Next.js frontend running at `localhost:3000` - -#### Some FrontEnd Screens +## Screenshots **Search Spaces** @@ -180,43 +106,13 @@ You should see your Next.js frontend running at `localhost:3000` ![chat](https://github.com/user-attachments/assets/bb352d52-1c6d-4020-926b-722d0b98b491) ---- - -### Extension (./surfsense_browser_extension) - -Extension is in plasmo framework which is a cross browser extension framework. Extension main usecase is to save any webpages protected beyond authentication. - -For building extension just fill out the `.env` file of frontend. - -|ENV VARIABLE|DESCRIPTION| -|--|--| -| PLASMO_PUBLIC_BACKEND_URL| SurfSense Backend URL eg. "http://127.0.0.1:8000" | - -Build the extension for your favorite browser using this guide: https://docs.plasmo.com/framework/workflows/build#with-a-specific-target - -When you load and start the extension you should see a Apu page like this +**Browser Extension** ![ext1](https://github.com/user-attachments/assets/1f042b7a-6349-422b-94fb-d40d0df16c40) - - -After filling in your SurfSense API key you should be able to use extension now. - - ![ext2](https://github.com/user-attachments/assets/a9b9f1aa-2677-404d-b0a0-c1b2dddf24a7) - -|Options|Explanations| -|--|--| -| Search Space | Search Space to save your dynamic bookmarks. | -| Clear Inactive History Sessions | It clears the saved content for Inactive Tab Sessions. | -| Save Current Webpage Snapshot | Stores the current webpage session info into SurfSense history store| -| Save to SurfSense | Processes the SurfSense History Store & Initiates a Save Job | - - - - -## Tech Stack +## Tech Stack ### **BackEnd** diff --git a/surfsense_web/components/Navbar.tsx b/surfsense_web/components/Navbar.tsx index 52d187931..eb3555c05 100644 --- a/surfsense_web/components/Navbar.tsx +++ b/surfsense_web/components/Navbar.tsx @@ -24,8 +24,8 @@ interface NavbarProps { export const Navbar = () => { const navItems = [ { - name: "", - link: "/", + name: "Docs", + link: "/docs", }, // { // name: "Product", @@ -118,53 +118,52 @@ const DesktopNav = ({ navItems, visible }: NavbarProps) => { SurfSense

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�_T`+?`3=dEO+3!SY%g-h#Ei2pG## zj-%nMwLg>EmM)Kec$r1aZTI?v5R)N#SiI`f7#OOeObuU;;*4v-TS$bTmN&gGBAFeD>owfqcVG?`FBEh8I9V6)9Y z8+6F<_dFaZOl-c5_ky=lnVrKJnfQG4dDp z>W!~k$B2`h^`U>#E$?(wfq3O1YfQ+w1^W@mKN$1U?xOpNt#i0@pr!G|22j~@dY zmdQm%VSc%PX7qaO7%v4q3MlSW4YPI-drZEc>i)MySKyW*Qpi0@y2 zp3lqAf!2g)-iL+xb>l^0tn}6=1d2O z)sMW~lYJ^Upq*Fr#4_fL3ga2XEpaKOktqII^8QLBvmt6cX}&0KW4cxFX4&6;E6qvF zh{ijh(WuIcU`%pG-o1NLfs;K4S?ulg+6-QRM`Vs3&*V#Tdg4M@*#*(_-@9T>Ozk3u zvKhGEE$M76pOZ>*h5)^Lr_bB}D$4DHumr@FcfrSu9mbF8DmtIDusNO=PQQG>Yx$Qr zJ4f1-=aBnKr1h(R9a?>5YNSPi&bu! zas4${V{tRRN8M4cSsW*=m)bZu+u6#NjUv5~!p?&K>6>hK|F_;<-ea2r(!;;RiJVq) zTK(H7`RE`GrJ$hIYX9xY3v!Ho0FazTNeLlmINNZLgFz04Z6HVwaxlojAP0kd8Ej)f zE+DtbAm@p4o+#&ua-JyXiL!`(QaZ?aqLd190V$<|91Po3kb^-EhHVN+4{|Wb!5{~N zd>P0vAm1%X=^*Ec+i3WI42E?NAs@?#q;+<7szD`_>i8~SFQn+a%pZ80I94P2D@ zi8VoD?|5=oOQ`h9cA3x^@?XKp{Aac=6lx|Ih^+!PCbUef3+~=cFa;8J{lhTUr+{ir zZEb34jxaKF=1DE|uL`p00YL9-!J!%L=+6{n`N4n-FX2CBbf7gpR=@+#tnBosX)Lr| zW@^x4b15J|r?s`!StwMed*dc2Cy9~0ugae6C*@9#t<8 literal 0 HcmV?d00001 diff --git a/surfsense_web/public/docs/langsmith.png b/surfsense_web/public/docs/langsmith.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc7b43e675f8dcc3bba5800d9ed5bf5d1ce6cb3 GIT binary patch literal 308274 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

- - {navItems.map((navItem, idx) => ( - setHoveredIndex(idx)} - className="relative" - > - + + {navItems.map((navItem, idx) => ( + setHoveredIndex(idx)} + className="relative" > - {navItem.name} - {hoveredIndex === idx && ( - - )} - - - ))} - - - - + + + )} ); -}; +}); + +Citation.displayName = 'Citation'; /** * Function to render text with citations diff --git a/surfsense_web/components/markdown-viewer.tsx b/surfsense_web/components/markdown-viewer.tsx index 3cd75434c..1df650114 100644 --- a/surfsense_web/components/markdown-viewer.tsx +++ b/surfsense_web/components/markdown-viewer.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useMemo } from "react"; import ReactMarkdown from "react-markdown"; import rehypeRaw from "rehype-raw"; import rehypeSanitize from "rehype-sanitize"; @@ -14,82 +14,87 @@ interface MarkdownViewerProps { } export function MarkdownViewer({ content, className, getCitationSource }: MarkdownViewerProps) { + // Memoize the markdown components to prevent unnecessary re-renders + const components = useMemo(() => { + return { + // Define custom components for markdown elements + p: ({node, children, ...props}: any) => { + // If there's no getCitationSource function, just render normally + if (!getCitationSource) { + return

{children}

; + } + + // Process citations within paragraph content + return

{processCitationsInReactChildren(children, getCitationSource)}

; + }, + a: ({node, children, ...props}: any) => { + // Process citations within link content if needed + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return {processedChildren}; + }, + li: ({node, children, ...props}: any) => { + // Process citations within list item content + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return
  • {processedChildren}
  • ; + }, + ul: ({node, ...props}: any) =>
      , + ol: ({node, ...props}: any) =>
        , + h1: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

        {processedChildren}

        ; + }, + h2: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

        {processedChildren}

        ; + }, + h3: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

        {processedChildren}

        ; + }, + h4: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

        {processedChildren}

        ; + }, + blockquote: ({node, ...props}: any) =>
        , + hr: ({node, ...props}: any) =>
        , + img: ({node, ...props}: any) => , + table: ({node, ...props}: any) =>
        , + th: ({node, ...props}: any) =>
        , + td: ({node, ...props}: any) => , + code: ({node, className, children, ...props}: any) => { + const match = /language-(\w+)/.exec(className || ''); + const isInline = !match; + return isInline + ? {children} + : ( +
        +
        +                {children}
        +              
        +
        + ); + } + }; + }, [getCitationSource]); + return (
        { - // If there's no getCitationSource function, just render normally - if (!getCitationSource) { - return

        {children}

        ; - } - - // Process citations within paragraph content - return

        {processCitationsInReactChildren(children, getCitationSource)}

        ; - }, - a: ({node, children, ...props}) => { - // Process citations within link content if needed - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return {processedChildren}; - }, - li: ({node, children, ...props}) => { - // Process citations within list item content - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return
      1. {processedChildren}
      2. ; - }, - ul: ({node, ...props}) =>
          , - ol: ({node, ...props}) =>
            , - h1: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

            {processedChildren}

            ; - }, - h2: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

            {processedChildren}

            ; - }, - h3: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

            {processedChildren}

            ; - }, - h4: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

            {processedChildren}

            ; - }, - blockquote: ({node, ...props}) =>
            , - hr: ({node, ...props}) =>
            , - img: ({node, ...props}) => , - table: ({node, ...props}) =>
            , - th: ({node, ...props}) =>
            , - td: ({node, ...props}) => , - code: ({node, className, children, ...props}: any) => { - const match = /language-(\w+)/.exec(className || ''); - const isInline = !match; - return isInline - ? {children} - : ( -
            -
            -                    {children}
            -                  
            -
            - ); - } - }} + components={components} > {content} @@ -98,7 +103,7 @@ export function MarkdownViewer({ content, className, getCitationSource }: Markdo } // Helper function to process citations within React children -function processCitationsInReactChildren(children: React.ReactNode, getCitationSource: (id: number) => Source | null): React.ReactNode { +const processCitationsInReactChildren = (children: React.ReactNode, getCitationSource: (id: number) => Source | null): React.ReactNode => { // If children is not an array or string, just return it if (!children || (typeof children !== 'string' && !Array.isArray(children))) { return children; @@ -120,10 +125,10 @@ function processCitationsInReactChildren(children: React.ReactNode, getCitationS } return children; -} +}; // Process citation references in text content -function processCitationsInText(text: string, getCitationSource: (id: number) => Source | null): React.ReactNode[] { +const processCitationsInText = (text: string, getCitationSource: (id: number) => Source | null): React.ReactNode[] => { // Use improved regex to catch citation numbers more reliably // This will match patterns like [1], [42], etc. including when they appear at the end of a line or sentence const citationRegex = /\[(\d+)\]/g; @@ -131,14 +136,8 @@ function processCitationsInText(text: string, getCitationSource: (id: number) => let lastIndex = 0; let match; let position = 0; - - // Debug log for troubleshooting - console.log("Processing citations in text:", text); while ((match = citationRegex.exec(text)) !== null) { - // Log each match for debugging - console.log("Citation match found:", match[0], "at index", match.index); - // Add text before the citation if (match.index > lastIndex) { parts.push(text.substring(lastIndex, match.index)); @@ -148,9 +147,6 @@ function processCitationsInText(text: string, getCitationSource: (id: number) => const citationId = parseInt(match[1], 10); const source = getCitationSource(citationId); - // Log the citation details - console.log("Citation ID:", citationId, "Source:", source ? "found" : "not found"); - parts.push( } return parts; -} \ No newline at end of file +}; \ No newline at end of file From 602f832399f6193e38451ba60052a1558db56bd1 Mon Sep 17 00:00:00 2001 From: "Exceeds_Lenovo\\rohan" Date: Fri, 25 Apr 2025 15:28:57 -0700 Subject: [PATCH 46/47] feat(ui): performance fixes --- .../researcher/[chat_id]/page.tsx | 135 +++++++------- surfsense_web/components/chat/Citation.tsx | 56 +++--- surfsense_web/components/markdown-viewer.tsx | 166 +++++++++--------- 3 files changed, 184 insertions(+), 173 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx index b10302566..d371e9e53 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx @@ -240,7 +240,7 @@ const SourcesDialogContent = ({ const ChatPage = () => { const [token, setToken] = React.useState(null); const [activeTab, setActiveTab] = useState(""); - const [dialogOpen, setDialogOpen] = useState(false); + const [dialogOpenId, setDialogOpenId] = useState(null); const [sourcesPage, setSourcesPage] = useState(1); const [expandedSources, setExpandedSources] = useState(false); const [canScrollLeft, setCanScrollLeft] = useState(false); @@ -260,6 +260,13 @@ const ChatPage = () => { const { search_space_id, chat_id } = useParams(); + // Function to scroll terminal to bottom + const scrollTerminalToBottom = () => { + if (terminalMessagesRef.current) { + terminalMessagesRef.current.scrollTop = terminalMessagesRef.current.scrollHeight; + } + }; + // Get token from localStorage on client side only React.useEffect(() => { setToken(localStorage.getItem('surfsense_bearer_token')); @@ -469,54 +476,60 @@ const ChatPage = () => { updateChat(); }, [messages, status, chat_id, researchMode, selectedConnectors, search_space_id]); - // Log messages whenever they update and extract annotations from the latest assistant message if available - useEffect(() => { - console.log('Messages updated:', messages); - - // Extract annotations from the latest assistant message if available + // Memoize connector sources to prevent excessive re-renders + const processedConnectorSources = React.useMemo(() => { + if (messages.length === 0) return connectorSources; + + // Only process when we have a complete message (not streaming) + if (status !== 'ready') return connectorSources; + + // Find the latest assistant message const assistantMessages = messages.filter(msg => msg.role === 'assistant'); - if (assistantMessages.length > 0) { - const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; - if (latestAssistantMessage?.annotations) { - const annotations = latestAssistantMessage.annotations as any[]; - - // Debug log to track streaming annotations - if (process.env.NODE_ENV === 'development') { - console.log('Streaming annotations:', annotations); - - // Log counts of each annotation type - const terminalInfoCount = annotations.filter(a => a.type === 'TERMINAL_INFO').length; - const sourcesCount = annotations.filter(a => a.type === 'SOURCES').length; - const answerCount = annotations.filter(a => a.type === 'ANSWER').length; - - console.log(`Annotation counts - Terminal: ${terminalInfoCount}, Sources: ${sourcesCount}, Answer: ${answerCount}`); - } - - // Process SOURCES annotation - get the last one to ensure we have the latest - const sourcesAnnotations = annotations.filter( - (annotation) => annotation.type === 'SOURCES' - ); - - if (sourcesAnnotations.length > 0) { - // Get the last SOURCES annotation to ensure we have the most recent one - const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; - if (latestSourcesAnnotation.content) { - setConnectorSources(latestSourcesAnnotation.content); - } - } - - // Check for terminal info annotations and scroll terminal to bottom if they exist - const terminalInfoAnnotations = annotations.filter( - (annotation) => annotation.type === 'TERMINAL_INFO' - ); - - if (terminalInfoAnnotations.length > 0) { - // Schedule scrolling after the DOM has been updated - setTimeout(scrollTerminalToBottom, 100); - } - } + if (assistantMessages.length === 0) return connectorSources; + + const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; + if (!latestAssistantMessage?.annotations) return connectorSources; + + // Find the latest SOURCES annotation + const annotations = latestAssistantMessage.annotations as any[]; + const sourcesAnnotations = annotations.filter(a => a.type === 'SOURCES'); + + if (sourcesAnnotations.length === 0) return connectorSources; + + const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; + if (!latestSourcesAnnotation.content) return connectorSources; + + // Use this content if it differs from current + return latestSourcesAnnotation.content; + }, [messages, status, connectorSources]); + + // Update connector sources when processed value changes + useEffect(() => { + if (processedConnectorSources !== connectorSources) { + setConnectorSources(processedConnectorSources); } - }, [messages]); + }, [processedConnectorSources, connectorSources]); + + // Check and scroll terminal when terminal info is available + useEffect(() => { + if (messages.length === 0 || status !== 'ready') return; + + // Find the latest assistant message + const assistantMessages = messages.filter(msg => msg.role === 'assistant'); + if (assistantMessages.length === 0) return; + + const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; + if (!latestAssistantMessage?.annotations) return; + + // Check for terminal info annotations + const annotations = latestAssistantMessage.annotations as any[]; + const terminalInfoAnnotations = annotations.filter(a => a.type === 'TERMINAL_INFO'); + + if (terminalInfoAnnotations.length > 0) { + // Schedule scrolling after the DOM has been updated + setTimeout(scrollTerminalToBottom, 100); + } + }, [messages, status]); // Custom handleSubmit function to include selected connectors and answer type const handleSubmit = (e: React.FormEvent) => { @@ -543,24 +556,22 @@ const ChatPage = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; - // Function to scroll terminal to bottom - const scrollTerminalToBottom = () => { - if (terminalMessagesRef.current) { - terminalMessagesRef.current.scrollTop = terminalMessagesRef.current.scrollHeight; - } - }; - // Scroll to bottom when messages change useEffect(() => { scrollToBottom(); }, [messages]); - // Set activeTab when connectorSources change - useEffect(() => { - if (connectorSources.length > 0) { - setActiveTab(connectorSources[0].type); - } + // Set activeTab when connectorSources change using a memoized value + const activeTabValue = React.useMemo(() => { + return connectorSources.length > 0 ? connectorSources[0].type : ""; }, [connectorSources]); + + // Update activeTab when the memoized value changes + useEffect(() => { + if (activeTabValue && activeTabValue !== activeTab) { + setActiveTab(activeTabValue); + } + }, [activeTabValue, activeTab]); // Scroll terminal to bottom when expanded useEffect(() => { @@ -617,7 +628,7 @@ const ChatPage = () => { }; // Function to get a citation source by ID - const getCitationSource = (citationId: number, messageIndex?: number): Source | null => { + const getCitationSource = React.useCallback((citationId: number, messageIndex?: number): Source | null => { if (!messages || messages.length === 0) return null; // If no specific message index is provided, use the latest assistant message @@ -699,7 +710,7 @@ const ChatPage = () => { return foundSource || null; } - }; + }, [messages]); return ( <> @@ -900,7 +911,7 @@ const ChatPage = () => { ))} {connector.sources.length > INITIAL_SOURCES_DISPLAY && ( - setDialogOpen(open)}> + setDialogOpenId(open ? connector.id : null)}> - - - - + + + )} ); -}; +}); + +Citation.displayName = 'Citation'; /** * Function to render text with citations diff --git a/surfsense_web/components/markdown-viewer.tsx b/surfsense_web/components/markdown-viewer.tsx index 3cd75434c..1df650114 100644 --- a/surfsense_web/components/markdown-viewer.tsx +++ b/surfsense_web/components/markdown-viewer.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useMemo } from "react"; import ReactMarkdown from "react-markdown"; import rehypeRaw from "rehype-raw"; import rehypeSanitize from "rehype-sanitize"; @@ -14,82 +14,87 @@ interface MarkdownViewerProps { } export function MarkdownViewer({ content, className, getCitationSource }: MarkdownViewerProps) { + // Memoize the markdown components to prevent unnecessary re-renders + const components = useMemo(() => { + return { + // Define custom components for markdown elements + p: ({node, children, ...props}: any) => { + // If there's no getCitationSource function, just render normally + if (!getCitationSource) { + return

            {children}

            ; + } + + // Process citations within paragraph content + return

            {processCitationsInReactChildren(children, getCitationSource)}

            ; + }, + a: ({node, children, ...props}: any) => { + // Process citations within link content if needed + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return {processedChildren}; + }, + li: ({node, children, ...props}: any) => { + // Process citations within list item content + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return
          1. {processedChildren}
          2. ; + }, + ul: ({node, ...props}: any) =>
              , + ol: ({node, ...props}: any) =>
                , + h1: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

                {processedChildren}

                ; + }, + h2: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

                {processedChildren}

                ; + }, + h3: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

                {processedChildren}

                ; + }, + h4: ({node, children, ...props}: any) => { + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return

                {processedChildren}

                ; + }, + blockquote: ({node, ...props}: any) =>
                , + hr: ({node, ...props}: any) =>
                , + img: ({node, ...props}: any) => , + table: ({node, ...props}: any) =>
                , + th: ({node, ...props}: any) =>
                , + td: ({node, ...props}: any) => , + code: ({node, className, children, ...props}: any) => { + const match = /language-(\w+)/.exec(className || ''); + const isInline = !match; + return isInline + ? {children} + : ( +
                +
                +                {children}
                +              
                +
                + ); + } + }; + }, [getCitationSource]); + return (
                { - // If there's no getCitationSource function, just render normally - if (!getCitationSource) { - return

                {children}

                ; - } - - // Process citations within paragraph content - return

                {processCitationsInReactChildren(children, getCitationSource)}

                ; - }, - a: ({node, children, ...props}) => { - // Process citations within link content if needed - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return {processedChildren}; - }, - li: ({node, children, ...props}) => { - // Process citations within list item content - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return
              1. {processedChildren}
              2. ; - }, - ul: ({node, ...props}) =>
                  , - ol: ({node, ...props}) =>
                    , - h1: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

                    {processedChildren}

                    ; - }, - h2: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

                    {processedChildren}

                    ; - }, - h3: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

                    {processedChildren}

                    ; - }, - h4: ({node, children, ...props}) => { - const processedChildren = getCitationSource - ? processCitationsInReactChildren(children, getCitationSource) - : children; - return

                    {processedChildren}

                    ; - }, - blockquote: ({node, ...props}) =>
                    , - hr: ({node, ...props}) =>
                    , - img: ({node, ...props}) => , - table: ({node, ...props}) =>
                    , - th: ({node, ...props}) =>
                    , - td: ({node, ...props}) => , - code: ({node, className, children, ...props}: any) => { - const match = /language-(\w+)/.exec(className || ''); - const isInline = !match; - return isInline - ? {children} - : ( -
                    -
                    -                    {children}
                    -                  
                    -
                    - ); - } - }} + components={components} > {content} @@ -98,7 +103,7 @@ export function MarkdownViewer({ content, className, getCitationSource }: Markdo } // Helper function to process citations within React children -function processCitationsInReactChildren(children: React.ReactNode, getCitationSource: (id: number) => Source | null): React.ReactNode { +const processCitationsInReactChildren = (children: React.ReactNode, getCitationSource: (id: number) => Source | null): React.ReactNode => { // If children is not an array or string, just return it if (!children || (typeof children !== 'string' && !Array.isArray(children))) { return children; @@ -120,10 +125,10 @@ function processCitationsInReactChildren(children: React.ReactNode, getCitationS } return children; -} +}; // Process citation references in text content -function processCitationsInText(text: string, getCitationSource: (id: number) => Source | null): React.ReactNode[] { +const processCitationsInText = (text: string, getCitationSource: (id: number) => Source | null): React.ReactNode[] => { // Use improved regex to catch citation numbers more reliably // This will match patterns like [1], [42], etc. including when they appear at the end of a line or sentence const citationRegex = /\[(\d+)\]/g; @@ -131,14 +136,8 @@ function processCitationsInText(text: string, getCitationSource: (id: number) => let lastIndex = 0; let match; let position = 0; - - // Debug log for troubleshooting - console.log("Processing citations in text:", text); while ((match = citationRegex.exec(text)) !== null) { - // Log each match for debugging - console.log("Citation match found:", match[0], "at index", match.index); - // Add text before the citation if (match.index > lastIndex) { parts.push(text.substring(lastIndex, match.index)); @@ -148,9 +147,6 @@ function processCitationsInText(text: string, getCitationSource: (id: number) => const citationId = parseInt(match[1], 10); const source = getCitationSource(citationId); - // Log the citation details - console.log("Citation ID:", citationId, "Source:", source ? "found" : "not found"); - parts.push( } return parts; -} \ No newline at end of file +}; \ No newline at end of file From a7389b6d2edd8881061a82685146fca262da8249 Mon Sep 17 00:00:00 2001 From: "Exceeds_Lenovo\\rohan" Date: Fri, 25 Apr 2025 15:44:11 -0700 Subject: [PATCH 47/47] fix(coderabbit): New URL --- surfsense_web/components/chat/Citation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfsense_web/components/chat/Citation.tsx b/surfsense_web/components/chat/Citation.tsx index 1196abc9d..bc07e9b7f 100644 --- a/surfsense_web/components/chat/Citation.tsx +++ b/surfsense_web/components/chat/Citation.tsx @@ -58,7 +58,7 @@ export const Citation = React.memo(({ citationId, citationText, position, source variant="ghost" size="icon" className="h-7 w-7 rounded-full" - onClick={() => window.open(source.url, '_blank')} + onClick={() => window.open(source.url, '_blank', 'noopener,noreferrer')} title="Open in new tab" >
    + + {navItem.name} + {hoveredIndex === idx && ( + + )} + + + ))} + {!visible && ( diff --git a/surfsense_web/content/docs/docker-installation.mdx b/surfsense_web/content/docs/docker-installation.mdx new file mode 100644 index 000000000..66bc36d70 --- /dev/null +++ b/surfsense_web/content/docs/docker-installation.mdx @@ -0,0 +1,158 @@ +--- +title: Docker Installation +description: Setting up SurfSense using Docker (Recommended) +full: true +--- + +# Docker Installation (Recommended) + +This guide explains how to run SurfSense using Docker Compose, which is the preferred and recommended method for deployment. + +## Prerequisites + +Before you begin, ensure you have: + +- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) installed on your machine +- [Git](https://git-scm.com/downloads) (to clone the repository) +- Completed all the [prerequisite setup steps](/docs) including: + - PGVector setup + - Google OAuth configuration + - Unstructured.io API key + - Other required API keys + +## Installation Steps + +1. **Configure Environment Variables** + + Set up the necessary environment variables: + + **Linux/macOS:** + ```bash + # Copy example environment files + cp surfsense_backend/.env.example surfsense_backend/.env + cp surfsense_web/.env.example surfsense_web/.env + ``` + + **Windows (Command Prompt):** + ```cmd + copy surfsense_backend\.env.example surfsense_backend\.env + copy surfsense_web\.env.example surfsense_web\.env + ``` + + **Windows (PowerShell):** + ```powershell + Copy-Item -Path surfsense_backend\.env.example -Destination surfsense_backend\.env + Copy-Item -Path surfsense_web\.env.example -Destination surfsense_web\.env + ``` + + Edit both `.env` files and fill in the required values: + + **Backend Environment Variables:** + + | ENV VARIABLE | DESCRIPTION | + |--------------|-------------| + | DATABASE_URL | PostgreSQL connection string (e.g., `postgresql+asyncpg://postgres:postgres@localhost:5432/surfsense`) | + | SECRET_KEY | JWT Secret key for authentication (should be a secure random string) | + | GOOGLE_OAUTH_CLIENT_ID | Google OAuth client ID obtained from Google Cloud Console | + | GOOGLE_OAUTH_CLIENT_SECRET | Google OAuth client secret obtained from Google Cloud Console | + | NEXT_FRONTEND_URL | URL where your frontend application is hosted (e.g., `http://localhost:3000`) | + | EMBEDDING_MODEL | Name of the embedding model (e.g., `mixedbread-ai/mxbai-embed-large-v1`) | + | RERANKERS_MODEL_NAME | Name of the reranker model (e.g., `ms-marco-MiniLM-L-12-v2`) | + | RERANKERS_MODEL_TYPE | Type of reranker model (e.g., `flashrank`) | + | FAST_LLM | LiteLLM routed smaller, faster LLM (e.g., `openai/gpt-4o-mini`, `ollama/deepseek-r1:8b`) | + | STRATEGIC_LLM | LiteLLM routed advanced LLM for complex tasks (e.g., `openai/gpt-4o`, `ollama/gemma3:12b`) | + | LONG_CONTEXT_LLM | LiteLLM routed LLM for longer context windows (e.g., `gemini/gemini-2.0-flash`, `ollama/deepseek-r1:8b`) | + | UNSTRUCTURED_API_KEY | API key for Unstructured.io service for document parsing | + | FIRECRAWL_API_KEY | API key for Firecrawl service for web crawling | + + Include API keys for the LLM providers you're using. For example: + - `OPENAI_API_KEY`: If using OpenAI models + - `GEMINI_API_KEY`: If using Google Gemini models + + For other LLM providers, refer to the [LiteLLM documentation](https://docs.litellm.ai/docs/providers). + + **Frontend Environment Variables:** + + | ENV VARIABLE | DESCRIPTION | + |--------------|-------------| + | NEXT_PUBLIC_FASTAPI_BACKEND_URL | URL of the backend service (e.g., `http://localhost:8000`) | + +2. **Build and Start Containers** + + Start the Docker containers: + + **Linux/macOS/Windows:** + ```bash + docker-compose up --build + ``` + + To run in detached mode (in the background): + + **Linux/macOS/Windows:** + ```bash + docker-compose up -d + ``` + + **Note for Windows users:** If you're using older Docker Desktop versions, you might need to use `docker compose` (with a space) instead of `docker-compose`. + +3. **Access the Applications** + + Once the containers are running, you can access: + - Frontend: [http://localhost:3000](http://localhost:3000) + - Backend API: [http://localhost:8000](http://localhost:8000) + - API Documentation: [http://localhost:8000/docs](http://localhost:8000/docs) + +## Useful Docker Commands + +### Container Management + +- **Stop containers:** + + **Linux/macOS/Windows:** + ```bash + docker-compose down + ``` + +- **View logs:** + + **Linux/macOS/Windows:** + ```bash + # All services + docker-compose logs -f + + # Specific service + docker-compose logs -f backend + docker-compose logs -f frontend + docker-compose logs -f db + ``` + +- **Restart a specific service:** + + **Linux/macOS/Windows:** + ```bash + docker-compose restart backend + ``` + +- **Execute commands in a running container:** + + **Linux/macOS/Windows:** + ```bash + # Backend + docker-compose exec backend python -m pytest + + # Frontend + docker-compose exec frontend pnpm lint + ``` + +## Troubleshooting + +- **Linux/macOS:** If you encounter permission errors, you may need to run the docker commands with `sudo`. +- **Windows:** If you see access denied errors, make sure you're running Command Prompt or PowerShell as Administrator. +- If ports are already in use, modify the port mappings in the `docker-compose.yml` file. +- For backend dependency issues, check the `Dockerfile` in the backend directory. +- For frontend dependency issues, check the `Dockerfile` in the frontend directory. +- **Windows-specific:** If you encounter line ending issues (CRLF vs LF), configure Git to handle line endings properly with `git config --global core.autocrlf true` before cloning the repository. + +## Next Steps + +Once your installation is complete, you can start using SurfSense! Navigate to the frontend URL and log in using your Google account. \ No newline at end of file diff --git a/surfsense_web/content/docs/installation.mdx b/surfsense_web/content/docs/installation.mdx new file mode 100644 index 000000000..684d6b7a0 --- /dev/null +++ b/surfsense_web/content/docs/installation.mdx @@ -0,0 +1,21 @@ +--- +title: Installation +description: Current ways to use SurfSense +full: true +--- + +# Installing SurfSense + +There are two ways to install and use SurfSense: + +## Docker Installation (Preferred) + +The recommended way to install SurfSense is using Docker. This method provides a containerized environment with all dependencies pre-configured. + +[Learn more about Docker installation](/docs/docker-installation) + +## Manual Installation + +For users who prefer more control over the installation process or need to customize their setup, we also provide manual installation instructions. + +[Learn more about Manual installation](/docs/manual-installation) \ No newline at end of file diff --git a/surfsense_web/content/docs/manual-installation.mdx b/surfsense_web/content/docs/manual-installation.mdx new file mode 100644 index 000000000..561e8d7b8 --- /dev/null +++ b/surfsense_web/content/docs/manual-installation.mdx @@ -0,0 +1,258 @@ +--- +title: Manual Installation +description: Setting up SurfSense manually for customized deployments +full: true +--- + +# Manual Installation + +This guide provides step-by-step instructions for setting up SurfSense without Docker. This approach gives you more control over the installation process and allows for customization of the environment. + +## Prerequisites + +Before beginning the manual installation, ensure you have completed all the [prerequisite setup steps](/docs), including: + +- PGVector installation +- Google OAuth setup +- Unstructured.io API key +- LLM observability (optional) +- Crawler setup (if needed) + +## Backend Setup + +The backend is the core of SurfSense. Follow these steps to set it up: + +### 1. Environment Configuration + +First, create and configure your environment variables by copying the example file: + +**Linux/macOS:** +```bash +cd surfsense_backend +cp .env.example .env +``` + +**Windows (Command Prompt):** +```cmd +cd surfsense_backend +copy .env.example .env +``` + +**Windows (PowerShell):** +```powershell +cd surfsense_backend +Copy-Item -Path .env.example -Destination .env +``` + +Edit the `.env` file and set the following variables: + +| ENV VARIABLE | DESCRIPTION | +|--------------|-------------| +| DATABASE_URL | PostgreSQL connection string (e.g., `postgresql+asyncpg://postgres:postgres@localhost:5432/surfsense`) | +| SECRET_KEY | JWT Secret key for authentication (should be a secure random string) | +| GOOGLE_OAUTH_CLIENT_ID | Google OAuth client ID | +| GOOGLE_OAUTH_CLIENT_SECRET | Google OAuth client secret | +| NEXT_FRONTEND_URL | Frontend application URL (e.g., `http://localhost:3000`) | +| EMBEDDING_MODEL | Name of the embedding model (e.g., `mixedbread-ai/mxbai-embed-large-v1`) | +| RERANKERS_MODEL_NAME | Name of the reranker model (e.g., `ms-marco-MiniLM-L-12-v2`) | +| RERANKERS_MODEL_TYPE | Type of reranker model (e.g., `flashrank`) | +| FAST_LLM | LiteLLM routed faster LLM (e.g., `openai/gpt-4o-mini`, `ollama/deepseek-r1:8b`) | +| STRATEGIC_LLM | LiteLLM routed advanced LLM (e.g., `openai/gpt-4o`, `ollama/gemma3:12b`) | +| LONG_CONTEXT_LLM | LiteLLM routed long-context LLM (e.g., `gemini/gemini-2.0-flash`, `ollama/deepseek-r1:8b`) | +| UNSTRUCTURED_API_KEY | API key for Unstructured.io service | +| FIRECRAWL_API_KEY | API key for Firecrawl service (if using crawler) | + +**Important**: Since LLM calls are routed through LiteLLM, include API keys for the LLM providers you're using: +- For OpenAI models: `OPENAI_API_KEY` +- For Google Gemini models: `GEMINI_API_KEY` +- For other providers, refer to the [LiteLLM documentation](https://docs.litellm.ai/docs/providers) + +### 2. Install Dependencies + +Install the backend dependencies using `uv`: + +**Linux/macOS:** +```bash +# Install uv if you don't have it +curl -fsSL https://astral.sh/uv/install.sh | bash + +# Install dependencies +uv sync +``` + +**Windows (PowerShell):** +```powershell +# Install uv if you don't have it +iwr -useb https://astral.sh/uv/install.ps1 | iex + +# Install dependencies +uv sync +``` + +**Windows (Command Prompt):** +```cmd +# Install dependencies with uv (after installing uv) +uv sync +``` + +### 3. Run the Backend + +Start the backend server: + +**Linux/macOS/Windows:** +```bash +# Run without hot reloading +uv run main.py + +# Or with hot reloading for development +uv run main.py --reload +``` + +If everything is set up correctly, you should see output indicating the server is running on `http://localhost:8000`. + +## Frontend Setup + +### 1. Environment Configuration + +Set up the frontend environment: + +**Linux/macOS:** +```bash +cd surfsense_web +cp .env.example .env +``` + +**Windows (Command Prompt):** +```cmd +cd surfsense_web +copy .env.example .env +``` + +**Windows (PowerShell):** +```powershell +cd surfsense_web +Copy-Item -Path .env.example -Destination .env +``` + +Edit the `.env` file and set: + +| ENV VARIABLE | DESCRIPTION | +|--------------|-------------| +| NEXT_PUBLIC_FASTAPI_BACKEND_URL | Backend URL (e.g., `http://localhost:8000`) | + +### 2. Install Dependencies + +Install the frontend dependencies: + +**Linux/macOS:** +```bash +# Install pnpm if you don't have it +npm install -g pnpm + +# Install dependencies +pnpm install +``` + +**Windows:** +```powershell +# Install pnpm if you don't have it +npm install -g pnpm + +# Install dependencies +pnpm install +``` + +### 3. Run the Frontend + +Start the Next.js development server: + +**Linux/macOS/Windows:** +```bash +pnpm run dev +``` + +The frontend should now be running at `http://localhost:3000`. + +## Browser Extension Setup (Optional) + +The SurfSense browser extension allows you to save any webpage, including those protected behind authentication. + +### 1. Environment Configuration + +**Linux/macOS:** +```bash +cd surfsense_browser_extension +cp .env.example .env +``` + +**Windows (Command Prompt):** +```cmd +cd surfsense_browser_extension +copy .env.example .env +``` + +**Windows (PowerShell):** +```powershell +cd surfsense_browser_extension +Copy-Item -Path .env.example -Destination .env +``` + +Edit the `.env` file: + +| ENV VARIABLE | DESCRIPTION | +|--------------|-------------| +| PLASMO_PUBLIC_BACKEND_URL | SurfSense Backend URL (e.g., `http://127.0.0.1:8000`) | + +### 2. Build the Extension + +Build the extension for your browser using the [Plasmo framework](https://docs.plasmo.com/framework/workflows/build#with-a-specific-target). + +**Linux/macOS/Windows:** +```bash +# Install dependencies +pnpm install + +# Build for Chrome (default) +pnpm build + +# Or for other browsers +pnpm build --target=firefox +pnpm build --target=edge +``` + +### 3. Load the Extension + +Load the extension in your browser's developer mode and configure it with your SurfSense API key. + +## Verification + +To verify your installation: + +1. Open your browser and navigate to `http://localhost:3000` +2. Sign in with your Google account +3. Create a search space and try uploading a document +4. Test the chat functionality with your uploaded content + +## Troubleshooting + +- **Database Connection Issues**: Verify your PostgreSQL server is running and pgvector is properly installed +- **Authentication Problems**: Check your Google OAuth configuration and ensure redirect URIs are set correctly +- **LLM Errors**: Confirm your LLM API keys are valid and the selected models are accessible +- **File Upload Failures**: Validate your Unstructured.io API key +- **Windows-specific**: If you encounter path issues, ensure you're using the correct path separator (`\` instead of `/`) +- **macOS-specific**: If you encounter permission issues, you may need to use `sudo` for some installation commands + +## Next Steps + +Now that you have SurfSense running locally, you can explore its features: + +- Create search spaces for organizing your content +- Upload documents or use the browser extension to save webpages +- Ask questions about your saved content +- Explore the advanced RAG capabilities + +For production deployments, consider setting up: +- A reverse proxy like Nginx +- SSL certificates for secure connections +- Proper database backups +- User access controls \ No newline at end of file diff --git a/surfsense_web/content/docs/meta.json b/surfsense_web/content/docs/meta.json index e5bb280a4..27ce8b62f 100644 --- a/surfsense_web/content/docs/meta.json +++ b/surfsense_web/content/docs/meta.json @@ -4,6 +4,9 @@ "root": true, "pages": [ "---Setup---", - "index" + "index", + "installation", + "docker-installation", + "manual-installation" ] } \ No newline at end of file From bfbe2700319ba99cf725c203ea536f424f4630a9 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 13:40:30 -0700 Subject: [PATCH 38/47] chore: update ModernHeroWithGradients to link to documentation and modify installation instructions --- surfsense_web/components/ModernHeroWithGradients.tsx | 8 ++++---- surfsense_web/content/docs/installation.mdx | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/surfsense_web/components/ModernHeroWithGradients.tsx b/surfsense_web/components/ModernHeroWithGradients.tsx index 5bdf4e677..052c993da 100644 --- a/surfsense_web/components/ModernHeroWithGradients.tsx +++ b/surfsense_web/components/ModernHeroWithGradients.tsx @@ -1,6 +1,6 @@ "use client"; import { cn } from "@/lib/utils"; -import { IconArrowRight, IconBrandGithub, IconBrandDiscord } from "@tabler/icons-react"; +import { IconFileTypeDoc, IconBrandGithub, IconBrandDiscord } from "@tabler/icons-react"; import Link from "next/link"; import React from "react"; import { motion } from "framer-motion"; @@ -20,11 +20,11 @@ export function ModernHeroWithGradients() {
    - SurfSense v0.0.6 Released - + + Documentation {/* Import the Logo component or define it in this file */}
    diff --git a/surfsense_web/content/docs/installation.mdx b/surfsense_web/content/docs/installation.mdx index 684d6b7a0..dbb6e5278 100644 --- a/surfsense_web/content/docs/installation.mdx +++ b/surfsense_web/content/docs/installation.mdx @@ -6,10 +6,11 @@ full: true # Installing SurfSense -There are two ways to install and use SurfSense: +There are two ways to install SurfSense, but both require the repository to be cloned first. Clone [SurfSense](https://github.com/MODSetter/SurfSense) and then: ## Docker Installation (Preferred) + The recommended way to install SurfSense is using Docker. This method provides a containerized environment with all dependencies pre-configured. [Learn more about Docker installation](/docs/docker-installation) From 13d143467bbdd77dbe94194768549a51170e9741 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 18:22:45 -0700 Subject: [PATCH 39/47] fix: update Dockerfile to handle fumadocs-mdx postinstall error by copying config and content before installation --- surfsense_web/Dockerfile | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/surfsense_web/Dockerfile b/surfsense_web/Dockerfile index 2ce0b0f4d..4b3c97af8 100644 --- a/surfsense_web/Dockerfile +++ b/surfsense_web/Dockerfile @@ -8,8 +8,15 @@ RUN npm install -g pnpm # Copy package files COPY package.json pnpm-lock.yaml ./ -# Install dependencies -RUN pnpm install +# First copy the config file to avoid fumadocs-mdx postinstall error +COPY source.config.ts ./ +COPY content ./content + +# Install dependencies with --ignore-scripts to skip postinstall +RUN pnpm install --ignore-scripts + +# Now run the postinstall script manually +RUN pnpm fumadocs-mdx # Copy source code COPY . . From 581ae894375fc9f7d12fe5da85fcaf1eded923a5 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 18:23:11 -0700 Subject: [PATCH 40/47] fix: update Dockerfile to handle fumadocs-mdx postinstall error by copying config and content before installation --- surfsense_web/Dockerfile | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/surfsense_web/Dockerfile b/surfsense_web/Dockerfile index 2ce0b0f4d..4b3c97af8 100644 --- a/surfsense_web/Dockerfile +++ b/surfsense_web/Dockerfile @@ -8,8 +8,15 @@ RUN npm install -g pnpm # Copy package files COPY package.json pnpm-lock.yaml ./ -# Install dependencies -RUN pnpm install +# First copy the config file to avoid fumadocs-mdx postinstall error +COPY source.config.ts ./ +COPY content ./content + +# Install dependencies with --ignore-scripts to skip postinstall +RUN pnpm install --ignore-scripts + +# Now run the postinstall script manually +RUN pnpm fumadocs-mdx # Copy source code COPY . . From ab2ffbb42b64e401bf4a5262f7f49e9e9188e4b1 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 19:50:39 -0700 Subject: [PATCH 41/47] fix: docs --- README.md | 4 ++-- surfsense_web/content/docs/docker-installation.mdx | 14 ++++++++++++-- surfsense_web/content/docs/installation.mdx | 7 +++---- surfsense_web/content/docs/manual-installation.mdx | 4 ++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7ac8299fb..e412fe2be 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,9 @@ Join the [SurfSense Discord](https://discord.gg/ejRNvftDp9) and help shape the f SurfSense provides two installation methods: -1. **[Docker Installation (Recommended)](https://www.surfsense.net/docs/docker-installation)** - The easiest way to get SurfSense up and running with all dependencies containerized. +1. **[Docker Installation](https://www.surfsense.net/docs/docker-installation)** - The easiest way to get SurfSense up and running with all dependencies containerized. Less Customization. -2. **[Manual Installation](https://www.surfsense.net/docs/manual-installation)** - For users who prefer more control over their setup or need to customize their deployment. +2. **[Manual Installation (Recommended)](https://www.surfsense.net/docs/manual-installation)** - For users who prefer more control over their setup or need to customize their deployment. Both installation guides include detailed OS-specific instructions for Windows, macOS, and Linux. diff --git a/surfsense_web/content/docs/docker-installation.mdx b/surfsense_web/content/docs/docker-installation.mdx index 66bc36d70..2a373d048 100644 --- a/surfsense_web/content/docs/docker-installation.mdx +++ b/surfsense_web/content/docs/docker-installation.mdx @@ -1,10 +1,19 @@ --- title: Docker Installation -description: Setting up SurfSense using Docker (Recommended) +description: Setting up SurfSense using Docker full: true --- +## Known Limitations -# Docker Installation (Recommended) +⚠️ **Important Note:** Currently, the following features have limited functionality when running in Docker: + +- **Ollama integration:** Local Ollama models do not work when running SurfSense in Docker. Please use other LLM providers like OpenAI or Gemini instead. +- **Web crawler functionality:** The web crawler feature currently doesn't work properly within the Docker environment. + +We're actively working to resolve these limitations in future releases. + + +# Docker Installation This guide explains how to run SurfSense using Docker Compose, which is the preferred and recommended method for deployment. @@ -153,6 +162,7 @@ Before you begin, ensure you have: - For frontend dependency issues, check the `Dockerfile` in the frontend directory. - **Windows-specific:** If you encounter line ending issues (CRLF vs LF), configure Git to handle line endings properly with `git config --global core.autocrlf true` before cloning the repository. + ## Next Steps Once your installation is complete, you can start using SurfSense! Navigate to the frontend URL and log in using your Google account. \ No newline at end of file diff --git a/surfsense_web/content/docs/installation.mdx b/surfsense_web/content/docs/installation.mdx index dbb6e5278..1a3f4553b 100644 --- a/surfsense_web/content/docs/installation.mdx +++ b/surfsense_web/content/docs/installation.mdx @@ -8,14 +8,13 @@ full: true There are two ways to install SurfSense, but both require the repository to be cloned first. Clone [SurfSense](https://github.com/MODSetter/SurfSense) and then: -## Docker Installation (Preferred) +## Docker Installation - -The recommended way to install SurfSense is using Docker. This method provides a containerized environment with all dependencies pre-configured. +This method provides a containerized environment with all dependencies pre-configured. Less Customization. [Learn more about Docker installation](/docs/docker-installation) -## Manual Installation +## Manual Installation (Preferred) For users who prefer more control over the installation process or need to customize their setup, we also provide manual installation instructions. diff --git a/surfsense_web/content/docs/manual-installation.mdx b/surfsense_web/content/docs/manual-installation.mdx index 561e8d7b8..477f5ef17 100644 --- a/surfsense_web/content/docs/manual-installation.mdx +++ b/surfsense_web/content/docs/manual-installation.mdx @@ -1,10 +1,10 @@ --- title: Manual Installation -description: Setting up SurfSense manually for customized deployments +description: Setting up SurfSense manually for customized deployments (Preferred) full: true --- -# Manual Installation +# Manual Installation (Preferred) This guide provides step-by-step instructions for setting up SurfSense without Docker. This approach gives you more control over the installation process and allows for customization of the environment. From 6669b16d87909622b0de88c950a033605f78950b Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 19:51:31 -0700 Subject: [PATCH 42/47] fix: docs --- README.md | 4 ++-- surfsense_web/content/docs/docker-installation.mdx | 14 ++++++++++++-- surfsense_web/content/docs/installation.mdx | 7 +++---- surfsense_web/content/docs/manual-installation.mdx | 4 ++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7ac8299fb..e412fe2be 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,9 @@ Join the [SurfSense Discord](https://discord.gg/ejRNvftDp9) and help shape the f SurfSense provides two installation methods: -1. **[Docker Installation (Recommended)](https://www.surfsense.net/docs/docker-installation)** - The easiest way to get SurfSense up and running with all dependencies containerized. +1. **[Docker Installation](https://www.surfsense.net/docs/docker-installation)** - The easiest way to get SurfSense up and running with all dependencies containerized. Less Customization. -2. **[Manual Installation](https://www.surfsense.net/docs/manual-installation)** - For users who prefer more control over their setup or need to customize their deployment. +2. **[Manual Installation (Recommended)](https://www.surfsense.net/docs/manual-installation)** - For users who prefer more control over their setup or need to customize their deployment. Both installation guides include detailed OS-specific instructions for Windows, macOS, and Linux. diff --git a/surfsense_web/content/docs/docker-installation.mdx b/surfsense_web/content/docs/docker-installation.mdx index 66bc36d70..2a373d048 100644 --- a/surfsense_web/content/docs/docker-installation.mdx +++ b/surfsense_web/content/docs/docker-installation.mdx @@ -1,10 +1,19 @@ --- title: Docker Installation -description: Setting up SurfSense using Docker (Recommended) +description: Setting up SurfSense using Docker full: true --- +## Known Limitations -# Docker Installation (Recommended) +⚠️ **Important Note:** Currently, the following features have limited functionality when running in Docker: + +- **Ollama integration:** Local Ollama models do not work when running SurfSense in Docker. Please use other LLM providers like OpenAI or Gemini instead. +- **Web crawler functionality:** The web crawler feature currently doesn't work properly within the Docker environment. + +We're actively working to resolve these limitations in future releases. + + +# Docker Installation This guide explains how to run SurfSense using Docker Compose, which is the preferred and recommended method for deployment. @@ -153,6 +162,7 @@ Before you begin, ensure you have: - For frontend dependency issues, check the `Dockerfile` in the frontend directory. - **Windows-specific:** If you encounter line ending issues (CRLF vs LF), configure Git to handle line endings properly with `git config --global core.autocrlf true` before cloning the repository. + ## Next Steps Once your installation is complete, you can start using SurfSense! Navigate to the frontend URL and log in using your Google account. \ No newline at end of file diff --git a/surfsense_web/content/docs/installation.mdx b/surfsense_web/content/docs/installation.mdx index dbb6e5278..1a3f4553b 100644 --- a/surfsense_web/content/docs/installation.mdx +++ b/surfsense_web/content/docs/installation.mdx @@ -8,14 +8,13 @@ full: true There are two ways to install SurfSense, but both require the repository to be cloned first. Clone [SurfSense](https://github.com/MODSetter/SurfSense) and then: -## Docker Installation (Preferred) +## Docker Installation - -The recommended way to install SurfSense is using Docker. This method provides a containerized environment with all dependencies pre-configured. +This method provides a containerized environment with all dependencies pre-configured. Less Customization. [Learn more about Docker installation](/docs/docker-installation) -## Manual Installation +## Manual Installation (Preferred) For users who prefer more control over the installation process or need to customize their setup, we also provide manual installation instructions. diff --git a/surfsense_web/content/docs/manual-installation.mdx b/surfsense_web/content/docs/manual-installation.mdx index 561e8d7b8..477f5ef17 100644 --- a/surfsense_web/content/docs/manual-installation.mdx +++ b/surfsense_web/content/docs/manual-installation.mdx @@ -1,10 +1,10 @@ --- title: Manual Installation -description: Setting up SurfSense manually for customized deployments +description: Setting up SurfSense manually for customized deployments (Preferred) full: true --- -# Manual Installation +# Manual Installation (Preferred) This guide provides step-by-step instructions for setting up SurfSense without Docker. This approach gives you more control over the installation process and allows for customization of the environment. From 8cf736458a2a5967bc3c52ff7ac96e5ce7f8f7c3 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Thu, 24 Apr 2025 23:45:50 -0700 Subject: [PATCH 43/47] fix: list citations in markdown --- surfsense_web/components/markdown-viewer.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/surfsense_web/components/markdown-viewer.tsx b/surfsense_web/components/markdown-viewer.tsx index 03fe7bada..3cd75434c 100644 --- a/surfsense_web/components/markdown-viewer.tsx +++ b/surfsense_web/components/markdown-viewer.tsx @@ -37,6 +37,13 @@ export function MarkdownViewer({ content, className, getCitationSource }: Markdo : children; return {processedChildren}; }, + li: ({node, children, ...props}) => { + // Process citations within list item content + const processedChildren = getCitationSource + ? processCitationsInReactChildren(children, getCitationSource) + : children; + return
  • {processedChildren}
  • ; + }, ul: ({node, ...props}) =>
      , ol: ({node, ...props}) =>
        , h1: ({node, children, ...props}) => { From 91936b0b28b9553f4a13b4ed4f52d394a7053cc3 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Fri, 25 Apr 2025 00:19:45 -0700 Subject: [PATCH 44/47] fix: wrong citation mapping --- .../researcher/[chat_id]/page.tsx | 117 ++++++++++++------ 1 file changed, 82 insertions(+), 35 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx index 8156f6d2a..b10302566 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx @@ -617,48 +617,88 @@ const ChatPage = () => { }; // Function to get a citation source by ID - const getCitationSource = (citationId: number): Source | null => { + const getCitationSource = (citationId: number, messageIndex?: number): Source | null => { if (!messages || messages.length === 0) return null; - // Find the latest assistant message - const assistantMessages = messages.filter(msg => msg.role === 'assistant'); - if (assistantMessages.length === 0) return null; + // If no specific message index is provided, use the latest assistant message + if (messageIndex === undefined) { + // Find the latest assistant message + const assistantMessages = messages.filter(msg => msg.role === 'assistant'); + if (assistantMessages.length === 0) return null; - const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; - if (!latestAssistantMessage?.annotations) return null; + const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; + if (!latestAssistantMessage?.annotations) return null; - // Find all SOURCES annotations - const annotations = latestAssistantMessage.annotations as any[]; - const sourcesAnnotations = annotations.filter( - (annotation) => annotation.type === 'SOURCES' - ); + // Find all SOURCES annotations + const annotations = latestAssistantMessage.annotations as any[]; + const sourcesAnnotations = annotations.filter( + (annotation) => annotation.type === 'SOURCES' + ); - // Get the latest SOURCES annotation - if (sourcesAnnotations.length === 0) return null; - const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; + // Get the latest SOURCES annotation + if (sourcesAnnotations.length === 0) return null; + const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; - if (!latestSourcesAnnotation.content) return null; + if (!latestSourcesAnnotation.content) return null; - // Flatten all sources from all connectors - const allSources: Source[] = []; - latestSourcesAnnotation.content.forEach((connector: ConnectorSource) => { - if (connector.sources && Array.isArray(connector.sources)) { - connector.sources.forEach((source: SourceItem) => { - allSources.push({ - id: source.id, - title: source.title, - description: source.description, - url: source.url, - connectorType: connector.type + // Flatten all sources from all connectors + const allSources: Source[] = []; + latestSourcesAnnotation.content.forEach((connector: ConnectorSource) => { + if (connector.sources && Array.isArray(connector.sources)) { + connector.sources.forEach((source: SourceItem) => { + allSources.push({ + id: source.id, + title: source.title, + description: source.description, + url: source.url, + connectorType: connector.type + }); }); - }); - } - }); + } + }); - // Find the source with the matching ID - const foundSource = allSources.find(source => source.id === citationId); + // Find the source with the matching ID + const foundSource = allSources.find(source => source.id === citationId); - return foundSource || null; + return foundSource || null; + } else { + // Use the specific message by index + const message = messages[messageIndex]; + if (!message || message.role !== 'assistant' || !message.annotations) return null; + + // Find all SOURCES annotations + const annotations = message.annotations as any[]; + const sourcesAnnotations = annotations.filter( + (annotation) => annotation.type === 'SOURCES' + ); + + // Get the latest SOURCES annotation + if (sourcesAnnotations.length === 0) return null; + const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; + + if (!latestSourcesAnnotation.content) return null; + + // Flatten all sources from all connectors + const allSources: Source[] = []; + latestSourcesAnnotation.content.forEach((connector: ConnectorSource) => { + if (connector.sources && Array.isArray(connector.sources)) { + connector.sources.forEach((source: SourceItem) => { + allSources.push({ + id: source.id, + title: source.title, + description: source.description, + url: source.url, + connectorType: connector.type + }); + }); + } + }); + + // Find the source with the matching ID + const foundSource = allSources.find(source => source.id === citationId); + + return foundSource || null; + } }; return ( @@ -685,7 +725,11 @@ const ChatPage = () => {
        - + getCitationSource(id, index)} + className="text-sm" + />
        @@ -901,13 +945,16 @@ const ChatPage = () => { return ( getCitationSource(id, index)} /> ); } // Fallback to the message content if no ANSWER annotation is available - return ; + return getCitationSource(id, index)} + />; })()}
    } From 8563564275c38ad169e5a41191b2bb60bc0f4576 Mon Sep 17 00:00:00 2001 From: "Exceeds_Lenovo\\rohan" Date: Fri, 25 Apr 2025 15:28:13 -0700 Subject: [PATCH 45/47] feat(ui): performance fixes --- .../researcher/[chat_id]/page.tsx | 135 +++++++------- surfsense_web/components/chat/Citation.tsx | 56 +++--- surfsense_web/components/markdown-viewer.tsx | 166 +++++++++--------- 3 files changed, 184 insertions(+), 173 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx index b10302566..d371e9e53 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/researcher/[chat_id]/page.tsx @@ -240,7 +240,7 @@ const SourcesDialogContent = ({ const ChatPage = () => { const [token, setToken] = React.useState(null); const [activeTab, setActiveTab] = useState(""); - const [dialogOpen, setDialogOpen] = useState(false); + const [dialogOpenId, setDialogOpenId] = useState(null); const [sourcesPage, setSourcesPage] = useState(1); const [expandedSources, setExpandedSources] = useState(false); const [canScrollLeft, setCanScrollLeft] = useState(false); @@ -260,6 +260,13 @@ const ChatPage = () => { const { search_space_id, chat_id } = useParams(); + // Function to scroll terminal to bottom + const scrollTerminalToBottom = () => { + if (terminalMessagesRef.current) { + terminalMessagesRef.current.scrollTop = terminalMessagesRef.current.scrollHeight; + } + }; + // Get token from localStorage on client side only React.useEffect(() => { setToken(localStorage.getItem('surfsense_bearer_token')); @@ -469,54 +476,60 @@ const ChatPage = () => { updateChat(); }, [messages, status, chat_id, researchMode, selectedConnectors, search_space_id]); - // Log messages whenever they update and extract annotations from the latest assistant message if available - useEffect(() => { - console.log('Messages updated:', messages); - - // Extract annotations from the latest assistant message if available + // Memoize connector sources to prevent excessive re-renders + const processedConnectorSources = React.useMemo(() => { + if (messages.length === 0) return connectorSources; + + // Only process when we have a complete message (not streaming) + if (status !== 'ready') return connectorSources; + + // Find the latest assistant message const assistantMessages = messages.filter(msg => msg.role === 'assistant'); - if (assistantMessages.length > 0) { - const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; - if (latestAssistantMessage?.annotations) { - const annotations = latestAssistantMessage.annotations as any[]; - - // Debug log to track streaming annotations - if (process.env.NODE_ENV === 'development') { - console.log('Streaming annotations:', annotations); - - // Log counts of each annotation type - const terminalInfoCount = annotations.filter(a => a.type === 'TERMINAL_INFO').length; - const sourcesCount = annotations.filter(a => a.type === 'SOURCES').length; - const answerCount = annotations.filter(a => a.type === 'ANSWER').length; - - console.log(`Annotation counts - Terminal: ${terminalInfoCount}, Sources: ${sourcesCount}, Answer: ${answerCount}`); - } - - // Process SOURCES annotation - get the last one to ensure we have the latest - const sourcesAnnotations = annotations.filter( - (annotation) => annotation.type === 'SOURCES' - ); - - if (sourcesAnnotations.length > 0) { - // Get the last SOURCES annotation to ensure we have the most recent one - const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; - if (latestSourcesAnnotation.content) { - setConnectorSources(latestSourcesAnnotation.content); - } - } - - // Check for terminal info annotations and scroll terminal to bottom if they exist - const terminalInfoAnnotations = annotations.filter( - (annotation) => annotation.type === 'TERMINAL_INFO' - ); - - if (terminalInfoAnnotations.length > 0) { - // Schedule scrolling after the DOM has been updated - setTimeout(scrollTerminalToBottom, 100); - } - } + if (assistantMessages.length === 0) return connectorSources; + + const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; + if (!latestAssistantMessage?.annotations) return connectorSources; + + // Find the latest SOURCES annotation + const annotations = latestAssistantMessage.annotations as any[]; + const sourcesAnnotations = annotations.filter(a => a.type === 'SOURCES'); + + if (sourcesAnnotations.length === 0) return connectorSources; + + const latestSourcesAnnotation = sourcesAnnotations[sourcesAnnotations.length - 1]; + if (!latestSourcesAnnotation.content) return connectorSources; + + // Use this content if it differs from current + return latestSourcesAnnotation.content; + }, [messages, status, connectorSources]); + + // Update connector sources when processed value changes + useEffect(() => { + if (processedConnectorSources !== connectorSources) { + setConnectorSources(processedConnectorSources); } - }, [messages]); + }, [processedConnectorSources, connectorSources]); + + // Check and scroll terminal when terminal info is available + useEffect(() => { + if (messages.length === 0 || status !== 'ready') return; + + // Find the latest assistant message + const assistantMessages = messages.filter(msg => msg.role === 'assistant'); + if (assistantMessages.length === 0) return; + + const latestAssistantMessage = assistantMessages[assistantMessages.length - 1]; + if (!latestAssistantMessage?.annotations) return; + + // Check for terminal info annotations + const annotations = latestAssistantMessage.annotations as any[]; + const terminalInfoAnnotations = annotations.filter(a => a.type === 'TERMINAL_INFO'); + + if (terminalInfoAnnotations.length > 0) { + // Schedule scrolling after the DOM has been updated + setTimeout(scrollTerminalToBottom, 100); + } + }, [messages, status]); // Custom handleSubmit function to include selected connectors and answer type const handleSubmit = (e: React.FormEvent) => { @@ -543,24 +556,22 @@ const ChatPage = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; - // Function to scroll terminal to bottom - const scrollTerminalToBottom = () => { - if (terminalMessagesRef.current) { - terminalMessagesRef.current.scrollTop = terminalMessagesRef.current.scrollHeight; - } - }; - // Scroll to bottom when messages change useEffect(() => { scrollToBottom(); }, [messages]); - // Set activeTab when connectorSources change - useEffect(() => { - if (connectorSources.length > 0) { - setActiveTab(connectorSources[0].type); - } + // Set activeTab when connectorSources change using a memoized value + const activeTabValue = React.useMemo(() => { + return connectorSources.length > 0 ? connectorSources[0].type : ""; }, [connectorSources]); + + // Update activeTab when the memoized value changes + useEffect(() => { + if (activeTabValue && activeTabValue !== activeTab) { + setActiveTab(activeTabValue); + } + }, [activeTabValue, activeTab]); // Scroll terminal to bottom when expanded useEffect(() => { @@ -617,7 +628,7 @@ const ChatPage = () => { }; // Function to get a citation source by ID - const getCitationSource = (citationId: number, messageIndex?: number): Source | null => { + const getCitationSource = React.useCallback((citationId: number, messageIndex?: number): Source | null => { if (!messages || messages.length === 0) return null; // If no specific message index is provided, use the latest assistant message @@ -699,7 +710,7 @@ const ChatPage = () => { return foundSource || null; } - }; + }, [messages]); return ( <> @@ -900,7 +911,7 @@ const ChatPage = () => { ))} {connector.sources.length > INITIAL_SOURCES_DISPLAY && ( - setDialogOpen(open)}> + setDialogOpenId(open ? connector.id : null)}>
    - -