
    niE                        d Z ddlZddlZddlZddlZej
                  j                  d       ddlm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mZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZm Z m!Z! ddl"Z" e"jF                  e"jH                  d        e"jJ                  e&      Z' ed      Z( G d d      Z) G d de      Z*e G d d             Z+e G d d             Z, G d d      Z- G d d      Z. G d d      Z/ G d d      Z0 G d de      Z1e G d  d!             Z2 G d" d#      Z3 G d$ d%      Z4 G d& d'      Z5 G d( d)      Z6d* Z7e&d+k(  r e8 e7              yy),a  
Context Engineering Skill for Genesis System
=============================================

Production-ready context management implementing patterns from:
- Anthropic's context engineering research
- Progressive disclosure techniques
- Sub-agent delegation patterns
- Token-efficient context management

This skill provides intelligent context loading, compression, and injection
for optimal LLM performance within token budgets.

Usage:
    from context_engineering import ContextManager, ContextHooks

    # Initialize with memory integration
    ctx = ContextManager()

    # Load relevant context for a query
    context = ctx.load_relevant_context("implement user authentication")

    # Progressive disclosure
    disclosed = ctx.progressive_disclosure(context, depth=2)

    # Inject into prompt
    final_prompt = ctx.inject_context(user_prompt, disclosed)

Video Reference: ySA9tJ8RfVM - Context Engineering patterns
    Nz)/mnt/e/genesis-system/data/genesis-memory)PostgresConfig)ABCabstractmethod)	dataclassasdictfield)datetime	timedelta)Enum)Path)DictListAnyOptionalTupleCallableUnionz)%(asctime)s - %(levelname)s - %(message)s)levelformatz/mnt/e/genesis-systemc                       e Zd ZdZdddddZdddddd	d
dZddedefdZddedede	fdZ
de	defdZde	fdZde	fdZd Z	 	 ddede	dededef
dZdeeef   fdZy) TokenBudgetManagerz
    Manages token budgets for context windows.

    Implements efficient token estimation and budget allocation
    to prevent context overflow while maximizing information density.
    g      @g      @g      @gffffff@)codeprosejsonmixedi@ i  i    i )zclaude-3-opuszclaude-3-sonnetzclaude-3-haikuzclaude-opus-4-5zgpt-4-turbozgpt-4defaultmodelreserve_ratioc                     || _         | j                  j                  || j                  d         | _        || _        t        | j                  d|z
  z        | _        d| _        t        j                         | _
        y)z
        Initialize the token budget manager.

        Args:
            model: Model name for context limit lookup
            reserve_ratio: Fraction of budget reserved for response (default 20%)
        r      r   N)r   MODEL_LIMITSget
max_tokensr   intavailable_budget	allocated	threadingLock_lock)selfr   r   s      skills/context_engineering.py__init__zTokenBudgetManager.__init__Z   sh     
++//t7H7H7ST* #DOOq=7H$I J^^%
    textcontent_typereturnc                    |sy| j                   j                  || j                   d         }t        |      |z  }|dk(  r$|j                  d      }||dz  z  }t	        |      S |dk(  rO|j                  d      |j                  d      z   |j                  d	      z   |j                  d
      z   }||dz  z  }t	        |      S )aS  
        Estimate token count for text.

        Uses character-based estimation with content-type adjustments.
        More accurate than naive word counting.

        Args:
            text: Text to estimate
            content_type: Type of content (code, prose, json, mixed)

        Returns:
            Estimated token count
        r   r   r   
      ?r   {}[]333333?)CHARS_PER_TOKENr"   lencountr$   )r*   r.   r/   chars_per_token	estimatednewlinesbracketss          r+   estimate_tokensz"TokenBudgetManager.estimate_tokensi   s     ..22<AUAUV]A^_ I/	 6!zz$'HC'I 9~	 V#zz#C84::c?JTZZX[_\HC'I9~r-   tokensc                     | j                   5  | j                  |z   | j                  k  r| xj                  |z  c_        	 ddd       y	 ddd       y# 1 sw Y   yxY w)z
        Attempt to allocate tokens from budget.

        Args:
            tokens: Number of tokens to allocate

        Returns:
            True if allocation succeeded, False if budget exceeded
        NTF)r)   r&   r%   r*   rA   s     r+   allocatezTokenBudgetManager.allocate   sW     ZZ 	~~&$*?*??&(	 	 		 	 	s   3A	AAc                     | j                   5  t        d| j                  |z
        | _        ddd       y# 1 sw Y   yxY w)z$Release previously allocated tokens.r   N)r)   maxr&   rC   s     r+   releasezTokenBudgetManager.release   s5    ZZ 	= DNNV$;<DN	= 	= 	=s   5>c                 x    | j                   5  | j                  | j                  z
  cddd       S # 1 sw Y   yxY w)zGet remaining available tokens.N)r)   r%   r&   r*   s    r+   get_remainingz TokenBudgetManager.get_remaining   s0    ZZ 	:((4>>9	: 	: 	:s   09c                 T    | j                   5  d| _        ddd       y# 1 sw Y   yxY w)zReset allocated tokens to zero.r   N)r)   r&   rI   s    r+   resetzTokenBudgetManager.reset   s%    ZZ 	DN	 	 	s   'budgetpreserve_startc                    | j                  ||      }||k  r|S | j                  j                  || j                  d         }t        ||z  dz        }|rJ|d| }|j	                  d      }	|j	                  d      }
t        |	|
      }||dz  kD  r|d|dz    }|dz  }|S || d }|j                  d      }|j                  d      }|d	kD  r||d
z  k  r	||dz   d }n|d	kD  r||d
z  k  r||dz   d }d|z   }|S )aE  
        Trim text to fit within token budget.

        Args:
            text: Text to trim
            budget: Maximum tokens allowed
            preserve_start: If True, keep beginning; else keep end
            content_type: Type of content for estimation

        Returns:
            Trimmed text within budget
        r   gffffff?Nz. r2   皙?r    z
... [truncated]r   皙?   z[truncated] ...
)r@   r9   r"   r$   rfindrF   find)r*   r.   rM   rN   r/   current_tokensr<   target_charstrimmedlast_periodlast_newline	cut_pointfirst_periodfirst_newlines                 r+   trim_to_budgetz!TokenBudgetManager.trim_to_budget   sJ    --dLAV#K ..22<AUAUV]A^_6O3d:;=L)G!---K"==.LK6I<#--!.9q=1**G  L=>*G"<<-L#LL.MaL<#3E$E!,"2"34"}|c7I'I!-!"3"45)G3Gr-   c           
      :   | j                   5  | j                  | j                  | j                  | j                  | j                  | j                  z
  | j                  dkD  r#t        | j                  | j                  z  d      nddcddd       S # 1 sw Y   yxY w)zGet budget statistics.r      )r   r#   r%   r&   	remainingutilizationN)r)   r   r#   r%   r&   roundrI   s    r+   	get_statszTokenBudgetManager.get_stats   s}    ZZ 	"oo$($9$9!^^!22T^^CSWShShklSluT^^d6K6K%KQOrs	 	 	s   A:BBN)r   rQ   r   Tr   )__name__
__module____qualname____doc__r9   r!   strfloatr,   r$   r@   boolrD   rG   rJ   rL   r]   r   r   rc    r-   r+   r   r   ?   s     	O  ! !L&c &e &!C !s ! !Fs t  =c =
:s :
 /3+2,3 , ,'+,%(,7:,\
4S> 
r-   r   c                   $    e Zd ZdZdZdZdZdZdZy)ContextPriorityz"Priority levels for context items.      r_   rR   r    N)	rf   rg   rh   ri   CRITICALHIGHMEDIUMLOWMINIMALrm   r-   r+   ro   ro      s    ,HDF
CGr-   ro   c                       e Zd ZU dZeed<   eed<   ej                  Zeed<   dZ	e
ed<   dZeed<   d	Zeed
<    ee      Zeeef   ed<   d Zy)ContextItemz,Represents a piece of context with metadata.contentsourcepriorityr3   relevance_score 	timestampr   token_countdefault_factorymetadatac                     | j                   s't        j                         j                         | _         | j                  dk(  rt        | j                        dz  | _        y y )Nr   rq   )r~   r	   now	isoformatr   r:   ry   rI   s    r+   __post_init__zContextItem.__post_init__   sH    ~~%\\^557DNq "4<<0A5D !r-   N)rf   rg   rh   ri   rj   __annotations__ro   rt   r{   r|   rk   r~   r   r$   r   dictr   r   r   r   rm   r-   r+   rx   rx      sY    6LK / 6 6Ho6 OU IsK$T:Hd38n:6r-   rx   c                       e Zd ZU dZ ee      Zee   e	d<   dZ
ee	d<   dZee	d<   dZee	d<   d	 Zd
 ZdefdZej&                  fdedee   fdZddedefdZy)ContextBundlez'Collection of context items for a task.r   itemsr}   queryr   total_tokenscreatedc                     | j                   s't        j                         j                         | _         | j	                          y N)r   r	   r   r   _update_tokensrI   s    r+   r   zContextBundle.__post_init__  s+    ||#<<>335DLr-   c                 F    t        d | j                  D              | _        y)zUpdate total token count.c              3   4   K   | ]  }|j                     y wr   )r   ).0items     r+   	<genexpr>z/ContextBundle._update_tokens.<locals>.<genexpr>  s     HT 0 0Hs   N)sumr   r   rI   s    r+   r   zContextBundle._update_tokens  s    HTZZHHr-   r   c                 Z    | j                   j                  |       | j                          y)zAdd a context item.N)r   appendr   )r*   r   s     r+   addzContextBundle.add  s     

$r-   min_priorityr0   c                     | j                   D cg c](  }|j                  j                  |j                  k\  s'|* c}S c c}w )z%Get items at or above priority level.)r   r{   value)r*   r   r   s      r+   get_by_priorityzContextBundle.get_by_priority  s1    !%Yt}}/B/BlFXFX/XYYYs   (??include_sourcesc                     g }t        | j                  d       D ]K  }|r,|j                  d|j                   d|j                          1|j                  |j                         M dj                  |      S )z%Convert bundle to text for injection.c                 J    | j                   j                   | j                   fS r   r{   r   r|   xs    r+   <lambda>z'ContextBundle.to_text.<locals>.<lambda>#  s!    qzz7G7G6G!J[J[I[5\ r-   )keyz	[Source: z]
z

)sortedr   r   rz   ry   join)r*   r   partsr   s       r+   to_textzContextBundle.to_text   sg    4::+\] 	+DySGHT\\*		+
 {{5!!r-   N)F)rf   rg   rh   ri   r   listr   r   rx   r   r   rj   r   r$   r   r   r   r   ro   ru   r   rl   r   rm   r-   r+   r   r     s    1$T:E4:E3OL#GS
I 
 ?N>Q>Q ZO ZVZ[fVg Z"t " "r-   r   c            
           e Zd ZdZg dg dg dg ddZd Zdd	ed
ededefdZ	dede
fdZd	edeeeef      deeeeef      fdZy)ContextRelevanceScorerzR
    Scores context relevance to queries using keyword and semantic matching.
    )rememberrecallstoreretrievecontextepisodicsemantic)functionclassvariableimportmethodapi	implement)workflowtriggerschedulen8nhookevent)learned
discoveredpatterninsightlesson)memoryr   
automationlearningc                     h d| _         y )N>   aanasatbebyifinisitofonorsotoandarebutforthewasbeenfromthatthiswerewith)
_stopwordsrI   s    r+   r,   zContextRelevanceScorer.__init__8  s    Ur-   Nr   r   context_metadatar0   c                 j   | j                  |      }| j                  |      }|r|syt        ||z        }|t        ||z        z  }|r|t        |      z  nd}d}	|xs i }
|
j                  dd      }|| j                  v rt	        | j                  |         }||z  rd}	d}d|
v rQ	 t        j                  |
d         }t        j                         |z
  j                         dz  }|dk  rd	d
|dz  z
  z  }|dz  |dz  z   }t        d||	z   |z         }t        |d      S # t        t        f$ r Y :w xY w)a  
        Score relevance of context to query.

        Args:
            query: User query or task description
            context: Context text to score
            context_metadata: Optional metadata for boosting

        Returns:
            Relevance score 0-1
        g        r   domainr}   g333333?r~        皙?r    g?333333?g      ?r_   )	_tokenizer:   r"   DOMAIN_KEYWORDSsetr	   fromisoformatr   total_seconds
ValueError	TypeErrorminrb   )r*   r   r   r   query_termscontext_termsoverlapjaccardcoveragedomain_boostr   r   domain_termsrecency_boostts	age_hours
base_scorefinal_scores                     r+   scorezContextRelevanceScorer.score=  sd    nnU+w/- kM12Cm ;<< 2=7S--! #)rh+T)))t33F;<L\)# ("++H[,AB%\\^b0??ADH	r>$'1y2~+=$>M
 m37
#zL8=HI[!$$ 	* s   'AD   D21D2r.   c                     t        j                  d|j                               }|D ch c]"  }|| j                  vst	        |      dkD  s!|$ c}S c c}w )z$Tokenize text into meaningful terms.z
\b[a-z]+\brR   )refindalllowerr   r:   )r*   r.   wordsws       r+   r   z ContextRelevanceScorer._tokenizeq  sA    

=$**,7 LaAT__$<Q!LLLs   AAAcontextsc                     g }|D ],  \  }}| j                  |||      }|j                  |||f       . t        |d d      S )z
        Rank contexts by relevance to query.

        Args:
            query: User query
            contexts: List of (content, metadata) tuples

        Returns:
            List of (content, metadata, score) sorted by relevance
        c                     | d   S )NrR   rm   r   s    r+   r   z<ContextRelevanceScorer.prioritize_contexts.<locals>.<lambda>  s
    AaD r-   Tr   reverse)r  r   r   )r*   r   r	  scoredry   r   r  s          r+   prioritize_contextsz*ContextRelevanceScorer.prioritize_contextsv  sS     !) 	6GXJJugx8EMM7He45	6 f.$??r-   r   )rf   rg   rh   ri   r   r,   rj   r   rk   r  r   r   r   r   r  rm   r-   r+   r   r   +  s     aYQM	OU
2%3 2% 2% 2%PU 2%hMc Mc M
@ @U39=M8N @SWX]^acgin^nXoSp @r-   r   c            	       p    e Zd ZdZdddddZddefd	Z	 	 dd
edededefdZ	dedefdZ
dd
ededefdZy)ProgressiveDisclosurea  
    Implements progressive disclosure of context.

    Instead of loading everything upfront, reveals context in stages
    based on relevance and need. This mirrors human cognition where
    we retrieve information just-in-time rather than pre-loading everything.
    overview	essentialdetailedcomprehensiver   r    rR   r_   Nbudget_managerc                 H    |xs
 t               | _        t               | _        y r   )r   rM   r   scorerr*   r  s     r+   r,   zProgressiveDisclosure.__init__  s    $<(:(<,.r-   r   depthrM   r0   c           
      j   t        dt        d|            }|xs | j                  |      }t        |j                        }d}t        |j                  d d      }|D ]P  }|dk(  r|j                  t        j                  k7  r'|dk(  r2|j                  j                  t        j                  j                  k  r^|dk(  r2|j                  j                  t        j                  j                  k  r||j                  z   |k  r!|j                  |       ||j                  z  }|dk\  s||z
  }	|	d	kD  s| j                  j!                  |j"                  |	d
      }
t%        |
|j&                  |j                  |j(                  i |j*                  ddi      }|j                  |        |S  |S )a   
        Progressively disclose context based on depth level.

        Args:
            context: Full context bundle
            depth: Disclosure depth (0-3)
            budget: Optional token budget override

        Returns:
            New ContextBundle with disclosed items
        r   r_   r   c                 F    | j                   j                  | j                  fS r   r   r   s    r+   r   z0ProgressiveDisclosure.disclose.<locals>.<lambda>      1::++Q->->? r-   Tr  r    rR   d   )rN   rW   ry   rz   r{   r|   r   )rF   r   _get_budget_for_depthr   r   r   r   r{   ro   rr   r   rs   rt   r   r   rM   r]   ry   rx   rz   r|   r   )r*   r   r  rM   token_budget	disclosedused_tokenssorted_itemsr   r`   trimmed_contenttrimmed_items               r+   disclosezProgressiveDisclosure.disclose  s    As1e}%B!;!;E!B!6	 MM?
 !  	Dzdmm/G/GG zdmm11O4H4H4N4NN zdmm11O4J4J4P4PP T---=d#t///!(;6	s?&*kk&@&@i 'A 'O $/ /#{{!%(,(<(<!CDMM!C9d!C$L MM,/E 	D r-   c                 x    | j                   j                  }ddddd}t        ||j                  |d      z        S )z!Get token budget for depth level.r   r8   r   ?r  r3   )rM   r%   r$   r"   )r*   r  base_budget	fractionss       r+   r"  z+ProgressiveDisclosure._get_budget_for_depth  sC    kk22 	
	 ;uc!::;;r-   r#   c                    |j                   syi }|j                   D ]+  }|j                  }||vrg ||<   ||   j                  |       - dt        |j                          dt        |       dg}|j                         D ]  \  }}|D cg c]6  }|j                  j
                  t        j                  j
                  k\  s5|8 }	}|j                  d| dt        |       dt        |	       d       |	sw|	d	   }
t        |
j                        d
kD  r|
j                  dd
 dz   n|
j                  }|j                  d|         dj                  |      }| j                  j                  ||      S c c}w )z
        Create a summary of context for overview depth.

        Args:
            context: Full context bundle
            max_tokens: Maximum tokens for summary

        Returns:
            Summary text
        zNo relevant context available.zContext Summary (z items from z
 sources):z
- :  items (z high priority)r   r   N...z  Top: r2   )r   rz   r   r:   r{   r   ro   rs   ry   r   rM   r]   )r*   r   r#   	by_sourcer   rz   summary_partsr   ihigh_prioritytopbriefsummarys                r+   create_summaryz$ProgressiveDisclosure.create_summary  sw    }}3 	MM 	+D[[FY&$&	&!f$$T*		+ -S-?,@SQZ^L\\fgh&__. 	8MFE(-`11A1A_EYEYE_E_1_Q`M`  4xr#e*Xc-FXEYYh!ij #A&585E5KDS)E1QTQ\Q\$$wug%67	8 ))M*{{))':>> as   
6E5E5r   r    N)i  )rf   rg   rh   ri   DEPTH_LEVELSr   r,   r   r$   r)  r"  rj   r9  rm   r-   r+   r  r    s     	L/'9 / =>#< <c <<(5<|<3 <3 <#?m #? #?s #?r-   r  c            	           e Zd ZdZddefdZ	 ddedededefd	Zdededefd
Z	dede
fdZdededefdZdededefdZy)ContextCompressorz
    Compresses context to fit within token budgets.

    Implements two strategies:
    1. Compaction: Remove redundant/recoverable information
    2. Summarization: Create concise summaries of content
    Nr  c                 *    |xs
 t               | _        y r   )r   rM   r  s     r+   r,   zContextCompressor.__init__   s    $<(:(<r-   r   target_tokensstrategyr0   c                 *   | j                   j                  |      }||k  r|S |dk(  r| j                  ||      S |dk(  r| j                  ||      S | j                  ||      }| j                   j                  |      |kD  r| j                  ||      S |S )a  
        Compress context to fit target token count.

        Args:
            context: Context to compress
            target_tokens: Target token count
            strategy: Compression strategy (compact, summarize, hybrid)

        Returns:
            Compressed context
        compact	summarize)rM   r@   _compact
_summarize)r*   r   r?  r@  rU   	compacteds         r+   compresszContextCompressor.compress#  s     44W=]*Ny ==-88$??7M:: g}=I{{**95Ey-@@r-   c                     |j                  d      }g }t               }|D ]  }|j                         }|st        j                  |j                         j                               j                         dd }||v r]|j                  |       | j                  |      r|j                  |        dj                  |      }	| j                  j                  |	      |kD  r| j                  j                  |	|      }	|	S )z
        Compact context by removing redundant information.

        Reversible compression - removes info that can be recovered
        from the environment (file contents, repeated info, etc.)
        r2   N   )splitr   striphashlibmd5r  encode	hexdigestr   _is_verboser   r   rM   r@   r]   )
r*   r   r?  linescompacted_linesseen_contentlinestripped	line_hashrF  s
             r+   rD  zContextCompressor._compact@  s     d#u 	)Dzz|H   HNN$4$;$;$=>HHJ2ANIL(Y' )""4(#	)& IIo.	 ;;&&y1MA229mLIr-   rT  c                 J    g d}|D ]  }t        j                  ||      s y y)z#Check if line is verbose/removable.)z^[\s]*#\s*-+\s*$z^[\s]*#+\s*$z^\s*print\s*\(z^\s*console\.log\s*\(z^\s*logger\.(debug|trace)z^[\s]*$z^[\s]*pass\s*$TF)r  match)r*   rT  verbose_patternsr   s       r+   rP  zContextCompressor._is_verbosef  s1    
 ( 	Gxx&	 r-   c                 <   t        j                  d|      }g }h d}|D ]  }|j                         }t        |      dk  r"t	        |j                         j                               }t        ||z        }t        j                  d|      r|dz  }|j                  ||f        |j                  d d       d	g}	d
}
|D ]I  \  }}| j                  j                  |      }|
|z   dz   |k  r|	j                  d|z          |
|dz   z  }
I n dj                  |	      S )ze
        Create a summary of context.

        Non-reversible but preserves key information.
        z[.!?]+>   mustnoteerrorshouldr   successwarningcriticalr   	importantr      z`[^`]+`r    c                     | d   S )Nr   rm   r   s    r+   r   z.ContextCompressor._summarize.<locals>.<lambda>  s
    !A$ r-   Tr  z[Summarized Context]
   rR   - r2   )r  rJ  rK  r:   r   r  searchr   sortrM   r@   r   )r*   r   r?  	sentencesr  keywordssentr  keyword_countr3  r%  r  sent_tokenss                r+   rE  zContextCompressor._summarizew  s,    HHY0	 K  	1D::<D4y2~

**,-E 01M yyT*"MM=$/0	1 	5/0! 	KE4++55d;K[(1,=$$TD[1{Q.	 yy''r-   bundlec           
         |j                   |k  r|S t        |j                        }|}t        |j                  d d      }|D ]  }|dk  r |S t        |j                  t        ||j                  j                  dz  z              }t        |d      }|j                  |k  r!|j                  |       ||j                  z  }| j                  |j                  |      }t        ||j                  |j                  |j                   i |j"                  ddi	      }	|j                  |	       ||	j                  z  } |S )
z
        Compress a context bundle to fit target.

        Args:
            bundle: ContextBundle to compress
            target_tokens: Target token count

        Returns:
            New compressed ContextBundle
        r  c                 F    | j                   j                  | j                  fS r   r   r   s    r+   r   z3ContextCompressor.compress_bundle.<locals>.<lambda>  r  r-   Tr  r   rp   2   
compressedr!  )r   r   r   r   r   r   r   r$   r{   r   rF   r   rG  ry   rx   rz   r|   r   )
r*   rn  r?  rr  r`   r&  r   
allocationcompressed_contentcompressed_items
             r+   compress_bundlez!ContextCompressor.compress_bundle  sC    -/M"6
!	 LL?
 ! 	9DA~2 -   I!4!4q!89:J Z,J:-t$T---	 &*]]4<<%L""-.;;!]]$($8$8BB|TB# /_888	3	96 r-   r   hybrid)rf   rg   rh   ri   r   r,   rj   r$   rG  rD  rl   rP  rE  r   rv  rm   r-   r+   r=  r=    s    ='9 = "* C .1:$ $C $C $L  "*(# *(c *(c *(X3m 3C 3M 3r-   r=  c            	           e Zd ZdZefdefdZd Z	 	 ddede	e   de
d	efd
Zdede
d	e	e   fdZdede
d	e	e   fdZdede
d	e	e   fdZy)MemoryContextLoaderz
    Loads context from Genesis memory architecture.

    Integrates with:
    - Semantic Memory: Knowledge graph entities
    - Episodic Memory: Recent experiences
    - Trigger Memory: Automation rules
    genesis_pathc                 P    || _         t               | _        | j                          y r   )r{  r   r  _init_connections)r*   r{  s     r+   r,   zMemoryContextLoader.__init__  s     (,. r-   c                     t        j                         | _        | j                  dz  | _        | j                  dz  | _        y)z(Initialize connections to memory stores.zsemantic_memory_log.jsonzmemory_store.jsonN)r   get_connection_paramspg_conn_paramsr{  semantic_logmemory_storerI   s    r+   r}  z%MemoryContextLoader._init_connections  sA     -BBD !--0JJ !--0CCr-   Nr   sources	max_itemsr0   c                 T   |xs g d}t        |      }d|v r-| j                  ||dz        }|D ]  }|j                  |        d|v r-| j                  ||dz        }|D ]  }|j                  |        d|v r-| j	                  ||dz        }|D ]  }|j                  |        |S )	a@  
        Load relevant context from all memory sources.

        Args:
            query: Query to find relevant context for
            sources: List of sources to query (episodic, semantic, trigger)
            max_items: Maximum items to return

        Returns:
            ContextBundle with relevant items
        )r   r   r   r  r   rR   r   r_   r   rq   )r   _load_from_episodicr   _load_from_semantic_load_from_triggers)	r*   r   r  r  rn  episodic_itemsr   semantic_itemstrigger_itemss	            r+   load_relevant_contextz)MemoryContextLoader.load_relevant_context  s     @@U+ !55eY!^LN& !

4 !  !55eY!^LN& !

4 !  44UINKM% !

4 ! r-   limitc                    g }	 t        j                  di | j                  }|j                  t         j                  j
                        }|j                         D cg c]/  }t        |j                               dkD  s |j                         1 }}|rYdj                  dgt        |      z        }|D 	cg c]  }	d|	 d
 }
}	|
j                  |       |j                  d| d|
       n|j                  d|f       |j                         }|j                          |j                          |D ]  }| j                  j                  ||d	   |j!                  d
d      |j!                  dd      d      }|j!                  d      xs d}|dk\  rt"        j$                  }n&|dk\  rt"        j&                  }nt"        j(                  }|j                  t+        |d	   d|j!                  d
d       |||j!                  dd      xs d|j!                  d      |j!                  d
d      |j!                  dd      |d              	 |S c c}w c c}	w # t,        $ r#}t.        j1                  d|        Y d}~|S d}~ww xY w)z/Load from episodic memory (Elestio PostgreSQL).)cursor_factoryrR   z OR zcontent ILIKE %s%zR
                    SELECT * FROM em_episodic_memories
                    WHERE za
                    ORDER BY score DESC NULLS LAST
                    LIMIT %s
                z
                    SELECT * FROM em_episodic_memories
                    ORDER BY score DESC NULLS LAST
                    LIMIT %s
                ry   r   r}   r~   )r   r~   r  r3   rP   z	episodic:unknownidrz   )	memory_idr   rz   r  ry   rz   r{   r|   r~   r   zError loading episodic memory: Nrm   )psycopg2connectr  cursorextrasRealDictCursorrJ  r:   rK  r   r   executefetchallcloser  r  r"   ro   rs   rt   ru   rx   	Exceptionloggerr`  )r*   r   r  r   conncurr  search_terms
conditionstermparamsresultsrow	relevancer  r{   es                    r+   r  z'MemoryContextLoader._load_from_episodic  sc   <	B##:d&9&9:D++X__-K-K+LC 05{{}S!AGGIQR@RAGGISLS#[[*<)=L@Q)QR
2>?$AdV1+??e$ !%, '
    X	 llnGIIKJJL  KK--3y>"wwx4377;XZC[\	 (/CC<.33Hc\.55H.22H[	N&swwx'C&DE%$-!ggk26<"%(WWT]"%''(B"7"%''(B"7!&	 > q T
 @`  	BNN<QC@AA	Bs=   AI !II&I 9IFI 
I 	J$JJc                 $   g }| j                   j                         s|S 	 t        | j                         5 }t        j                  |      }ddd       j                  dg       }|d|dz   D ]  }|j                  dd      }|j                  dg       }	| ddj                  d |	D              z   }
| j                  j                  ||
d	|j                  d
d      i      }|dkD  sz|j                  t        |
d|j                  d
d       t        j                  |||j                  d
      d              |j                  d d       |d| }|S # 1 sw Y   xY w# t        $ r#}t        j!                  d|        Y d}~|S d}~ww xY w)zLoad from semantic memory log.NentitiesrR   namer}   observationsr2   c              3   &   K   | ]	  }d |   yw)rf  Nrm   )r   obss     r+   r   z:MemoryContextLoader._load_from_semantic.<locals>.<genexpr>m  s     1UBse*1Us   r   
entityTypeobservationr   z	semantic:r  )entity_nameentity_typer!  c                     | j                   S r   r|   r   s    r+   r   z9MemoryContextLoader._load_from_semantic.<locals>.<lambda>  s    Q%6%6 r-   Tr  zError loading semantic memory: )r  existsopenr   loadr"   r   r  r  r   rx   ro   rt   rh  r  r  r`  )r*   r   r  r   fdatar  entityr  r  ry   r  r  s                r+   r  z'MemoryContextLoader._load_from_semantic]  s     '')L 	Bd''( $Ayy|$ xx
B/H":EAI. zz&"-%zz."=!F"+		1U1U(UU KK--eWfjj}E? 	 s?LL '!*6::lI+N*OP!0!7!7(1+/+1::l+C"	" 	, JJ6JE&5ME
 C$ $<  	BNN<QC@AA	Bs6   E# EBE# 'A-E# E E# #	F,F

Fc                 *   g }| j                   dz  }|j                         s|S 	 |j                  d      D ]  }	 t        |      5 }t	        j
                  |      }ddd       j                  d|j                        }|j                  dg       }	|	D 
cg c]  }
|
j                  dd       }}
d| d	d
j                  |dd        }| j                  j                  |||z         }|dkD  rGt        |      |k  r9|j                  t        |dt        j                  ||t!        |      d              	 |S # 1 sw Y   xY wc c}
w # t        j"                  $ r Y ,w xY w# t$        $ r#}t&        j)                  d|        Y d}~|S d}~ww xY w)z)Load from trigger memory (n8n workflows).zgenesis-n8n-templatesz	**/*.jsonNr  nodestyper  z
Workflow: z
Nodes: z, rp   r   ztrigger:n8n)workflow_nameworkflow_filer!  zError loading trigger memory: )r{  r  globr  r   r  r"   stemr   r  r  r:   r   rx   ro   ru   rj   JSONDecodeErrorr  r  r`  )r*   r   r  r   n8n_pathr  r  r   r  r  n
node_typesry   r  r  s                  r+   r  z'MemoryContextLoader._load_from_triggers  s    $$'>> L	A!){!; m, 0#'99Q<0 $<<0B0BCD$LL"5E EJ!Jq!%%	":!JJ!J *4&	$))JrPQN:S9TUG $ 1 1%4 HI 33u:+=[$+#0%4%8%8,51514]1C&	& 	> ;0 0 "K  ++   	ANN;A3?@@	As_   E& ED;:EE.BE5E& ;E	 EE#E& "E##E& &	F/FF)Nre  )rf   rg   rh   ri   GENESIS_PATHr   r,   r}  rj   r   r$   r   r  rx   r  r  r  rm   r-   r+   rz  rz    s     -9 !T !
	D 48/1 3  '+Cy ), 6C DB BS BT+=N BH) )S )T+=N )V* *S *T+=N *r-   rz  c                   $    e Zd ZdZdZdZdZdZdZy)ContextHookTypezTypes of context hooks.
task_starttask_completecontext_refreshmemory_updateerror_detectedN)	rf   rg   rh   ri   
TASK_STARTTASK_COMPLETECONTEXT_REFRESHMEMORY_UPDATEERROR_DETECTEDrm   r-   r+   r  r    s    !J#M'O#M%Nr-   r  c                   P    e Zd ZU dZeed<   eed<   dZeed<   dZ	e
ed<   dZeed	<   y
)ContextHookz$Represents a context injection hook.	hook_typecallbackr   r{   Tenabledr}   descriptionN)rf   rg   rh   ri   r  r   r   r{   r$   r  rl   r  rj   rm   r-   r+   r  r    s/    .HcGTKr-   r  c                       e Zd ZdZddefdZd ZdefdZde	d	e
fd
Zde	dee   fdZdedefdZddededee   fdZddededefdZdedefdZdededee   defdZdededefdZy)ContextHooksa  
    Manages hooks for automatic context injection.

    Hooks allow automatic context loading at key points:
    - on_task_start: Load relevant context when starting a task
    - on_task_complete: Store learnings back to memory
    - context_refresh: Update stale context
    Nmemory_loaderc                     t         D ci c]  }|g  c}| _        |xs
 t               | _        | j	                          y c c}w r   )r  hooksrz  r  _register_default_hooks)r*   r  r  s      r+   r,   zContextHooks.__init__  sD    +:@
'IrM@

 +C.A.C$$&	@
s   
?c                 H   | j                  t        t        j                  | j                  dd             | j                  t        t        j
                  | j                  dd             | j                  t        t        j                  | j                  dd             y)zRegister default context hooks.re  z!Load relevant context from memory)r  r  r{   r  zStore task learnings to memoryzRefresh stale context itemsN)	registerr  r  r  _default_task_startr  _default_task_completer  _default_context_refreshrI   s    r+   r  z$ContextHooks._register_default_hooks  s     	k%00--;	
 	 	k%33008	
 	 	k%55225	
 	r-   r   c                     | j                   |j                     j                  |       | j                   |j                     j                  d d       y)zRegister a new hook.c                     | j                   S r   )r{   )hs    r+   r   z'ContextHooks.register.<locals>.<lambda>  s
    ajj r-   Tr  N)r  r  r   rh  )r*   r   s     r+   r  zContextHooks.register  s>    

4>>"))$/

4>>"'',@$'Or-   r  r  c                     | j                   |   D cg c]  }|j                  |k7  r| c}| j                   |<   yc c}w )zUnregister a hook by callback.N)r  r  )r*   r  r  r  s       r+   
unregisterzContextHooks.unregister  s?     zz),!
zzX% !


9 !
s   ;r0   c                 
   g }| j                   |   D ]3  }|j                  s	  |j                  di |}|j                  |       5 |S # t        $ r/}t
        j                  d|j                   d|        Y d}~kd}~ww xY w)z
        Trigger all hooks of a type.

        Args:
            hook_type: Type of hook to trigger
            **kwargs: Arguments to pass to hook callbacks

        Returns:
            List of results from hook callbacks
        zHook z	 failed: Nrm   )r  r  r  r   r  r  r]  r  )r*   r  kwargsr  r   resultr  s          r+   r   zContextHooks.trigger  s     JJy) 	ED<<E&00v&	E   EuT%5%5$6isCDDEs   #A

	B%A==Btaskc                     | j                   t        j                  fd|i|}t        |      }|D ]W  }t	        |t              r#|j
                  D ]  }|j                  |        6t	        |t              sG|j                  |       Y |S )zs
        Hook: Called when starting a new task.

        Automatically loads relevant context from memory.
        r  r  )r   r  r  r   
isinstancer   r   rx   )r*   r  r  r  mergedr  r   s          r+   on_task_startzContextHooks.on_task_start  s     $,,99OOO T* 	#F&-0"LL %DJJt$%FK0

6"	# r-   r  	learningsc                 T     | j                   t        j                  f|||xs g d|S )z`
        Hook: Called when completing a task.

        Stores learnings back to memory.
        )r  r  r  )r   r  r  )r*   r  r  r  r  s        r+   on_task_completezContextHooks.on_task_complete0  s<     t||))
o2	

 
 	
r-   r   max_age_hoursc                      | j                   t        j                  f||d|}|D ]  }t        |t              s|c S  |S )ze
        Hook: Refresh stale context items.

        Updates items older than max_age_hours.
        )r   r  )r   r  r  r  r   )r*   r   r  r  r  r  s         r+   r  zContextHooks.context_refresh>  sY     $,,++
'
 	
  	F&-0	 r-   c                 8    | j                   j                  |      S )z/Default task start hook: load relevant context.)r  r  )r*   r  r  s      r+   r  z ContextHooks._default_task_startS  s    !!77==r-   c                    g }	 ddl }|j                  j                  dt        t                     ddlm}  |       }|j                  d| d| dd||d	       |j                  d       |D ]-  }	|j                  |	dd
d|i	       |j                  |	dd        / 	 d|iS # t        $ r t        j                  d       Y d|iS t        $ r%}
t        j                  d|
        Y d}
~
d|iS d}
~
ww xY w)z,Default task complete hook: store learnings.r   N)MemorySystemzCompleted task: z	
Result: context_hooktask_completion)r  r  )ry   rz   r   r   r   source_taskrq  zCould not import memory systemzError storing learnings: stored)syspathinsertrj   r  surprise_memoryr  processr   ImportErrorr  r`  r  r]  )r*   r  r  r  r  r  r  r  r   r   r  s              r+   r  z#ContextHooks._default_task_completeW  s   	:HHOOAs<014!^F NN*4&
6(C%("&&9	   MM+, & -$)%+T2	   hsm,- &!!  	=NN;< &!!  	:LL4QC899&!!	:s   BB$ $C4C4C//C4c                    t        |j                        }t        j                         }|j                  D ]  }	 t        j
                  |j                        }||z
  j                         dz  }||k  r|j                  |       n| j                  j                  |j                  dd d      }	|	r|j                  |	d          nt        |j                  |j                  t        t        d|j                   j"                  dz
              |j$                  dz  |j                  i |j&                  d	d
i      }
|j                  |
        |S # t(        t*        f$ r |j                  |       Y Aw xY w)zDefault context refresh hook.r  r   Nr   r    )r  r   rP   staleTr  )r   r   r	   r   r   r   r~   r   r   r  r  ry   rx   rz   ro   rF   r{   r   r|   r   r   r   )r*   r   r  r  	refreshedr   r   	item_timer   fresh_items
stale_items              r+   r  z%ContextHooks._default_context_refresh}  sQ    "6	llnMM 	$D$$224>>B	 9_;;=D	},MM$' #'"4"4"H"HTc*! #I #K #!k!n5 &1$(LL#';;%4SDMM<O<ORS<S5T%U,0,@,@3,F&*nn%E%Ew%E&
 "j15	$> 	 	* $d#$s   DE E98E9r   r   )rf   rg   rh   ri   rz  r,   r  r  r  r  r   r  r   r   r   rj   r   r  r  rk   r  r  r   r  r  rm   r-   r+   r  r    s    '&9 '4P[ P
O 
x 
 tCy 2# M &
S 
# 
$s) 
} U ^k *> >- >$"3 $" $"S	 $"`d $"L% %16%ER%r-   r  c                   D    e Zd ZdZ	 	 ddededededef
dZdd	ed
e	fdZ
y)SubAgentResultzResult from a sub-agent task.Nr  r  tokens_usedr_  r   c                     || _         || _        || _        || _        |xs i | _        t        j                         j                         | _        y r   )	r  r  r  r_  r   r	   r   r   r~   )r*   r  r  r  r_  r   s         r+   r,   zSubAgentResult.__init__  s@    	& B!113r-   r#   r0   c           
         t               }| j                  }|j                  |      |kD  rt        |      }|j	                  ||      }t        |d| j                  j                  dd       | j                  rt        j                  nt        j                  | j                  rdnd| j                  | j                  | j                  d| j                        S )z-Convert to ContextItem for context injection.z
sub_agent:
agent_typegenericr+  r3   )r  r_  r  )r   r  r@   r=  rG  rx   r   r"   r_  ro   rs   rt   r~   r  )r*   r#   rM   ry   
compressors        r+   to_context_itemzSubAgentResult.to_context_item  s     $%++!!'*Z7*62J ))':>G 1 1,	 JKL-1\\_))?U?U#'<<CSnn		<< --
 	
r-   )r   TN)  )rf   rg   rh   ri   rj   r$   rl   r   r,   rx   r  rm   r-   r+   r  r    sH    'BC8<4S 4# 4C 44154
# 
 
r-   r  c                       e Zd ZdZ	 	 ddedefdZ	 ddededed	e	ee
f   fd
Z	 	 	 ddededededed	efdZ	 ddee   ded	efdZy)SubAgentDelegatorz
    Manages sub-agent delegation for context-heavy tasks.

    Pattern: Orchestrator delegates to sub-agents, each with clean context.
    Sub-agents return condensed results that are integrated into the
    orchestrator's context.
    Nr  max_sub_agent_tokensc                 z    |xs
 t               | _        || _        t        | j                        | _        i | _        y r   )r   rM   r  r=  r  _results_cache)r*   r  r  s      r+   r,   zSubAgentDelegator.__init__  s2    $<(:(<$8!+DKK89;r-   r  relevant_contextsystem_promptr0   c                 &   |r| j                   j                  |      nd}| j                  |z
  dz
  }| j                  j	                  ||      }|||j                         |j                  | j                  | j                  |z
  |j                  z
  dS )aa  
        Prepare context for a sub-agent task.

        Creates a clean, focused context for the sub-agent.

        Args:
            task: Task for the sub-agent
            relevant_context: Relevant context to include
            system_prompt: Optional system prompt additions

        Returns:
            Dictionary with prepared context
        r   r  )r  r  r   context_tokenstotal_budgetremaining_for_response)rM   r@   r  r  rv  r   r   )r*   r  r  r  system_budgetcontext_budgetcompressed_contexts          r+   prepare_sub_agent_contextz+SubAgentDelegator.prepare_sub_agent_context  s    " GT33MBYZ22]BTI "__<<=M~^ *)1130== 55&*&?&?-&ORdRqRq&q
 	
r-   
raw_resultr_  r  summary_tokensc                 h   | j                   j                  |      }||kD  r| j                  j                  ||d      }n|}t	        ||||||| j                   j                  |      d      }t        j                  |j                               j                         dd }	|| j                  |	<   |S )a  
        Process and compress a sub-agent result.

        Takes the raw output and creates a condensed summary for
        integration into the orchestrator's context.

        Args:
            task: Original task
            raw_result: Full result from sub-agent
            success: Whether task succeeded
            agent_type: Type of sub-agent
            summary_tokens: Target tokens for summary

        Returns:
            SubAgentResult with compressed result
        rC  )r@  )r  original_tokenscompressed_tokens)r  r  r  r_  r   NrI  )
rM   r@   r  rG  r  rL  rM  rN  rO  r  )
r*   r  r#  r_  r  r$  
raw_tokensrr  r  	task_hashs
             r+   process_sub_agent_resultz*SubAgentDelegator.process_sub_agent_result  s    ( [[00<
 &11*nWb1cJ#J"(#-%)[[%@%@%L

 KK.88:2A>	)/I&r-   r  r#   c                    t        d      }t        |d d      }|t        t        |      d      z  }|D ]%  }|j	                  |      }|j                  |       ' |j                  |kD  r| j                  j                  ||      }|S )a  
        Merge multiple sub-agent results into a single context bundle.

        Args:
            results: List of sub-agent results
            max_tokens: Maximum tokens for merged result

        Returns:
            ContextBundle with merged results
        zSub-agent resultsr  c                     | j                   S r   )r_  )rs    r+   r   z;SubAgentDelegator.merge_sub_agent_results.<locals>.<lambda>:  s
    qyy r-   Tr  r    )r#   )	r   r   rF   r:   r  r   r   r  rv  )r*   r  r#   rn  sorted_resultstokens_per_resultr  r   s           r+   merge_sub_agent_resultsz)SubAgentDelegator.merge_sub_agent_results+  s     %89  -@$O&#c'lA*>>$ 	F))5F)GDJJt	
 +__44VZHFr-   )NiP  )r}   )Tr  i  )i  )rf   rg   rh   ri   r   r$   r,   rj   r   r   r   r"  rl   r  r*  r   r0  rm   r-   r+   r  r    s     =A-2<'9 <'*< 9;
c 
5B
25
?CCH~
B 374=8<,S ,c ,+/,.1, 36, BP,^ 48tN/C -0<Ir-   r  c                      e Zd ZdZddefdededefdZ	 	 	 d.d	ed
e	e   de
dedef
dZ	 	 d/dede
de
defdZ	 d0deeef   de
dedeeef   fdZ	 	 	 d1dedeeedf   dede
def
dZd2dedede
fdZ	 	 d3dede
dededef
dZde	eeef      d	ede	eeeef      fd Z	 	 d4d!eded"edeeef   fd#Z	 	 d5d!ed$ed%ed&edef
d'Zd6d!ed$ed(e	e   fd)Zd7d*edefd+Zdeeef   fd,Zd- Zy)8ContextManagera  
    Main context engineering manager for Genesis.

    Provides unified interface for:
    - Loading relevant context from memory
    - Progressive disclosure of information
    - Context compression and token management
    - Automatic context injection via hooks
    - Sub-agent delegation support

    Usage:
        ctx = ContextManager()

        # Load context for a task
        context = ctx.load_relevant_context("implement authentication")

        # Progressive disclosure
        disclosed = ctx.progressive_disclosure(context, depth=1)

        # Inject into prompt
        prompt = ctx.inject_context("User request here", disclosed)
    r   Tr   enable_hooksr{  c                 f   || _         t        |      | _        t        |      | _        t        | j                        | _        t        | j                        | _        t               | _
        t        | j                        | _        |rt        | j                        nd| _        d| _        g | _        y)z
        Initialize the Context Manager.

        Args:
            model: Model name for token budget calculation
            enable_hooks: Whether to enable automatic hooks
            genesis_path: Path to Genesis system directory
        r   N)r{  r   rM   rz  r  r=  r  r  
disclosurer   r  r  	delegatorr  r  _current_context_context_history)r*   r   r3  r{  s       r+   r,   zContextManager.__init__e  s     ) )u50>+DKK8/<,.*4;;7 :F\$"4"454
 :>57r-   Nr   r  r  	use_hooksr0   c                    |r(| j                   r| j                   j                  |      }n| j                  j                  |||      }|j                  D ]H  }|j
                  dk(  s| j                  j                  ||j                  |j                        |_        J || _
        | j                  j                  |       |S )az  
        Load relevant context for a query.

        Combines memory search with hook-based augmentation.

        Args:
            query: Query or task description
            sources: Memory sources to query
            max_items: Maximum context items
            use_hooks: Whether to trigger hooks

        Returns:
            ContextBundle with relevant context
        r3   )r  r  r  r  r   r|   r  r  ry   r   r8  r9  r   )r*   r   r  r  r:  r   r   s          r+   r  z$ContextManager.load_relevant_context  s    & jj..u5G((>>ugyYG MM 	D##s*'+{{'8'84<<($	 !($$W-r-   r   r  rM   c                 <    | j                   j                  |||      S )a  
        Apply progressive disclosure to context.

        Depth levels:
        - 0: Overview/summary only
        - 1: Essential information
        - 2: Detailed context
        - 3: Comprehensive (everything)

        Args:
            context: Context to disclose
            depth: Disclosure depth (0-3)
            budget: Optional token budget override

        Returns:
            Disclosed ContextBundle
        )r6  r)  )r*   r   r  rM   s       r+   progressive_disclosurez%ContextManager.progressive_disclosure  s    ( ''??r-   r?  r@  c                     t        |t              r| j                  j                  ||      S | j                  j	                  |||      S )a  
        Compress context to fit within token budget.

        Args:
            context: Context to compress
            target_tokens: Target token count
            strategy: Compression strategy (compact, summarize, hybrid)

        Returns:
            Compressed context
        )r  r   r  rv  rG  )r*   r   r?  r@  s       r+   compress_contextzContextManager.compress_context  s>     g}-??227MJJ??++G]HMMr-   promptpositionmax_context_tokensc                 L   || j                   }||S t        |t              r|j                  d      }n|}|r<| j                  j                  |      }||kD  r| j                  j                  ||      }|dk(  rd| d| S |dk(  r| d| dS |d	k(  r	d| d
| dS d| d| S )aQ  
        Inject context into a prompt.

        Args:
            prompt: User prompt
            context: Context to inject (uses current if None)
            position: Where to inject (before, after, wrapped)
            max_context_tokens: Maximum tokens for context

        Returns:
            Prompt with injected context
        Tr   beforez
<context>
z
</context>

afterz

<context>
z
</context>wrappedz
</context>

<task>
z
</task>)r8  r  r   r   rM   r@   r]   )r*   r@  r   rA  rB  context_textrU   s          r+   inject_contextzContextManager.inject_context  s      ?++G?M g}-"??4?@L"L ![[88FN 22#{{99,HZ[ x .>vhGG X_\N,GG" .FvhiXX .>vhGGr-   r.   r/   c                 :    | j                   j                  ||      S )z
        Estimate token count for text.

        Args:
            text: Text to estimate
            content_type: Type of content (code, prose, json, mixed)

        Returns:
            Estimated token count
        )rM   r@   )r*   r.   r/   s      r+   r@   zContextManager.estimate_tokens  s     {{**4>>r-   rN   c                 >    | j                   j                  ||||      S )a  
        Trim context to fit within token budget.

        Args:
            context: Context to trim
            budget: Maximum tokens
            preserve_start: Keep beginning (vs end)
            content_type: Type of content

        Returns:
            Trimmed context
        )rM   r]   )r*   r   rM   rN   r/   s        r+   r]   zContextManager.trim_to_budget  s     {{))'6><XXr-   r	  c                 :    | j                   j                  ||      S )z
        Rank contexts by relevance to query.

        Args:
            contexts: List of (content, metadata) tuples
            query: Query to score against

        Returns:
            Sorted list of (content, metadata, score)
        )r  r  )r*   r	  r   s      r+   prioritize_contextz!ContextManager.prioritize_context  s     {{..uh??r-   r  r  c                 t    |xs | j                   xs
 t               }| j                  j                  |||      S )a  
        Prepare context for sub-agent delegation.

        Args:
            task: Task for sub-agent
            context: Context to provide (uses current if None)
            system_prompt: Optional system prompt

        Returns:
            Prepared sub-agent context
        )r8  r   r7  r"  )r*   r  r   r  s       r+   delegate_to_sub_agentz$ContextManager.delegate_to_sub_agent'  s4     ET22Emo~~77g}UUr-   r  r_  r  c                 >    | j                   j                  ||||      S )a/  
        Process a sub-agent result for context integration.

        Args:
            task: Original task
            result: Raw result from sub-agent
            success: Whether task succeeded
            agent_type: Type of sub-agent

        Returns:
            Processed SubAgentResult
        )r7  r*  )r*   r  r  r_  r  s        r+   r*  z'ContextManager.process_sub_agent_result8  s$     ~~66&':
 	
r-   r  c                 X    | j                   r| j                   j                  |||       yy)z
        Signal task completion to store learnings.

        Args:
            task: Completed task
            result: Task result
            learnings: List of learnings from task
        N)r  r  )r*   r  r  r  s       r+   r  zContextManager.on_task_completeK  s&     ::JJ''fi@ r-   r  c                     | j                   r7| j                  r+| j                  j                  | j                   |      | _         | j                   S )z
        Refresh stale context items.

        Args:
            max_age_hours: Maximum age before refresh

        Returns:
            Refreshed context bundle
        )r8  r  r  )r*   r  s     r+   refresh_contextzContextManager.refresh_contextW  sC       TZZ$(JJ$>$>%%}%D! $$$r-   c                    | j                   j                         | j                  rt        | j                  j                        nd| j                  r| j                  j
                  nddt        | j                        | j                  dud}| j                  rN| j                  j                  j	                         D ci c]  \  }}|j                  t        |       c}}|d<   |S c c}}w )zGet context manager statistics.r   )r   rA   N)rM   current_contextcontext_history_sizehooks_enabledr  )	rM   rc   r8  r:   r   r   r9  r  r   )r*   statsr  r  s       r+   rc   zContextManager.get_statsg  s     kk++-=A=R=RT22889XY@D@U@U$//<<[\  %((=(=$>!ZZt3
 :: )-

(8(8(>(>(@$Iu U+E'N
 s    C+c                 F    d| _         | j                  j                          y)z&Clear current context and reset state.N)r8  rM   rL   rI   s    r+   clearzContextManager.clear{  s     $r-   )N   Tr:  rw  )NrE  Nrd   re   )Nr}   )Tr  r   r	  )rf   rg   rh   ri   r  rj   rl   r   r,   r   r$   r   r  r=  r   r?  rI  r@   r]   r   r   rk   rM  r   rO  r  r*  r  rS  rc   rZ  rm   r-   r+   r2  r2  M  sy   . %.&*&28c 8#8#8: 590215#3 #(,S	#*-# +/# ;H#L ./.2@m @'*@(+@7D@0 *2NmS.@(A N(+N#&N6;M3<N6ON& VZ'/15*HS *H5T9Q3R *H!$*H+.*H:=*HX?C ?s ? ? /3+2Yc Y3 Y'+Y%(Y7:Y"@4c4i0@+A @"%@*.uS$5E/F*G@ 9=46V# V(5V.1V;?S>V$ 374=
S 
# 
+/
.1
BP
&
AS 
A# 
A$s) 
A%U %M % 4S> (r-   r2  c            
         ddl } | j                  d      }|j                  dg dd       |j                  d	d
d       |j                  ddd       |j                  ddt        dd       |j                  ddt        d       |j                  dddd       |j	                         }t        |j                        }|j                  dk(  r|j                  st        d        y|j                  |j                        }t        d!t        |j                         d"|j                   d#       t        d$       t        |j                  d% d&'      dd( D ]\  }t        d)|j                  j                    d*|j"                   d+|j$                  d,d-       t        d.|j&                  dd/  d0       ^ y|j                  d1k(  r|j                  st        d2       y|j                  |j                        }|j)                  ||j*                  3      }t        d4|j*                   d5t        |j                         d6|j                   d#       t        d7|j-                  d&8      dd9 z          y|j                  d:k(  r{|j.                  xs d;}|j0                  xs d/}|j3                  ||      }	t        d<|j5                  |              t        d=|j5                  |	              t        d>|	        y|j                  d?k(  r|j                  r|j.                  st        d@       y|j                  |j                        }|j)                  ||j*                  3      }|j7                  |j.                  |      }
t        dA|j5                  |
       dB       t        |
ddC        y|j                  dDk(  rB|j.                  xs dE}|j5                  |      }t        dF|dd/  d0       t        dG|        y|j                  dHk(  r;|j9                         }t        dI       t        t;        j<                  |dJK             y)Lz,CLI interface for context engineering skill.r   Nz!Genesis Context Engineering Skill)r  command)r  r)  rG  injectrX  estimatezCommand to execute)choiceshelpz--queryz-qzQuery for context loading)ra  z--textz-tzText for operationsz--depthz-dr    zDisclosure depth (0-3))r  r   ra  z--budgetz-bzToken budget)r  ra  z--modelz-mr   zModel for token limits)r   ra  r5  r  z(Error: --query required for load commandz
Loaded z context items (z tokens)z
Top items:c                     | j                   S r   r  r   s    r+   r   zmain.<locals>.<lambda>  s    8I8I r-   Tr  rp   z  [z] z (relevance: z.2f)z    r   r1  r)  z,Error: --query required for disclose command)r  z
Disclosed at depth r/  r0  r2   rD  r  rG  zSample text for compressionz
Original tokens: ~zCompressed tokens: ~z
Compressed:
r^  z5Error: --query and --text required for inject commandz
Injected prompt (z	 tokens):i  r_  zSample text for estimationz
Text: zEstimated tokens: rX  z
Context Manager Statistics:rR   )indent)argparseArgumentParseradd_argumentr$   
parse_argsr2  r   r]  r   printr  r:   r   r   r   r{   r  rz   r|   ry   r=  r  r   r.   rM   r?  r@   rI  rc   r   dumps)re  parserargsctxr   r   r$  r.   rM   rr  injectedrA   rX  s                r+   mainro    s"   $$7 % F 	 ,   " 	4.IJ
$-BC
	4c14  6

DsH
	44  6 D tzz
*C||vzz<=++DJJ7	#gmm,--=g>R>R=SS[\]n7==.ISWXY[Z[\ 	2DC**+2dkk]-H\H\]`GaabcdDds+,C01	2Z S 
	#zz@A++DJJ7..wdjj.I	%djj\C	4H3IR[RhRhQiiqrsdY&&t&<UdCCDB ? 
	#yy99#))$7
$S%8%8%>$?@A$S%8%8%D$EFG
|,-0 - 
	!zzIJ++DJJ7..wdjj.I	%%dii;#C$7$7$A#B)LMhuo  
	#yy88$$T*dsC()"6(+,  
	 -.djjq)*r-   __main__)9ri   r   rL  r  r  r  r   elestio_configr   r  psycopg2.extrasr'   timeabcr   r   dataclassesr   r   r   r	   r
   enumr   pathlibr   typingr   r   r   r   r   r   r   loggingbasicConfigINFO	getLoggerrf   r  r  r   ro   rx   r   r   r  r=  rz  r  r  r  r  r  r2  ro  exitrm   r-   r+   <module>r~     s  >   	 
 ; < )     # 0 0 (   D D D    ',,/Z [			8	$ +,d dVd  6 6 6$ !" !" !"H[@ [@DC? C?T LU Ux&d &   V Vz!
 !
Hy y@q qp	L^ zL r-   