
    Rip              	          U d Z ddlZddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
 g dZee   ed<   g dZee   ed	<   g d
Zee   ed<   ej"                  j%                  d e ee      j)                         j*                  j*                              Z ee      dz  Zdedeeee
f      fdZdedefdZddedz  deee
f   fdZdeee
f   deddfdZ	 ddededz  deee
f   fdZdedz  defdZddZe dk(  r e        yy)u(  
transcript-learner.py

세션 대화 트랜스크립트에서 패턴(지적/칭찬/선호)을 추출하여
memory/whisper/learnings.json에 누적 저장한다.

Usage:
    python3 transcript-learner.py [--input FILE] [--workspace /path]
    echo "대화 내용" | python3 transcript-learner.py
    N)datetimetimezone)Path)Any)u   아까 말했잖아u   이미 했잖아u   아니라고u
   이거 왜u	   했잖아u   아니 그게u   다시u   또?CRITICISM_KEYWORDS)u   오 괜찮은데u   이거 맞어u   그래 이거야u	   잘했어u   좋네u	   괜찮다u   좋아PRAISE_KEYWORDS)u   항상u
   하지 마u
   으로 해u   로 해u   난PREFERENCE_KEYWORDSWORKSPACE_ROOTmemorylinereturnc                    g }| j                         }|s|S t               }t        D ]2  }||v s||vs|j                  |       |j	                  d||d       4 t
        D ]2  }||v s||vs|j                  |       |j	                  d||d       4 t        D ]2  }||v s||vs|j                  |       |j	                  d||d       4 |S )u3   한 줄에서 모든 매칭 패턴을 추출한다.	criticism)typekeywordcontextpraise
preference)stripsetr   addappendr   r	   )r   resultsstrippedseen_keywordskws        K/home/jay/workspace/.worktrees/task-2117-dev1/scripts/transcript-learner.pyextract_patterns_from_liner   >   s    $&Gzz|H "eM ! 	>b5b!NN'!'	  	>b5b!NN$!'	 " 	>b5b!NN(!'	 N    base_dirc                     | dz  dz  S )Nwhisperzlearnings.json r    s    r   _learnings_pathr%   t   s    i"222r   c                 @   | t         } t        |       }|j                         sddg dS 	 t        j                  |j                  d            }t        |t              st        d      d|vrg |d<   |S # t        j                  t        t        f$ r	 ddg dcY S w xY w)uD   learnings.json 로드. 없거나 손상된 경우 빈 구조 반환.    )versionlast_updatedpatternsutf-8encodingzroot is not a dictr+   )DEFAULT_WORKSPACEr%   existsjsonloads	read_text
isinstancedict
ValueErrorJSONDecodeErrorOSError)r    pathdatas      r   load_learningsr;   x   s    $8$D;;=bbAABzz$..'.:;$%122T!!D  *g6 BbbAABs   A
A6 6$BBr:   c                     t        |      }|j                  j                  dd       |j                  t	        j
                  | dd      d       y)	u   learnings.json 저장.T)parentsexist_okF   )ensure_asciiindentr,   r-   N)r%   parentmkdir
write_textr1   dumps)r:   r    r9   s      r   save_learningsrF      s@    8$DKKdT2OODJJt%BWOUr   textc                    |t         }t        |      }|j                  dg       }t        j                  t
        j                        j                  d      }t        j                  t
        j                        j                  d      }d}d}| j                         D ]t  }t        |      }	|	D ]b  t        fd|D        d      }
|
#|
j                  dd	      d	z   |
d<   ||
d
<   |d	z  }=|j                  d   d   d   d	||d       |d	z  }d v d	|d<   ||d<   ||d<   t        ||       ||t        |      dS )u   트랜스크립트 텍스트를 처리하여 패턴을 추출·저장한다.

    Returns:
        {"new_patterns": int, "updated_patterns": int, "total_patterns": int}
    Nr$   r+   z%Y-%m-%dz%Y-%m-%dT%H:%M:%Sr   c              3      K   | ]6  }|j                  d       d    k(  s|j                  d      d   k(  s3| 8 yw)r   r   N)get).0pitems     r   	<genexpr>z%process_transcript.<locals>.<genexpr>   s@     tqi(8DO(KPQPUPUV_P`dhirdsPsts   ???countr'   	last_seenr   r   r   )r   r   r   rO   
first_seenrP   r)   r*   )new_patternsupdated_patternstotal_patterns)r/   r;   rJ   r   nowr   utcstrftime
splitlinesr   nextr   rF   len)rG   r    	learningsr+   todaynow_iso	new_countupdated_countr   	extractedexistingrM   s              @r   process_transcriptrb      sf    $1I%.]]:r%BHLL&//
;Ell8<<(112EFGIM! .t4	 	DtHtH #$,LL!$<q$@!(-%" $V#'	?#'	?!"&+%*	 Q	+	2 Ii 'In$Ij9x0 ")h- r   
input_filec                 x    | t        |       j                  d      S t        j                  j	                         S )u8   입력 텍스트를 파일 또는 stdin에서 읽는다.r,   r-   )r   r3   sysstdinreadrc   s    r   
read_inputri      s2    J))7);;99>>r   c                  ~   t        j                  d      } | j                  ddd d       | j                  ddt        t              d	t         d
       | j                         }t        |j                        }t        |j                        }t        ||      }t        t        j                  |d             y )NuO   세션 트랜스크립트에서 패턴을 추출하여 learnings.json에 저장)descriptionz--inputFILEu&   입력 파일 경로 (없으면 stdin))metavardefaulthelpz--workspacePATHu&   워크스페이스 경로 (기본값: )rh   r$   F)r@   )argparseArgumentParseradd_argumentstrr/   
parse_argsri   inputr   	workspacerb   printr1   rE   )parserargsrG   r    results        r   mainr}      s    $$  2C  DF
5	   %&56G5HJ	   D,DDNN#Hx8F	$**V%
01r   __main__)N)r   N)!__doc__rr   r1   osre   r   r   pathlibr   typingr   r   listru   __annotations__r   r	   environrJ   __file__resolverB   _WORKSPACE_ROOTr/   r5   r   r%   r;   rF   rb   ri   r}   __name__r#   r   r   <module>r      s{  	   	 
 '  	! DI 	c " T#Y  **..!13tH~7M7M7O7V7V7]7]3^_)H4 .S .T$sCx.-A .l3d 3t 3BTD[ BDcN B(Vc3h V4 VD V !8
8Tk8 
#s(^8@3: # 2, zF r   