
    j             
      \   U d 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ZddlZddlZddlmZmZmZ dd	lmZmZ dd
lmZ dZdZdZ ej:                  d      Z ej:                  d      Z ej:                  d      Z  ej:                  d      Z! ej:                  d      Z" ej:                  d      Z# ej:                  d      Z$ ej:                  d      Z% ej:                  dejL                        Z' e(h d      Z)ddddZ*dZ+ e(h d      Z,dZ- e(h d      Z.i d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCiZ/dDe0dE<    e(e/      Z1 edFdFG       G dH dI             Z2 edFdFG       G dJ dK             Z3 edFdFG       G dL dM             Z4 edFdFG       G dN dO             Z5 edFdFG       G dP dQ             Z6 edFdFG       G dR dS             Z7 edFdFG       G dT dU             Z8ddVZ9ddWZ:ddXZ;ddYZ<dZd[dd\Z=dd]Z>dd^Z?dd_Z@dd`ZAddaZBddbZCddcZD	 	 	 	 	 	 	 	 dddZEddeZFdddf	 	 	 	 	 	 	 	 	 	 	 	 	 ddgZG	 	 	 	 	 	 	 	 ddhZH	 	 	 	 	 	 	 	 	 	 ddiZI	 	 	 	 	 	 ddjZJdddddk	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddlZK	 	 	 	 	 	 	 	 ddmZL	 	 	 	 	 	 	 	 	 	 ddnZM	 	 	 	 	 	 	 	 ddoZNddpZO	 	 	 	 	 	 ddqZPddrZQddsZRddtZSddduZTddvZUddwZVddxZWdydyddzdzd{	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd|ZXdd}ZYdd~ZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbddZcddZdddZe	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZf	 	 	 	 ddZgddZhdddddddddd	ZidDe0d<   dddddddddZjdDe0d<   ddddiddiddddddddddddddiddiddZkde0d<   y)a
  Deterministic two-stage Korean coaching copy pipeline.

The model is allowed to select finite, code-owned semantic atoms only.  All
rendered Korean, facts, decisions, actions, timing, safety and delivery state
remain owned by this module (and the canonical caller).
    )annotations)Counter)asdict	dataclassis_dataclass)datedatetimeN)CallableLiteralMapping   )&contains_prohibited_nutrition_guidance#contains_unsupported_sensitive_fact)recommendation_claims_match)reason_codeinsufficient_datamissing_datasafety_hold	provider_)u   진단합니다u   치료합니다u   완치u   약물을 복용u   의학적으로 확실)
u   오늘 체크인 완료   오늘 할 일u   이번 주 u   적응형 영양 검토u	   권장안   검토 필요u   현재 판단:   이번 주 판단:u   상태:4   고객에게는 아직 전달되지 않았습니다.z[+-]?\d+(?:[.,]\d+)*%?zJ[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]|[\u200b-\u200f\u202a-\u202e\u2060-\u206f]z[a-z][a-z0-9_.-]{1,63}z[0-9a-f]{64}z\d{4}-\d{2}-\d{2}z@\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2})?(?:Z|[+-]\d{2}:\d{2})z[a-z][a-z0-9_.:+-]{1,63}z:(?:decision|review|hold|adjust)[_.-][a-z][a-z0-9_.-]{1,63}zMcustomer|client|user|telegram|chat|phone|email|display[_ -]?name|account|uuid>   dailyweeklyadaptive_operatorzdaily-checkinzweekly-summaryzadaptive-proposal)r   r   r   medicalunsafe_nutrition>   prior_mean_kgcurrent_mean_kgweekly_rate_percent)evaluation_day	goal_mode
goal_ranger$   r#   r%   decisionreason_category_idscurrent_targetstarget_macroscarb_category_targetssafety_heldapproval_statedelivery_stateproposal_digestrevisionrevision_binding_digestsource_cluster_idsexcluded_risk_ids>   r)   r'   r(   
prior_meanr.   weekly_ratecurrent_meanr/   r0   r&   next_check_timeprevious_comparisonrecent_committed_adjustmentchoi_01u   원인부터 설명합니다. 문제를 동작·관절·부하·회복 요소로 나누고, 조정 뒤 관찰할 결과까지 연결합니다.choi_02u   몸통 안정성과 부하 경로를 우선합니다. 목표 근육의 느낌 하나보다 자세, 관절 움직임, 보상 동작, 반복 재현성을 함께 봅니다.choi_03u   약점은 인접 움직임에서 찾되 진단하지 않습니다. 견갑·전거근·전완·발목 등 인접 패턴을 검토할 수 있지만, 보조운동은 선택적 수단입니다.choi_04u   작고 누적 가능한 수행을 중시합니다. 부하·반복·운동순서·속도는 실제 수행, 기술, 관절 내성, 회복을 보고 점진적으로 조정합니다.choi_05u   감량 전 훈련 수용능력을 중시합니다. 공격적 감량보다 훈련을 감당할 준비를 갖추고, 단기 절식보다 식사 이행·소화·훈련 수행·회복을 함께 봅니다.choi_06u   개인 반응을 기록으로 확인합니다. 한 번에 적은 수의 가설만 바꾸고 결과와 반례를 기록합니다.choi_07u   영상 모방보다 맥락과 개인 피드백을 중시합니다. 확인되지 않은 기전·성과·안전성을 권위 있게 단정하지 않습니다.nutrition_01u   감량·체중 판단은 추세와 맥락을 함께 봅니다. 체중 한 번의 숫자가 아니라 체중·체성분 추세, 훈련 수행, 회복, 에너지 가용성을 함께 봅니다.nutrition_02uw   근비대는 훈련·영양·회복의 결합 결과입니다. 어느 하나가 나머지를 대체하지 않습니다.nutrition_03u   식단 조정은 하나씩, 관찰 뒤에 합니다. 현재 계획을 관찰하고, 필요할 때 한 변수만 작고 되돌릴 수 있게 바꾼 뒤 체중 추세·수행·회복을 확인합니다.nutrition_04u   음식 반응은 개인 기록으로 확인합니다. 특정 음식·감미료·식이 방식이 모두에게 맞거나 틀리다고 단정하지 않습니다.nutrition_05u   산화능력은 수행 보조 요인으로 제한합니다. 유산소·산화성 컨디셔닝은 반복 작업 내성과 운동능력을 도울 수 있지만, 모든 회복 문제의 근거가 아닙니다.nutrition_06u   소화 콘텐츠는 관찰 원칙으로만 사용합니다. TRP 채널·히스타민·FODMAP은 가능한 맥락일 뿐 자가진단 근거가 아닙니다.nutrition_07u   운동 후 탄수화물은 회복 일정에 맞춥니다. 실제 소모량과 다음 고강도 세션까지의 시간을 고려하며 특정 부위에 영양분이 선택적으로 배분된다고 단정하지 않습니다.nutrition_08u   운동 선택은 목표와 관절 내성에 맞춥니다. 관절 위치·가동범위·기구 설정은 부하를 바꿀 수 있지만 구조적 문제를 진단하거나 교정 효과를 보장하지 않습니다.nutrition_09u   저탄수 상황의 기초 대사는 처방 근거가 아닙니다. 포도당신생·케톤체 설명을 개인의 탄수화물 반응 진단이나 처방으로 확대하지 않습니다.nutrition_10u   수면과 회복은 여러 지표로 봅니다. 수면은 수행과 회복에 관련되지만 한 번의 수행을 단일한 회복 지표로 단정하지 않습니다.nutrition_11u   미량영양소와 보충제는 필요량·결핍·안전 경계를 기준으로 합니다. 확인되지 않은 고용량 보충제를 회복·소화·수행 향상책으로 일반화하지 않습니다.zdict[str, str]_APPROVED_PRINCIPLE_TEXTT)frozenslotsc                  ,    e Zd ZU ded<   ded<   ded<   y)	ProseSlotstrslot_idztuple[int, ...]line_indexes	canonicalN__name__
__module____qualname____annotations__     a/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/gateway/platforms/korean_humanizer.pyrR   rR      s    L!!Nr]   rR   c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)	HumanizeDocumentrS   surfacerV   tuple[str, ...]linesztuple[ProseSlot, ...]rP   NrW   r\   r]   r^   r`   r`      s    LN  r]   r`   c                  r    e Zd ZU dZded<   ded<   ded<   ded<   dZd	ed
<   dZd	ed<   dZded<   dZded<   y)CoachingGroundingzCThe exact bounded profile export accepted by the coaching pipeline.tuple[tuple[str, str], ...]approved_principlesverified_memoryrS   playbook_idplaybook_versionr\   rb   r4   r5    decision_idr3   N)	rX   rY   rZ   __doc__r[   r4   r5   rl   r3   r\   r]   r^   re   re      sH    M4400*,,)++K#%S%r]   re   c                      e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   y)CoachingPipelineReceiptz7Non-sensitive bounded receipt for one pipeline attempt.rS   ra   7Literal['canonical', 'coached', 'coached_and_polished']outcomerb   principle_idsmemory_keysri   rj   boolcoach_validpolish_validoutput_sha256r\   atom_idsvariant_idsrk   r3   canonical_sha256r4   r5   rl   N)rX   rY   rZ   rm   r[   rx   ry   r3   rz   r4   r5   rl   r\   r]   r^   ro   ro      s    ALDD""   "Ho"#%K%#%S%c*,,)++Kr]   ro   c                      e Zd ZU dZded<   ded<   ded<   dZded<   d	Zd
ed<   dZd
ed<   dZded<   e	dd	 	 	 	 	 dd       Z
y)DailyGroundingInputz<Closed projection of a finalized personal check-in snapshot.rf   factsrh   rS   r3   rk   rz   r   rb   r4   r    r5   N
str | Nonecustomer_keyrV   c               h   t        |      t        urt        d      h d}t        |      |z
  rt	        d      |j                  d      }t        |      t        urt        d      h dh dt        fd|D              rt	        d	      g }t        d
hz  t        |      z        D ]  }||   }t        |t              st        |t        t        t        f      sA|dk(  r1t        |t              r!t        |      }|r|j                  ||f       it        d      dj!                  t        |      j#                               j%                         }|s|j                  ||f        |j                  dd      }	|j                  dd      }
|	t        |	t              st        d      |
t        |
t              st        d      |t        |      t        urt        d      t'        |      }||n
t)        |      }t+        |      }t)        |||d      } | t-        |      d||      S )Nz+finalized snapshot must be an exact mapping>   flowbranchanswerskst_daydetailedfollow_up_idsz.finalized snapshot contains unsupported fieldsr   z&finalized snapshot answers are invalid>   painmacroscalories	condition	digestion	intensity
bodyweight
completionperformancesleep_qualitytraining_plansleep_durationworkout_qualitytraining_summary>   mealswateroperator_noteoptional_noteappetite_stressc              3  2   K   | ]  }|vxr |v  y wNr\   ).0key	free_textknowns     r^   	<genexpr>z>DailyGroundingInput.from_finalized_snapshot.<locals>.<genexpr>   s$     LGSs%8Cy$88Gs   z5finalized snapshot answers contain unsupported fieldsr   r   z*finalized snapshot fact has the wrong type r   rk   r   z"finalized snapshot flow is invalidz!finalized snapshot day is invalidz,finalized snapshot canonical text is invalid)snapshotr}   rz   r\   )typedict	TypeErrorset
ValueErrorgetanysorted
isinstancert   rS   intfloatr   _compact_macro_mappingappendjoinsplitstrip_binding_projection_binding_digest_sha256tuple)clsr   rV   allowedr   r}   r   valuecompactr   daysnapshot_projectioncanonical_valuerz   bindingr   r   s                  @@r^   from_finalized_snapshotz+DailyGroundingInput.from_finalized_snapshot   s    >%IJJWx=7"MNN,,y)=$DEE

 \	LGLLTUU')5G9,G<=CCLE%&jc5@Q.R(?z%'A4U;Gc7^4 LMMhhs5z//1288:Gc7^, > ||FB'll9b)JtS$9@AA?:c3#7?@@ T)_C%?JKK1(; $  !45 	
 #?3!/$4
 5<W.>??r]   )r   objectrV   r~   returnz'DailyGroundingInput')rX   rY   rZ   rm   r[   rz   r4   r5   r   classmethodr   r\   r]   r^   r|   r|      sz    F&&00  c*<<)HH#L*#
 !%	9@9@ 	9@
 
9@ 9@r]   r|   c                      e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   dZded<   edddddd	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	y)WeeklyGroundingInputz8Closed projection of a code-built weekly report summary.rf   r}   rh   rS   r3   Nr~   r   r   rb   r4   r    r5   )r   r3   prior_summaryplanprofilec          
        h d}t        t              r&t              |z
  rt        d      j                  ndfd	g }d}	|	D ]  \  }
}t        fd|D        d       }|t        |t        t        t        t        f      st        |t              rt        d      dj                  t        |      j                               j                         }|s|j                  |
|f        g }t        |      dk\  r|j                  d	        d
      }t        |t              rC|j                         r3|j                  d
dj                  |j                               d d f       |xs; t!        |xs dt#              t#        |      t#        |      t#        |      ||d      }t$        j'                  |      st        d       | t        |      t        |      ||      S )N>   ends_onr)   judgment	starts_onr(   r   change_percentr&   r9   average_weight_kgcheckin_rate_percentweekly_change_percentweight_change_percentprior_average_weight_kgweekly_weight_change_percentz*weekly summary contains unsupported fieldsc                    t        | |      S r   )getattr)namedefaultsummarys     r^   <lambda>z3WeeklyGroundingInput.from_summary.<locals>.<lambda>.  s    w0Or]   ))r   )r   )r   )r   )r   )r   r   r   r   )r   )r   )r(   )r(   )r   )r   r)   )r&   )r&   r   c              3  @   K   | ]  } |       |        y wr   r\   )r   r   getters     r^   r   z4WeeklyGroundingInput.from_summary.<locals>.<genexpr>:  s     U54F4L<T&,5s   z&weekly summary fact has the wrong typer      )r:   +   주간 평균과 이전 평균을 비교함r9   P   rk   )r   r   r   r   r   r}   rh   z)weekly revision binding digest is invalidr   )r   r   r   r   r   nextlistr   rt   r   r   rS   r   r   r   lenr   r   
_DIGEST_RE	fullmatch)r   r   r   r3   r   r   r   r   r}   aliasesr   namesr   r   memory	next_timer   r   s    `               @r^   from_summaryz!WeeklyGroundingInput.from_summary  s   
 gw'7|g% !MNN[[FOF')
 "JCU5UW[\E}%'4!<=ESWAX HIIhhs5z//1288:Gc7^, " )+u:?MM`a,-	i%)//*;MM,chhy7H.I#2.NOP) 

_ , 2.w7!4]!C+D1.w7#)
.
 ##G,HII5<vFFr]   )r   r   r   r~   r3   r~   r   object | Noner   r   r   r   r   z'WeeklyGroundingInput')
rX   rY   rZ   rm   r[   r   r4   r5   r   r   r\   r]   r^   r   r     s    B&&00  #L*#*==)HH 
 $(.2'+"!%<G<G !	<G
 ",<G %<G <G <G 
 <G <Gr]   r   c                      e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   dZded<   dZded<   e	dddd       Z
y)AdaptiveGroundingInputz=Closed projection of an adaptive operator card's typed facts.rf   r}   rh   rS   r3   Nr~   r   r   rb   r4   r    r5   rk   rl   )r   c          	        ddl m} 	 ddlm} |t        |      t        urt        d      t        |      |urt        d      t        }	 t        d  ||      D              }||k7  st        |      st        d	      g }|D ]  }	|	d
v rt        ||	      }
|
|	t        v rt        d      t        |
      t        u r|
rdnd}n^t        |
      t        t         t"        hv rt        |
      }n6t        |
      t        u r	 t%        j&                  |
dd      }nt        d      |j+                  |	|d d f        |j,                  } | t        |      d|||j.                  |j0                  |j2                        S # t        t
        f$ r}t        d      |d }~ww xY w# t        t        f$ r}t        d      |d }~ww xY w# t        t        t(        f$ r}t        d      |d }~ww xY w)Nr   fieldsr   AdaptiveCoachingFactsz'adaptive card facts type is unavailablez(adaptive customer key has the wrong typez5adaptive card facts must be an exact typed projectionc              3  4   K   | ]  }|j                     y wr   r   r   fields     r^   r   z3AdaptiveGroundingInput.from_card.<locals>.<genexpr>p  s     V8Uu

8U   z*adaptive card facts contain invalid values>   r1   r5   r4   r3   z%adaptive card fact has the wrong typetruefalseF,:ensure_ascii
separators   r\   )dataclassesr   nutrition_coachingr   ImportErrorAttributeErrorr   r   rS   _ADAPTIVE_FIELD_NAMESr   r   _valid_adaptive_fact_valuesr   _ADAPTIVE_OPTIONAL_FIELDSrt   r   r   jsondumpsUnicodeEncodeErrorr   r3   r4   r5   r)   )r   r}   r   r   r   excexpected_fieldsfact_fieldsvaluesr   r   textr   s                r^   	from_cardz AdaptiveGroundingInput.from_cardb  s    &	PA #\(:#(EFGG;33STT/	^V?T8UVVK /)1LU1SIJJ(*#DppE4(E}44 GHHE{d"!&vGec5 115ze%V::e%JWD   GHHMM4ds,-' $* //&M$$##NN
 	
K ^, 	PEFCO	P :& 	^STZ]]	^* ":/AB V#$KLRUUVsG   E; F >G;F
FFF>-F99F>G&G!!G&)r}   r   r   r~   r   z'AdaptiveGroundingInput')rX   rY   rZ   rm   r[   r   r4   r5   rl   r   r  r\   r]   r^   r   r   V  sV    G&&00  #L*#*@@)HHKDH 2
 2
r]   r   c                Z  
 	 ddl m} ddlm} t        |       |ury	 t        d  ||      D              t        k7  ryt        | j                        syt        | j                        t        us| j                  dvryt        j                  d      
| j                  }t        |      t        us"t!        |      d	k7  st#        
fd
|D              ryt$        D ]5  }t'        | |      }|t        |      t        us
j)                  |      r5 y t+        | j,                  d      sy| j.                  }t        |      t        us@t!        |      dkD  s2t!        t1        |            t!        |      k7  st#        d |D              ryt        | j2                        t4        uryt        | j6                        t        us| j6                  dvryt        | j8                        t        us| j8                  dvryt        | j:                        t        ust<        j)                  | j:                        rdt        | j>                        t        usIt<        j)                  | j>                        r*t        | j@                        tB        us| j@                  dk  rytE        | jF                        rtE        | jH                        sy| jJ                  }t        |      t        ust!        |      dkD  ryt1               }|D ]g  }	t        |	      t        us>t!        |	      d	k7  s0t        |	d         t        us|	d   dvs|	d   |v stE        |	d         s y|jM                  |	d          i t        | jN                        t        u xry | jN                  dk(  xrh t        | jP                        t        u xrK | jP                  dk(  xr: tS        d | jN                  D              xr tS        d | jP                  D              S # t        t
        f$ r Y yw xY w# t
        tT        tV        tX        f$ r Y yw xY w)Nr   r   r   r   Fc              3  4   K   | ]  }|j                     y wr   r   r   s     r^   r   z._valid_adaptive_fact_values.<locals>.<genexpr>  s     G)F)Fr   >   unknownfat_lossmaintenancelean_mass_gainz[+-]?\d+(?:\.\d+)?r   c              3  p   K   | ]-  }t        |      t        uxs |xr j                  |        / y wr   )r   rS   r   )r   r   scalars     r^   r   z._valid_adaptive_fact_values.<locals>.<genexpr>  s=      'E U3&Q5+P9I9I%9P5PQ's   36Tallow_known   c              3     K   | ]D  }t        |      t        uxs- t        j                  |       xs t        j                  |       F y wr   )r   rS   _OPAQUE_ID_REr   _IDENTITY_LEAK_REsearchr   r   s     r^   r   z._valid_adaptive_fact_values.<locals>.<genexpr>  sS       %E U3& 3$..u553$++E23 %s   A
A>   heldpendingapproved>   enabledrevokeddisabledsent_auditednot_delivereddelivery_unknown   >   lowhighmediumr   r    c              3  >   K   | ]  }t        |      t        u   y wr   r   rS   r  s     r^   r   z._valid_adaptive_fact_values.<locals>.<genexpr>  s     M4L5DK3&4L   c              3  >   K   | ]  }t        |      t        u   y wr   r-  r  s     r^   r   z._valid_adaptive_fact_values.<locals>.<genexpr>  s     L4K5DK3&4Kr.  )-r   r   r   r   r  r  r   r   r  _valid_iso_dater&   r'   rS   recompiler(   r   r   r  r   r   _valid_safe_decision_idr)   r*   r   r.   rt   r/   r0   r1   r   r3   r2   r   _valid_macro_pairsr+   r,   r-   addr4   r5   allr   r   OverflowError)r}   r   r   r(   r   r   reasonscycles
categoriesitemr  s             @r^   r  r    s   &= E{//ZG0E)FGGK``u334 +u G
 0
 12%%
E):!# ' 
 -DE4(E U3&f.>.>u.E . 'u~~4H++M&7|a3w< CL0  %	  !!"$.$$%S0E4H4H Q
 5
 $$%S0E4H4H Q
 5
 &&'s2''(=(=>E112#=''(E(EFENN#3.~~!"5#8#89%e&9&9:,,<u$Fa"u
DT
%'t9>Q=+7";;7j()$q'2NN47#  ))*e3 M((,BBMU,,-6M ''+JJM ME4L4LMM	M
 LE4K4KLL	
k ( z Iz=A s   O9 P P )P >AP P +"P P P )AP P #)P )P 7BP *P +P -AP B+P 9P
PP*)P*c                d   h d}t        |       t        ust        |       dkD  ryt               }| D ]}  }t        |      t        usTt        |      dk7  sFt        |d         t        us2|d   |vs+|d   |v s$t        |d         t
        us|d   dk  s|d   dkD  r y|j                  |d           y)	N>   fat_gcarbs_gr   	protein_gcalories_kcal   Fr   r   r   i'  T)r   r   r   r   rS   r   r5  )r   r   keysr;  s       r^   r4  r4    s    LGE{%3u:>UDJe#4yA~DG}C'Awg%Aw$DG}C'Aw{Awa  r]   c                    t        |       t        ust        j                  |       y	 t	        j
                  |        y# t        t        t        f$ r Y yw xY w)NFT)	r   rS   _ISO_DATE_REr   _datefromisoformatr   r   r7  r   s    r^   r0  r0    sT    E{#!7!7!>!FE"  z=1 s   ? AAc                &   t        |       t        ust        j                  |       y	 t	        j
                  | j                  d      r| d d dz   n|       }|j                  d uxr |j                         d uS # t        t        t        f$ r Y yw xY w)NFZz+00:00)r   rS   _ISO_DATETIME_REr   	_datetimerF  endswithtzinfo	utcoffsetr   r   r7  )r   parseds     r^   _valid_iso_datetimerQ    s    E{#!1!;!;E!B!J((%..QTBUsh)>[`a}}D(KV-=-=-?t-KKz=1 s   AA9 9BBFr  c                   t        |       t        us| rt        |       dkD  ryt        j	                  |       st
        j                  |       yt        j                  |       ry|xr | dv S )N@   FT>   observemaintainhuman_reviewcalorie_adjustment_candidatemacro_redistribution_candidate)r   rS   r   r  r  r  r   _SAFE_DECISION_RE)r   r  s     r^   r3  r3  &  sh    E{#Uc%j2o&-*A*A%*H*P""5) 5 %  r]   c                4   | dk(  r|dk(  S | dk(  rt         j                  |      d uS | dk(  rt        |      S | dk(  rt        |      S | dk(  r|dv S | dv rt	        j                  d	|      d uS | d
k(  rt        |d      S | dk(  r|dv S | dk(  r|dv S | dk(  r|dv S y)Nr:   r   r;   r9   r&   r'   >   r  r  r  r  >   r(   r6   r7   r8   z3[+-]?\d+(?:\.\d+)?(?:~[+-]?\d+(?:\.\d+)?)?%?(?:kg)?r)   Tr  r.   >   r   r   r/   >   r  r   r!  r0   >   r"  r#  r$  r%  r&  r'  F)_MEMORY_ID_REr   rQ  r0  r1  r3  r   r   s     r^   _valid_memory_valuer]  6  s    
##EEE
++&&u-T99
"5))
u%%
kPPP
II||B
  	 j&u$??
m)))
777
 
 
 	
 r]   c                   t        |       t        ust        |       dkD  ryt               }| D ]  }t        |      t        usHt        |      dk7  s:t        |d         t        us&|d   t
        vs|d   |v st        |d         t        ur y|\  }}|rW||j                         k7  sDt        |      dkD  s6t        j                  |      s!t        j                  |      st        ||      s y|j                  |        y)Nr  Fr   r   r   r   T)r   r   r   r   rS   _MEMORY_KEYSr   _CONTROL_REr  r  r]  r5  )r   seenr;  r   r  s        r^   _valid_verified_memoryrb  X  s    E{%3u:>UDJe#4yA~DG}C'Awl*Aw$DG}C'	Ttzz|#4y2~!!$' ''-&sD1) * r]   c                V    t        |       t        u xr t        j                  |       d uS r   )r   rS   r   r   rG  s    r^   _valid_digestrd  t  s&    ;#I*"6"6u"=T"IIr]   c                8    t        |       t        u xr | t        v S r   )r   rS   	_SURFACES)ra   s    r^   _valid_surfacerg  x  s    =C8Gy$88r]   c                j    t        |       t        ury	 | j                  d       y# t        $ r Y yw xY w)NFutf-8T)r   rS   encoder  r   s    r^   _valid_canonicalrk  |  s=    Ic!!   s   & 	22c           
       	 t        | t              rt        |t              s@t        t        |       t        |      t        t        |      j	                               d      S t        |j	                               	g }| dk(  r0|j                  t        	t        	      t        	d                   n| dk(  rOt        	d      }|j                  t        	t        	      |             |U|j                  t        	|             n9| dk(  r4t        	d      }|&|j                  t        	|t        	d                   g }t        |      D ][  \  }}d	j                  	fd
|D              j                         }|s1t        |      s=|j                  t!        d| ||             ] t        | |	t        |            S )zNSelect only prose paragraphs; facts, actions, headings, and state stay locked.r\   r   r   r   r   r   r   r   
c              3  (   K   | ]	  }|     y wr   r\   )r   indexrc   s     r^   r   z#prepare_document.<locals>.<genexpr>  s     95%u5s   slot_)r   rS   r`   r   
splitlinesextend_between_last_fact_line_line_index_line_index_prefix_paragraphs_after_actions	enumerater   r   _is_editable_textr   rR   )
ra   rV   indexesr   reviewrP   ordinalgroupr  rc   s
            @r^   prepare_documentr~    sx   gs#:i+EGc)neC	ND]D]D_>`bdee)&&()E%'G'xu'={5Rb?cde	H	%e-ABxu'=xHINN4UHEF	'	'UO4NN8E6;uF|3}~E#G,yy9599??A%d+LLU7)#4eTBC - GYuU|DDr]   c                    d}d| j                   | j                  D cg c]  }|j                  |j                  d c}ddddgid}|t	        j
                  |dd	
      fS c c}w )z@Build the legacy one-stage prose request kept for compatibility.u|  당신은 한국어 코칭 문구의 문체 편집자입니다. 사실이나 판단을 추가하지 말고, 주어진 문장의 의미만 자연스러운 존댓말로 다듬으세요. 번역투, 기계적인 보고서체, 같은 종결어미 반복을 줄이되 숫자·날짜·결정·행동·안전 문구는 바꾸지 마세요. 반드시 JSON 객체 하나만 반환하세요.zdualcoach-korean-humanizer-v1idr  rP   zslot idu   윤문한 한국어)schema_versionra   rP   response_schemaFr   r   )ra   rP   rT   rV   r  r  )documentsystemslotpayloads       r^   build_requestr    su    	;  :##KS>>Z>4t~~>>Z#Y@U&V%WX	G 4::gEjQQQ [s    A#c                   t        |       rt        |      rt        ||       st        d      t	        | |      }|j
                  st        d      t        j                  |j                        }|t        d      t        ||      }d}dd| |j                  |j                  d|j                  D cg c]
  \  }}||d c}}|j                  D 	
cg c]
  \  }	}
|	|
d c}
}	|j
                  D cg c]Z  }|j                  t        |      |j                  D cg c]  }|d	   	 c}t        |j                  |j                  d
            d\ c}}d|j
                  D cg c]  }|j                  t        |      dgdgd  c}id}|t!        j"                  |dd      fS c c}}w c c}
}	w c c}w c c}}w c c}w )zEBuild the finite-ID stage-one request from an exact grounding export.z)bounded coaching grounding is unavailablez coaching playbook is unavailableu  당신은 승인된 한국어 코칭 초안의 의미 선택기입니다. 자유 문장, 숫자, 행동, 시점, 안전, 승인 또는 전달 상태를 만들지 마세요. 각 slot의 id와 hard_identity를 응답에 한 글자도 바꾸지 말고 반드시 그대로 복사하세요. 그 뒤 제공된 principle_ids와 atom_ids만 순서대로 선택해 JSON 객체 하나만 반환하세요.zdualcoach-finite-coaching-v1coach)r  versionr  r\  r   r\   )r  hard_identityoffered_principle_idsoffered_atom_idsrP   approved_id
offered_id)r  r  rr   rx   )r  stagera   playbookrg   rh   rP   r  Fr   r   )rg  rk  _valid_groundingr   r~  rP   
_PLAYBOOKSr   ri   _offered_atomsrj   rg   rh   rT   _hard_identityr   r  r  )ra   rV   	groundingr  r  offeredr  principle_idr  r   r   r  r;  r  s                 r^   build_coaching_requestr    s    7#	*	73DEE3H>>DEE~~i334H;<<Xx0G	e  9$00Y=W=WX '0&C&C 
&C"d  .&C 

 <E;T;T
;TZS%C%(;T
 !
 ' ll!/!5>G>[>[)\>[d$q'>[)\$(T\\2)F$G	 '
  %NN +D ,,%3D%9&3_!-	 +

+ GB 4::gEjQQQ9 

 *]	
s*   5F+F17(F<F7++F<(#G7F<c                   | j                   r-t        |t              rt        |j	                  d            dkD  r| j
                  S 	 t        j                  |      }t        |t              r"t        |      dhk7  st        |d   t              s| j
                  S | j                   D cg c]  }|j                   }}i }|d   D ]  }t        |t              rt        |      ddhk7  r| j
                  c S |j                  d      |j                  d      }}t        |t              rt        |t              r||v r| j
                  c S |j!                         ||<    t        |      |k7  r| j
                  S t#        t$        j'                  | j
                              }	g }
| j                   D ]b  }||j                     }t)        |j
                  ||	| j
                        s| j
                  c S |
j+                  ||j-                         f       d t        | j.                        }t1        |
      D ]+  \  }}|j2                  d   |j2                  d   }}||||dz    - d	j5                  |      }t7        | |      r|S | j
                  S # t        t        t        j                  f$ r | j
                  cY S w xY wc c}w )
zMApply a legacy prose response only when every deterministic invariant passes.ri  i   rP   r  r  r   rJ  r   rm  )rP   r   rS   r   rj  rV   r  loadsr   r   JSONDecodeErrorr   r   r   rT   r   r   r   
_NUMBER_REfindall_valid_candidater   rq  rc   reversedrU   r   _locked_lines_preserved)r  responserP  r  expected_idsreceivedr;  rT   r  allowed_numbers	validated	candidaterenderedreplacementfirstlastresults                    r^   apply_responser    sd   >>Hc!:c(//RYBZ>[^c>c!!!"H% fd#s6{wi'?zRXY`RacgGh!!!-5^^<^TDLL^L<!Hw$%TtVn)D%%%(8'3'z$/DS[H[%%% JJL   H~%!!!j001C1CDEO35IT\\*		?HL^L^_%%%$	 4 4 678	  HNN#H%i0k''*D,=,=b,At%0" 1 YYx F,Xv>6VHDVDVV; z4#7#78 "!!!" =s   J (J<*J98J9)processing_allowedr3   c               V   t        |       }t        |      }|xr |xr t        ||       }|xr/ t        |      t        u xr t        |      xr ||j                  k(  }	t        |      }
|du xs t        |      }|r
|r|r|	r|
r|s|t        | ||ddd      fS t        | |      }t        |      }|}t        | ||ddd||      }|j                  r|t        |      s||fS 	 t        | ||      \  }} |||      }t        |||      }|||fS t!        ||      }|||fS t#        d |D              }t#        d |D              }|t        |      s||fS 	 t%        ||||      \  }} |||      }t'        |||      }|t)        |||      n|}|duxr |du}|r||n|}|t        |      s||fS t        | |||rdndd	||t#        |xs d      |||      }||fS # t        $ r ||fcY S w xY w# t        $ r/ |t        |      s||fcY S t        | ||dd	d||||

      }||fcY S w xY w)zIRun finite coaching stages only for an exact, externally bound grounding.NrV   Frq   ru   rv   rq   ru   rv   r3   rz   c              3  6   K   | ]  \  }}}|D ]  }|   y wr   r\   )r   _atomsatoms       r^   r   z#coach_and_polish.<locals>.<genexpr>W  s     JZkaEEDTETZ   c              3  6   K   | ]  \  }}}|D ]  }|   y wr   r\   )r   r  
principles	principles       r^   r   z#coach_and_polish.<locals>.<genexpr>X  s"     cJ(8:qXb9)Xb)Jr  coachedT)rq   ru   rv   rx   rr   r3   rz   coached_and_polishedr\   )rq   ru   rv   rx   ry   rr   r3   rz   )rg  rk  r  r   rS   rd  r3   callable_receiptr~  r   rP   _gater  	Exception_parse_stage_one_render_coachingr   _build_polish_request_parse_stage_two_render_polished)ra   rV   r  requestr  r3   valid_surfacevalid_canonicalvalid_groundingvalid_bindingvalid_requestvalid_processing_gater  canonical_digestr   base_receiptr  userstage_one_response
selectionscoachingrx   rr   polish_systempolish_userstage_two_responsereceiptvariantspolishedrv   r  s                                  r^   coach_and_polishr    s    #7+M&y1O#``<LYX_<`O 	I()S0	I12	I $y'H'HH	  W%M.$6V(CU:V!(
 
 	
  3Hy)%G ')	L NN*59K3L,&&'-gy)L$VT2 "(I7IJJ,&&*5H,&&JZJJHcJccM%e4F.G,&&!%:8XyZd%e"{$]K@"  )5GHHAIAU(H=[cH4'@HD,@L%(*>XHF%e4F.G,&&*6&I!(.b)# ')G 7?g  ',&&'   !)%8J2Kl**'$+-
   !s*   #G G0 G-,G-0H(H('H(c                n   d}dd| j                   |t        t        j                  | j                              t        dj                  t        |                   |d| j                  D cg c]  }|j                  |j                  d c}|ddd	gd
d}|t        j                  |dd      fS c c}w )Nu=  당신은 검증된 한국어 코칭 판단의 윤문자입니다. 각 슬롯의 의미와 모든 숫자를 그대로 유지하면서 자연스럽고 따뜻한 존댓말로 자유롭게 다듬으세요. 새로운 사실·판단·행동·수치·의료 의미를 만들지 말고 JSON 객체 하나만 반환하세요.zdualcoach-finite-polish-v2polishrm  )number_tokenslocked_line_digestrecommendation)r  validated_coach_textslot_0z2free Korean rewrite preserving meaning and numbers)r  polished_text)r3   rP   )r  r  ra   r3   locked_constraintsrP   r  Fr   r   )ra   r   r  r  rV   r   r   _locked_line_valuesrP   rT   r  r  )r  r3   locked_recommendationr  r  r  s         r^   _build_validated_polish_requestr    s    	s  7###:!*"4"4X5G5G"HI")		-h78# 4
 !

 ' ll(, '
 (? #%Y
'G: 4::  #
s   + B2c           
        t        |      }| j                  D cg c]  }|j                   }}|ddhndh}|Qt        |      |k7  sC||j	                  d      |k7  s-t        |d   t              rt        |d         t        |      k7  ry g }t        |d   | j                        D ]  \  }	}t        |	t              r|	j	                  d      |j                  k7  r y t        |	      ddhk(  r|	j	                  d      }
t        |
      t        usIt        |j                  |
t        t        j!                  |j                              | j                  |      s y |j#                  |
df        y  t%        |      S c c}w )Nr3   rP   r  r  free_polish_v2)_parse_json_objectrP   rT   r   r   r   r   r   zipr   r   rS   r  rV   r   r  r  r   r   )r  r  r3   r  rP  r  expectedexpected_keysr  r;  r  s              r^    _parse_validated_polish_responser    sq     )F)18H8 !, 
#G,Y  	v;-'!-

45&' &/40vg3x=0(*J&/8>>:
d4)xx~-t9//1IYs*'NNJ..t~~>?&&) y*:;<+ ;, S 9s   E<c                    t        | j                  |      D ci c]  \  }}|j                  |d    }}}t        | |      }|t	        | |      sy |S c c}}w Nr   )r  rP   rT   _render_slotsr  )r  r  r  	selectionreplacementsr  s         r^   _render_validated_polishr    sk      #8>>:>>OD) 	il">   X|4H6xJOs   A)r  r3   r  artifact_sinkc                  t        |       xrj t        |      xr] t        ||       xrO t        |      t        u xr< t        |      xr/ ||j                  k(  xr t        |      xr |du xs t        |      }|s|t        | ||ddd      fS t        | ||ddd|xs dt        |            }	t        | |      }
t        |      }||||	fS |
j                  r|t        |      s||	fS 	 t        |
|xs d|      \  }} |||      }t!        |
||xs d|      }|t#        |
|      nd}||/t        |      s$| |t        |      t        u r|nddd	       ||	fS | |t        |      t        u r|nddd	       |t        | ||d
ddt%        d |D              |xs dt        |      	      fS # t        $ r | |ddd	       ||	fcY S w xY w)zEFreely polish validated Coach copy without changing facts or numbers.NrV   Fr  r  Trk   r  )raw_polish_outputrv   r  c              3  &   K   | ]	  \  }}|  y wr   r\   )r   r  sources      r^   r   z#polish_validated.<locals>.<genexpr>n  s     =*YQ&*   )rq   ru   rv   ry   r3   rz   )rg  rk  r  r   rS   rd  r3   r  r  r   r~  _normalized_recommendationrP   r  r  r  r  r  r   )ra   rV   r  r  r  r3   r  r  validbaser  normalized_recommendationr  r  r  r  r  s                    r^   polish_validatedr    s    	w 	
Y'	
Y0	
 ()S0	
 12		

 $,,-	
 W	
 $& ,*+ 
 (
 
 	
  7 =2 +	D  3H :! 	)%-$NN*,- $6#)r%

 64( 2%2!	J ! 	!:6  	*,- $ %)Nc$9t$)	 $  !%X# 5H4 $		
 X&=*== 7 =2 +
 
 
]  $)-$) $s   *F/ /GGc                    t        | |      }|j                  s|S t        |      \  }}	  |||      }t	        ||      S # t        $ r |cY S w xY w)z=Compatibility wrapper for the original one-call prose editor.)r~  rP   r  r  r  )ra   rV   r  r  r  r  r  s          r^   humanizer  t  sb      3H>> *LFD64( (H--  s   	? AAc                   t         |j                     }|D cg c]3  \  }}}|t        | ||      t        |d   j	                  |d            d5 }}}}d}	dd| j
                  t        t        j                  | j                              t        dj                  t        |                   d|d	d
ddgid}
|	t        j                  |
dd      fS c c}}}w )Nr  r\   )r  draftoffered_variant_idsu   당신은 승인된 한국어 코칭 초안의 표현 선택기입니다. 초안의 사실과 의미를 바꾸지 말고 제공된 variant_id 하나씩만 선택해 JSON 객체 하나만 반환하세요.zdualcoach-finite-polish-v1r  rm  )r  r  rP   r  offered_variant_id)r  
variant_id)r  r  ra   r  rP   r  Fr   r   )r  ri   _slot_text_from_renderedr   r   ra   r  r  rV   r   r   r  r  r  )r  r  r  r  r  rT   _principles_atomsr  r  r  s              r^   r  r    s     )//0H -7 -7(G[&	 -h'J#'(<(@(@"(M#N	

 -7  	n 
 7##!*"4"4X5G5G"HI")$))4G4Q*R"S
 #XEY&Z%[\
G 4::gEjQQQ/s   8Cc                L   t        |      }| j                  D cg c]  }|j                   }}|<t        |      dhk7  s-t	        |d   t
              rt        |d         t        |      k7  ry t        | t        |j                           g }t        |d   |      D ]  \  }t	        |t              s y t        |      h dk7  r y |j                  d      k7  r y |j                  d      }|t        t        fd| j                  D                    k7  r y |j                  d      }	|j                  d      }
t	        |	t
              rt	        |
t
              s y t        d g |	|
D              r y t!        |	      }t!        |
      |j"                  D ch c]  \  }}|	 c}}|rt        t        |            t        |      k7  srt        fd	|D              s^t        t                    t              k7  s>r<t        fd
D              s't!        fdj                  d      D              k7  r y |j%                  |f        t        |      t        |      k7  s|D cg c]  }|d   	 c}|k7  ry t!        |      S c c}w c c}}w c c}w )NrP   >   r  rx   r  rr   r  r  c              3  B   K   | ]  }|j                   k(  s|  y wr   rT   r   r  rT   s     r^   r   z#_parse_stage_one.<locals>.<genexpr>  s!     /kSWS_S_cjSj   rr   rx   c              3  >   K   | ]  }t        |t                 y wr   )r   rS   r  s     r^   r   z#_parse_stage_one.<locals>.<genexpr>  s     M7Le:eS))7Lr.  c              3  &   K   | ]  }|v 
 y wr   r\   )r   
identifierallowed_principless     r^   r   z#_parse_stage_one.<locals>.<genexpr>  s     Z/J:%77/   c              3  F   K   | ]  }|j                  d       v  yw)r\   N)r   )r   r  r  rT   s     r^   r   z#_parse_stage_one.<locals>.<genexpr>  s$     [PZ*:W[["%==PZs   !c              3  ,   K   | ]  }|v s|  y wr   r\   )r   r  
atom_tuples     r^   r   z#_parse_stage_one.<locals>.<genexpr>  s     g2JJj\fNfZ2Js   	r\   r   )r  rP   rT   r   r   r   r   r  r  ri   r  r   r   r  r   r   r   rg   r   )r  r  r  rP  r  r  r  r;  supplied_hardr  r  principle_tupler  r  r  r  r  rT   s                 @@@@r^   r  r    sG   
  )F)18H8v;7)#&/40vg3x=0Xz)2G2G'HIGCEHVG_h7g$(t9LL88D>W$1N4/k/k+kllXXo.
$*d+:eT3JM7L7Le7LMM
+5\
>G>[>[\>[]Zj>[\3'(C,@@Z/ZZ3z?#s:6[PZ[[g'++gr2Jggkuu/:>?; 8< 8}H%h)Ghd$q'h)G8)S?U 98 ] *Hs   J J8J!c                   t        |      }| j                  D cg c]  }|j                   }}|<t        |      dhk7  s-t	        |d   t
              rt        |d         t        |      k7  ry t        |j                     d   }g }t        |d   |      D ]  \  }}	t	        |t              rt        |      ddhk7  r y |j                  d      |	k7  st	        |j                  d      t              s y |d   }
|
|j                  |	d      vr y |j                  |
        t        |      t        |      k7  ry t        |      S c c}w )NrP   r  r  r  r\   )r  rP   rT   r   r   r   r   r  ri   r  r   r   rS   r   r   )r  r  r  rP  r  r  variants_by_slotr  r;  rT   variants              r^   r  r    s*   )F)18H8v;7)#&/40vg3x=0!)"7"78DHVG_h7g$(CI$9M,M88D>W$Jtxx7Ms,S|$*..w;;  8 8}H%?+ 9s   Ec           
       	 i }|D ]  \  	}}|D cg c]  }t         j                  |d       }}dj                  d |D              j                         }|s y t	        	fd| j
                  D        d       }|Ht        |j                  |t        t        j                  |j                              | j                        s y ||	<    t        | |      S c c}w )Nrk   r   c              3  &   K   | ]	  }|s|  y wr   r\   r   r;  s     r^   r   z#_render_coaching.<locals>.<genexpr>  s     7$s   c              3  B   K   | ]  }|j                   k(  s|  y wr   r
  )r   r  rT   s     r^   r   z#_render_coaching.<locals>.<genexpr>  s      _9)BSBSW^B^Yr  )
_ATOM_TEXTr   r   r   r   rP   r  rV   r   r  r  r  )
r  r  r  r  rx   atom_idtextsr  r  rT   s
            @r^   r  r    s     $&L*4&h<DEH,HExx777==?__aef</NNJ&&t~~67	 
  $W +5 <00 Fs   Cc           
        t        | j                  |      D ci c]&  \  }}|j                  t        j	                  |d      ( }}}t        d |j                         D              ry t        | |      }|y | j                  D ][  }||j                     }t        |j                  |t        t        j                  | j                              | j                        r[ y  |S c c}}w )Nrk   c              3  "   K   | ]  }|  	 y wr   r\   r  s     r^   r   z#_render_polished.<locals>.<genexpr>  s     
8"7u9"7s   )r  rP   rT   _VARIANT_TEXTr   r   r  r  r  rV   r   r  r  )r  r  r  r  r  r  r  r  s           r^   r  r  	  s     !::MD' 	m''44:   
8,"5"5"7
888\2F~"4<<0WZEWEWX`XjXjEk=lnv  oA  oA  B  Ms   +C$c                n   t        | j                        }t        | j                        D ]i  }|j	                  |j
                        }t        |t              s y |j                         }|s y |j                  d   |j                  d   }}||||dz    k dj                  |      }t        | |      sy |S )Nr   rJ  r   rm  )r   rc   r  rP   r   rT   r   rS   rq  rU   r   r  )	r  r  r  r  r  rc   r  r  r  s	            r^   r  r    s    HNN#H("&&t||4+s+&&(''*D,=,=b,At%*" ) YYx F"8V4Mr]   c                
   t        | t              r| sy 	 t        | j                  d            dkD  ry t	        j
                  |       }t        |t              r|S d S # t        t        t        t        j                  f$ r Y y w xY w)Nri  i   )r   rS   r   rj  r  r  r   r   r  r  r   )r  rP  s     r^   r  r  ,  sw    h$Hxw'(50H%  -6747 z#5t7K7KL s   A A #BBc                   t        |       t        ury|t        |      sy	 | j                  }| j                  }| j
                  }t        |      t        ust        |      t        uryt        j                  |      }|||d   k7  st        |      r
|	|d   |k7  ry| j                  }t        |      t        usdt        |      cxk  rdk  sy yt               }|D ]  }t        |      t        ust        |      dk7  r y|\  }	}
t        |	      t        us>t        j                  |	      )|	|v s%|	t         vst        |
      t        us|
t"        |	   k7  r y|j%                  |	        t'        | j(                        sy| j*                  }| j,                  }t        |      t        ust        |      t        usdt        |      cxk  rdk  rzn ydt        |      cxk  rdk  rcn yt/        d	 g ||D              sIt        t        |            t        |      k7  s)t        t        |            t        |      k7  s	|t0        k7  ry||t2        |   k7  r!y|t        t2        j5                               vry| j6                  }t        |      t        ury|rt9        |d
      syy
# t:        t<        t>        t@        tB        f$ r Y yw xY w)NFr  ra      rA  r   r   r  c              3  p   K   | ].  }t        |      t        uxs t        j                  |      d u  0 y wr   r   rS   r  r   r  s     r^   r   z#_valid_grounding.<locals>.<genexpr>i  s@       1E U3& : **51T9:0   46Tr  )"r   re   rg  ri   rj   r3   rS   r  r   rd  rg   r   r   r   r  r   APPROVED_PRINCIPLE_IDSrN   r5  rb  rh   r4   r5   r   _SURFACE_RISKS_SURFACE_CLUSTERSr  rl   r3  r  KeyErrorr   r   r7  )r  ra   ri   rj   r   r  r  ra  r;  r  r  clustersrisksrl   s                 r^   r  r  8  s   I//>'#:C++$5533C'40@+A+L>>+.8I#66 )#(;w(F22

5(S_0I0I 1JDDz&#d)q.#JZ + **:6>%%;;:S(3J??HHZ   &i&?&?@//++N%'E{%'H**  E
'a'    1x0%0 
 3x=!S]23u:#e*,&,W55U#4#;#;#=>>++C'6{PTUHi]K sc   AJ( )4J( 1J( J( /J( AJ( (J( AJ( J( )A J( 
J( J( 9J( J( (K	K	c           
         |j                  di       }| j                  D ci c]2  }|j                  t        |j                  |j                  d            4 c}S c c}w )Nr  r\   )r   rP   rT   r   )r  r  by_slotr  s       r^   r  r    sK    ll7B'GKS>>Z>4DLL%DLL" =>>>ZZZs   7Ac                P    t        | j                   d| j                         d d S )N    )r   rT   rV   )r  s    r^   r  r    s(    dll^2dnn%567<<r]   c                    t        fd| j                  D              }|j                         }dj                  ||j                  d   |j                  d   dz          j                         S )Nc              3  B   K   | ]  }|j                   k(  s|  y wr   r
  r  s     r^   r   z+_slot_text_from_rendered.<locals>.<genexpr>  s     K4<<73Jr  rm  r   rJ  r   )r   rP   rq  r   rU   r   )r  r  rT   r  rc   s     `  r^   r  r    s_    KKKD!E99U4,,Q/$2C2CB2G!2KLMSSUUr]   r\   rk   )rx   ry   rr   r3   rz   c               4   t        |       xr3 t        |      xr& t        ||       xr t        |	      xr t        |
      }t        |       r| nd}t	        |      t
        u r|dv r|nd}|s9t        di d|ddddddd	dd
dddddddddddddddddddddS t        ||nt        d |j                  D                    }t        t        d |j                  D                    }t        |      }t        |      }t        di d|d|d|d|d	|j                  d
|j                  d|du d|du dt        |      d|d|dt        |	      r|	nddt        |
      r|
ndd|j                  d|j                  d|j                   S )Nrk   >   r  rV   r  rV   ra   rq   rr   r\   rs   ri   rj   ru   Frv   rw   rx   ry   r3   rz   r4   r5   rl   c              3  &   K   | ]	  \  }}|  y wr   r\   )r   r  r  s      r^   r   z_receipt.<locals>.<genexpr>  s     L.K]Zj.Kr  c              3  &   K   | ]	  \  }}|  y wr   r\   )r   r   r  s      r^   r   z_receipt.<locals>.<genexpr>  s     L2KQ2Kr  T)rg  rk  r  rd  r   rS   ro   _uniquer   rg   rh   ri   rj   r   r4   r5   rl   )ra   outputr  rq   ru   rv   rx   ry   rr   r3   rz   r  safe_surfacesafe_outcomeselectedrs   
safe_atomssafe_variantss                     r^   r  r    sp    	w 	,V$	,Y0	, 12	, *+ 
 -W572L"7ms2wBr7r7  yDL& 
 

 
 	

 
  
 
 
 
 
 
 %'
  
  "
 !
  !
 	
$ (A}Li.K.KLLH %L)2K2KLLMK"JK(M"    	
 )) #33  4' "T) fo  " <II`;a 7gi .;;K-L)RT %77 $55  ))! r]   c                    t        |       t        ust        d | D              ryt               }g }| D ])  }||vs|j	                  |       |j                  |       + t        |      S )Nc              3  p   K   | ].  }t        |      t        uxs t        j                  |      d u  0 y wr   r)  r  s     r^   r   z_unique.<locals>.<genexpr>  s9      (E 	U3H-"9"9%"@D"HHr*  r\   )r   r   r   r   r5  r   )r  ra  r  r   s       r^   r;  r;    sh    F|5 C (( % UDFHHUOMM%   =r]   c                4    	  |        du S # t         $ r Y yw xY w)NTF)r  )callbacks    r^   r  r    s&    zT!! s    	c                f    t        j                  | j                  d            j                         S )Nri  )hashlibsha256rj  	hexdigestrG  s    r^   r   r     s#    >>%,,w/0::<<r]   c                   t        | t              rBt        | j                         d       D ci c]  \  }}t	        |      t        |       c}}S t        | t        t        f      r| D cg c]  }t        |       c}S t        | t              rt        d | D        t              S t        |       rt        t        |             S t        | dd       }t        |      r	  |d      }t        |      S t        | t        t         f      r| j#                         S |  t        | t        t$        t&        t(        f      r| S t        |       S c c}}w c c}w # t        $ r  |       }Y t        |      S w xY w)Nc                    t        | d         S r  )rS   )pairs    r^   r   z%_binding_projection.<locals>.<lambda>  s    CQLr]   )r   c              3  2   K   | ]  }t        |        y wr   )r   r  s     r^   r   z&_binding_projection.<locals>.<genexpr>  s     CUT*40Us   
model_dumpr  )mode)r   r   r   itemsrS   r   r   r   r   reprr   r   r   r  r   rE  rL  	isoformatr   r   rt   )r   r   r;  rN  dumpeds        r^   r   r     sO   %! $EKKM7PQ
Q	T H)$//Q
 	
 %%'6;<ed#D)e<<%CUCNNE"6%=11d3J
	"V,F #6**%%+,  }
53UD*AB;+

 =  	"\F"6**	"s   E-E"	E E32E3c                    	 t        j                  t        |       ddd      }t        |      S # t        t        f$ r t        |       }Y t        |      S w xY w)NFTr   )r   	sort_keysr   )r  r  r   r   r   rQ  r   )r   encodeds     r^   r   r     sZ    **07eW[hrs 7 z" u+7s   "/ AAc                    g }dD ]V  }| j                  |      }t        |t        t        t        f      s0t        |t
              rA|j                  | d|        X dj                  |      S )N)carbohydrateproteinfatu   탄수화물u	   단백질u   지방r   u    · )r   r   rS   r   r   rt   r   r   )r   pairsr   raws       r^   r   r     s`    EXiincCe,-jd6KLLC5#( Y ;;ur]   c                    | j                   D ch c]  }|j                  D ]  }|  }}}t        | j                        D cg c]  \  }}||vs|j	                         s| c}}S c c}}w c c}}w r   )rP   rU   rx  rc   r   )r  r  ro  editablelines        r^   r  r    si    "*..P.$d>O>OU>O.HP$-hnn$=h$=[UDhAV[_[e[e[gD$=hh Qhs   A+A1A1#A1c                @    t        fdt        |       D        d       S )Nc              3  4   K   | ]  \  }}|k(  s|  y wr   r\   r   ir_  r   s      r^   r   z_line_index.<locals>.<genexpr>  s     D"2wq$dem"2s   r   rx  rc   r   s    `r^   ru  ru    s    D)E"2DdKKr]   c                @    t        fdt        |       D        d       S )Nc              3  L   K   | ]  \  }}|j                        s|  y wr   )
startswithrb  s      r^   r   z%_line_index_prefix.<locals>.<genexpr>!  s#     M"2wq$dooe6L"2s   $$rd  re  s    `r^   rv  rv     s    M)E"2MtTTr]   c                    t        |       D cg c]  \  }}|j                  d      s| }}}|sy |d   g}|dd  D ]$  }||d   dz   k(  r|j                  |         |d   S  |d   S c c}}w )N- r   r   rJ  )rx  rh  r   )rc   rc  r_  rz  first_blockro  s         r^   rt  rt  $  s     )% 0J 0WQDOOD4Iq 0GJ1:,KKOa''u%r? 
 r? Ks
   A*A*c                   ||||k\  rg S g }g }t        |dz   |      D ]F  }| |   j                         r|j                  |       (|s+|j                  t        |             g }H |r|j                  t        |             |S )Nr   )ranger   r   r   )rc   startendgroupscurrentro  s         r^   rs  rs  1  s    }u|	$&FGuqy#&<NN5!MM%.)G ' eGn%Mr]   c           	         |dz   }|t               k  r< |   j                  d      s(|dz  }|t               k  r |   j                  d      s(|t               k  rc |   j                         r |   j                  d      r<|dz  }|t               k  r) |   j                         s' |   j                  d      r<|t               k\  rg S t         fdt	        |t                     D              gS )Nr   rj  c              3  J   K   | ]  }|   j                         s|  y wr   )r   )r   rc  rc   s     r^   r   z,_paragraphs_after_actions.<locals>.<genexpr>I  s!     J5q9I!5s   ##)r   rh  r   r   rm  )rc   r   ro  s   `  r^   rw  rw  A  s    qLE
#e*
U5\%<%<T%B
 #e*
U5\%<%<T%B
#e*
eEl&8&8&:eEl>U>UVZ>[
 #e*
eEl&8&8&:eEl>U>UVZ>[E
	JU5#e*5JJKKr]   c                D    t        d | j                         D               S )Nc              3  l   K   | ],  }|j                  t              xs |j                  d        . yw)rj  N)rh  _LOCKED_PREFIXESr   r_  s     r^   r   z$_is_editable_text.<locals>.<genexpr>M  s/     lZkRV4??#34M8MMZks   24)r   rq  )r  s    r^   ry  ry  L  s     lZ^ZiZiZkllllr]   c           	        r*t              dkD  st        j                               dkD  ryt        j                        s+t        j                        st        j                  d      syj                         t        fdt        D              ryt        fdt        D              st              ryt        t        j                              t        t        j                  |             k7  ry|t        |      syt        | |xs | f      ryd}|xs | }|D ]  }|v s||vs y t        d j                         D              ryt              t!        d	t#        t        |       d
z              k  S )NiX  r   Fu	   [가-힣]c              3  &   K   | ]  }|v  
 y wr   r\   )r   tokenlowereds     r^   r   z#_valid_candidate.<locals>.<genexpr>`  s     
:)95G)9r  c              3  &   K   | ]  }|v  
 y wr   r\   )r   claimr  s     r^   r   z#_valid_candidate.<locals>.<genexpr>c  s     >,=5EY,=r  )u   해야u	   하세요u   권장u   조정u
   다음 주u   내일u   즉시u   안전u   통증u   진료u   의료u   보류u   승인u   전달u   고객c              3  Z   K   | ]#  }|j                         j                  d        % yw))rj  z* #z```N)lstriprh  rw  s     r^   r   z#_valid_candidate.<locals>.<genexpr>  s%     
aJ`$4;;=##$<=J`s   )+x   g      @)r   rq  r`  r  r  r1  casefoldr   _INTERNAL_TOKENS_FORBIDDEN_CLAIMSr   r   r  r  _recommendation_claims_matchr   maxr   )	rV   r  r  full_canonicalr  semantic_tokens	referencerz  r{  s	    `      @r^   r  r  P  sb    I,I4H4H4J0Ka0O9%##I.yyy1  "G

:)9
::>,=>>1)<z!!),-9K9KI9V1WW),!

 *	N/i0 O +)I I%y"8 ! 
a)J^J^J`
aay>Sc#i.3*>&?@@@r]   c                    | y h d}t        |       |k7  s t        d | j                         D              sy t        |       S )N>   r=  r>  r   r?  c              3  >   K   | ]  }t        |      t        u   y wr   )r   r   r  s     r^   r   z-_normalized_recommendation.<locals>.<genexpr>  s     (V~tds):~r.  )r   r6  r  r   )r   r  s     r^   r  r    s=     }<H
5zXS(Vu||~(V%V;r]   c                   t        |t              sy| j                  D ch c]  }|j                  D ]  }|  }}}t	        | j
                        D cg c]  \  }}||vs|j                         s| }}}|j                         D cg c]  }|j                         s| }}d}|D ]  }|t        |      k  s|||   k(  s|dz  }! |t        |      k(  S c c}}w c c}}w c c}w )NFr   r   )	r   rS   rP   rU   rx  rc   r   rq  r   )	r  r  r  ro  r^  r_  lockedrendered_linescursors	            r^   r  r    s    h$"*..P.$d>O>OU>O.HP&/&?j&?{ud5PXCX]a]g]g]id&?Fj'/':':'<M'<t

d'<NM FCKDF6N$:aKF  S[   QjMs#   CC##C#4C#C)#C)uS   오늘 기록된 내용을 기준으로 현재 상태를 차분히 확인했어요.uP   기록된 범위 안에서 무리하게 결론 내리지 않고 살펴볼게요.uI   다음 기록에서도 같은 기준으로 변화를 확인해 볼게요.uV   최근 기록은 이전 기간과 함께 놓고 보면 흐름을 읽을 수 있어요.uM   한 번의 수치보다 확인된 추세와 맥락을 먼저 보겠습니다.u]   현재 자료에서 보이는 흐름과 아직 모르는 부분을 나누어 보겠습니다.uG   추가 기록이 쌓인 뒤 같은 기준으로 다시 살펴볼게요.uV   현재 카드의 확정된 자료에서 확인되는 부분을 먼저 살펴볼게요.uc   수정 전후 기록이 겹치지 않는지 확정된 자료를 기준으로 확인하겠습니다.)	daily_observationdaily_contextdaily_followupweekly_observationweekly_comparisonweekly_reasonweekly_followupadaptive_observationadaptive_verificationr  uI   오늘 기록을 기준으로 현재 상태를 차분히 확인했어요.uH   현재 기록에서 확인되는 내용부터 차분히 살펴볼게요.uJ   최근 기록을 이전 기간과 함께 보며 흐름을 확인했어요.uS   한 번의 수치보다 확인된 추세와 맥락을 먼저 살펴보겠습니다.uF   확인된 내용과 더 지켜볼 부분을 구분해 두겠습니다.uK   확정된 자료에서 확인되는 부분부터 차분히 살펴볼게요.uO   현재 카드의 확인된 근거를 기준으로 먼저 살펴보겠습니다.)daily_v1daily_v2	weekly_v1	weekly_v2weekly_reason_v1weekly_reason_v2adaptive_v1adaptive_v2r#  r   1r  )r  r  r  )r  r  )ra   r  r  r  r   )r  r  )r  r  )r  slot_1)r  r  )r  r  r   )r  r  )r  r  )daily_checkin_v1weekly_report_v1adaptive_nutrition_v1zdict[str, dict[str, object]]r  )r}   r   r   rt   )r   r   r   rt   )r   r   r  rt   r   rt   )r   rS   r   rS   r   rt   )ra   r   r   rt   )rV   r   r   rt   )ra   rS   rV   rS   r   r`   )r  r`   r   tuple[str, str])ra   rS   rV   rS   r  re   r   r  )r  r`   r  r   r   rS   )ra   rS   rV   rS   r  re   r  Callable[[str, str], object]r  Callable[[], bool] | Noner3   r~   r   #tuple[str, CoachingPipelineReceipt])r  r`   r3   rS   r  Mapping[str, int] | Noner   r  )
r  r`   r  r   r3   rS   r  r  r   z"tuple[tuple[str, str], ...] | None)r  r`   r  rf   r   r~   )ra   rS   rV   rS   r  re   r  r  r  r  r3   r~   r  r  r  z-Callable[[Mapping[str, object]], None] | Noner   r  )ra   rS   rV   rS   r  z Callable[[str, str], str | None]r   rS   )
r  r`   r  rS   r  re   r  8tuple[tuple[str, tuple[str, ...], tuple[str, ...]], ...]r   r  )r  r`   r  re   r  r   r   z?tuple[tuple[str, tuple[str, ...], tuple[str, ...]], ...] | None)r  r`   r  re   r  r   r   tuple[str, ...] | None)r  r`   r  r  r   r~   )r  r`   r  rb   r  rS   r   r~   )r  r`   r  zMapping[str, str]r   r~   )r  r   r   zdict[str, object] | Noner   )r  r   ra   r~   r   rt   )r  r`   r  zMapping[str, object]r   zdict[str, tuple[str, ...]])r  rR   r   rS   )r  r`   r  rS   rT   rS   r   rS   )ra   rS   r<  rS   r  re   rq   rp   ru   rt   rv   rt   rx   rb   ry   rb   rr   r  r3   rS   rz   rS   r   ro   )r  rb   r   rb   )rE  zCallable[[], bool]r   rt   )r   rS   r   rS   )r   r   r   r   )r   r   r   rS   )r   zMapping[object, object]r   rS   )r  r`   r   z	list[str])rc   rb   r   rS   r   
int | None)rc   rb   r   r  )rc   rb   rn  r  ro  r  r   list[tuple[int, ...]])rc   rb   r   r   r   r  )r  rS   r   rt   )NN)rV   rS   r  rS   r  zCounter[str]r  r~   r  r  r   rt   )r   r  r   zdict[str, int] | None)r  r`   r  rS   r   rt   )lrm   
__future__r   collectionsr   r   r   r   r   r	   r   rE  rL  rG  r  r1  typingr
   r   r   nutrition_coaching_safetyr   r   !nutrition_coaching_copy_integrityr   r  r  r  rv  r2  r  r`  r  r   rD  rK  r[  rY  
IGNORECASEr  	frozensetrf  r-  r,  r  r  r_  rN   r[   r+  rR   r`   re   ro   r|   r   r   r  r4  r0  rQ  r3  r]  rb  rd  rg  rk  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r;  r  r   r   r   r   r  ru  rv  rt  rs  rw  ry  r  r  r  r  r#  r  r\   r]   r^   <module>r     s!   #  7 7 9   	 - -
    RZZ12
bjjfg

45RZZ(
rzz./2::G  

67BJJA  BJJTMM  >?	!/ 
 1%?  * (,  `,  {,   O,   D	,
   Z,   R,   n,   U,   N,   _,   v,   e,   s,   u,   m,    R!,"   #,$   b%, . ( ##;<  $d#  $ $d#! ! $! $d#
& 
& $
& $d#  $* $d#E@ E@ $E@P $d#IG IG $IGT $d#>
 >
 $>
BbJ* CH  D8J9E4R":R:R:R !:R 	:Rz#WX 59*.ooo !o *	o 2o (o )od++ + 4+ 	+\000 !0 4	0
 (0f+ ( 59*.6:CG}}} !} *	} 2} (} 4} A} )}@... .. 		."RRR !R I	R
 RB00 0 0 E	0f411H1 1,$"	8HV[
=V !##%,0#%AAA !A
 EA A A A !A *A !A A AD=4i
LU
 Lm "&6:1A1A1A "1A 	1A
 41A 
1Ah#!$ ogarht`t C

N 
 \Z]fw``d	!~ 	 TU78	 A:

 1>
 'MN=>	',
( r]   