
    s-j&                        d dl mZ d dlZd dl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mZmZmZmZmZmZmZmZ d dlmZ g dZd	 eD             Zd6dZd7dZd8dZd9dZd:dZd;dZd<d$Z d=d-Z!ddd.d>d3Z"d?d5Z#dS )@    )annotationsN)datetime)Any)urlparse)ActionDescriptor
ActionModeAttentionItemDisplayPolicyKpiItemModuleIdModuleSnapshotModuleStatusSensitivitySeveritySourceHealth
SourceTypeutcnow)assert_safe_module_snapshot)
amount_chfcash_value_chftotal_value_chfportfolio_value_chfbalancesaldorevenueexpensezbudget[_\s-]*amountzaccount[_\s-]*nameibantransactioncsvxlsxpdfzdb[_\s-]*pathzruntime[_\s-]*pathlocal_original_pathdrive_web_urltokensecretpasswordapi_keyz/home/agentzfinance\.sqlitec                L    g | ]!}t          j        |t           j                  "S  )recompile
IGNORECASE).0patterns     Y/home/agent/projects/Jarvis/apps/api-gateway/jarvis_gateway/adapters/finance_sanitizer.py
<listcomp>r0   4   s&    ZZZGRZ//ZZZ    url
str | Nonereturnboolc                P    | sdS t          |           }|j        dk    o|j        dv S )NFhttp>   	127.0.0.1	localhost)r   schemehostname)r2   parseds     r/   _is_safe_local_urlr=   7   s4     uc]]F=F"Tv:T'TTr1   payloaddict[str, Any]keysstrbool | Nonec                    |D ]^}|                      |          }t          |t                    r|c S t          |t                    rt	          |dddd          }||c S _d S )Nok	connected	reachablehealthy)get
isinstancer5   dict
_bool_from)r>   r@   keyvaluenesteds        r/   rK   rK   >   sy      C  eT"" 	LLLeT"" 	t[+yQQF!4r1   datetime | Nonec                   dD ]}|                      |          t          t                    r[t          fdt          D                       s;	 t          j                            dd                    c S # t          $ r Y w xY wd S )N)last_success_atlast_successful_sync_atlast_sync_atgenerated_atc              3  B   K   | ]}|                               V  d S N)search)r-   r.   rM   s     r/   	<genexpr>z"_safe_timestamp.<locals>.<genexpr>M   s/      -]-]gnnU.C.C-]-]-]-]-]-]r1   Zz+00:00)	rH   rI   rA   any	_COMPILEDr   fromisoformatreplace
ValueError)r>   rL   rM   s     @r/   _safe_timestampr_   J   s    ]  C  eS!! 	#-]-]-]-]S\-]-]-]*]*] 	-emmC.J.JKKKKK   4s   'A;;
BBrM   r   
int | Nonec                <   t          | t                    rd| cxk    rdk    rn n| S t          | t                    rt          t	          |           d          S t          | t
                    r-dD ]*}t          |                     |                    }||c S +d S )Nr   '  )review_itemsreview_countpending_reviewscount)rI   intlistminlenrJ   _count_valuerH   )rM   rL   founds      r/   rk   rk   U   s    % !u"4"4"4"4"4"4"4"4"4% %3u::t$$$% O 	 	C 300E  !4r1   key_namerg   c                V   t          | t                    rbd}|                                 D ]I\  }}|k    r+t          |t                    rd|cxk    rdk    r	n n||z  }6|t	          |          z  }J|S t          | t
                    rt          fd| D                       S dS )Nr   rb   c              3  8   K   | ]}t          |          V  d S rV   )_sum_key)r-   itemrm   s     r/   rX   z_sum_key.<locals>.<genexpr>l   s-      >>8D(++>>>>>>r1   )rI   rJ   itemsrg   rp   rh   sum)rM   rm   totalrL   rN   s    `   r/   rp   rp   b   s    %  ;;== 	4 	4KCh:fc#:#:qF?R?R?R?Rd?R?R?R?R?R&(333% ?>>>>>>>>>>1r1   provider_payloadc                   t          | t                    rHd | D             }|sd S t          d |D                       rdS t          d |D                       rdS d S t          | t                    rt	          | ddd          S d S )	Nc                    g | ]L}t          |t                    t          |                    d d                                                    MS )status )rI   rJ   rA   rH   lower)r-   rq   s     r/   r0   z'_provider_connected.<locals>.<listcomp>r   sL    oooDXbcgimXnXnoC2..//5577ooor1   c              3     K   | ]}|d v V  	dS )>   rD   readyrG   rE   Nr)   r-   rx   s     r/   rX   z&_provider_connected.<locals>.<genexpr>u   s(      XXVv@@XXXXXXr1   Tc              3     K   | ]}|d v V  	dS )>   errorofflinedegradedNr)   r}   s     r/   rX   z&_provider_connected.<locals>.<genexpr>w   s(      QQfv99QQQQQQr1   FrE   rD   rF   )rI   rh   rZ   rJ   rK   )ru   statusess     r/   _provider_connectedr   p   s    "D)) ooDTooo 	4XXxXXXXX 	4QQQQQQQ 	5t"D)) L*K{KKK4r1   provider_ok
runtime_okaudit_statusr   c                b    |du rt           j        S | du s|dv rt           j        S t           j        S )NF>   r   warning)r   DEGRADED	ATTENTIONOK)r   r   r   s      r/   _status_from_sourcesr      s=    U$$e|/CCC%%?r1   nowr   titlemessageseverityr   deduper	   c                    t          d| t          j        |||t          j        | t          ddt          j        t          j        d ddd          d| 	  	        S )Natt_finance_u   Finance prüfen/financeFlabelhrefmodesensitivityblocked_reasonpreview_requiredconfirm_requiredaudit_requiredzfinance.)	id	module_idr   r   r   r   
created_ataction
dedupe_key)r	   r   FINANCEr   	SENSITIVEr   r   	LINK_ONLY)r   r   r   r   r   s        r/   
_attentionr      sy    "&""")#%#-"" 	
 	
 	
 'f&&%   r1   )legacy_dashboard_urllast_attempt_atrawr   r   r   c                  |rt          |          st          d          |pt                      }t          |                     d          t
                    r|                     d          n|                     di           }t          |                     d          t
                    r|                     d          n|                     di           }t          |                     d          t
                    r|                     d          n|                     di           }t          |                     d          t
                    r|                     d          n|                     d	i           }|}t          |t
                    r|ni }t          |t
                    r|ni }t          |t
                    r|ni }t          |t
                    r|ni }t          |          }	t          |d
dd          }
t          |ddd
          }|
duo|du}|                    d          p+|                    d          p|                    d          pd}t          |          	                                dv r!t          |          	                                nd}t          |          p3t          |d          p#t          |                     d                    pd}t          |          p#t          |          pt          |           p|r|nd }t          |	|
|          }t          dd|d|rt          j        nt          j        t$          j        t(          j        d          t          dd|	rdn|	du rdndd |	rt          j        nt          j        t$          j        t(          j        d          t          d d!|rdndd |rt          j        nt          j        t$          j        t(          j        d"          g}g }|r0|                    t3          |d#d$t          j        d%                     |	du r0|                    t3          |d&d't          j        d                     |d(v r0|                    t3          |d)d*t          j        d+                     |s0|                    t3          |d,d-t          j        d                     t5          d.d/t6          j        t$          j        d ddd0          }|g}|r>|                    t5          d1|t6          j        t$          j        d ddd0                     t;          t<          j        d2|t$          j        t(          j        ||d3|t@          j!        t@          j"        hv rd nd4tG          |d tH          j%        d5d6|d | 7          ||d d8         ||d69          }|&                    d:;          }tO          |           tQ          |           |S )<Nzunsafe legacy dashboard URLproviderzprovider/statusruntimezruntime/statushealthz/healthbudgetzbudget/import-status-auditrF   rD   rG   Frx   import_auditr   >   rD   r   r   review_neededreviewsr   rc   zReview Itemsrr   zCount only; no amounts.)rL   r   rM   unitr   r   display_policy	help_textprovider_connectedzProvider verbundenJaNein	UnbekanntzStatus only.runtime_reachablezRuntime erreichbarzReachability only.u   Review nötigu2   FinanceManager meldet Review-Bedarf ohne Beträge.reviewzProvider degradiertz%Finance Provider ist nicht verbunden.>   r   r   u   Import Audit prüfenz.Import Audit meldet einen sicheren Warnstatus.auditzRuntime offlinez,FinanceManager Runtime ist nicht erreichbar.zOpen Financer   r   zLegacy Finance DashboardFinanceManageri,  finance_source_degradedzfinance-readonly-v1zjarvis.module_snapshot.v1)rF   
latency_mssource_typeversioncontract_versionrQ   last_error_redactedstale   )r   r   rx   r   r   rQ   r   stale_after_secondsdegraded_reasonsource_healthkpisattention_itemslinksprimary_actionr   json)r   ))r=   r^   r   rI   rH   rJ   r   rK   rA   rz   rk   rp   r_   r   r   r   WARNINGSUCCESSr   r   r
   SUMMARYINTERNALERRORappendr   r   r   r   r   r   r   r   r   r   r   r   HTTP_API
model_dump"assert_no_sensitive_finance_outputr   )r   r   r   r   r   r   r   r   ru   r   r   	health_okrF   audit_status_rawr   rd   last_successrx   r   	attentionprimaryr   snapshotr>   s                           r/   sanitize_finance_payloadr      s[    8$67K$L$L 86777

%VXXC&01D1Dd&K&Koswwz"""QTQXQXYjlnQoQoH$.swwy/A/A4$H$Hkcggi   cggVfhjNkNkG",SWWX->->"E"EaSWWX377S\^`KaKaF",SWWX->->"E"EtSWWX377SoqsKtKtF%h55=xx2H#GT22:ggG!&$//7VVRF!&$//7VVRF%&677KG[$	BBJ64K@@I%'BIU,BIzz(++ovzz./I/IoVZZXfMgMgoko478H4I4I4O4O4Q4QUo4o4o3'((..000uyL''u8FO+L+LuP\]`]d]den]o]oPpPputuL"6**~og.F.F~/Z]J^J^~jsc}cfcfy}L!+z<HHFN.SZ  zF  f\emeueu  LT  L\  ju  j  P]  Pe  qJ  	K  	K  	K(0DT_  MUDDoz  D  pD  pDekek  JU  \`  J  k`  ks  k{  k{  PX  P`  ny  nB  S`  Sh  tB  	C  	C  	C'/CS\Kh44bhos  S\  p  G  O  O  bj  bp  ~I  ~R  cp  cx  DX  	Y  	Y  	YD
 &(I MC:npx  qA  CK  L  L  	M  	M  	MeC)>@giqiy  |F  G  G  	H  	H  	H+++C)?Aqs{  tD  FM  N  N  	O  	O  	O HC):<jltlz  }F  G  G  	H  	H  	H^*:K_mx  nC  TX  kp  CH  Y^  _  _  _GIE }%,FMahrh|  KV  K`  qu  HM  `e  v{  |  |  |  	}  	}  	}")$,$ &<?L<R*S S SYr"Y4U_Uh  sH  [v  HT  jn  zC  vC  D  D  D!"1"4  H" !!v!..G&w///(((Or1   Nonec                    t          |           }t          D ]&}|                    |          rt          d          'd S )Nz)finance snapshot contains sensitive value)rA   r[   rW   r^   )r>   textr.   s      r/   r   r      sT    w<<D J J>>$ 	JHIII	JJ Jr1   )r2   r3   r4   r5   )r>   r?   r@   rA   r4   rB   )r>   r?   r4   rO   )rM   r   r4   r`   )rM   r   rm   rA   r4   rg   )ru   r   r4   rB   )r   rB   r   rB   r   rA   r4   r   )r   r   r   rA   r   rA   r   r   r   rA   r4   r	   )r   r?   r   r3   r   rO   r4   r   )r>   r   r4   r   )$
__future__r   r*   r   typingr   urllib.parser   jarvis_gateway.contractsr   r   r	   r
   r   r   r   r   r   r   r   r   r   jarvis_gateway.redactionr   FORBIDDEN_FINANCE_PATTERNSr[   r=   rK   r_   rk   rp   r   r   r   r   r   r)   r1   r/   <module>r      s   " " " " " " 				             ! ! ! ! ! !                              A @ @ @ @ @   6 [Z?YZZZ	U U U U	 	 	 	   
 
 
 
            . Y]  BF < < < < < <~J J J J J Jr1   