o
    'u`jÅ2  ã                   @  s*  d Z ddlmZ ddlZddlmZmZ ddlmZ e 	d¡Z
e 	d¡Ze 	d¡Ze 	d¡Zh d	£Zh d
£Zh d£Zh d£Ze 	d¡ZdZedddG dd„ dƒƒZedddG dd„ dƒƒZedddG dd„ dƒƒZedddG dd„ dƒƒZedddG dd„ dƒƒZedddG dd„ dƒƒZdS )z-Typed contracts for platform-compatible apps.é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyz^[a-z][a-z0-9_]{1,63}$z^[a-z][a-z0-9_.]{1,127}$zy^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$>   ÚpublicÚbusinessÚinternalÚ
restrictedÚconfidential>   ÚreadÚ	calculateÚwrite_reversibleÚwrite_irreversible>   ÚlowÚhighÚmediumÚcritical>   ÚneverÚalwaysÚpolicyz^[a-z][a-z0-9_.:-]{1,127}$z1.0T)ÚfrozenÚslotsc                   @  sB   e Zd ZU ded< ded< dZded< dZded< d	Zded
< dS )ÚCredentialFieldÚstrÚnameÚlabelÚsecretÚkindTÚboolÚrequiredÚ Ú	help_textN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r!   © r&   r&   úplatform/apps/contracts.pyr      s   
 r   c                   @  s–   e Zd ZU dZ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	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	Zd
ed< dS )ÚAgentCapabilityContractzGOptional semantic metadata used to expose one capability as an AI tool.Fr   Úexposedr    r   ÚtitleÚsummaryr&   útuple[str, ...]ÚdomainsÚuse_whenÚdo_not_use_whenr   Úrisk_categoryr   Ú
risk_levelr   ÚconfirmationÚrequired_permissionsÚallowed_rolesN)r"   r#   r$   Ú__doc__r)   r%   r*   r+   r-   r.   r/   r0   r1   r2   r3   r4   r&   r&   r&   r'   r(   #   s   
 r(   c                   @  s¢   e Zd ZU ded< ded< eedZded< ee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Zded< dZd	ed< dZded< dZded< dS )ÚActionContractr   Ú
capabilityÚdescription©Údefault_factoryúdict[str, Any]Úinput_schemaÚoutput_schemar&   r,   Úrequired_credentialsFr   Úside_effectsTÚ
idempotenté   ÚintÚtimeout_secondsr   Údata_classificationÚerrorsÚidempotency_key_requiredNzAgentCapabilityContract | NoneÚagent)r"   r#   r$   r%   r   Údictr<   r=   r>   r?   r@   rC   rD   rE   rF   rG   r&   r&   r&   r'   r6   4   s   
 r6   c                   @  s4   e Zd ZU ded< eedZded< dZded< dS )	ÚEventContractr   r   r9   r;   Úschemar    r8   N)r"   r#   r$   r%   r   rH   rJ   r8   r&   r&   r&   r'   rI   D   s   
 rI   c                   @  s–   e Zd ZU dZded< 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< 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S )ÚWordPressPackageContractzCOptional WordPress-side extension distributed for one platform app.r   Ú
package_idÚversionÚsource_directoryÚ
entrypointÚplugin_filer,   Úcapabilitiesz0.2.0Úminimum_bridge_versionz6.0Úminimum_wordpress_versionz8.0Úminimum_php_versionNú
str | NoneÚartifact_nameÚsha256Ú	signatureÚEd25519Úsignature_algorithm)r"   r#   r$   r5   r%   rR   rS   rT   rV   rW   rX   rZ   r&   r&   r&   r'   rK   K   s   
 rK   c                   @  sª   e Zd ZU ded< ded< ded< eZded< dZded< ee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Zded< d"dd„Zd#dd„Zd$d d!„ZdS )%ÚAppManifestr   Úapp_idÚdisplay_nameÚapp_versionÚcontract_versionr    r8   r9   zdict[str, ActionContract]Úactionsr&   ztuple[CredentialField, ...]Úcredentialsr,   Úoutbound_capabilitiesztuple[EventContract, ...]Ú	publishesÚ
subscribesNzWordPressPackageContract | NoneÚwordpress_packageÚreturnú	list[str]c                 C  s6  g }t  | j¡s| d¡ | jtkr| dt› ¡ | j ¡ r$| j ¡ s)| d¡ t	 | j
¡s4| d¡ tƒ }| jD ]%}t  |j¡sK| d|j› ¡ |j|v rY| d|j› ¡ | |j¡ q:tƒ }| j ¡ D ]ì\}}t  |¡sz| d|› ¡ | d¡sˆ| d	|› d
¡ t |j¡s—| d|j› ¡ |j|v r¥| d|j› ¡ | |j¡ t|jƒ| }|rÁ| d	|› dt|ƒ› ¡ d|j  krÌdksÖn | d	|› d¡ |j ¡ sä| d	|› d¡ |jrø|j d¡dkrø| d	|› d¡ |j d¡dkr
| d	|› d¡ |j d¡s| d	|› d¡ |jtvr,| d	|› d|j› ¡ tƒ }|jD ])}	t |	¡sE| d	|› d|	› ¡ |	|v rU| d	|› d|	› ¡ | |	¡ q2|jrq|jsq|j sq| d|› d¡ |j!}
|
rU|
j"rU|
j# ¡ r‡|
j$ ¡ s| d|› d¡ |
j%s| d|› d¡ |
j&t'vr¯| d|› d |
j&› ¡ |
j(t)vrÁ| d|› d!|
j(› ¡ |
j*t+vrÓ| d|› d"|
j*› ¡ |
j&d#v ré|jré| d|› d$|
j&› ¡ |
j& ,d%¡rý|jsý| d&|› d'¡ |jr|
j*d(kr| d&|› d)¡ |
j&d*kr%|
j*d+kr%| d,|› d-¡ |
j-D ]}t. |¡s;| d|› d.|› ¡ q(|
j/D ]}t  |¡sS| d|› d/|› ¡ q@qh| j0D ]"}| 1d0¡\}}}|rrt  |¡rrt |¡sz| d1|› ¡ qYtƒ }| j2D ](}t |j¡s”| d2|j› ¡ |j|v r£| d3|j› ¡ | |j¡ q‚| j3}|r=t  |j4¡s½| d4¡ |j5rÉ|j6rÉ|j7sÎ| d5¡ |j6 8d6¡ 9d6¡d7 › d6|j7› }|j:|krê| d8¡ t	 |j5¡sö| d9¡ t|j;ƒ| }|r
| d:t|ƒ› ¡ |j<|j=|j>f}t?|ƒr!t@|ƒs!| d;¡ |j=r2tA d<|j=¡s2| d=¡ |jBd>kr=| d?¡ d@|vrH| dA¡ ntCdBdC„ | j D¡ D ƒƒ}|js\|jra| dD¡ | jrqdE|vrq| dF¡ |S | jr™tCdGdC„ | j D¡ D ƒƒ}t|j d¡pŠdHƒ}dIdJh E|¡s™| dK¡ |S )LNz;app_id must use lowercase letters, numbers, and underscoreszcontract_version must be z)display_name and description are requiredz(app_version must use semantic versioningzinvalid credential name: zduplicate credential: zinvalid action name: Ú_v1zaction z2 must include its contract suffix, for example _v1zinvalid capability: zduplicate capability: z! references unknown credentials: é   i,  z* timeout must be between 1 and 300 secondsz description is requiredÚtypeÚobjectz% input_schema must describe an objectz& output_schema must describe an objectr   z+ output_schema must declare required fieldsz" has invalid data classification: z has invalid error code: z has duplicate error code: znon-idempotent action z  must require an idempotency keyzagent tool z requires title and summaryz$ requires at least one use_when rulez has invalid risk category: z has invalid risk level: z" has invalid confirmation policy: >   r   r   z" cannot classify a side effect as Úwrite_zagent write tool z must declare side_effectsr   z cannot use confirmation=neverr   r   zirreversible agent tool z! must always require confirmationz" has invalid required permission: z has invalid allowed role: ú:z(invalid outbound capability permission: zinvalid event name: zduplicate event: zWordPress package_id is invalidzHWordPress package version, source_directory, and entrypoint are requiredú/éÿÿÿÿzEWordPress plugin_file must match the package directory and entrypointz6WordPress package version must use semantic versioningz3WordPress package references unknown capabilities: zOWordPress package release metadata must include artifact, sha256, and signaturez[0-9a-f]{64}zAWordPress package sha256 must contain 64 lowercase hex charactersrY   z5WordPress package signature algorithm must be Ed25519úplatform.healthz&platform.health capability is requiredc                 s  ó    | ]
}|j d kr|V  qdS )rp   N©r7   ©Ú.0Úcontractr&   r&   r'   Ú	<genexpr>ð   ó   € 
ÿþz'AppManifest.validate.<locals>.<genexpr>z?platform.health cannot require credentials or have side effectsúplatform.credentials.testz7apps with credentials require platform.credentials.testc                 s  rq   )rx   Nrr   rs   r&   r&   r'   rv   ù   rw   r&   Ú	connectedÚproviderz@platform.credentials.test output requires connected and provider)FÚ
IDENTIFIERÚ	fullmatchr\   Úappendr_   ÚCONTRACT_VERSIONr]   Ústripr8   ÚSEMVERr^   Úsetra   r   Úaddr`   ÚitemsÚendswithÚ
CAPABILITYr7   r>   ÚsortedrC   r<   Úgetr=   rD   ÚDATA_CLASSIFICATIONSrE   Ú
ERROR_CODEr?   r@   rF   rG   r)   r*   r+   r.   r0   ÚAGENT_RISK_CATEGORIESr1   ÚAGENT_RISK_LEVELSr2   ÚAGENT_CONFIRMATION_POLICIESÚ
startswithr3   Ú
PERMISSIONr4   rb   Ú	partitionrc   re   rL   rM   rN   rO   ÚrstripÚsplitrP   rQ   rV   rW   rX   ÚanyÚallÚrerZ   ÚnextÚvaluesÚissubset)ÚselfrE   Úcredential_namesÚ
credentialrQ   Úactionru   ÚmissingÚaction_error_codesÚ
error_coderG   Ú
permissionÚroleÚtargetÚ	separatorr7   Úevent_namesÚeventÚpackageÚexpected_plugin_fileÚunknown_capabilitiesÚrelease_fieldsÚhealth_actionÚtest_actionÚrequired_outputr&   r&   r'   Úvalidatel   s0  









ÿÿ


ÿÿÿÿ
ÿ
ÿ€
€
€


"ÿ
ÿ



ÿ

öÿÿzAppManifest.validater7   rU   c                   s   t ‡ fdd„| j ¡ D ƒd ƒS )Nc                 3  s"    | ]\}}|j ˆ kr|V  qd S )Nrr   )rt   r›   ru   rr   r&   r'   rv     s   €  z4AppManifest.action_for_capability.<locals>.<genexpr>)r•   r`   rƒ   )r˜   r7   r&   rr   r'   Úaction_for_capability  s   þz!AppManifest.action_for_capabilityÚ
target_appr   c                 C  s   |› d|› | j v S )Nrm   )rb   )r˜   r®   r7   r&   r&   r'   Úallows_call
  s   zAppManifest.allows_call)rf   rg   )r7   r   rf   rU   )r®   r   r7   r   rf   r   )r"   r#   r$   r%   r~   r_   r8   r   rH   r`   ra   rb   rc   rd   re   r¬   r­   r¯   r&   r&   r&   r'   r[   ^   s    
 
 
r[   )r5   Ú
__future__r   r”   Údataclassesr   r   Útypingr   Úcompiler{   r…   r€   r‰   rˆ   rŠ   r‹   rŒ   rŽ   r~   r   r(   r6   rI   rK   r[   r&   r&   r&   r'   Ú<module>   s:    

ÿ







