Ë
    ÛJêjó  ã                  óÒ   — d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
  ej                  e«      Ze G d„ d«      «       Z G d„ d	e«      Ze G d
„ d«      «       Z G d„ d«      Zy)zMRole assignment management for Model Intelligence with free-only constraints.é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyc                  óJ   — e Zd ZU dZded<   ded<   dZded<   dZded<   dd	„Zy
)ÚModelRefz%Reference to a model in the registry.ÚstrÚproviderÚmodel_idTÚboolÚis_freeÚverifiedc                óJ   — | j                   r| j                  st        d«      ‚y )Nz2ModelRef must have non-empty provider and model_id)r
   r   Ú
ValueError©Úselfs    úN/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/role_assignment.pyÚ__post_init__zModelRef.__post_init__   s    € Ø�}Š} D§M¢MÜÐQÓRÐRð %2ó    N©ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   © r   r   r   r      s)   … á/àƒMØƒMØ€GˆTÓØ€HˆdÓôSr   r   c                  ó   — e Zd ZdZy)ÚNoAvailableModelz:Raised when no suitable model is available for assignment.N)r   r   r   r   r   r   r   r    r       s   „ ÙDàr   r    c                  ó‚   — e Zd ZU dZded<   ded<    ee¬«      Zded<    ee¬«      Zd	ed
<   dZ	ded<   dZ
ded<   dd„Zy)ÚRoleModelAssignmentz?Represents a role assignment with main model and backup models.r	   Úroler   Úmain)Údefault_factoryzlist[ModelRef]Úbackupszlist[dict[str, Any]]Úresultsg        ÚfloatÚassigned_atNúModelRef | NoneÚrollback_toc                óh   — d| j                   › d| j                  › dt        | j                  «      › d�S )NzRoleModelAssignment(role=z, main=z
, backups=ú))r#   r$   Úlenr&   r   s    r   Ú__repr__zRoleModelAssignment.__repr__-   s4   € Ø*¨4¯9©9¨+°W¸T¿Y¹Y¸KÀzÔRUÐVZ×VbÑVbÓRcÐQdÐdeÐfÐfr   )r   r	   )r   r   r   r   r   r   Úlistr&   r'   r)   r+   r/   r   r   r   r"   r"   "   sH   … áIà
ƒIØ
ƒNÙ#°DÔ9€Gˆ^Ó9Ù$)¸$Ô$?€GÐ!Ó?Ø€K�ÓØ#'€K�Ó'ôgr   r"   c                  ó�   — e Zd ZdZdd„Z	 dddœ	 	 	 	 	 	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 	 	 	 	 dd„Zdd	œ	 	 	 	 	 dd
„Zdd„Z	dd„Z
dd„Zy)ÚRoleAssignmentStorez=Thread-safe storage for role assignments and their lifecycle.c                óD   — i | _         t        j                  «       | _        y ©N)Ú_storeÚ	threadingÚLockÚ_lockr   s    r   Ú__init__zRoleAssignmentStore.__init__4   s   € Ø68ˆŒÜ—^‘^Ó%ˆ�
r   NT)r   c               ó  — t        |||rt        |«      ng g t        j                  «       ¬«      }| j                  5  || j                  |<   ddd«       t
        j                  d||t        |j                  «      «       |S # 1 sw Y   Œ6xY w)z*Assign a role with main model and backups.)r#   r$   r&   r'   r)   Nz,Assigned role %r with main=%s and backups=%d)	r"   r0   Útimer8   r5   ÚloggerÚinfor.   r&   )r   r#   r$   r&   r   Ú
assignments         r   ÚassignzRoleAssignmentStore.assign8   s‚   € ô )ØØÙ%,”D˜”M°"ØÜŸ	™	›ô
ˆ
ð �Z‰Zñ 	+Ø *ˆD�K‰K˜Ñ÷	+ä�‰Ø:ØØÜ�
×"Ñ"Ó#ô		
ð Ð÷	+ð 	+ús   ¼BÂB
c                ó|   — | j                   5  | j                  j                  |«      cddd«       S # 1 sw Y   yxY w)z(Retrieve a role assignment by role name.N)r8   r5   Úget)r   r#   s     r   rA   zRoleAssignmentStore.getR   s.   € à�Z‰Zñ 	)Ø—;‘;—?‘? 4Ó(÷	)÷ 	)ò 	)ús   �2²;c                óþ   — | j                   5  | j                  j                  |«      }|€ t        j	                  d|«       	 ddd«       y|j
                  j                  |||dœ«       ddd«       y# 1 sw Y   yxY w)z&Record a result for a role assignment.NzNo assignment found for role %r)Ú	task_kindr   Úsuccess)r8   r5   rA   r<   Úwarningr'   Úappend)r   r#   rC   r   rD   r>   s         r   Úrecord_resultz!RoleAssignmentStore.record_resultW   sx   € ð �Z‰Zñ 		ØŸ™Ÿ™¨Ó.ˆJØÐ!Ü—‘Ð@À$ÔGØ÷			ð 		ð
 ×Ñ×%Ñ%Ø&Ø$Ø"ñ'ô ÷		÷ 		ñ 		ús   �5A3ÁA3Á3A<)Úmain_availablec               ó‚  — | j                   5  | j                  j                  |«      }|€t        d|› �«      ‚|r|j                  cddd«       S |j
                  D ]?  }|j                  sŒ|j                  sŒt        j                  d||«       |c cddd«       S  	 ddd«       t        d|› �«      ‚# 1 sw Y   ŒxY w)zISelect the main model for a role, falling back to a verified free backup.NzNo assignment found for role zUsing backup %s for role %rzNo available model for role )
r8   r5   rA   r    r$   r&   r   r   r<   r=   )r   r#   rH   r>   Úbackups        r   Úselect_for_rolez#RoleAssignmentStore.select_for_rolej   s¸   € ð �Z‰Zñ 	"ØŸ™Ÿ™¨Ó.ˆJØÐ!Ü&Ð)FÀtÀfÐ'MÓNÐNáØ!—‘÷	"ñ 	"ð %×,Ñ,ò "�Ø—?“? v§~£~Ü—K‘KÐ =¸vÀtÔLØ!‘M÷	"ñ 	"ñ"÷	"ô Ð!=¸d¸VÐDÓEÐE÷	"ð 	"ús#   �9B5ÁB5Á,B5Á9B5ÂB5Â5B>c                ó¬   — | j                   5  | j                  j                  |«      }|€
	 ddd«       y|j                  cddd«       S # 1 sw Y   yxY w)z&Rollback to the main model for a role.N)r8   r5   rA   r$   )r   r#   r>   s      r   ÚrollbackzRoleAssignmentStore.rollback‚   sL   € à�Z‰Zñ 	#ØŸ™Ÿ™¨Ó.ˆJØÐ!Ø÷	#ð 	#ð —?‘?÷		#÷ 	#ò 	#ús   �A
µA
Á
Ac                óŒ   — | j                   5  t        | j                  j                  «       «      cddd«       S # 1 sw Y   yxY w)zList all defined roles.N)r8   r0   r5   Úkeysr   s    r   Ú
list_roleszRoleAssignmentStore.list_rolesŠ   s3   € à�Z‰Zñ 	,Ü˜Ÿ™×(Ñ(Ó*Ó+÷	,÷ 	,ò 	,ús	   �#:ºAc                ó>  — | j                   5  t        «       }| j                  j                  «       D ]S  }|j	                  |j
                  j                  «       |j                  D ]  }|j	                  |j                  «       Œ ŒU |cddd«       S # 1 sw Y   yxY w)z0Return distinct model IDs used across all roles.N)r8   Úsetr5   ÚvaluesÚaddr$   r   r&   )r   Úmodelsr>   rJ   s       r   Údistinct_modelsz#RoleAssignmentStore.distinct_models�   s�   € à�Z‰Zñ 	Ü“UˆFØ"Ÿk™k×0Ñ0Ó2ò 0�
Ø—
‘
˜:Ÿ?™?×3Ñ3Ô4Ø(×0Ñ0ò 0�FØ—J‘J˜vŸ™Õ/ñ0ð0ð ÷	÷ 	ò 	ús   �A<BÂBr   r4   )
r#   r	   r$   r   r&   zlist[ModelRef] | Noner   r   r   r"   )r#   r	   r   zRoleModelAssignment | None)
r#   r	   rC   r	   r   r	   rD   r   r   r   )r#   r	   rH   r   r   r*   )r#   r	   r   r*   )r   z	list[str])r   zset[str])r   r   r   r   r9   r?   rA   rG   rK   rM   rP   rV   r   r   r   r2   r2   1   sÁ   „ ÙGó&ð *.ð	ð ñàðð ðð 'ð	ð ðð 
óó4)ð
àðð ðð ð	ð
 ðð 
óð.  $ñ	FàðFð ð	Fð
 
óFó0#ó,ô
r   r2   )r   Ú
__future__r   Úloggingr6   r;   Údataclassesr   r   Útypingr   Ú	getLoggerr   r<   r   Ú	Exceptionr    r"   r2   r   r   r   ú<module>r]      s|   ðÙ Så "ã Û Û ß (Ý à	ˆ×	Ñ	˜8Ó	$€ð ÷
Sð 
Só ð
Sô	�yô 	ð ÷gð gó ðg÷fò fr   