
    hjÂ                       d dl mZ d dlmZmZ d dlmZmZ d dlZd dlZd dl	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mZmZmZ  ed          Zd	Z d
Z!dZ"h dZ#dmdZ$dndZ%dndZ&dndZ'dodZ(dpdZ)dqdrd Z*dsd!Z+dtdud&Z,dvd(Z-dwd,Z.dxd.Z/dyd0Z0dzd4Z1d{d5Z2d|d7Z3d}d9Z4d~d<Z5dddAZ6ddBZ7ddGZ8ddHZ9ddIZ:dddLZ;ddOZ<dddRZ=ddTZ>ddXZ?dd\Z@dd]ZAdqdd`ZBddbZCdddZDddeZEddgZFddhZGddlZHdS )    )annotations)datetimetimezone)DecimalInvalidOperationN)Path)Any)CryptoTraderJournalStatusCryptoTraderScorecardCryptoTraderSignalCryptoTraderSnapshotCryptoTraderStatusCryptoTraderStrategyStatusHyperliquidClosedTradeHyperliquidPerformancePointHyperliquidPortfolioSnapshotHyperliquidPositionHyperliquidRiskCheckHyperliquidStrategyPerformanceHyperliquidWarningExplanationTradeApprovalRequestTradeApprovalResponseTradeIntentz2/home/agent/projects/CryptoTradingBot/Crypto_Agent!JARVIS_CRYPTO_TRADER_RUNTIME_ROOT!JARVIS_CRYPTO_TRADER_PROJECT_ROOTJARVIS_FINANCE_RUNTIME_DIR>   rejectapprove
paper_onlyreturnstrc                 b    t          j        t          j                                                  S N)r   nowr   utc	isoformat     /home/agent/.hermes/worktrees/FinanceManager-sprint16-smart-household-inbox-real-data-onboarding-v2/src/jarvis_finance/services/crypto_trader_bridge.py_nowr*   %   s     <%%//111r(   r   c                    t          j        t                    } | r!t          |                                           S t          t          j        t
          t          t                                                                        }|dz  S )Nruntime)osgetenvRUNTIME_ENVr   
expanduserPROJECT_ENVr!   DEFAULT_CRYPTO_TRADER_ROOT)explicitprojects     r)   _runtime_rootr5   )   sj    y%%H +H~~((***29[#.H*I*IJJKKVVXXGYr(   c                 t    t          t          j        t          d                                                    S )Nz)/home/agent/jarvis_runtime/finance-system)r   r-   r.   FINANCE_RUNTIME_ENVr0   r'   r(   r)   _finance_runtime_rootr8   1   s*    	-/Z[[\\ggiiir(   c                 *    t                      dz  dz  S )Ncrypto_traderztrade_approvals.jsonl)r8   r'   r(   r)   _approval_log_pathr;   5   s     ""_47NNNr(   	intent_iddecision
created_atc                    t          j        |  d| d|                     d                                                    d d         }d| S )N|utf-8   z	approval-)hashlibsha256encode	hexdigest)r<   r=   r>   digests       r)   _approval_idrH   9   s[    ^yBB8BBjBBII'RRSS]]__`cac`cdFvr(   rowdict[str, Any]strategy_idcoinc                   d                     t          |                     d          pd          ||t          |                     d          pd          t          |                     d          p|                     d          pd          t          |                     d          pd          g          }dt          j        |                    d	                                                    d d
         z   S )Nr@   	timestamp final_decisionentrypricesignal_scorezintent-rA      )joinr!   getrC   rD   rE   rF   )rI   rK   rL   basiss       r)   _stable_intent_idrX   >   s    HH$$*++())/R00  :CGGG$4$4:;;''-2..	
	 	E w~ell7&;&;<<FFHH"MMMr(   pathPath | Nonedict[str, dict[str, Any]]c                    | pt                      }i }t          |d          D ]3}|                    d          }t          |t                    r|r|||<   4|S )Ni  limitr<   )r;   _tail_jsonlrV   
isinstancer!   )rY   log_path	decisionsrI   r<   s        r)   _load_approval_decisionsrc   L   so    +)++H+-I83/// ' 'GGK((	i%% 	') 	'#&Ii r(   c                    	 t          j        |                     d                    }n$# t          t           j        t
          f$ r i cY S w xY wt          |t                    r|ni S )NrA   encoding)jsonloads	read_textFileNotFoundErrorJSONDecodeErrorOSErrorr`   dict)rY   payloads     r)   
_read_jsonro   V   sm    *T^^W^==>>t3W=   			 $//777R7s   (+ AAP   r^   intlist[dict[str, Any]]c                   |                                  r|dk    rg S 	 |                     dd                                          | d          }n# t          $ r g cY S w xY wg }|D ]l}|                                s	 t          j        |          }n# t
          j        $ r Y >w xY wt          |t                    r|
                    |           m|S )Nr   rA   replacerf   errors)existsri   
splitlinesrl   striprg   rh   rk   r`   rm   append)rY   r^   linesrowslineitems         r)   r_   r_   ^   s   ;;== EQJJ		BBMMOOQVPVPWPWX   			!#D  zz|| 		:d##DD# 	 	 	H	dD!! 	KKKs#   2A A A ?BB&%B&
int | Nonec                    	 t          dt          t          j                                                    |                                 j        z
                      S # t          $ r Y d S w xY w)Nr   )maxrq   r   r$   rN   statst_mtimerl   )rY   s    r)   _age_secondsr   r   sc    1c(,..2244tyy{{7KKLLMMM   tts   AA 
A*)A*rootrn   $dict[str, CryptoTraderJournalStatus]c                (   i }|                     d          }t          |t                    r|ni }|                                D ]\  }}t          |t                    rt	          t          |                     d                    t          |                     d                    t          |                     d          t                    r|                     d          nd t          |                     d          pd                    |t          |          <   dD ]}|                     |          }t          |t                    r|s/t          |          j	        }||v rHt          |          
                                s
| j        |z  nt          |          }	|	                                }
t          |	          }t	          |
t          |
o	|d uo|d	k              ||
r|	                                j        nd          ||<   |S )
Njournalsrw   freshage_seconds
size_bytesr   )rw   r   r   r   )trade_journalsignal_journali  )rV   r`   rm   itemsr
   boolrq   r!   r   nameis_absoluteparentrw   r   r   st_size)r   rn   outraw_objrawr   valuekeyrelrY   rw   ages               r)   _journal_statusr   y   s+   02Ckk*%%G%/%>%>F''BCyy{{  eeT"" 	6EIIh//00599W--..8B599]C[C[]`8a8akEIIm444gkuyy66;!<<	  CD		N 3 
v 
vkk##s## 	3 	Cyy~3;;(,S		(=(=(?(?Nt{S  T#YY4  -V4HqSV^bSbHqgjnqgqCrCr  AD  hn  Qu  QU  QZ  QZ  Q\  Q\  Qd  Qd  tu  v  v  vD		Jr(   r   c                :   t          |t          |                    d                    t          |                    dd                    t          |                    d                    t          |                    d                    t          |                    d          t                    r|                    d          nd t          |                    d          t
                    r|                    d          nd t          |                    d          t
                    r|                    d          nd t          |                    d	          t
                    r|                    d	          nd t          | |          

  
        S )Nrunningr   Tenv_okcmd_okpidruntime_dirr   r   )
rK   r   r   r   r   r   r   r   r   r   )r   r   rV   r`   rq   r!   r   )r   rK   rn   s      r)   _strategy_statusr      sK   %W[[++,,L$7788GKK))**GKK))**",W[[-?-?"E"EOGKK42<W[[=W=WY\2]2]gGKK...cg6@_A]A]_b6c6cmgkk/222im8B7;;O_C`C`be8f8fpw{{#3444lp w//   r(    list[CryptoTraderStrategyStatus]c                    t           dz  dz            }i }dD ]]}|                    |          }t          |t                    r1|                    d |                                D                        ^|sS dz  }t          |                    d                    D ]+}|j        j	        }t          |j                  ddddd	||<   , fd
t          |                                          D             S )Nreportsz v76_paper_supervisor_latest.json)afterbeforec                ^    i | ]*\  }}t          |t                    t          |          |+S r'   )r`   rm   r!   ).0kvs      r)   
<dictcomp>z#_load_processes.<locals>.<dictcomp>   s4    WWW$!Q:aQUCVCVWCFFAWWWr(   experiments*/state.jsonTF)r   r   r   r   r   c                8    g | ]\  }}t          ||          S r'   )r   )r   rK   rn   r   s      r)   
<listcomp>z#_load_processes.<locals>.<listcomp>   s+    mmm=Q['T;88mmmr(   )ro   rV   r`   rm   updater   sortedglobr   r   r!   )r   
supervisorsourcessectionr   r   
state_pathrK   s   `       r)   _load_processesr      s,   D9,/QQRRJ G& Y Yw''eT"" 	YNNWW%++--WWWXXX S]* !1!1.!A!ABB 	S 	SJ$+0K36z7H3I3IY]jo  |A  MR  $S  $SGK  mmmmU[\c\i\i\k\kUlUlmmmmr(   r   r	   r   c                    	 t          t          |                     S # t          t          t          f$ r t          d          cY S w xY w)N0)r   r!   r   	TypeError
ValueErrorr   s    r)   _to_decimalr      sO    s5zz"""i4   s||s    &AAc                `    t          |                     t          d                              S )Nz0.01)r!   quantizer   r   s    r)   
_fmt_moneyr      s"    u~~gfoo..///r(   
str | Nonec                B    | d S t          t          |                     S r#   )r   r   r   s    r)   _optional_moneyr      s"    }tk%(()))r(   list[HyperliquidPosition]c                "
   g }t          | dz                      d                    D ]}t          |          }t          |                    d          t
                    r|                    d          ni }|                    d          }t          |t
                    s|t          |                                          D ]F\  }}t          |t
                    st          |                                          }t          |                    d          p|                    d                    }	t          |                    d          pK|                    d          p6|                    |          p!|                    t          |                              }
t          |                    d	                    }t          |                    d
          pd          
                                }|
r|
n|	}|dk    r|
|	z
  |z  n|	|
z
  |z  }|                    d          }t          |t                    r|nd }|                    t          d!i d|dt          |                    d          p|j        j                  d|                    dd          durdndd
|d|                    d          s|                    d          r7t          |                    d          p|                    d                    nd d|
rt          |
          nd d	|                    d	          "t          |                    d	                    nd d|r!|rt!          t#          ||z                      nd d|
r|	r|rt!          |          nd d|
r6|	r4|r2t!          |t#          |	|z            z  t%          d          z            nd d|                    d          "t          |                    d                    nd d|                    d          "t          |                    d                    nd d|                    d          "t          |                    d                    nd d|                    d          "t          |                    d                    nd d|d|                    d          "t          |                    d                    nd dd            H|S )"Nr   r   	prev_midsopen_positionsrQ   entry_price
mark_pricemarksizesidelongshort
ticks_heldrL   rK   modepaper_tradingTFpaperunknownnotional_usdunrealized_pnl_usdunrealized_pnl_pct100	stop_losstake_profitmfe_pctmae_pct	opened_atstatus
open_paperr'   )r   r   ro   r`   rV   rm   r   r!   upperr   lowerrq   rz   r   r   r   r   absr   )r   	positionsr   statemidsraw_positionsrL   rQ   coin_symbolrR   r   r   r   notional_basis
unrealized	ticks_rawr   s                    r)   _positions_from_stater      sY   +-Id]288HHII & &
:&&)3EIIk4J4JD)Q)QYuyy%%%WY		"233-.. 	!-"5"5"7"788  	  	KD%eT** d))//++K		' 2 2 Neii6N6NOOEuyy66{%))F:K:K{txxXcOdOd{hlhphpqtuyqzqzh{h{||Duyy0011Duyy((2F3399;;D%)4TTuN26'//$,$..PTX\G\J		,//I&0C&@&@JdJ#   $ #EIIm$<$<$V
@Q@V W W W %*IIot$D$DE$Q$QW` 	
 X]W`W`ahWiWi  !Pmrmvmv  xE  nF  nF  !PEIIg$6$6$R%))M:R:R S S S  LP -1:s4yyyd 4999V3D3D3PUYYv..///VZ LZ!l^b!lC0E,F,F!G!G!Ghl BF'b%'bTX'bz*'='='=^b im  (Jqv  (J{  (Jz:EDL@Q@Q3QU\]bUcUc2c'd'd'd  FJ >CYY{=S=S=_c%))K"8"8999ei BG=AYAYAeEIIm$<$< = = =ko :?99M9M9YC		) 4 4555_c :?99M9M9YC		) 4 4555_c  *z  >CYY{=S=S=_c%))K"8"8999ei!" (<#    	B r(   idxr   c                   t          |                     d                    }t          |                     d                    }t          |                     d                    }t          |                     d                    }||z   |z   |z   }|                     d          }t          d| d|                     dd	           d|                     d
d	           d| |                     d          r"t          |                     d                    nd t          |                     d
          pd                                          t          |                     d          p|          t          |                     d          pd          |                     d          s|                     d          r7t          |                     d          p|                     d                    nd |                     d          "t          |                     d                    nd |                     d          "t          |                     d                    nd t          |                     d                    t          |                     d                    |rt          |          nd t          |                     d                    |                     d          "t          |                     d                    nd t          |t                    r|nd |                     dd          durdnd          S )Nentry_fee_usdexit_fee_usdslippage_cost_usdfunding_cost_usdcandles_heldztrade--rN   rO   rL   UNKNOWNrK   r   r   r   filled_sizer   
exit_pricenet_pnl_usdgross_pnl_usdexit_reasonr   TFr   r   )trade_idrN   rL   rK   r   r   r   r   r   r   fees_usdr   r   r   r   )	r   rV   r   r!   r   r   r   r`   rq   )	rI   rK   r   	entry_feeexit_feeslippagefundingfeescandles_raws	            r)   _closed_trade_from_rowr     s   CGGO4455I377>2233H377#67788H#''"45566Gx(*W4D''.))K!^+^^R(@(@^^3776SUCVCV^^Y\^^/2ww{/C/CM#cggk**+++-I..4466..=+>>*F++?BwwvrRURYRYZgRhRhrS:CGGM$:$:;;;nr3677=3I3I3UC..///[_141F1F1R3sww|,,---X\#CGGM$:$:;;%cggo&>&>??%)3D!!!t(1C)D)DEE3677=3I3I3UC..///[_$.{C$@$@J[[d66eCCWW   r(        stats_limittuple[list[HyperliquidClosedTrade], Decimal, int, str | None, list[HyperliquidPerformancePoint], list[HyperliquidStrategyPerformance], Decimal, int, str | None]c                x    g }i }t          | dz                      d                    D ]j  fdt           |          D             }|rId j        j        v pt                     pddk    }|s|| j        j        <   |                    |           k|                    d d	
           |                    dg           dd          }|p	|d d         }t          d |D             t          d                    }	t          |          }
t          d |D                       }|
r<t          t          |          t          |
          z  t          d          z            nd }t          d |D             t          d                    }t          |          }t          d |D                       }|r<t          t          |          t          |          z  t          d          z            nd }g }t          d          }t          |d           D ]~}|t          |                    d                    z  }t          |                    d          pd          }|r1|                    t!          |t          |                               g }t          |                                          D ]9\  }}|dd          }t          d |D             t          d                    }t          |          }t          d |D                       }|r<t          t          |          t          |          z  t          d          z            nd }|rt          |t          |          z            nd }|dk    rdn|rdnd}|dk    rdnd }|                    t%          ||                    d!d                              d"d#          ||t          |          |||$                     ;|                    d% d	
           d& t)          |d |         d'(          D             }||	|
||||||f	S ))Nr   z*/trade_journal.jsonlc                f    g | ]-}|                     d           dk    i |dj        j        i.S )eventexit_strategy_id)rV   r   r   r   rI   rY   s     r)   r   z'_load_closed_trades.<locals>.<listcomp>  sv      R  R  Rsvyv}v}  F  wG  wG  KQ  wQ  wQBCB1ABB  wQ  wQ  wQr(   r]   z.invalid_syntheticr   i:	 c                J    t          |                     d          pd          S NrN   rO   r!   rV   rs    r)   <lambda>z%_load_closed_trades.<locals>.<lambda>      Ck 2 2 8b99 r(   Tr   reverse#candidate_v76_strict_live_candidateid   c              3  Z   K   | ]&}t          |                    d                     V  'dS r   Nr   rV   r   rI   s     r)   	<genexpr>z&_load_closed_trades.<locals>.<genexpr>  s6      QQCK 6 677QQQQQQr(   r   c              3  f   K   | ],}t          |                    d                     dk    (dV  -dS r   r      Nr  r  s     r)   r  z&_load_closed_trades.<locals>.<genexpr>  sA      UUS[9O9O-P-PST-T-Tq-T-T-T-TUUr(   r   c              3  Z   K   | ]&}t          |                    d                     V  'dS r  r  r  s     r)   r  z&_load_closed_trades.<locals>.<genexpr>  s6      OO3;sww}'='=>>OOOOOOr(   c              3  f   K   | ],}t          |                    d                     dk    (dV  -dS r  r  r  s     r)   r  z&_load_closed_trades.<locals>.<genexpr>  sA      SSC;sww}7M7M+N+NQR+R+Ra+R+R+R+RSSr(   c                J    t          |                     d          pd          S r  r  r  s    r)   r  z%_load_closed_trades.<locals>.<lambda>"  s    3quu[7I7I7OR3P3P r(   )r   r   rN   rO   )rN   paper_pnl_usdc              3  Z   K   | ]&}t          |                    d                     V  'dS r  r  r  s     r)   r  z&_load_closed_trades.<locals>.<genexpr>+  s6      II3;sww}5566IIIIIIr(   c              3  f   K   | ],}t          |                    d                     dk    (dV  -dS r  r  r  s     r)   r  z&_load_closed_trades.<locals>.<genexpr>-  sA      [[#;sww}?U?U3V3VYZ3Z3ZA3Z3Z3Z3Z[[r(   
profitableloss_makingno_closed_tradeslast_100_exitssmall_sample
candidate__ )rK   labelclosed_tradeswinrate_pctr   avg_pnl_usdr   notec                *    t          | j                  S r#   )r   r   )cards    r)   r  z%_load_closed_trades.<locals>.<lambda>3  s    T5E)F)F r(   c           
         g | ]M\  }}t          |t          |                    d           p|                    d          pd          |          NS )r  rK   r   )r  r!   rV   )r   r   rI   s      r)   r   z'_load_closed_trades.<locals>.<listcomp>5  ss      f  f  f  yAx{  ~A$S#cggn.E.E.lQ^I_I_.lcl*m*morss  f  f  fr(   r  start)r   r   r_   r   r   r   extendsortrV   sumr   lenr   r   r!   rz   r   r   r   rt   	enumerate)!r   r^   r  r|   by_strategystrategy_rowsis_stale_or_syntheticstrict_rowsheadline_rowsrealizedclosed_countwinswinratelegacy_realizedlegacy_countlegacy_winslegacy_winrateperformance
cumulativerI   tsstrategy_cardsrK   windowpnlnstrategy_winsstrategy_winrateavgr   r2  recentrY   s!                                   @r)   _load_closed_tradesrU    sD   !#D35K},223JKKLL ' ' R  R  R  RkZ^fqNrNrNr  R  R  R 	'$8DK<L$L$tR^_cRdRdRihimsQs!( >0=DK,-KK&&&II994IHHH//"GLLTUUSK-4:MQQ=QQQSZ[^S_S_``H}%%LUUMUUUUUDVblj'$--',*?*??75>>QRRRhlGOO$OOOQXY\Q]Q]^^Ot99LSS4SSSSSKdpzZ!5!58M8M!MQXY^Q_Q_ _```vzN57KJm)P)PQQQ p pk#''-"8"8999
%%+,, 	p:RWablWmWmnnnooo;=N&,[->->-@-@&A&A 	M 	M"]tuu%II&III7SV<<XXKK[[[[[[[abl:w}'='=

'JgV[nn&\]]]hl./9jwqzz)***T!$qq.XmmFX#$88<\g\o\op|  A  ]B  ]B  ]J  ]J  KN  PS  ]T  ]T  de  sC  Q[  \_  Q`  Q`  nq  z@  GK  L  L  L  	M  	M  	M  	MFFPTUUU f  f  EN  OS  TZ  UZ  TZ  O[  cd  Ee  Ee  Ee  f  f  fF8\7KQ`bnp~~~r(   c                2   t          | dz  dz            }t          |                    d          t                    r|                    d          ni }t          |                    d          t                    r|                    d          ni }||dS )Nr   z!hl_reconcile_watchdog_latest.json	reconcilewatchdogrW  rX  )ro   r`   rV   rm   )r   rn   rW  rX  s       r)   _load_reconcilerZ  9  s    	),OOPPG,6w{{;7O7OQU,V,V^K(((\^I*4W[[5L5Ld*S*S[w{{:&&&Y[H"999r(   	processesreconcile_payloadkill_switch_statuslist[HyperliquidRiskCheck]c           	     j   t          |                    d          t                    r|                    d          ni }t          |                    d          t                    r|                    d          ni }g }|                    t	          dd|dk    rdnd|                     t          |                    d	          p|                    d	          pd
          }|                    t	          dd|dk    rdnd|                     t          t          |                    d          p|                    d          pd                    }|                    t	          dd|dk    rdndd|                      t          d |                    dg           D                       }	|                    t	          dd|	rdnd|	rdnd                     |rt          d |D                       nd}
|                    t	          dd|
rdnd|
rdnd                     |S )NrW  rX  kill_switchzKill Switchactivecriticalok)r   r.  r   detailr   r   	Reconcilewarningstops_missing_countr   stopszStop Orderszmissing=c              3  l   K   | ]/}t          |t                    d |                                v V  0dS )data_qualityN)r`   r!   r   )r   rf  s     r)   r  z_risk_checks.<locals>.<genexpr>I  s\        A  A7gqry{~gg  A^w}}6  A  A  A  A  A  Ar(   warningsrj  zAPI/Data Qualityc              3  $   K   | ]}|j         V  d S r#   r   r   ps     r)   r  z_risk_checks.<locals>.<genexpr>K  s$      44QAL444444r(   Texecution_modezExecution Moder   non_paper_process_detected)
r`   rV   rm   rz   r   r!   rq   r   anyall)r   r[  r\  r]  rW  rX  checks
rec_statusstops_missing
dq_warning	all_papers              r)   _risk_checksry  @  s*   6@ARAVAVWbAcAcei6j6jr!%%k222prI4>?P?T?TU_?`?`bf4g4go $$Z000moH)+F
MM&=dv  {C  eC  eCV`V`  IM  Vh  i  i  i  j  j  jY]]8,,SX0F0FS)TTJ
MM&;kZdhlZlZlRVRVr{  EO  P  P  P  Q  Q  QIMM2G$H$H$tHLLYnLoLo$tstuuvvM
MM&7-XeijXjXjPTPTpz  D^  O\  D^  D^  _  _  _  `  `  `  A  AimmT^`bFcFc  A  A  A  A  AJ
MM&>ASis\}\e\ey}  T^  Gh  GP  GP  dh  i  i  i  j  j  j8AK44)444444tI
MM&+;CSdm\}\`\`s}  W`  GB  GS  GS  fB  C  C  C  D  D  DMr(   c                    t          |                     d          pd          }|                     d          du sd|v sd|v rdS |                    d          s|                     d	          rd
S dS )NrP   rO   would_enterTpaper_openedenteredBUYblockedblock_reasonHOLDWATCH)r!   rV   
startswith)rI   finals     r)   _signal_labelr  P  s    ())/R00E
ww}%%5)@)@IQVDVDVu	"" cggn&=&= v7r(   c                @   |                      d          }t          |t                    r)|r'd                    d |d d         D                       S |                      d          }|rt	          |          S |                      d          }t	          |pd          S )Nr  , c              3  4   K   | ]}t          |          V  d S r#   r!   )r   r  s     r)   r  z!_signal_reason.<locals>.<genexpr>\  s(      55AQ555555r(      rP   
setup_typezNo actionable setup)rV   r`   listrU   r!   )rI   reasonsr  setups       r)   _signal_reasonr  Y  s    ggn%%G'4   6W 6yy55!555555GG$%%E 5zzGGL!!Eu--...r(   (   list[CryptoTraderSignal]c                   g }t          | dz                      d                    D ]2|                    fdt          d          D                        3|                    d d           g }t          |d |         d	
          D ]I\  }}t          |                    d          p|                    d                    }|                    t          d| d|                    dd           d|                    dd           |                    d          r"t          |                    d                    nd t          |                    d          pd                                          t          |                    d          p|                    d          pd          t          |          |                    d          s|                    d          r7t          |                    d          p|                    d                    nd |                    d          r"t          |                    d                    nd t          |          dt          |                    d          p|                    d                    v rdndd|                    d          du rdndd|sd nd !                     K|S )"Nr   */signal_journal.jsonlc              3  <   K   | ]}i |d j         j        iV  dS r  Nr   r   r  s     r)   r  z _load_signals.<locals>.<genexpr>g  8      ee#=s=NDK,<==eeeeeer(   rT   r]   c                J    t          |                     d          pd          S r  r  r  s    r)   r  z_load_signals.<locals>.<lambda>h  r  r(   Tr  r  r6  live_order_allowedmainnet_signed_actionzsignal-r   rN   rO   rL   r   rK   r  r   rS   expected_move_vs_costrP   swing
short_termr   data_quality_allowedrc  rf  not_requestedF)	signal_idrN   rL   rK   signal
confidencerP   reason_summaryhorizonr   rj  approval_statusexecution_allowed)r   r   r8  r_   r9  r<  r   rV   rz   r   r!   r   r  r  )r   r^   r|   r   r   rI   	live_flagrY   s          @r)   _load_signalsr  d  s   !#D},223KLLMM f feeeeUYacIdIdIdeeeeeeeII994IHHH$&Cd6E6l!444 
 
S!566Z#''BY:Z:Z[[	

ZCZZ#''+r*B*BZZSWWVUWEXEXZZ7:ww{7K7KU#cggk22333QU5I66<<>> 6 6 ^#''.:Q:Q ^U^__$S))_b_f_fgu_v_v  ez}  {B  {B  CZ  {[  {[  e3sww~66Z#''BY:Z:Z[[[  aeADIYAZAZds377+;#<#<===`d-c22#*c#''-2H2H2cCGGTbLcLc.d.d#d#djv!%(WW-C%D%D%L%LTTR[ //8"C%%e  	
 	
 	
 	
" Jr(   approval_decisionsr   c                   t          |                     d          p|                     d          pd          }t          |                     d          pd                                          }t          | ||          }|                    |i           }t          |                    d          pd          }dd	d
d                    |d          }g }|                     d          }	t	          |	t
                    r>|	                    d          }
t	          |
t                    rd |
d d         D             }ddg}|                     d          dur|                    d           |                    |           t          ||                     d          r"t          |                     d                    nd ||dt          |           |                     d          s|                     d          r7t          |                     d          p|                     d                    nd t          |           |                     d          r"t          |                     d                    nd |sdnd|d|          S )NrK   r  r   rL   r   r=   rO   approved_pending_trader_gaterejectedpaper_only_approved)r   r   r   awaiting_approvalrisk_gate_resultr  c                ,    g | ]}t          |          S r'   r  )r   reasons     r)   r   z-_trade_intent_from_signal.<locals>.<listcomp>  s    FFFFCKKFFFr(   r  #dashboard_approval_does_not_execute crypto_trader_must_recheck_gatesr  Tdata_quality_not_greenrN   r   rS   r  proposeddecision_recordedF)r<   r>   rK   rL   r   r  r  entry_contextr  r   r  r  rk  )r!   rV   r   rX   r`   rm   r  rz   r8  r   r  r  )rI   r  rK   rL   r<   approvalr=   r  risk_reasons	risk_gateraw_reasonsrk  s               r)   _trade_intent_from_signalr    s   cggm,,T0G0GT9UUKswwv+),,2244D!#{D99I!%%i44H8<<
++1r22H"@Jf{||  A  A  BJ  L_  `  `OL*++I)T"" GmmI..k4(( 	GFFk"1"oFFFL57YZH
ww%&&d220111OOL!!!030D0DN3sww{++,,,$S!!WZW^W^_mWnWn  ]ruryry  {R  sS  sS  ]3sww~..R#'':Q2R2RSSS  Y]$S))GJwwOfGgGgqc#''*A"B"BCCCmq!)Bzz/B'   r(   rT   list[TradeIntent]c                  	 g }t          | dz                      d                    D ]2	|                    	fdt          	d          D                        3d |D             }|                    d d	           t                      }t                      }g }|D ]`}t          ||          }|j        |v r|	                    |j                   |
                    |           t          |          |k    r na|S )
Nr   r  c              3  <   K   | ]}i |d j         j        iV  dS r  r  r  s     r)   r  z&_load_trade_intents.<locals>.<genexpr>  r  r(   <   r]   c                    g | ]g}|                     d           du sLdt          |                     d          pd          v s&dt          |                     d          pd          v e|hS )r{  Tr|  rP   rO   paper_entered)rV   r!   r  s     r)   r   z'_load_trade_intents.<locals>.<listcomp>  s       77=!!T))^s377K[C\C\Cb`b?c?c-c-cgvz}  B  F  F  GW  X  X  ^  \^  {_  {_  h_  h_ 	 h_  h_  h_r(   c                J    t          |                     d          pd          S r  r  r  s    r)   r  z%_load_trade_intents.<locals>.<lambda>  s    c!%%*<*<*B&C&C r(   Tr  )r   r   r8  r_   r9  rc   setr  r<   addrz   r;  )
r   r^   r|   candidate_rows	approvalsseenintentsrI   intentrY   s
            @r)   _load_trade_intentsr    s:   !#D},223KLLMM f feeeeUYacIdIdIdeeeeeee   N
 CCTRRR(**IUUD!#G  *3	::t##!"""vw<<5  E !Nr(   8tuple[list[CryptoTraderScorecard], list[str], list[str]]c                    | dz  dz  }|                                 sg g dgfS 	 |                    dd                                          }n# t          $ r	 g g dgfcY S w xY wg }g }d |d d	         D             }|D ]}d
|v rg }d|v r9d |                    dd          d                             d          D             }|                    t          d|rdndd|d d         dt          |dd          t          |dd          t          |dd                               d|v rd|v rg }d|v r9d |                    dd          d                             d          D             }|                    t          ddd|d d         dt          |dd          t          |dd                               d|v r+d |                                v r|                    d!           d"|v rd#|v r|                    d$           |||fS )%Nr   z"hyperliquid_daily_report_latest.mddaily_report_missingrA   rt   ru   daily_report_unreadablec                :    g | ]}|                                 |S r'   )ry   )r   r}   s     r)   r   z+_parse_daily_scorecards.<locals>.<listcomp>  s%    ;;;djjll;t;;;r(   #   zLifecycle Scorecardzblocker=c                    g | ]?}|                                 |                    d           +|                                 @S zlive=ry   r  r   bs     r)   r   z+_parse_daily_scorecards.<locals>.<listcomp>  k      C  C  C!Z[ZaZaZcZc  Clmlxlx  zA  mB  mB  CAGGII  C  C  Cr(   r  ,zv76 Lifecycle Scorecardr  	candidater      Fznet_pnl=z USDCzwinrate=%zpf=)titler   r   blockerslive_allowedr   r0  profit_factorzPromotion Gateszstatus=c                    g | ]?}|                                 |                    d           +|                                 @S r  r  r  s     r)   r   z+_parse_daily_scorecards.<locals>.<listcomp>  r  r(   )r  r   r   r  r  r   r0  zAPI/Data Quality:rf  api_data_quality_warningre  znicht sauberreconcile_not_clean)	rw   ri   rx   rl   splitrz   r   _extract_afterr   )r   rY   r{   
scorecardsrk  excerptr}   r  s           r)   _parse_daily_scorecardsr    s   )BBD;;== 02.///3	BBMMOO 3 3 321222223.0JH;;crc
;;;G 3 3 D((HT!! C  Ctzz*a/H/H/K/Q/QRU/V/V  C  C  C3:Siq  ]C\e\e  xC  JV  ai  jl  kl  jl  am  |A  O]  ^b  dn  pw  Ox  Ox  FT  UY  [e  gj  Fk  Fk  {I  JN  PU  WZ  {[  {[  \  \  \  ]  ]  ]$$d):):HT!! C  Ctzz*a/H/H/K/Q/QRU/V/V  C  C  C3:KT`gs  G  HJ  IJ  HJ  K  Z_  m{  |@  BL  NU  mV  mV  dr  sw  yC  EH  dI  dI  J  J  J  K  K  K$&&9

+D+DOO6777$>T#9#9OO1222w((s   )A A! A!textprefixsuffixc                   || vrd S |                      |d          d         }||v r.|                     |d          d                                         S |                     dd          d                                         S )Nr  r   r  )r  ry   )r  r  r  tails       r)   r  r    s}    Tt::fa  #D~~zz&!$$Q'--///::c1a &&(((r(   rk  	list[str]#list[HyperliquidWarningExplanation]c           
        t          |                    d          t                    r|                    d          ni }t          |                    d          t                    r|                    d          ni }d |                    dg           D             d |                    dg           D             z   }g }d| v r'|                    t	          dddd	d
                     d| v s|r\d                    t          t          |                              pd}|                    t	          dddd| dd                     |S )NrW  rX  c                V    g | ]&}t          |t                    t          |          'S r'   r`   r!   r   r~   s     r)   r   z)_warning_explanations.<locals>.<listcomp>  s.    XXXD*TSVBWBWXc$iiXXXr(   alertsc                V    g | ]&}t          |t                    t          |          'S r'   r  r  s     r)   r   z)_warning_explanations.<locals>.<listcomp>  se      \h  \h  \hjn  R\  ]a  cf  Rg  Rg  \h\_`d\e\e  \h  \h  \hr(   r  rf  u)   API/Data Quality nicht vollständig grünu   Der Tagesbericht markiert die Marktdaten-/API-Qualität als warning. Das blockiert aktuell keine neuen Entries, macht Signale aber weniger belastbar.uZ   Als Watch behandeln; keine Live-Erhöhung, bis der nächste Tagesbericht wieder grün ist.)r   severityr  explanationactionr  r  z'Reconcile im Tagesbericht nicht sauber.z'Reconcile/Journal nicht komplett sauberzGEs gibt Abgleich-Hinweise zwischen lokalem Journal und Exchange-State: zA. Der aktuelle Exchange-Reconcile kann trotzdem status=ok melden.z\Kein Live-Auto. Paper weiter beobachten; lokale Phantom-/Altpositionen im Trader bereinigen.)r`   rV   rm   rz   r   rU   r   r  )rk  r\  rW  rX  r  r   rd  s          r)   _warning_explanationsr    s   6@ARAVAVWbAcAcei6j6jr!%%k222prI4>?P?T?TU_?`?`bf4g4go $$Z000moHXXHLL2$>$>XXX  \h  \hr{rr  AI  KM  sN  sN  \h  \h  \h  hF/1C!X--

05OZc  lW  e|  Ea  b  b  b  	c  	c  	c((F(6#f++..//\3\

05JU^  gP  ^q  hn  ^q  ^q  ^q  zX  Y  Y  Y  	Z  	Z  	ZJr(   c                ^    | dz  | dz  | dz  dz  g}t          d |D                       rdndS )NKILL_SWITCHr`  configc              3  >   K   | ]}|                                 V  d S r#   )rw   rn  s     r)   r  z&_kill_switch_status.<locals>.<genexpr>  s*      ::!188::::::::r(   ra  inactive)rr  )r   
candidatess     r)   _kill_switch_statusr    sH    &}(<dXoP]>]^J::z:::::J88
Jr(   runtime_rootr   c                   | pt                      }g }|                                s|                    d           |                                rt          |          ng }|                                rt	          |          ng }|                                rt          |          ng }|                                rt          |          ng }|                                rt          |          ng g g f\  }}}	|                    |	           t          d |D                       r|                    d           |                                rt          |          nd}
|                                rt          |          ni i d}g t          d          dd g g t          d          dd f	}|                                rt          |          n|\	  }}}}}}}}}t          |                    d          t                     r|                    d          ni }t          |                    d	          t                     r|                    d	          ni }d
}|s|s|rdnd}t#          d |D             t          d                    }t#          d |D             t          d                    }t%          d/i d|d|d|
d|d|d|                                rt'          ||||
          ng d|d|dt)          ||          dt+          |          dt+          |          dt+          |          d|d|dt+          |          d|d|d |                    d           "t-          |                    d                     nd d!|                    d"          "t-          |                    d"                    nd d#|                    d#          |                    d#          7t-          |                    d#          p|                    d#                    nd d$t/          t1          t          |                    d%          t2                    r$t5          |                    d%          pg           n|                    d$          pd                    d&t/          t1          |                    d&          p|                    d&          pd                    d't-          |                    d(          p|                    d(          pd          }t7          |                                rd)nd*t-          |          d+t9                      ||d,|t5          |          t5          |          t5          |          t;          t=          |                    -          }t?          ||||||.          S )0Nruntime_root_missingc              3  &   K   | ]}|j          V  d S r#   rm  rn  s     r)   r  z/build_crypto_trader_snapshot.<locals>.<genexpr>  s'      
/
/q|
/
/
/
/
/
/r(   unexpected_non_paper_processr   rY  r   r   rW  rX  Fr   offline_or_no_runtimec              3  >   K   | ]}t          |j                  V  d S r#   )r   r   rn  s     r)   r  z/build_crypto_trader_snapshot.<locals>.<genexpr>  s,      CCAK//CCCCCCr(   c              3  >   K   | ]}t          |j                  V  d S r#   )r   r   rn  s     r)   r  z/build_crypto_trader_snapshot.<locals>.<genexpr>  s-      KKAk!"677KKKKKKr(   r   r  r]  r   recent_closed_tradesrisk_checksperformance_pointsstrategy_performancewarning_explanationsexposure_notional_usdr   realized_pnl_usdclosed_trades_countr0  $experimental_legacy_realized_pnl_usd'experimental_legacy_closed_trades_countexperimental_legacy_winrate_pct	free_usdcequity_usdcequitymargin_usage_pctopen_orders_countopen_ordersrg  reconcile_statusr   rc  missing_runtimez(CryptoTradingBot runtime read-only fileszRead-only bridge: no orders, no signing, no config mutation. Dashboard may approve intents later; CryptoTrader must re-check gates.)bridge_statusr   sourcegenerated_atr   r  safety_summaryr[  open_positions_countsignals_countscorecards_countrk  )r   	portfoliosignalstrade_intentsr  daily_report_excerptr'   ) r5   rw   rz   r   r   r  r  r  r8  rr  r  rZ  r   rU  r`   rV   rm   r:  r   ry  r  r   r!   rq   r   r  r;  r   r*   r   r  r   )r   r   rk  r[  r   r#  r$  r  r  report_warningsr`  r\  default_closedrecent_tradesrealized_pnlrC  rE  r
  r  
legacy_pnlrG  rI  rW  rX  r  r   exposurer   r"  r   s                                 r)   build_crypto_trader_snapshotr,    s   *=??DH;;== 0.///)->%%%BI/3{{}}D%d+++"I%)[[]]:mD!!!G15F'---BMLPKKMM+k+B4+H+H+H`bdfhj_k(JOOO$$$

/
/Y
/
/
/// 86777/3{{}}K%d+++)K15e---RTbdDeDe'#,,4Rq$ON ko  kv  kv  kx  kx  NL  Na  bf  Ng  Ng  Ng  ~L  KM<w8JL`blnz  }K6@ARAVAVWbAcAcei6j6jr!%%k222prI4>?P?T?TU_?`?`bf4g4go $$Z000moHL$YY9Y<<BYDCCCCCWS\\RRHKKKKKWUX\\ZZJ,   T!\ '; !y	
 +] VZU`U`UbUbjLy2C[QQQhj .- 21 38=NOOO )222 &j111 $L111 )L G .8
-C-C-C  1=!" )7#$ 6?]];5O5O5[#immK00111ae%& 5>MM(4K4K4WC	h//000]a'( hqgtgt  vH  hI  hI  hU  Ya  Ye  Ye  fx  Yy  Yy  YEY]]+=>>b(,,OaBbBbccc  KO)* kU_`i`m`mn{`|`|  C  VD  VD  +p#immM.J.J.Pb*Q*Q*Q  JR  JV  JV  Wj  Jk  Jk  Jp  op  q  q  r  r  r+,  IMM:O,P,P,|T\T`T`avTwTw,|{| } }~~~-. Y]]844[X8N8N[R[\\\/I2  "kkmmBdd1BYY9VV! ] ^^'llZH&&  F  vGcp  ~H  _f  g  g  g  gr(   r   c                 (    t                      j        S r#   )r,  r   r'   r(   r)   get_crypto_trader_statusr.  3  s    '))00r(   r   c                 (    t                      j        S r#   )r,  r"  r'   r(   r)   get_hyperliquid_portfolior0  7  s    '))33r(   c                 (    t                      j        S r#   )r,  r#  r'   r(   r)   get_crypto_trader_signalsr2  ;  s    '))11r(   list[CryptoTraderScorecard]c                 (    t                      j        S r#   )r,  r  r'   r(   r)   get_crypto_trader_scorecardsr5  ?  s    '))44r(   c                 (    t                      j        S r#   )r,  r$  r'   r(   r)   get_trade_intentsr7  C  s    '))77r(   requestr   r   c                   | j                                                                         }|t          vrt	          dd| j        |d          S | j        st	          dd| j        |d          S d t                      D             }|                    | j                  }|t	          dd	| j        |d
          S t                      }t          | j        ||          }t                      }|j                            dd           || j        || j        ||j        |j        |j        |j        |j        |j        |j        ddd}|                    dd          5 }|                    t1          j        |dd          dz              d d d            n# 1 swxY w Y   t	          d|| j        |ddt5          |                    S )Nr  zinvalid-decisionu>   Ungültige Entscheidung. Erlaubt: approve, reject, paper_only.)r   approval_idr<   r=   messagepreviewzpreview-onlyuq   Preview: Noch nicht gespeichert. confirm=true senden, um die Entscheidung zu auditieren. Keine Order-Ausführung.c                    i | ]
}|j         |S r'   )r<   )r   r  s     r)   r   z)record_trade_approval.<locals>.<dictcomp>Y  s    JJJFvJJJr(   zunknown-intentz\TradeIntent nicht in der aktuellen read-only Queue gefunden; keine Entscheidung gespeichert.T)parentsexist_okFz^FinanceManager approval audit only; CryptoTrader must re-check all gates before any execution.)r:  r<   r=   r2  r>   portfolio_idsource_enginerK   rL   r   r  intent_created_atr  boundaryarA   re   )ensure_ascii	sort_keys
recordedua   Entscheidung auditiert. Keine Order ausgeführt; CryptoTrader muss Gates später separat prüfen.)r   r:  r<   r=   r;  r  
audit_path)r=   ry   r   VALID_APPROVAL_DECISIONSr   r<   confirmr7  rV   r*   rH   r;   r   mkdirr2  r@  rA  rK   rL   r   r  r>   openwriterg   dumpsr!   )	r8  r=   r  r  r>   r:  rY   rn   fhs	            r)   record_trade_approvalrQ  G  sW   %%''--//H///$*'T
 
 
 	
 ? 
$&' H
 
 
 	
 KJ6G6I6IJJJG[[*++F~$('r
 
 
 	
 Jw0(JGGKDKdT222"& +-)-#."t G  
3	)	) QR
G%4HHH4OPPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q #st99   s   .FFF)r    r!   )r    r   )r<   r!   r=   r!   r>   r!   r    r!   )rI   rJ   rK   r!   rL   r!   r    r!   r#   )rY   rZ   r    r[   )rY   r   r    rJ   )rp   )rY   r   r^   rq   r    rr   )rY   r   r    r   )r   r   rn   rJ   r    r   )r   r   rK   r!   rn   rJ   r    r   )r   r   r    r   )r   r	   r    r   )r   r   r    r!   )r   r	   r    r   )r   r   r    r   )rI   rJ   rK   r!   r   rq   r    r   )r  r  )r   r   r^   rq   r  rq   r    r  )r   r   r    rJ   )
r   r   r[  r   r\  rJ   r]  r!   r    r^  )rI   rJ   r    r!   )r  )r   r   r^   rq   r    r  )rI   rJ   r  r[   r    r   )rT   )r   r   r^   rq   r    r  )r   r   r    r  )r  r!   r  r!   r  r!   r    r   )rk  r  r\  rJ   r    r  )r   r   r    r!   )r   rZ   r    r   )r    r   )r    r   )r    r  )r    r3  )r    r  )r8  r   r    r   )I
__future__r   r   r   decimalr   r   rC   rg   r-   pathlibr   typingr	   (jarvis_finance.api.schemas.crypto_traderr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r/   r1   r7   rJ  r*   r5   r8   r;   rH   rX   rc   ro   r_   r   r   r   r   r   r   r   r   r  rU  rZ  ry  r  r  r  r  r  r  r  r  r  r,  r.  r0  r2  r5  r7  rQ  r'   r(   r)   <module>rW     s   " " " " " " ' ' ' ' ' ' ' ' - - - - - - - -   				                                               & "T"VWW 112 >>> 2 2 2 2   j j j jO O O O       
N N N N    8 8 8 8    (      4   n n n n   0 0 0 0* * * *) ) ) )X   4. . . . .b: : : :       / / / /    8   D    0) ) ) ):) ) ) )
 
 
 
K K K K
>g >g >g >g >gB1 1 1 14 4 4 42 2 2 25 5 5 58 8 8 8: : : : : :r(   