:SiS:TdZddlZddlZddlZddlmZddlmZmZmZGddZ y)zC ConfigManager - Gestione sicura di config.yaml per editor profili N)datetime)OptionalDictTupleceZdZdZdefdZdefdZdededeefdZ deded ede fd Z defd Z dd e fd Zdedee effdZdeeeffdZdededefdZdededefdZdedefdZdede fdZdZy) ConfigManagerzBGestisce lettura/scrittura di config.yaml con backup e validazione config_pathc||_d|_tjj tjj |d|_tj|j dy)zo Inizializza ConfigManager Args: config_path: Path assoluto a config.yaml NbackupsT)exist_ok)r configospathjoindirname backup_dirmakedirs)selfr s core/config_manager.py__init__zConfigManager.__init__sN' '',, GGOOK (   DOOd3returnc|jr |jS t|jdd5}tj||_ddd|js t d|jS#1swY,xYw#t $rt d|jtj$r}t d|d}~wt$r}td|d}~wwxYw) u* Carica config.yaml con error handling Returns: Dict contenente la configurazione Raises: FileNotFoundError: Se config.yaml non esiste ValueError: Se YAML è malformato o vuoto Exception: Altri errori di caricamento rutf-8encodingNzConfig file vuoto o invalidozFile config non trovato: zErrore parsing YAML: zErrore caricamento config: ) r openr yaml safe_load ValueErrorFileNotFoundError YAMLError Exceptionrfes r load_configzConfigManager.load_configs ;;;;  ?d&&g> 0!"nnQ/  0;; !?@@;;   0 0! T#&?@P@P?Q$RS S~~ :4QC89 9 ?9!=> > ?s:BA8 *B8B=B3C$7C C$CC$ profile_name service_namec|js|j|jjdi}||vry||}|D]*}|jd|k(s|jdicSy)a& Estrae config per servizio specifico di un profilo Args: profile_name: Nome profilo (es. 'warren', 'aurelio') service_name: Nome servizio (es. 'CognitiveService') Returns: Dict con parametri servizio, o None se non trovato profilesNr*r )r r(get)rr)r*r,servicesservices rget_service_configz ConfigManager.get_service_config>sv{{    ;;??:r2 x 'L) 1G{{>*l:{{8R00 1rupdatesc B|js|j|jjdi}||vrtd|d||}d}|D]B}|jd|k(s|jdi}|j |||d<d}n|std|d |d  t |j d d 5} tj|j| dddddddy#1swYyxYw#t$r} td| d} ~ wwxYw)a Aggiorna parametri di un servizio e scrive su disk Args: profile_name: Nome profilo (es. 'warren') service_name: Nome servizio (es. 'CognitiveService') updates: Dict con chiavi da aggiornare (es. {'temperature': 0.8}) Returns: True se successo Raises: ValueError: Se profilo o servizio non trovato Exception: Se scrittura fallisce r, Profilo 'z ' non trovatoFr*r Tz Servizio 'z' non trovato in profilo ''wrrxdefault_flow_style allow_unicode sort_keyswidthNErrore scrittura config.yaml: ) r r(r-r!updaterr rdumpr$) rr)r*r1r,r. service_foundr/service_configr&r's rupdate_service_configz#ConfigManager.update_service_configWsE*{{    ;;??:r2 x 'ymDE EL)  G{{>*l:!(Xr!:%%g.$2! $  z,7QR^Q__`ab b Bd&&g> ! KK',"&#    BBB>SUVL;;J U'/$22:>'rpromptc ^ |jd}d}d}d}|ddD] j t fddDrdD]}| jvs jj|}t |dkDsD|djdd jd d j} t | d kDst | d ks| j }ntd Dsd vst fddDs j}dj |jdd} t | dkDr| dddz} |j|} |xs| d|xs| d| d| | d|xs| jdddS)z Inferisce metadata da agent_prompt Args: profile_id: ID del profilo prompt: Agent prompt da cui estrarre info Returns: Dict con metadata inferiti  N c3BK|]}|jvywNlower).0wordlines r z.0sRD44::<'R)zsei zyou arezyou're)z sei z are z're ,r.2c3<K|]}|jywro)isdigit)rrchars rruz.<s3d4<<>3s-c3BK|]}|jvywrorp)rrxrts rruz.=s&jQqDJJL'8&jrv)zd.c.za.d.present1920 z...namesubtitleiconcolorperiodrXrrr descriptionrr) splitstripanyrqlentitlerrhr-) rr_rjlinesrrrsepparts candidaterdefaultsrts @rrgz)ConfigManager._infer_metadata_from_prompts T"#2J *D::(-as(;A(>(D(DS(I!(L(R(R(TI"9~1c)nr6I'0'8 %&3d33$;3&jBi&j#j!ZZ\F% **hhv||~cr23 { c !%ds+e3K22:>,HV, 8HZ$8V$&g&: Xr :   rcddddddddd d d d d dd}||vr||jS|jddjddd|dddS)z Genera metadata di default per un profilo Args: profile_id: ID del profilo Returns: Dict con metadata default sicuri z Marco AureliozImperatore Filosofou👑z=Imperatore romano e filosofo stoico, autore delle Meditazioniz#8B4513z 121-180 d.C.rzWarren BuffettzOracolo di Omahau📈z3Investitore e filantropo, CEO di Berkshire Hathawayz#2E7D32z 1930-presente)aureliowarren_rzProfilo Personalizzatou🤖zProfilo personalizzato: z#757575rX)copyreplacer)rr_KNOWN_PROFILESs rrhz(ConfigManager._generate_default_metadataQs(1^"( ).T")  (  '!*-224 4&&sC066805j\B   rcddg}||vrtd||js|j|jjdi}||vrtd|d |j }t d||jd|=|jt d |d y #t $r}t d|Yd }~Ld }~wwxYw) u Elimina profilo da config.yaml Crea backup automatico prima di eliminare. Protegge i profili di sistema (aurelio, warren). Args: profile_id: ID del profilo da eliminare Returns: True se successo Raises: ValueError: Se profilo è di sistema o non esiste Exception: Se salvataggio fallisce rrz*Impossibile eliminare profilo di sistema: r,r3z' non esiste in config.yamlz[ConfigManager] Backup creato: z4[ConfigManager] WARNING: Impossibile creare backup: Nz[ConfigManager] Profilo 'z' eliminato da config.yamlT)r!r r(r-rNprintr$ _save_config)rr_SYSTEM_PROFILESr,rMr's rdelete_profilezConfigManager.delete_profile}s$%h/  (r r$r%s rrzConfigManager._save_configsy Bd&&g> ! KK',"&#     Bs#(SW.2:B:B:B :B  :Bx=s=2*rs, ((wBwBr