diff --git a/Iniciar_FitzStudio.ps1 b/Iniciar_FitzStudio.ps1 index 7874591..17a1ded 100644 --- a/Iniciar_FitzStudio.ps1 +++ b/Iniciar_FitzStudio.ps1 @@ -1,4 +1,6 @@ -cd ./frontend -npm run dev -cd .. +# Inicia el frontend en una nueva ventana de PowerShell +Start-Process powershell -ArgumentList "-NoExit", "-Command", 'cd ./frontend; npm run dev; pause' + +# Inicia el backend en una nueva ventana de PowerShell +Start-Process powershell -ArgumentList "-NoExit", "-Command", 'cd ./backend; uvicorn backend.main:app --reload --host 0.0.0.0 --port 8000; pause' diff --git a/backend/domains/experiments/charts_examples_endpoint_v1.py b/backend/backend_domains/experiments/charts_examples_endpoint_v1.py similarity index 100% rename from backend/domains/experiments/charts_examples_endpoint_v1.py rename to backend/backend_domains/experiments/charts_examples_endpoint_v1.py diff --git a/backend/domains/experiments/ping_endpoint_v1.py b/backend/backend_domains/experiments/ping_endpoint_v1.py similarity index 100% rename from backend/domains/experiments/ping_endpoint_v1.py rename to backend/backend_domains/experiments/ping_endpoint_v1.py diff --git a/backend/backend_domains/llms/llm_chat_endpoint_v1.py b/backend/backend_domains/llms/llm_chat_endpoint_v1.py new file mode 100644 index 0000000..614e0dd --- /dev/null +++ b/backend/backend_domains/llms/llm_chat_endpoint_v1.py @@ -0,0 +1,44 @@ +# backend/domains/llm/agent_endpoints.py + +from fastapi import APIRouter, HTTPException +from fastapi.responses import StreamingResponse +from pydantic import BaseModel +from fastapi.concurrency import run_in_threadpool + +from backend.backend_domains.llms.llm_chat_srvc import construir_agente_llm, responder, responder_stream +from domains.Logger.logger_db import LoggerDB, logger +from entrypoint.init_db import db_credencial + +LoggerDB(db_credencial, "logger_llm", created_by="sistema") + +router = APIRouter() +agente = construir_agente_llm() # inicializa el agente una vez + +# πŸ“₯ Schema para entrada de prompt +class ChatInput(BaseModel): + prompt: str + +# βœ… Endpoint de respuesta simple +@router.post("/chat", summary="Enviar prompt y obtener respuesta completa del agente") +async def chat_endpoint(data: ChatInput): + try: + return await responder(data.prompt, agente) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except Exception as e: + logger.exception("[ERROR] Fallo durante respuesta del agente:") + raise HTTPException(status_code=500, detail="Error interno al procesar la solicitud.") + +# πŸ” Endpoint de streaming +@router.post("/chat-stream", summary="Enviar prompt y recibir respuesta del agente en streaming") +async def chat_stream_endpoint(data: ChatInput): + try: + return StreamingResponse( + responder_stream(data.prompt, agente), + media_type="text/plain" + ) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except Exception as e: + logger.exception("[ERROR] Fallo durante respuesta en streaming:") + raise HTTPException(status_code=500, detail="Error interno en el agente.") diff --git a/backend/backend_domains/llms/llm_chat_srvc.py b/backend/backend_domains/llms/llm_chat_srvc.py new file mode 100644 index 0000000..8a8d4aa --- /dev/null +++ b/backend/backend_domains/llms/llm_chat_srvc.py @@ -0,0 +1,84 @@ +# src/services/agent_service.py + +from domains.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo +from domains.ConexionSql.Postgres_conexion import PostgresConexion +from domains.ConexionApis.OpenAi_conexion import OpenAICliente +from domains.Llms.Modelos.Openai_model import ModeloOpenAI +from domains.Llms.Agente import AgenteAI +from domains.Llms.Memory.postgres_MemoryConv import MemoryConvPostgres +from domains.Llms.MCPs.McpClient import MCPClient +from domains.Llms.MCPs.McpClient_Registry import ClientRegistry +from entrypoint.init_db import db_credencial + +from domains.Logger.logger_db import LoggerDB, logger +LoggerDB(db_credencial, "logger_llm", created_by="sistema") + +from typing import AsyncGenerator + +# πŸ”§ InicializaciΓ³n ΓΊnica del agente +def construir_agente_llm() -> AgenteAI: + logger.info("[INICIO] Inicializando agente LLM...") + + conexion = PostgresConexion(db_credencial) + + # Paso 1: Obtener credencial + repo = OpenAICredencialRepo(conexion) + credencial = repo.get_by_id("OPAK20250513-61b29978b7604031014") + if not credencial: + raise ValueError("No se encontrΓ³ la credencial OpenAI") + + logger.debug(f"[OK] Credencial OpenAI cargada: {credencial.titulo}") + + # Paso 2: Crear cliente + cliente = OpenAICliente(credencial) + + # Paso 3: Instanciar modelo + modelo = ModeloOpenAI( + cliente=cliente, + model="gpt-4o", + temperature=1 + ) + + # Paso 4: Memoria en PostgreSQL + memoria = MemoryConvPostgres( + credencial=db_credencial, + nombre_tabla="memoria_conversacion_pruebas", + k=10 + ) + + # Paso 5: Herramientas MCP (ej. archivos) + archivos = MCPClient.from_http( + name="files", + url="http://127.0.0.1:4201/fs" + ) + registry = ClientRegistry() + registry.add("files", archivos) + + # Paso 6: Agente + agente = AgenteAI( + modelo=modelo, + nombre="Asistente Inteligente", + descripcion="", + system_prompt="", + rol="asistente", + objetivos=[], + max_iterations=0, + memoria=memoria, + mcp=registry + ) + + logger.success("[OK] Agente LLM listo.") + return agente + +# ⚑ FunciΓ³n simple +async def responder(prompt: str, agente: AgenteAI) -> str: + logger.info(f"[PeticiΓ³n] Prompt recibido: {prompt[:50]}...") + respuesta = await agente.interactuar_en_bucle(prompt=prompt, stream=False) + logger.debug(f"[Respuesta] {respuesta[:100]}...") + return respuesta + +# πŸ” FunciΓ³n en streaming +async def responder_stream(prompt: str, agente: AgenteAI) -> AsyncGenerator[str, None]: + logger.info(f"[Streaming] Prompt recibido: {prompt[:50]}...") + async for token in agente.interactuar_en_bucle(prompt=prompt, stream=True): + yield token diff --git a/backend/backend_domains/llms/llm_chat_ws_endpoint_v1.py b/backend/backend_domains/llms/llm_chat_ws_endpoint_v1.py new file mode 100644 index 0000000..5c60c35 --- /dev/null +++ b/backend/backend_domains/llms/llm_chat_ws_endpoint_v1.py @@ -0,0 +1,35 @@ +from fastapi import WebSocket, APIRouter, WebSocketDisconnect +from backend.backend_domains.llms.llm_chat_srvc import construir_agente_llm +from domains.Logger.logger_db import LoggerDB, logger +from entrypoint.init_db import db_credencial +import json + +LoggerDB(db_credencial, "logger_llm_ws", created_by="sistema") + +router = APIRouter() +agente = construir_agente_llm() + +@router.websocket("/ws/chat") +async def chat_ws(websocket: WebSocket): + await websocket.accept() + try: + data = await websocket.receive_text() + parsed = json.loads(data) + prompt = parsed.get("prompt") + if not prompt: + await websocket.send_text("⚠️ Prompt vacΓ­o.") + await websocket.close() + return + + # βœ… SoluciΓ³n: hacer await antes de iterar + respuesta_gen = await agente.interactuar_en_bucle(prompt=prompt, stream=True) + async for token in respuesta_gen: + await websocket.send_text(token) + + await websocket.close() + + except WebSocketDisconnect: + logger.info("πŸ”Œ WebSocket desconectado por el cliente.") + except Exception as e: + logger.exception("❌ Error en WebSocket:") + await websocket.close() diff --git a/backend/domains/text_manager/text_manager_endpoint_v1.py b/backend/backend_domains/text_manager/text_manager_endpoint_v1.py similarity index 93% rename from backend/domains/text_manager/text_manager_endpoint_v1.py rename to backend/backend_domains/text_manager/text_manager_endpoint_v1.py index 2a02fcb..3873651 100644 --- a/backend/domains/text_manager/text_manager_endpoint_v1.py +++ b/backend/backend_domains/text_manager/text_manager_endpoint_v1.py @@ -1,15 +1,15 @@ from fastapi import APIRouter, Depends, HTTPException from fastapi import Path -from backend.domains.text_manager.text_manager_schema import BibliotecaInput, NotaInput +from backend.backend_domains.text_manager.text_manager_schema import BibliotecaInput, NotaInput from fastapi.concurrency import run_in_threadpool from backend.db.conexion import get_conexion -from backend.domains.text_manager.text_manager_srvc import * -from src.ConexionSql.Postgres_conexion import PostgresConexion +from backend.backend_domains.text_manager.text_manager_srvc import * +from domains.ConexionSql.Postgres_conexion import PostgresConexion from entrypoint.init_db import db_credencial -from src.Logger.logger_db import LoggerDB, logger +from domains.Logger.logger_db import LoggerDB, logger LoggerDB(db_credencial, "logger_textos", created_by="sistema") router = APIRouter() diff --git a/backend/domains/text_manager/text_manager_schema.py b/backend/backend_domains/text_manager/text_manager_schema.py similarity index 100% rename from backend/domains/text_manager/text_manager_schema.py rename to backend/backend_domains/text_manager/text_manager_schema.py diff --git a/backend/domains/text_manager/text_manager_srvc.py b/backend/backend_domains/text_manager/text_manager_srvc.py similarity index 91% rename from backend/domains/text_manager/text_manager_srvc.py rename to backend/backend_domains/text_manager/text_manager_srvc.py index efe6b8b..bdc464c 100644 --- a/backend/domains/text_manager/text_manager_srvc.py +++ b/backend/backend_domains/text_manager/text_manager_srvc.py @@ -1,15 +1,15 @@ -from src.TextManager.biblioteca import Biblioteca -from src.TextManager.biblioteca_mmr import BibliotecaRepo -from src.Llms.Embedders.Openai_embedder import OpenAIEmbedder -from src.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo -from src.ConexionSql.Postgres_conexion import PostgresConexion -from src.TextManager.nota import Nota -from src.TextManager.notas_mmr import generar_tabla_nota_para_biblioteca, NotaRepo +from domains.TextManager.biblioteca import Biblioteca +from domains.TextManager.biblioteca_mmr import BibliotecaRepo +from domains.Llms.Embedders.Openai_embedder import OpenAIEmbedder +from domains.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo +from domains.ConexionSql.Postgres_conexion import PostgresConexion +from domains.TextManager.nota import Nota +from domains.TextManager.notas_mmr import generar_tabla_nota_para_biblioteca, NotaRepo from sqlalchemy import MetaData -from backend.domains.text_manager.text_manager_schema import NotaInput +from backend.backend_domains.text_manager.text_manager_schema import NotaInput from entrypoint.init_db import db_credencial -from src.Logger.logger_db import LoggerDB, logger +from domains.Logger.logger_db import LoggerDB, logger LoggerDB(db_credencial, "logger_textos", created_by="sistema") def crear_biblioteca(nombre_biblioteca: str, conexion: PostgresConexion, descripcion: str = None): diff --git a/backend/backend_domains/usuarios_endpoint_v1.py b/backend/backend_domains/usuarios_endpoint_v1.py new file mode 100644 index 0000000..b39af79 --- /dev/null +++ b/backend/backend_domains/usuarios_endpoint_v1.py @@ -0,0 +1,35 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from domains.Usuario.usuario_mmr import UsuarioRepo, Usuario, UsuarioModel +from backend.db.conexion import get_conexion + +router = APIRouter() + +@router.post("/usuarios/", response_model=dict) +def crear_usuario(nombre: str, email: str, db: Session = Depends(get_conexion)): + repo = UsuarioRepo(db) + usuario = Usuario(id=None, nombre=nombre, email=email) + usuario_id = repo.add(usuario) + return {"id": usuario_id} + +@router.get("/usuarios/{usuario_id}", response_model=dict) +def obtener_usuario(usuario_id: int, db: Session = Depends(get_conexion)): + repo = UsuarioRepo(db) + usuario = repo.get_by_id(usuario_id) + if not usuario: + raise HTTPException(status_code=404, detail="Usuario no encontrado") + return {"id": usuario.id, "nombre": usuario.nombre, "email": usuario.email, "activo": usuario.activo} + +@router.get("/usuarios/", response_model=list) +def listar_usuarios(db: Session = Depends(get_conexion)): + repo = UsuarioRepo(db) + usuarios = repo.get_all() + return [{"id": u.id, "nombre": u.nombre, "email": u.email, "activo": u.activo} for u in usuarios] + +@router.delete("/usuarios/{usuario_id}", response_model=dict) +def eliminar_usuario(usuario_id: int, db: Session = Depends(get_conexion)): + repo = UsuarioRepo(db) + exito = repo.delete_by_id(usuario_id) + if not exito: + raise HTTPException(status_code=404, detail="Usuario no encontrado") + return {"ok": True} diff --git a/backend/db/conexion.py b/backend/db/conexion.py index f638259..2f03ad6 100644 --- a/backend/db/conexion.py +++ b/backend/db/conexion.py @@ -1,6 +1,6 @@ # backend/db/conexion.py from entrypoint.init_db import db_credencial -from src.ConexionSql.Postgres_conexion import PostgresConexion +from domains.ConexionSql.Postgres_conexion import PostgresConexion def get_conexion(): conexion = PostgresConexion(db_credencial) diff --git a/backend/main.py b/backend/main.py index d076a11..dadb965 100644 --- a/backend/main.py +++ b/backend/main.py @@ -3,6 +3,8 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from backend.router_v1 import router +from backend.backend_domains.llms import llm_chat_ws_endpoint_v1 + app = FastAPI( title="Fitz Backend", @@ -21,4 +23,5 @@ app.add_middleware( # Incluye las rutas de tu API -app.include_router(router, prefix="/api/v1", tags=["v1"]) \ No newline at end of file +app.include_router(router, prefix="/api/v1", tags=["v1"]) +app.include_router(llm_chat_ws_endpoint_v1.router) diff --git a/backend/router_v1.py b/backend/router_v1.py index 4e3865c..c63125d 100644 --- a/backend/router_v1.py +++ b/backend/router_v1.py @@ -1,12 +1,15 @@ # backend/api/router_v1.py from fastapi import APIRouter -from backend.domains.experiments import charts_examples_endpoint_v1 as charts -from backend.domains.experiments import ping_endpoint_v1 -from backend.domains.text_manager import text_manager_endpoint_v1 - +from backend.backend_domains.experiments import charts_examples_endpoint_v1 as charts +from backend.backend_domains.experiments import ping_endpoint_v1 +from backend.backend_domains.text_manager import text_manager_endpoint_v1 +from backend.backend_domains.llms import llm_chat_endpoint_v1 +from backend.backend_domains.usuarios_endpoint_v1 import router as usuarios_router router = APIRouter() router.include_router(ping_endpoint_v1.router, prefix="/ping") router.include_router(text_manager_endpoint_v1.router, prefix="/text_manager") router.include_router(charts.router, prefix="/charts") +router.include_router(llm_chat_endpoint_v1.router, prefix="/llm", tags=["Agente LLM"]) +router.include_router(usuarios_router, prefix="/usuarios", tags=["Usuarios"]) diff --git a/data/files/txt/tree.txt b/data/files/txt/tree.txt index 14726f1..76e9232 100644 --- a/data/files/txt/tree.txt +++ b/data/files/txt/tree.txt @@ -1,1021 +1,31 @@ -E:\Fitz_Studio -β”œβ”€β”€ .git -β”‚ β”œβ”€β”€ COMMIT_EDITMSG -β”‚ β”œβ”€β”€ FETCH_HEAD -β”‚ β”œβ”€β”€ HEAD -β”‚ β”œβ”€β”€ ORIG_HEAD -β”‚ β”œβ”€β”€ config -β”‚ β”œβ”€β”€ description -β”‚ β”œβ”€β”€ hooks -β”‚ β”‚ β”œβ”€β”€ applypatch-msg.sample -β”‚ β”‚ β”œβ”€β”€ commit-msg.sample -β”‚ β”‚ β”œβ”€β”€ fsmonitor-watchman.sample -β”‚ β”‚ β”œβ”€β”€ post-update.sample -β”‚ β”‚ β”œβ”€β”€ pre-applypatch.sample -β”‚ β”‚ β”œβ”€β”€ pre-commit.sample -β”‚ β”‚ β”œβ”€β”€ pre-merge-commit.sample -β”‚ β”‚ β”œβ”€β”€ pre-push.sample -β”‚ β”‚ β”œβ”€β”€ pre-rebase.sample -β”‚ β”‚ β”œβ”€β”€ pre-receive.sample -β”‚ β”‚ β”œβ”€β”€ prepare-commit-msg.sample -β”‚ β”‚ β”œβ”€β”€ push-to-checkout.sample -β”‚ β”‚ β”œβ”€β”€ sendemail-validate.sample -β”‚ β”‚ └── update.sample -β”‚ β”œβ”€β”€ index -β”‚ β”œβ”€β”€ info -β”‚ β”‚ └── exclude -β”‚ β”œβ”€β”€ logs -β”‚ β”‚ β”œβ”€β”€ HEAD -β”‚ β”‚ └── refs -β”‚ β”œβ”€β”€ objects -β”‚ β”‚ β”œβ”€β”€ 00 -β”‚ β”‚ β”œβ”€β”€ 01 -β”‚ β”‚ β”œβ”€β”€ 04 -β”‚ β”‚ β”œβ”€β”€ 05 -β”‚ β”‚ β”œβ”€β”€ 06 -β”‚ β”‚ β”œβ”€β”€ 08 -β”‚ β”‚ β”œβ”€β”€ 0a -β”‚ β”‚ β”œβ”€β”€ 0b -β”‚ β”‚ β”œβ”€β”€ 0c -β”‚ β”‚ β”œβ”€β”€ 0d -β”‚ β”‚ β”œβ”€β”€ 0e -β”‚ β”‚ β”œβ”€β”€ 10 -β”‚ β”‚ β”œβ”€β”€ 11 -β”‚ β”‚ β”œβ”€β”€ 13 -β”‚ β”‚ β”œβ”€β”€ 15 -β”‚ β”‚ β”œβ”€β”€ 17 -β”‚ β”‚ β”œβ”€β”€ 18 -β”‚ β”‚ β”œβ”€β”€ 19 -β”‚ β”‚ β”œβ”€β”€ 1a -β”‚ β”‚ β”œβ”€β”€ 1b -β”‚ β”‚ β”œβ”€β”€ 1d -β”‚ β”‚ β”œβ”€β”€ 1e -β”‚ β”‚ β”œβ”€β”€ 1f -β”‚ β”‚ β”œβ”€β”€ 20 -β”‚ β”‚ β”œβ”€β”€ 21 -β”‚ β”‚ β”œβ”€β”€ 22 -β”‚ β”‚ β”œβ”€β”€ 23 -β”‚ β”‚ β”œβ”€β”€ 24 -β”‚ β”‚ β”œβ”€β”€ 25 -β”‚ β”‚ β”œβ”€β”€ 26 -β”‚ β”‚ β”œβ”€β”€ 27 -β”‚ β”‚ β”œβ”€β”€ 28 -β”‚ β”‚ β”œβ”€β”€ 2b -β”‚ β”‚ β”œβ”€β”€ 2c -β”‚ β”‚ β”œβ”€β”€ 2d -β”‚ β”‚ β”œβ”€β”€ 2f -β”‚ β”‚ β”œβ”€β”€ 31 -β”‚ β”‚ β”œβ”€β”€ 32 -β”‚ β”‚ β”œβ”€β”€ 33 -β”‚ β”‚ β”œβ”€β”€ 34 -β”‚ β”‚ β”œβ”€β”€ 36 -β”‚ β”‚ β”œβ”€β”€ 39 -β”‚ β”‚ β”œβ”€β”€ 3a -β”‚ β”‚ β”œβ”€β”€ 3c -β”‚ β”‚ β”œβ”€β”€ 3d -β”‚ β”‚ β”œβ”€β”€ 3e -β”‚ β”‚ β”œβ”€β”€ 3f -β”‚ β”‚ β”œβ”€β”€ 40 -β”‚ β”‚ β”œβ”€β”€ 41 -β”‚ β”‚ β”œβ”€β”€ 42 -β”‚ β”‚ β”œβ”€β”€ 43 -β”‚ β”‚ β”œβ”€β”€ 44 -β”‚ β”‚ β”œβ”€β”€ 45 -β”‚ β”‚ β”œβ”€β”€ 47 -β”‚ β”‚ β”œβ”€β”€ 48 -β”‚ β”‚ β”œβ”€β”€ 4a -β”‚ β”‚ β”œβ”€β”€ 4b -β”‚ β”‚ β”œβ”€β”€ 4c -β”‚ β”‚ β”œβ”€β”€ 4d -β”‚ β”‚ β”œβ”€β”€ 4e -β”‚ β”‚ β”œβ”€β”€ 4f -β”‚ β”‚ β”œβ”€β”€ 50 -β”‚ β”‚ β”œβ”€β”€ 51 -β”‚ β”‚ β”œβ”€β”€ 52 -β”‚ β”‚ β”œβ”€β”€ 55 -β”‚ β”‚ β”œβ”€β”€ 56 -β”‚ β”‚ β”œβ”€β”€ 57 -β”‚ β”‚ β”œβ”€β”€ 58 -β”‚ β”‚ β”œβ”€β”€ 59 -β”‚ β”‚ β”œβ”€β”€ 5a -β”‚ β”‚ β”œβ”€β”€ 5b -β”‚ β”‚ β”œβ”€β”€ 5c -β”‚ β”‚ β”œβ”€β”€ 5d -β”‚ β”‚ β”œβ”€β”€ 5e -β”‚ β”‚ β”œβ”€β”€ 5f -β”‚ β”‚ β”œβ”€β”€ 60 -β”‚ β”‚ β”œβ”€β”€ 61 -β”‚ β”‚ β”œβ”€β”€ 62 -β”‚ β”‚ β”œβ”€β”€ 63 -β”‚ β”‚ β”œβ”€β”€ 65 -β”‚ β”‚ β”œβ”€β”€ 67 -β”‚ β”‚ β”œβ”€β”€ 69 -β”‚ β”‚ β”œβ”€β”€ 6b -β”‚ β”‚ β”œβ”€β”€ 6c -β”‚ β”‚ β”œβ”€β”€ 6d -β”‚ β”‚ β”œβ”€β”€ 6e -β”‚ β”‚ β”œβ”€β”€ 70 -β”‚ β”‚ β”œβ”€β”€ 71 -β”‚ β”‚ β”œβ”€β”€ 74 -β”‚ β”‚ β”œβ”€β”€ 75 -β”‚ β”‚ β”œβ”€β”€ 76 -β”‚ β”‚ β”œβ”€β”€ 77 -β”‚ β”‚ β”œβ”€β”€ 79 -β”‚ β”‚ β”œβ”€β”€ 7b -β”‚ β”‚ β”œβ”€β”€ 7c -β”‚ β”‚ β”œβ”€β”€ 7d -β”‚ β”‚ β”œβ”€β”€ 7f -β”‚ β”‚ β”œβ”€β”€ 80 -β”‚ β”‚ β”œβ”€β”€ 81 -β”‚ β”‚ β”œβ”€β”€ 82 -β”‚ β”‚ β”œβ”€β”€ 83 -β”‚ β”‚ β”œβ”€β”€ 84 -β”‚ β”‚ β”œβ”€β”€ 85 -β”‚ β”‚ β”œβ”€β”€ 86 -β”‚ β”‚ β”œβ”€β”€ 87 -β”‚ β”‚ β”œβ”€β”€ 89 -β”‚ β”‚ β”œβ”€β”€ 8a -β”‚ β”‚ β”œβ”€β”€ 8b -β”‚ β”‚ β”œβ”€β”€ 8c -β”‚ β”‚ β”œβ”€β”€ 8d -β”‚ β”‚ β”œβ”€β”€ 90 -β”‚ β”‚ β”œβ”€β”€ 92 -β”‚ β”‚ β”œβ”€β”€ 94 -β”‚ β”‚ β”œβ”€β”€ 95 -β”‚ β”‚ β”œβ”€β”€ 97 -β”‚ β”‚ β”œβ”€β”€ 98 -β”‚ β”‚ β”œβ”€β”€ 99 -β”‚ β”‚ β”œβ”€β”€ 9a -β”‚ β”‚ β”œβ”€β”€ 9b -β”‚ β”‚ β”œβ”€β”€ 9c -β”‚ β”‚ β”œβ”€β”€ 9d -β”‚ β”‚ β”œβ”€β”€ a0 -β”‚ β”‚ β”œβ”€β”€ a1 -β”‚ β”‚ β”œβ”€β”€ a2 -β”‚ β”‚ β”œβ”€β”€ a3 -β”‚ β”‚ β”œβ”€β”€ a4 -β”‚ β”‚ β”œβ”€β”€ a5 -β”‚ β”‚ β”œβ”€β”€ a6 -β”‚ β”‚ β”œβ”€β”€ a7 -β”‚ β”‚ β”œβ”€β”€ a8 -β”‚ β”‚ β”œβ”€β”€ a9 -β”‚ β”‚ β”œβ”€β”€ aa -β”‚ β”‚ β”œβ”€β”€ ab -β”‚ β”‚ β”œβ”€β”€ ac -β”‚ β”‚ β”œβ”€β”€ ad -β”‚ β”‚ β”œβ”€β”€ ae -β”‚ β”‚ β”œβ”€β”€ af -β”‚ β”‚ β”œβ”€β”€ b0 -β”‚ β”‚ β”œβ”€β”€ b1 -β”‚ β”‚ β”œβ”€β”€ b2 -β”‚ β”‚ β”œβ”€β”€ b3 -β”‚ β”‚ β”œβ”€β”€ b4 -β”‚ β”‚ β”œβ”€β”€ b5 -β”‚ β”‚ β”œβ”€β”€ b6 -β”‚ β”‚ β”œβ”€β”€ b8 -β”‚ β”‚ β”œβ”€β”€ b9 -β”‚ β”‚ β”œβ”€β”€ ba -β”‚ β”‚ β”œβ”€β”€ bb -β”‚ β”‚ β”œβ”€β”€ bc -β”‚ β”‚ β”œβ”€β”€ bd -β”‚ β”‚ β”œβ”€β”€ bf -β”‚ β”‚ β”œβ”€β”€ c0 -β”‚ β”‚ β”œβ”€β”€ c3 -β”‚ β”‚ β”œβ”€β”€ c4 -β”‚ β”‚ β”œβ”€β”€ c5 -β”‚ β”‚ β”œβ”€β”€ c6 -β”‚ β”‚ β”œβ”€β”€ c7 -β”‚ β”‚ β”œβ”€β”€ c9 -β”‚ β”‚ β”œβ”€β”€ cc -β”‚ β”‚ β”œβ”€β”€ cd -β”‚ β”‚ β”œβ”€β”€ ce -β”‚ β”‚ β”œβ”€β”€ cf -β”‚ β”‚ β”œβ”€β”€ d1 -β”‚ β”‚ β”œβ”€β”€ d3 -β”‚ β”‚ β”œβ”€β”€ d4 -β”‚ β”‚ β”œβ”€β”€ d5 -β”‚ β”‚ β”œβ”€β”€ d6 -β”‚ β”‚ β”œβ”€β”€ d7 -β”‚ β”‚ β”œβ”€β”€ d8 -β”‚ β”‚ β”œβ”€β”€ d9 -β”‚ β”‚ β”œβ”€β”€ da -β”‚ β”‚ β”œβ”€β”€ db -β”‚ β”‚ β”œβ”€β”€ dc -β”‚ β”‚ β”œβ”€β”€ dd -β”‚ β”‚ β”œβ”€β”€ de -β”‚ β”‚ β”œβ”€β”€ df -β”‚ β”‚ β”œβ”€β”€ e0 -β”‚ β”‚ β”œβ”€β”€ e1 -β”‚ β”‚ β”œβ”€β”€ e2 -β”‚ β”‚ β”œβ”€β”€ e3 -β”‚ β”‚ β”œβ”€β”€ e4 -β”‚ β”‚ β”œβ”€β”€ e5 -β”‚ β”‚ β”œβ”€β”€ e6 -β”‚ β”‚ β”œβ”€β”€ e7 -β”‚ β”‚ β”œβ”€β”€ e8 -β”‚ β”‚ β”œβ”€β”€ e9 -β”‚ β”‚ β”œβ”€β”€ ec -β”‚ β”‚ β”œβ”€β”€ ed -β”‚ β”‚ β”œβ”€β”€ ee -β”‚ β”‚ β”œβ”€β”€ ef -β”‚ β”‚ β”œβ”€β”€ f1 -β”‚ β”‚ β”œβ”€β”€ f2 -β”‚ β”‚ β”œβ”€β”€ f3 -β”‚ β”‚ β”œβ”€β”€ f5 -β”‚ β”‚ β”œβ”€β”€ f6 -β”‚ β”‚ β”œβ”€β”€ f7 -β”‚ β”‚ β”œβ”€β”€ f9 -β”‚ β”‚ β”œβ”€β”€ fa -β”‚ β”‚ β”œβ”€β”€ fb -β”‚ β”‚ β”œβ”€β”€ fc -β”‚ β”‚ β”œβ”€β”€ fd -β”‚ β”‚ β”œβ”€β”€ ff -β”‚ β”‚ β”œβ”€β”€ info -β”‚ β”‚ └── pack -β”‚ └── refs -β”‚ β”œβ”€β”€ heads -β”‚ β”œβ”€β”€ remotes -β”‚ └── tags -β”œβ”€β”€ .gitignore -β”œβ”€β”€ .python-version -β”œβ”€β”€ .venv -β”‚ β”œβ”€β”€ .gitignore -β”‚ β”œβ”€β”€ .lock -β”‚ β”œβ”€β”€ CACHEDIR.TAG -β”‚ β”œβ”€β”€ Lib -β”‚ β”‚ └── site-packages -β”‚ β”œβ”€β”€ Scripts -β”‚ β”‚ β”œβ”€β”€ activate -β”‚ β”‚ β”œβ”€β”€ activate.bat -β”‚ β”‚ β”œβ”€β”€ activate.csh -β”‚ β”‚ β”œβ”€β”€ activate.fish -β”‚ β”‚ β”œβ”€β”€ activate.nu -β”‚ β”‚ β”œβ”€β”€ activate.ps1 -β”‚ β”‚ β”œβ”€β”€ activate_this.py -β”‚ β”‚ β”œβ”€β”€ deactivate.bat -β”‚ β”‚ β”œβ”€β”€ debugpy-adapter.exe -β”‚ β”‚ β”œβ”€β”€ debugpy.exe -β”‚ β”‚ β”œβ”€β”€ distro.exe -β”‚ β”‚ β”œβ”€β”€ dotenv.exe -β”‚ β”‚ β”œβ”€β”€ f2py.exe -β”‚ β”‚ β”œβ”€β”€ fastapi.exe -β”‚ β”‚ β”œβ”€β”€ httpx.exe -β”‚ β”‚ β”œβ”€β”€ huggingface-cli.exe -β”‚ β”‚ β”œβ”€β”€ ipython.exe -β”‚ β”‚ β”œβ”€β”€ ipython3.exe -β”‚ β”‚ β”œβ”€β”€ isympy.exe -β”‚ β”‚ β”œβ”€β”€ jlpm.exe -β”‚ β”‚ β”œβ”€β”€ jsonpointer -β”‚ β”‚ β”œβ”€β”€ jsonschema.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-console.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-dejavu.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-events.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-execute.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-kernel.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-kernelspec.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-lab.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-labextension.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-labhub.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-migrate.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-nbconvert.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-notebook.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-run.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-server.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-troubleshoot.exe -β”‚ β”‚ β”œβ”€β”€ jupyter-trust.exe -β”‚ β”‚ β”œβ”€β”€ jupyter.exe -β”‚ β”‚ β”œβ”€β”€ markdown-it.exe -β”‚ β”‚ β”œβ”€β”€ mcp.exe -β”‚ β”‚ β”œβ”€β”€ normalizer.exe -β”‚ β”‚ β”œβ”€β”€ numpy-config.exe -β”‚ β”‚ β”œβ”€β”€ openai.exe -β”‚ β”‚ β”œβ”€β”€ petname.exe -β”‚ β”‚ β”œβ”€β”€ pip.exe -β”‚ β”‚ β”œβ”€β”€ pip3.11.exe -β”‚ β”‚ β”œβ”€β”€ pip3.exe -β”‚ β”‚ β”œβ”€β”€ pybabel.exe -β”‚ β”‚ β”œβ”€β”€ pydoc.bat -β”‚ β”‚ β”œβ”€β”€ pygmentize.exe -β”‚ β”‚ β”œβ”€β”€ pyjson5.exe -β”‚ β”‚ β”œβ”€β”€ python.exe -β”‚ β”‚ β”œβ”€β”€ pythonw.exe -β”‚ β”‚ β”œβ”€β”€ pywin32_postinstall.exe -β”‚ β”‚ β”œβ”€β”€ pywin32_postinstall.py -β”‚ β”‚ β”œβ”€β”€ pywin32_testall.exe -β”‚ β”‚ β”œβ”€β”€ pywin32_testall.py -β”‚ β”‚ β”œβ”€β”€ send2trash.exe -β”‚ β”‚ β”œβ”€β”€ torchfrtrace.exe -β”‚ β”‚ β”œβ”€β”€ torchrun.exe -β”‚ β”‚ β”œβ”€β”€ tqdm.exe -β”‚ β”‚ β”œβ”€β”€ transformers-cli.exe -β”‚ β”‚ β”œβ”€β”€ typer.exe -β”‚ β”‚ β”œβ”€β”€ uvicorn.exe -β”‚ β”‚ └── wsdump.exe -β”‚ β”œβ”€β”€ etc -β”‚ β”‚ └── jupyter -β”‚ β”œβ”€β”€ include -β”‚ β”‚ └── site -β”‚ β”œβ”€β”€ pyvenv.cfg -β”‚ └── share -β”‚ β”œβ”€β”€ applications -β”‚ β”œβ”€β”€ icons -β”‚ β”œβ”€β”€ jupyter -β”‚ └── man -β”œβ”€β”€ Apikeys.ipynb -β”œβ”€β”€ Apikeys_embedding.ipynb -β”œβ”€β”€ Credenciales.ipynb -β”œβ”€β”€ Encriptacion.ipynb -β”œβ”€β”€ README.md -β”œβ”€β”€ backend +E:\Fitz_Studio\backend +β”œβ”€β”€ __init__.py +β”œβ”€β”€ __pycache__ +β”‚ β”œβ”€β”€ __init__.cpython-311.pyc +β”‚ β”œβ”€β”€ main.cpython-311.pyc +β”‚ └── router_v1.cpython-311.pyc +β”œβ”€β”€ db β”‚ β”œβ”€β”€ __init__.py β”‚ β”œβ”€β”€ __pycache__ β”‚ β”‚ β”œβ”€β”€ __init__.cpython-311.pyc -β”‚ β”‚ └── main.cpython-311.pyc -β”‚ β”œβ”€β”€ api -β”‚ β”‚ β”œβ”€β”€ __init__.py +β”‚ β”‚ └── conexion.cpython-311.pyc +β”‚ └── conexion.py +β”œβ”€β”€ deps +β”‚ β”œβ”€β”€ __init__.py +β”‚ └── auth.py +β”œβ”€β”€ domains +β”‚ β”œβ”€β”€ experiments β”‚ β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ └── v1 -β”‚ β”œβ”€β”€ db -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── conexion.py -β”‚ β”œβ”€β”€ deps -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── auth.py -β”‚ └── main.py -β”œβ”€β”€ config -β”‚ └── .env -β”œβ”€β”€ data -β”‚ β”œβ”€β”€ files -β”‚ β”‚ β”œβ”€β”€ pdf -β”‚ β”‚ └── txt -β”‚ β”œβ”€β”€ postgresql -β”‚ β”‚ β”œβ”€β”€ docker-compose.yml -β”‚ β”‚ └── pgdata -β”‚ └── sqlite -β”œβ”€β”€ entrypoint -β”‚ β”œβ”€β”€ __init__.py -β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ β”œβ”€β”€ __init__.cpython-311.pyc -β”‚ β”‚ └── init_db.cpython-311.pyc -β”‚ β”œβ”€β”€ add_to_pythonpath.ps1 -β”‚ └── init_db.py -β”œβ”€β”€ frontend -β”‚ β”œβ”€β”€ .github -β”‚ β”‚ └── workflows -β”‚ β”œβ”€β”€ .gitignore -β”‚ β”œβ”€β”€ .nvmrc -β”‚ β”œβ”€β”€ .prettierrc.mjs -β”‚ β”œβ”€β”€ .storybook -β”‚ β”‚ β”œβ”€β”€ main.ts -β”‚ β”‚ └── preview.tsx -β”‚ β”œβ”€β”€ .stylelintignore -β”‚ β”œβ”€β”€ .stylelintrc.json -β”‚ β”œβ”€β”€ .yarn -β”‚ β”‚ └── releases -β”‚ β”œβ”€β”€ .yarnrc.yml -β”‚ β”œβ”€β”€ README.md -β”‚ β”œβ”€β”€ eslint.config.js -β”‚ β”œβ”€β”€ index.html -β”‚ β”œβ”€β”€ node_modules -β”‚ β”‚ β”œβ”€β”€ .bin -β”‚ β”‚ β”œβ”€β”€ .package-lock.json -β”‚ β”‚ β”œβ”€β”€ .vite -β”‚ β”‚ β”œβ”€β”€ .vite-temp -β”‚ β”‚ β”œβ”€β”€ @adobe -β”‚ β”‚ β”œβ”€β”€ @ampproject -β”‚ β”‚ β”œβ”€β”€ @asamuzakjp -β”‚ β”‚ β”œβ”€β”€ @babel -β”‚ β”‚ β”œβ”€β”€ @csstools -β”‚ β”‚ β”œβ”€β”€ @dimforge -β”‚ β”‚ β”œβ”€β”€ @dual-bundle -β”‚ β”‚ β”œβ”€β”€ @esbuild -β”‚ β”‚ β”œβ”€β”€ @eslint -β”‚ β”‚ β”œβ”€β”€ @eslint-community -β”‚ β”‚ β”œβ”€β”€ @floating-ui -β”‚ β”‚ β”œβ”€β”€ @humanfs -β”‚ β”‚ β”œβ”€β”€ @humanwhocodes -β”‚ β”‚ β”œβ”€β”€ @ianvs -β”‚ β”‚ β”œβ”€β”€ @isaacs -β”‚ β”‚ β”œβ”€β”€ @joshwooding -β”‚ β”‚ β”œβ”€β”€ @jridgewell -β”‚ β”‚ β”œβ”€β”€ @keyv -β”‚ β”‚ β”œβ”€β”€ @mantine -β”‚ β”‚ β”œβ”€β”€ @modelcontextprotocol -β”‚ β”‚ β”œβ”€β”€ @nodelib -β”‚ β”‚ β”œβ”€β”€ @pkgjs -β”‚ β”‚ β”œβ”€β”€ @react-three -β”‚ β”‚ β”œβ”€β”€ @rollup -β”‚ β”‚ β”œβ”€β”€ @storybook -β”‚ β”‚ β”œβ”€β”€ @svgr -β”‚ β”‚ β”œβ”€β”€ @tabler -β”‚ β”‚ β”œβ”€β”€ @testing-library -β”‚ β”‚ β”œβ”€β”€ @tweenjs -β”‚ β”‚ β”œβ”€β”€ @types -β”‚ β”‚ β”œβ”€β”€ @typescript-eslint -β”‚ β”‚ β”œβ”€β”€ @vitejs -β”‚ β”‚ β”œβ”€β”€ @vitest -β”‚ β”‚ β”œβ”€β”€ @webgpu -β”‚ β”‚ β”œβ”€β”€ accepts -β”‚ β”‚ β”œβ”€β”€ acorn -β”‚ β”‚ β”œβ”€β”€ acorn-jsx -β”‚ β”‚ β”œβ”€β”€ agent-base -β”‚ β”‚ β”œβ”€β”€ ajv -β”‚ β”‚ β”œβ”€β”€ ansi-regex -β”‚ β”‚ β”œβ”€β”€ ansi-styles -β”‚ β”‚ β”œβ”€β”€ argparse -β”‚ β”‚ β”œβ”€β”€ aria-query -β”‚ β”‚ β”œβ”€β”€ array-buffer-byte-length -β”‚ β”‚ β”œβ”€β”€ array-includes -β”‚ β”‚ β”œβ”€β”€ array-union -β”‚ β”‚ β”œβ”€β”€ array.prototype.findlast -β”‚ β”‚ β”œβ”€β”€ array.prototype.flat -β”‚ β”‚ β”œβ”€β”€ array.prototype.flatmap -β”‚ β”‚ β”œβ”€β”€ array.prototype.tosorted -β”‚ β”‚ β”œβ”€β”€ arraybuffer.prototype.slice -β”‚ β”‚ β”œβ”€β”€ assertion-error -β”‚ β”‚ β”œβ”€β”€ ast-types -β”‚ β”‚ β”œβ”€β”€ ast-types-flow -β”‚ β”‚ β”œβ”€β”€ astral-regex -β”‚ β”‚ β”œβ”€β”€ async-function -β”‚ β”‚ β”œβ”€β”€ available-typed-arrays -β”‚ β”‚ β”œβ”€β”€ axe-core -β”‚ β”‚ β”œβ”€β”€ axobject-query -β”‚ β”‚ β”œβ”€β”€ balanced-match -β”‚ β”‚ β”œβ”€β”€ base64-js -β”‚ β”‚ β”œβ”€β”€ better-opn -β”‚ β”‚ β”œβ”€β”€ body-parser -β”‚ β”‚ β”œβ”€β”€ brace-expansion -β”‚ β”‚ β”œβ”€β”€ braces -β”‚ β”‚ β”œβ”€β”€ browser-assert -β”‚ β”‚ β”œβ”€β”€ browserslist -β”‚ β”‚ β”œβ”€β”€ buffer -β”‚ β”‚ β”œβ”€β”€ bytes -β”‚ β”‚ β”œβ”€β”€ cac -β”‚ β”‚ β”œβ”€β”€ cacheable -β”‚ β”‚ β”œβ”€β”€ call-bind -β”‚ β”‚ β”œβ”€β”€ call-bind-apply-helpers -β”‚ β”‚ β”œβ”€β”€ call-bound -β”‚ β”‚ β”œβ”€β”€ callsites -β”‚ β”‚ β”œβ”€β”€ camelcase -β”‚ β”‚ β”œβ”€β”€ camelcase-css -β”‚ β”‚ β”œβ”€β”€ caniuse-lite -β”‚ β”‚ β”œβ”€β”€ chai -β”‚ β”‚ β”œβ”€β”€ chalk -β”‚ β”‚ β”œβ”€β”€ check-error -β”‚ β”‚ β”œβ”€β”€ clsx -β”‚ β”‚ β”œβ”€β”€ color-convert -β”‚ β”‚ β”œβ”€β”€ color-name -β”‚ β”‚ β”œβ”€β”€ colord -β”‚ β”‚ β”œβ”€β”€ concat-map -β”‚ β”‚ β”œβ”€β”€ content-disposition -β”‚ β”‚ β”œβ”€β”€ content-type -β”‚ β”‚ β”œβ”€β”€ convert-source-map -β”‚ β”‚ β”œβ”€β”€ cookie -β”‚ β”‚ β”œβ”€β”€ cookie-signature -β”‚ β”‚ β”œβ”€β”€ cors -β”‚ β”‚ β”œβ”€β”€ cosmiconfig -β”‚ β”‚ β”œβ”€β”€ cross-spawn -β”‚ β”‚ β”œβ”€β”€ css-functions-list -β”‚ β”‚ β”œβ”€β”€ css-tree -β”‚ β”‚ β”œβ”€β”€ css.escape -β”‚ β”‚ β”œβ”€β”€ cssesc -β”‚ β”‚ β”œβ”€β”€ cssstyle -β”‚ β”‚ β”œβ”€β”€ csstype -β”‚ β”‚ β”œβ”€β”€ damerau-levenshtein -β”‚ β”‚ β”œβ”€β”€ data-urls -β”‚ β”‚ β”œβ”€β”€ data-view-buffer -β”‚ β”‚ β”œβ”€β”€ data-view-byte-length -β”‚ β”‚ β”œβ”€β”€ data-view-byte-offset -β”‚ β”‚ β”œβ”€β”€ debug -β”‚ β”‚ β”œβ”€β”€ decimal.js -β”‚ β”‚ β”œβ”€β”€ deep-eql -β”‚ β”‚ β”œβ”€β”€ deep-is -β”‚ β”‚ β”œβ”€β”€ define-data-property -β”‚ β”‚ β”œβ”€β”€ define-lazy-prop -β”‚ β”‚ β”œβ”€β”€ define-properties -β”‚ β”‚ β”œβ”€β”€ depd -β”‚ β”‚ β”œβ”€β”€ dequal -β”‚ β”‚ β”œβ”€β”€ detect-node-es -β”‚ β”‚ β”œβ”€β”€ dir-glob -β”‚ β”‚ β”œβ”€β”€ doctrine -β”‚ β”‚ β”œβ”€β”€ dom-accessibility-api -β”‚ β”‚ β”œβ”€β”€ dot-case -β”‚ β”‚ β”œβ”€β”€ dunder-proto -β”‚ β”‚ β”œβ”€β”€ eastasianwidth -β”‚ β”‚ β”œβ”€β”€ ee-first -β”‚ β”‚ β”œβ”€β”€ electron-to-chromium -β”‚ β”‚ β”œβ”€β”€ emoji-regex -β”‚ β”‚ β”œβ”€β”€ encodeurl -β”‚ β”‚ β”œβ”€β”€ entities -β”‚ β”‚ β”œβ”€β”€ env-paths -β”‚ β”‚ β”œβ”€β”€ error-ex -β”‚ β”‚ β”œβ”€β”€ es-abstract -β”‚ β”‚ β”œβ”€β”€ es-define-property -β”‚ β”‚ β”œβ”€β”€ es-errors -β”‚ β”‚ β”œβ”€β”€ es-iterator-helpers -β”‚ β”‚ β”œβ”€β”€ es-module-lexer -β”‚ β”‚ β”œβ”€β”€ es-object-atoms -β”‚ β”‚ β”œβ”€β”€ es-set-tostringtag -β”‚ β”‚ β”œβ”€β”€ es-shim-unscopables -β”‚ β”‚ β”œβ”€β”€ es-to-primitive -β”‚ β”‚ β”œβ”€β”€ esbuild -β”‚ β”‚ β”œβ”€β”€ esbuild-register -β”‚ β”‚ β”œβ”€β”€ escalade -β”‚ β”‚ β”œβ”€β”€ escape-html -β”‚ β”‚ β”œβ”€β”€ escape-string-regexp -β”‚ β”‚ β”œβ”€β”€ eslint -β”‚ β”‚ β”œβ”€β”€ eslint-config-mantine -β”‚ β”‚ β”œβ”€β”€ eslint-plugin-jsx-a11y -β”‚ β”‚ β”œβ”€β”€ eslint-plugin-react -β”‚ β”‚ β”œβ”€β”€ eslint-scope -β”‚ β”‚ β”œβ”€β”€ eslint-visitor-keys -β”‚ β”‚ β”œβ”€β”€ espree -β”‚ β”‚ β”œβ”€β”€ esprima -β”‚ β”‚ β”œβ”€β”€ esquery -β”‚ β”‚ β”œβ”€β”€ esrecurse -β”‚ β”‚ β”œβ”€β”€ estraverse -β”‚ β”‚ β”œβ”€β”€ estree-walker -β”‚ β”‚ β”œβ”€β”€ esutils -β”‚ β”‚ β”œβ”€β”€ etag -β”‚ β”‚ β”œβ”€β”€ eventsource -β”‚ β”‚ β”œβ”€β”€ eventsource-parser -β”‚ β”‚ β”œβ”€β”€ expect-type -β”‚ β”‚ β”œβ”€β”€ express -β”‚ β”‚ β”œβ”€β”€ express-rate-limit -β”‚ β”‚ β”œβ”€β”€ fast-deep-equal -β”‚ β”‚ β”œβ”€β”€ fast-glob -β”‚ β”‚ β”œβ”€β”€ fast-json-stable-stringify -β”‚ β”‚ β”œβ”€β”€ fast-levenshtein -β”‚ β”‚ β”œβ”€β”€ fast-uri -β”‚ β”‚ β”œβ”€β”€ fastest-levenshtein -β”‚ β”‚ β”œβ”€β”€ fastq -β”‚ β”‚ β”œβ”€β”€ fdir -β”‚ β”‚ β”œβ”€β”€ fflate -β”‚ β”‚ β”œβ”€β”€ file-entry-cache -β”‚ β”‚ β”œβ”€β”€ fill-range -β”‚ β”‚ β”œβ”€β”€ finalhandler -β”‚ β”‚ β”œβ”€β”€ find-up -β”‚ β”‚ β”œβ”€β”€ flat-cache -β”‚ β”‚ β”œβ”€β”€ flatted -β”‚ β”‚ β”œβ”€β”€ for-each -β”‚ β”‚ β”œβ”€β”€ foreground-child -β”‚ β”‚ β”œβ”€β”€ forwarded -β”‚ β”‚ β”œβ”€β”€ fresh -β”‚ β”‚ β”œβ”€β”€ function-bind -β”‚ β”‚ β”œβ”€β”€ function.prototype.name -β”‚ β”‚ β”œβ”€β”€ functions-have-names -β”‚ β”‚ β”œβ”€β”€ gensync -β”‚ β”‚ β”œβ”€β”€ get-intrinsic -β”‚ β”‚ β”œβ”€β”€ get-nonce -β”‚ β”‚ β”œβ”€β”€ get-proto -β”‚ β”‚ β”œβ”€β”€ get-symbol-description -β”‚ β”‚ β”œβ”€β”€ glob -β”‚ β”‚ β”œβ”€β”€ glob-parent -β”‚ β”‚ β”œβ”€β”€ global-modules -β”‚ β”‚ β”œβ”€β”€ global-prefix -β”‚ β”‚ β”œβ”€β”€ globals -β”‚ β”‚ β”œβ”€β”€ globalthis -β”‚ β”‚ β”œβ”€β”€ globby -β”‚ β”‚ β”œβ”€β”€ globjoin -β”‚ β”‚ β”œβ”€β”€ globrex -β”‚ β”‚ β”œβ”€β”€ gopd -β”‚ β”‚ β”œβ”€β”€ graphemer -β”‚ β”‚ β”œβ”€β”€ harmony-reflect -β”‚ β”‚ β”œβ”€β”€ has-bigints -β”‚ β”‚ β”œβ”€β”€ has-flag -β”‚ β”‚ β”œβ”€β”€ has-property-descriptors -β”‚ β”‚ β”œβ”€β”€ has-proto -β”‚ β”‚ β”œβ”€β”€ has-symbols -β”‚ β”‚ β”œβ”€β”€ has-tostringtag -β”‚ β”‚ β”œβ”€β”€ hasown -β”‚ β”‚ β”œβ”€β”€ hookified -β”‚ β”‚ β”œβ”€β”€ html-encoding-sniffer -β”‚ β”‚ β”œβ”€β”€ html-tags -β”‚ β”‚ β”œβ”€β”€ http-errors -β”‚ β”‚ β”œβ”€β”€ http-proxy-agent -β”‚ β”‚ β”œβ”€β”€ https-proxy-agent -β”‚ β”‚ β”œβ”€β”€ iconv-lite -β”‚ β”‚ β”œβ”€β”€ identity-obj-proxy -β”‚ β”‚ β”œβ”€β”€ ieee754 -β”‚ β”‚ β”œβ”€β”€ ignore -β”‚ β”‚ β”œβ”€β”€ import-fresh -β”‚ β”‚ β”œβ”€β”€ imurmurhash -β”‚ β”‚ β”œβ”€β”€ indent-string -β”‚ β”‚ β”œβ”€β”€ inherits -β”‚ β”‚ β”œβ”€β”€ ini -β”‚ β”‚ β”œβ”€β”€ internal-slot -β”‚ β”‚ β”œβ”€β”€ ipaddr.js -β”‚ β”‚ β”œβ”€β”€ is-arguments -β”‚ β”‚ β”œβ”€β”€ is-array-buffer -β”‚ β”‚ β”œβ”€β”€ is-arrayish -β”‚ β”‚ β”œβ”€β”€ is-async-function -β”‚ β”‚ β”œβ”€β”€ is-bigint -β”‚ β”‚ β”œβ”€β”€ is-boolean-object -β”‚ β”‚ β”œβ”€β”€ is-callable -β”‚ β”‚ β”œβ”€β”€ is-core-module -β”‚ β”‚ β”œβ”€β”€ is-data-view -β”‚ β”‚ β”œβ”€β”€ is-date-object -β”‚ β”‚ β”œβ”€β”€ is-docker -β”‚ β”‚ β”œβ”€β”€ is-extglob -β”‚ β”‚ β”œβ”€β”€ is-finalizationregistry -β”‚ β”‚ β”œβ”€β”€ is-fullwidth-code-point -β”‚ β”‚ β”œβ”€β”€ is-generator-function -β”‚ β”‚ β”œβ”€β”€ is-glob -β”‚ β”‚ β”œβ”€β”€ is-map -β”‚ β”‚ β”œβ”€β”€ is-number -β”‚ β”‚ β”œβ”€β”€ is-number-object -β”‚ β”‚ β”œβ”€β”€ is-plain-object -β”‚ β”‚ β”œβ”€β”€ is-potential-custom-element-name -β”‚ β”‚ β”œβ”€β”€ is-promise -β”‚ β”‚ β”œβ”€β”€ is-regex -β”‚ β”‚ β”œβ”€β”€ is-set -β”‚ β”‚ β”œβ”€β”€ is-shared-array-buffer -β”‚ β”‚ β”œβ”€β”€ is-string -β”‚ β”‚ β”œβ”€β”€ is-symbol -β”‚ β”‚ β”œβ”€β”€ is-typed-array -β”‚ β”‚ β”œβ”€β”€ is-weakmap -β”‚ β”‚ β”œβ”€β”€ is-weakref -β”‚ β”‚ β”œβ”€β”€ is-weakset -β”‚ β”‚ β”œβ”€β”€ is-wsl -β”‚ β”‚ β”œβ”€β”€ isarray -β”‚ β”‚ β”œβ”€β”€ isexe -β”‚ β”‚ β”œβ”€β”€ iterator.prototype -β”‚ β”‚ β”œβ”€β”€ its-fine -β”‚ β”‚ β”œβ”€β”€ jackspeak -β”‚ β”‚ β”œβ”€β”€ js-tokens -β”‚ β”‚ β”œβ”€β”€ js-yaml -β”‚ β”‚ β”œβ”€β”€ jsdoc-type-pratt-parser -β”‚ β”‚ β”œβ”€β”€ jsdom -β”‚ β”‚ β”œβ”€β”€ jsesc -β”‚ β”‚ β”œβ”€β”€ json-buffer -β”‚ β”‚ β”œβ”€β”€ json-parse-even-better-errors -β”‚ β”‚ β”œβ”€β”€ json-schema-traverse -β”‚ β”‚ β”œβ”€β”€ json-stable-stringify-without-jsonify -β”‚ β”‚ β”œβ”€β”€ json5 -β”‚ β”‚ β”œβ”€β”€ jsx-ast-utils -β”‚ β”‚ β”œβ”€β”€ keyv -β”‚ β”‚ β”œβ”€β”€ kind-of -β”‚ β”‚ β”œβ”€β”€ known-css-properties -β”‚ β”‚ β”œβ”€β”€ language-subtag-registry -β”‚ β”‚ β”œβ”€β”€ language-tags -β”‚ β”‚ β”œβ”€β”€ levn -β”‚ β”‚ β”œβ”€β”€ lines-and-columns -β”‚ β”‚ β”œβ”€β”€ locate-path -β”‚ β”‚ β”œβ”€β”€ lodash -β”‚ β”‚ β”œβ”€β”€ lodash.merge -β”‚ β”‚ β”œβ”€β”€ lodash.truncate -β”‚ β”‚ β”œβ”€β”€ loose-envify -β”‚ β”‚ β”œβ”€β”€ loupe -β”‚ β”‚ β”œβ”€β”€ lower-case -β”‚ β”‚ β”œβ”€β”€ lru-cache -β”‚ β”‚ β”œβ”€β”€ lz-string -β”‚ β”‚ β”œβ”€β”€ magic-string -β”‚ β”‚ β”œβ”€β”€ map-or-similar -β”‚ β”‚ β”œβ”€β”€ math-intrinsics -β”‚ β”‚ β”œβ”€β”€ mathml-tag-names -β”‚ β”‚ β”œβ”€β”€ mdn-data -β”‚ β”‚ β”œβ”€β”€ media-typer -β”‚ β”‚ β”œβ”€β”€ memoizerific -β”‚ β”‚ β”œβ”€β”€ meow -β”‚ β”‚ β”œβ”€β”€ merge-descriptors -β”‚ β”‚ β”œβ”€β”€ merge2 -β”‚ β”‚ β”œβ”€β”€ meshoptimizer -β”‚ β”‚ β”œβ”€β”€ micromatch -β”‚ β”‚ β”œβ”€β”€ mime-db -β”‚ β”‚ β”œβ”€β”€ mime-types -β”‚ β”‚ β”œβ”€β”€ min-indent -β”‚ β”‚ β”œβ”€β”€ minimatch -β”‚ β”‚ β”œβ”€β”€ minimist -β”‚ β”‚ β”œβ”€β”€ minipass -β”‚ β”‚ β”œβ”€β”€ ms -β”‚ β”‚ β”œβ”€β”€ nanoid -β”‚ β”‚ β”œβ”€β”€ natural-compare -β”‚ β”‚ β”œβ”€β”€ negotiator -β”‚ β”‚ β”œβ”€β”€ no-case -β”‚ β”‚ β”œβ”€β”€ node-releases -β”‚ β”‚ β”œβ”€β”€ normalize-path -β”‚ β”‚ β”œβ”€β”€ nwsapi -β”‚ β”‚ β”œβ”€β”€ object-assign -β”‚ β”‚ β”œβ”€β”€ object-inspect -β”‚ β”‚ β”œβ”€β”€ object-keys -β”‚ β”‚ β”œβ”€β”€ object.assign -β”‚ β”‚ β”œβ”€β”€ object.entries -β”‚ β”‚ β”œβ”€β”€ object.fromentries -β”‚ β”‚ β”œβ”€β”€ object.values -β”‚ β”‚ β”œβ”€β”€ on-finished -β”‚ β”‚ β”œβ”€β”€ once -β”‚ β”‚ β”œβ”€β”€ open -β”‚ β”‚ β”œβ”€β”€ optionator -β”‚ β”‚ β”œβ”€β”€ own-keys -β”‚ β”‚ β”œβ”€β”€ p-limit -β”‚ β”‚ β”œβ”€β”€ p-locate -β”‚ β”‚ β”œβ”€β”€ package-json-from-dist -β”‚ β”‚ β”œβ”€β”€ parent-module -β”‚ β”‚ β”œβ”€β”€ parse-json -β”‚ β”‚ β”œβ”€β”€ parse5 -β”‚ β”‚ β”œβ”€β”€ parseurl -β”‚ β”‚ β”œβ”€β”€ path-exists -β”‚ β”‚ β”œβ”€β”€ path-key -β”‚ β”‚ β”œβ”€β”€ path-parse -β”‚ β”‚ β”œβ”€β”€ path-scurry -β”‚ β”‚ β”œβ”€β”€ path-to-regexp -β”‚ β”‚ β”œβ”€β”€ path-type -β”‚ β”‚ β”œβ”€β”€ pathe -β”‚ β”‚ β”œβ”€β”€ pathval -β”‚ β”‚ β”œβ”€β”€ picocolors -β”‚ β”‚ β”œβ”€β”€ picomatch -β”‚ β”‚ β”œβ”€β”€ pkce-challenge -β”‚ β”‚ β”œβ”€β”€ possible-typed-array-names -β”‚ β”‚ β”œβ”€β”€ postcss -β”‚ β”‚ β”œβ”€β”€ postcss-js -β”‚ β”‚ β”œβ”€β”€ postcss-media-query-parser -β”‚ β”‚ β”œβ”€β”€ postcss-mixins -β”‚ β”‚ β”œβ”€β”€ postcss-nested -β”‚ β”‚ β”œβ”€β”€ postcss-preset-mantine -β”‚ β”‚ β”œβ”€β”€ postcss-resolve-nested-selector -β”‚ β”‚ β”œβ”€β”€ postcss-safe-parser -β”‚ β”‚ β”œβ”€β”€ postcss-scss -β”‚ β”‚ β”œβ”€β”€ postcss-selector-parser -β”‚ β”‚ β”œβ”€β”€ postcss-simple-vars -β”‚ β”‚ β”œβ”€β”€ postcss-value-parser -β”‚ β”‚ β”œβ”€β”€ prelude-ls -β”‚ β”‚ β”œβ”€β”€ prettier -β”‚ β”‚ β”œβ”€β”€ pretty-format -β”‚ β”‚ β”œβ”€β”€ process -β”‚ β”‚ β”œβ”€β”€ prop-types -β”‚ β”‚ β”œβ”€β”€ proxy-addr -β”‚ β”‚ β”œβ”€β”€ punycode -β”‚ β”‚ β”œβ”€β”€ qs -β”‚ β”‚ β”œβ”€β”€ queue-microtask -β”‚ β”‚ β”œβ”€β”€ range-parser -β”‚ β”‚ β”œβ”€β”€ raw-body -β”‚ β”‚ β”œβ”€β”€ re-resizable -β”‚ β”‚ β”œβ”€β”€ react -β”‚ β”‚ β”œβ”€β”€ react-docgen -β”‚ β”‚ β”œβ”€β”€ react-docgen-typescript -β”‚ β”‚ β”œβ”€β”€ react-dom -β”‚ β”‚ β”œβ”€β”€ react-draggable -β”‚ β”‚ β”œβ”€β”€ react-is -β”‚ β”‚ β”œβ”€β”€ react-number-format -β”‚ β”‚ β”œβ”€β”€ react-reconciler -β”‚ β”‚ β”œβ”€β”€ react-refresh -β”‚ β”‚ β”œβ”€β”€ react-remove-scroll -β”‚ β”‚ β”œβ”€β”€ react-remove-scroll-bar -β”‚ β”‚ β”œβ”€β”€ react-rnd -β”‚ β”‚ β”œβ”€β”€ react-router -β”‚ β”‚ β”œβ”€β”€ react-router-dom -β”‚ β”‚ β”œβ”€β”€ react-style-singleton -β”‚ β”‚ β”œβ”€β”€ react-textarea-autosize -β”‚ β”‚ β”œβ”€β”€ react-use-measure -β”‚ β”‚ β”œβ”€β”€ recast -β”‚ β”‚ β”œβ”€β”€ redent -β”‚ β”‚ β”œβ”€β”€ reflect.getprototypeof -β”‚ β”‚ β”œβ”€β”€ regexp.prototype.flags -β”‚ β”‚ β”œβ”€β”€ require-from-string -β”‚ β”‚ β”œβ”€β”€ resolve -β”‚ β”‚ β”œβ”€β”€ resolve-from -β”‚ β”‚ β”œβ”€β”€ reusify -β”‚ β”‚ β”œβ”€β”€ rollup -β”‚ β”‚ β”œβ”€β”€ router -β”‚ β”‚ β”œβ”€β”€ rrweb-cssom -β”‚ β”‚ β”œβ”€β”€ run-parallel -β”‚ β”‚ β”œβ”€β”€ safe-array-concat -β”‚ β”‚ β”œβ”€β”€ safe-buffer -β”‚ β”‚ β”œβ”€β”€ safe-push-apply -β”‚ β”‚ β”œβ”€β”€ safe-regex-test -β”‚ β”‚ β”œβ”€β”€ safer-buffer -β”‚ β”‚ β”œβ”€β”€ saxes -β”‚ β”‚ β”œβ”€β”€ scheduler -β”‚ β”‚ β”œβ”€β”€ semver -β”‚ β”‚ β”œβ”€β”€ send -β”‚ β”‚ β”œβ”€β”€ serve-static -β”‚ β”‚ β”œβ”€β”€ set-cookie-parser -β”‚ β”‚ β”œβ”€β”€ set-function-length -β”‚ β”‚ β”œβ”€β”€ set-function-name -β”‚ β”‚ β”œβ”€β”€ set-proto -β”‚ β”‚ β”œβ”€β”€ setprototypeof -β”‚ β”‚ β”œβ”€β”€ shebang-command -β”‚ β”‚ β”œβ”€β”€ shebang-regex -β”‚ β”‚ β”œβ”€β”€ side-channel -β”‚ β”‚ β”œβ”€β”€ side-channel-list -β”‚ β”‚ β”œβ”€β”€ side-channel-map -β”‚ β”‚ β”œβ”€β”€ side-channel-weakmap -β”‚ β”‚ β”œβ”€β”€ siginfo -β”‚ β”‚ β”œβ”€β”€ signal-exit -β”‚ β”‚ β”œβ”€β”€ slash -β”‚ β”‚ β”œβ”€β”€ slice-ansi -β”‚ β”‚ β”œβ”€β”€ snake-case -β”‚ β”‚ β”œβ”€β”€ source-map -β”‚ β”‚ β”œβ”€β”€ source-map-js -β”‚ β”‚ β”œβ”€β”€ stackback -β”‚ β”‚ β”œβ”€β”€ statuses -β”‚ β”‚ β”œβ”€β”€ std-env -β”‚ β”‚ β”œβ”€β”€ storybook -β”‚ β”‚ β”œβ”€β”€ storybook-dark-mode -β”‚ β”‚ β”œβ”€β”€ string-width -β”‚ β”‚ β”œβ”€β”€ string-width-cjs -β”‚ β”‚ β”œβ”€β”€ string.prototype.includes -β”‚ β”‚ β”œβ”€β”€ string.prototype.matchall -β”‚ β”‚ β”œβ”€β”€ string.prototype.repeat -β”‚ β”‚ β”œβ”€β”€ string.prototype.trim -β”‚ β”‚ β”œβ”€β”€ string.prototype.trimend -β”‚ β”‚ β”œβ”€β”€ string.prototype.trimstart -β”‚ β”‚ β”œβ”€β”€ strip-ansi -β”‚ β”‚ β”œβ”€β”€ strip-ansi-cjs -β”‚ β”‚ β”œβ”€β”€ strip-bom -β”‚ β”‚ β”œβ”€β”€ strip-indent -β”‚ β”‚ β”œβ”€β”€ strip-json-comments -β”‚ β”‚ β”œβ”€β”€ stylelint -β”‚ β”‚ β”œβ”€β”€ stylelint-config-recommended -β”‚ β”‚ β”œβ”€β”€ stylelint-config-recommended-scss -β”‚ β”‚ β”œβ”€β”€ stylelint-config-standard -β”‚ β”‚ β”œβ”€β”€ stylelint-config-standard-scss -β”‚ β”‚ β”œβ”€β”€ stylelint-scss -β”‚ β”‚ β”œβ”€β”€ sugarss -β”‚ β”‚ β”œβ”€β”€ supports-color -β”‚ β”‚ β”œβ”€β”€ supports-hyperlinks -β”‚ β”‚ β”œβ”€β”€ supports-preserve-symlinks-flag -β”‚ β”‚ β”œβ”€β”€ suspend-react -β”‚ β”‚ β”œβ”€β”€ svg-parser -β”‚ β”‚ β”œβ”€β”€ svg-tags -β”‚ β”‚ β”œβ”€β”€ symbol-tree -β”‚ β”‚ β”œβ”€β”€ tabbable -β”‚ β”‚ β”œβ”€β”€ table -β”‚ β”‚ β”œβ”€β”€ three -β”‚ β”‚ β”œβ”€β”€ tiny-invariant -β”‚ β”‚ β”œβ”€β”€ tinybench -β”‚ β”‚ β”œβ”€β”€ tinyexec -β”‚ β”‚ β”œβ”€β”€ tinyglobby -β”‚ β”‚ β”œβ”€β”€ tinypool -β”‚ β”‚ β”œβ”€β”€ tinyrainbow -β”‚ β”‚ β”œβ”€β”€ tinyspy -β”‚ β”‚ β”œβ”€β”€ tldts -β”‚ β”‚ β”œβ”€β”€ tldts-core -β”‚ β”‚ β”œβ”€β”€ to-regex-range -β”‚ β”‚ β”œβ”€β”€ toidentifier -β”‚ β”‚ β”œβ”€β”€ tough-cookie -β”‚ β”‚ β”œβ”€β”€ tr46 -β”‚ β”‚ β”œβ”€β”€ ts-api-utils -β”‚ β”‚ β”œβ”€β”€ ts-dedent -β”‚ β”‚ β”œβ”€β”€ tsconfck -β”‚ β”‚ β”œβ”€β”€ tsconfig-paths -β”‚ β”‚ β”œβ”€β”€ tslib -β”‚ β”‚ β”œβ”€β”€ turbo-stream -β”‚ β”‚ β”œβ”€β”€ type-check -β”‚ β”‚ β”œβ”€β”€ type-fest -β”‚ β”‚ β”œβ”€β”€ type-is -β”‚ β”‚ β”œβ”€β”€ typed-array-buffer -β”‚ β”‚ β”œβ”€β”€ typed-array-byte-length -β”‚ β”‚ β”œβ”€β”€ typed-array-byte-offset -β”‚ β”‚ β”œβ”€β”€ typed-array-length -β”‚ β”‚ β”œβ”€β”€ typescript -β”‚ β”‚ β”œβ”€β”€ typescript-eslint -β”‚ β”‚ β”œβ”€β”€ unbox-primitive -β”‚ β”‚ β”œβ”€β”€ undici-types -β”‚ β”‚ β”œβ”€β”€ unpipe -β”‚ β”‚ β”œβ”€β”€ unplugin -β”‚ β”‚ β”œβ”€β”€ update-browserslist-db -β”‚ β”‚ β”œβ”€β”€ uri-js -β”‚ β”‚ β”œβ”€β”€ use-callback-ref -β”‚ β”‚ β”œβ”€β”€ use-composed-ref -β”‚ β”‚ β”œβ”€β”€ use-isomorphic-layout-effect -β”‚ β”‚ β”œβ”€β”€ use-latest -β”‚ β”‚ β”œβ”€β”€ use-sidecar -β”‚ β”‚ β”œβ”€β”€ use-sync-external-store -β”‚ β”‚ β”œβ”€β”€ util -β”‚ β”‚ β”œβ”€β”€ util-deprecate -β”‚ β”‚ β”œβ”€β”€ vary -β”‚ β”‚ β”œβ”€β”€ vite -β”‚ β”‚ β”œβ”€β”€ vite-node -β”‚ β”‚ β”œβ”€β”€ vite-plugin-svgr -β”‚ β”‚ β”œβ”€β”€ vite-tsconfig-paths -β”‚ β”‚ β”œβ”€β”€ vitest -β”‚ β”‚ β”œβ”€β”€ w3c-xmlserializer -β”‚ β”‚ β”œβ”€β”€ webidl-conversions -β”‚ β”‚ β”œβ”€β”€ webpack-virtual-modules -β”‚ β”‚ β”œβ”€β”€ whatwg-encoding -β”‚ β”‚ β”œβ”€β”€ whatwg-mimetype -β”‚ β”‚ β”œβ”€β”€ whatwg-url -β”‚ β”‚ β”œβ”€β”€ which -β”‚ β”‚ β”œβ”€β”€ which-boxed-primitive -β”‚ β”‚ β”œβ”€β”€ which-builtin-type -β”‚ β”‚ β”œβ”€β”€ which-collection -β”‚ β”‚ β”œβ”€β”€ which-typed-array -β”‚ β”‚ β”œβ”€β”€ why-is-node-running -β”‚ β”‚ β”œβ”€β”€ word-wrap -β”‚ β”‚ β”œβ”€β”€ wrap-ansi -β”‚ β”‚ β”œβ”€β”€ wrap-ansi-cjs -β”‚ β”‚ β”œβ”€β”€ wrappy -β”‚ β”‚ β”œβ”€β”€ write-file-atomic -β”‚ β”‚ β”œβ”€β”€ ws -β”‚ β”‚ β”œβ”€β”€ xml-name-validator -β”‚ β”‚ β”œβ”€β”€ xmlchars -β”‚ β”‚ β”œβ”€β”€ yallist -β”‚ β”‚ β”œβ”€β”€ yocto-queue -β”‚ β”‚ β”œβ”€β”€ zod -β”‚ β”‚ β”œβ”€β”€ zod-to-json-schema -β”‚ β”‚ └── zustand -β”‚ β”œβ”€β”€ package-lock.json -β”‚ β”œβ”€β”€ package.json -β”‚ β”œβ”€β”€ postcss.config.cjs -β”‚ β”œβ”€β”€ src -β”‚ β”‚ β”œβ”€β”€ App.tsx -β”‚ β”‚ β”œβ”€β”€ Router.tsx -β”‚ β”‚ β”œβ”€β”€ assets -β”‚ β”‚ β”œβ”€β”€ components -β”‚ β”‚ β”œβ”€β”€ data -β”‚ β”‚ β”œβ”€β”€ main.tsx -β”‚ β”‚ β”œβ”€β”€ pages -β”‚ β”‚ β”œβ”€β”€ theme.ts -β”‚ β”‚ β”œβ”€β”€ types -β”‚ β”‚ └── vite-env.d.ts -β”‚ β”œβ”€β”€ test-utils -β”‚ β”‚ β”œβ”€β”€ index.ts -β”‚ β”‚ └── render.tsx -β”‚ β”œβ”€β”€ tsconfig.json -β”‚ β”œβ”€β”€ vite.config.js -β”‚ β”œβ”€β”€ vitest.setup.mjs -β”‚ └── yarn.lock -β”œβ”€β”€ github_tutorial.ipynb +β”‚ β”‚ β”œβ”€β”€ charts_examples_endpoint_v1.py +β”‚ β”‚ └── ping_endpoint_v1.py +β”‚ β”œβ”€β”€ llms +β”‚ β”‚ β”œβ”€β”€ __pycache__ +β”‚ β”‚ β”œβ”€β”€ llm_chat_endpoint_v1.py +β”‚ β”‚ └── llm_chat_srvc.py +β”‚ └── text_manager +β”‚ β”œβ”€β”€ __pycache__ +β”‚ β”œβ”€β”€ text_manager_endpoint_v1.py +β”‚ β”œβ”€β”€ text_manager_schema.py +β”‚ └── text_manager_srvc.py β”œβ”€β”€ main.py -β”œβ”€β”€ notebooks -β”‚ └── hacer_script_nombres.ipynb -β”œβ”€β”€ prueba_loop_agente.py -β”œβ”€β”€ prueba_mcp.py -β”œβ”€β”€ pruebas_conceptos -β”‚ β”œβ”€β”€ async -β”‚ β”‚ β”œβ”€β”€ async_con_procesos.py -β”‚ β”‚ β”œβ”€β”€ cliente.py -β”‚ β”‚ β”œβ”€β”€ esperar_await.py -β”‚ β”‚ β”œβ”€β”€ prueba_async.py -β”‚ β”‚ └── server_loop.py -β”‚ β”œβ”€β”€ aΓ±adir_vectores_textos_postgres -β”‚ β”‚ └── pruebas_vectores.ipynb -β”‚ β”œβ”€β”€ duckdb -β”‚ β”‚ β”œβ”€β”€ prueba_duckdb.ipynb -β”‚ β”‚ β”œβ”€β”€ textos_vss.duckdb -β”‚ β”‚ └── textos_vss.duckdb.wal -β”‚ └── postgres_extensions -β”‚ β”œβ”€β”€ Dockerfile -β”‚ β”œβ”€β”€ backup_postgres15.sql -β”‚ β”œβ”€β”€ docker-compose.yml -β”‚ β”œβ”€β”€ init.sql -β”‚ └── pgdata -β”œβ”€β”€ pyproject.toml -β”œβ”€β”€ scripts -β”‚ β”œβ”€β”€ __init_.py -β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ └── prueba_carga_postrgesql.cpython-311.pyc -β”‚ └── datos_para_llms -β”‚ └── generar_tree.py -β”œβ”€β”€ src -β”‚ β”œβ”€β”€ ApiKeys -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ β”œβ”€β”€ openai_apikey.py -β”‚ β”‚ └── openai_apikey_mmr.py -β”‚ β”œβ”€β”€ ConexionApis -β”‚ β”‚ β”œβ”€β”€ OpenAi_conexion.py -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── __pycache__ -β”‚ β”œβ”€β”€ ConexionSql -β”‚ β”‚ β”œβ”€β”€ Base_conexion.py -β”‚ β”‚ β”œβ”€β”€ Postgres_conexion.py -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── __pycache__ -β”‚ β”œβ”€β”€ Credenciales -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ β”œβ”€β”€ postgres_credencial.py -β”‚ β”‚ └── postgres_credencial_mmr.py -β”‚ β”œβ”€β”€ Llms -β”‚ β”‚ β”œβ”€β”€ Agente.py -β”‚ β”‚ β”œβ”€β”€ Embedders -β”‚ β”‚ β”œβ”€β”€ MCPs -β”‚ β”‚ β”œβ”€β”€ Memory -β”‚ β”‚ β”œβ”€β”€ Modelos -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── __pycache__ -β”‚ β”œβ”€β”€ Security -β”‚ β”‚ β”œβ”€β”€ Encriptar.py -β”‚ β”‚ β”œβ”€β”€ GenerarIDs.py -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── __pycache__ -β”‚ β”œβ”€β”€ TextManager -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ β”œβ”€β”€ biblioteca.py -β”‚ β”‚ β”œβ”€β”€ biblioteca_mmr.py -β”‚ β”‚ β”œβ”€β”€ nota.py -β”‚ β”‚ └── notas_biblioteca_mmr.py -β”‚ β”œβ”€β”€ __init__.py -β”‚ β”œβ”€β”€ __pycache__ -β”‚ β”‚ β”œβ”€β”€ __init__.cpython-311.pyc -β”‚ β”‚ └── base.cpython-311.pyc -β”‚ └── base.py -└── utils - β”œβ”€β”€ Generar_nombres.py - β”œβ”€β”€ __init__.py - └── __pycache__ - β”œβ”€β”€ Generar_nombres.cpython-311.pyc - └── __init__.cpython-311.pyc \ No newline at end of file +└── router_v1.py \ No newline at end of file diff --git a/src/ApiKeys/__init__.py b/domains/ApiKeys/__init__.py similarity index 100% rename from src/ApiKeys/__init__.py rename to domains/ApiKeys/__init__.py diff --git a/src/ApiKeys/openai_apikey.py b/domains/ApiKeys/openai_apikey.py similarity index 93% rename from src/ApiKeys/openai_apikey.py rename to domains/ApiKeys/openai_apikey.py index 32bdaef..814a671 100644 --- a/src/ApiKeys/openai_apikey.py +++ b/domains/ApiKeys/openai_apikey.py @@ -1,4 +1,4 @@ -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Security.GenerarIDs import GeneradorIDUnico class OpenAICredencial: def __init__(self, titulo: str, api_key: str, organizacion: str = None, id: str = None): diff --git a/src/ApiKeys/openai_apikey_mmr.py b/domains/ApiKeys/openai_apikey_mmr.py similarity index 88% rename from src/ApiKeys/openai_apikey_mmr.py rename to domains/ApiKeys/openai_apikey_mmr.py index fda0d8b..0dd2754 100644 --- a/src/ApiKeys/openai_apikey_mmr.py +++ b/domains/ApiKeys/openai_apikey_mmr.py @@ -3,17 +3,17 @@ import base64 from dotenv import load_dotenv from sqlalchemy import Column, Integer, String -from src.ConexionSql.Base_conexion import ConexionBase -from src.base import Base -from src.ApiKeys.openai_apikey import OpenAICredencial -from src.Security.Encriptar import Encriptar_fernet +from domains.ConexionSql.Base_conexion import ConexionBase +from domains.base import Base +from domains.ApiKeys.openai_apikey import OpenAICredencial +from domains.Security.Encriptar import Encriptar_fernet from entrypoint import ENV_PATH -from src.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Mapper import Mapper_base from sqlalchemy import Column, String -from src.ArquitectureLayer.Model import Model_base -from src.ArquitectureLayer.Repo import Repo_base +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Repo import Repo_base # ---------------------- diff --git a/src/ArquitectureLayer/Mapper.py b/domains/ArquitectureLayer/Mapper.py similarity index 100% rename from src/ArquitectureLayer/Mapper.py rename to domains/ArquitectureLayer/Mapper.py diff --git a/src/ArquitectureLayer/Model.py b/domains/ArquitectureLayer/Model.py similarity index 100% rename from src/ArquitectureLayer/Model.py rename to domains/ArquitectureLayer/Model.py diff --git a/src/ArquitectureLayer/Repo.py b/domains/ArquitectureLayer/Repo.py similarity index 98% rename from src/ArquitectureLayer/Repo.py rename to domains/ArquitectureLayer/Repo.py index 7434e48..49d49f7 100644 --- a/src/ArquitectureLayer/Repo.py +++ b/domains/ArquitectureLayer/Repo.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from sqlalchemy import func from datetime import datetime -from src.ArquitectureLayer.Mapper import Mapper_base # AsegΓΊrate de importar tu ABC base +from domains.ArquitectureLayer.Mapper import Mapper_base # AsegΓΊrate de importar tu ABC base TModelo = TypeVar("TModelo") TDominio = TypeVar("TDominio") diff --git a/src/ConexionApis/Ollama_cliente.py b/domains/ConexionApis/Ollama_cliente.py similarity index 96% rename from src/ConexionApis/Ollama_cliente.py rename to domains/ConexionApis/Ollama_cliente.py index ab77238..66522d5 100644 --- a/src/ConexionApis/Ollama_cliente.py +++ b/domains/ConexionApis/Ollama_cliente.py @@ -1,5 +1,5 @@ import requests -from src.Credenciales.ollama_credencial import OllamaCredencial +from domains.Credenciales.ollama_credencial import OllamaCredencial class OllamaCliente: def __init__(self, credencial: OllamaCredencial): diff --git a/src/ConexionApis/OpenAi_conexion.py b/domains/ConexionApis/OpenAi_conexion.py similarity index 97% rename from src/ConexionApis/OpenAi_conexion.py rename to domains/ConexionApis/OpenAi_conexion.py index b67f130..828fd7a 100644 --- a/src/ConexionApis/OpenAi_conexion.py +++ b/domains/ConexionApis/OpenAi_conexion.py @@ -1,5 +1,5 @@ from openai import OpenAI -from src.ApiKeys.openai_apikey import OpenAICredencial +from domains.ApiKeys.openai_apikey import OpenAICredencial class OpenAICliente: def __init__(self, credencial: OpenAICredencial): diff --git a/src/ConexionApis/__init__.py b/domains/ConexionApis/__init__.py similarity index 100% rename from src/ConexionApis/__init__.py rename to domains/ConexionApis/__init__.py diff --git a/src/ConexionSql/Base_conexion.py b/domains/ConexionSql/Base_conexion.py similarity index 100% rename from src/ConexionSql/Base_conexion.py rename to domains/ConexionSql/Base_conexion.py diff --git a/src/ConexionSql/Postgres_conexion.py b/domains/ConexionSql/Postgres_conexion.py similarity index 93% rename from src/ConexionSql/Postgres_conexion.py rename to domains/ConexionSql/Postgres_conexion.py index 4141dd3..f6a879c 100644 --- a/src/ConexionSql/Postgres_conexion.py +++ b/domains/ConexionSql/Postgres_conexion.py @@ -4,8 +4,8 @@ from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import sessionmaker, Session from sqlalchemy.engine import Engine -from src.ConexionSql.Base_conexion import ConexionBase -from src.Credenciales.postgres_credencial import PostgresCredencial +from domains.ConexionSql.Base_conexion import ConexionBase +from domains.Credenciales.postgres_credencial import PostgresCredencial class PostgresConexion(ConexionBase): def __init__(self, *args, **kwargs): diff --git a/src/ConexionSql/__init__.py b/domains/ConexionSql/__init__.py similarity index 100% rename from src/ConexionSql/__init__.py rename to domains/ConexionSql/__init__.py diff --git a/src/Credenciales/__init__.py b/domains/Credenciales/__init__.py similarity index 100% rename from src/Credenciales/__init__.py rename to domains/Credenciales/__init__.py diff --git a/src/Credenciales/ollama_credencial.py b/domains/Credenciales/ollama_credencial.py similarity index 92% rename from src/Credenciales/ollama_credencial.py rename to domains/Credenciales/ollama_credencial.py index d37052a..0e68d68 100644 --- a/src/Credenciales/ollama_credencial.py +++ b/domains/Credenciales/ollama_credencial.py @@ -1,4 +1,4 @@ -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Security.GenerarIDs import GeneradorIDUnico class OllamaCredencial: def __init__(self, titulo: str, base_url: str = "http://localhost:11434", id: str = None): diff --git a/src/Credenciales/postgres_credencial.py b/domains/Credenciales/postgres_credencial.py similarity index 91% rename from src/Credenciales/postgres_credencial.py rename to domains/Credenciales/postgres_credencial.py index b47fb01..6177586 100644 --- a/src/Credenciales/postgres_credencial.py +++ b/domains/Credenciales/postgres_credencial.py @@ -1,4 +1,4 @@ -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Security.GenerarIDs import GeneradorIDUnico class PostgresCredencial: def __init__(self, titulo: str, host: str, port: int, dbname: str, user: str, password: str, id: str = None): diff --git a/src/Credenciales/postgres_credencial_mmr.py b/domains/Credenciales/postgres_credencial_mmr.py similarity index 90% rename from src/Credenciales/postgres_credencial_mmr.py rename to domains/Credenciales/postgres_credencial_mmr.py index 9f11584..82fb301 100644 --- a/src/Credenciales/postgres_credencial_mmr.py +++ b/domains/Credenciales/postgres_credencial_mmr.py @@ -6,14 +6,14 @@ from sqlalchemy import DateTime, Text, func import base64 -from src.ArquitectureLayer.Mapper import Mapper_base -from src.ArquitectureLayer.Model import Model_base -from src.ArquitectureLayer.Repo import Repo_base +from domains.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Repo import Repo_base -from src.ConexionSql.Base_conexion import ConexionBase -from src.base import Base -from src.Credenciales.postgres_credencial import PostgresCredencial -from src.Security.Encriptar import Encriptar_fernet +from domains.ConexionSql.Base_conexion import ConexionBase +from domains.base import Base +from domains.Credenciales.postgres_credencial import PostgresCredencial +from domains.Security.Encriptar import Encriptar_fernet # ---------------------- # Cargar clave maestra diff --git a/src/Llms/Agente.py b/domains/Llms/Agente.py similarity index 98% rename from src/Llms/Agente.py rename to domains/Llms/Agente.py index 9974188..874d6d7 100644 --- a/src/Llms/Agente.py +++ b/domains/Llms/Agente.py @@ -1,13 +1,13 @@ -from src.Llms.Modelos.Base_model import ModeloABC -from src.Llms.Memory.Base_MemoryConv import MemoryConvABC -from src.Llms.MCPs.McpClient_Registry import ClientRegistry +from domains.Llms.Modelos.Base_model import ModeloABC +from domains.Llms.Memory.Base_MemoryConv import MemoryConvABC +from domains.Llms.MCPs.McpClient_Registry import ClientRegistry from datetime import datetime from typing import Optional, List, Union, AsyncGenerator import re import json from entrypoint.init_db import db_credencial -from src.Logger.logger_db import LoggerDB, logger +from domains.Logger.logger_db import LoggerDB, logger LoggerDB(db_credencial, "logger_agentes", created_by="sistema") diff --git a/src/Llms/Embedders/Base_Embedder.py b/domains/Llms/Embedders/Base_Embedder.py similarity index 100% rename from src/Llms/Embedders/Base_Embedder.py rename to domains/Llms/Embedders/Base_Embedder.py diff --git a/src/Llms/Embedders/Openai_embedder.py b/domains/Llms/Embedders/Openai_embedder.py similarity index 77% rename from src/Llms/Embedders/Openai_embedder.py rename to domains/Llms/Embedders/Openai_embedder.py index a928dee..f0f4869 100644 --- a/src/Llms/Embedders/Openai_embedder.py +++ b/domains/Llms/Embedders/Openai_embedder.py @@ -1,8 +1,8 @@ from typing import List -from src.Llms.Embedders.Base_Embedder import EmbedderABC # AsegΓΊrate de que EmbedderABC estΓ© en este mΓ³dulo -from src.ApiKeys.openai_apikey import OpenAICredencial -from src.ConexionApis.OpenAi_conexion import OpenAICliente -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Llms.Embedders.Base_Embedder import EmbedderABC # AsegΓΊrate de que EmbedderABC estΓ© en este mΓ³dulo +from domains.ApiKeys.openai_apikey import OpenAICredencial +from domains.ConexionApis.OpenAi_conexion import OpenAICliente +from domains.Security.GenerarIDs import GeneradorIDUnico class OpenAIEmbedder(EmbedderABC): def __init__(self, credencial: OpenAICredencial, diff --git a/src/Llms/Embedders/Openai_embedder_mmr.py b/domains/Llms/Embedders/Openai_embedder_mmr.py similarity index 85% rename from src/Llms/Embedders/Openai_embedder_mmr.py rename to domains/Llms/Embedders/Openai_embedder_mmr.py index d203d1b..1d6118d 100644 --- a/src/Llms/Embedders/Openai_embedder_mmr.py +++ b/domains/Llms/Embedders/Openai_embedder_mmr.py @@ -3,15 +3,15 @@ from dotenv import load_dotenv from sqlalchemy import Column, String from sqlalchemy import Column, String, ForeignKey -from src.ArquitectureLayer.Mapper import Mapper_base -from src.ArquitectureLayer.Model import Model_base -from src.ArquitectureLayer.Repo import Repo_base +from domains.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Repo import Repo_base -from src.ConexionSql.Base_conexion import ConexionBase -from src.base import Base -from src.Security.GenerarIDs import GeneradorIDUnico -from src.Llms.Embedders.Openai_embedder import OpenAIEmbedder -from src.ApiKeys.openai_apikey import OpenAICredencial +from domains.ConexionSql.Base_conexion import ConexionBase +from domains.base import Base +from domains.Security.GenerarIDs import GeneradorIDUnico +from domains.Llms.Embedders.Openai_embedder import OpenAIEmbedder +from domains.ApiKeys.openai_apikey import OpenAICredencial # ---------------------- # Cargar configuraciΓ³n desde .env si se requiere diff --git a/src/Llms/MCPs/McpClient.py b/domains/Llms/MCPs/McpClient.py similarity index 100% rename from src/Llms/MCPs/McpClient.py rename to domains/Llms/MCPs/McpClient.py diff --git a/src/Llms/MCPs/McpClient_Registry.py b/domains/Llms/MCPs/McpClient_Registry.py similarity index 97% rename from src/Llms/MCPs/McpClient_Registry.py rename to domains/Llms/MCPs/McpClient_Registry.py index d97aec5..def7922 100644 --- a/src/Llms/MCPs/McpClient_Registry.py +++ b/domains/Llms/MCPs/McpClient_Registry.py @@ -1,4 +1,4 @@ -from src.Llms.MCPs.McpClient import MCPClient +from domains.Llms.MCPs.McpClient import MCPClient from typing import Any class ClientRegistry: diff --git a/src/Llms/MCPs/McpServer.py b/domains/Llms/MCPs/McpServer.py similarity index 100% rename from src/Llms/MCPs/McpServer.py rename to domains/Llms/MCPs/McpServer.py diff --git a/src/Llms/MCPs/McpServers/server_files.py b/domains/Llms/MCPs/McpServers/server_files.py similarity index 100% rename from src/Llms/MCPs/McpServers/server_files.py rename to domains/Llms/MCPs/McpServers/server_files.py diff --git a/src/Llms/MCPs/McpServers/server_math.py b/domains/Llms/MCPs/McpServers/server_math.py similarity index 100% rename from src/Llms/MCPs/McpServers/server_math.py rename to domains/Llms/MCPs/McpServers/server_math.py diff --git a/src/Llms/MCPs/McpServers/server_utils.py b/domains/Llms/MCPs/McpServers/server_utils.py similarity index 100% rename from src/Llms/MCPs/McpServers/server_utils.py rename to domains/Llms/MCPs/McpServers/server_utils.py diff --git a/src/Llms/MCPs/__init__.py b/domains/Llms/MCPs/__init__.py similarity index 100% rename from src/Llms/MCPs/__init__.py rename to domains/Llms/MCPs/__init__.py diff --git a/src/Llms/Memory/Base_MemoryConv.py b/domains/Llms/Memory/Base_MemoryConv.py similarity index 100% rename from src/Llms/Memory/Base_MemoryConv.py rename to domains/Llms/Memory/Base_MemoryConv.py diff --git a/src/Llms/Memory/postgres_MemoryConv.py b/domains/Llms/Memory/postgres_MemoryConv.py similarity index 89% rename from src/Llms/Memory/postgres_MemoryConv.py rename to domains/Llms/Memory/postgres_MemoryConv.py index ef1ca90..ed77009 100644 --- a/src/Llms/Memory/postgres_MemoryConv.py +++ b/domains/Llms/Memory/postgres_MemoryConv.py @@ -1,9 +1,9 @@ from sqlalchemy import Table, Column, Integer, String, MetaData, insert, select, delete from typing import Literal -from src.Credenciales.postgres_credencial import PostgresCredencial -from src.ConexionSql.Postgres_conexion import PostgresConexion # Usamos la clase especΓ­fica -from src.Llms.Memory.Base_MemoryConv import MemoryConvABC +from domains.Credenciales.postgres_credencial import PostgresCredencial +from domains.ConexionSql.Postgres_conexion import PostgresConexion # Usamos la clase especΓ­fica +from domains.Llms.Memory.Base_MemoryConv import MemoryConvABC class MemoryConvPostgres(MemoryConvABC): diff --git a/src/Llms/Modelos/Base_model.py b/domains/Llms/Modelos/Base_model.py similarity index 100% rename from src/Llms/Modelos/Base_model.py rename to domains/Llms/Modelos/Base_model.py diff --git a/src/Llms/Modelos/Ollama_model.py b/domains/Llms/Modelos/Ollama_model.py similarity index 90% rename from src/Llms/Modelos/Ollama_model.py rename to domains/Llms/Modelos/Ollama_model.py index bb6cf46..2aede11 100644 --- a/src/Llms/Modelos/Ollama_model.py +++ b/domains/Llms/Modelos/Ollama_model.py @@ -1,7 +1,7 @@ -from src.Llms.Modelos.Base_model import ModeloABC -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Llms.Modelos.Base_model import ModeloABC +from domains.Security.GenerarIDs import GeneradorIDUnico from typing import AsyncGenerator, Union -from src.ConexionApis.Ollama_cliente import OllamaCliente # AsegΓΊrate de importar correctamente +from domains.ConexionApis.Ollama_cliente import OllamaCliente # AsegΓΊrate de importar correctamente import asyncio class ModeloOllama(ModeloABC): diff --git a/src/Llms/Modelos/Openai_model.py b/domains/Llms/Modelos/Openai_model.py similarity index 94% rename from src/Llms/Modelos/Openai_model.py rename to domains/Llms/Modelos/Openai_model.py index 6375d6b..2838d05 100644 --- a/src/Llms/Modelos/Openai_model.py +++ b/domains/Llms/Modelos/Openai_model.py @@ -1,6 +1,6 @@ -from src.Llms.Modelos.Base_model import ModeloABC -from src.ConexionApis.OpenAi_conexion import OpenAICliente -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Llms.Modelos.Base_model import ModeloABC +from domains.ConexionApis.OpenAi_conexion import OpenAICliente +from domains.Security.GenerarIDs import GeneradorIDUnico import asyncio from typing import AsyncGenerator, Union diff --git a/src/Llms/Modelos/Openai_model_mmr.py b/domains/Llms/Modelos/Openai_model_mmr.py similarity index 91% rename from src/Llms/Modelos/Openai_model_mmr.py rename to domains/Llms/Modelos/Openai_model_mmr.py index 94e4c09..e507515 100644 --- a/src/Llms/Modelos/Openai_model_mmr.py +++ b/domains/Llms/Modelos/Openai_model_mmr.py @@ -2,15 +2,15 @@ import os from dotenv import load_dotenv from sqlalchemy import Column, Integer, String, Float, Boolean -from src.ArquitectureLayer.Mapper import Mapper_base -from src.ArquitectureLayer.Model import Model_base -from src.ArquitectureLayer.Repo import Repo_base +from domains.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Repo import Repo_base from typing import Optional -from src.ConexionSql.Base_conexion import ConexionBase -from src.base import Base -from src.Llms.Modelos.Openai_model import ModeloOpenAI # Clase real de lΓ³gica +from domains.ConexionSql.Base_conexion import ConexionBase +from domains.base import Base +from domains.Llms.Modelos.Openai_model import ModeloOpenAI # Clase real de lΓ³gica # ---------------------- # Cargar clave maestra diff --git a/src/Llms/Modelos/__init__.py b/domains/Llms/Modelos/__init__.py similarity index 100% rename from src/Llms/Modelos/__init__.py rename to domains/Llms/Modelos/__init__.py diff --git a/src/Llms/__init__.py b/domains/Llms/__init__.py similarity index 100% rename from src/Llms/__init__.py rename to domains/Llms/__init__.py diff --git a/src/Logger/logger_db.py b/domains/Logger/logger_db.py similarity index 92% rename from src/Logger/logger_db.py rename to domains/Logger/logger_db.py index c46d044..538f9bf 100644 --- a/src/Logger/logger_db.py +++ b/domains/Logger/logger_db.py @@ -3,9 +3,9 @@ from sqlalchemy import Column, Integer, String, Text, TIMESTAMP from sqlalchemy.orm import sessionmaker from sqlalchemy.exc import SQLAlchemyError -from src.ArquitectureLayer.Model import Model_base -from src.ConexionSql.Postgres_conexion import PostgresConexion -from src.Credenciales.postgres_credencial import PostgresCredencial +from domains.ArquitectureLayer.Model import Model_base +from domains.ConexionSql.Postgres_conexion import PostgresConexion +from domains.Credenciales.postgres_credencial import PostgresCredencial class LoggerDB: _sink_removido = False # ← evita mΓΊltiples remove() si se crean varias instancias diff --git a/src/ScrappingWeb/ElementoWeb.py b/domains/ScrappingWeb/ElementoWeb.py similarity index 100% rename from src/ScrappingWeb/ElementoWeb.py rename to domains/ScrappingWeb/ElementoWeb.py diff --git a/src/ScrappingWeb/Navegador.py b/domains/ScrappingWeb/Navegador.py similarity index 100% rename from src/ScrappingWeb/Navegador.py rename to domains/ScrappingWeb/Navegador.py diff --git a/src/ScrappingWeb/Scrapper.py b/domains/ScrappingWeb/Scrapper.py similarity index 100% rename from src/ScrappingWeb/Scrapper.py rename to domains/ScrappingWeb/Scrapper.py diff --git a/src/ScrappingWeb/Tab.py b/domains/ScrappingWeb/Tab.py similarity index 100% rename from src/ScrappingWeb/Tab.py rename to domains/ScrappingWeb/Tab.py diff --git a/src/Security/Encriptar.py b/domains/Security/Encriptar.py similarity index 100% rename from src/Security/Encriptar.py rename to domains/Security/Encriptar.py diff --git a/src/Security/GenerarIDs.py b/domains/Security/GenerarIDs.py similarity index 100% rename from src/Security/GenerarIDs.py rename to domains/Security/GenerarIDs.py diff --git a/src/Security/__init__.py b/domains/Security/__init__.py similarity index 100% rename from src/Security/__init__.py rename to domains/Security/__init__.py diff --git a/src/TextManager/__init__.py b/domains/TextManager/__init__.py similarity index 100% rename from src/TextManager/__init__.py rename to domains/TextManager/__init__.py diff --git a/src/TextManager/biblioteca.py b/domains/TextManager/biblioteca.py similarity index 85% rename from src/TextManager/biblioteca.py rename to domains/TextManager/biblioteca.py index 385ff81..b2e7aee 100644 --- a/src/TextManager/biblioteca.py +++ b/domains/TextManager/biblioteca.py @@ -1,11 +1,11 @@ -from src.Security.GenerarIDs import GeneradorIDUnico -from src.Llms.Embedders.Base_Embedder import EmbedderABC # AsegΓΊrate de que esta ruta sea correcta +from domains.Security.GenerarIDs import GeneradorIDUnico +from domains.Llms.Embedders.Base_Embedder import EmbedderABC # AsegΓΊrate de que esta ruta sea correcta from typing import List, Optional -from src.ConexionSql.Base_conexion import ConexionBase +from domains.ConexionSql.Base_conexion import ConexionBase from sqlalchemy import MetaData # AsegΓΊrate de importar esto -from src.TextManager.notas_mmr import generar_tabla_nota_para_biblioteca # Ajusta si es necesario +from domains.TextManager.notas_mmr import generar_tabla_nota_para_biblioteca # Ajusta si es necesario from sqlalchemy import inspect -from src.base import Base +from domains.base import Base class Biblioteca: diff --git a/src/TextManager/biblioteca_mmr.py b/domains/TextManager/biblioteca_mmr.py similarity index 85% rename from src/TextManager/biblioteca_mmr.py rename to domains/TextManager/biblioteca_mmr.py index 163610f..308508a 100644 --- a/src/TextManager/biblioteca_mmr.py +++ b/domains/TextManager/biblioteca_mmr.py @@ -3,16 +3,16 @@ import base64 from dotenv import load_dotenv from sqlalchemy import Column, String, Integer -from src.ArquitectureLayer.Mapper import Mapper_base -from src.ArquitectureLayer.Model import Model_base -from src.ArquitectureLayer.Repo import Repo_base +from domains.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Repo import Repo_base -from src.ConexionSql.Base_conexion import ConexionBase -from src.base import Base -from src.Security.Encriptar import Encriptar_fernet -from src.Security.GenerarIDs import GeneradorIDUnico -from src.Llms.Embedders.Base_Embedder import EmbedderABC -from src.TextManager.biblioteca import Biblioteca # Suponiendo que defines la clase lΓ³gica Biblioteca aquΓ­ +from domains.ConexionSql.Base_conexion import ConexionBase +from domains.base import Base +from domains.Security.Encriptar import Encriptar_fernet +from domains.Security.GenerarIDs import GeneradorIDUnico +from domains.Llms.Embedders.Base_Embedder import EmbedderABC +from domains.TextManager.biblioteca import Biblioteca # Suponiendo que defines la clase lΓ³gica Biblioteca aquΓ­ # ---------------------- # Cargar clave maestra diff --git a/src/TextManager/nota.py b/domains/TextManager/nota.py similarity index 96% rename from src/TextManager/nota.py rename to domains/TextManager/nota.py index 21aa35c..33ffa2f 100644 --- a/src/TextManager/nota.py +++ b/domains/TextManager/nota.py @@ -1,4 +1,4 @@ -from src.Security.GenerarIDs import GeneradorIDUnico +from domains.Security.GenerarIDs import GeneradorIDUnico from typing import List class Nota: diff --git a/src/TextManager/notas_mmr.py b/domains/TextManager/notas_mmr.py similarity index 92% rename from src/TextManager/notas_mmr.py rename to domains/TextManager/notas_mmr.py index fd77c88..be050da 100644 --- a/src/TextManager/notas_mmr.py +++ b/domains/TextManager/notas_mmr.py @@ -3,17 +3,17 @@ from dotenv import load_dotenv from sqlalchemy import Table, Column, String, Text, MetaData from pgvector.sqlalchemy import Vector from sqlalchemy.orm import registry, Session -from src.TextManager.nota import Nota -from src.ConexionSql.Base_conexion import ConexionBase +from domains.TextManager.nota import Nota +from domains.ConexionSql.Base_conexion import ConexionBase from typing import Tuple import re -from src.ArquitectureLayer.Mapper import Mapper_base -from src.ArquitectureLayer.Model import Model_base -from src.ArquitectureLayer.Repo import Repo_base +from domains.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Repo import Repo_base -from src.Credenciales.postgres_credencial import PostgresCredencial # AsegΓΊrate de tener esta clase implementada correctamente +from domains.Credenciales.postgres_credencial import PostgresCredencial # AsegΓΊrate de tener esta clase implementada correctamente titulo = os.getenv('DB_TITLE') @@ -34,11 +34,11 @@ db_credencial = PostgresCredencial( ) # from entrypoint.init_db import db_credencial -from src.Logger.logger_db import LoggerDB, logger +from domains.Logger.logger_db import LoggerDB, logger LoggerDB(db_credencial, "logger_textos", created_by="sistema") -from src.base import Base # Este es tu declarative_base() +from domains.base import Base # Este es tu declarative_base() # ---------------------- # Cargar .env diff --git a/domains/Usuario/usuario.py b/domains/Usuario/usuario.py new file mode 100644 index 0000000..e60a049 --- /dev/null +++ b/domains/Usuario/usuario.py @@ -0,0 +1,15 @@ +class Usuario: + def __init__(self, id: int, nombre: str, email: str, activo: bool = True): + self.id = id + self.nombre = nombre + self.email = email + self.activo = activo + + def activar(self): + self.activo = True + + def desactivar(self): + self.activo = False + + def __repr__(self): + return f"Usuario(id={self.id}, nombre='{self.nombre}', email='{self.email}', activo={self.activo})" diff --git a/domains/Usuario/usuario_mmr.py b/domains/Usuario/usuario_mmr.py new file mode 100644 index 0000000..f4fe553 --- /dev/null +++ b/domains/Usuario/usuario_mmr.py @@ -0,0 +1,82 @@ +from sqlalchemy import Column, Integer, String, Boolean +from domains.ArquitectureLayer.Model import Model_base +from domains.ArquitectureLayer.Mapper import Mapper_base +from domains.ArquitectureLayer.Repo import Repo_base +from domains.Usuario.usuario import Usuario + +# ---------------------- +# MODELO (SQLAlchemy) +# ---------------------- + +class UsuarioModel(Model_base): + __tablename__ = 'usuarios' + + id = Column(Integer, primary_key=True, autoincrement=True) + nombre = Column(String, nullable=False) + email = Column(String, unique=True, nullable=False) + activo = Column(Boolean, default=True, nullable=False) + +# ---------------------- +# MAPPER +# ---------------------- + +class UsuarioMapper(Mapper_base[Usuario, UsuarioModel]): + @staticmethod + def to_model(obj: Usuario) -> UsuarioModel: + return UsuarioModel( + id=obj.id, + nombre=obj.nombre, + email=obj.email, + activo=obj.activo + ) + + @staticmethod + def from_model(model: UsuarioModel) -> Usuario: + return Usuario( + id=model.id, + nombre=model.nombre, + email=model.email, + activo=model.activo + ) + + @staticmethod + def to_dict(obj: Usuario) -> dict: + return { + 'id': obj.id, + 'nombre': obj.nombre, + 'email': obj.email, + 'activo': obj.activo + } + + @staticmethod + def from_dict(data: dict) -> Usuario: + return Usuario( + id=data['id'], + nombre=data['nombre'], + email=data['email'], + activo=data.get('activo', True) + ) + + @staticmethod + def from_model_list(models: list[UsuarioModel]) -> list[Usuario]: + return [UsuarioMapper.from_model(m) for m in models] + +# ---------------------- +# REPO +# ---------------------- + +class UsuarioRepo(Repo_base[UsuarioModel, Usuario]): + def __init__(self, session): + super().__init__( + session=session, + modelo=UsuarioModel, + mapper=UsuarioMapper + ) + + def get_by_email(self, email: str) -> Usuario | None: + model = ( + self.session.query(self.Modelo) + .filter_by(email=email, sys_deleted_at=None) + .first() + ) + return self.Mapper.from_model(model) if model else None diff --git a/src/__init__.py b/domains/__init__.py similarity index 100% rename from src/__init__.py rename to domains/__init__.py diff --git a/src/base.py b/domains/base.py similarity index 100% rename from src/base.py rename to domains/base.py diff --git a/entrypoint/init_db.py b/entrypoint/init_db.py index 2c0bce4..7d800af 100644 --- a/entrypoint/init_db.py +++ b/entrypoint/init_db.py @@ -1,14 +1,14 @@ # entrypoint/init_db.py -from src.base import Base -from src.ConexionSql.Postgres_conexion import PostgresConexion # AsegΓΊrate de tener esta clase implementada correctamente -from src.Credenciales.postgres_credencial import PostgresCredencial # AsegΓΊrate de tener esta clase implementada correctamente +from domains.base import Base +from domains.ConexionSql.Postgres_conexion import PostgresConexion # AsegΓΊrate de tener esta clase implementada correctamente +from domains.Credenciales.postgres_credencial import PostgresCredencial # AsegΓΊrate de tener esta clase implementada correctamente -from src.Credenciales.postgres_credencial_mmr import PostgresCredencialModel -from src.ApiKeys.openai_apikey_mmr import OpenAICredencialModel -from src.Llms.Modelos.Openai_model_mmr import ModeloOpenAIConfigModel -from src.Llms.Embedders.Openai_embedder_mmr import OpenAIEmbedderModel -from src.TextManager.biblioteca_mmr import BibliotecaModel +from domains.Credenciales.postgres_credencial_mmr import PostgresCredencialModel +from domains.ApiKeys.openai_apikey_mmr import OpenAICredencialModel +from domains.Llms.Modelos.Openai_model_mmr import ModeloOpenAIConfigModel +from domains.Llms.Embedders.Openai_embedder_mmr import OpenAIEmbedderModel +from domains.TextManager.biblioteca_mmr import BibliotecaModel from dotenv import load_dotenv diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 88fc65f..82bac9e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,7 +14,6 @@ "@mantine/tiptap": "^8.0.1", "@react-three/fiber": "^9.1.2", "@tabler/icons": "^3.31.0", - "@tabler/icons-react": "^3.31.0", "@tiptap/react": "^2.12.0", "@tiptap/starter-kit": "^2.12.0", "@uiw/react-markdown-preview": "^5.1.4", @@ -2425,22 +2424,6 @@ "url": "https://github.com/sponsors/codecalm" } }, - "node_modules/@tabler/icons-react": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.31.0.tgz", - "integrity": "sha512-2rrCM5y/VnaVKnORpDdAua9SEGuJKVqPtWxeQ/vUVsgaUx30LDgBZph7/lterXxDY1IKR6NO//HDhWiifXTi3w==", - "license": "MIT", - "dependencies": { - "@tabler/icons": "3.31.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/codecalm" - }, - "peerDependencies": { - "react": ">= 16" - } - }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 6e8af4a..2f2ab3d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -26,7 +26,6 @@ "@mantine/tiptap": "^8.0.1", "@react-three/fiber": "^9.1.2", "@tabler/icons": "^3.31.0", - "@tabler/icons-react": "^3.31.0", "@tiptap/react": "^2.12.0", "@tiptap/starter-kit": "^2.12.0", "@uiw/react-markdown-preview": "^5.1.4", diff --git a/frontend/src/Router.tsx b/frontend/src/Router.tsx index 7cd023f..76e9dcf 100644 --- a/frontend/src/Router.tsx +++ b/frontend/src/Router.tsx @@ -1,13 +1,14 @@ import { createBrowserRouter, RouterProvider } from 'react-router-dom'; -import { HomePage } from './domains/Home/Home.page'; -import { Consulta_API } from './domains/Experiments/Consulta_api'; -import { Error_404 } from './domains/FitzStudio/404/404'; // Ajusta si estΓ‘ en otra carpeta -import { Grid_Dashboard } from './domains/Experiments/Grid_dashboard'; // Ajusta si estΓ‘ en otra carpeta -import { Biblioteca } from './domains/TextEditor/Biblioteca'; -import { VisualizacionesRandom } from './domains/Experiments/Visualizaciones_Random'; -import { Camara_noir } from './domains/CamaraNoir/Camaras_noir'; -import EditorTest from "./domains/TextEditor/Editor_Test"; -import { ChatPage } from './domains/Llms/Chat/ChatPage'; +import { HomePage } from './frontend_domains/Home/Home.page'; +import { Consulta_API } from './frontend_domains/Experiments/Consulta_api'; +import { Error_404 } from './frontend_domains/FitzStudio/404/404'; // Ajusta si estΓ‘ en otra carpeta +import { Grid_Dashboard } from './frontend_domains/Experiments/Grid_dashboard'; // Ajusta si estΓ‘ en otra carpeta +import { Biblioteca } from './frontend_domains/TextEditor/Biblioteca'; +import { VisualizacionesRandom } from './frontend_domains/Experiments/Visualizaciones_Random'; +import { Camara_noir } from './frontend_domains/CamaraNoir/Camaras_noir'; +import EditorTest from "./frontend_domains/TextEditor/Editor_Test"; +import { ChatPage } from './frontend_domains/Llms/Chat/ChatPage'; +import { LoginPage } from './frontend_domains/Usuarios/Login.page'; const router = createBrowserRouter([ @@ -69,6 +70,12 @@ const router = createBrowserRouter([ }, + // Login + { + path: '/login', + element: , + }, + // FitzStudio Pages ------------------------------------------------------- // Error 404 diff --git a/frontend/src/data/submenuLinks_1.ts b/frontend/src/data/submenuLinks_1.ts index f998ba9..5a4b406 100644 --- a/frontend/src/data/submenuLinks_1.ts +++ b/frontend/src/data/submenuLinks_1.ts @@ -1,6 +1,6 @@ // src/data/submenuLinks.ts -import { Biblioteca } from "@/domains/TextEditor/Biblioteca"; +import { Biblioteca } from "@/frontend_domains/TextEditor/Biblioteca"; export const submenuLinks = { diff --git a/frontend/src/domains/Llms/Chat/ChatPage.tsx b/frontend/src/domains/Llms/Chat/ChatPage.tsx deleted file mode 100644 index b862322..0000000 --- a/frontend/src/domains/Llms/Chat/ChatPage.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from "react"; -import { Container, Stack, Paper, ScrollArea, Title } from "@mantine/core"; -import { ChatInput } from "./ChatInput"; -import { MessageList } from "./MessageList"; -import { AppShellWithMenu } from "../../FitzStudio/Appshell/Appshell"; - -export function ChatPage() { - const [messages, setMessages] = useState([ - { sender: "bot", content: "Hola, ΒΏen quΓ© puedo ayudarte hoy?" }, - ]); - - const handleSend = async (content: string) => { - const newMessages = [...messages, { sender: "user", content }]; - setMessages(newMessages); - - const response = await fetch("/api/chat", { - method: "POST", - body: JSON.stringify({ messages: newMessages }), - headers: { "Content-Type": "application/json" }, - }); - - const data = await response.json(); - setMessages([...newMessages, { sender: "bot", content: data.reply }]); - }; - - return ( - - - - Chat LLM - - - - - - - - - - ); -} diff --git a/frontend/src/domains/Usuarios/Login.page.tsx b/frontend/src/domains/Usuarios/Login.page.tsx new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/domains/CamaraNoir/Camaras_noir.tsx b/frontend/src/frontend_domains/CamaraNoir/Camaras_noir.tsx similarity index 100% rename from frontend/src/domains/CamaraNoir/Camaras_noir.tsx rename to frontend/src/frontend_domains/CamaraNoir/Camaras_noir.tsx diff --git a/frontend/src/domains/Experiments/Consulta_api.tsx b/frontend/src/frontend_domains/Experiments/Consulta_api.tsx similarity index 100% rename from frontend/src/domains/Experiments/Consulta_api.tsx rename to frontend/src/frontend_domains/Experiments/Consulta_api.tsx diff --git a/frontend/src/domains/Experiments/Grid_dashboard.tsx b/frontend/src/frontend_domains/Experiments/Grid_dashboard.tsx similarity index 100% rename from frontend/src/domains/Experiments/Grid_dashboard.tsx rename to frontend/src/frontend_domains/Experiments/Grid_dashboard.tsx diff --git a/frontend/src/domains/Experiments/Grid_dashboard_component.tsx b/frontend/src/frontend_domains/Experiments/Grid_dashboard_component.tsx similarity index 100% rename from frontend/src/domains/Experiments/Grid_dashboard_component.tsx rename to frontend/src/frontend_domains/Experiments/Grid_dashboard_component.tsx diff --git a/frontend/src/domains/Experiments/LlamadorAPI.tsx b/frontend/src/frontend_domains/Experiments/LlamadorAPI.tsx similarity index 100% rename from frontend/src/domains/Experiments/LlamadorAPI.tsx rename to frontend/src/frontend_domains/Experiments/LlamadorAPI.tsx diff --git a/frontend/src/domains/Experiments/MetodoSelect.tsx b/frontend/src/frontend_domains/Experiments/MetodoSelect.tsx similarity index 100% rename from frontend/src/domains/Experiments/MetodoSelect.tsx rename to frontend/src/frontend_domains/Experiments/MetodoSelect.tsx diff --git a/frontend/src/domains/Experiments/Visualizaciones_Random.tsx b/frontend/src/frontend_domains/Experiments/Visualizaciones_Random.tsx similarity index 100% rename from frontend/src/domains/Experiments/Visualizaciones_Random.tsx rename to frontend/src/frontend_domains/Experiments/Visualizaciones_Random.tsx diff --git a/frontend/src/domains/FitzStudio/404/404.tsx b/frontend/src/frontend_domains/FitzStudio/404/404.tsx similarity index 96% rename from frontend/src/domains/FitzStudio/404/404.tsx rename to frontend/src/frontend_domains/FitzStudio/404/404.tsx index ab75bcf..2f0ef4e 100644 --- a/frontend/src/domains/FitzStudio/404/404.tsx +++ b/frontend/src/frontend_domains/FitzStudio/404/404.tsx @@ -3,7 +3,7 @@ import { useMantineTheme } from '@mantine/core'; import { IconArrowLeft } from '../../../assets/icons'; import { Link } from 'react-router-dom'; import { MantineCardWithShader } from './HoloShader_404'; // Ajusta ruta si es necesario -import { AppShellWithMenu } from '../../FitzStudio/Appshell/Appshell'; +import { AppShellWithMenu } from '../Appshell/Appshell'; diff --git a/frontend/src/domains/FitzStudio/404/HoloShader_404.tsx b/frontend/src/frontend_domains/FitzStudio/404/HoloShader_404.tsx similarity index 100% rename from frontend/src/domains/FitzStudio/404/HoloShader_404.tsx rename to frontend/src/frontend_domains/FitzStudio/404/HoloShader_404.tsx diff --git a/frontend/src/domains/FitzStudio/Appshell/Appshell.module.css b/frontend/src/frontend_domains/FitzStudio/Appshell/Appshell.module.css similarity index 100% rename from frontend/src/domains/FitzStudio/Appshell/Appshell.module.css rename to frontend/src/frontend_domains/FitzStudio/Appshell/Appshell.module.css diff --git a/frontend/src/domains/FitzStudio/Appshell/Appshell.tsx b/frontend/src/frontend_domains/FitzStudio/Appshell/Appshell.tsx similarity index 100% rename from frontend/src/domains/FitzStudio/Appshell/Appshell.tsx rename to frontend/src/frontend_domains/FitzStudio/Appshell/Appshell.tsx diff --git a/frontend/src/domains/FitzStudio/ColorSchemeToggle/ColorSchemeToggle.tsx b/frontend/src/frontend_domains/FitzStudio/ColorSchemeToggle/ColorSchemeToggle.tsx similarity index 100% rename from frontend/src/domains/FitzStudio/ColorSchemeToggle/ColorSchemeToggle.tsx rename to frontend/src/frontend_domains/FitzStudio/ColorSchemeToggle/ColorSchemeToggle.tsx diff --git a/frontend/src/domains/FitzStudio/Plantilla.tsx b/frontend/src/frontend_domains/FitzStudio/Plantilla.tsx similarity index 58% rename from frontend/src/domains/FitzStudio/Plantilla.tsx rename to frontend/src/frontend_domains/FitzStudio/Plantilla.tsx index 4794959..12980c4 100644 --- a/frontend/src/domains/FitzStudio/Plantilla.tsx +++ b/frontend/src/frontend_domains/FitzStudio/Plantilla.tsx @@ -1,4 +1,4 @@ -import { AppShellWithMenu } from '../FitzStudio/Appshell/Appshell'; +import { AppShellWithMenu } from './Appshell/Appshell'; export function Plantilla() { diff --git a/frontend/src/domains/FitzStudio/Welcome/Welcome.module.css b/frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.module.css similarity index 100% rename from frontend/src/domains/FitzStudio/Welcome/Welcome.module.css rename to frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.module.css diff --git a/frontend/src/domains/FitzStudio/Welcome/Welcome.story.tsx b/frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.story.tsx similarity index 100% rename from frontend/src/domains/FitzStudio/Welcome/Welcome.story.tsx rename to frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.story.tsx diff --git a/frontend/src/domains/FitzStudio/Welcome/Welcome.test.tsx b/frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.test.tsx similarity index 100% rename from frontend/src/domains/FitzStudio/Welcome/Welcome.test.tsx rename to frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.test.tsx diff --git a/frontend/src/domains/FitzStudio/Welcome/Welcome.tsx b/frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.tsx similarity index 100% rename from frontend/src/domains/FitzStudio/Welcome/Welcome.tsx rename to frontend/src/frontend_domains/FitzStudio/Welcome/Welcome.tsx diff --git a/frontend/src/domains/Home/Home.page.tsx b/frontend/src/frontend_domains/Home/Home.page.tsx similarity index 68% rename from frontend/src/domains/Home/Home.page.tsx rename to frontend/src/frontend_domains/Home/Home.page.tsx index 05220dc..28651e4 100644 --- a/frontend/src/domains/Home/Home.page.tsx +++ b/frontend/src/frontend_domains/Home/Home.page.tsx @@ -1,6 +1,6 @@ import { AppShellWithMenu } from '../FitzStudio/Appshell/Appshell'; -import { Welcome } from '@/domains/FitzStudio/Welcome/Welcome'; -import { ColorSchemeToggle } from '@/domains/FitzStudio/ColorSchemeToggle/ColorSchemeToggle'; +import { Welcome } from '@/frontend_domains/FitzStudio/Welcome/Welcome'; +import { ColorSchemeToggle } from '@/frontend_domains/FitzStudio/ColorSchemeToggle/ColorSchemeToggle'; export function HomePage() { diff --git a/frontend/src/domains/Llms/Chat/ChatInput.tsx b/frontend/src/frontend_domains/Llms/Chat/ChatInput.tsx similarity index 100% rename from frontend/src/domains/Llms/Chat/ChatInput.tsx rename to frontend/src/frontend_domains/Llms/Chat/ChatInput.tsx diff --git a/frontend/src/frontend_domains/Llms/Chat/ChatPage.tsx b/frontend/src/frontend_domains/Llms/Chat/ChatPage.tsx new file mode 100644 index 0000000..a9312ae --- /dev/null +++ b/frontend/src/frontend_domains/Llms/Chat/ChatPage.tsx @@ -0,0 +1,64 @@ +import { useState, useRef } from "react"; +import { Container, Stack, Paper, ScrollArea, Title } from "@mantine/core"; +import { ChatInput } from "./ChatInput"; +import { MessageList } from "./MessageList"; +import { AppShellWithMenu } from "../../FitzStudio/Appshell/Appshell"; + +export function ChatPage() { + const [messages, setMessages] = useState([ + { sender: "bot", content: "Hola, ΒΏen quΓ© puedo ayudarte hoy?" }, + ]); + const wsRef = useRef(null); + + const handleSend = async (content: string) => { + const newMessages = [...messages, { sender: "user", content }]; + setMessages(newMessages); + + let currentResponse = ""; + setMessages((prev) => [...prev, { sender: "bot", content: "" }]); + + wsRef.current = new WebSocket("ws://localhost:8000/ws/chat"); + + wsRef.current.onopen = () => { + wsRef.current?.send(JSON.stringify({ prompt: content })); + }; + + wsRef.current.onmessage = (event) => { + const token = event.data; + currentResponse += token; + setMessages((prev) => { + const updated = [...prev]; + updated[updated.length - 1] = { sender: "bot", content: currentResponse }; + return updated; + }); + }; + + wsRef.current.onerror = (err) => { + console.error("WebSocket error:", err); + setMessages((prev) => [ + ...prev.slice(0, -1), + { sender: "bot", content: "⚠️ Error al comunicarse con el servidor." }, + ]); + }; + + wsRef.current.onclose = () => { + wsRef.current = null; + }; + }; + + return ( + + + + Chat LLM + + + + + + + + + + ); +} diff --git a/frontend/src/domains/Llms/Chat/MessageBubble.tsx b/frontend/src/frontend_domains/Llms/Chat/MessageBubble.tsx similarity index 100% rename from frontend/src/domains/Llms/Chat/MessageBubble.tsx rename to frontend/src/frontend_domains/Llms/Chat/MessageBubble.tsx diff --git a/frontend/src/domains/Llms/Chat/MessageList.tsx b/frontend/src/frontend_domains/Llms/Chat/MessageList.tsx similarity index 100% rename from frontend/src/domains/Llms/Chat/MessageList.tsx rename to frontend/src/frontend_domains/Llms/Chat/MessageList.tsx diff --git a/frontend/src/domains/TextEditor/Biblioteca.tsx b/frontend/src/frontend_domains/TextEditor/Biblioteca.tsx similarity index 100% rename from frontend/src/domains/TextEditor/Biblioteca.tsx rename to frontend/src/frontend_domains/TextEditor/Biblioteca.tsx diff --git a/frontend/src/domains/TextEditor/Editor_Test.tsx b/frontend/src/frontend_domains/TextEditor/Editor_Test.tsx similarity index 84% rename from frontend/src/domains/TextEditor/Editor_Test.tsx rename to frontend/src/frontend_domains/TextEditor/Editor_Test.tsx index 718dfc0..dbc15c6 100644 --- a/frontend/src/domains/TextEditor/Editor_Test.tsx +++ b/frontend/src/frontend_domains/TextEditor/Editor_Test.tsx @@ -2,6 +2,7 @@ import { RichTextEditor } from '@mantine/tiptap'; import { useEditor } from '@tiptap/react'; import StarterKit from '@tiptap/starter-kit'; import '@mantine/tiptap/styles.css'; +import { AppShellWithMenu } from '../FitzStudio/Appshell/Appshell'; export default function EditorTest() { const editor = useEditor({ @@ -10,8 +11,9 @@ export default function EditorTest() { }); return ( +
- {editor && ( + {editor && ( @@ -21,7 +23,10 @@ export default function EditorTest() { + )}
); } + + diff --git a/frontend/src/domains/TextEditor/Editor_biblioteca.css b/frontend/src/frontend_domains/TextEditor/Editor_biblioteca.css similarity index 100% rename from frontend/src/domains/TextEditor/Editor_biblioteca.css rename to frontend/src/frontend_domains/TextEditor/Editor_biblioteca.css diff --git a/frontend/src/frontend_domains/Usuarios/Login.page.tsx b/frontend/src/frontend_domains/Usuarios/Login.page.tsx new file mode 100644 index 0000000..d861183 --- /dev/null +++ b/frontend/src/frontend_domains/Usuarios/Login.page.tsx @@ -0,0 +1,66 @@ +import { useState } from 'react'; +import { TextInput, PasswordInput, Button, Paper, Title, Container, Group, Alert } from '@mantine/core'; +import UserIcon from '../../assets/icons/outlined/user.svg?react'; +import LockIcon from '../../assets/icons/outlined/lock.svg?react'; + +export function LoginPage() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setError(''); + // AquΓ­ deberΓ­as llamar a tu endpoint de login (ajusta la URL y payload) + try { + const res = await fetch('/api/v1/usuarios/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ email, password }) + }); + if (!res.ok) throw new Error('Credenciales incorrectas'); + // AquΓ­ puedes guardar el usuario/token en el estado global o localStorage + window.location.href = '/'; + } catch (err: any) { + setError(err.message); + } finally { + setLoading(false); + } + }; + + return ( + + Iniciar sesiΓ³n + +
+ } + value={email} + onChange={e => setEmail(e.target.value)} + required + mb={10} + /> + } + value={password} + onChange={e => setPassword(e.target.value)} + required + mb={20} + /> + {error && {error}} + + + + +
+
+ ); +} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 55da88e..2a2f0ed 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -737,14 +737,7 @@ "@svgr/hast-util-to-babel-ast" "8.0.0" svg-parser "^2.0.4" -"@tabler/icons-react@^3.31.0": - version "3.31.0" - resolved "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.31.0.tgz" - integrity sha512-2rrCM5y/VnaVKnORpDdAua9SEGuJKVqPtWxeQ/vUVsgaUx30LDgBZph7/lterXxDY1IKR6NO//HDhWiifXTi3w== - dependencies: - "@tabler/icons" "3.31.0" - -"@tabler/icons@^3.31.0", "@tabler/icons@3.31.0": +"@tabler/icons@^3.31.0": version "3.31.0" resolved "https://registry.npmjs.org/@tabler/icons/-/icons-3.31.0.tgz" integrity sha512-dblAdeKY3+GA1U+Q9eziZ0ooVlZMHsE8dqP0RkwvRtEsAULoKOYaCUOcJ4oW1DjWegdxk++UAt2SlQVnmeHv+g== @@ -5198,7 +5191,7 @@ react-use-measure@^2.1.7: resolved "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz" integrity sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg== -"react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.0.0 || >=16.0.0", "react@^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", "react@^18.x || ^19.x", react@^19.0.0, react@^19.1.0, "react@>= 16", "react@>= 16.3.0", react@>=16.13, react@>=16.3.0, react@>=16.8.0, react@>=17.0, react@>=18, react@>=18.0.0: +"react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.0.0 || >=16.0.0", "react@^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", "react@^18.x || ^19.x", react@^19.0.0, react@^19.1.0, "react@>= 16.3.0", react@>=16.13, react@>=16.3.0, react@>=16.8.0, react@>=17.0, react@>=18, react@>=18.0.0: version "19.1.0" resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== diff --git a/prueba_loop_agente.py b/prueba_loop_agente.py index e4e6b76..1c58d4a 100644 --- a/prueba_loop_agente.py +++ b/prueba_loop_agente.py @@ -1,20 +1,20 @@ import asyncio -from src.ApiKeys.openai_apikey import OpenAICredencial -from src.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo -from src.ConexionSql.Postgres_conexion import PostgresConexion +from domains.ApiKeys.openai_apikey import OpenAICredencial +from domains.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo +from domains.ConexionSql.Postgres_conexion import PostgresConexion from entrypoint.init_db import db_credencial -from src.ConexionApis.OpenAi_conexion import OpenAICliente -from src.Llms.Modelos.Openai_model import ModeloOpenAI -from src.Llms.Agente import AgenteAI -from src.Llms.Memory.postgres_MemoryConv import MemoryConvPostgres +from domains.ConexionApis.OpenAi_conexion import OpenAICliente +from domains.Llms.Modelos.Openai_model import ModeloOpenAI +from domains.Llms.Agente import AgenteAI +from domains.Llms.Memory.postgres_MemoryConv import MemoryConvPostgres from fastmcp.client.transports import StreamableHttpTransport from fastmcp.client import Client -from src.Llms.MCPs.McpClient import MCPClient # ya tienes esta clase -from src.Llms.MCPs.McpClient_Registry import ClientRegistry # o ajusta segΓΊn tu estructura -from src.Credenciales.ollama_credencial import OllamaCredencial -from src.ConexionApis.Ollama_cliente import OllamaCliente -from src.Llms.Modelos.Ollama_model import ModeloOllama -from src.Llms.MCPs.McpServer import MCPServerRunner +from domains.Llms.MCPs.McpClient import MCPClient # ya tienes esta clase +from domains.Llms.MCPs.McpClient_Registry import ClientRegistry # o ajusta segΓΊn tu estructura +from domains.Credenciales.ollama_credencial import OllamaCredencial +from domains.ConexionApis.Ollama_cliente import OllamaCliente +from domains.Llms.Modelos.Ollama_model import ModeloOllama +from domains.Llms.MCPs.McpServer import MCPServerRunner import asyncio diff --git a/prueba_mcp.py b/prueba_mcp.py index d12d206..e812335 100644 --- a/prueba_mcp.py +++ b/prueba_mcp.py @@ -1,5 +1,5 @@ import asyncio -from src.Llms.MCPs.McpServer import MCPServerRunner +from domains.Llms.MCPs.McpServer import MCPServerRunner async def main(): venv_python = r"E:\Fitz_Studio\.venv\Scripts\python.exe" diff --git a/scrappers/ejecucion_iterativa_navegador.py b/scrappers/ejecucion_iterativa_navegador.py index d0c3c8c..4ca2e96 100644 --- a/scrappers/ejecucion_iterativa_navegador.py +++ b/scrappers/ejecucion_iterativa_navegador.py @@ -2,7 +2,7 @@ import asyncio import os import pyperclip import re -from src.ScrappingWeb.Scrapper import Scrapper +from domains.ScrappingWeb.Scrapper import Scrapper def sanitizar(nombre: str) -> str: return re.sub(r'[\\/*?:"<>|]', "_", nombre).strip()[:100] diff --git a/scrappers/prueba_navegadores.py b/scrappers/prueba_navegadores.py index f656a07..da5de04 100644 --- a/scrappers/prueba_navegadores.py +++ b/scrappers/prueba_navegadores.py @@ -1,9 +1,9 @@ import asyncio import os import re -from src.ScrappingWeb.Navegador import Navegador -from src.ScrappingWeb.Scrapper import Scrapper -from src.ScrappingWeb.Tab import Tab +from domains.ScrappingWeb.Navegador import Navegador +from domains.ScrappingWeb.Scrapper import Scrapper +from domains.ScrappingWeb.Tab import Tab import aiohttp import csv diff --git a/scripts/datos_para_llms/generar_tree.py b/scripts/datos_para_llms/generar_tree.py index 811233d..ee68f84 100644 --- a/scripts/datos_para_llms/generar_tree.py +++ b/scripts/datos_para_llms/generar_tree.py @@ -27,5 +27,5 @@ def save_tree_to_file(start_path='.', max_depth=2, output_file='tree.txt'): # Ejemplo de uso: # Puedes cambiar estos valores segΓΊn lo necesites -save_tree_to_file(start_path=r'E:\Fitz_Studio', max_depth=3, output_file=r'E:\Fitz_Studio\data\files\txt\tree.txt') +save_tree_to_file(start_path=r'E:\Fitz_Studio\backend', max_depth=3, output_file=r'E:\Fitz_Studio\data\files\txt\tree.txt') diff --git a/snippets/utilizar_logger.py b/snippets/utilizar_logger.py index caaa542..93f41e2 100644 --- a/snippets/utilizar_logger.py +++ b/snippets/utilizar_logger.py @@ -1,5 +1,5 @@ from entrypoint.init_db import db_credencial -from src.Logger.logger_db import LoggerDB, logger +from domains.Logger.logger_db import LoggerDB, logger LoggerDB(db_credencial, "logger_eventos", created_by="sistema_agente") diff --git a/to-dos/proximas_tareas.md b/to-dos/proximas_tareas.md new file mode 100644 index 0000000..45b21d2 --- /dev/null +++ b/to-dos/proximas_tareas.md @@ -0,0 +1,32 @@ +# PrΓ³ximas tareas + + +## Dominio: NavegaciΓ³n y MenΓΊs +- [ ] AΓ±adir buscador al AppShell (frontend) +- [ ] AΓ±adir un buscador en el navbar (arriba a la derecha) para encontrar rΓ‘pidamente el menΓΊ necesario (frontend) +- [ ] Gestionar los dominios del frontend desde un JSON para mostrar a cada usuario solo los dominios a los que tiene autoridad de ver (frontend) +- [ ] AΓ±adir descripciones a cada parte de la navegaciΓ³n en `frontend/src/data/` y `backend/router_v1.py` + +## Dominio: Endpoints y API +- [ ] Mejorar endpoints en `backend/main.py` (backend) +- [ ] Revisar autenticaciΓ³n en `backend/deps/auth.py` (backend) +- [ ] AΓ±adir tests a cada dominio en `backend/domains/` (backend) +- [ ] AΓ±adir descripciones a cada parte del router en `backend/router_v1.py` (backend) + +## Dominio: UI y Experiencia +- [ ] Revisar diseΓ±o en `frontend/src/App.tsx` (frontend) +- [ ] Actualizar dependencias en `frontend/package.json` (frontend) + +## Dominio: Data y Archivos +- [ ] Organizar archivos en `data/files/` (data) + +## Dominio: DDD y lΓ³gica de negocio +- [ ] AΓ±adir tests a objetos DDD en `src/` (backend) +- [ ] AΓ±adir tests a dominios del frontend en `frontend/src/domains/` (frontend) + +## General +- [ ] Definir prioridades del proyecto +- [ ] Revisar issues pendientes + +--- + diff --git a/to-dos/tareas_usuarios.md b/to-dos/tareas_usuarios.md new file mode 100644 index 0000000..4c8d6e9 --- /dev/null +++ b/to-dos/tareas_usuarios.md @@ -0,0 +1,5 @@ +## Dominio: Usuarios +- [x] AΓ±adir gestiΓ³n de usuarios (crear, editar, eliminar) (backend) +- [ ] AΓ±adir tests a la gestiΓ³n de usuarios (backend) +- [ ] AΓ±adir gestiΓ³n y visualizaciΓ³n del usuario actual en la parte inferior izquierda del AppShell (frontend) +- [ ] AΓ±adir descripciones a la gestiΓ³n de usuarios en `frontend/src/data/` y `backend/router_v1.py`