
    -ǚjZ!                        d Z ddl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 ddlmZ  ej                  e      ZdZdd	d
dZ G d de      Zy)u\  ShelfSyncService — 저빈도로 **보류한** 요소를 명부에 남긴다.

## 왜 이 서비스가 따로 있나

`entity_filter` 가 걸러낸 요소는 `entity_detail` → `entity_t2i` 를 **안 탄다**
(그것이 필터의 목적이다 — 그 유료 호출을 아끼려고 거른다). 그런데
`EntitySyncService` 는 `entity_t2i` 체크포인트만 읽으므로, 보류된 요소는
DB 에 **아무 흔적도 안 남았다.**

    실측 da049582 — 1화에서 공구상자·렌치·지팡이·담요가 걸러졌고, 체크포인트
    `decisions` 에 이름과 사유 한 줄만 남았다. 5화에서 담요가 중요해져도
    1화의 그 담요와 이을 근거가 없다.

그래서 **행은 만들되 이미지·상세는 안 만든다.**

    canon    이름·설명·번호를 잡아 둔다 (다음 화 명부에 실린다)
    link     `presence_status = shelved` — 「**이 화에서** 보류」

★「이 화에서 저빈도」는 **화마다 다른 상태**지 프로젝트 전역 상태가 아니다.
 1화에서 저빈도였다고 5화에서도 저빈도가 아니다. 다음 화에 다시 나오면
 그 canon 에 `active` 링크가 붙어 되살아난다 — **같은 번호로**.

★유료 호출은 **한 건도 안 는다.** `t2i_prompt` 는 비워 두고, 하류 게이트는
 링크의 `presence_status` 로 이 행들을 뺀다.
    )annotationsN)AnyDictList)AppError)BaseSyncServiceremoved_entities	characterlocationprop)
characters	locationspropsc                      e Zd ZdZddZy)ShelfSyncServiceuD   `entity_filter` 체크포인트 → 보류 canon + `shelved` 링크.c                   ddl m}m} ddlm}m} | j                  d      }|sddddS |j                  d      xs i }t        |vr t        j                  dt               ddddS t        |j                  t              xs g       }t        D 	ch c][  }|j                  d	      xs i j                  |g       D ]1  }	|	j                  d
      rt        |	j                  d
      xs d      3 ] }
}}	| j                  j                  |      j!                  |j"                  | j"                  k(  |j$                  j'                  t)        t+        t        j-                                                 j/                         D ci c]  }|j0                  r|j0                  | }}| j                  j                  |      j!                  |j"                  | j"                  k(  |j2                  | j2                  k(        j/                         D ci c]  }|j4                  | }}ddl m} g }g }t9        |      D ]   \  }}t        |j                  d
      xs d      j;                         }t        |j                  d      xs d      j;                         }|r|t+        t        j-                               vr|j=                  d| d|d|        |||      |j=                  d| d| d| d       |j                  |      }|9|j$                  |k7  r*|j=                  d| d| d|j$                   d| d	       |j=                  ||||f       # |rt?        ddtA        |      |dd fz  d      d}|D ]  \  }}}}| |t        tC        jD                               | j"                  ||j                  dd      ||j                  dd      dtG        jH                  |j                  dg       d !      d"| jJ                  | jJ                  #      }| j                  jM                  |       | j                  jO                          |||<   tG        jH                  |j                  dd      |j                  dd      |j                  d$d      |j                  d%      d&d !      }|j                  |jP                        }|a| j                  jM                   |t        tC        jD                               |jP                  | j"                  | j2                  ||'             n||_)        ||_*        |dz  } d}|
rU|
D ]P  }|j                  |      }||j                  |jP                        }|5|jR                  |k(  sE||_)        |dz  }R | j                  jO                          |s|r| j                  j                  d(||       ||ddS c c}	}w c c}w c c}w ))z3Returns: {"shelved": n, "revived": n, "skipped": n}r   )PRESENCE_ACTIVEPRESENCE_SHELVED)EntityCanonEntityEpisodeLinkentity_filter   )shelvedrevivedskippeddatauo   shelf sync: `%s` 칸이 없는 옛 entity_filter 산출 — 건너뛴다 (보류 0 이 아니라 **모른다**)filtered_entitiesshort_id )parse_short_identity_type#z: short_id=z entity_type=Nz: `u   ` 는 `u   ` 의 신원이 아니다u   ` 는 DB 에서 u    인데 체크포인트는 u    라고 한다zshelf_sync.bad_rowsuz   보류분 %d줄을 못 읽어 **한 줄도 쓰지 않는다** — 일부만 쓰면 나머지가 조용히 사라진다: %s   i  )codemessagestatus_codenamedescriptionvisual_traitsF)ensure_asciiz{})id
project_idr   r'   r!   r(   
t2i_promptstable_traitsmetadata_json
created_at
updated_atshelved_reason
shot_count)r'   r(   r2   r3   )r+   canon_idr,   
episode_idpresence_statusepisode_notes_jsonub   shelf sync: 이 화에서 보류 %d · 되살림 %d (canon 은 남고 유료 호출은 안 는다))+app.core.entity_identityr   r   app.models.projectr   r   _load_cpgetREMOVED_KEYloggerinfolist	_OWNER_OFstrdbqueryfilterr,   r!   in_sortedsetvaluesallr   r5   r4   r    	enumeratestripappendr   lenuuiduuid4jsondumpsnowaddflushr+   r6   r7   )selfr   r   r   r   cpr   removedkeye	kept_sidscby_sidlnklinksr    badplanientsidownercanonr   notesr   s                             e/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/checkpoint_sync/shelf_sync_service.pysync_from_checkpointz%ShelfSyncService.sync_from_checkpoint1   s   PE]]?+ Q1==vvf~#d" KK9:EG  !Q1==(,TXXk-B-Hb(I !
 hh239r>>sBGuuZ  j!'R(G )  	 
 $(77==#=#D#D&&$//9''++F3y7G7G7I3J,KL$ ce$
$a zz JJM $ 	 
 *.7H)I)P)P!,,?!,,?* ce*
*#CLL# * 	 
 	<(FAscggj)/R0668C.4"5;;=E%s9+;+;+='>>

QqcSG=	JKeS)1

QqcSE7PQRJJsOE U%6%6%%? 

s#cU"253D3D2E F**/@A KKeS%01% )& *THc"1g./  ! ! &*"CU}#4::<(T__ swwvr': % #r :  ""&**SWW_b-I:?#A"&#xxDHH E"#sJJ+"ww}b9"%''*:B"?!ggl3	 
 "#E ))EHH%C{-4::<(588#4??$4',	  '7#).&qLGI '+R  

3=ii)?s':':>N'N*9C'qLG ! 	gKKABI7T #w1EEe


s   A W" W(W-N)returnzDict[str, int])__name__
__module____qualname____doc__rh        rg   r   r   .   s    NDFro   r   )rm   
__future__r   rP   loggingrN   typingr   r   r   app.core.errorsr   "app.services.checkpoint_sync._baser   	getLoggerrj   r=   r<   r@   r   rn   ro   rg   <module>rv      s^   2 #    " " $ >			8	$ ! 'Z	GF GFro   