from typing import List, Optional from fastapi import APIRouter, Depends, File, Form, UploadFile from sqlmodel import Session from core.database import get_session from models.bot import NanobotImage from api.dashboard_router_support import DashboardRouterDeps def build_dashboard_assets_router(*, deps: DashboardRouterDeps) -> APIRouter: router = APIRouter() @router.get("/api/images", response_model=List[NanobotImage]) def list_images(session: Session = Depends(get_session)): return deps.image_service.list_images(session=session) @router.delete("/api/images/{tag:path}") def delete_image(tag: str, session: Session = Depends(get_session)): return deps.image_service.delete_image(session=session, tag=tag) @router.get("/api/docker-images") def list_docker_images(repository: str = "nanobot-base"): return deps.image_service.list_docker_images(repository=repository) @router.post("/api/images/register") def register_image(payload: dict, session: Session = Depends(get_session)): return deps.image_service.register_image(session=session, payload=payload) @router.post("/api/providers/test") async def test_provider(payload: dict): return await deps.provider_test_service.test_provider(payload=payload) @router.get("/api/platform/skills") def list_skill_market(session: Session = Depends(get_session)): return deps.skill_service.list_market_items(session=session) @router.post("/api/platform/skills") async def create_skill_market_item( skill_key: str = Form(""), display_name: str = Form(""), description: str = Form(""), file: UploadFile = File(...), session: Session = Depends(get_session), ): return await deps.skill_service.create_market_item( session=session, skill_key=skill_key, display_name=display_name, description=description, file=file, ) @router.put("/api/platform/skills/{skill_id}") async def update_skill_market_item( skill_id: int, skill_key: str = Form(""), display_name: str = Form(""), description: str = Form(""), file: Optional[UploadFile] = File(None), session: Session = Depends(get_session), ): return await deps.skill_service.update_market_item( session=session, skill_id=skill_id, skill_key=skill_key, display_name=display_name, description=description, file=file, ) @router.delete("/api/platform/skills/{skill_id}") def delete_skill_market_item(skill_id: int, session: Session = Depends(get_session)): return deps.skill_service.delete_market_item(session=session, skill_id=skill_id) @router.get("/api/bots/{bot_id}/skills") def list_bot_skills(bot_id: str, session: Session = Depends(get_session)): return deps.skill_service.list_workspace_skills_for_bot( session=session, bot_id=bot_id, resolve_edge_state_context=deps.resolve_edge_state_context, logger=deps.logger, ) @router.get("/api/bots/{bot_id}/skill-market") def list_bot_skill_market(bot_id: str, session: Session = Depends(get_session)): return deps.skill_service.list_bot_market_items_for_bot( session=session, bot_id=bot_id, resolve_edge_state_context=deps.resolve_edge_state_context, logger=deps.logger, ) @router.post("/api/bots/{bot_id}/skill-market/{skill_id}/install") def install_bot_skill_from_market(bot_id: str, skill_id: int, session: Session = Depends(get_session)): return deps.skill_service.install_market_item_for_bot_checked( session=session, bot_id=bot_id, skill_id=skill_id, resolve_edge_state_context=deps.resolve_edge_state_context, logger=deps.logger, ) @router.post("/api/bots/{bot_id}/skills/upload") async def upload_bot_skill_zip(bot_id: str, file: UploadFile = File(...), session: Session = Depends(get_session)): return await deps.skill_service.upload_bot_skill_zip_for_bot( session=session, bot_id=bot_id, file=file, resolve_edge_state_context=deps.resolve_edge_state_context, logger=deps.logger, ) @router.delete("/api/bots/{bot_id}/skills/{skill_name}") def delete_bot_skill(bot_id: str, skill_name: str, session: Session = Depends(get_session)): return deps.skill_service.delete_workspace_skill_for_bot( session=session, bot_id=bot_id, skill_name=skill_name, resolve_edge_state_context=deps.resolve_edge_state_context, ) return router