§
    ‰ÁjÍB  ã                   óþ  — U d dl 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 d dlmZmZ d dlmZ d dlmZmZ d dlmZmZ  G d	„ d
ee¦  «        Zej        j        dej        j        dej        j        diZe	eef         ed<   ej        j        dej        j        dej        j        diZ e	eef         ed<   e G d„ d¦  «        ¦   «         Z! edd¬¦  «         G d„ d¦  «        ¦   «         Z" G d„ d¦  «        Z#dS )é    N)ÚEnum)ÚPath)ÚDictÚOptionalÚAny)Ú	dataclassÚfield)ÚServerEngineLoop)ÚAgentDecisionCoreÚTacticalStance)ÚLLMProviderConfigÚLLMProviderTypec                   ó   — e Zd ZdZdZdZdS )ÚAgentOrbTierÚitem_agent_orb_tier1Úitem_agent_orb_tier2Úitem_agent_orb_tier3N)Ú__name__Ú
__module__Ú__qualname__ÚTIER_1ÚTIER_2ÚTIER_3© ó    ú7C:\Projects\FreeExile\server\world\agent_orb_service.pyr   r      s   € € € € € Ø#€FØ#€FØ#€F€F€Fr   r   ç      ¼@g      Ü@g     õ@ÚORB_DURATIONSu)   Chiáº¿n Há»“n Táº¿ Cá»‘t - SÆ¡ Cáº¥p (2H)u+   Chiáº¿n Há»“n Táº¿ Cá»‘t - Trung Cáº¥p (8H)u#   Hung Ma Táº¿ Cá»‘t - VÃ´ Song (24H)Ú	ORB_NAMESc                   óþ   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   e	ed	<   d
Z
eed<   dZeed<   dZeed<   dZeed<   dZeed<    ee¬¦  «        Zeeef         ed<   dZeed<   dZeed<   dS )ÚDelegationSessionÚ
session_idÚ	player_idÚorb_idÚstart_timestamp_secÚtotal_duration_secÚremaining_duration_secÚstanceÚ
llm_configÚdecision_coreTÚ	is_activeFÚ
is_offlineÚ
is_expiredr   Ú
exp_gainedÚmonsters_slain)Údefault_factoryÚspirit_stones_lootedÚpotions_consumedg        Úactual_active_time_secN)r   r   r   ÚstrÚ__annotations__ÚintÚfloatr   r   r   r+   Úboolr,   r-   r.   r/   r	   Údictr1   r   r2   r3   r   r   r   r!   r!      s  € € € € € € à€O€O�OØ€N€N�NØ€K€K�KØÐÐÑØÐÐÑØ!Ð!Ð!Ñ!ØÐÐÑØ!Ð!Ð!Ñ!Ø$Ð$Ð$Ñ$Ø€IˆtÐÐÑØ€J�ÐÐÑØ€J�ÐÐÑà€J�ÐÐÑØ€N�CÐÐÑØ+0¨5ÀÐ+FÑ+FÔ+FÐ˜$˜s C˜xœ.ÐFÐFÑFØÐ�cÐÐÑØ$'Ð˜EÐ'Ð'Ñ'Ð'Ð'r   r!   T)ÚslotsÚfrozenc                   óˆ   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eeef         ed<   eed<   eed	<   d
Zeed<   dS )ÚDelegationHarvestReportr"   r#   r&   r3   r.   r/   r1   r2   Úreclaimed_timestampÚ Úhmac_signatureN)	r   r   r   r4   r5   r6   r7   r   r@   r   r   r   r=   r=   4   s�   € € € € € € à€O€O�OØ€N€N�NØÐÐÑØ!Ð!Ð!Ñ!Ø€O€O�OØÐÐÑØ˜s C˜xœ.Ð(Ð(Ñ(ØÐÐÑØÐÐÑØ€N�CÐÐÑÐÐr   r=   c                   óp  — e Zd Zd#dee         deddfd„Zd„ Zd„ Zd	e	fd
„Z
d$dedededdfd„Zdedeeef         fd„Zdededededee	         f
d„Zdededefd„Zdedee	         fd„Zdededdfd„Zd$dedededdfd„Zd%dededdfd„Zd$dededdfd„Zdeddfd„Zdedee         fd „Zd!edefd"„ZdS )&ÚAgentOrbServiceNúdata/agent_delegations.dbÚengineÚdb_pathÚreturnc                 ó˜  — || _         |dk    rœt          |¦  «                             ¦   «         s{t          t          ¦  «                             ¦   «         j        j        j        }t          ||z  ¦  «        | _        t          | j        ¦  «        j                             dd¬¦  «         n|| _        t          j
        | j        d¬¦  «        | _        t          j        | j        _        | j                             d¦  «         | j                             d¦  «         |                      ¦   «          i | _        |                      ¦   «          d S )Nz:memory:T)ÚparentsÚexist_okF)Úcheck_same_threadzPRAGMA journal_mode=WAL;zPRAGMA synchronous=NORMAL;)rD   r   Úis_absoluteÚ__file__ÚresolveÚparentr4   rE   ÚmkdirÚsqlite3ÚconnectÚconnÚRowÚrow_factoryÚexecuteÚ_init_dbÚactive_sessionsÚ_load_active_sessions)ÚselfrD   rE   Úbase_dirs       r   Ú__init__zAgentOrbService.__init__C   s  € ØˆŒØ�jÒ Ð ­¨g©¬×)BÒ)BÑ)DÔ)DÐ Ý�H‘~”~×-Ò-Ñ/Ô/Ô6Ô=ÔDˆHÝ˜x¨'Ñ1Ñ2Ô2ˆDŒLÝ�”ÑÔÔ%×+Ò+°DÀ4Ð+ÑHÔHÐHÐHà"ˆDŒLå”O D¤LÀEÐJÑJÔJˆŒ	Ý '¤ˆŒ	ÔØŒ	×ÒÐ4Ñ5Ô5Ð5ØŒ	×ÒÐ6Ñ7Ô7Ð7Ø�Š‰Œˆà=?ˆÔà×"Ò"Ñ$Ô$Ð$Ð$Ð$r   c                 óâ   — | j         5  | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nz÷
                CREATE TABLE IF NOT EXISTS inventories (
                    player_id INTEGER,
                    orb_id TEXT,
                    count INTEGER,
                    PRIMARY KEY (player_id, orb_id)
                )
            aÿ  
                CREATE TABLE IF NOT EXISTS active_sessions (
                    player_id INTEGER PRIMARY KEY,
                    session_id TEXT,
                    orb_id TEXT,
                    start_timestamp_sec REAL,
                    total_duration_sec REAL,
                    remaining_duration_sec REAL,
                    stance TEXT,
                    llm_config TEXT,
                    is_active INTEGER,
                    is_offline INTEGER,
                    is_expired INTEGER,
                    exp_gained INTEGER,
                    monsters_slain INTEGER,
                    spirit_stones_looted TEXT,
                    potions_consumed INTEGER,
                    actual_active_time_sec REAL
                )
            zÛ
                CREATE TABLE IF NOT EXISTS completed_reports (
                    session_id TEXT PRIMARY KEY,
                    player_id INTEGER,
                    report_json TEXT
                )
            )rR   rU   )rY   s    r   rV   zAgentOrbService._init_dbV   sÏ   € ØŒYð #	ð #	ØŒI×Òð ñ ô ð ð ŒI×Òð ñ ô ð ð( ŒI×Òð ñ ô ð ð;#	ð #	ð #	ñ #	ô #	ð #	ð #	ð #	ð #	ð #	ð #	ð #	øøøð #	ð #	ð #	ð #	ð #	ð #	s   ˆAA$Á$A(Á+A(c           
      óš  — | j                              ¦   «         }|                     d¦  «         |                     ¦   «         D �]†}t	          j        |d         ¦  «        }t          t          |d         ¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        ¬	¦  «        }t          |d
         ¦  «        }t          |d         ||¬¦  «        }t          di d|d         “d|d         “d|d         “d|d         “d|d         “d|d         “d
|“d|“d|“dt          |d         ¦  «        “dt          |d         ¦  «        “dt          |d         ¦  «        “d|d         “d|d         “dt	          j        |d         ¦  «        “d|d         “d|d         “Ž}|| j        |d         <   �Œˆd S )Nz1SELECT * FROM active_sessions WHERE is_active = 1r)   ÚproviderÚmodelr?   Úapi_keyÚtemperaturegffffffæ?©r^   r_   r`   ra   r(   r#   ©r#   Úprovider_configr(   r"   r$   r%   r&   r'   r*   r+   r,   r-   r.   r/   r1   r2   r3   r   )rR   ÚcursorrU   ÚfetchallÚjsonÚloadsr   r   Úgetr   r   r!   r8   rW   )rY   ÚcurÚrowÚllm_conf_dictr)   r(   r*   Úsesss           r   rX   z%AgentOrbService._load_active_sessions|   s`  € ØŒi×ÒÑ Ô ˆØ�ŠÐGÑHÔHÐHØ—<’<‘>”>ð #	:ñ #	:ˆCÝ œJ s¨<Ô'8Ñ9Ô9ˆMÝ*Ý(¨°zÔ)BÑCÔCØ#×'Ò'¨°Ñ4Ô4Ø%×)Ò)¨)°RÑ8Ô8Ø)×-Ò-¨m¸SÑAÔAð	ñ ô ˆJõ $ C¨¤MÑ2Ô2ˆFå-Ø˜kÔ*Ø *Øðñ ô ˆMõ %ð ð ð Ø˜|Ô,Ð,ðà˜kÔ*Ð*ðð ˜8”}�}ðð %(Ð(=Ô$>Ð$>ð	ð
 $'Ð';Ô#<Ð#<ðð (+Ð+CÔ'DÐ'Dðð �vðð &˜:ðð ,˜mðõ ˜s ;Ô/Ñ0Ô0Ð0ðõ    LÔ 1Ñ2Ô2Ð2ðõ    LÔ 1Ñ2Ô2Ð2ðð ˜|Ô,Ð,ðð  #Ð#3Ô4Ð4ðõ &*¤Z°Ð4JÔ0KÑ%LÔ%LÐ%Lðð  "%Ð%7Ô!8Ð!8ð!ð" (+Ð+CÔ'DÐ'Dð#ˆDð& 6:ˆDÔ   [Ô!1Ñ2Ñ2ðG#	:ð #	:r   Úsessionc                 ó:  — | j         5  |j        j        j        |j        j        |j        j        |j        j        dœ}| j                              d|j        |j	        |j
        |j        |j        |j        |j        j        t          j        |¦  «        t#          |j        ¦  «        t#          |j        ¦  «        t#          |j        ¦  «        |j        |j        t          j        |j        ¦  «        |j        |j        f¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nrb   a´  
                INSERT OR REPLACE INTO active_sessions 
                (player_id, session_id, orb_id, start_timestamp_sec, total_duration_sec, remaining_duration_sec,
                 stance, llm_config, is_active, is_offline, is_expired, exp_gained, monsters_slain, 
                 spirit_stones_looted, potions_consumed, actual_active_time_sec)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            )rR   r)   r^   Úvaluer_   r`   ra   rU   r#   r"   r$   r%   r&   r'   r(   rg   Údumpsr6   r+   r,   r-   r.   r/   r1   r2   r3   )rY   rn   Úllm_dicts      r   Ú_save_sessionzAgentOrbService._save_session¤   sJ  € ØŒYð 	ð 	à#Ô.Ô7Ô=Ø Ô+Ô1Ø"Ô-Ô5Ø&Ô1Ô=ð	ð ˆHð ŒI×Òð ð Ô! 7Ô#5°w´~ÀwÔGbØÔ*¨GÔ,JÈGÌNÔL`Ý”
˜8Ñ$Ô$¥c¨'Ô*;Ñ&<Ô&<½cÀ'ÔBTÑ>UÔ>UÕWZÐ[bÔ[mÑWnÔWnØÔ" GÔ$:½D¼JÀwÔGcÑ<dÔ<dØÔ(¨'Ô*Hðñô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆC;DÄDÄDé   r#   r$   Úcountc                 ó$  — | j         5  | j                              ¦   «         }|                     d||f¦  «         |                     ¦   «         }|r|d         nd}||z   }|                     d|||f¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nz@SELECT count FROM inventories WHERE player_id = ? AND orb_id = ?ru   r   zNINSERT OR REPLACE INTO inventories (player_id, orb_id, count) VALUES (?, ?, ?))rR   re   rU   Úfetchone)rY   r#   r$   ru   rj   rk   ÚcurrentÚ	new_counts           r   Úgrant_agent_orbzAgentOrbService.grant_agent_orbº   s	  € ØŒYð 	Jð 	JØ”)×"Ò"Ñ$Ô$ˆCØ�KŠKÐZÐ]fÐhnÐ\oÑpÔpÐpØ—,’,‘.”.ˆCØ&)Ð0�c˜'”l�l¨qˆGØ %™ˆIØ�KŠKÐhÐktÐv|ð  Hð  kIñ  Jô  Jð  Jð	Jð 	Jð 	Jñ 	Jô 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jøøøð 	Jð 	Jð 	Jð 	Jð 	Jð 	Js   ˆA0BÂB	ÂB	c                 óž   — | j                              ¦   «         }|                     d|f¦  «         d„ |                     ¦   «         D ¦   «         S )Nz9SELECT orb_id, count FROM inventories WHERE player_id = ?c                 ó,   — i | ]}|d          |d         “ŒS )r$   ru   r   )Ú.0rk   s     r   ú
<dictcomp>z:AgentOrbService.get_player_orb_balance.<locals>.<dictcomp>Æ   s"   € ÐFÐFÐF°��H”˜s 7œ|ÐFÐFÐFr   )rR   re   rU   rf   )rY   r#   rj   s      r   Úget_player_orb_balancez&AgentOrbService.get_player_orb_balanceÃ   sJ   € ØŒi×ÒÑ Ô ˆØ�ŠÐOÐR[ÐQ]Ñ^Ô^Ð^ØFÐF°s·|²|±~´~ÐFÑFÔFÐFr   r(   r)   c                 óB  — |                       |¦  «        }|                     |d¦  «        }|dk    rd S | j        5  | j                             d||f¦  «         d d d ¦  «         n# 1 swxY w Y   t                               |d¦  «        }t          j        ¦   «         }d|› dt          |¦  «        › dt          j        ¦   «         j	        d d…         › �}	t          |||¬¦  «        }
t          |	||||||||
dd	¬
¦  «        }|| j        |<   |                      |¦  «         |S )Nr   úKUPDATE inventories SET count = count - 1 WHERE player_id = ? AND orb_id = ?r   Údel_Ú_é   rc   TF)r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   )r   ri   rR   rU   r   Útimer6   ÚuuidÚuuid4Úhexr   r!   rW   rs   )rY   r#   r$   r(   r)   ÚbalancesÚbalanceÚdurationÚnowr"   r*   rn   s               r   Úactivate_delegationz#AgentOrbService.activate_delegationÈ   s¦  € ð ×.Ò.¨yÑ9Ô9ˆØ—,’,˜v qÑ)Ô)ˆØ�aŠ<ˆ<Ø�4àŒYð 	Bð 	BØŒI×ÒÐkÐnwÐyð  nAñ  Bô  Bð  Bð	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bõ !×$Ò$ V¨VÑ4Ô4ˆÝŒi‰kŒkˆØI˜IÐIÐI­¨C©¬ÐIÐIµ4´:±<´<Ô3CÀBÀQÀBÔ3GÐIÐIˆ
å)ØØ&Øð
ñ 
ô 
ˆõ $Ø!ØØØ #Ø'Ø#+ØØ!Ø'ØØð
ñ 
ô 
ˆð +2ˆÔ˜YÑ'Ø×Ò˜7Ñ#Ô#Ð#Øˆs   »A%Á%A)Á,A)c                 óÎ  — | j                              |¦  «        }|r|j        sdS |                      |¦  «        }|                     |d¦  «        }|dk    rdS | j        5  | j                             d||f¦  «         d d d ¦  «         n# 1 swxY w Y   t                               |d¦  «        }|xj        |z  c_        |xj        |z  c_        |  	                    |¦  «         dS )NFr   r�   r   T)
rW   ri   r+   r   rR   rU   r   r&   r'   rs   )rY   r#   r$   rn   r‰   rŠ   Úextra_durations          r   Úextend_delegationz!AgentOrbService.extend_delegationó   sV  € ØÔ&×*Ò*¨9Ñ5Ô5ˆØð 	˜gÔ/ð 	Ø�5à×.Ò.¨yÑ9Ô9ˆØ—,’,˜v qÑ)Ô)ˆØ�aŠ<ˆ<Ø�5àŒYð 	Bð 	BØŒI×ÒÐkÐnwÐyð  nAñ  Bô  Bð  Bð	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bõ '×*Ò*¨6°6Ñ:Ô:ˆØÐ"Ô" nÑ4Ð"Ô"ØÐ&Ô&¨.Ñ8Ð&Ô&Ø×Ò˜7Ñ#Ô#Ð#Øˆts   Á B
Â
BÂBc                 óP   — | j                              |¦  «        }|r	|j        r|S d S ©N)rW   ri   r+   )rY   r#   rn   s      r   Úget_active_sessionz"AgentOrbService.get_active_session  s4   € ØÔ&×*Ò*¨9Ñ5Ô5ˆØð 	�wÔ(ð 	ØˆNØˆtr   r,   c                 óŒ   — | j                              |¦  «        }|r%|j        r ||_        |                      |¦  «         d S d S d S r’   )rW   ri   r+   r,   rs   )rY   r#   r,   rn   s       r   Úset_player_offline_statez(AgentOrbService.set_player_offline_state  s`   € ØÔ&×*Ò*¨9Ñ5Ô5ˆØð 	(�wÔ(ð 	(Ø!+ˆGÔØ×Ò˜wÑ'Ô'Ð'Ð'Ð'ð	(ð 	(ð 	(ð 	(r   Úitem_idc                 óÎ   — | j                              |¦  «        }|rF|j        rA|j                             |d¦  «        }||z   |j        |<   |                      |¦  «         d S d S d S )Nr   )rW   ri   r+   r1   rs   )rY   r#   r–   ru   rn   rx   s         r   Úrecord_loot_harvestz#AgentOrbService.record_loot_harvest  s�   € ØÔ&×*Ò*¨9Ñ5Ô5ˆØð 	(�wÔ(ð 	(ØÔ2×6Ò6°wÀÑBÔBˆGØ4;¸e±OˆGÔ(¨Ñ1Ø×Ò˜wÑ'Ô'Ð'Ð'Ð'ð	(ð 	(ð 	(ð 	(r   éd   Úexpc                 ó¾   — | j                              |¦  «        }|r>|j        r9|xj        dz  c_        |xj        |z  c_        |                      |¦  «         d S d S d S )Nrt   )rW   ri   r+   r/   r.   rs   )rY   r#   rš   rn   s       r   Úrecord_monster_slainz$AgentOrbService.record_monster_slain  s€   € ØÔ&×*Ò*¨9Ñ5Ô5ˆØð 	(�wÔ(ð 	(ØÐ"Ô" aÑ'Ð"Ô"ØÐÔ #Ñ%ÐÔØ×Ò˜wÑ'Ô'Ð'Ð'Ð'ð	(ð 	(ð 	(ð 	(r   c                 óž   — | j                              |¦  «        }|r.|j        r)|xj        |z  c_        |                      |¦  «         d S d S d S r’   )rW   ri   r+   r2   rs   )rY   r#   ru   rn   s       r   Úrecord_potion_consumedz&AgentOrbService.record_potion_consumed   sl   € ØÔ&×*Ò*¨9Ñ5Ô5ˆØð 	(�wÔ(ð 	(ØÐ$Ô$¨Ñ-Ð$Ô$Ø×Ò˜wÑ'Ô'Ð'Ð'Ð'ð	(ð 	(ð 	(ð 	(r   Údtc                 ó¤  — g }t          | j                             ¦   «         ¦  «        D �]Z\  }}|j        sŒ|xj        |z  c_        |xj        |z  c_        |                     |¦  «         |j        dk    rd|_        d|_        d|_        Œd| j        rï|j	         
                    | j        ¦  «        }|j	        j        }|j	                             |¦  «        }|j	                             || j        |¬¦  «         |j	        j        }||k    rv	 dd lm}	 |	                     ¦   «         }
|
j        rA|
                     d||j        |t)          t+          j        ¦   «         dz  ¦  «        dœ¦  «         �ŒI# t,          $ r Y �ŒVw xY w�Œ\|rI| j        5  d„ |D ¦   «         }| j                             d	|¦  «         d d d ¦  «         d S # 1 swxY w Y   d S d S )
Nr   FT)rŸ   zagent-thought-streamiè  )Útyper#   r"   ÚthoughtÚ	timestampc                 óÖ   — g | ]f}|j         |j        t          |j        ¦  «        t          |j        ¦  «        |j        |j        t          j        |j	        ¦  «        |j
        |j        f	‘ŒgS r   )r'   r3   r6   r+   r-   r.   r/   rg   rq   r1   r2   r"   )r}   rn   s     r   ú
<listcomp>z-AgentOrbService.step_tick.<locals>.<listcomp>P  s‹   € ð ð ð ð  ð	  Ô6¸Ô8VÕX[Ð\cÔ\mÑXnÔXnÕpsÐt{ô  uGñ  qHô  qHØÔ*¨GÔ,BÅDÄJÈwÔOkÑDlÔDlÐnuô  oGØÔ*ððð ð r   a@  
                    UPDATE active_sessions 
                    SET remaining_duration_sec = ?, actual_active_time_sec = ?, is_active = ?, is_expired = ?,
                        exp_gained = ?, monsters_slain = ?, spirit_stones_looted = ?, potions_consumed = ?
                    WHERE session_id = ?
                )ÚlistrW   Úitemsr+   r'   r3   Úappendr-   rD   r*   Úbuild_perceptionÚlast_thoughtÚevaluate_tick_actionÚdispatch_plan_to_serverÚgateway.ws_gateway_bridgeÚws_gateway_bridgeÚget_bridge_instanceÚ
is_runningÚbroadcast_jsonr"   r6   r…   ÚImportErrorrR   Úexecutemany)rY   rŸ   Údirty_sessionsr#   rn   Ú
perceptionÚold_thoughtÚplanÚnew_thoughtÚ
ws_gatewayÚbridgeÚupdate_datas               r   Ú	step_tickzAgentOrbService.step_tick&  sƒ  € ØˆÝ"& tÔ';×'AÒ'AÑ'CÔ'CÑ"DÔ"Dð #	ñ #	ÑˆI�wØÔ$ð ØàÐ*Ô*¨bÑ0Ð*Ô*ØÐ*Ô*¨bÑ0Ð*Ô*Ø×!Ò! 'Ñ*Ô*Ð*àÔ-°Ò2Ð2Ø12�Ô.Ø$)�Ô!Ø%)�Ô"ØàŒ{ð Ø$Ô2×CÒCÀDÄKÑPÔP�
Ø%Ô3Ô@�àÔ,×AÒAÀ*ÑMÔM�ØÔ%×=Ò=¸dÀDÄKÐTVÐ=ÑWÔWÐWà%Ô3Ô@�Ø +Ò-Ð-ðØFÐFÐFÐFÐFÐFØ!+×!?Ò!?Ñ!AÔ!A˜Ø!Ô,ð Ø"×1Ò1Ø(>Ø-6Ø.5Ô.@Ø+6Ý-0µ´±´¸tÑ1CÑ-DÔ-Dð3ð 3ñ ô ð ùøõ 'ð ð ð Ø™ðøøøùð ð 	"Ø”ð "ð "ðð ð $2ðñ ô �ð ”	×%Ò%ð 'ð
 !ñ"ô "ð "ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð "ð "ð	"ð 	"s%   ÄA"E2Å2
F Å?F Æ(GÇGÇ
Gc                 óþ  — dd l }dd l}dd l}| j                             |d ¦  «        }|sd S d|_        t          j        ¦   «         }|j                             dd¦  «         	                    d¦  «        }t          j        |j                             ¦   «         d¬¦  «        }|j        › |j        › |› |› � 	                    d¦  «        }	|                     ||	|j        ¦  «                             ¦   «         }
t'          |j        ||j        |j        |j        |j        |j                             ¦   «         |j        ||
¬¦
  «
        }| j        5  | j                             d	|j        f¦  «         |j        |j        |j        |j        |j        |j        |j        |j        |j        |j        dœ
}| j                             d
|j        |j        t          j        |¦  «        f¦  «         d d d ¦  «         n# 1 swxY w Y   |S )Nr   FÚAGENT_HMAC_SECRETÚdefault_freeexile_secretúutf-8T©Ú	sort_keys)
r"   r#   r&   r3   r.   r/   r1   r2   r>   r@   z0DELETE FROM active_sessions WHERE session_id = ?zSINSERT INTO completed_reports (session_id, player_id, report_json) VALUES (?, ?, ?))ÚhmacÚhashlibÚosrW   Úpopr+   r…   Úenvironri   Úencoderg   rq   r1   Úcopyr"   r.   ÚnewÚsha256Ú	hexdigestr=   r&   r3   r/   r2   rR   rU   r#   r>   r@   )rY   r#   rÃ   rÄ   rÅ   rn   Úreclaimed_timeÚ
secret_keyÚ	drops_strÚpayloadÚ	signatureÚreportÚreport_dicts                r   Úreclaim_controlzAgentOrbService.reclaim_control_  s^  € ØˆˆˆØˆˆˆØˆ	ˆ	ˆ	àÔ&×*Ò*¨9°dÑ;Ô;ˆØð 	Ø�4à!ˆÔÝœ™œˆà”Z—^’^Ð$7Ð9SÑTÔT×[Ò[Ð\cÑdÔdˆ
Ý”J˜wÔ;×@Ò@ÑBÔBÈdÐSÑSÔSˆ	ØÔ'ÐX¨Ô);ÐX¸YÐXÈÐXÐX×_Ò_Ð`gÑhÔhˆØ—H’H˜Z¨°'´.ÑAÔA×KÒKÑMÔMˆ	å(ØÔ)ØØ&Ô9Ø#*Ô#AØÔ)Ø"Ô1Ø!(Ô!=×!BÒ!BÑ!DÔ!DØ$Ô5Ø .Ø$ð
ñ 
ô 
ˆð ŒYð 	Pð 	PØŒI×ÒÐPÐSZÔSeÐRgÑhÔhÐhà$Ô/Ø#Ô-Ø&,Ô&?Ø*0Ô*GØ$Ô/Ø"(Ô"7Ø(.Ô(CØ$*Ô$;Ø'-Ô'AØ"(Ô"7ðð ˆKð ŒI×ÒÐsØÔ" FÔ$4µd´jÀÑ6MÔ6MÐNñPô Pð Pð	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	Pð" ˆs   ÅBG2Ç2G6Ç9G6rÒ   c                 ó–  — dd l }dd l}dd l}|j                             dd¦  «                             d¦  «        }t          j        |j        d¬¦  «        }|j	        › |j
        › |› |j        › �                     d¦  «        }|                     |||j        ¦  «                             ¦   «         }|                     |j        |¦  «        S )Nr   r¾   r¿   rÀ   TrÁ   )rÃ   rÄ   rÅ   rÇ   ri   rÈ   rg   rq   r1   r"   r.   r>   rÊ   rË   rÌ   Úcompare_digestr@   )	rY   rÒ   rÃ   rÄ   rÅ   rÎ   rÏ   rÐ   Úexpected_sigs	            r   Úvalidate_harvest_reportz'AgentOrbService.validate_harvest_report�  sÈ   € ØˆˆˆØˆˆˆØˆ	ˆ	ˆ	à”Z—^’^Ð$7Ð9SÑTÔT×[Ò[Ð\cÑdÔdˆ
Ý”J˜vÔ:ÀdÐKÑKÔKˆ	ØÔ&Ðb¨Ô(9Ðb¸9ÐbÀfÔF`ÐbÐb×iÒiÐjqÑrÔrˆØ—x’x 
¨G°W´^ÑDÔD×NÒNÑPÔPˆà×"Ò" 6Ô#8¸,ÑGÔGÐGr   )NrC   )rt   )r™   )r   r   r   r   r
   r4   r[   rV   rX   r!   rs   r6   rz   r   r   r   r   r�   r8   r�   r“   r•   r˜   rœ   rž   r7   r¼   r=   rÔ   rØ   r   r   r   rB   rB   B   sÁ  € € € € € ð%ð %˜xÐ(8Ô9ð %È3ð %Ðquð %ð %ð %ð %ð&$ð $ð $ðL&:ð &:ð &:ðPÐ%6ð ð ð ð ð,Jð J¨ð J°cð JÀ#ð JÈdð Jð Jð Jð JðG°ð G¸¸SÀ#¸X¼ð Gð Gð Gð Gð
)àð)ð ð)ð ð	)ð
 &ð)ð 
Ð#Ô	$ð)ð )ð )ð )ðV¨3ð ¸ð Àð ð ð ð ð&¨Cð °HÐ=NÔ4Oð ð ð ð ð(°#ð (À4ð (ÈDð (ð (ð (ð (ð(ð (¨Sð (¸3ð (Àsð (ÐSWð (ð (ð (ð (ð(ð (¨cð (¸ð (Àdð (ð (ð (ð (ð(ð (°ð (¸Cð (Èð (ð (ð (ð (ð7"˜Eð 7" dð 7"ð 7"ð 7"ð 7"ðr.¨ð .°Ð:QÔ1Rð .ð .ð .ð .ð`
HÐ.Eð 
HÈ$ð 
Hð 
Hð 
Hð 
Hð 
Hð 
Hr   rB   )$rg   rP   r…   r†   Úenumr   Úpathlibr   Útypingr   r   r   Údataclassesr   r	   Úworld.server_engine_loopr
   Úagent.agent_decision_corer   r   Úagent.llm_provider_clientr   r   r4   r   r   rp   r   r   r   r7   r5   r   r!   r=   rB   r   r   r   ú<module>rà      s;  ðØ €€€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hð$ð $ð $ð $ð $�3˜ñ $ô $ð $ð ÔÔ˜vØÔÔ˜wØÔÔ˜wð#€ˆt�C˜�JÔð ð ñ ð ÔÔÐJØÔÔÐLØÔÔÐDð€	ˆ4��S�Œ>ð ð ñ ð ð(ð (ð (ð (ð (ñ (ô (ñ „ð(ð( €�˜dÐ#Ñ#Ô#ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ $Ô#ð
ðWHð WHð WHð WHð WHñ WHô WHð WHð WHð WHr   