from typing import List, Optional from pydantic import BaseModel class ToolMetadata(BaseModel): id: str name: str description: str category: str tags: List[str] type: str # 'client' or 'server' endpoint: Optional[str] = None # Only for server type # === 도구 등록소 === # 새로운 기능을 추가할 때 여기만 수정하면 검색/메뉴에 자동 반영되도록 구성합니다. TOOLS_REGISTRY = [ ToolMetadata( id="url-parser", name="URL Encoder/Decoder", description="Encodes or decodes a URL string.", category="Web", tags=["url", "encode", "decode", "percent-encoding"], type="client" ), ToolMetadata( id="json-formatter", name="JSON Formatter", description="Prettify or minify JSON data.", category="Data", tags=["json", "pretty", "minify", "format"], type="client" ), ToolMetadata( id="py-uuid", name="UUID Generator", description="Generates UUIDs locally (v1/v4).", category="Development", tags=["uuid", "guid", "random", "client-side"], type="client" ), ToolMetadata( id="png-compressor", name="PNG Compressor", description="Compress PNG images using pngquant (Lossy, 60-80% reduction).", category="Image", tags=["image", "png", "compress", "pngquant", "optimize"], type="server", endpoint="/api/tools/png-compress" ), ToolMetadata( id="password-generator", name="Password Generator", description="Generate secure random passwords locally (Client-side).", category="Security", tags=["password", "random", "secure", "generator", "client-side"], type="client" ), ToolMetadata( id="jwt-debugger", name="JWT Debugger", description="Decode and inspect JSON Web Tokens.", category="Security", tags=["jwt", "token", "decode", "security"], type="client" ), ToolMetadata( id="cron-generator", name="Cron Schedule Generator", description="Generate and explain cron expressions.", category="Utility", tags=["cron", "schedule", "time", "generator"], type="client" ), ToolMetadata( id="sql-formatter", name="SQL Formatter", description="Beautify and format SQL queries.", category="Formatters", tags=["sql", "format", "database", "query"], type="client" ), ToolMetadata( id="diff-viewer", name="Diff Viewer", description="Compare text and see differences side-by-side.", category="Text", tags=["diff", "compare", "text", "code"], type="client" ), ToolMetadata( id="qr-generator", name="QR Code Generator", description="Generate QR codes from text or URLs.", category="Generators", tags=["qr", "code", "generator", "image"], type="client" ), ToolMetadata( id="base64-encoder", name="Base64 File Encoder", description="Convert files to Base64 strings.", category="Encoders", tags=["base64", "encode", "file", "image"], type="client" ), ToolMetadata( id="json-converter", name="JSON Converter", description="Convert between JSON, CSV, and YAML.", category="Converters", tags=["json", "csv", "yaml", "convert"], type="client" ), ToolMetadata( id="regex-tester", name="Regex Tester", description="Test regular expressions in real-time.", category="Text", tags=["regex", "test", "pattern", "match"], type="client" ), ToolMetadata( id="docker-converter", name="Docker Converter", description="Convert between Docker Run and Docker Compose.", category="DevOps", tags=["docker", "compose", "convert", "devops"], type="client" ), ToolMetadata( id="mock-data-generator", name="Mock Data Generator", description="Generate random user data for testing.", category="Generators", tags=["mock", "data", "fake", "generator"], type="client" ), ToolMetadata( id="svg-optimizer", name="SVG Optimizer", description="Optimize and minify SVG code.", category="Image", tags=["svg", "optimize", "minify", "image"], type="client" ), ToolMetadata( id="video-to-gif", name="Video to GIF", description="Convert video clips to GIF format.", category="Video", tags=["video", "gif", "convert", "ffmpeg"], type="server", endpoint="/api/tools/video/gif" ) ] def search_tools(query: str = "") -> List[ToolMetadata]: if not query: return TOOLS_REGISTRY q = query.lower() return [ t for t in TOOLS_REGISTRY if q in t.name.lower() or q in t.description.lower() or any(q in tag for tag in t.tags) ]