
    j                    2   U d Z ddl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
 ddlmZmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ  ej2                  d      Zded<   dddddZded<   ej;                         D  ci c]  \  } }|| 
 c}} Zded<    ej2                  d      Zded<    ej2                  d      Z ded<    e!h d      Z"ded<   ddd d!d"dd#Z#d$ed%<   d&d'd(d)Z$d$ed*<   d+d,d-d.d/d0d#Z%ded1<    ej2                  d2ejL                        Z'ded3<    ed4      Z(d5ed6<    ed7d78       G d9 d:             Z) ed7d78       G d; d<             Z* G d= d>e      Z+ G d? d@e      Z, ed7d78       G dA dB             Z- G dC dD      Z.yc c}} w )Ea2  Private, profile-gated bridge for the Telegram physique check-in wizard.

This module deliberately has no import-time dependency on the profile-local
wizard package.  A normal Hermes profile therefore cannot accidentally enable
or load the check-in implementation merely by importing the Telegram adapter.
    )annotationsN)	dataclass)datetime)Path)FinalProtocolcast)ZoneInfo)BindingStoreWizardBinding)PhysiqueCheckinConfig)WizardPromptbuild_wizard_promptz^[a-f0-9]{32}$zFinal[re.Pattern[str]]_SESSION_IDwcftefmd)weight_change_percentfatigueexercise_feasibilitymeal_deviationzFinal[dict[str, str]]_CALLBACK_STEP_CODES_CALLBACK_CODE_STEPSa  ^(?:launch|bodyweight|sleep_duration|sleep_quality|condition|pain|calories|macros|meals|water|digestion|appetite_stress|training_plan|weight_change_percent|fatigue|exercise_feasibility|meal_deviation|wc|ft|ef|md|optional_note|summary|edit_menu|completion|training_summary|workout_quality|done|performance|intensity|operator_note|safety_ack|Q-SLEEP-CAUSE|Q-SLEEP-ADJUST|Q-COND-SYMPTOM|Q-COND-INTENSITY|Q-PERF-REASON|Q-PERF-NEXT)$_STEPz*^(?:start|a[0-8]|e(?:[0-9]|1[0-2])|p|k|l)$_ACTION>   Q-PERF-NEXTQ-PERF-REASONQ-SLEEP-CAUSEQ-COND-SYMPTOMQ-SLEEP-ADJUSTQ-COND-INTENSITYzFinal[frozenset[str]]_ADAPTIVE_STEPS))u	   카페인caffeine)u   야근overtime)u   스트레스stressu   기타other))u   예yes)u	   아니오no))u   피로r   )u	   근육통muscle_soreness)u   감기 기운coldr'   ))u   유지maintain)u   하향reduce)u   휴식rest))u   시간 부족time_shortage)u	   컨디션	condition)u   통증painr'   )r   r!   r    r"   r   r   z-Final[dict[str, tuple[tuple[str, str], ...]]]_ADAPTIVE_CHOICES))u   낮음low)u   보통moderate)u   높음high))u   가능possible)u	   제한적limited)u	   불가능
impossible))u   없음none)u   일부partial)u   큼materialr   r   r   _REGISTERED_MORNING_CHOICESuP   수면이 짧거나 질이 낮았던 가장 가까운 이유를 골라주세요.uF   오늘 수면을 위해 조정 가능한 행동을 받아들일까요.uF   오늘 컨디션 저하와 가장 가까운 상태를 골라주세요.u2   오늘 훈련 강도를 어떻게 조정할까요.uL   수행이 계획보다 낮았던 가장 가까운 이유를 골라주세요.u.   다음 세션에서 조정을 적용할까요._ADAPTIVE_PROMPT_TEXTu:   흉통|가슴\s*통증|실신|호흡\s*곤란|chest\s*pain_URGENT_TEXTz
Asia/SeoulzFinal[ZoneInfo]_KSTT)frozenslotsc                  T    e Zd ZU dZded<   ded<   ded<   ded<   ddZedd	       Zy
)CallbackDatazEA Telegram-safe opaque callback address, never a health-data carrier.str
session_idstepintversionactionc                   t         j                  | j                  | j                        }d| j                   d| d| j                   d| j
                   }t        |j                  d            dkD  rt        d      |S )Nzpc1::utf-8@   z)callback exceeds Telegram's 64-byte limit)	r   getrH   rG   rJ   rK   lenencode
ValueError)selfrH   values      a/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/gateway/platforms/physique_checkin.pyrR   zCallbackData.encode]   sn    #''		499=t'qa~Qt{{mLu||G$%*HII    c                   t        |j                  d            dkD  ry |j                  d      }t        |      dk7  s|d   dk7  ry |\  }}}}}t        j	                  |      r*t
        j	                  |      rt        j	                  |      sy 	 t        |      }|dk  s|dkD  ry  | |t        j                  ||      ||      }		 |	j                          |	S # t        $ r Y y w xY w# t        $ r Y y w xY w)NrN   rO   rM      r   pc1i@B )rQ   rR   splitr   	fullmatchr   r   rI   rS   r   rP   )
clsrU   parts_rG   rH   version_textrK   rJ   parseds
             rV   parsezCallbackData.parsed   s    u||G$%*C u:?eAh%/491:t\6$$Z08MU\UfUfgmUn	,'G Q;'I-Z!5!9!9$!EwPVW	MMO   		  		s$   C C' 	C$#C$'	C32C3N)returnrF   )rU   rF   rc   zCallbackData | None)__name__
__module____qualname____doc____annotations__rR   classmethodrb    rW   rV   rE   rE   T   s2    OO
ILK  rW   rE   c                  D    e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   y)WizardReplyzDAdapter result; deliberately excludes typed health/training content.boolhandledacceptedrF   noticeWizardPrompt | Noneprompt
str | Nonecallback_dataN)rd   re   rf   rg   rh   rj   rW   rV   rl   rl   |   s     NMNKrW   rl   c                  "    e Zd ZU ded<   ded<   y)_WizardStartResultrF   rG   rI   rJ   N)rd   re   rf   rh   rj   rW   rV   rv   rv      s    OLrW   rv   c                  R    e Zd Zd	dZd	dZ	 	 	 	 	 	 d
dZd	dZd	dZd	dZdddZ	y)_WizardServicec                     y Nrj   rT   contextkst_days      rV   start_morningz_WizardService.start_morning       crW   c                     y rz   rj   r{   s      rV   start_workoutz_WizardService.start_workout   r   rW   c                     y rz   rj   r{   s      rV   start_trainer_sessionz$_WizardService.start_trainer_session   s     !rW   c                     y rz   rj   r{   s      rV   start_nutritionz_WizardService.start_nutrition   s    rW   c                     y rz   rj   r{   s      rV   start_nutrition_correctionz)_WizardService.start_nutrition_correction   s    SVrW   c                     y rz   rj   r{   s      rV   start_schedule_referencez'_WizardService.start_schedule_reference   s    QTrW   Nc                     y rz   rj   )rT   r|   rG   expected_versionrK   rU   s         rV   answerz_WizardService.answer   s	      ADrW   )r|   objectr}   rF   rc   r   )r|   _WizardContextr}   rF   rc   rv   rz   )r|   r   rG   rF   r   rI   rK   rF   rU   rs   rc   r   )
rd   re   rf   r~   r   r   r   r   r   r   rj   rW   rV   rx   rx      s;    II!! ! 
	!
 LVT DrW   rx   c                  4    e Zd ZU dZded<   ded<   dZded<   y)r   zGThe profile wizard needs the auth boundary and optional customer scope.rF   owner_idtopic_idNrs   customer_key)rd   re   rf   rg   rh   r   rj   rW   rV   r   r      s    QMM#L*#rW   r   c                     e Zd ZdZ	 	 d;dd	 	 	 	 	 	 	 	 	 d<dZdddd=dZddd	 	 	 	 	 d>dZddd	 	 	 	 	 d>d	Zdd
d?dZd@dZ	dAdZ
dAdZdBdZdCdZd@dZdDdZdEdZedFd       Zdd
dGdZdd
dHdZdIdZdJdZdKdZdLdZdMdZ	 	 	 	 dNdZdOdZdPdZdMdZedQd        ZdMd!Z dId"Z!dId#Z"dRd$Z#dSd%Z$dTd&Z%	 	 	 	 	 	 dUd'Z&dVd(Z'dTd)Z(dTd*Z)dTd+Z*dTd,Z+dTd-Z,edTd.       Z-edWd/       Z.edXd0       Z/edYd1       Z0dLd2Z1dZd3Z2ed[d4       Z3d\d5Z4d]d6Z5d]d7Z6ed^d8       Z7ed_d9       Z8edFd:       Z9y)`PhysiqueCheckinBridgezFValidate exact Telegram boundaries before delegating to profile state.N)r   c                  || _         t        |t              r|j                         nd}dt	        |      cxk  rdk  rn n|nd | _        || j                         nt        t        |      | _	        t        |xs | j                               | _        | j                  j                  |j                  |j                  |j                   | j#                  d             \  | _        | _        y )N    rO   )config
isinstancerF   striprQ   r   _load_profile_servicer	   rx   _servicer   _default_binding_path_binding_storeloadr   chat_idr   _now	_bindings_active_session_id)rT   r   servicebinding_pathr   scopes         rV   __init__zPhysiqueCheckinBridge.__init__   s     (2<(E""$2%&#e*%:%:E8?224TR`biMj*<+W4;U;U;WX262E2E2J2JOOV^^V__diio3
//rW   r   
message_id	now_epochc                  |dk(  r| j                   t        ddddd      S | j                  |      }| j                         }t	        j
                  t              j                         j                         }|dk(  r| j                  j                  ||      }n|dk(  r| j                  j                  ||      }n`|dk(  r| j                  j                  ||      }n>|dk(  r| j                  j                  ||      }n| j                  j                  ||      }| j                  |      \  }}	t!        || j"                  j$                  | j"                  j&                  | j"                  j(                  d	|	t+        |      || j"                  j,                  z         | j.                  |<   | j1                          t3        |d	|	d
      j5                         }
t        dddd|
      S )zDCreate/resume a draft; caller binds the actual sent card message id.schedule_referenceNTFu:   일정 기록 고객 범위를 확인할 수 없습니다.morningnutrition_dailytrainer_sessionlaunchstartr   )r   rl   r   _contextr   nowrA   date	isoformatr   r~   r   r   r   r   _result_identityr   r   r   r   r   rF   expires_secondsr   _persistrE   rR   )rT   flowr   r   r   r|   dayresultrG   rJ   callbacks              rV   open_launcherz#PhysiqueCheckinBridge.open_launcher   s   ''D,=,=,EtU,hjnptuuii	"--/ll4 %%'1139]]00#>F&&]]227C@F&&]]88#FF))]];;GSIF]]00#>F"33F;
G%2,,dkk.A.A4;;CWCWgs:dkk6Q6Q0Q&
z" 	
HgwGNNP4r4::rW   c               *    | j                  d||      S )z6Open the owner-scoped schedule source-fact entry card.r   r   )r   rT   r   r   s      rV    open_schedule_reference_launcherz6PhysiqueCheckinBridge.open_schedule_reference_launcher   s     !!"6:Yb!ccrW   c               `    | j                   t        ddddd      S | j                  d||      S )z4Open the exact trainer/customer-scoped session card.NTFu9   트레이너 고객 범위를 확인할 수 없습니다.r   r   )r   rl   r   r   s      rV   open_trainer_launcherz+PhysiqueCheckinBridge.open_trainer_launcher   sG     $tU,gimostt!!! " 
 	
rW   )r   c                  | j                  |      }t        j                  t              j	                         j                         }| j                  j                  | j                         |      }| j                  |      \  }}t        j                  |      t        dddd d       S t        t        |dd            }t        || j                   j"                  | j                   j$                  | j                   j&                  ||d|| j                   j(                  z   | j+                  |      	      }|| j,                  |<   || _        | j1                          t        ddd| j3                  |      d       S )	NTFu+   수정할 오늘 체크인이 없습니다.rH   
bodyweightr   )awaiting_textuF   기존 기록은 보존하고 수정 기록을 새로 시작합니다.)r   r   r   rA   r   r   r   r   r   r   r   r\   rl   rF   getattrr   r   r   r   r   r   _expects_textr   r   r   _prompt)	rT   r   r   r   r   rG   rJ   rH   bindings	            rV   open_nutrition_correctionz/PhysiqueCheckinBridge.open_nutrition_correction   sG   ii	"ll4 %%'11399$--/3O"33F;
G  ,4tU,Y[_aeff766<89,,dkk.A.A4;;CWCW'2sT[[%@%@@,,T2

 &-z"",4'oquq}q}  F  rG  IM  N  	NrW   c                    | j                   j                  | j                  xs d      }t        | j                  dd       }|||j                  |j                        nd }|d uxr t        |dd       d uS )Nr   _storagefinalized_event_id)r   rP   r   r   r   r   rG   )rT   r   storagesessions       rV   active_is_finalizedz)PhysiqueCheckinBridge.active_is_finalized   st    ..$$T%<%<%BC$--T:6=6IgNa',,w112gkd"_ww8Ld'S[_'__rW   c                    | j                   j                  |      }||syt        |      |_        | j	                          y)NFT)r   rP   rF   r   r   )rT   rG   r   r   s       rV   bind_launcher_messagez+PhysiqueCheckinBridge.bind_launcher_message   s8    ..$$Z0?* _rW   c                &    | j                  ||      S rz   )r   )rT   rG   r   s      rV   bind_prompt_messagez)PhysiqueCheckinBridge.bind_prompt_message  s    ))*jAArW   c                    | j                   j                  | j                  xs d      }||syt        |      |_        | j                          y)zABind a follow-up typed-answer prompt to the same private session.r   FT)r   rP   r   rF   r   r   rT   r   r   s      rV   bind_active_prompt_messagez0PhysiqueCheckinBridge.bind_active_prompt_message  sC    ..$$T%<%<%BC?* _rW   c                    t        |t              sy| j                  j                  |      }|duxr | j	                  d      |j
                  k  S )z@Return whether this bridge owns a live persisted wizard session.FN)r   rF   r   rP   r   
expires_at)rT   rG   r   s      rV   has_bindingz!PhysiqueCheckinBridge.has_binding  sF    *c*..$$Z0d"Ktyy9K9K'KKrW   c                8    | j                  | j                        S )zEReturn whether this bridge has a live session for typed continuation.)r   r   rT   s    rV   has_active_bindingz(PhysiqueCheckinBridge.has_active_binding  s     7 788rW   c                    | j                   j                  | j                  xs d      }|| j                  d      |j                  k\  ry| j                  |      S )zJReturn the current prompt for private-DM recovery without advancing state.r   N)r   rP   r   r   r   r   rT   r   s     rV   active_promptz#PhysiqueCheckinBridge.active_prompt  sM    ..$$T%<%<%BC?diio1C1CC||G$$rW   c                    | j                   j                  | j                  xs d      }|t        |      j	                         syt        |      |_        | j                          y)zCMove the active callback card to a newly rendered recovery message.r   N)r   rP   r   rF   r   r   r   r   s      rV   bind_active_messagez)PhysiqueCheckinBridge.bind_active_message   sM    ..$$T%<%<%BC?#j/"7"7"9 _rW   c                .    | j                   j                  S )z>Expose the durable binding location for diagnostics and tests.)r   _pathr   s    rV   r   z"PhysiqueCheckinBridge.binding_path(  s     ""(((rW   c                  t         j                  |      }|t        dddd d       S | j                  j	                  |j
                        }| j                  |||      r|t        dddd d       S | j                  |      |j                  k\  rt        dddd d       S h d}	t        |      |j                  k7  sL|j                  |j                  k7  s3|j                  |j                  k7  s|j                  r|j                  |	vrt        dddd d       S |j                  dk(  r|j                  d	k7  rt        ddd
d d       S | j                  |j
                        |_        | j!                  |j                        |_        |j
                  | _        | j%                          t        ddd| j'                  |      d       S |j                  dk(  rK|j                  dk(  r<d|_        d|_        | j%                          t        ddd| j'                  |      d       S |j                  dk(  r-|j                  dk(  rt        ddd| j'                  |      d       S ddddj	                  |j                        }
|
d|_         | j(                  |g|
 S | j+                  |j
                        }|dk(  rdnd}|j                  dk(  rK|j                  |k(  r<d|_        d|_        | j%                          t        ddd| j'                  |      d       S | j-                  |j                  |j                  | j+                  |j
                              }|t        dddd d       S |\  }}}|rFd|_        |j
                  | _        | j%                          t        ddd| j'                  |      d       S | j)                  |||      S )NTFu5   체크인 버튼 형식이 올바르지 않습니다.G   이 체크인은 이 토픽의 소유자만 사용할 수 있습니다.<   체크인이 만료됐습니다. 새로 시작해 주세요.>   klpu@   이전 버튼입니다. 현재 질문에서 이어가 주세요.r   r   u,   시작 버튼만 사용할 수 있습니다.r   summarya1	edit_menua2u   임시저장했습니다.)previousN)skipN)deferN)r   r   r   r   e12e11u3   이 선택은 현재 질문에 맞지 않습니다.)rE   rb   rl   r   rP   rG   _matchesr   r   rF   r   rH   rJ   r   rK   _session_stepr   r   r   r   _advance_session_flow_callback_transition)rT   datar   r   r   r   r   ra   r   navigation_actions
navigationr   back_action
transitionrK   rU   r   s                    rV   handle_callbackz%PhysiqueCheckinBridge.handle_callback-  s|   ##D)>tU,ceikopp..$$V%6%67}}Xw9W_tU,uw{  ~B  C  C99Y7#5#55tU,jlprvww,
Ow111{{gll*~~0%%&--?Q*QtU,nptvz{{;;("}}'"40^`dfjkk--f.?.?@GL$($6$6w||$DG!&-&8&8D#MMOtT2t||G/DdKK;;)#(=&GL$)G!MMOtT2t||G/DdKK;;)#(=tT+FU\H]_cdd# 
 #fmm
	 	
 !$)G! 4==6:66!!'"4"45#'88ee;;+%&--;*F$GL$)G!MMOtT2t||G/DdKK..w||V]]DL^L^_f_q_qLrs
tU,acgimnn'1$}$(G!&-&8&8D#MMOtT2t||G/DdKK}}Wfe44rW   c                  | j                   j                  | j                  xs d      }|y | j                  |||      st	        dddd d       S | j                  |      |j                  k\  rt	        dddd d       S t        j                  |      rd|_	        | j                  |d|      S |j                  dv rU|j                         }|dv r| j                  |d	|      S |j                         rt	        ddd
| j                  |      d       S |j                  s| j                  |j                        sy d|_	        | j                  |d|      S )Nr   TFr   r   rU   >   r1   sleep_qualityworkout_quality   12345selectu2   1부터 5 사이의 점수를 입력해 주세요.)r   rP   r   r   rl   r   r   r@   searchr   r   rH   r   	isdecimalr   r   )rT   textr   r   r   r   r   scores           rV   handle_textz!PhysiqueCheckinBridge.handle_textg  sL   ..$$T%<%<%BC?}}Xw9tU,uw{  ~B  C  C99Y7#5#55tU,jlprvwwt$$)G!=='488<<LLJJLE11}}Wh>> "HLL)  %%););GLL)I %}}Wgt44rW   c                   | j                   j                  | j                  xs d      }t        | j                  dd       }|||j                  |j                        nd }||y t        |di       }t        |t              sy t        t        |dd            t        t        |dd            |j                  |j                         D ci c].  \  }}t        |t              st        |t              s(||xs d 0 c}}dS c c}}w )Nr   r   answersr   r}   )r   r}   rH   r  )r   rP   r   r   r   r   rG   r   dictrF   rH   items)rT   r   r   r   r  keyrU   s          rV   active_checkin_snapshotz-PhysiqueCheckinBridge.active_checkin_snapshot  s    ..$$T%<%<%BC$--T:6=6IgNa',,w112gk?go'9b1'4(4577Ir:;LL?F}}  CeR\]`beRfkuv{  ~A  lBemt+  C	
 	
 Cs   D&D7	Dc                t    | j                   j                  | j                  xs d      }||j                  S dS )zFReturn the bound active card address without exposing check-in values.r   N)r   rP   r   r   r   s     rV   active_prompt_message_idz.PhysiqueCheckinBridge.active_prompt_message_id  s7    ..$$T%<%<%BC%,%8w!!BdBrW   c                   | j                   j                  | j                  xs d      }|t        dddd d       S | j	                  |j
                  ||      st        ddd| j                  |      d       S |dv rN| j                  |j
                        |_        | j                          t        ddd| j                  |      d       S |dk(  r"|j
                  dk(  r| j                  |d	d       S | j                  |||      S )
Nr   TFu+   활성 체크인을 찾지 못했습니다.u.   모델 해석을 적용하지 않았습니다.>   stayrewrite_promptclarify_current_stepr   r   
model_skip)r   rP   r   rl   _is_allowed_model_actionrH   r   r   r   r   r   )rT   rK   rU   r   s       rV   apply_model_actionz(PhysiqueCheckinBridge.apply_model_action  s    ..$$T%<%<%BC?tU,Y[_aeff,,W\\65ItU,\^b^j^jkr^suyzzGG$($6$6w||$DG!MMOtT2t||G/DdKKV <==,==}}Wfe44rW   c                (    | j                  |||      S )zAExpose the exact non-sensitive boundary for manual card recovery.)r   rT   r   r   r   s       rV   accepts_contextz%PhysiqueCheckinBridge.accepts_context  s    }}Xw99rW   c                $    | j                  |      S )zEReturn one finalized, exact-bound local record for optional coaching.)_finalized_snapshot)rT   rG   s     rV   finalized_coaching_snapshotz1PhysiqueCheckinBridge.finalized_coaching_snapshot  s    ''
33rW   c           	        t        |t              r|syt        | j                  dd      }t        |dd      }t	        |      sy	  ||      }|t        |dd      |k7  ryt        | j                  dd      }t	        |      sy	  |t        t        |dd                  }t        |dd      |k7  ry| j                  |      S # t
        t        t        f$ r Y yw xY w# t
        t        t        f$ r Y yw xY w)	zEReload the exact durable wizard snapshot linked to a canonical event.Nr   find_finalized_eventr   finalized_eventrG   r   event_id)	r   rF   r   r   callableOSError	TypeErrorrS   _coaching_snapshot)rT   r&  r   find_finalizedr   	finalizedevents          rV   %finalized_coaching_snapshot_for_eventz;PhysiqueCheckinBridge.finalized_coaching_snapshot_for_event  s    
 (C($--T: *@$G'	$X.G ?gg/CTJhVDMM+<dC		"	c''<"DEFE 5*d+x7&&w// J/ 		 J/ 		s$   C C CCC32C3c                    t         j                  |      syt        | j                  dd      }t	        |      sy	  ||      }|S # t
        t        t        f$ r Y yw xY w)zAReturn the canonical finalized Event through the profile service.Nr%  )r   r\   r   r   r'  r(  rS   r)  )rT   rG   r,  r-  s       rV   r%  z%PhysiqueCheckinBridge.finalized_event  sb    $$Z0DMM+<dC		"	j)E  Y/ 		s   A AAc                    t        | j                  dd      }t        |      r ||      S t        | j                  dd      }t        |dd      }t        |      r ||      S y)zFAppend a validated canonical event without exposing storage internals.append_wizard_eventN_events)r   r   r'  )rT   r-  appendeventss       rV   append_eventz"PhysiqueCheckinBridge.append_event  s]    (=tDF%= 	48!6=F%= rW   c                   t         j                  |      sy t        | j                  dd       }||j	                  |      nd }|t        |dd       y t        t        |dd            | j                  j                  k7  s-t        t        |dd            | j                  j                  k7  ry | j                  |      }|t        |dd       nd }t        t        |dd      xs d      xs t        t        |d	d      xs d      }t        t        |d
d      xs d      xs t        t        |dd      xs d      }|s|sy t        t        |dd            d|dS )Nr   r   r   r   r   safetysignalsrj   safety_signalsreasonssafety_reasonsr}   T)r}   safety_heldr-  )r   r\   r   r   r   rF   r   r   r   r%  tuple)rT   rG   r   r   r-  r7  r8  r:  s           rV   finalized_safety_snapshotz/PhysiqueCheckinBridge.finalized_safety_snapshot  sT   $$Z0$--T:.5.A',,z*t?gg/CTJRR01T[[5I5II77J348L8LL$$Z0383D$/$	26<"= 
G-r28bB
 	26<"= 
G-r28bB
 w77Ir:;
 	
rW   c                    t        | dd       }t        |d|      }|dvrd }|dv }t        d t        | dd      xs dD              }|||dS )	NbranchrU   >   changenormalanomalysafety_hold>   rA  rC  rD  c              3  P   K   | ]  }t        |t              r|t        v r|   y wrz   )r   rF   r#   ).0items     rV   	<genexpr>z?PhysiqueCheckinBridge._snapshot_branch_state.<locals>.<genexpr>  s)      
IT$$)@ Is   $&follow_up_idsrj   )r@  detailedrI  )r   r=  )r   r@  branch_valuerJ  rI  s        rV   _snapshot_branch_statez,PhysiqueCheckinBridge._snapshot_branch_state  st    (D1vw7MML#GG 
%gCIrI
 

 # *
 	
rW   c           
        t         j                  |      sy t        | j                  dd       }||j	                  |      nd }|t        |dd       y t        t        |dd            | j                  j                  k7  sat        t        |dd            | j                  j                  k7  s4t        t        |dd      xs d      st        t        |dd      xs d      ry t        |d	i       }t        |t              sy h d
}| j                  |      }t        t        |dd            t        t        |dd            |j                         D ci c](  \  }}||v rt        |t
              r|t        |      d d * c}}d|S c c}}w )Nr   r   r   r   r   r9  rj   r;  r  >   r2   mealswatermacroscaloriesr1   	digestionr   
completionoptional_noter   training_plansleep_durationappetite_stressr  training_summaryr   r}     )r   r}   r  )r   r\   r   r   r   rF   r   r   r   r=  r   r  rL  r  )	rT   rG   r   r   raw_answersallowedbranch_stater  rU   s	            rV   r!  z)PhysiqueCheckinBridge._finalized_snapshot  s{   $$Z0$--T:.5.A',,z*t?gg/CTJRR01T[[5I5II77J348L8LLWW&6;ArBWW&6;ArBgy"5+t,
 227;4577Ir:; #."3"3"5"5JC'>j&< SZ''"5	
 	
 		
s   -F
c                    | j                   j                  | j                  xs d      }|| j                  |j                        S dS )zJReturn the currently bound saved check-in for an explicit feedback replay.r   N)r   rP   r   r"  rG   r   s     rV   "active_finalized_coaching_snapshotz8PhysiqueCheckinBridge.active_finalized_coaching_snapshot2  sC    ..$$T%<%<%BCGNGZt//0B0BCd`ddrW   c                ~   t        | j                  dd      }|y|j                         5  |j                  | j                  j
                  | j                  j                  t        j                  t              j                         j                               }ddd       | j                        S # 1 sw Y   xY w)zLReturn today's newest finalized check-in despite later unfinished launchers.r   N)r   r   lockedfind_latest_finalizedr   r   r   r   r   rA   r   r   r*  )rT   r   r   s      rV   "latest_finalized_coaching_snapshotz8PhysiqueCheckinBridge.latest_finalized_coaching_snapshot7  s    $--T:?^^33$$$$T"'')335G  &&w// s   A/B33B<c           	        |t        |dd       y t        t        |dd            | j                  j                  k7  sat        t        |dd            | j                  j                  k7  s4t        t        |dd      xs d      st        t        |dd      xs d      ry t        |di       }t        |t              sy h d	}|j                         D ci c](  \  }}||v rt        |t              r|t        |      d d
 * }}}| j                  |      }t        t        |dd            t        t        |dd            t        t        |dd            |d|S c c}}w )Nr   r   r   r   r9  rj   r;  r  >   r2   rN  rO  rP  rQ  r1   rR  r   rS  rT  r   rU  rV  rW  r  rX  rY  rG   r   r}   )rG   r   r}   r  )
r   rF   r   r   r   r=  r   r  r  rL  )rT   r   rZ  r[  r  rU   r  r\  s           rV   r*  z(PhysiqueCheckinBridge._coaching_snapshotD  s\   ?gg/CTJRR01T[[5I5II77J348L8LLWW&6;ArBWW&6;ArBgy"5+t,
 *//1
1
Ug~*UC"8 UFU##1 	 

 227;gg|R@A4577Ir:;	

 
 	

s   -Ec                   | j                   j                  | j                         |j                  |j                  ||      }t        t        |dd            }|dvrt        ddd| j                  |      d       S t        t        |d            |_        t        t        |d            |_
        | j                  |j                        |_        |d	v r/d | _        | j                          t        ddd
t        d      d       S |j                  | _        | j                          |dv rt        dddt        d      d       S t        ddd| j!                  |      d       S )Nstatusr   >   WizardStatus.ADVANCEDWizardStatus.SAFETY_STOPsavedadvanceddeferredsafety_stopWizardStatus.SAVEDWizardStatus.DEFERREDTFu2   입력을 확인하고 다시 시도해 주세요.rJ   rH   >   rj  rm  uF   나중에 여기서 이어갈 수 있도록 임시 저장했습니다.uS   임시 저장했습니다. 고객 메뉴에서 다시 시작하면 이어집니다.>   rh  rl  u    체크인을 저장했습니다.u+   ✅ 오늘 체크인을 저장했습니다.)r   r   r   rG   rJ   rF   r   rl   _invalid_text_promptrI   rH   r   r   r   r   r   r   )rT   r   rK   rU   r   re  s         rV   r   zPhysiqueCheckinBridge._advancee  sV   %%dmmow7I7I7??\bdijWVXr23 	
 	
 D))'2  gfi8976623 $ 2 27<< @::&*D#MMOXrs  #*"4"4442JK  4r4<<+@$GGrW   c                   j                   t        v r| j                        }nj                   dht        v r| j	                        }n| j                  j                        }|dk(  r| j                        }nc|dk(  r| j                        }nL|dk(  r!j                   dk(  r| j                        }n&t        j                   j                  fd|      }| j                  |      S )Nr   r   r   r   r   c                x    t        j                  j                  j                  |       j	                         S rz   rE   rG   rH   rJ   rR   rK   r   s    rV   <lambda>z/PhysiqueCheckinBridge._prompt.<locals>.<lambda>  s2    <**	$
 fh$rW   r   )rH   r#   _adaptive_promptr>   _registered_morning_promptr   rG   _schedule_reference_prompt_trainer_prompt_nutrition_summary_promptr   r   _with_navigation)rT   r   rr   r   s    `  rV   r   zPhysiqueCheckinBridge._prompt  s    <<?***73F\\5T8STT44W=F%%g&8&89D++88A**--g6**w||y/H77@,LL)) 
 $$VW55rW   c                ~   t        | j                  dd       }||j                  j                        nd }|j                  dv r|S t        t        |dd      xs d      }|st        t        |di       xs d      }t        t        d | j                  t        t        |dd                  D                    t        t        t        |d	d      xs d            z   }t        t        |      d
z   |      }fd}g }	|r|	j                  d |d      f       j                  dk(  r|	j                  d |d      f       |	j                  d |d      f       |j                  xs t        d |j                  D              }
t        d| d| d|j                   |j                  g |
t        |	            S )Nr   >   r   r   
safety_ackstep_historyrj   r  c              3  *   K   | ]  }|d k7  r|  yw)r   Nrj   )rF  rH   s     rV   rH  z9PhysiqueCheckinBridge._with_navigation.<locals>.<genexpr>  s       
Ky  Ks   r   r   rI  r   c                x    t        j                  j                  j                  |       j	                         S rz   rq  rr  s    rV   rs  z8PhysiqueCheckinBridge._with_navigation.<locals>.<lambda>  2    ,LLOO	#

 &(#rW   u   이전r   rT  u   건너뛰기r   u   나중에 계속r   c              3  "   K   | ]  }|f 	 y wrz   rj   )rF  buttons     rV   rH  z9PhysiqueCheckinBridge._with_navigation.<locals>.<genexpr>  s      3
$2&VINs   u   진행 /
)r   r   r   rG   rH   r=  rQ   _flow_stepsrF   minr3  button_rowsbuttonsr   r  )rT   rr   r   r   r   historytotalpositionr   r   content_rowss     `        rV   rz  z&PhysiqueCheckinBridge._with_navigation  s   
 $--T:6=6I',,w112t?gll.QQM<BCGGY;ArBGE 
((WWfb-I)JK
 
  ww<BCD	E
 s7|a'/ -/
x#78<<?*~x}=>-x}=>)) 
U 3
$*NN3
 .
 hZqr&++7NN.l.E*-.
 	
rW   c                    d}| j                   t        | j                  dd       g |d d dddd|dd  }|dd	d
d}|j                  |d      S )N)	r   rV  r   r1   r2   rQ  rU  rT  r   _runtime   r   r   r   r   )r   rQ  rP  rN  rO  rV  r   rR  r1   rW  rX  rT  r   )rS  rX  r  r2   r   )donerX  performance	intensityr2   operator_noter   )r   r   workoutr   rj   )r   r   r   rP   )rT   r   r   stepss       rV   r  z!PhysiqueCheckinBridge._flow_steps  s    

 (GDMM:t,T,`!'  '	
 ! G   1!
D yyr""rW   c                   fdj                   dk(  r+d d      fd d      fd d      ff}t        d	||f      S j                   d
k(  rt        d      S j                   dk(  r,t        fdt        dd      D              }t        d||f      S j                   dk(  r+d d      fd d      fd d      ff}t        d||f      S j                   dk(  r"d d      fd d      ff}t        d||f      S j                   dk(  rt	        | j
                  dd       }||j                  j                        nd }t        t	        |di       xs i       }d d      ff}ddddj                  t        |j                  dd            d       }t        d!|j                  d
d        d"|j                  dd        d#| d$|j                  d%d        ||f      S t        j                   j                  d&'      S )(Nc                x    t        j                  j                  j                  |       j	                         S rz   rq  rr  s    rV   rs  z7PhysiqueCheckinBridge._trainer_prompt.<locals>.<lambda>  r  rW   r  u   완료a0u   부분 완료r   u   휴식·변경r   u8   계획한 PT 세션의 수행 상태를 골라주세요.rX  uC   운동 부위, 종목, 세트 수와 시간을 입력해 주세요.r  c              3  J   K   | ]  }t        |       d |       f  ywaN)rF   )rF  indexr   s     rV   rH  z8PhysiqueCheckinBridge._trainer_prompt.<locals>.<genexpr>  s&     Y[ESZAeW+)>?[s    #r      u-   수행도를 1부터 5까지 골라주세요.r  u   계획보다 낮게u   계획대로u   계획보다 높게u/   계획 대비 실제 강도를 골라주세요.r  u   메모 없음u   메모 입력u5   트레이너 메모가 있으면 입력해 주세요.r   r   r     저장)below
as_plannedabover   -u8   트레이너 세션 기록을 저장할까요?

훈련: u   
수행도: u    / 5
강도: u	   
통증: r2   r   rt  )rH   r   r=  ranger   r   r   rG   r  rP   rF   r   r   )rT   r   r  r   r   r  r  r   s    `     @rV   rx  z%PhysiqueCheckinBridge._trainer_prompt  s]    <<6!8D>* (4.1!8D>2G
   Z\cfmeopp<<-- eff<<=(YUSTVW[YYG OQX[bZdee<<;&&7$0&7G
   QSZ]d\fgg<<?*'$8?HUYN:[\G WY`cjblmm<<9$dmmZ>G:A:Mgll7#5#56SWG77Ir:@bAG (4.13G.,. c#gkk+r23S9	 
  ";;'93?@ A%kk-=> ?$+ &";;vs34	6
 
  #LL!!"	
 	
rW   c                &   fd}| j                   j                  j                  j                        }t	        t        |di       xs i       }ddddddd	d
dj                  t        |j                  dd            t        |j                  dd                  }t        |j                  dd      xs d      j                         }ddd|j                  dd       dd|j                  dd       dd|j                  dd       d|j                  dd       d|j                  dd       dd|j                  dd       d |j                  d!d       d"d#|xs d d$|j                  d%d       d"d&|j                  d'd       d(|xs d g}t        |j                  d)d      xs d      j                         }|r|j                  d*|        d+ |d,      fd- |d.      fd/ |d0      ff}	t        d1j                  |      |	|	f      S )2Nc                x    t        j                  j                  j                  |       j	                         S rz   rq  rr  s    rV   rs  zAPhysiqueCheckinBridge._nutrition_summary_prompt.<locals>.<lambda>E  -    ,goov#

&(#rW   r  u%   브리스톨 1 · 딱딱한 알갱이u+   브리스톨 2 · 울퉁불퉁한 소시지u%   브리스톨 3 · 갈라진 소시지u+   브리스톨 4 · 매끈하고 부드러움u(   브리스톨 5 · 부드러운 덩어리u&   브리스톨 6 · 묽고 풀어진 변u"   브리스톨 7 · 완전한 물변u   가스·복부 팽만)	bristol_1	bristol_2	bristol_3	bristol_4	bristol_5	bristol_6	bristol_7gas_bloatingrR  r   rX  u(   입력한 내용을 확인해 주세요.u   체중: r   r  kgu   칼로리: rQ  kcalu   탄·단·지: rP  u   식사: rN  u   수분: rO  Lu   수면: rV  u   시간 / 질 r   z/5u   배변·소화: u   컨디션: r1   u   식욕·스트레스: rW  u   운동: rT  u   특이사항: r  r  u   수정r   u   임시저장r   r  )r   r   r   rG   r  r   rP   rF   r   r3  r   join)
rT   r   r   r   r  rR  traininglinesnoter  s
    `        rV   ry  z/PhysiqueCheckinBridge._nutrition_summary_promptD  s6    --((--g.@.@Aww	26<"=@F@FCA=3	
 #c'++k2./W[[b5Q1R
S 	 w{{#5r:@bAGGI6w{{<56b9'++j#67t<gkk(C89:w{{7C012w{{7C013w{{#3S9:-TcehHiGjjlmy/C01'++k378;$W[[1BC%H$IJx3'(
 7;;39r:@@BLL>$01htn-(4./IN\dei\jKklDIIe,gzBBrW   c                    j                   dk(  rt        d      S fdt        j                      }t        fdt	        |      D              }dddd}t        |j                      ||f      S )	Nr   uO   최근 기준 대비 체중 변화율(%)을 숫자로 보내주세요. 예: 0.4c                x    t        j                  j                  j                  |       j	                         S rz   rq  rr  s    rV   rs  zBPhysiqueCheckinBridge._registered_morning_prompt.<locals>.<lambda>n  r  rW   c              3  D   K   | ]  \  }\  }}| d |       f  ywr  rj   rF  r  labelr_   r   s       rV   rH  zCPhysiqueCheckinBridge._registered_morning_prompt.<locals>.<genexpr>r  2      
%7!zq Hq[)*%7    u$   현재 피로도를 골라주세요.u/   오늘 운동 가능 정도를 골라주세요.u6   계획 대비 식사 이탈 정도를 골라주세요.r=   )rH   r   r>   r=  	enumerate)rT   r   choicesr  	questionsr   s    `   @rV   rv  z0PhysiqueCheckinBridge._registered_morning_prompti  s    <<22a  .gll; 
%.w%7
 

 >$UV
	
 Igll3WwjIIrW   c           	         fdt         j                     }t        fdt        |      D              t        fdt	        dt              d      D              }t        t        j                     |      S )Nc                x    t        j                  j                  j                  |       j	                         S rz   rq  rr  s    rV   rs  z8PhysiqueCheckinBridge._adaptive_prompt.<locals>.<lambda>~  r  rW   c              3  D   K   | ]  \  }\  }}| d |       f  ywr  rj   r  s       rV   rH  z9PhysiqueCheckinBridge._adaptive_prompt.<locals>.<genexpr>  r  r  c              3  .   K   | ]  }||d z      yw)   Nrj   )rF  r  r  s     rV   rH  z9PhysiqueCheckinBridge._adaptive_prompt.<locals>.<genexpr>  s     U;T%WU519-;Ts   r   r  )r3   rH   r=  r  r  rQ   r   r?   )rT   r   r  rowsr  r   s    `  @@rV   ru  z&PhysiqueCheckinBridge._adaptive_prompt}  so     $GLL1 
%.w%7
 
 U5CLRS;TUU1',,?$OOrW   c                   fd}j                   r+dddd}t        |j                  j                  d            S j                  dv r8j                  dk(  rd	nd
}d |d      fd |d      ff}t        | d||f      S j                  dk(  r| j                  j
                  j                  j                        }t        t        |di       xs i       }d |d      ff}t        d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       
||f      S t        d      S )Nc                x    t        j                  j                  j                  |       j	                         S rz   rq  rr  s    rV   rs  zBPhysiqueCheckinBridge._schedule_reference_prompt.<locals>.<lambda>  r  rW   uG   확인한 수업 날짜를 YYYY-MM-DD 형식으로 입력해 주세요.uB   확인한 시작 시간을 HH:MM 형식으로 입력해 주세요.uH   최근 변경 사항 또는 확인 근거를 짧게 입력해 주세요.)session_kst_datesession_start_kstlast_change_noteu%   현재 항목을 입력해 주세요.>   owner_confirmedcustomer_confirmedr  u   고객u	   운영자u	   확인함r  u   확인되지 않음r   u%   의 일정을 직접 확인했나요?r   r  r  u9   아래 일정 원본 사실을 저장할까요?

날짜: r  r  u	   
시작: r  u   
고객 확인: u   
운영자 확인: r  u   
변경 메모: r  u%   일정 확인을 이어가 주세요.)
r   r   rP   rH   r   r   r   rG   r  r   )rT   r   r   labelsr  r  r   r  s    `      rV   rw  z0PhysiqueCheckinBridge._schedule_reference_prompt  s      $m%i$nF
  

7<<9` abb<<DD '0D DH+E#Xd^47LhW[n6]^G5')N OQX[bZdee<<9$mm,,11'2D2DEG77Ir:@bAG (4.13G";;'93?@ A";;':C@A B"")++.BC"H!I J%%,[[1BC%H$I J"")++.@#"F!GI 
	 	 CDDrW   c                    | j                   dk(  rt        d      S ddd}|j                  | j                   d      }t        | d      S )Nr   u   오늘 체중 기록을 못 했구나. 체중을 비워 둔 채 저장하면 추이를 왜곡해서 아직 저장하지 않을게. 나중에 측정한 숫자를 보내면 여기서 이어갈게.u   수면 시간u   어제 총칼로리)rV  rQ  u   현재 항목uR   은(는) 숫자로 보내주세요. 현재 입력은 기록하지 않았습니다.)rH   r   rP   )r   r  r  s      rV   rn  z*PhysiqueCheckinBridge._invalid_text_prompt  sY    <<<'R 
 .-
 

7<<9ug%wxyyrW   c           	        | t         v rUt        |    }|j                  d      r:|dd  j                         r't	        |dd        }|t        |      k  rd||   d   dfS y |dk(  r| dv rddd	}||v rd||   dfS d S |d
k(  r| dk(  rdddd}||v rd||   dfS d S |d
k(  r| dk(  r|dv rd|dd  dfS d S |d
k(  r| dk(  rdddd}||v rd||   dfS d S |d
k(  r| dk(  r|dk(  ry|dk(  rdS d S | dv r|dv rd|dd  dfS | t        v rUt        |    }|j                  d      r:|dd  j                         r't	        |dd        }|t        |      k  rd||   d   dfS y | dk(  r|dk(  rdS |dk(  rdS d S | dk(  r dd d!d"d#d$d%d&d'}||v rd||   dfS |d(k(  rdS d S | d)k(  r|dk(  rd*S |dk(  rd+S |d,k(  rdS d S | d-k(  r|dk(  rdS |dk(  rdS d S | d.k(  r|d/v rdd0t	        |dd           dfS d S |d1k(  r| d2k(  r	|dk(  rdS d S | d3k(  r|dk(  ry4d5d6d7d8j                  |d9      }| d:k(  rH|j                  d;      r7|dd  j                         r$t	        |dd        }|t        |      k  rd<||   dfS | d=k(  r|dk(  ry>y )?Nr  r   r  Fr   >   r  r  truefalse)r  r   r   r  completer;   rest_changed)r  r   r   r  >   r   r   a3a4a5r  r  r  r  r  r  )r  r   Fr   )rU   NT>   r1   r   r  r2   )r  r:   FrR  r  r  r  r  r  r  r  r  )r  r   r   r  r  r  a6a7a8rU  )r  r/   F)r  	undecidedFr   rT  rS  >   r  r   r   )r  r;   r  r   rX  r   )saveNF)r   rV  r   r1   r2   rQ  rU  rT  )rS  rX  r  r2   )r   rQ  rP  rN  rO  rV  r   rR  r1   rW  rX  rT  )r   r  r   rj   r   eeditr|  )acknowledgeNF)r#   r3   
startswithisdigitrI   rQ   r>   rP   )rH   rK   r   r  r  	confirmedrR  editables           rV   r   z*PhysiqueCheckinBridge._callback_transition  s   ?"'-G  %&**<*<*>F12J3w<'#WU^A%6==''D4],]%W5I;AY;NHi/7XTXX$$'yOG9?79JHgfou5TPTT$$)>4:>\4\HfQRj%0fbff$$)<$LHG9?79JHgfou5TPTT$$)@~.,2dN(DDDDSqIqVABZ....1$7G  %&**<*<*>F12J3w<'#WU^A%6==6>06$,u]cgk]kDYuquu;!K!K!I
 "6!2E99,2dN(DD?"06$,  lflptftDb  l  TZ  ^b  Tb  {P  l  hl  l?"06$,u]cgk]kDYuquu<bhl~b~HEc&QRQS*oVX]^  I  EI  I$$1C)C,2dN(DD94& LT 
 #dB- 	 ;6#4#4S#9fQRj>P>P>Rqr
OEs8}$x55<FdN-rW   c                
    | dv S )N>   rN  rO  rP  rQ  r   rV  rW  r  r  rX  r  r   rj   )rH   s    rV   r   z#PhysiqueCheckinBridge._expects_text  s     
 
 	
rW   c                z   |dv r|d u S | dk(  r|dk(  xr |d u xs |dk(  xr |d uS | dv r|dk(  xr |d uS | dv r|dk(  xr |d uS | dk(  r|dk(  xr |d	v S | d
k(  r|dk(  xr |dv S | dk(  r|dk(  xr |dv S | dk(  r|dk(  xr |d uxs |dk(  xr |dk(  S | t         v r%|dk(  xr |t         |    D ch c]  \  }}|	 c}}v S | dk(  r|dk(  xr |dk(  xs |dk(  xr |d uS | dk(  r|dk(  xr |dk(  xs |dk(  xr |d uS | dk(  r|dk(  xr |dv xs |dk(  xr |d uS | dk(  r|dk(  xr |dk(  xs |dk(  xr |d uS yc c}}w )N>   r  r  r  r   r   rU   >   rN  rO  rP  rQ  rV  rW  r  r  rX  r  r   >   r1   rS  r   r  r  r  >   r;   r  r  r  r  r  >   r  r  r  r  r2   r:   rR  rB  rU  >   r/   r  rT  F)r>   )rH   rK   rU   r_   choices        rV   r  z.PhysiqueCheckinBridge._is_allowed_model_action  s3   GGD= <f$6$dFg<M<cRW_cRcd 
 

 W$:d)::RRX%;%t*;;6>X%Z%3Z*ZZ= X%L%3L*LL;X%S%3S*SS?"'!7e4&7 ("6u
 ..X% %(CD(I4(I91f(I4 +  6>h&:5F?h'@Q@gV[cgVgh;h&<5H+<j&GBSBiX]eiXij?"h&I54I+IwvY`O`Ovejrvevw?"h&:5F?h'@Q@gV[cgVgh4s   .D7c                    t        |      t        |      t        |      f| j                  j                  | j                  j                  | j                  j                  fk(  S rz   )rF   r   r   r   r   r  s       rV   r   zPhysiqueCheckinBridge._matches,  sU    Hs7|S];@T@TVZVaVaViVikokvkvkk  @A  A  	ArW   c                d    | j                   j                  | j                  | j                         y rz   )r   r  r   r   r   s    rV   r   zPhysiqueCheckinBridge._persist/  s"      1H1HIrW   c                D    | t        t        j                               S | S rz   )rI   time)rU   s    rV   r   zPhysiqueCheckinBridge._now2  s    #(=s499;;e;rW   c                    t        | j                  j                  | j                  j                  | j                        S )N)r   r   r   )r   r   r   r   r   r   s    rV   r   zPhysiqueCheckinBridge._context6  s2    [[))[[))**
 	
rW   c                    t        | j                  dd       }||j                  |      nd }t        t        |dd            S )Nr   rH   r   r   r   r   rF   rT   rG   r   r   s       rV   r   z#PhysiqueCheckinBridge._session_step=  s=    $--T:.5.A',,z*t77FL9::rW   c                    t        | j                  dd       }||j                  |      nd }t        t        |dd            S )Nr   r   r   r  r  s       rV   r   z#PhysiqueCheckinBridge._session_flowB  s=    $--T:.5.A',,z*t77FI677rW   c                V    t        t        | d            t        t        | d            fS )NrG   rJ   )rF   r   rI   )r   s    rV   r   z&PhysiqueCheckinBridge._result_identityG  s%    76<013wvy7Q3RRRrW   c            	     \   ddl m}  t         |              dz  dz  }|j                         st	        d      t        |      }|t        j                  vr t        j                  j                  d|       ddl	m
} t        t        |j                  t         |              dz  dz              S )	Nr   get_hermes_home	workspacecheckin_cliz(physique check-in package is unavailable)WizardServicer   wizard)hermes_cli.configr  r   is_dirRuntimeErrorrF   syspathinsertcheckin_cli.wizardr  r	   rx   for_standalone)r  package_rootpackage_textr  s       rV   r   z+PhysiqueCheckinBridge._load_profile_serviceK  s    5O-.<}L""$IJJ<(sxx'HHOOA|,4((o.?)@6)IH)TU
 	
rW   c                 @    ddl m}  t         |              dz  dz  dz  S )Nr   r  r   r  ztelegram-bindings.json)r  r  r   r  s    rV   r   z+PhysiqueCheckinBridge._default_binding_pathZ  s#    5O%&/(:=UUUrW   )NN)
r   r   r   object | Noner   zPath | Noner   rs   rc   None)r   rF   r   rF   r   
int | Nonerc   rl   )r   rF   r   r  rc   rl   )r   r  rc   rl   )rc   rm   )rG   rF   r   rF   rc   rm   )r   rF   rc   rm   )rG   r   rc   rm   )rc   rq   )r   rF   rc   r  )rc   r   )r   rF   r   rF   r   rF   r   rF   r   rF   r   r  rc   rl   )r  rF   r   rF   r   rF   r   rF   r   r  rc   zWizardReply | None)rc   dict[str, object] | None)rc   rs   )rK   rF   rU   rs   rc   rl   )r   rF   r   rF   r   rF   rc   rm   )rG   rF   rc   r  )r&  rF   rc   r  )rG   rF   rc   r  )r-  r   rc   r  )r   r   rc   zdict[str, object])r   r  rc   r  )r   r   rK   rF   rU   rs   rc   rl   )r   r   rc   r   )rr   r   r   r   rc   r   )r   rF   rc   ztuple[str, ...])rH   rF   rK   rF   r   rF   rc   z#tuple[str, str | None, bool] | None)rH   rF   rc   rm   )rH   rF   rK   rF   rU   rs   rc   rm   )rc   r  )rU   r  rc   rI   )rc   r   )rG   rF   rc   rF   )r   r   rc   ztuple[str, int])rc   rx   ):rd   re   rf   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   r  r  r  r  r  r"  r.  r%  r5  r>  staticmethodrL  r!  r^  rb  r*  r   r   rz  r  rx  ry  rv  ru  rw  rn  r   r   r  r   r   r   r   r   r   r   r   r   rj   rW   rV   r   r      s   P
 "&$(	
 $(
%
 
 "	
 !
 

" =?X\ ;6 $&td d2<d	d $&t

 

2<

	

 DH N$`BL9% ) ) BF 85t mq 58
 C
5:400 
"08	
8 
 
 !
Fe
0
B+HZ66%
%
 %
 
	%
N7#r5
n#CJJ(
PE< z z D DL 
 
 % %NAJ < <
;
8
 S S 
 
 V VrW   r   )/rg   
__future__r   rer  r  dataclassesr   r   pathlibr   typingr   r   r	   zoneinfor
   +gateway.platforms.physique_checkin_bindingsr   r   )gateway.platforms.physique_checkin_configr   *gateway.platforms.physique_checkin_promptsr   r   compiler   rh   r   r  r   r   r   	frozensetr#   r3   r>   r?   
IGNORECASEr@   rA   rE   rl   rv   rx   r   r   )rH   codes   00rV   <module>r     s%   # 	 
  !   ( (  S K X '1bjj1B&C# C! 	/ +  "6!;!;!=/!=:4D$J!=/ +  !+

`!  #-"**1#	  *3 4 *&  z;Z~8D @  O
 WN J  h^^LcC0 ,  (2rzzAMM($  !.o . $d#$ $ $$N $d#  $ 
DX D $d#$ $ $$zV zVI/s   F