
    %<i&                        d Z ddlZddlmZmZ ddlmZ ddlmZmZm	Z	  G d d      Z
edk(  rCddlZ e
       Z eej                        d	k  r;ej!                         Z e ej&                  ed	d
              eded   d       yej                  d   Zedk(  rRej!                         Z ed        ed eed          d        ed eed          d        eded   d       yedk(  r{ eej                        dk  r ed        ej*                  d       ej                  d	   Zej/                  e ej0                         j3                         d        ede        yedk(  r[ eej                        dk  r ed        ej*                  d       ej                  d	   Zej5                  e        ede        yed k(  rk eej                        dk  r ed!        ej*                  d       ej                  d	   Zej7                  e      Z e ej&                  ed	d
             y ed"e        ed#        ed$        ed%        ed&        ed'       yy)(uY   
세션 시작 라우팅 레이어
활성 프로젝트만 로드하여 토큰 90% 절약
    N)datetime	timedelta)Path)DictListOptionalc                       e Zd ZdZddefdZdefdZdee   fdZ	dee   fdZ
defd	Zd
ee   fdZdefdZdefdZdedefdZdedefdZdedee   fdZdedee   fdZdedefdZy)SessionRouteru/   세션 시작 시 최소 컨텍스트만 로드Nworkspace_pathc                     |t        j                         dz  dz  }t        |      | _        | j                  dz  | _        | j                  dz  | _        t        j                         j                  d      | _        y)u	   초기화Nz	.cokacdir	workspacememoryzactive-projects.jsonz%Y-%m-%d)	r   homer   memory_pathactive_projects_filer   nowstrftimetoday)selfr   s     E/home/jay/workspace/.worktrees/task-2057-dev2/memory/routing_layer.py__init__zSessionRouter.__init__   sm    !!YY[;6DN">2..9 %)$4$47M$M! \\^,,Z8
    returnc                     | j                   | j                         | j                         | j                         dd}| j	                  |      |d<   |S )u   
        최소 컨텍스트 로드 (토큰 90% 절약)

        Returns:
            최소 컨텍스트 (약 550 tokens)
        r   )session_startactive_projectstoday_prioritysoul_summarytotal_tokensr   )r   get_active_projectsget_today_priorityget_soul_summary_estimate_tokens)r   contexts     r   load_minimal_contextz"SessionRouter.load_minimal_context   sU     "ZZ#779"557 113
 #'"7"7"@r   c                     | j                   j                         rIt        | j                   dd      5 }t        j                  |      }|j                  dg       cddd       S g S # 1 sw Y   yxY w)uv   
        활성 프로젝트만 로드

        Returns:
            활성 프로젝트 목록 (최대 3개)
        rutf-8encodingactiveN)r   existsopenjsonloadget)r   fdatas      r   r    z!SessionRouter.get_active_projects1   sf     $$++-d//wG .1yy|xx"-. .
 I. .s   'A&&A/c                 L   | j                   dz  | j                   dz  }|j                         ret        |dd      5 }|j	                         dd }g }|D ].  }d|v s	d	|v sd
|v s|j                  |j                                0 |dd cddd       S dgS # 1 sw Y   dgS xY w)ur   
        오늘의 우선순위만 로드

        Returns:
            우선순위 목록 (최대 3개)
        dailyz.mdr'   r(   r)   N
   u   우선순위u   할 일z- [   u   활성 프로젝트 없음)r   r   r,   r-   	readlinesappendstrip)r   
daily_filer1   lines
prioritieslines         r   r!   z SessionRouter.get_today_priorityA   s     %%/TZZL2DD
j#8 	&Acr*  
! 8D%-d1Betm"))$**,78 ""1~	& 	& ---	& ---s   'B&%BB#c                     | j                   dz  }|j                         rBt        |dd      5 }|j                         }t	        |      dkD  r|dd dz   n|}|cddd       S y# 1 sw Y   yxY w)	uz   
        SOUL.md 요약만 로드 (전체 대신)

        Returns:
            요약 문자열 (약 100 tokens)
        zSOUL.mdr'   r(   r)      Nz...u   SOUL.md 없음)r   r,   r-   readlen)r   	soul_filer1   contentsummarys        r   r"   zSessionRouter.get_soul_summaryZ   sz     '')3	iw7 1&&( 47w<#3E'$3-%/7     s   *A##A,projectsc                     t        j                         j                         |dd d}t        | j                  dd      5 }t        j                  ||dd	       ddd       y# 1 sw Y   yxY w)
ur   
        활성 프로젝트 업데이트

        Args:
            projects: 활성 프로젝트 목록
        Nr6   )last_updatedr+   wr(   r)   F   )ensure_asciiindent)r   r   	isoformatr-   r   r.   dump)r   rE   r2   r1   s       r   update_active_projectsz$SessionRouter.update_active_projectsm   s_     !) 8 8 :hrPQlS$++S7C 	=qIIdAE!<	= 	= 	=s   A$$A-projectc                     | j                         }d}t        |      D ]1  \  }}|j                  d      |j                  d      k(  s*|||<   d} n |s|j                  |       | j	                  |dd        y)ud   
        활성 프로젝트 추가

        Args:
            project: 프로젝트 정보
        FnameTN)r    	enumerater0   r8   rN   )r   rO   currentupdatedips         r   add_active_projectz SessionRouter.add_active_projecty   s     **, g& 	DAquuV}F 33$
		 NN7# 	##GBCL1r   project_namec                     | j                         }|D cg c]  }|j                  d      |k7  s| }}| j                  |       yc c}w )ue   
        활성 프로젝트 제거

        Args:
            project_name: 프로젝트명
        rQ   N)r    r0   rN   )r   rY   rT   rW   filtereds        r   remove_active_projectz#SessionRouter.remove_active_project   sH     **,&H!!%%-<*GAHH##H- Is
   AAr$   c                 b    t        j                  |d      }t        |      dz  }t        |      S )u   
        컨텍스트 토큰 수 추정

        Args:
            context: 컨텍스트 딕셔너리

        Returns:
            추정 토큰 수
        F)rJ   g      ?)r.   dumpsrA   int)r   r$   json_str	estimateds       r   r#   zSessionRouter._estimate_tokens   s,     ::gE:MC'	9~r   c                     | j                   dz  |j                         j                  dd      z  }|j                         sdd| iS || j	                  |      | j                  |      d}|S )u   
        특정 프로젝트의 전체 컨텍스트 로드 (필요 시에만)

        Args:
            project_name: 프로젝트명

        Returns:
            프로젝트 전체 컨텍스트
        rE    -erroru   프로젝트 없음: )rY   phases	workflows)r   lowerreplacer,   _load_project_phases_load_project_workflows)r   rY   project_pathr$   s       r   get_full_context_for_projectz*SessionRouter.get_full_context_for_project   s     ''*4|7I7I7K7S7STWY\7]]""$4\NCDD )//=55lC
 r   rl   c                    |dz  }g }|j                         rgt        |j                  d            D ]J  }t        |dd      5 }|j	                         }|j                  |j                  |dd d       ddd       L |S # 1 sw Y   XxY w)	u   프로젝트 Phase 로드rf   z*.mdr'   r(   r)   Nr?   )filerD   )r,   sortedglobr-   r@   r8   rQ   )r   rl   phases_pathrf   
phase_filer1   rC   s          r   rj   z"SessionRouter._load_project_phases   s    "X-$[%5%5f%=> W
*cG< WffhGMM:??wtPS}"UVW WW
 	W Ws   2BB
	c                     |dz  }g }|j                         r^t        |j                               D ]B  }|j                         s| j	                  |      }|j                  |j                  |d       D |S )u   프로젝트 Workflow 로드rg   )idstatus)r,   rp   iterdiris_dir_check_workflow_statusr8   rQ   )r   rl   workflows_pathrg   workflow_dirrv   s         r   rk   z%SessionRouter._load_project_workflows   sy    %3	  " &~'='='? @ R&&(!88FF$$L,=,=%PQ	R r   r{   c                     t        |j                  d            ryt        |j                  d            ryt        |j                  d            ryy)u   Workflow 상태 확인z
*feedback*	completedz*implementation*zin-progressz*plan*planningunknown)listrq   )r   r{   s     r   ry   z$SessionRouter._check_workflow_status   sN     !!,/0 !!"456  !!(+,r   )N)__name__
__module____qualname____doc__strr   r   r%   r   r    r!   r"   rN   rX   r\   r_   r#   rm   r   rj   rk   ry    r   r   r
   r
      s    99s 9d (T$Z  .DI .2 #  &
=tDz 
=2$ 20	.# 	.     2 $t* D T$Z 4 C r   r
   __main__rI   F)rK   rJ   u   
📊 추정 토큰: r   ,   rv   u    📊 세션 시작 컨텍스트:u     - 활성 프로젝트: r   u   개u     - 오늘 우선순위: r   u     - 추정 토큰: addr6   u9   사용법: python3 routing_layer.py add <프로젝트명>)rQ   addedu    ✅ 활성 프로젝트 추가: removeu<   사용법: python3 routing_layer.py remove <프로젝트명>u    ✅ 활성 프로젝트 제거: fullu:   사용법: python3 routing_layer.py full <프로젝트명>u   알 수 없는 명령:u
   사용법:u8     python3 routing_layer.py status        # 현재 상태u=     python3 routing_layer.py add <프로젝트> # 활성 추가u@     python3 routing_layer.py remove <프로젝트> # 활성 제거uD     python3 routing_layer.py full <프로젝트> # 전체 컨텍스트)r   r.   r   r   pathlibr   typingr   r   r   r
   r   sysrouterrA   argvr%   r$   printr^   commandexitrY   rX   r   rL   r\   rm   r   r   r   <module>r      st  
  (  ' 'a aJ z_F
388}q--/jdjj?@&w~'>q&ABC ((1+h113G45-c':K2L.M-NcRS-c':J2K.L-MSQR'(?'BCD388}q QR88A;L%%|lhllnF^F^F`&ab4\NCD 388}q TU88A;L((64\NCD388}q RS88A;L99,GG*$**WQUCD *G4,LMQRTUXYu r   