
    Ki                        d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZ  ej                  e      Zd
dZ	 	 	 	 d	 	 	 	 	 	 	 	 	 dd	Zy)uR   Tool: get_minimal_context — ultra-compact context for token-efficient workflows.    )annotationsN)Path)Any   )
_get_storecompact_responsec                v   	 t        j                  ddd|dgddt        |       d      }|j                  dk(  r|j                  j                         ryt        j                  g d	ddt        |       d      }t        |j                  j                               S # t        t         j                  f$ r Y y
w xY w)z.Quick check for uncommitted or diffed changes.gitdiffz--name-onlyz--T
   )capture_outputtextcwdtimeoutr   )r
   statusz--porcelainF)	
subprocessrunstr
returncodestdoutstripboolFileNotFoundErrorTimeoutExpired)rootbaseresultresult2s       k/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/code_review_graph/tools/context.py_has_git_changesr       s    FM46dD	2

 !fmm&9&9&;..,dD	2

 GNN((*++z889 s   AB AB B87B8c                   t        |      \  }}	 |j                         }d}d}g }	d}
|st        ||      r	 ddlm} ddlm} |}|s	 |||      }|r|D cg c]  }t        ||z         }} |||t        |      |      }|j                  dd      }|d	kD  rd
n|dkD  rdnd}|j                  dg       dd D cg c]  }|j                  dd       }	}t        |j                  dg             }
g }	 |j&                  j)                  d      j+                         }|D cg c]  }|d   	 }}g }	 |j&                  j)                  d      j+                         }|D cg c]  }|d   	 }}| j/                         t1        fddD              rg d}nOt1        fddD              rg d }n6t1        fd!d"D              rg d#}nt1        fd$d%D              rg d&}ng d'}|j2                   d(|j4                   d)|j6                   d*g}|dk7  r|j9                  d+| d,|d-d.       |
r|j9                  |
 d/       t;        d0j=                  |      |	xs d||xs d|xs d|1      |j?                          S c c}w c c}w # t        t        t        t        j                  t        j                   f$ r t"        j%                  dd       Y w xY wc c}w # t        j,                  $ r t"        j%                  d       Y w xY wc c}w # t        j,                  $ r t"        j%                  d       Y w xY w# |j?                          w xY w)2a  Return minimum context an agent needs to start any task (~100 tokens).

    Combines graph stats, top communities, top flows, risk score,
    and suggested next tools into an ultra-compact response.

    Args:
        task: Natural language description of what the agent is doing
              (e.g. "review PR #42", "debug login timeout").
        changed_files: Explicit changed files. Auto-detected from git if None.
        repo_root: Repository root path. Auto-detected if None.
        base: Git ref for diff comparison.
    unknowng        r      )analyze_changes)get_changed_files)	repo_rootr   
risk_scoregffffff?highg?mediumlowchanged_functionsN   name 	test_gapsz+Risk analysis failed in get_minimal_contextT)exc_infoz7SELECT name FROM communities ORDER BY size DESC LIMIT 3z#communities table not yet populatedz8SELECT name FROM flows ORDER BY criticality DESC LIMIT 3zflows table not yet populatedc              3  &   K   | ]  }|v  
 y wN .0w
task_lowers     r   	<genexpr>z&get_minimal_context.<locals>.<genexpr>u   s     J1qJJ   )reviewprmerger   )detect_changesget_affected_flowsget_review_contextc              3  &   K   | ]  }|v  
 y wr2   r3   r4   s     r   r8   z&get_minimal_context.<locals>.<genexpr>w   s     KQjKr9   )debugbugerrorfix)semantic_search_nodesquery_graphget_flowc              3  &   K   | ]  }|v  
 y wr2   r3   r4   s     r   r8   z&get_minimal_context.<locals>.<genexpr>y   s     RQjRr9   )refactorrenamedeadclean)rI   find_large_functionsget_architecture_overviewc              3  &   K   | ]  }|v  
 y wr2   r3   r4   s     r   r8   z&get_minimal_context.<locals>.<genexpr>{   s     WQjWr9   )onboard
understandexplorearch)rN   list_communities
list_flows)r=   rE   rN   z nodes, z edges across z files.zRisk: z (z.2fz).z test gaps. )summarykey_entitiesriskcommunitiesflows_affectednext_tool_suggestions) r   	get_statsr    changesr$   incrementalr%   r   getlenImportErrorOSError
ValueErrorsqlite3Errorr   SubprocessErrorloggerrA   _connexecutefetchallOperationalErrorloweranytotal_nodestotal_edgesfiles_countappendr   joinclose)taskchanged_filesr&   r   storer   statsrY   r'   top_affectedtest_gap_countr$   _get_changedfilesf	abs_filesanalysisrZ   rowsrflowssuggestionssummary_partsr7   s                          @r   get_minimal_contextr   %   sp   $ Y'KE4`! 
"$,T48[5K%(t4E8= >1TAX >I >.yCID H "*lC!@J",s"2)3c)9X"  "*.A2!Fr!J$ fb)$L $ &)k2)F%GN "$	@;;&&Ihj  *..A1Q4.K.
 	:;;&&Jhj  $((aQqT(E(
 ZZ\
J(IJJXKK*JKKNKR*QRR[KW*VWWKK   !%*;*;)< =(()2
 9  6$r*S1A!DE  N#3;!?@HH]+%-#+t =D"-
 	] !?$ Wjz99 [ JUYZ	[ /'' 	@LL>?	@ )'' 	:LL89	:P 	s   &M J
 J ,AJ
 <JJ
 2M 5-K "K.K 0M 3-L  L,L .DM  
J
 
A	KM KM K (LM 
LM L (L?;M >L??M M)r   r   r   r   returnr   )r.   NNzHEAD~1)
ru   r   rv   zlist[str] | Noner&   z
str | Noner   r   r   zdict[str, Any])__doc__
__future__r   loggingre   r   pathlibr   typingr   _commonr   r   	getLogger__name__rh   r    r   r3       r   <module>r      s{    X "      1			8	$, &* 	s
s#s s 	s
 sr   