�
Qi�h� �
�� � d dl Z d dlZd dlZd dlZd dlmZmZmZmZm Z d dl
mZmZm
Z
d dlmZ e j j# e j j% e� d� Z ej* � Zdeeeeeef f fd�Zdeeeeeef f ddfd �Zdeeeeeef f d
eddfd�Zdeeeeeef f d
edede ee eeeef f fd
�Zd
edeeef deeef fd�Zd
ededeeef fd�Zd
edeeeef fd�Zd
ededdfd�Z d
ededeeef deeef fd�Z! ed�� Z"e"jG d� e
d� fd
edeeef fd�� Z$e"jK d� d
edefd�� Z&e"jK d� d
efd�� Z'e"jQ d� d
edefd�� Z)e"jU d� e
d� fd
ededeeef fd�� Z+ ed�� Z,e,j[ d d!d"�#� d
edeeef fd$�� Z.e,j[ d%d&d'�#� d
edefd(�� Z/e,j[ d)d*d+�#� d
efd,�� Z0e,j[ d-d.d/�#� d
edefd0�� Z1e,j[ d1d2d3�#� d
ededeeef fd4�� Z2e,jg � Z4e"jk d5e4� e"jK d6� d7� � Z6e7d8k( rd dl8Z8 e8jr d9d:d;d<�=� yy)>� N)�Any�Dict�List�Optional�Tuple)�FastAPI�
HTTPException�Body)�FastMCPzdb.json�returnc � � t j j t � si S t t dd�� 5 } t j | � cddd� S # t
j $ r i cY cddd� S w xY w# 1 sw Y yxY w)z5Load DB from disk; return {} if file missing/invalid.�r�utf-8��encodingN)�os�path�exists�DB_PATH�open�json�load�JSONDecodeError)�fhs �+/home/osoliman/workspace/mcp-server/main.py�load_dbr su � �
�7�7�>�>�'�"�� �
�g�s�W� -� �� ��9�9�R�=�� �� �#�#� ��I� � � ��� �s( �A<�A�A9�-A<�8A9�9A<�<B�dbc �� � t dz }t |dd�� 5 }t j | |dd�� ddd� t j
|t � y# 1 sw Y �$xY w) zAtomic write to disk.z.tmp�wr r � F)�indent�ensure_asciiN)r r r �dumpr �replace)r �tmpr s r �save_dbr&