
    [j                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ej                  j                  ej                  j                  ej                  j                  e            d      ZdZej                  j%                  d      ZdZej                  j                  ed      ZdZd	 Zd
 Zd ZddZd Zd Zedk(  r e        yy)u  
scribe_forge.py — SHIN 서기관 에이전트 [CEO 설계 2026-07-19]

사상: 대화 자체가 암묵지를 낳는다. 맥락 저장 에이전트(=/api/log, SHIN세션로그)는 대화 원본을 쌓지만,
      그 안의 '중요한 것'을 골라 정리하지 않으면 묻힌다. 서기관은 대화를 읽어
      ①이 대화에서 정해진 것 ②대표가 가르친 사실·노하우 ③새로 나온 수치 ④남은 질문을 뽑아
      옵시디언에 정리한다. 옵시디언은 SHIN 지식 인덱스에 포함되므로 → 곧 SHIN의 영구 기억이 된다.

두 에이전트 역할분담:
  - 맥락 저장 에이전트 = dzw_process.js logShin → 서버 /api/log → SHIN세션로그/<날짜>.jsonl (원본)
  - 서기관 에이전트 = 이 스크립트 (원본 → 중요내용 정리 → 옵시디언)

실행: python scribe_forge.py [YYYY-MM-DD]   (날짜 없으면 가장 최근 로그)
비용: 기본 로컬(무료). --fable 주면 페이블로 품질 우선.
    Nu   SHIN세션로그u4   E:\옵시디언\도진웍스\03_AI_OS\_SHIN서기관z~\.local\bin\claude.exez#http://localhost:11434/api/generatez_scribe_state.jsonu  너는 도진웍스 SHIN의 서기관이다. 아래는 대표(장인)와 SHIN의 대화 기록이다. 이 대화에서 "나중에 반드시 기억해야 할 것"만 골라 정리하라. 잡담·단순조작·중복은 버려라.
규칙(CEO 문서규칙): 서문 2~3문장, 도번·용어엔 쉬운 말 병기, 조건→결론 이야기 순서, 대표 표현을 응축해 뭉개지 말고 살려라. 대화에 실제로 있는 내용만(지어내기 금지). 없으면 그 항목은 비워라.
출력(마크다운):
# %s 대화 정리 — SHIN 서기관
> (서문)
## 1. 이 대화에서 정해진 것 (결정)
## 2. 대표가 가르친 사실·노하우
## 3. 새로 나온 수치·값
## 4. 남은 질문 / 확인할 것

[대화 기록]
%sc                 x    t        j                  t        j                  | d            S # t        $ r |cY S w xY w)Nutf-8encoding)jsonloadioopen	Exception)pds     scribe_forge.py	load_jsonr   #   s+    		"''!g67	7Qhs   )+ 99c                      t        t        j                  t        j                  j	                  t
        d                  } | r| d   S d S )Nz*.jsonl)sortedglobospathjoinLOG_DIR)fss    r   
latest_logr   (   s5    			"'',,w	:;	<B2b6!T!    c                    g }t        j                  | dd      D ]  }t        j                  |      }|j                  d      xs |j                  d      xs d}|j                  d      xs |j                  d      xs dj                         }|rt        |      d	k  r|d
v s|j                  d      r|j                  |dv rdndd|d d         |S # t        $ r Y w xY w)Nr   ignore)r   errorskindrole textmsg   )   대표SHINuseraria[)r$   r&   r$   r%   z: i  )
r	   r
   r   loadsr   getstriplen
startswithappend)r   turnslnrr   txts         r   
read_convor3   -   s    EggdWX>BQuuV}3f3uuV}2e299;c#hlH55cnnS>QLL9K1KXQW%WY\]a^aYbcd ? L "("s   C	C('C(c                    t        j                  d| ddddd      j                         }t        j                  j                  t        j                  j                  t        |ddi	      |
      }t        j                  |j                               j                  dd      }t        j                  dd|t        j                        j                         S )NFzdeepseek-r1:14bg333333?i  )temperaturenum_predict)modelpromptstreamoptionszContent-Typezapplication/json)dataheaders)timeoutresponser    z<think>.*?</think>)flags)r   dumpsencodeurllibrequesturlopenRequestOLLAMAr)   readr*   resubSr+   )r8   r=   bodyr1   outs        r   ollamarM   ;   s    ::<MY_kp25d"KM NNTfh 	v~~55f4(68J'K  6  MV] 	 	_A
**QVVX

"
":r
2C66'S=CCEEr   c                     t        j                  t        dddg| j                  d      dd      }|j                  j                  dd	      j                         S )
Nz-pz--modelzclaude-fable-5r   T   )inputcapture_outputr=   r   )r   )
subprocessrun
CLAUDE_EXErA   stdoutdecoder+   )r8   r1   s     r   fablerW   D   sM    
D)5EFfmm\cNd&*C	9A88??78?4::<<r   c                     t         j                  dd  D  cg c]  } | j                  d      r|  }} dt         j                  v }d }|rMt        j                  j                  t        |d   dz         }t        j                  j                  |      r|nd }|xs
 t               }|st        d       y t        j                  j                  |      j                  dd      }t        |      }t        |      dk  rt        d	t        |      z         y t        t        i       }|j!                  |d      }t        |      |k  rt        d
||fz         y dj                  |dd        }	t"        ||	d d fz  }
	 |r.t        j                  j                  t$              rt'        |
      n
t)        |
      }t        j.                  t0        d       t        j                  j                  t0        d|z        }dt3        j4                  d      t        |      fz  }t7        j8                  |dd      j;                  ||z          t        |      ||<   t7        j8                  t        dd      j;                  t=        j>                  |d             t        d|t        |      fz         y c c} w # t*        $ r"}t        dt-        |      d d        Y d }~y d }~ww xY w)N   z--z--fabler   z.jsonlu    [서기관] 세션 로그 없음r       u7   [서기관] 정리할 대화가 부족합니다 (%d턴)u9   [서기관] %s — 새 대화 없음(이미 %d턴 정리)
ii(#  u   [서기관] 정리 실패:d   T)exist_oku   SHIN정리_%s.mdui   <!-- SHIN 서기관 자동정리: scribe_forge.py %s | 대화 %d턴 | 옵시디언=SHIN 영구기억 -->
z%Y-%m-%d %H:%Mwr   r   F)ensure_asciium   [서기관] 정리 완료: %s (%d턴 → 옵시디언). SHIN이 /api/reload 하면 영구기억으로 편입.) sysargvr-   r   r   r   r   existsr   printbasenamereplacer3   r,   r   STATEr*   PROMPTrT   rW   rM   r   strmakedirsOUT_DIRtimestrftimer	   r
   writer   r@   )aargs	use_fabler   canddayr/   stdoneconvor8   noteeout_pheads                  r   mainrz   J   sm   xx|>|!1<<+=A|D>SXX%IDww||GT!Wx%78ww~~d+t:<D016
''

4
 
(
(2
6CtE
5zA~G#e*TUW]	5"	B66#q>D
5zTISRVKWXZ`IIeCDk"EsE%4L))FB!*rww~~j/IuV}PVW]P^ KK$'GGLL"4s":;Ew&'U{5 5DGGE3)//t<%jBsG"''%w?EEdjjQSbgFhi	
y  ~C  EH  IN  EO  }P  P  Q= ?,  B*CF4CL96Bs"   J(J(6;J- -	K6KK__main__)i,  )__doc__r   r	   rH   r`   r   r   rk   rR   urllib.requestrB   r   r   dirnameabspath__file__r   rj   
expanduserrT   rF   rf   rg   r   r   r3   rM   rW   rz   __name__ r   r   <module>r      s    E D D D D
'',,rwwrwwx'@ACU
V
AWW :;
	.
W23h
"
F=QD zF r   