
    ǅixH                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ  e	 ed	
            Ze	j2                  ZddZd dZd!dZd"dZd#dZd$dZ d%d&dZ!d'dZ"d(dZ#d)dZ$d*dZ%d+dZ&d,dZ'd-dZ(	 	 	 	 	 	 	 	 d.dZ)	 	 	 	 	 	 	 	 d/dZ*	 	 	 	 	 	 	 	 	 	 d0dZ+d1dZ,d2dZ-e.dk(  r e-        yy)3    )annotationsN)datetime	timedeltatimezone)Path)AnyDictListOptional)error)parse)request	   )hoursc                 4    t        j                  t              S N)r   nowTOKYO     (workspace/mission-control/sync_status.py	now_tokyor      s    <<r   c                    | y 	 t        |       }t        j                  |dz  t
              j                         S # t        t        f$ r Y y w xY w)N  )tz)int	TypeError
ValueErrorr   fromtimestampr   	isoformat)valuemss     r   iso_from_msr#      sS    }Z !!"t)6@@BB z" s   < AAc                   | y t        |       j                         j                         }|dv ry t        j                  d|      }|sy t        |j                  d            }|j                  d      }||dz  |dz  |dz  d|   S )	N>    0offnonefalsedisabledz^(\d+)\s*([smhd])$      <   i  iQ )smhd)strstriplowerrematchr   group)rawtextr6   nunits        r   parse_every_to_secondsr<   "   s    
{s8>>!!#D<<HH*D1EEKKNA;;q>DVXY	
  r   c                p    	 t        j                  | j                  d            S # t        $ r |cY S w xY w)Nutf-8encoding)jsonloads	read_text	Exception)pathdefaults     r   	read_jsonrG   5   s5    zz$..'.:;; s   $' 55c                    | j                  d      }|j                  t        j                  |dd      dz   d       |j	                  |        y )Nz	.json.tmpFr,   )ensure_asciiindent
r>   r?   )with_suffix
write_textrA   dumpsreplace)rE   payloadtmps      r   
write_jsonrR   <   sI    


;
'CNN

7q9D@   KKr   c                    t        | t        t        f      rt        |       S t        | t              r	 t        | j	                               S y # t
        $ r Y y w xY wr   )
isinstancer   floatr2   r3   r   )r!   s    r   to_floatrV   E   sS    %#u&U|%	''   		s   A 	AAc                \    | syt               j                         dz  | z
  dz  }||k  rdS dS )Npendingr   i`  online)r   	timestamp)last_msactive_minutesage_minutess      r   status_from_last_msr^   P   s9    ;((*T1G;uDK"n48C)Cr   c                p   i }| j                         s|S | j                  d      D ]  }	 |j                  d      j                         D cg c]  }|j	                         s| }}|sE	 t        j                  |d         }t        |t              so|j                  d      xs |j                  }|j                  |      }|rt        |j                  d      xs d      nd}t        |j                  d      xs d      }	|	|k\  s|||<    |S c c}w # t
        $ r Y w xY w# t
        $ r Y w xY w)Nz*.jsonlr>   r?   jobIdrunAtMsr   )existsglobrC   
splitlinesr3   rD   rA   rB   rT   dictgetstemr   )
runs_dirby_jobfilelnlineseventjob_idprevprev_tscur_tss
             r   load_last_runsrs   W   s0   (*F??i( #	"&..'."B"M"M"O^BSUS[S[S]R^E^ 	JJuRy)E %&7#0tyyzz&!37#dhhy).Q/QUYYy).Q/W"F6N%#& M# _ 		  		s;   "DD"D&D,D(D	D%$D%(	D54D5c                4   t        | i       }t        |t              sg S g }|j                         D ]  \  }}t        |t              s|j	                  |t        |j                  d      xs d      |j                  d      xs |j                  d      xs d|j                  d      xs |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      d        |j                  d d       |S )N	updatedAtr   modelmodelIdunknownmodelProviderprovider	sessionIdinputTokensoutputTokenstotalTokens)keyru   rv   rz   r{   r|   r}   r~   c                &    | j                  dd      S )Nru   r   rg   )xs    r   <lambda>z"collect_sessions.<locals>.<lambda>   s    AEE+q1 r   Tr   reverse)rG   rT   rf   itemsappendr   rg   sort)session_filedatarowsr   items        r   collect_sessionsr   q   s    \2&DdD!	!#DZZ\ 
	T$% +!6!;!<'*Ndhhy.ANY HH_5M*9M!XXk2#xx6 $ 8#xx6		

 	II14I@Kr   c                H    | D ]  } ||      s|j                  d      c S  y )Nru   r   )sessionsmatcherr.   s      r   find_latest_msr      s,     &1:55%%& r   c                ,    t        fd| D              S )Nc              3  4   K   | ]  } |      sd   yw)r+   Nr   ).0r.   r   s     r   	<genexpr>z!count_sessions.<locals>.<genexpr>   s     1Qgajq1s   )sum)r   r   s    `r   count_sessionsr      s    1(111r   c                    t        | t              syd}| D ]A  }t        |t              sdD ])  }||v st        |j	                  |            }|%||z  }+ C |S )N        )cost_usdamountr!   costusd)rT   listrf   rV   rg   )r   totalitr   vals        r   sum_cost_itemsr      sm    eT"E !"d#A 	!Cbyrvvc{+?SLE		!! Lr   c                   t        j                  t              }t        |j                  |j                  dt              }t        j                  |j                  d      |j                  d      dd      }d| }t        j                  || dd	      }	 t        j                  |d
      5 }t        j                  |j                         j                  dd            }|j                  d      }t!        |      }	dt#        |j%                               t'        |	d      dcd d d        S # 1 sw Y   y xY w# t(        j*                  $ r}
|
j                         j                  dd      }d}	 t        j                  |      j                  di       j                  dd      }n# t,        $ r |d d }Y nw xY wd|
j.                  |xs ddcY d }
~
S d }
~
wt,        $ r(}
dd t1        |
      j2                   d|
 dcY d }
~
S d }
~
ww xY w)Nr+   )tzinfoz%Y-%m-%dT%H:%M:%SZ1d)starting_at	ending_atbucket_widthz7https://api.anthropic.com/v1/organizations/cost_report?z
2023-06-01)z	x-api-keyzanthropic-version)headers   )timeoutr>   ignorer   T   )okstatususedUsdMonthr%   r   messagex   Fz
http error)r   r   r   z: )r   r   UTCyearmonthurlparse	urlencodestrftime
urlrequestRequesturlopenrA   rB   readdecoderg   r   r   getcoderoundurlerror	HTTPErrorrD   codetype__name__)	admin_keyr   startparamsurlreqresprP   r   r   ebodydetails                r    fetch_monthly_anthropic_cost_usdr      s   
,,s
CSXXsyy!C8E >>*>?&:; 	
F DF8
LC


"!-
CRQ/ 	4jj!3!3GX!FGG;;v&D"4(Edlln- %eQ		 	 	  Pvvxw1	 ZZ%))'26::9bIF 	 $3ZF	 qvv8N,OO Rta9I9I8J"QC6PQQRss   D; /A6D/%	D; /D84D; 8D; ;H"G15F'&G'F85G7F88GHH H=HHc                   t        | dz  i       }t        |t              r|j                  di       ni }t	        |j                  d            }t	        |j                  d            }t	        |j                  d            }t	        |j                  d            }|dn|}|dn|}d }d }d	}	d
}
d}||}d}	d}d}
|t        d||z
        }nt        j                  dd
      j                         }|j                  d      rkt        |      }|j                  d      r7t	        |j                  d            }d}	||t        d||z
        }d}d}
nd}
nd}	d|j                  dd       }
nd}	d}
d}|||k  rd}n
||k  rd}nd}|dv }d
}|dk(  rd}n|dk(  rd }d!d"||	||d nt        |d#      |d nt        |d#      ||||||
t               j                         d$S )%Nzcredit-config.jsonhaikulowThresholdUsdcriticalThresholdUsdmonthlyBudgetUsdmanualRemainingUsdg      4@g      @unavailabler%   FmanualTu6   credit-config.json の manualRemainingUsd から同期r   ANTHROPIC_ADMIN_API_KEYzsk-ant-adminr   r   z	admin-apiu2   Anthropic Admin API の月次コストから算出uZ   月次コストは取得できたが monthlyBudgetUsd 未設定のため残高算出不可u   Admin API取得失敗: r   rx   zstandard-keyuT   残クレジット同期には ANTHROPIC_ADMIN_API_KEY（sk-ant-admin...）が必要criticallow>   r   r   uC   Haiku: クレジットが危険域。補充をお願いします。uR   Haiku: クレジットが少ないです。補充サポートお願いします。	anthropiczclaude-haiku-4-5-20251001r   )rz   rv   statesource	availableremainingUsdr   r   r   r   helpRequiredhelpMessagenotelastCheckedAt)rG   rT   rf   rg   rV   maxosgetenvr3   
startswithr   r   r   r    )
status_dir
credit_cfg	haiku_cfglow_thresholdcritical_thresholdmonthly_budgetmanual_remaining	remainingusedr   r   r   r   reportr   help_requiredhelp_messages                    r   build_haiku_creditsr      s=   :(<<bAJ/9*d/K
w+QSIY]]+<=>M!)--0F"GHimm,>?@N	.B CD)1D}M 2 :@R!%I DFDI#$		G%sNY67DII7<BBD	/5i@Fzz$

> :;$!-$2B #C$)> ?I $IODwD$0GY1O0PQ#FiDE**E-'EE00ML
\	%k  , ) 1uY7J $%a.*( 2%#"..0 r   c           
        | j                  d      xs i j                  d      xs i }|j                  d      xs i }|j                  d      xs d}t        |j                  d      xs g       }i }t        |d       }dd	|d
t        |d      t	        |d       t        |      |dd	|d<   t        d |D              r7t        |d       }	dddt        |	      t	        |d       t        |	      dd|d<   t        d |D              r7t        |d       }	dddt        |	      t	        |d       t        |	      d d|d!<   |S )"Nagentsdefaultsrv   primaryz#anthropic/claude-haiku-4-5-20251001	fallbacksc                    dt        | j                  dd            j                         v xs | j                  d      dk(  S )Nzclaude-haikurv   r%   r   zagent:main:main)r2   rg   r4   r.   s    r   r   zbuild_agents.<locals>.<lambda>'  s=    .Cgr(:$;$A$A$CC -55<,, r   BrainBenkeizstrategy/decisions/QC   )r\   c                *    d| j                  dd      v S )Nz:run:r   r%   r   r   s    r   r   zbuild_agents.<locals>.<lambda>0  s    WeUWHX=X r   #4CAF50)	namenicknamerv   roler   tasksCompletedlastActivityhaikuCreditscolorbrainc              3  $   K   | ]  }d |v  
 yw)qwen2.5-coderNr   r   fs     r   r   zbuild_agents.<locals>.<genexpr>6  s     
3A?a
3   c                <    dt        | j                  dd            v S Nr	  rv   r%   r2   rg   r   s    r   r   zbuild_agents.<locals>.<lambda>7  s    /SwXZI[E\2\ r   zMuscle (qwen-coder)zollama/qwen2.5-coder:32bzcoding/build-tasksc                <    dt        | j                  dd            v S r  r  r   s    r   r   zbuild_agents.<locals>.<lambda>=  s!    TWXYX]X]^egiXjTkAk r   z#2196F3)r   rv   r  r   r  r  r  muscle_qwen_coderc              3  $   K   | ]  }d |v  
 yw)qwen3.5:35b-a3bNr   r
  s     r   r   zbuild_agents.<locals>.<genexpr>B  s     
5a!
5r  c                <    dt        | j                  dd            v S Nr  rv   r%   r  r   s    r   r   zbuild_agents.<locals>.<lambda>C  s    2Cs155QXZ\K]G^2^ r   zMuscle (qwen3.5)ollama/qwen3.5:35b-a3bzresearch/bulk-opsc                <    dt        | j                  dd            v S r  r  r   s    r   r   zbuild_agents.<locals>.<lambda>I  s"    ARVYZ[Z_Z_`gikZlVmAm r   z#FF9800muscle_qwen35)rg   r   r   r^   r   r#   any)
configr   haiku_creditsr   	model_cfgr   r   r   
brain_lastlasts
             r   build_agentsr    sa   
 **X&,"11*=CHW%+ImmI&O*OGY]];/526I(*F	-J '%jE(3XY#J/%
F7O 
3
33h(\])/()$/,X7kl'-'
"# 
59
55h(^_&-')$/,X7mn'-#
 Mr   c                   | j                  d      xs i j                  d      xs i }|j                  d      xs i }|j                  d      }t        |      }|d u}t               }d }	|r|t        |      z   nd }
|
r|
j	                         nd }|j                  d      xs d}|j                         D ]  }t        |j                  d      xs d	      j                         }d
|v s4t        |j                  d            }	t        |j                  d            }|rt        j                  |      }|
r||
kD  r|}|j                  d      xr8 |j                  d      xr% |j                  d       d|j                  d       xs |} n dd|rd| nd|rdnd|	|||rdnddi}t        |i       }t        |t              r|j                  dg       ng D ]t  }t        |t              st        |j                  d      xs |j                  d      xs d      j                         }|sW|j                  |i       }t        |j                  dd            }|j                  d      xs ||j                  d      xs |j                  d      xs d|rdndt        |j                  d      xs |j                  d            t        |j                  d      xs |j                  d            |j                  d      xr8 |j                  d      xr% |j                  d       d|j                  d       xs d |rdndd||<   w |S ) Nr   r   	heartbeatevery)secondsrv   r  summaryr%   	HEARTBEATrb   nextRunAtMsrz   /zHeartbeat PollzEvery r*   activeinactiver   z#F44336)r   scheduler   lastRunnextRunrv   r  jobsidr   jobenabledTr*  customlastRunAtMs)rg   r<   r   r   r    valuesr2   upperr#   r   fromisoformatrG   rT   rf   r3   bool)r  cron_jobs_fileruns_by_jobr   r!  heartbeat_everyheartbeat_secondsheartbeat_enabledr   heartbeat_lastcomputed_next_dtheartbeat_nextheartbeat_modelrunr$  candidate_nextcandidate_dtr-  	cron_datar/  ro   r0  s                         r   build_cron_jobsrD  Q  s/   
 **X&,"11*=CH[)/RImmG,O.?)5
+CNGXi0ABB^b5E%//14NmmG,H0HO!!# 
cggi(.B/557'!();<N()?@N'55nE#7G(G%3N!ggj1vcggg6FvcggV`NaMbbcdgdkdklsdtcuKv  J  {JO
 	$6G& 12Z"3h%%$"3Y

D ."-I,6y$,Gy}}VR(R 
#t$SWWT]>cggfo>?EEGoofb)swwy$/0GGFO-v
+Kswww/?K8")hz"3779#5#O9OP"377=#9#SSWW]=STWWZ(mSWWW-=mSWWZEXDYYZ[^[b[bcj[kZlBmuqu")Yy
V
" Kr   c                (   t        t               j                         dz        }g }| d d D ]  }t        |j                  d      xs d      }|rt	        d||z
  dz        nd }|j                  |j                  d      |j                  d      |j                  d      t        |      ||j                  d      |j                  d	      d
        g }	t        |j                         d d      d d D ]  \  }
}|	j                  |
|j                  d      |j                  d      |j                  d      |j                  d      t        |j                  d            |j                  d      d        |j                  di       }t               j                         t               j                  d      |j                  d      dk(  |j                  d      |j                  d      |j                  d      |j                  d      d|||	dS )Nr      ru   r   r   rv   rz   r|   r}   )r   rv   rz   ru   ageSecr|   r}   c                L    t        | d   xs i j                  d      xs d      S )Nr+   rb   r   )r   rg   )kvs    r   r   z#build_live_office.<locals>.<lambda>  s#    sBqEKR,,Y7<1= r   Tr      r   r$  rb   
durationMs)ra   r   r$  rv   rz   runAtrK  r!  z%Y-%m-%d %H:%M:%S %Zr(  r*  r+  r,  )r0  r"  rv   r+  r,  )ru   	wallClockr!  r  sessionPulse
recentRuns)r   r   rZ   rg   r   r   r#   sortedr   r    r   )r   	cron_jobsr8  r  now_mspulser.   updatedage_secrunsro   r@  r!  s                r   build_live_officerW    s    &&(4/0FEcr] 
aeeK(-A.8?#a&7*t34TuuU|wEE*-(1! uu]3 !n 5
	

 D= 
r	 

 	''(+779-)GGJ/$SWWY%78!ggl3
	

" k2.I[**,[))*@A }}X.(:]]:.]]7+ }}Y/ }}Y/
 & r   c           
     ~   |dz  }|dz  dz  dz  dz  }|dz  dz  }|dz  dz  }| j                   }t        | i       }t        |t              si }t        |i       }t	        |      }	t        |      }
|j                  d	d
ddddddi       |j                  dg g g d       |j                  dd       t        |      }t        ||	|      }t        |||
      }t        |	||
|      }i |j                  d      xs i t               j                         dddd|d<   ||d<   ||d<   d|i|d<   ||d<   t        | |       y )Nzopenclaw.jsonr   mainr   zsessions.jsoncronz	jobs.jsonrV  kpirecoveryiP r   zin-progressi0  )	targetYen
currentYenpercentageCompleter   monthlyGoal	taskQueue)rX   r(  	completedmissionStatementur   37万円を回収しながら、AIエージェント組織が24/7で価値を生むCactus Empireを構築する。metaz1.2.0zmission-control/sync_status.pyu3   sync_status.py で自動同期（手動編集可）)lastUpdatedversionr   refreshInstructionscronJobsr   credits
liveOffice)parentrG   rT   rf   r   rs   
setdefaultr   r  rD  rW  rg   r   r    rR   )status_path	state_diropenclaw_pathr   r7  ri   r   baser  r   r8  r  r   rQ  live_offices                  r   update_statusrr    s   /Mx'&0:=OL'+5N6!F*H##J["%DdD!}b)F-H *KOO	6RS_l  ~C  D  	E 	OOKR2B!OPOO|
 (
3M&(M:FDI#HimTK88F!r {,,.2TDL DN D.DO$D{D!r   c                    t        j                  d      } | j                  ddd       | j                  dt        dd	
       | j	                         }t        t              j                         j                  dz  }t        t              j                         j                  d   }|j                  r7	 t        ||       t        j                  t        d|j                               6t        ||       y )Nz9Sync Mission Control status.json with live Openclaw state)descriptionz--watch
store_truezRun continuously)actionhelpz
--interval   zWatch interval seconds)r   rF   rw  zstatus.jsonr,      )argparseArgumentParseradd_argumentr   
parse_argsr   __file__resolverk  parentswatchrr  timesleepr   interval)parserargsrm  rn  s       r   rY  rY    s    $$1lmF
	,=OP
3AYZDx.((*11MAKX&&(003Izz+y1JJs1dmm,-  	k9-r   __main__)returnr   )r!   r   r  zOptional[str])r8   r   r  Optional[int])rE   r   rF   r   r  r   )rE   r   rP   Dict[str, Any]r  None)r!   r   r  zOptional[float])Z   )r[   r  r\   r   r  r2   )ri   r   r  Dict[str, Dict[str, Any]])r   r   r  List[Dict[str, Any]])r   r  r  r  )r   r  r  r   )r   r   r  rU   )r   r2   r  r  )r   r   r  r  )r  r  r   r  r  r  r  r  )r  r  r7  r   r8  r  r  r  )
r   r  rQ  r  r8  r  r  r  r  r  )rm  r   rn  r   r  r  )r  r  )/
__future__r   rz  rA   r   r5   r  r   r   r   pathlibr   typingr   r	   r
   r   urllibr   r   r   r   r   r   r   utcr   r   r#   r<   rG   rR   rV   r^   rs   r   r   r   r   r   r   r  rD  rW  rr  rY  r   r   r   r   <module>r     s:   "   	 	  2 2  , , $ $ (#$llC&D402%RPK\55"5 "5 	5p;;; +; 	;|7"7(7 +7 "	7
 7t)"X." zF r   