Ë
    lÝ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	 ddl
mZmZmZmZmZ ddlmZmZ dd	lmZmZmZ d
Z G d„ de«      Z ed¬«       G d„ d«      «       Z G d„ dee	«      Z ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       Z G d„ de«      Z ed¬«       G d„ d«      «       Z  G d„ de«      Z!d d„Z"g d¢Z#y)!uÀ  Einheitliche Adapter-Schnittstelle.

Jeder Adapter erbt von BackendAdapter. BackendAdapter.execute() ist final:
1. _prepare(job) erzeugt den Outbound-Schnappschuss, also genau das, was
   gesendet wird (fÃ¼r Claude: Kanal-Parameter; fÃ¼r Codex: stdin + Dateien).
2. Der Digest wird Ã¼ber diesen Schnappschuss NEU berechnet, die
   Datenschutzklasse Ã¼ber den Kontext NEU klassifiziert.
3. ClearanceVerifier.verify() prÃ¼ft HMAC, Backend, Job, Absender, Chat,
   Ablauf, Nonce, Digest, Datenschutzklasse gegen die Matrix.
4. Erst dann _transmit(outbound). Ohne gÃ¼ltige Clearance wird nichts gesendet.

Unterklassen dÃ¼rfen execute()/outbound_digest() nicht definieren
(__init_subclass__ verweigert das).
é    )Úannotations)ÚABCÚabstractmethod)Ú	dataclass)ÚEnum)ÚAnyÚClassVarÚMappingÚOptionalÚfinalé   )ÚAuthorizationErrorÚClearanceVerifier)ÚContextEnvelopeÚcanonical_jsonÚ
sha256_hexs   aria-v3/outbound/v1
c                  ó   — e Zd Zy)ÚAdapterContractErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    ú=/home/aria/aria-v3-dev/python/aria_router/adapter_contract.pyr   r      s   „ Ør   r   T)Úfrozenc                  ó>   — e Zd ZU dZded<   dZded<   dZded<   d	„ Zy
)ÚExecutionPolicyéx   ÚintÚtimeout_secondsr   Úmax_attemptsFÚboolÚallow_side_effectsc                ó¢  — t        | j                  «      t        urt        d«      ‚d| j                  cxk  rdk  st        d«      ‚ t        d«      ‚t        | j                  «      t        urt        d«      ‚| j                  dk7  rt        d«      ‚t        | j
                  «      t        urt        d«      ‚| j
                  rt        d«      ‚y )	NzInvalid timeoutr   i  zTimeout out of rangezInvalid attemptsz1Retries disabled until idempotency is implementedzInvalid side-effect policyz"Side effects disabled in Phase 3.1)Útyper    r   r   r!   r#   r"   ©Úselfs    r   Ú__post_init__zExecutionPolicy.__post_init__&   sÓ   € Ü�×$Ñ$Ó%¬SÑ0Ü&Ð'8Ó9Ð9à�D×(Ñ(Ô0¨DÒ0Ü&Ð'=Ó>Ð>ð 1Ü&Ð'=Ó>Ð>ä�×!Ñ!Ó"¬#Ñ-Ü&Ð'9Ó:Ð:à×Ñ Ò!Ü&ØCóð ô �×'Ñ'Ó(´Ñ4Ü&Ø,óð ð ×"Ò"Ü&Ø4óð ð #r   N)r   r   r   r    Ú__annotations__r!   r#   r(   r   r   r   r   r       s&   … à€O�SÓØ€L�#ÓØ$Ð˜Ó$ór   r   c                  ó   — e Zd ZdZdZdZdZy)ÚResultStatusÚsuccessÚforwardÚfailedÚblockedN)r   r   r   ÚSUCCESSÚFORWARDÚFAILEDÚBLOCKEDr   r   r   r+   r+   @   s   „ Ø€GØ€GØ€FØ�Gr   r+   c                  óv   — 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<   edd„«       Z	y)ÚAdapterResultÚstrÚjob_idÚbackendr+   ÚstatusÚ ÚoutputNúOptional[str]Ú
error_codezOptional[Mapping[str, Any]]r-   Fr"   Ú	timed_outc                óZ   — | j                   t        j                  t        j                  fv S ©N)r9   r+   r0   r1   r&   s    r   r,   zAdapterResult.successQ   s"   € à�{‰{œ|×3Ñ3´\×5IÑ5IÐJÐJÐJr   )Úreturnr"   )
r   r   r   r)   r;   r=   r-   r>   Úpropertyr,   r   r   r   r5   r5   G   sO   … àƒKØƒLØÓØ€FˆCÓØ $€J�Ó$Ø+/€GÐ(Ó/Ø€IˆtÓàòKó ñKr   r5   c                  ót   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	Zd
ed<   d	Zd
ed<    e«       Zded<   y	)Ú
AdapterJobr6   r7   r   ÚenvelopeÚ	sender_idÚchat_idr   Ú
message_idNr<   Úsender_usernameÚtsr   Úpolicy)r   r   r   r)   rI   rJ   r   rK   r   r   r   rD   rD   V   s=   … àƒKØÓØƒNØƒLØƒOØ%)€O�]Ó)Ø€BˆÓÙ-Ó/€FˆOÔ/r   rD   c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ÚAdapterInputErrorc                ó2   •— t         ‰| �  |«       || _        y r@   )ÚsuperÚ__init__Úcode)r'   rQ   Ú	__class__s     €r   rP   zAdapterInputError.__init__c   s   ø€ Ü‰Ñ˜ÔØˆ�	r   )rQ   r6   )r   r   r   rP   Ú__classcell__©rR   s   @r   rM   rM   b   s   ø„ ÷ñ r   rM   c                  ó<   — e Zd ZU dZded<   ded<   dZded<   d
d	„Zy)ÚOutboundz3Schnappschuss genau dessen, was der Adapter sendet.r6   r8   zMapping[str, Any]ÚtransmittedNr   Úpayloadc                óf   — t        t        t        | j                  | j                  dœ«      z   «      S )N)r8   rW   )r   ÚOUTBOUND_DOMAINr   r8   rW   r&   s    r   ÚdigestzOutbound.digestp   s1   € Üœ/¬NØ—|‘|°D×4DÑ4Dñ<
ó -ñ ó ð 	r   )rA   r6   )r   r   r   Ú__doc__r)   rX   r[   r   r   r   rV   rV   h   s   … á=àƒLØ"Ó"Ø€GˆSÓôr   rV   c                  ó¦   ‡ — e Zd ZU dZded<   dZded<   ˆ fd„Zdd„Zedd	„«       Z	e
dd
„«       Ze
dd„«       Zdd„Zedd„«       Zedd„«       Zˆ xZS )ÚBackendAdapterr:   zClassVar[str]ÚnameFzClassVar[bool]Úaccepts_memoryc                ó„   •— t        ‰| �  di |¤Ž dD ]+  }|| j                  v sŒt        | j                  › d|› d�«      ‚ y )N)ÚexecuteÚoutbound_digestÚ__init_subclass__z must not override z()r   )rO   rd   Ú__dict__Ú	TypeErrorr   )ÚclsÚkwargsÚ	protectedrR   s      €r   rd   z BackendAdapter.__init_subclass__z   sM   ø€ Ü‰Ñ!Ñ+ FÒ+ØLò 	SˆIØ˜CŸL™LÒ(Ü 3§<¡< .Ð0CÀIÀ;ÈbÐ QÓRÐRñ	Sr   c                óv   — t        |t        «      st        d«      ‚| j                  st        d«      ‚|| _        y )NzClearanceVerifier requiredzadapter name required)Ú
isinstancer   rf   r_   Ú	_verifier)r'   Úverifiers     r   rP   zBackendAdapter.__init__€   s3   € Ü˜(Ô$5Ô6ÜÐ8Ó9Ð9Ø�yŠyÜÐ3Ó4Ð4Ø!ˆ�r   c                ó   — | j                   S r@   )rl   r&   s    r   rm   zBackendAdapter.verifier‡   s   € à�~‰~Ðr   c                 ó   — y)z/Baut den Outbound-Schnappschuss. Sendet nichts.Nr   ©r'   Újobs     r   Ú_preparezBackendAdapter._prepare‹   ó   � r   c                 ó   — y)uG   Sendet den Schnappschuss. Wird nur nach erfolgreicher PrÃ¼fung gerufen.Nr   )r'   Úoutboundrq   Ú	clearances       r   Ú	_transmitzBackendAdapter._transmit�   rs   r   c                óP   — t        || j                  t        j                  |¬«      S )N©r=   )r5   r_   r+   r3   )r'   r7   rQ   s      r   Ú_blockedzBackendAdapter._blocked“   s   € Ü˜V T§Y¡Y´×0DÑ0DÐQUÔVÐVr   c                ó@   — | j                  |«      j                  «       S r@   )rr   r[   rp   s     r   rc   zBackendAdapter.outbound_digest–   s   € à�}‰}˜SÓ!×(Ñ(Ó*Ð*r   c           	     ó   — t        |t        «      s't        d| j                  t        j
                  d¬«      S t        | dd «      }t        |t        «      s| j                  |j                  d«      S 	 | j                  |«      }t        |t        «      r|j                  | j                  k7  r| j                  |j                  d«      S 	 |j                   j#                  |j$                  «      j&                  }	 |j)                  || j                  |j                  |j+                  «       ||j,                  |j.                  ¬	«      }	 | j3                  |||«      }t        |t        «      rL|j                  |j                  k7  s3|j                  | j                  k7  st        |j6                  t8        «      s1t        |j                  | j                  t        j4                  d¬«      S |j:                  t        j<                  u rK|j6                  j?                  «       s1t        |j                  | j                  t        j4                  d¬«      S |S # t        $ r0}| j                  |j                  |j                  «      cY d }~S d }~wt        $ r | j                  |j                  d«      cY S w xY w# t        $ r | j                  |j                  d«      cY S w xY w# t0        $ r0}| j                  |j                  |j                  «      cY d }~S d }~wt        $ r | j                  |j                  d
«      cY S w xY w# t        $ r4 t        |j                  | j                  t        j4                  d¬«      cY S w xY w)Nr:   ÚINVALID_JOBry   rl   ÚNO_VERIFIERÚPREPARE_FAILEDÚINVALID_OUTBOUNDÚCLASSIFICATION_FAILED)r8   r7   Úcontext_digestÚprivacyrF   rG   ÚVERIFICATION_FAILEDÚADAPTER_EXCEPTIONÚINVALID_ADAPTER_RESULTÚEMPTY_RESPONSE) rk   rD   r5   r_   r+   r3   Úgetattrr   rz   r7   rr   rM   rQ   Ú	ExceptionrV   r8   Ú
classifierÚclassifyrE   ÚtierÚverifyr[   rF   rG   r   rw   r2   r;   r6   r9   r0   Ústrip)	r'   rv   rq   rm   ru   Úexcrƒ   ÚverifiedÚresults	            r   rb   zBackendAdapter.executeš   s§  € ä˜#œzÔ*Ü   T§Y¡Y´×0DÑ0DÐQ^Ô_Ð_Ü˜4 ¨dÓ3ˆÜ˜(Ô$5Ô6Ø—=‘= §¡¨]Ó;Ð;ð	?Ø—}‘} SÓ)ˆHô
 ˜(¤HÔ-°×1AÑ1AÀTÇYÁYÒ1NØ—=‘= §¡Ð-?Ó@Ð@ð	FØ×)Ñ)×2Ñ2°3·<±<Ó@×EÑEˆGð
	DØ—‘Ø 4§9¡9°S·Z±ZØ'Ÿ™Ó0¸'ØŸ-™-°·±ð 'ó ˆHð	mØ—^‘^ H¨c°8Ó<ˆFô ˜6¤=Ô1°V·]±]ÀcÇjÁjÒ5PØ—>‘> T§Y¡YÒ.´jÀÇÁÔPSÔ6TÜ  §¡¨T¯Y©Y¼×8KÑ8KÐXpÔqÐqØ�=‰=œL×0Ñ0Ñ0¸¿¹×9LÑ9LÔ9NÜ  §¡¨T¯Y©Y¼×8KÑ8KÐXhÔiÐiØˆøô= !ò 	7Ø—=‘= §¡¨S¯X©XÓ6Õ6ûÜò 	?Ø—=‘= §¡Ð-=Ó>Ò>ð	?ûô ò 	FØ—=‘= §¡Ð-DÓEÒEð	Fûô "ò 	7Ø—=‘= §¡¨S¯X©XÓ6Õ6ûÜò 	Dà—=‘= §¡Ð-BÓCÒCð	Dûô
 ò 	mÜ  §¡¨T¯Y©Y¼×8KÑ8KÐXkÔlÒlð	músm   Á2I Ã	/J3 Ã9AK ÅM  É	J0É%JÉ?J0Ê(J0Ê/J0Ê3%KËKË	L=Ë'%LÌL=Ì(L=Ì<L=Í :M=Í<M=)rm   r   )rA   r   )rq   rD   rA   rV   )ru   rV   rq   rD   rA   r5   )r7   r6   rQ   r6   rA   r5   )rq   rD   rA   r6   )rq   rD   rA   r5   )r   r   r   r_   r)   r`   rd   rP   rB   rm   r   rr   rw   rz   r   rc   rb   rS   rT   s   @r   r^   r^   v   sŽ   ø… Ø€Dˆ-ÓØ%*€N�NÓ*ôSó"ð òó ðð ò>ó ð>ð òVó ðVóWð ò+ó ð+ð ò&ó ô&r   r^   c                ó"   — | j                  «       S )u<   Kanonische Kontextdarstellung fÃ¼r Outbound-SchnappschÃ¼sse.)Úcanonical_dict)rE   s    r   Útransmitted_contextr”   Ä   s   € à×"Ñ"Ó$Ð$r   )
r   r   r+   r5   rD   rM   rV   r^   r”   r   N)rE   r   rA   Údict)$r\   Ú
__future__r   Úabcr   r   Údataclassesr   Úenumr   Útypingr   r	   r
   r   r   Úauthorizationr   r   Úcontextr   r   r   rZ   Ú
ValueErrorr   r   r6   r+   r5   rD   rM   rV   r^   r”   Ú__all__r   r   r   ú<module>rŸ      sè   ðñõ #ç #Ý !Ý ß :Õ :ç @ß @Ñ @à*€ô	˜:ô 	ñ �$Ô÷ð ó ðô>�3˜ô ñ �$Ô÷Kð Kó ðKñ �$Ô÷0ð 0ó ð0ô˜
ô ñ �$Ô÷
ð 
ó ð
ôK�Sô Kó\%ò
�r   