diff --git a/ai-hub/app/api/routes/agents.py b/ai-hub/app/api/routes/agents.py index 456d7a7..d458d06 100644 --- a/ai-hub/app/api/routes/agents.py +++ b/ai-hub/app/api/routes/agents.py @@ -64,8 +64,10 @@ logging.error(f"Failed to heal workspace binding for agent {instance.id}: {e}") @router.get("", response_model=List[AgentInstanceResponse]) - def get_agents(db: Session = Depends(get_db)): - agents = db.query(AgentInstance).options(joinedload(AgentInstance.template), joinedload(AgentInstance.session)).all() + def get_agents(current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): + agents = db.query(AgentInstance).options(joinedload(AgentInstance.template), joinedload(AgentInstance.session)).filter( + AgentInstance.user_id == current_user.id + ).all() changed = False for instance in agents: before_sync = instance.session.sync_workspace_id if instance.session else None @@ -81,8 +83,11 @@ return agents @router.get("/{id}", response_model=AgentInstanceResponse) - def get_agent(id: str, db: Session = Depends(get_db)): - instance = db.query(AgentInstance).options(joinedload(AgentInstance.template), joinedload(AgentInstance.session)).filter(AgentInstance.id == id).first() + def get_agent(id: str, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): + instance = db.query(AgentInstance).options(joinedload(AgentInstance.template), joinedload(AgentInstance.session)).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Agent not found") _ensure_agent_workspace_binding(instance, db) @@ -90,29 +95,34 @@ return instance @router.post("/templates", response_model=AgentTemplateResponse) - def create_template(request: AgentTemplateCreate, db: Session = Depends(get_db)): + def create_template(request: AgentTemplateCreate, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): template = AgentTemplate(**request.model_dump()) + template.user_id = current_user.id db.add(template) db.commit() db.refresh(template) return template @router.post("/instances", response_model=AgentInstanceResponse) - def create_instance(request: AgentInstanceCreate, db: Session = Depends(get_db)): + def create_instance(request: AgentInstanceCreate, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): # Verify template exists template = db.query(AgentTemplate).filter(AgentTemplate.id == request.template_id).first() if not template: raise HTTPException(status_code=404, detail="Template not found") instance = AgentInstance(**request.model_dump()) + instance.user_id = current_user.id db.add(instance) db.commit() db.refresh(instance) return instance @router.patch("/{id}/status", response_model=AgentInstanceResponse) - def update_status(id: str, request: AgentInstanceStatusUpdate, db: Session = Depends(get_db)): - instance = db.query(AgentInstance).filter(AgentInstance.id == id).first() + def update_status(id: str, request: AgentInstanceStatusUpdate, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Instance not found") @@ -125,10 +135,13 @@ return instance @router.patch("/{id}/config", response_model=AgentInstanceResponse) - def update_config(id: str, request: schemas.AgentConfigUpdate, db: Session = Depends(get_db)): + def update_config(id: str, request: schemas.AgentConfigUpdate, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): from app.db.models.session import Session as SessionModel - instance = db.query(AgentInstance).filter(AgentInstance.id == id).first() + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Instance not found") @@ -158,6 +171,8 @@ session.system_prompt_override = request.system_prompt if hasattr(request, 'provider_name') and request.provider_name is not None: session.provider_name = request.provider_name + if hasattr(request, 'model_name') and request.model_name is not None: + session.model_name = request.model_name if request.mesh_node_id is not None: old_nodes = session.attached_node_ids or [] if not old_nodes or request.mesh_node_id not in old_nodes or len(old_nodes) > 1: @@ -221,7 +236,10 @@ @router.post("/{id}/run", status_code=202) def manual_trigger(id: str, payload: dict, background_tasks: BackgroundTasks, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): - instance = db.query(AgentInstance).filter(AgentInstance.id == id).first() + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Instance not found") @@ -231,14 +249,24 @@ return {"message": "Accepted"} @router.get("/{id}/triggers", response_model=List[schemas.AgentTriggerResponse]) - def get_agent_triggers(id: str, db: Session = Depends(get_db)): - instance = db.query(AgentInstance).filter(AgentInstance.id == id).first() + def get_agent_triggers(id: str, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Instance not found") return db.query(AgentTrigger).filter(AgentTrigger.instance_id == id).all() @router.post("/{id}/triggers", response_model=schemas.AgentTriggerResponse) - def create_agent_trigger(id: str, request: schemas.AgentTriggerCreate, db: Session = Depends(get_db)): + def create_agent_trigger(id: str, request: schemas.AgentTriggerCreate, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() + if not instance: + raise HTTPException(status_code=404, detail="Instance not found") + trigger = AgentTrigger(**request.model_dump()) trigger.instance_id = id # Ensure it maps safely @@ -262,8 +290,11 @@ @router.post("/{id}/metrics/reset") - def reset_agent_metrics(id: str, db: Session = Depends(get_db)): - instance = db.query(AgentInstance).filter(AgentInstance.id == id).first() + def reset_agent_metrics(id: str, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Instance not found") @@ -307,6 +338,7 @@ def deploy_agent( request: schemas.DeployAgentRequest, background_tasks: BackgroundTasks, + current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db) ): """ @@ -320,6 +352,7 @@ name=request.name, description=request.description, system_prompt_path=request.system_prompt, + user_id=current_user.id, max_loop_iterations=request.max_loop_iterations, co_worker_quality_gate=request.co_worker_quality_gate, rework_threshold=request.rework_threshold, @@ -337,7 +370,7 @@ # 2. Create a locked Session for the agent new_session = db_models.Session( - user_id="agent-system", + user_id=current_user.id, provider_name=resolved_provider, feature_name="agent_harness", is_locked=True, @@ -367,6 +400,7 @@ # 3. Create AgentInstance instance = AgentInstance( template_id=template.id, + user_id=current_user.id, session_id=new_session.id, mesh_node_id=request.mesh_node_id, status="idle", @@ -413,9 +447,12 @@ "message": f"Agent '{request.name}' deployed successfully" } @router.delete("/{id}") - def delete_agent(id: str, db: Session = Depends(get_db)): + def delete_agent(id: str, current_user: models.User = Depends(get_current_user), db: Session = Depends(get_db)): from app.db.models.agent import AgentInstance - instance = db.query(AgentInstance).filter(AgentInstance.id == id).first() + instance = db.query(AgentInstance).filter( + AgentInstance.id == id, + AgentInstance.user_id == current_user.id + ).first() if not instance: raise HTTPException(status_code=404, detail="Agent not found") diff --git a/ai-hub/app/api/schemas.py b/ai-hub/app/api/schemas.py index 54667a9..d660d31 100644 --- a/ai-hub/app/api/schemas.py +++ b/ai-hub/app/api/schemas.py @@ -231,6 +231,7 @@ user_id: str title: Optional[str] = None provider_name: Optional[str] = None + model_name: Optional[str] = None stt_provider_name: Optional[str] = None tts_provider_name: Optional[str] = None feature_name: str @@ -554,6 +555,7 @@ co_worker_quality_gate: bool = False rework_threshold: int = 80 max_rework_attempts: int = 3 + user_id: Optional[str] = None class AgentTemplateCreate(AgentTemplateBase): pass @@ -565,6 +567,7 @@ class AgentInstanceBase(BaseModel): template_id: str + user_id: Optional[str] = None session_id: Optional[int] = None mesh_node_id: Optional[str] = None status: str = "idle" @@ -643,6 +646,7 @@ max_loop_iterations: Optional[int] = None mesh_node_id: str provider_name: Optional[str] = None + model_name: Optional[str] = None allowed_skill_ids: Optional[List[int]] = None restrict_skills: Optional[bool] = None is_locked: Optional[bool] = None diff --git a/ai-hub/app/db/migrate.py b/ai-hub/app/db/migrate.py index b939fd5..95799d6 100644 --- a/ai-hub/app/db/migrate.py +++ b/ai-hub/app/db/migrate.py @@ -56,6 +56,7 @@ ("allowed_skill_names","TEXT"), ("system_prompt_override","TEXT"), ("is_locked", "BOOLEAN DEFAULT 0"), + ("model_name", "TEXT"), ] for col_name, col_type in session_required_columns: if col_name not in session_columns: @@ -257,7 +258,8 @@ template_required_columns = [ ("co_worker_quality_gate", "INTEGER DEFAULT 0"), ("rework_threshold", "INTEGER DEFAULT 80"), - ("max_rework_attempts", "INTEGER DEFAULT 3") + ("max_rework_attempts", "INTEGER DEFAULT 3"), + ("user_id", "TEXT") ] for col_name, col_type in template_required_columns: if col_name not in template_columns: @@ -311,7 +313,8 @@ ("last_error", "TEXT"), ("evaluation_status", "TEXT"), ("current_rework_attempt", "INTEGER DEFAULT 0"), - ("latest_quality_score", "INTEGER") + ("latest_quality_score", "INTEGER"), + ("user_id", "TEXT") ] for col_name, col_type in instance_required_columns: if col_name not in instance_columns: @@ -360,6 +363,19 @@ except Exception as e: logger.error(f"Failed to add column '{col_name}' to agent_triggers: {e}") + # --- Ensure user_id is populated for existing agents --- + try: + # Find a default user (first one) + first_user = conn.execute(text("SELECT id FROM users LIMIT 1")).fetchone() + if first_user: + default_user_id = first_user[0] + conn.execute(text(f"UPDATE agent_instances SET user_id = '{default_user_id}' WHERE user_id IS NULL")) + conn.execute(text(f"UPDATE agent_templates SET user_id = '{default_user_id}' WHERE user_id IS NULL")) + conn.commit() + logger.info(f"Assigned existing agents to user '{default_user_id}'.") + except Exception as e: + logger.warning(f"Could not assign default user to existing agents: {e}") + logger.info("Database migrations complete.") diff --git a/ai-hub/app/db/models/agent.py b/ai-hub/app/db/models/agent.py index a72b47b..71295aa 100644 --- a/ai-hub/app/db/models/agent.py +++ b/ai-hub/app/db/models/agent.py @@ -11,6 +11,7 @@ name = Column(String, nullable=False) description = Column(String, nullable=True) system_prompt_path = Column(String, nullable=True) + user_id = Column(String, ForeignKey('users.id'), nullable=True, index=True) max_loop_iterations = Column(Integer, default=20) @property @@ -29,6 +30,7 @@ __tablename__ = 'agent_instances' id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) + user_id = Column(String, ForeignKey('users.id'), nullable=True, index=True) template_id = Column(String, ForeignKey('agent_templates.id'), nullable=False, index=True) session_id = Column(Integer, ForeignKey('sessions.id'), nullable=True, index=True) mesh_node_id = Column(String, nullable=True, index=True) # Just use string or connect to agent_nodes.node_id if needed diff --git a/ai-hub/app/db/models/session.py b/ai-hub/app/db/models/session.py index 7aa62eb..cbbb310 100644 --- a/ai-hub/app/db/models/session.py +++ b/ai-hub/app/db/models/session.py @@ -15,6 +15,7 @@ user_id = Column(String, ForeignKey('users.id'), index=True, nullable=False) title = Column(String, index=True, nullable=True) provider_name = Column(String, nullable=True) + model_name = Column(String, nullable=True) stt_provider_name = Column(String, nullable=True) tts_provider_name = Column(String, nullable=True) feature_name = Column(String, default="default", nullable=False) diff --git a/backend.log b/backend.log deleted file mode 100644 index d973a0e..0000000 --- a/backend.log +++ /dev/null @@ -1,77 +0,0 @@ -INFO: Will watch for changes in these directories: ['/app/ai-hub'] -INFO: Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit) -INFO: Started reloader process [5892] using WatchFiles -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'browser_automation_agent' -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'mesh_file_explorer' -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'mesh_inspect_drift' -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'mesh_sync_control' -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'mesh_terminal_control' -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'mesh_wait_tasks' -INFO:app.core.tools.registry:Registered dynamic tool plugin: 'read_skill_artifact' -INFO: Started server process [5928] -INFO: Waiting for application startup. -INFO:app.db.migrate:Starting database migrations... -INFO:app.db.migrate:Column 'audio_path' already exists in 'messages'. -INFO:app.db.migrate:Column 'model_response_time' already exists in 'messages'. -INFO:app.db.migrate:Column 'token_count' already exists in 'messages'. -INFO:app.db.migrate:Column 'reasoning_content' already exists in 'messages'. -INFO:app.db.migrate:Column 'stt_provider_name' already exists in 'sessions'. -INFO:app.db.migrate:Column 'tts_provider_name' already exists in 'sessions'. -INFO:app.db.migrate:Column 'sync_workspace_id' already exists in 'sessions'. -INFO:app.db.migrate:Column 'attached_node_ids' already exists in 'sessions'. -INFO:app.db.migrate:Column 'node_sync_status' already exists in 'sessions'. -INFO:app.db.migrate:Column 'sync_config' already exists in 'sessions'. -INFO:app.db.migrate:Column 'is_cancelled' already exists in 'sessions'. -INFO:app.db.migrate:Column 'restrict_skills' already exists in 'sessions'. -INFO:app.db.migrate:Column 'allowed_skill_names' already exists in 'sessions'. -INFO:app.db.migrate:Column 'system_prompt_override' already exists in 'sessions'. -INFO:app.db.migrate:Column 'is_locked' already exists in 'sessions'. -INFO:app.db.migrate:Adding column 'co_worker_quality_gate' to 'agent_templates' table... -INFO:app.db.migrate:Successfully added 'co_worker_quality_gate' to agent_templates. -INFO:app.db.migrate:Adding column 'rework_threshold' to 'agent_templates' table... -INFO:app.db.migrate:Successfully added 'rework_threshold' to agent_templates. -INFO:app.db.migrate:Adding column 'max_rework_attempts' to 'agent_templates' table... -INFO:app.db.migrate:Successfully added 'max_rework_attempts' to agent_templates. -INFO:app.db.migrate:Adding column 'total_runs' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'total_runs' to agent_instances. -INFO:app.db.migrate:Adding column 'successful_runs' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'successful_runs' to agent_instances. -INFO:app.db.migrate:Adding column 'total_tokens_accumulated' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'total_tokens_accumulated' to agent_instances. -INFO:app.db.migrate:Adding column 'total_input_tokens' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'total_input_tokens' to agent_instances. -INFO:app.db.migrate:Adding column 'total_output_tokens' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'total_output_tokens' to agent_instances. -INFO:app.db.migrate:Adding column 'total_running_time_seconds' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'total_running_time_seconds' to agent_instances. -INFO:app.db.migrate:Adding column 'tool_call_counts' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'tool_call_counts' to agent_instances. -INFO:app.db.migrate:Adding column 'last_reasoning' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'last_reasoning' to agent_instances. -INFO:app.db.migrate:Adding column 'last_error' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'last_error' to agent_instances. -INFO:app.db.migrate:Adding column 'evaluation_status' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'evaluation_status' to agent_instances. -INFO:app.db.migrate:Adding column 'current_rework_attempt' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'current_rework_attempt' to agent_instances. -INFO:app.db.migrate:Adding column 'latest_quality_score' to 'agent_instances' table... -INFO:app.db.migrate:Successfully added 'latest_quality_score' to agent_instances. -INFO:app.db.migrate:Database migrations complete. -INFO:app.core.services.node_registry:[NodeRegistry] Reset all DB node statuses to 'offline'. -INFO:app.core.grpc.services.grpc_server:๐Ÿš€ CORTEX gRPC Orchestrator starting on [::]:50051 -INFO:app.app:[M6] Agent Orchestrator gRPC server started on port 50051. -INFO:app.core.orchestration.scheduler:[Scheduler] Agent background services (Zombie Sweeper & CRON) started. -INFO:app.core.skills.bootstrap:Checking for system skills bootstrapping... -INFO:app.core.skills.bootstrap:System skills bootstrap completed. -INFO:app.core.orchestration.scheduler:[Scheduler] CRON WAKEUP: Triggering Agent cb0fe6f9-0329-40df-a864-4bd7488f882c (Cron: 30) -INFO: Application startup complete. -ERROR:app.core.grpc.services.grpc_server:[๐Ÿ“โš ๏ธ] Mirror Cleanup Thread Error: (sqlite3.OperationalError) no such column: sessions.auto_clear_history -[SQL: SELECT sessions.id AS sessions_id, sessions.user_id AS sessions_user_id, sessions.title AS sessions_title, sessions.provider_name AS sessions_provider_name, sessions.stt_provider_name AS sessions_stt_provider_name, sessions.tts_provider_name AS sessions_tts_provider_name, sessions.feature_name AS sessions_feature_name, sessions.created_at AS sessions_created_at, sessions.is_archived AS sessions_is_archived, sessions.is_cancelled AS sessions_is_cancelled, sessions.sync_workspace_id AS sessions_sync_workspace_id, sessions.attached_node_ids AS sessions_attached_node_ids, sessions.node_sync_status AS sessions_node_sync_status, sessions.sync_config AS sessions_sync_config, sessions.restrict_skills AS sessions_restrict_skills, sessions.allowed_skill_names AS sessions_allowed_skill_names, sessions.system_prompt_override AS sessions_system_prompt_override, sessions.is_locked AS sessions_is_locked, sessions.auto_clear_history AS sessions_auto_clear_history -FROM sessions -WHERE sessions.is_archived = 0 AND sessions.sync_workspace_id IS NOT NULL] -(Background on this error at: https://sqlalche.me/e/20/e3q8) -ERROR:app.app:[๐Ÿ“๐Ÿงน] Ghost Mirror periodic cleanup fail: (sqlite3.OperationalError) no such column: sessions.auto_clear_history -[SQL: SELECT sessions.id AS sessions_id, sessions.user_id AS sessions_user_id, sessions.title AS sessions_title, sessions.provider_name AS sessions_provider_name, sessions.stt_provider_name AS sessions_stt_provider_name, sessions.tts_provider_name AS sessions_tts_provider_name, sessions.feature_name AS sessions_feature_name, sessions.created_at AS sessions_created_at, sessions.is_archived AS sessions_is_archived, sessions.is_cancelled AS sessions_is_cancelled, sessions.sync_workspace_id AS sessions_sync_workspace_id, sessions.attached_node_ids AS sessions_attached_node_ids, sessions.node_sync_status AS sessions_node_sync_status, sessions.sync_config AS sessions_sync_config, sessions.restrict_skills AS sessions_restrict_skills, sessions.allowed_skill_names AS sessions_allowed_skill_names, sessions.system_prompt_override AS sessions_system_prompt_override, sessions.is_locked AS sessions_is_locked, sessions.auto_clear_history AS sessions_auto_clear_history -FROM sessions -WHERE sessions.sync_workspace_id IS NOT NULL] -(Background on this error at: https://sqlalche.me/e/20/e3q8) diff --git a/docs/frontend_ui_audit.md b/docs/frontend_ui_audit.md new file mode 100644 index 0000000..e9c90a9 --- /dev/null +++ b/docs/frontend_ui_audit.md @@ -0,0 +1,37 @@ +# Frontend UI Audit Report + +This audit was conducted to identify non-functional UI elements, placeholder features, and backend-supported features that are currently missing from the user interface. + +## 1. Purposeless Placeholder Elements +These elements are visible in the UI but are explicitly disabled or have no functional logic connected to them. + +| Feature | Location | Status | Rationale | +| :--- | :--- | :--- | :--- | +| **History** | Navbar | `disabled: true` | Strategic placeholder for future session/activity history. | +| **Favorites** | Navbar | `disabled: true` | Strategic placeholder for future bookmarking of agents or conversations. | + +## 2. Unexposed Backend Features (API Gaps) +These features exist in the backend services (`services/api/`) but are not currently implemented in any UI page or component. + +| Service Function | API Endpoint | Description | +| :--- | :--- | :--- | +| `uploadDocument` | `POST /rag/documents` | The backend supports document ingestion for RAG, but there is no "Knowledge Base" or "Upload" UI in the dashboard. | +| `adminDownloadNodeBundle` | `POST /nodes/setup-bundle` | Orchestrates a zip download for node setup; not directly used in any navigation menu. | +| `adminProvisionNode` | `POST /nodes/provision` | Automated provisioning logic that is currently handled via the manual bash "One-Liner" instead of a UI wizard. | + +## 3. Fully Functional High-Value Features +The following major modules were audited and confirmed as **fully integrated** with the backend: + +* **Agent Control Hub**: Full CRUD, deployment, and lifecycle management (Pause/Resume/Delete) are functional. +* **Agent Metrics**: Real-time aggregation of token usage, execution time, and tool call success/failure rates is operational. +* **Swarm Control**: Node attachment, workspace synchronization (Master-Worker), and collaborative task execution are fully functional. +* **Evaluation Hub**: The "Coworker Audit" system (Quality Gates) is active, including ground-truth alignment and feedback loops. +* **Mesh Management**: Live WebSocket monitoring of mesh nodes and one-liner deployment generation are functional. +* **Voice Interface**: Real-time STT/TTS streaming with multi-provider support (Gemini, OpenAI, ElevenLabs, etc.) is functional. + +## 4. Minor UI Implementation Notes +* **Metrics Cards**: The cards for "AI Run Time" and "Tokens" in the Agent Drilldown have interactive "flip" animations that reveal historical averages. While functional, they represent a high density of information that may be overlooked by users. +* **Skill Management**: The library is functional, but lacks a "Template Gallery" (all skills are currently custom or system-defined). + +> [!NOTE] +> The frontend is exceptionally well-connected to the current API surface. The primary "Ghost" features are documented above as strategic placeholders for the next phase of development. diff --git a/frontend.log b/frontend.log deleted file mode 100644 index 37d4712..0000000 --- a/frontend.log +++ /dev/null @@ -1,159 +0,0 @@ - -> cortex-frontend@0.1.0 start -> react-scripts start - -Attempting to bind to HOST environment variable: 0.0.0.0 -If this was unintentional, check that you haven't mistakenly set it in your shell. -Learn more here: https://cra.link/advanced-config - -Browserslist: browsers data (caniuse-lite) is 8 months old. Please run: - npx update-browserslist-db@latest - Why you should do it regularly: https://github.com/browserslist/update-db#readme -(node:5956) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option. -(Use `node --trace-deprecation ...` to show where the warning was created) -(node:5956) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option. -Starting the development server... - -Compiled with warnings. - -[eslint] -src/App.js - Line 35:10: 'userId' is assigned a value but never used no-unused-vars - Line 81:6: React Hook useEffect has missing dependencies: 'currentPage' and 'pathToPage'. Either include them or remove the dependency array react-hooks/exhaustive-deps - Line 142:6: React Hook useEffect has a missing dependency: 'authenticatedPages'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/agents/components/AgentDrillDown.js - Line 35:12: 'cortexFiles' is assigned a value but never used no-unused-vars - Line 220:8: React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/agents/components/AgentHarnessPage.js - Line 2:21: 'getAgentTelemetry' is defined but never used no-unused-vars - Line 3:10: 'AreaChart' is defined but never used no-unused-vars - Line 3:21: 'Area' is defined but never used no-unused-vars - Line 3:27: 'XAxis' is defined but never used no-unused-vars - Line 3:34: 'YAxis' is defined but never used no-unused-vars - Line 3:41: 'Tooltip' is defined but never used no-unused-vars - Line 3:50: 'ResponsiveContainer' is defined but never used no-unused-vars - -src/features/chat/components/ChatWindow.js - Line 43:18: The ref value 'audioRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'audioRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps - -src/features/nodes/pages/NodesPage.js - Line 12:12: 'groups' is assigned a value but never used no-unused-vars - -src/features/profile/pages/ProfilePage.js - Line 18:12: 'providerStatuses' is assigned a value but never used no-unused-vars - Line 153:11: 'handleGeneralPreferenceUpdate' is assigned a value but never used no-unused-vars - -src/features/settings/components/cards/IdentityGovernanceCard.js - Line 12:7: 'loadGroups' is assigned a value but never used no-unused-vars - -src/features/settings/components/cards/NetworkIdentityCard.js - Line 11:7: 'fileInputRef' is assigned a value but never used no-unused-vars - -src/features/settings/pages/SettingsPage.js - Line 113:8: React Hook useEffect has a missing dependency: 'loadUserProfile'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/swarm/hooks/useSwarmControl.js - Line 110:6: React Hook useEffect has a missing dependency: 'onNewSessionCreated'. Either include it or remove the dependency array. If 'onNewSessionCreated' changes too often, find the parent component that defines it and wrap that definition in useCallback react-hooks/exhaustive-deps - Line 194:6: React Hook useCallback has missing dependencies: 'onNewSessionCreated' and 'userConfigData?.effective?.llm?.active_provider'. Either include them or remove the dependency array. If 'onNewSessionCreated' changes too often, find the parent component that defines it and wrap that definition in useCallback react-hooks/exhaustive-deps - -src/features/swarm/pages/SwarmControlPage.js - Line 3:26: 'FileSystemNavigator' is defined but never used no-unused-vars - Line 7:3: 'detachNodeFromSession' is defined but never used no-unused-vars - Line 106:10: 'sessionNodeStatus' is assigned a value but never used no-unused-vars - Line 249:6: React Hook useEffect has a missing dependency: 'fetchNodeInfo'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/voice/hooks/useVoiceChat.js - Line 8:3: 'createSession' is defined but never used no-unused-vars - Line 213:6: React Hook useEffect has a missing dependency: 'fetchTokenUsage'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/services/api/userService.js - Line 4:7: 'USERS_LOGOUT_ENDPOINT' is assigned a value but never used no-unused-vars - Line 5:7: 'USERS_ME_ENDPOINT' is assigned a value but never used no-unused-vars - -src/shared/components/FileSystemNavigator.js - Line 114:8: React Hook useEffect has a missing dependency: 'handleView'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/shared/components/MultiNodeConsole.js - Line 60:8: React Hook useEffect has missing dependencies: 'isAIProcessing', 'onMount', and 'onUnmount'. Either include them or remove the dependency array. If 'onMount' changes too often, find the parent component that defines it and wrap that definition in useCallback react-hooks/exhaustive-deps - Line 208:25: Expected a default case default-case - Line 251:8: React Hook useEffect has a missing dependency: 'attachedNodeIds'. Either include it or remove the dependency array react-hooks/exhaustive-deps - Line 251:9: React Hook useEffect has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked react-hooks/exhaustive-deps - -src/shared/components/SessionSidebar.js - Line 19:8: React Hook useEffect has a missing dependency: 'fetchSessions'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -Search for the keywords to learn more about each warning. -To ignore, add // eslint-disable-next-line to the line before. - -WARNING in [eslint] -src/App.js - Line 35:10: 'userId' is assigned a value but never used no-unused-vars - Line 81:6: React Hook useEffect has missing dependencies: 'currentPage' and 'pathToPage'. Either include them or remove the dependency array react-hooks/exhaustive-deps - Line 142:6: React Hook useEffect has a missing dependency: 'authenticatedPages'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/agents/components/AgentDrillDown.js - Line 35:12: 'cortexFiles' is assigned a value but never used no-unused-vars - Line 220:8: React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/agents/components/AgentHarnessPage.js - Line 2:21: 'getAgentTelemetry' is defined but never used no-unused-vars - Line 3:10: 'AreaChart' is defined but never used no-unused-vars - Line 3:21: 'Area' is defined but never used no-unused-vars - Line 3:27: 'XAxis' is defined but never used no-unused-vars - Line 3:34: 'YAxis' is defined but never used no-unused-vars - Line 3:41: 'Tooltip' is defined but never used no-unused-vars - Line 3:50: 'ResponsiveContainer' is defined but never used no-unused-vars - -src/features/chat/components/ChatWindow.js - Line 43:18: The ref value 'audioRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'audioRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps - -src/features/nodes/pages/NodesPage.js - Line 12:12: 'groups' is assigned a value but never used no-unused-vars - -src/features/profile/pages/ProfilePage.js - Line 18:12: 'providerStatuses' is assigned a value but never used no-unused-vars - Line 153:11: 'handleGeneralPreferenceUpdate' is assigned a value but never used no-unused-vars - -src/features/settings/components/cards/IdentityGovernanceCard.js - Line 12:7: 'loadGroups' is assigned a value but never used no-unused-vars - -src/features/settings/components/cards/NetworkIdentityCard.js - Line 11:7: 'fileInputRef' is assigned a value but never used no-unused-vars - -src/features/settings/pages/SettingsPage.js - Line 113:8: React Hook useEffect has a missing dependency: 'loadUserProfile'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/swarm/hooks/useSwarmControl.js - Line 110:6: React Hook useEffect has a missing dependency: 'onNewSessionCreated'. Either include it or remove the dependency array. If 'onNewSessionCreated' changes too often, find the parent component that defines it and wrap that definition in useCallback react-hooks/exhaustive-deps - Line 194:6: React Hook useCallback has missing dependencies: 'onNewSessionCreated' and 'userConfigData?.effective?.llm?.active_provider'. Either include them or remove the dependency array. If 'onNewSessionCreated' changes too often, find the parent component that defines it and wrap that definition in useCallback react-hooks/exhaustive-deps - -src/features/swarm/pages/SwarmControlPage.js - Line 3:26: 'FileSystemNavigator' is defined but never used no-unused-vars - Line 7:3: 'detachNodeFromSession' is defined but never used no-unused-vars - Line 106:10: 'sessionNodeStatus' is assigned a value but never used no-unused-vars - Line 249:6: React Hook useEffect has a missing dependency: 'fetchNodeInfo'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/features/voice/hooks/useVoiceChat.js - Line 8:3: 'createSession' is defined but never used no-unused-vars - Line 213:6: React Hook useEffect has a missing dependency: 'fetchTokenUsage'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/services/api/userService.js - Line 4:7: 'USERS_LOGOUT_ENDPOINT' is assigned a value but never used no-unused-vars - Line 5:7: 'USERS_ME_ENDPOINT' is assigned a value but never used no-unused-vars - -src/shared/components/FileSystemNavigator.js - Line 114:8: React Hook useEffect has a missing dependency: 'handleView'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -src/shared/components/MultiNodeConsole.js - Line 60:8: React Hook useEffect has missing dependencies: 'isAIProcessing', 'onMount', and 'onUnmount'. Either include them or remove the dependency array. If 'onMount' changes too often, find the parent component that defines it and wrap that definition in useCallback react-hooks/exhaustive-deps - Line 208:25: Expected a default case default-case - Line 251:8: React Hook useEffect has a missing dependency: 'attachedNodeIds'. Either include it or remove the dependency array react-hooks/exhaustive-deps - Line 251:9: React Hook useEffect has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked react-hooks/exhaustive-deps - -src/shared/components/SessionSidebar.js - Line 19:8: React Hook useEffect has a missing dependency: 'fetchSessions'. Either include it or remove the dependency array react-hooks/exhaustive-deps - -webpack compiled with 1 warning -Terminated diff --git a/frontend/src/features/agents/hooks/useAgentDrillDown.js b/frontend/src/features/agents/hooks/useAgentDrillDown.js index 53e9713..53fe1a1 100644 --- a/frontend/src/features/agents/hooks/useAgentDrillDown.js +++ b/frontend/src/features/agents/hooks/useAgentDrillDown.js @@ -14,7 +14,9 @@ getSkills, resetAgentMetrics, getAgentCortexFiles, - getAgentCortexFile + getAgentCortexFile, + getProviders, + getProviderModels } from '../../../services/apiService'; export const useAgentDrillDown = (agentId) => { @@ -42,6 +44,9 @@ const [nodes, setNodes] = useState([]); const [allSkills, setAllSkills] = useState([]); const [flippedCards, setFlippedCards] = useState({ runtime: false, tokens: false }); + const [allProviders, setAllProviders] = useState([]); + const [availableModels, setAvailableModels] = useState([]); + const [fetchingModels, setFetchingModels] = useState(false); // Evaluation Hub State const [cortexFiles, setCortexFiles] = useState([]); @@ -74,6 +79,7 @@ max_loop_iterations: found.template?.max_loop_iterations || 20, mesh_node_id: found.mesh_node_id || "", provider_name: found.session?.provider_name || "", + model_name: found.session?.model_name || "", restrict_skills: found.session?.restrict_skills || false, allowed_skill_ids: found.session?.skills ? found.session.skills.map(s => s.id) : [], is_locked: found.session?.is_locked || false, @@ -83,6 +89,12 @@ max_rework_attempts: found.template?.max_rework_attempts || 3 }); + // Fetch Providers + try { + const plist = await getProviders("llm"); + setAllProviders(plist); + } catch(e) {} + if (found.session_id) { const historyResp = await getSessionMessages(found.session_id); const formatted = (historyResp.messages || []).map(m => ({ @@ -433,6 +445,25 @@ } }; + useEffect(() => { + const fetchModels = async () => { + if (!editConfig?.provider_name) { + setAvailableModels([]); + return; + } + setFetchingModels(true); + try { + const mlist = await getProviderModels(editConfig.provider_name); + setAvailableModels(mlist || []); + } catch(e) { + setAvailableModels([]); + } finally { + setFetchingModels(false); + } + }; + fetchModels(); + }, [editConfig?.provider_name]); + return { agent, chatHistory, loading, error, activeTab, setActiveTab, editConfig, setEditConfig, saving, userConfig, tokenUsage, tokenError, @@ -444,6 +475,7 @@ runningSeconds, lastTotalConsumption, currentAction, lastAction, lastActionDuration, handleAction, handleClearHistory, handleSaveConfig, handleSaveGroundTruth, fetchData, handleAddTrigger, handleDeleteTrigger, handleFireTrigger, handleFireWebhook, - handleResetMetrics, handleInjectOverride, overrideText, setOverrideText + handleResetMetrics, handleInjectOverride, overrideText, setOverrideText, + availableModels, fetchingModels }; }; diff --git a/frontend/src/services/api/userService.js b/frontend/src/services/api/userService.js index 75d6f5a..c9a4272 100644 --- a/frontend/src/services/api/userService.js +++ b/frontend/src/services/api/userService.js @@ -119,3 +119,17 @@ body: formData }); }; + +/** + * Fetches available providers for a section (llm, tts, stt). + */ +export const getProviders = async (section = "llm") => { + return await fetchWithAuth(`/users/me/config/providers?section=${section}&configured_only=true`); +}; + +/** + * Fetches models for a specific provider. + */ +export const getProviderModels = async (providerName, section = "llm") => { + return await fetchWithAuth(`/users/me/config/models?provider_name=${providerName}§ion=${section}`); +}; diff --git a/frontend_ui_audit.md b/frontend_ui_audit.md deleted file mode 100644 index e9c90a9..0000000 --- a/frontend_ui_audit.md +++ /dev/null @@ -1,37 +0,0 @@ -# Frontend UI Audit Report - -This audit was conducted to identify non-functional UI elements, placeholder features, and backend-supported features that are currently missing from the user interface. - -## 1. Purposeless Placeholder Elements -These elements are visible in the UI but are explicitly disabled or have no functional logic connected to them. - -| Feature | Location | Status | Rationale | -| :--- | :--- | :--- | :--- | -| **History** | Navbar | `disabled: true` | Strategic placeholder for future session/activity history. | -| **Favorites** | Navbar | `disabled: true` | Strategic placeholder for future bookmarking of agents or conversations. | - -## 2. Unexposed Backend Features (API Gaps) -These features exist in the backend services (`services/api/`) but are not currently implemented in any UI page or component. - -| Service Function | API Endpoint | Description | -| :--- | :--- | :--- | -| `uploadDocument` | `POST /rag/documents` | The backend supports document ingestion for RAG, but there is no "Knowledge Base" or "Upload" UI in the dashboard. | -| `adminDownloadNodeBundle` | `POST /nodes/setup-bundle` | Orchestrates a zip download for node setup; not directly used in any navigation menu. | -| `adminProvisionNode` | `POST /nodes/provision` | Automated provisioning logic that is currently handled via the manual bash "One-Liner" instead of a UI wizard. | - -## 3. Fully Functional High-Value Features -The following major modules were audited and confirmed as **fully integrated** with the backend: - -* **Agent Control Hub**: Full CRUD, deployment, and lifecycle management (Pause/Resume/Delete) are functional. -* **Agent Metrics**: Real-time aggregation of token usage, execution time, and tool call success/failure rates is operational. -* **Swarm Control**: Node attachment, workspace synchronization (Master-Worker), and collaborative task execution are fully functional. -* **Evaluation Hub**: The "Coworker Audit" system (Quality Gates) is active, including ground-truth alignment and feedback loops. -* **Mesh Management**: Live WebSocket monitoring of mesh nodes and one-liner deployment generation are functional. -* **Voice Interface**: Real-time STT/TTS streaming with multi-provider support (Gemini, OpenAI, ElevenLabs, etc.) is functional. - -## 4. Minor UI Implementation Notes -* **Metrics Cards**: The cards for "AI Run Time" and "Tokens" in the Agent Drilldown have interactive "flip" animations that reveal historical averages. While functional, they represent a high density of information that may be overlooked by users. -* **Skill Management**: The library is functional, but lacks a "Template Gallery" (all skills are currently custom or system-defined). - -> [!NOTE] -> The frontend is exceptionally well-connected to the current API surface. The primary "Ghost" features are documented above as strategic placeholders for the next phase of development. diff --git a/orchestrator.log b/orchestrator.log deleted file mode 100644 index 158369d..0000000 --- a/orchestrator.log +++ /dev/null @@ -1,221 +0,0 @@ -Swarm Orchestrator started polling in /usr/local/google/home/jerxie/Projects/PersonalProject/cortex-hub/swarm_framework/comms/requests... -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438857.9174128, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438859.9298477, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438861.9462748, last_cmd_time: 0 -Processing req_test_hang (Type: prompt) for agent_1... -Completed req_test_hang -Debug [check_hanging]: Agent: agent_1, is_busy: True, now: 1775438868.9885714, last_cmd_time: 1775438861.946762 -Debug [check_hanging]: Agent: agent_1, current_output len: 836, prev_output len: 0 -Debug [check_hanging]: Agent: agent_1, output changed. -Debug [check_hanging]: Agent: agent_1, is_busy: True, now: 1775438871.0241537, last_cmd_time: 1775438861.946762 -Debug [check_hanging]: Agent: agent_1, current_output len: 836, prev_output len: 836 -Debug [check_hanging]: Agent: agent_1, silence_duration: 2.0355823040008545 -Debug [check_hanging]: Agent: agent_1, is_busy: True, now: 1775438873.064759, last_cmd_time: 1775438861.946762 -Debug [check_hanging]: Agent: agent_1, current_output len: 836, prev_output len: 836 -Debug [check_hanging]: Agent: agent_1, silence_duration: 4.076187610626221 -Debug [check_hanging]: Agent: agent_1, is_busy: True, now: 1775438875.1031532, last_cmd_time: 1775438861.946762 -Debug [check_hanging]: Agent: agent_1, current_output len: 836, prev_output len: 836 -Debug [check_hanging]: Agent: agent_1, silence_duration: 6.114581823348999 -Detected hanging agent: agent_1 -Notifying master about hanging agent agent_1... -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438877.149152, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438879.1643543, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438881.1911387, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438883.2046928, last_cmd_time: 0 -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Error listing agents: Command 'tmux list-windows -t jetski_swarm -F '#{window_name}'' returned non-zero exit status 1. -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438919.4431126, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438919.4431126, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438921.467022, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438921.467022, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438923.4873056, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438923.4873056, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438925.5223348, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438925.5223348, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438927.5560167, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438927.5560167, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438929.6355486, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438929.6355486, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438931.6612916, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438931.6612916, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438933.6730871, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438933.6730871, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438935.6853085, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438935.6853085, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438937.6966631, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438937.6966631, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438939.711031, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438939.711031, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438941.722107, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438941.722107, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438943.7342777, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438943.7342777, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438945.7467868, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438945.7467868, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438947.7653568, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438947.7653568, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438949.7795424, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438949.7795424, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438951.7922297, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438951.7922297, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438953.8052378, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438953.8052378, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438955.8180773, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438955.8180773, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438957.8298798, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438957.8298798, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438959.8423252, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438959.8423252, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438961.8553128, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438961.8553128, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438963.8676112, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438963.8676112, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438965.886971, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438965.886971, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438967.8996255, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438967.8996255, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438969.9114609, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438969.9114609, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438971.9227114, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438971.9227114, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438973.9344158, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438973.9344158, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438975.9459956, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438975.9459956, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438977.9571826, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438977.9571826, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438979.9737785, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438979.9737785, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438981.9846153, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438981.9846153, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438983.9975424, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438983.9975424, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438986.0119588, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438986.0119588, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438988.0236251, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438988.0236251, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438990.0365767, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438990.0365767, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438992.0494316, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438992.0494316, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438994.062068, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438994.062068, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438996.0738723, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438996.0738723, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775438998.086627, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775438998.086627, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439000.102641, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439000.102641, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439002.114711, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439002.114711, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439004.1267426, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439004.1267426, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439006.1389058, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439006.1389058, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439008.1524372, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439008.1524372, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439010.16589, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439010.16589, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439012.1794248, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439012.1794248, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439014.1916945, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439014.1916945, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439016.2038925, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439016.2038925, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439018.2164805, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439018.2164805, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439020.2291129, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439020.2291129, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439022.2413707, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439022.2413707, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439024.2530804, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439024.2530804, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439026.2650428, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439026.2650428, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439028.2773209, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439028.2773209, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439030.2897003, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439030.2897003, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439032.301625, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439032.301625, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439034.3266532, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439034.3266532, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439036.3388612, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439036.3388612, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439038.3558545, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439038.3558545, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439040.3683183, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439040.3683183, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439042.4091723, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439042.4091723, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439044.4227462, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439044.4227462, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439046.4345148, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439046.4345148, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439048.4474058, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439048.4474058, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439050.460654, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439050.460654, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439052.472683, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439052.472683, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439054.5007536, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439054.5007536, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439056.5206838, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439056.5206838, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439058.5427341, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439058.5427341, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439060.560675, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439060.560675, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439062.5886893, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439062.5886893, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439064.6017528, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439064.6017528, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439066.613212, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_2, is_busy: False, now: 1775439066.613212, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439068.6268754, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439068.6268754, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439070.6426954, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439070.6426954, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439072.663636, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439072.663636, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439074.6770258, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439074.6770258, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439076.6893165, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439076.6893165, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439078.7011387, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439078.7011387, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439080.7169087, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439080.7169087, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439082.730314, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439082.730314, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439084.7430565, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439084.7430565, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439086.7579484, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439086.7579484, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439088.7986362, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439088.7986362, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439090.813328, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439090.813328, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439092.826106, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439092.826106, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439094.8381567, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439094.8381567, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439096.8542817, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439096.8542817, last_cmd_time: 0 -Debug [check_hanging]: Agent: orchestrator, is_busy: False, now: 1775439098.8675618, last_cmd_time: 0 -Debug [check_hanging]: Agent: agent_1, is_busy: False, now: 1775439098.8675618, last_cmd_time: 0 diff --git a/test_db.py b/test_db.py deleted file mode 100644 index d127782..0000000 --- a/test_db.py +++ /dev/null @@ -1,8 +0,0 @@ -from app.db.session import SessionLocal -from app.db.models import User -from pprint import pprint - -db = SessionLocal() -user = db.query(User).filter(User.username == "admin@jerxie.com").first() -print("Preferences in DB:") -pprint(user.preferences) diff --git a/test_script.py b/test_script.py deleted file mode 100644 index fa5e1b0..0000000 --- a/test_script.py +++ /dev/null @@ -1,10 +0,0 @@ -import requests - -res = requests.post("http://127.0.0.1:8002/api/v1/sessions/", headers={"X-User-ID": "c4401d34-8784-4d6e-93a0-c702bd202b66"}, json={"user_id": "c4401d34-8784-4d6e-93a0-c702bd202b66", "provider_name": "gemini", "feature_name": "agent_harness"}).json() -session_id = res['id'] -print(f"Created session: {session_id}") - -chat_res = requests.post(f"http://127.0.0.1:8002/api/v1/sessions/{session_id}/chat", headers={"X-User-ID": "c4401d34-8784-4d6e-93a0-c702bd202b66"}, json={"prompt": "Use browser skill snippet a screenshot", "provider_name": "gemini"}) - -res2 = requests.get(f"http://127.0.0.1:8002/api/v1/sessions/{session_id}", headers={"X-User-ID": "c4401d34-8784-4d6e-93a0-c702bd202b66"}).json() -print(f"After chat: {res2.get('sync_workspace_id')}") diff --git a/web_redeploy.log b/web_redeploy.log deleted file mode 100644 index 4903791..0000000 --- a/web_redeploy.log +++ /dev/null @@ -1,434 +0,0 @@ ---- Cleaning up existing processes --- -Defaulting to user installation because normal site-packages is not writeable -Obtaining file:///app/ai-hub - Installing build dependencies: started - Installing build dependencies: finished with status 'done' - Checking if build backend supports build_editable: started - Checking if build backend supports build_editable: finished with status 'done' - Getting requirements to build editable: started - Getting requirements to build editable: finished with status 'done' - Preparing editable metadata (pyproject.toml): started - Preparing editable metadata (pyproject.toml): finished with status 'done' -Collecting fastapi (from ai-hub==0.1.0) - Downloading fastapi-0.135.3-py3-none-any.whl.metadata (28 kB) -Collecting uvicorn[standard] (from ai-hub==0.1.0) - Downloading uvicorn-0.44.0-py3-none-any.whl.metadata (6.7 kB) -Collecting google-generativeai (from ai-hub==0.1.0) - Downloading google_generativeai-0.8.6-py3-none-any.whl.metadata (3.9 kB) -Collecting python-dotenv (from ai-hub==0.1.0) - Downloading python_dotenv-1.2.2-py3-none-any.whl.metadata (27 kB) -Collecting openai (from ai-hub==0.1.0) - Downloading openai-2.31.0-py3-none-any.whl.metadata (31 kB) -Collecting pytest (from ai-hub==0.1.0) - Downloading pytest-9.0.3-py3-none-any.whl.metadata (7.6 kB) -Collecting requests (from ai-hub==0.1.0) - Downloading requests-2.33.1-py3-none-any.whl.metadata (4.8 kB) -Collecting anyio (from ai-hub==0.1.0) - Downloading anyio-4.13.0-py3-none-any.whl.metadata (4.5 kB) -Collecting sqlalchemy (from ai-hub==0.1.0) - Downloading sqlalchemy-2.0.49-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (9.5 kB) -Collecting psycopg2-binary (from ai-hub==0.1.0) - Downloading psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (4.9 kB) -Collecting pytest-asyncio (from ai-hub==0.1.0) - Downloading pytest_asyncio-1.3.0-py3-none-any.whl.metadata (4.1 kB) -Collecting pytest-tornasync (from ai-hub==0.1.0) - Downloading pytest_tornasync-0.6.0.post2-py3-none-any.whl.metadata (4.8 kB) -Collecting pytest-trio (from ai-hub==0.1.0) - Downloading pytest_trio-0.8.0-py3-none-any.whl.metadata (2.9 kB) -Collecting pytest-mock (from ai-hub==0.1.0) - Downloading pytest_mock-3.15.1-py3-none-any.whl.metadata (3.9 kB) -Collecting numpy (from ai-hub==0.1.0) - Downloading numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.metadata (6.6 kB) -Collecting faiss-cpu (from ai-hub==0.1.0) - Downloading faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.metadata (7.6 kB) -Collecting aioresponses (from ai-hub==0.1.0) - Downloading aioresponses-0.7.8-py2.py3-none-any.whl.metadata (10 kB) -Collecting python-multipart (from ai-hub==0.1.0) - Downloading python_multipart-0.0.24-py3-none-any.whl.metadata (1.8 kB) -Collecting PyJWT (from ai-hub==0.1.0) - Downloading pyjwt-2.12.1-py3-none-any.whl.metadata (4.1 kB) -Collecting tenacity (from ai-hub==0.1.0) - Downloading tenacity-9.1.4-py3-none-any.whl.metadata (1.2 kB) -Collecting litellm (from ai-hub==0.1.0) - Downloading litellm-1.83.4-py3-none-any.whl.metadata (30 kB) -Collecting tiktoken (from ai-hub==0.1.0) - Downloading tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl.metadata (6.7 kB) -Collecting grpcio (from ai-hub==0.1.0) - Downloading grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (3.8 kB) -Collecting grpcio-tools (from ai-hub==0.1.0) - Downloading grpcio_tools-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (5.3 kB) -Collecting grpcio-reflection (from ai-hub==0.1.0) - Downloading grpcio_reflection-1.80.0-py3-none-any.whl.metadata (1.2 kB) -Collecting croniter (from ai-hub==0.1.0) - Downloading croniter-6.2.2-py3-none-any.whl.metadata (22 kB) -Requirement already satisfied: packaging>=22.0 in /usr/local/lib/python3.11/site-packages (from aioresponses->ai-hub==0.1.0) (26.0) -Collecting aiohttp<4.0.0,>=3.3.0 (from aioresponses->ai-hub==0.1.0) - Downloading aiohttp-3.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (8.1 kB) -Collecting aiohappyeyeballs>=2.5.0 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB) -Collecting aiosignal>=1.4.0 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading aiosignal-1.4.0-py3-none-any.whl.metadata (3.7 kB) -Collecting attrs>=17.3.0 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading attrs-26.1.0-py3-none-any.whl.metadata (8.8 kB) -Collecting frozenlist>=1.1.1 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (20 kB) -Collecting multidict<7.0,>=4.5 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (5.3 kB) -Collecting propcache>=0.2.0 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (13 kB) -Collecting yarl<2.0,>=1.17.0 (from aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (79 kB) -Collecting idna>=2.0 (from yarl<2.0,>=1.17.0->aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) - Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB) -Requirement already satisfied: typing-extensions>=4.2 in /usr/local/lib/python3.11/site-packages (from aiosignal>=1.4.0->aiohttp<4.0.0,>=3.3.0->aioresponses->ai-hub==0.1.0) (4.15.0) -Collecting python-dateutil (from croniter->ai-hub==0.1.0) - Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB) -Collecting starlette>=0.46.0 (from fastapi->ai-hub==0.1.0) - Downloading starlette-1.0.0-py3-none-any.whl.metadata (6.3 kB) -Collecting pydantic>=2.9.0 (from fastapi->ai-hub==0.1.0) - Downloading pydantic-2.12.5-py3-none-any.whl.metadata (90 kB) -Collecting typing-inspection>=0.4.2 (from fastapi->ai-hub==0.1.0) - Downloading typing_inspection-0.4.2-py3-none-any.whl.metadata (2.6 kB) -Collecting annotated-doc>=0.0.2 (from fastapi->ai-hub==0.1.0) - Downloading annotated_doc-0.0.4-py3-none-any.whl.metadata (6.6 kB) -Collecting annotated-types>=0.6.0 (from pydantic>=2.9.0->fastapi->ai-hub==0.1.0) - Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB) -Collecting pydantic-core==2.41.5 (from pydantic>=2.9.0->fastapi->ai-hub==0.1.0) - Downloading pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (7.3 kB) -Collecting google-ai-generativelanguage==0.6.15 (from google-generativeai->ai-hub==0.1.0) - Downloading google_ai_generativelanguage-0.6.15-py3-none-any.whl.metadata (5.7 kB) -Collecting google-api-core (from google-generativeai->ai-hub==0.1.0) - Downloading google_api_core-2.30.2-py3-none-any.whl.metadata (3.1 kB) -Collecting google-api-python-client (from google-generativeai->ai-hub==0.1.0) - Downloading google_api_python_client-2.194.0-py3-none-any.whl.metadata (7.0 kB) -Collecting google-auth>=2.15.0 (from google-generativeai->ai-hub==0.1.0) - Downloading google_auth-2.49.1-py3-none-any.whl.metadata (6.2 kB) -Collecting protobuf (from google-generativeai->ai-hub==0.1.0) - Downloading protobuf-7.34.1-cp310-abi3-manylinux2014_aarch64.whl.metadata (595 bytes) -Collecting tqdm (from google-generativeai->ai-hub==0.1.0) - Downloading tqdm-4.67.3-py3-none-any.whl.metadata (57 kB) -Collecting proto-plus<2.0.0dev,>=1.22.3 (from google-ai-generativelanguage==0.6.15->google-generativeai->ai-hub==0.1.0) - Downloading proto_plus-1.27.2-py3-none-any.whl.metadata (2.2 kB) -Collecting protobuf (from google-generativeai->ai-hub==0.1.0) - Downloading protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl.metadata (592 bytes) -Collecting googleapis-common-protos<2.0.0,>=1.63.2 (from google-api-core->google-generativeai->ai-hub==0.1.0) - Downloading googleapis_common_protos-1.74.0-py3-none-any.whl.metadata (9.2 kB) -Collecting grpcio-status<2.0.0,>=1.33.2 (from google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0dev,>=1.34.1->google-ai-generativelanguage==0.6.15->google-generativeai->ai-hub==0.1.0) - Downloading grpcio_status-1.80.0-py3-none-any.whl.metadata (1.3 kB) -Collecting pyasn1-modules>=0.2.1 (from google-auth>=2.15.0->google-generativeai->ai-hub==0.1.0) - Downloading pyasn1_modules-0.4.2-py3-none-any.whl.metadata (3.5 kB) -Collecting cryptography>=38.0.3 (from google-auth>=2.15.0->google-generativeai->ai-hub==0.1.0) - Downloading cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl.metadata (5.7 kB) -INFO: pip is looking at multiple versions of grpcio-status to determine which version is compatible with other requirements. This could take a while. -Collecting grpcio-status<2.0.0,>=1.33.2 (from google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0dev,>=1.34.1->google-ai-generativelanguage==0.6.15->google-generativeai->ai-hub==0.1.0) - Downloading grpcio_status-1.78.0-py3-none-any.whl.metadata (1.3 kB) - Downloading grpcio_status-1.76.0-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.75.1-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.75.0-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.74.0-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.73.1-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.73.0-py3-none-any.whl.metadata (1.1 kB) -INFO: pip is still looking at multiple versions of grpcio-status to determine which version is compatible with other requirements. This could take a while. - Downloading grpcio_status-1.72.2-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.72.1-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_status-1.71.2-py3-none-any.whl.metadata (1.1 kB) -Collecting charset_normalizer<4,>=2 (from requests->ai-hub==0.1.0) - Downloading charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (40 kB) -Collecting urllib3<3,>=1.26 (from requests->ai-hub==0.1.0) - Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB) -Collecting certifi>=2023.5.7 (from requests->ai-hub==0.1.0) - Downloading certifi-2026.2.25-py3-none-any.whl.metadata (2.5 kB) -Collecting cffi>=2.0.0 (from cryptography>=38.0.3->google-auth>=2.15.0->google-generativeai->ai-hub==0.1.0) - Downloading cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (2.6 kB) -Collecting pycparser (from cffi>=2.0.0->cryptography>=38.0.3->google-auth>=2.15.0->google-generativeai->ai-hub==0.1.0) - Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) -Collecting pyasn1<0.7.0,>=0.6.1 (from pyasn1-modules>=0.2.1->google-auth>=2.15.0->google-generativeai->ai-hub==0.1.0) - Downloading pyasn1-0.6.3-py3-none-any.whl.metadata (8.4 kB) -Collecting httplib2<1.0.0,>=0.19.0 (from google-api-python-client->google-generativeai->ai-hub==0.1.0) - Downloading httplib2-0.31.2-py3-none-any.whl.metadata (2.2 kB) -Collecting google-auth-httplib2<1.0.0,>=0.2.0 (from google-api-python-client->google-generativeai->ai-hub==0.1.0) - Downloading google_auth_httplib2-0.3.1-py3-none-any.whl.metadata (3.0 kB) -Collecting uritemplate<5,>=3.0.1 (from google-api-python-client->google-generativeai->ai-hub==0.1.0) - Downloading uritemplate-4.2.0-py3-none-any.whl.metadata (2.6 kB) -Collecting pyparsing<4,>=3.1 (from httplib2<1.0.0,>=0.19.0->google-api-python-client->google-generativeai->ai-hub==0.1.0) - Downloading pyparsing-3.3.2-py3-none-any.whl.metadata (5.8 kB) -INFO: pip is looking at multiple versions of grpcio-reflection to determine which version is compatible with other requirements. This could take a while. -Collecting grpcio-reflection (from ai-hub==0.1.0) - Downloading grpcio_reflection-1.78.0-py3-none-any.whl.metadata (1.2 kB) - Downloading grpcio_reflection-1.76.0-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_reflection-1.75.1-py3-none-any.whl.metadata (1.1 kB) - Downloading grpcio_reflection-1.75.0-py3-none-any.whl.metadata (1.0 kB) - Downloading grpcio_reflection-1.74.0-py3-none-any.whl.metadata (1.0 kB) - Downloading grpcio_reflection-1.73.1-py3-none-any.whl.metadata (1.0 kB) - Downloading grpcio_reflection-1.73.0-py3-none-any.whl.metadata (1.0 kB) -INFO: pip is still looking at multiple versions of grpcio-reflection to determine which version is compatible with other requirements. This could take a while. - Downloading grpcio_reflection-1.72.2-py3-none-any.whl.metadata (1.0 kB) - Downloading grpcio_reflection-1.72.1-py3-none-any.whl.metadata (1.0 kB) - Downloading grpcio_reflection-1.71.2-py3-none-any.whl.metadata (1.0 kB) -INFO: pip is looking at multiple versions of grpcio-tools to determine which version is compatible with other requirements. This could take a while. -Collecting grpcio-tools (from ai-hub==0.1.0) - Downloading grpcio_tools-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.75.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.75.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.74.0-cp311-cp311-manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.73.1-cp311-cp311-manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.73.0-cp311-cp311-manylinux_2_17_aarch64.whl.metadata (5.3 kB) -INFO: pip is still looking at multiple versions of grpcio-tools to determine which version is compatible with other requirements. This could take a while. - Downloading grpcio_tools-1.72.2-cp311-cp311-manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.72.1-cp311-cp311-manylinux_2_17_aarch64.whl.metadata (5.3 kB) - Downloading grpcio_tools-1.71.2-cp311-cp311-manylinux_2_17_aarch64.whl.metadata (5.3 kB) -Requirement already satisfied: setuptools in /usr/local/lib/python3.11/site-packages (from grpcio-tools->ai-hub==0.1.0) (78.1.1) -Collecting click==8.1.8 (from litellm->ai-hub==0.1.0) - Downloading click-8.1.8-py3-none-any.whl.metadata (2.3 kB) -Collecting fastuuid==0.14.0 (from litellm->ai-hub==0.1.0) - Downloading fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (1.1 kB) -Collecting httpx==0.28.1 (from litellm->ai-hub==0.1.0) - Downloading httpx-0.28.1-py3-none-any.whl.metadata (7.1 kB) -Collecting importlib-metadata==8.5.0 (from litellm->ai-hub==0.1.0) - Downloading importlib_metadata-8.5.0-py3-none-any.whl.metadata (4.8 kB) -Collecting jinja2==3.1.6 (from litellm->ai-hub==0.1.0) - Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) -Collecting jsonschema==4.23.0 (from litellm->ai-hub==0.1.0) - Downloading jsonschema-4.23.0-py3-none-any.whl.metadata (7.9 kB) -Collecting openai (from ai-hub==0.1.0) - Downloading openai-2.30.0-py3-none-any.whl.metadata (29 kB) -Collecting python-dotenv (from ai-hub==0.1.0) - Downloading python_dotenv-1.0.1-py3-none-any.whl.metadata (23 kB) -Collecting tokenizers==0.22.2 (from litellm->ai-hub==0.1.0) - Downloading tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (7.3 kB) -Collecting httpcore==1.* (from httpx==0.28.1->litellm->ai-hub==0.1.0) - Downloading httpcore-1.0.9-py3-none-any.whl.metadata (21 kB) -Collecting zipp>=3.20 (from importlib-metadata==8.5.0->litellm->ai-hub==0.1.0) - Downloading zipp-3.23.0-py3-none-any.whl.metadata (3.6 kB) -Collecting MarkupSafe>=2.0 (from jinja2==3.1.6->litellm->ai-hub==0.1.0) - Downloading markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (2.7 kB) -Collecting jsonschema-specifications>=2023.03.6 (from jsonschema==4.23.0->litellm->ai-hub==0.1.0) - Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) -Collecting referencing>=0.28.4 (from jsonschema==4.23.0->litellm->ai-hub==0.1.0) - Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) -Collecting rpds-py>=0.7.1 (from jsonschema==4.23.0->litellm->ai-hub==0.1.0) - Downloading rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (4.1 kB) -Collecting distro<2,>=1.7.0 (from openai->ai-hub==0.1.0) - Downloading distro-1.9.0-py3-none-any.whl.metadata (6.8 kB) -Collecting jiter<1,>=0.10.0 (from openai->ai-hub==0.1.0) - Downloading jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (5.2 kB) -Collecting sniffio (from openai->ai-hub==0.1.0) - Downloading sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB) -Collecting regex>=2022.1.18 (from tiktoken->ai-hub==0.1.0) - Downloading regex-2026.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (40 kB) -Collecting huggingface-hub<2.0,>=0.16.4 (from tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading huggingface_hub-1.9.2-py3-none-any.whl.metadata (14 kB) -Collecting h11>=0.16 (from httpcore==1.*->httpx==0.28.1->litellm->ai-hub==0.1.0) - Downloading h11-0.16.0-py3-none-any.whl.metadata (8.3 kB) -Collecting filelock>=3.10.0 (from huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading filelock-3.25.2-py3-none-any.whl.metadata (2.0 kB) -Collecting fsspec>=2023.5.0 (from huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading fsspec-2026.3.0-py3-none-any.whl.metadata (10 kB) -Collecting hf-xet<2.0.0,>=1.4.3 (from huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading hf_xet-1.4.3-cp37-abi3-manylinux_2_28_aarch64.whl.metadata (4.9 kB) -Collecting pyyaml>=5.1 (from huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (2.4 kB) -Collecting typer (from huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading typer-0.24.1-py3-none-any.whl.metadata (16 kB) -Collecting iniconfig>=1.0.1 (from pytest->ai-hub==0.1.0) - Downloading iniconfig-2.3.0-py3-none-any.whl.metadata (2.5 kB) -Collecting pluggy<2,>=1.5 (from pytest->ai-hub==0.1.0) - Downloading pluggy-1.6.0-py3-none-any.whl.metadata (4.8 kB) -Collecting pygments>=2.7.2 (from pytest->ai-hub==0.1.0) - Downloading pygments-2.20.0-py3-none-any.whl.metadata (2.5 kB) -Collecting tornado>=5.0 (from pytest-tornasync->ai-hub==0.1.0) - Downloading tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (2.8 kB) -Collecting trio>=0.22.0 (from pytest-trio->ai-hub==0.1.0) - Downloading trio-0.33.0-py3-none-any.whl.metadata (8.5 kB) -Collecting outcome>=1.1.0 (from pytest-trio->ai-hub==0.1.0) - Downloading outcome-1.3.0.post0-py2.py3-none-any.whl.metadata (2.6 kB) -Collecting sortedcontainers (from trio>=0.22.0->pytest-trio->ai-hub==0.1.0) - Downloading sortedcontainers-2.4.0-py2.py3-none-any.whl.metadata (10 kB) -Collecting six>=1.5 (from python-dateutil->croniter->ai-hub==0.1.0) - Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB) -Collecting greenlet>=1 (from sqlalchemy->ai-hub==0.1.0) - Downloading greenlet-3.4.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.metadata (3.7 kB) -INFO: pip is looking at multiple versions of typer to determine which version is compatible with other requirements. This could take a while. -Collecting typer (from huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading typer-0.24.0-py3-none-any.whl.metadata (16 kB) - Downloading typer-0.23.2-py3-none-any.whl.metadata (16 kB) - Downloading typer-0.23.1-py3-none-any.whl.metadata (16 kB) -Collecting shellingham>=1.3.0 (from typer->huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading shellingham-1.5.4-py2.py3-none-any.whl.metadata (3.5 kB) -Collecting rich>=10.11.0 (from typer->huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading rich-14.3.3-py3-none-any.whl.metadata (18 kB) -Collecting markdown-it-py>=2.2.0 (from rich>=10.11.0->typer->huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading markdown_it_py-4.0.0-py3-none-any.whl.metadata (7.3 kB) -Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich>=10.11.0->typer->huggingface-hub<2.0,>=0.16.4->tokenizers==0.22.2->litellm->ai-hub==0.1.0) - Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB) -Collecting httptools>=0.6.3 (from uvicorn[standard]->ai-hub==0.1.0) - Downloading httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (3.5 kB) -Collecting uvloop>=0.15.1 (from uvicorn[standard]->ai-hub==0.1.0) - Downloading uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (4.9 kB) -Collecting watchfiles>=0.20 (from uvicorn[standard]->ai-hub==0.1.0) - Downloading watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (4.9 kB) -Collecting websockets>=10.4 (from uvicorn[standard]->ai-hub==0.1.0) - Downloading websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (6.8 kB) -Downloading aioresponses-0.7.8-py2.py3-none-any.whl (12 kB) -Downloading aiohttp-3.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.8 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 1.8/1.8 MB 5.2 MB/s 0:00:00 -Downloading multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (246 kB) -Downloading yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (100 kB) -Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB) -Downloading aiosignal-1.4.0-py3-none-any.whl (7.5 kB) -Downloading attrs-26.1.0-py3-none-any.whl (67 kB) -Downloading frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (233 kB) -Downloading idna-3.11-py3-none-any.whl (71 kB) -Downloading propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (214 kB) -Downloading anyio-4.13.0-py3-none-any.whl (114 kB) -Downloading croniter-6.2.2-py3-none-any.whl (45 kB) -Downloading faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (11.5 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 11.5/11.5 MB 7.3 MB/s 0:00:01 -Downloading numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (16.0 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 16.0/16.0 MB 11.4 MB/s 0:00:01 -Downloading fastapi-0.135.3-py3-none-any.whl (117 kB) -Downloading annotated_doc-0.0.4-py3-none-any.whl (5.3 kB) -Downloading pydantic-2.12.5-py3-none-any.whl (463 kB) -Downloading pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 1.9/1.9 MB 13.3 MB/s 0:00:00 -Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB) -Downloading starlette-1.0.0-py3-none-any.whl (72 kB) -Downloading typing_inspection-0.4.2-py3-none-any.whl (14 kB) -Downloading google_generativeai-0.8.6-py3-none-any.whl (155 kB) -Downloading google_ai_generativelanguage-0.6.15-py3-none-any.whl (1.3 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 1.3/1.3 MB 14.1 MB/s 0:00:00 -Downloading google_api_core-2.30.2-py3-none-any.whl (173 kB) -Downloading google_auth-2.49.1-py3-none-any.whl (240 kB) -Downloading googleapis_common_protos-1.74.0-py3-none-any.whl (300 kB) -Downloading grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (6.6 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 6.6/6.6 MB 14.2 MB/s 0:00:00 -Downloading grpcio_status-1.71.2-py3-none-any.whl (14 kB) -Downloading proto_plus-1.27.2-py3-none-any.whl (50 kB) -Downloading protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl (320 kB) -Downloading requests-2.33.1-py3-none-any.whl (64 kB) -Downloading charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (206 kB) -Downloading urllib3-2.6.3-py3-none-any.whl (131 kB) -Downloading certifi-2026.2.25-py3-none-any.whl (153 kB) -Downloading cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl (4.3 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 4.3/4.3 MB 15.1 MB/s 0:00:00 -Downloading cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (216 kB) -Downloading pyasn1_modules-0.4.2-py3-none-any.whl (181 kB) -Downloading pyasn1-0.6.3-py3-none-any.whl (83 kB) -Downloading google_api_python_client-2.194.0-py3-none-any.whl (15.0 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 15.0/15.0 MB 16.1 MB/s 0:00:00 -Downloading google_auth_httplib2-0.3.1-py3-none-any.whl (9.5 kB) -Downloading httplib2-0.31.2-py3-none-any.whl (91 kB) -Downloading pyparsing-3.3.2-py3-none-any.whl (122 kB) -Downloading uritemplate-4.2.0-py3-none-any.whl (11 kB) -Downloading grpcio_reflection-1.71.2-py3-none-any.whl (22 kB) -Downloading grpcio_tools-1.71.2-cp311-cp311-manylinux_2_17_aarch64.whl (2.3 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 2.3/2.3 MB 15.5 MB/s 0:00:00 -Downloading litellm-1.83.4-py3-none-any.whl (16.0 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 16.0/16.0 MB 18.4 MB/s 0:00:00 -Downloading click-8.1.8-py3-none-any.whl (98 kB) -Downloading fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (278 kB) -Downloading httpx-0.28.1-py3-none-any.whl (73 kB) -Downloading importlib_metadata-8.5.0-py3-none-any.whl (26 kB) -Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) -Downloading jsonschema-4.23.0-py3-none-any.whl (88 kB) -Downloading openai-2.30.0-py3-none-any.whl (1.1 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 1.1/1.1 MB 4.6 MB/s 0:00:00 -Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB) -Downloading tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl (1.1 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 1.1/1.1 MB 18.3 MB/s 0:00:00 -Downloading tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.3 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 3.3/3.3 MB 19.3 MB/s 0:00:00 -Downloading distro-1.9.0-py3-none-any.whl (20 kB) -Downloading httpcore-1.0.9-py3-none-any.whl (78 kB) -Downloading huggingface_hub-1.9.2-py3-none-any.whl (637 kB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 637.3/637.3 kB 18.2 MB/s 0:00:00 -Downloading hf_xet-1.4.3-cp37-abi3-manylinux_2_28_aarch64.whl (4.0 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 4.0/4.0 MB 20.1 MB/s 0:00:00 -Downloading jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (354 kB) -Downloading filelock-3.25.2-py3-none-any.whl (26 kB) -Downloading fsspec-2026.3.0-py3-none-any.whl (202 kB) -Downloading h11-0.16.0-py3-none-any.whl (37 kB) -Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) -Downloading markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (24 kB) -Downloading pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (775 kB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 775.6/775.6 kB 17.2 MB/s 0:00:00 -Downloading referencing-0.37.0-py3-none-any.whl (26 kB) -Downloading regex-2026.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (792 kB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 792.4/792.4 kB 22.5 MB/s 0:00:00 -Downloading rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (389 kB) -Downloading tqdm-4.67.3-py3-none-any.whl (78 kB) -Downloading zipp-3.23.0-py3-none-any.whl (10 kB) -Downloading psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (4.4 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 4.4/4.4 MB 21.0 MB/s 0:00:00 -Downloading pycparser-3.0-py3-none-any.whl (48 kB) -Downloading pyjwt-2.12.1-py3-none-any.whl (29 kB) -Downloading pytest-9.0.3-py3-none-any.whl (375 kB) -Downloading pluggy-1.6.0-py3-none-any.whl (20 kB) -Downloading iniconfig-2.3.0-py3-none-any.whl (7.5 kB) -Downloading pygments-2.20.0-py3-none-any.whl (1.2 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 1.2/1.2 MB 20.2 MB/s 0:00:00 -Downloading pytest_asyncio-1.3.0-py3-none-any.whl (15 kB) -Downloading pytest_mock-3.15.1-py3-none-any.whl (10 kB) -Downloading pytest_tornasync-0.6.0.post2-py3-none-any.whl (6.6 kB) -Downloading tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (448 kB) -Downloading pytest_trio-0.8.0-py3-none-any.whl (27 kB) -Downloading outcome-1.3.0.post0-py2.py3-none-any.whl (10 kB) -Downloading trio-0.33.0-py3-none-any.whl (510 kB) -Downloading sniffio-1.3.1-py3-none-any.whl (10 kB) -Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB) -Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) -Downloading python_multipart-0.0.24-py3-none-any.whl (24 kB) -Downloading sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB) -Downloading sqlalchemy-2.0.49-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (3.3 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 3.3/3.3 MB 20.5 MB/s 0:00:00 -Downloading greenlet-3.4.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (605 kB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 605.5/605.5 kB 17.4 MB/s 0:00:00 -Downloading tenacity-9.1.4-py3-none-any.whl (28 kB) -Downloading typer-0.23.1-py3-none-any.whl (56 kB) -Downloading rich-14.3.3-py3-none-any.whl (310 kB) -Downloading markdown_it_py-4.0.0-py3-none-any.whl (87 kB) -Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB) -Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB) -Downloading uvicorn-0.44.0-py3-none-any.whl (69 kB) -Downloading httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (454 kB) -Downloading uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (3.8 MB) - โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 3.8/3.8 MB 21.3 MB/s 0:00:00 -Downloading watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (448 kB) -Downloading websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (185 kB) -Building wheels for collected packages: ai-hub - Building editable for ai-hub (pyproject.toml): started - Building editable for ai-hub (pyproject.toml): finished with status 'done' - Created wheel for ai-hub: filename=ai_hub-0.1.0-0.editable-py3-none-any.whl size=3288 sha256=bfbaac7689f7c36d7dc2ee8a562957aeb90ec0cc74af5de47c73089a756a944c - Stored in directory: /tmp/pip-ephem-wheel-cache-wblpckhw/wheels/61/cc/4c/86ebde176a08579a42ab23974de628f3db779a3ba715da5797 -Successfully built ai-hub -Installing collected packages: sortedcontainers, zipp, websockets, uvloop, urllib3, uritemplate, typing-inspection, tqdm, tornado, tenacity, sniffio, six, shellingham, rpds-py, regex, pyyaml, python-multipart, python-dotenv, pyparsing, PyJWT, pygments, pydantic-core, pycparser, pyasn1, psycopg2-binary, protobuf, propcache, pluggy, numpy, multidict, mdurl, MarkupSafe, jiter, iniconfig, idna, httptools, hf-xet, h11, grpcio, greenlet, fsspec, frozenlist, filelock, fastuuid, distro, click, charset_normalizer, certifi, attrs, annotated-types, annotated-doc, aiohappyeyeballs, yarl, uvicorn, sqlalchemy, requests, referencing, python-dateutil, pytest, pydantic, pyasn1-modules, proto-plus, outcome, markdown-it-py, jinja2, importlib-metadata, httplib2, httpcore, grpcio-tools, grpcio-reflection, googleapis-common-protos, faiss-cpu, cffi, anyio, aiosignal, watchfiles, trio, tiktoken, starlette, rich, pytest-tornasync, pytest-mock, pytest-asyncio, jsonschema-specifications, httpx, grpcio-status, cryptography, croniter, aiohttp, typer, pytest-trio, openai, jsonschema, google-auth, fastapi, aioresponses, huggingface-hub, google-auth-httplib2, google-api-core, tokenizers, google-api-python-client, litellm, google-ai-generativelanguage, google-generativeai, ai-hub - -Successfully installed MarkupSafe-3.0.3 PyJWT-2.12.1 ai-hub-0.1.0 aiohappyeyeballs-2.6.1 aiohttp-3.13.5 aioresponses-0.7.8 aiosignal-1.4.0 annotated-doc-0.0.4 annotated-types-0.7.0 anyio-4.13.0 attrs-26.1.0 certifi-2026.2.25 cffi-2.0.0 charset_normalizer-3.4.7 click-8.1.8 croniter-6.2.2 cryptography-46.0.7 distro-1.9.0 faiss-cpu-1.13.2 fastapi-0.135.3 fastuuid-0.14.0 filelock-3.25.2 frozenlist-1.8.0 fsspec-2026.3.0 google-ai-generativelanguage-0.6.15 google-api-core-2.30.2 google-api-python-client-2.194.0 google-auth-2.49.1 google-auth-httplib2-0.3.1 google-generativeai-0.8.6 googleapis-common-protos-1.74.0 greenlet-3.4.0 grpcio-1.80.0 grpcio-reflection-1.71.2 grpcio-status-1.71.2 grpcio-tools-1.71.2 h11-0.16.0 hf-xet-1.4.3 httpcore-1.0.9 httplib2-0.31.2 httptools-0.7.1 httpx-0.28.1 huggingface-hub-1.9.2 idna-3.11 importlib-metadata-8.5.0 iniconfig-2.3.0 jinja2-3.1.6 jiter-0.13.0 jsonschema-4.23.0 jsonschema-specifications-2025.9.1 litellm-1.83.4 markdown-it-py-4.0.0 mdurl-0.1.2 multidict-6.7.1 numpy-2.4.4 openai-2.30.0 outcome-1.3.0.post0 pluggy-1.6.0 propcache-0.4.1 proto-plus-1.27.2 protobuf-5.29.6 psycopg2-binary-2.9.11 pyasn1-0.6.3 pyasn1-modules-0.4.2 pycparser-3.0 pydantic-2.12.5 pydantic-core-2.41.5 pygments-2.20.0 pyparsing-3.3.2 pytest-9.0.3 pytest-asyncio-1.3.0 pytest-mock-3.15.1 pytest-tornasync-0.6.0.post2 pytest-trio-0.8.0 python-dateutil-2.9.0.post0 python-dotenv-1.0.1 python-multipart-0.0.24 pyyaml-6.0.3 referencing-0.37.0 regex-2026.4.4 requests-2.33.1 rich-14.3.3 rpds-py-0.30.0 shellingham-1.5.4 six-1.17.0 sniffio-1.3.1 sortedcontainers-2.4.0 sqlalchemy-2.0.49 starlette-1.0.0 tenacity-9.1.4 tiktoken-0.12.0 tokenizers-0.22.2 tornado-6.5.5 tqdm-4.67.3 trio-0.33.0 typer-0.23.1 typing-inspection-0.4.2 uritemplate-4.2.0 urllib3-2.6.3 uvicorn-0.44.0 uvloop-0.22.1 watchfiles-1.1.1 websockets-16.0 yarl-1.23.0 zipp-3.23.0 ---- Installing frontend dependencies --- - -up to date, audited 1537 packages in 7s - -344 packages are looking for funding - run `npm fund` for details - -46 vulnerabilities (13 low, 9 moderate, 24 high) - -To address issues that do not require attention, run: - npm audit fix - -To address all issues (including breaking changes), run: - npm audit fix --force - -Run `npm audit` for details. ---- Starting AI Hub Server, React frontend, and backend proxy --- -npm ERR! code ENOENT -npm ERR! syscall lstat -npm ERR! path /home/vscode/.npm-global/lib -npm ERR! errno -2 -npm ERR! enoent ENOENT: no such file or directory, lstat '/home/vscode/.npm-global/lib' -npm ERR! enoent This is related to npm not being able to find a file. -npm ERR! enoent - -npm ERR! A complete log of this run can be found in: -npm ERR! /home/vscode/.npm/_logs/2026-04-09T07_16_49_024Z-debug-0.log