
    ɢi                         U d Z ddlZddlZddlmZmZmZmZmZm	Z	 ddl
mZmZmZ  ej                  e      Z ed      Z G d de      Z G d d	eee         Z G d
 de      Zi Zeeef   ed<   	 	 	 	 	 	 ddedededeee      deee      deee      defdZdedee	   fdZdedee   fdZdee   fdZdee   fdZddede	defdZ  G d d      Z!y) a  Universal Module Contract for aura_core.

Every module follows the same pattern:
1. Declare input/output types (Pydantic models)
2. Implement run(input) -> ModuleResult[OutputType]
3. Register via @aura_module decorator
4. Get MCP schema, swapability, and pipeline composition for free

Design principles:
- Protocol over ABC (structural typing, no inheritance chains)
- Pydantic for I/O (auto JSON schema = MCP tool schema for free)
- Registry for discovery/swap (decorator-based self-registration)
- ModuleResult wraps everything (output + diagnostics + timing + metadata)
- Pipeline = list of modules, output feeds input, validation between steps
    N)TypeVarGenericOptionalAnyTypeCallable)	BaseModelField
ConfigDictTc                       e Zd ZU  ee      Zee   ed<    ee      Zee   ed<    ee      Z	ee   ed<   e
defd       Ze
defd       Zded	efd
Zded	efdZdedefdZy)ModuleDiagnosticsdefault_factoryerrorswarningsrepairsreturnc                 2    t        | j                        dk(  S )Nr   )lenr   selfs    7/sites/domain-asset-master/aura_core/module_contract.pyis_cleanzModuleDiagnostics.is_clean    s    4;;1$$    c                     d}|t        | j                        dz  z  }|t        | j                        dz  z  }t        dt	        d|            S )Nd         r   )r   r   r   maxmin)r   bases     r   scorezModuleDiagnostics.score$   sJ    DKK 2%%DMM"Q&&1c#tn%%r   fieldmessagec                 @    | j                   j                  ||d       y N)r$   r%   )r   appendr   r$   r%   s      r   errorzModuleDiagnostics.error+   s    Uw?@r   c                 @    | j                   j                  ||d       y r'   )r   r(   r)   s      r   warnzModuleDiagnostics.warn.   s    uABr   actionc                 @    | j                   j                  ||d       y )N)r$   r-   )r   r(   )r   r$   r-   s      r   repairzModuleDiagnostics.repair1   s    ev>?r   N)__name__
__module____qualname__r
   listr   dict__annotations__r   r   propertyboolr   intr#   strr*   r,   r/    r   r   r   r      s    t4FDJ4 6Hd4j65GT$Z5%$ % % &s & &A3 A AC# C C@C @ @r   r   c                       e Zd ZU  ed      ZdZeed<   dZe	e
   ed<    ee      Zeed<   dZeed	<   d
Zeed<   d
Zeed<    ee      Zeed<   defdZy)ModuleResultT)arbitrary_types_allowedokNoutputr   diagnosticsg        
elapsed_ms module_namemodule_versionmetadatar   c                    | j                   t        | j                  t              r| j                  j	                         n| j                  | j
                  j                  | j
                  j                  | j
                  j                  | j
                  j                  d| j                  | j                  | j                  dS )N)r#   r   r   r   )r>   r?   r@   rA   moduleversion)r>   
isinstancer?   r	   
model_dumpr@   r#   r   r   r   rA   rC   rD   r   s    r   to_mcp_responsezModuleResult.to_mcp_response@   s    ''2<T[[)2Tdkk,,.Z^ZeZe))//**11 ,,55++33	 //&&**
 	
r   )r0   r1   r2   r   model_configr>   r7   r5   r?   r   r   r
   r   r@   rA   floatrC   r9   rD   r4   rE   rK   r:   r   r   r<   r<   5   sm    d;LBO FHSM %*;L%MK"MJKNC40Hd0
 
r   r<   c                       e Zd ZU eed<   dZeed<   dZeed<    ee      Z	eed<    ee      Z
eed<    ee      Zee   ed	<   d
Zeed<   y)
ModuleSpecname0.1.0rH   rB   descriptionr   input_schemaoutput_schematagsTpureN)r0   r1   r2   r9   r5   rH   rR   r
   r4   rS   rT   r3   rU   rV   r7   r:   r   r   rO   rO   P   sV    
IGSKt4L$45M45D1D$s)1D$r   rO   _MODULE_REGISTRYrP   rH   rR   input_modeloutput_modelrU   rV   c                 D     dt         dt         f fd}|S )Nfnr   c           	      8    t        	xs  j                  xs drj                         ni rj                         ni xs g       }dt        f 	fd} |_        ||_         j                  |_         j                  |_        | |dt        <   |S )NrB   rP   rH   rR   rS   rT   rU   rV   r   c                     t        j                         }t               }	  | i |}t        j                         |z
  dz  }t        |t              r||_        |_        	|_        |S t	        d|||	      S # t        $ r}t        j                         |z
  dz  }|j                  dt        |             t        j                  d d       t	        dd ||	dt        |      j                  i	      cY d }~S d }~ww xY w)
Ni  T)r>   r?   r@   rA   rC   rD   	execution[z] Module execution failedF	exception)r>   r?   r@   rA   rC   rD   rE   )timeperf_counterr   rI   r<   rA   rC   rD   	Exceptionr*   r9   loggerra   typer0   )
argskwargsstartr@   resultelapseder[   rP   rH   s
          r   wrapperz/aura_module.<locals>.decorator.<locals>.wrapperq   s   %%'E+-KT,V,,,.6$>fl3(/F%)-F&,3F)!M#! +& $#*   ,,.6$>!!+s1v6  1TF*C!DE# +& $#*)47+;+;< 	s%   AA; *A; ;	DA4C>8D>Dr[   raw_fnspec)rO   __doc__model_json_schemar<   __wrapped____module_spec__r0   rW   )
r[   rp   rm   rR   rX   rP   rY   rV   rU   rH   s
   `  r   	decoratorzaura_module.<locals>.decoratorf   s    #7rzz7R<G668R>J,88:PR
!	 !	F !"&;;** "
 r   )r   )rP   rH   rR   rX   rY   rU   rV   ru   s   ``````` r   aura_modulerv   ]   s$    9h 98 9 9v r   r   c                 >    t         j                  |       }|r|d   S d S )Nr[   rW   getrP   entrys     r   
get_moduler|      s#      &E5;)T)r   c                 >    t         j                  |       }|r|d   S d S Nrp   rx   rz   s     r   get_module_specr      s#      &E!5=+t+r   c                  V    t         j                         D  cg c]  } | d   	 c} S c c} w r~   )rW   values)r{   s    r   list_modulesr      s#    '7'>'>'@AeE&MAAAs   &c                      g } t         j                         D ]E  }|d   }| j                  |j                  |j                  |j
                  |j                  d       G | S )Nrp   )rP   rR   inputSchemaoutputSchema)rW   r   r(   rP   rR   rS   rT   )toolsr{   rp   s      r   get_mcp_tool_definitionsr      sb    E!((* V}II++,, ..	
 	 Lr   new_fnc           	      .   | t         vrt        d|  d      t         |    }|d   }t        | ||j                  |j                  |j
                  |j                  dgz   |j                        }|||dt         | <   t        j                  d|  d|        y )	NModule 'z' not registeredrp   swappedr]   rn   z[registry] Swapped module 'z' -> v)
rW   KeyErrorrO   rR   rS   rT   rU   rV   re   info)rP   r   rH   oldold_specnew_specs         r   swap_moduler      s    ##$'7899
4
 C6{H((**,,]]i[(]]H T
 KK-dV6'CDr   c            	       |    e Zd ZddefdZddedee   dd fdZddededee   dd fd	Zd
e	de
e   fdZd
e	defdZy)PipelinerP   c                      || _         g | _        y N)rP   steps)r   rP   s     r   __init__zPipeline.__init__   s    	EG
r   NrC   adapterr   c                 z    t        |      }|t        d| d      | j                  j                  |||f       | S )Nr   z' not found in registry)r|   r   r   r(   )r   rC   r   r[   s       r   addzPipeline.add   sD    $:Xk]2IJKK

;G45r   r[   c                 B    | j                   j                  |||f       | S r   )r   r(   )r   rP   r[   r   s       r   add_fnzPipeline.add_fn   s     

4W-.r   initial_inputc                 Z   g }|}| j                   D ]  \  }}}|r|r ||d   j                        } ||      }t        |t              st        d||      }|j	                  |       |j
                  s)t        j                  d| j                   d| d        |S |j                  } |S )NT)r>   r?   rC   z
[pipeline:z] Step 'z' failed, halting)	r   r?   rI   r<   r(   r>   re   warningrP   )r   r   resultscurrent_input	step_namer[   r   rj   s           r   runzPipeline.run   s    %&*jj 	*"Ir77 '(:(: ;&Ffl3%f)TNN6"99DII;hykIZ[\  #MMM	*" r   c                 `    | j                  |      }|r|d   S t        d| j                        S )Nr   F)r>   rC   )r   r<   rP   )r   r   r   s      r   run_lastzPipeline.run_last   s,    ((=)%wr{X<5dii+XXr   )pipeliner   )r0   r1   r2   r9   r   r   r   r   r   r   r3   r<   r   r   r:   r   r   r   r      s    HS Hs Xh-? : 3 H x7I U_  l); .Yc Yl Yr   r   )rQ   rB   NNNT)z
0.1.0-swap)"rq   rb   loggingtypingr   r   r   r   r   r   pydanticr	   r
   r   	getLoggerr0   re   r   r   r<   rO   rW   r4   r9   r5   r3   r7   rv   r|   r   r   r   r   r   r:   r   r   <module>r      sv      B B 1 1			8	$CL@	 @4
9gaj 
6  %' $sDy/ &
 -1.2 $D
DD D $y/*	D
 4	?+D 49
D DN*S *Xh/ *
,# ,(:"6 ,
Bd:& B
$t* 
Ec E8 Ec E,)Y )Yr   