Ë
    ªÞjé!  ã                  ó   — d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZ  G d„ dee«      Zej                  dej                   dej"                  d	ej$                  d
iZd(d„Z G d„ dee«      Z eddh«      Z ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       ZdZdZdZdZ d Z!d!Z"	 	 	 	 d)d"„Z#d*d#„Z$d+dd%d&œ	 	 	 	 	 d,d'„Z%y$)-uØ  Einzige Routinglogik des Aria-V3-Kerns.

`route()` ist eine reine Funktion: Sie entscheidet, fÃ¼hrt nichts aus und
vergibt keine Freigabe. AusfÃ¼hren kann nur ein Adapter mit gÃ¼ltiger
HMAC-Clearance (siehe authorization.py, adapter_contract.py).

EingangsgrÃ¶ÃŸen: Aufgabenklasse, FÃ¤higkeiten, Datenschutzklasse (Ã¼ber die
PrivacyMatrix), QualitÃ¤t (inkl. Untergrenze), VerfÃ¼gbarkeit, Budget,
KontextgrÃ¶ÃŸe und manuelle Modellwahl. Bei gleicher Eignung gewinnt Codex.
é    )Úannotations)Ú	dataclassÚfield)ÚEnum)Ú	FrozenSetÚIterableÚMappingÚOptionalc                  ó   — e Zd ZdZdZdZdZy)ÚPrivacyTierÚpublicÚinternalÚconfidentialÚunknownN)Ú__name__Ú
__module__Ú__qualname__ÚPUBLICÚINTERNALÚCONFIDENTIALÚUNKNOWN© ó    ú-/home/aria/aria-v3/python/aria_router/core.pyr   r      s   „ Ø€FØ€HØ!€LØ�Gr   r   é   é   é   c                óŒ   — t         j                  }d}| D ]  }d}t        |   t        |   kD  sŒ|}Œ |r|S t         j                  S )NFT)r   r   ÚPRIVACY_SEVERITYr   )ÚtiersÚresultÚseenÚtiers       r   Úmost_sensitiver$   #   sS   € Ü×Ñ€FØ€DØò ˆØˆÜ˜DÑ!Ô$4°VÑ$<Ó<Ø‰Fðñ ˆ6Ð2œ{×2Ñ2Ð2r   c                  ó   — e Zd ZdZdZdZy)ÚModeÚautoÚcodexÚclaudeN)r   r   r   ÚAUTOÚCODEXÚCLAUDEr   r   r   r&   r&   -   s   „ Ø€DØ€EØ�Fr   r&   r(   r)   T)Úfrozenc                  ó�   — e Zd ZU ded<   ded<   ej
                  Zded<    ee¬«      Z	ded<   e
j                  Zd	ed
<   dZded<   y)Ú
JobRequestÚstrÚjob_idÚ
task_classr   Úprivacy)Údefault_factoryúFrozenSet[str]Úrequired_capabilitiesr&   Úmoder   ÚintÚcontext_bytesN)r   r   r   Ú__annotations__r   r   r3   r   Ú	frozensetr6   r&   r*   r7   r9   r   r   r   r/   r/   6   sD   … àƒKØƒOà&×.Ñ.€Gˆ[Ó.Ù,1À)Ô,LÐ˜>ÓLØ—‘€Dˆ$ÓØ€M�3Ôr   r/   c                  óz   — e Zd ZU ded<   ded<   ded<   dZded<   dZded	<   d
Zded<   dZded<   dZded<   dd„Z	y)ÚBackendr0   Únamer5   ÚcapabilitiesÚsupported_tasksTÚboolÚ	availableÚbudget_allowedé2   r8   Úquality_scoreNzOptional[int]Úmax_context_bytesr   ztuple[tuple[str, int], ...]Útask_qualityc                óT   — | j                   D ]  \  }}||k(  sŒ|c S  | j                  S ©N)rG   rE   )Úselfr2   ÚtaskÚscores       r   Úquality_forzBackend.quality_forN   s6   € Ø×,Ñ,ò 	‰KˆD�%Ø�zÓ!Ø’ð	ð ×!Ñ!Ð!r   )r2   r0   Úreturnr8   )
r   r   r   r:   rB   rC   rE   rF   rG   rM   r   r   r   r=   r=   A   sN   … à
ƒIØ Ó Ø#Ó#Ø€IˆtÓØ€N�DÓØ€M�3ÓØ'+Ð�}Ó+ð 13€LÐ-Ó2ô"r   r=   c                  óP   — e Zd ZU dZded<   d	d„Zd
d„Zedd„«       Zedd„«       Z	y)ÚPrivacyMatrixzAWelche Datenschutzklasse an welches Backend darf (Konfiguration).z.tuple[tuple[str, FrozenSet[PrivacyTier]], ...]Úallowedc                ód   — t        |t        «      sy| j                  D ]  \  }}||k(  sŒ||v c S  y)NF)Ú
isinstancer   rQ   )rJ   Úbackendr#   r>   r    s        r   ÚpermitszPrivacyMatrix.permits[   s<   € Ü˜$¤Ô,ØØŸ<™<ò 	%‰KˆD�%Ø�w‹Ø˜u�}Ò$ð	%ð r   c                óP   — | j                   D ]  \  }}||k(  sŒ|c S  t        «       S rI   )rQ   r;   )rJ   rT   r>   r    s       r   Ú	tiers_forzPrivacyMatrix.tiers_forc   s/   € ØŸ<™<ò 	‰KˆD�%Ø�w‹Ø’ð	ô ‹{Ðr   c           	     ó`   —  | t        t        d„ |j                  «       D «       «      «      «      S )Nc              3  ó<   K  — | ]  \  }}|t        |«      f–— Œ y ­wrI   )r;   )Ú.0r>   r    s      r   ú	<genexpr>z-PrivacyMatrix.from_mapping.<locals>.<genexpr>k   s#   è ø€ ò  
Ù)4¨¨uˆT”9˜UÓ#Ô$ñ 
ùs   ‚)ÚtupleÚsortedÚitems)ÚclsÚmappings     r   Úfrom_mappingzPrivacyMatrix.from_mappingi   s0   € á”5œñ  
Ø8?¿¹»ô 
ó 
ó ó ð 	r   c                óf   — | j                  t        j                  ht        j                  hdœ«      S )z=Altvertrag von route(): nur PUBLIC darf an irgendein Backend.)r(   r)   )ra   r   r   )r_   s    r   ÚstrictzPrivacyMatrix.stricto   s4   € ð ×ÑÜ!×(Ñ(Ð)Ü"×)Ñ)Ð*ñ!
ó ð 	r   N)rT   r0   r#   r   rN   rA   )rT   r0   rN   zFrozenSet[PrivacyTier])r`   z#Mapping[str, Iterable[PrivacyTier]]rN   ú'PrivacyMatrix')rN   rd   )
r   r   r   Ú__doc__r:   rU   rW   Úclassmethodra   rc   r   r   r   rP   rP   U   s=   … áKà;Ó;óóð òó ðð
 òó ñr   rP   c                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y	)
ÚCandidateEvaluationr0   rT   rA   Úeligibleztuple[str, ...]Úreasonsr8   ÚqualityN)r   r   r   r:   r   r   r   rh   rh   x   s   … àƒLØƒNØÓØ„Lr   rh   c                  ó|   — e Zd ZU ded<   ded<   ded<   ded<   dZded	<   d
Zded<   dZded<   dZded<   dZded<   y)ÚRoutingDecisionr0   r1   zOptional[str]rT   rA   rQ   ÚreasonÚ Úcoder   ztuple[CandidateEvaluation, ...]Ú
candidatesFÚ	tie_breakÚmanualNÚfallback_from)	r   r   r   r:   rp   rq   rr   rs   rt   r   r   r   rm   rm   €   sI   … àƒKØÓØƒMØƒKØ€Dˆ#ƒNØ24€JÐ/Ó4Ø€IˆtÓØ€FˆDÓØ#'€M�=Ô'r   rm   ÚSELECTEDÚMANUAL_SELECTEDÚCHECKED_FALLBACKÚPRIVACY_DENIEDÚNO_ELIGIBLE_BACKENDÚMANUAL_CHOICE_NOT_PERMITTEDc                óþ  — g }|j                   t        vr|j                  d«       |j                  |j                   | j                  «      s|j                  d«       |j
                  s|j                  d«       |j                  s|j                  d«       | j                  j                  |j                  «      s|j                  d«       | j                  |j                  vr|j                  d«       |j                  �*| j                  |j                  kD  r|j                  d«       |j                  | j                  «      }||k  r|j                  d«       t        |j                   | t!        |«      |«      S )	NÚUNKNOWN_BACKENDÚPRIVACY_NOT_PERMITTEDÚUNAVAILABLEÚBUDGET_EXHAUSTEDÚCAPABILITY_MISSINGÚTASK_UNSUPPORTEDÚCONTEXT_TOO_LARGEÚQUALITY_BELOW_MINIMUM)r>   ÚKNOWN_BACKENDSÚappendrU   r3   rB   rC   r6   Úissubsetr?   r2   r@   rF   r9   rM   rh   r\   )ÚjobrT   ÚmatrixÚmin_qualityrj   rk   s         r   Ú	_evaluaterŠ   –   s$  € à€GØ‡|�|œ>Ñ)Ø�‰Ð(Ô)Ø�>‰>˜'Ÿ,™,¨¯©Ô4Ø�‰Ð.Ô/Ø×ÒØ�‰�}Ô%Ø×!Ò!Ø�‰Ð)Ô*Ø×$Ñ$×-Ñ-¨g×.BÑ.BÔCØ�‰Ð+Ô,Ø
‡~�~˜W×4Ñ4Ñ4Ø�‰Ð)Ô*Ø× Ñ Ð,°×1BÑ1BÀW×E^ÑE^Ò1^Ø�‰Ð*Ô+Ø×!Ñ! #§.¡.Ó1€GØ�ÒØ�‰Ð.Ô/Ü˜wŸ|™|°¨[¼%À».È'ÓRÐRr   c                ó   — t        | d„ ¬«      S )Nc                óP   — | j                    | j                  dk7  | j                  fS )Nr(   )rk   rT   )Úes    r   ú<lambda>z_rank.<locals>.<lambda>¯   s#   € ¨q¯y©y¨j¸!¿)¹)ÀwÑ:NÐPQ×PYÑPYÐ-Z€ r   )Úkey)r]   )Úevaluationss    r   Ú_rankr‘   ­   s   € ä�+Ñ#ZÔ[Ð[r   NF)r‰   Úmanual_fallbackc               ó†  — |€t         j                  «       }|D �cg c]  }t        | |||«      ‘Œ }}t        |«      }|D �cg c]  }|j                  sŒ|‘Œ }	}| j
                  t        j                  u�rJ| j
                  j                  }
|	D �cg c]  }|j                  |
k(  sŒ|‘Œ }}|r$t        | j                  |
dd|
› d�t        |d¬«      S |D ��cg c]%  }|j                  |
k(  sŒ|j                  D ]  }|‘Œ Œ' }}}|r‚t        |	D �cg c]  }|j                  |
k7  sŒ|‘Œ c}«      }|rW|d   }t        | j                  |j                  dd|j                  › d|
› dd	j                  |«      xs d
› d�t         |d|
¬«      S t        | j                  ddd|
› dd	j                  |«      xs d
› �t"        |d¬«      S |	s]t%        |«      xr t'        d„ |D «       «      }|rt        | j                  dddt(        |«      S t        | j                  dddt*        |«      S t        |	«      }|d   }t-        |«      dkD  xr |d   j.                  |j.                  k(  }t        | j                  |j                  dd|j                  › d�|r|j                  dk(  rdndz   t0        ||¬«      S c c}w c c}w c c}w c c}}w c c}w )u
  WÃ¤hlt ein Backend oder lehnt strukturiert ab.

    matrix=None bedeutet die strikte Altmatrix (nur PUBLIC). Das Gateway
    Ã¼bergibt immer die konfigurierte Matrix.

    Manuelle Wahl Ã¼berstimmt nie eine PrÃ¼fung. Ist das gewÃ¼nschte Backend
    nicht zulÃ¤ssig, wird blockiert. Nur mit manual_fallback=True darf ein
    anderes Backend gewÃ¤hlt werden, und auch dann nur eines, das jede
    einzelne PrÃ¼fung (Datenschutz, VerfÃ¼gbarkeit, Budget, FÃ¤higkeiten,
    KontextgrÃ¶ÃŸe, QualitÃ¤t) selbst bestanden hat.
    NTz	Selected z!: manual choice passed all checks)rs   r   z: checked fallback, z not permitted (z, znot configuredú))rs   rt   FzManual choice z not permitted: c              3  ó8   K  — | ]  }d |j                   v –— Œ y­w)r}   N)rj   )rZ   r�   s     r   r[   zroute.<locals>.<genexpr>à   s   è ø€ ò 1
Ø56Ð# q§y¡yÔ0ñ1
ùs   ‚z2Privacy policy: execution denied for every backendzNo eligible backendr   z: eligible backendr(   z (tie-break codex)ro   )rr   )rP   rc   rŠ   r\   ri   r7   r&   r*   ÚvaluerT   rm   r1   rv   rj   r‘   Újoinrw   rz   rA   Úallrx   ry   Úlenrk   ru   )r‡   Úbackendsrˆ   r‰   r’   Úbr�   rq   r�   ri   ÚwantedÚchosenÚrÚwanted_reasonsÚalternativesÚselectedÚprivacy_onlyÚrankedrr   s                      r   Úrouter¤   ²   sÝ  € ð €~Ü×%Ñ%Ó'ˆØCKÖL¸a”9˜S ! V¨[Õ9ÐL€KÐLÜ�{Ó#€JØ&Ö5�a¨!¯*«*’Ð5€HÐ5à
‡x�x”t—y‘yÒ Ø—‘—‘ˆØ%Ö=˜¨¯©°fÓ)<’!Ð=ˆÐ=ÙÜ"Ø—
‘
˜F DØ˜F˜8Ð#DÐEÜ °Dôð ð
 &1×[ °A·I±IÀÓ4GÐQR×QZÑQZÒ[ÈAš!Ð[˜!Ð[ˆÑ[ÙÜ ¨XÖ!M¨¸¿¹ÀfÓ9L¢!Ò!MÓNˆLÙØ'¨™?�Ü&Ø—J‘J × 0Ñ 0°$Ø × 0Ñ 0Ð1Ð1EÀfÀXð NØŸ	™	 .Ó1ÒEÐ5EÐFÀaðIä$ j¸ÈVô	ð ô Ø�J‰J˜˜eØ˜V˜HÐ$4°T·Y±Y¸~Ó5NÒ5bÐRbÐ4cÐdÜ'¨¸Dô
ð 	
ñ Ü˜KÓ(ò 
¬Sñ 1
Ø:Eô1
ó .
ˆñ Ü"Ø—
‘
˜D %ØDÜ 
óð ô
 ˜sŸz™z¨4°Ð8MÜ2°Jó@ð 	@ô �8‹_€FØ�a‰y€HÜ�F“˜a‘ÒI F¨1¡I×$5Ñ$5¸×9IÑ9IÑ$I€IÜØ�
‰
�H×$Ñ$ dØ
�H×$Ñ$Ð%Ð%7Ð8Ù#,°×1AÑ1AÀWÒ1LÑÐRTñ	Vä�*¨	ô	ð ùò] Mùâ5ùò >ùó \ùâ!Ms5   ›J)ÁJ.ÁJ.ÂJ3Â%J3ÃJ8Ã+J8ÄJ>Ä#J>)r    zIterable[PrivacyTier]rN   r   )
r‡   r/   rT   r=   rˆ   rP   r‰   r8   rN   rh   )r�   úlist[CandidateEvaluation]rN   r¥   rI   )r‡   r/   rš   zlist[Backend]rˆ   zOptional[PrivacyMatrix]r‰   r8   r’   rA   rN   rm   )&re   Ú
__future__r   Údataclassesr   r   Úenumr   Útypingr   r   r	   r
   r0   r   r   r   r   r   r   r$   r&   r;   r„   r/   r=   rP   rh   rm   ru   rv   rw   rx   ry   rz   rŠ   r‘   r¤   r   r   r   ú<module>rª      s‡  ðñ	õ #ç (Ý ß 9Ó 9ô�#�tô ð ×Ñ˜Ø×Ñ˜!Ø×Ñ˜Ø×Ñ˜að	Ð ó3ôˆ3�ô ñ ˜G XÐ.Ó/€ñ �$Ô÷ð ó ðñ �$Ô÷"ð "ó ð"ñ& �$Ô÷ð ó ðñD �$Ô÷ð ó ðñ �$Ô÷	(ð 	(ó ð	(ð €Ø#€Ø%Ð Ø!€Ø+Ð Ø;Ð ðSØðSØ#6óSó.\ð
BØ !¸5ñBØðBØ48ðBØETôBr   