+
    j?                       ^ RI Ht  ^ RIHtHt ^ RIHt ^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHt ]! ]4      P!                  4       P"                  ^,          t]R,          R,          t]R	,          R
,          t]R	,          R,          t]R	,          R,          t]! RRR7      tR R ltR R ltR5R R lltR6R R llt]P9                  RR7      R R l4       t]P9                  RR7      R5R R ll4       t]P9                  RR7      R7R  R! ll4       t]P9                  R"R7      R8R# R$ ll4       t ]P9                  R%R7      R& R' l4       t!]P9                  R(R7      R) R* l4       t"]P9                  R+R7      R, R- l4       t#]P9                  R.R7      R9R/ R0 ll4       t$]%R18X  dU   ]PL                  ! 4       t']'PQ                  R2R3. R:OR47       ]'PS                  4       t*]PW                  ]*PX                  4       R# R# );    )annotations)asdict	dataclass)PathN)Any)FastMCPindexz
archive.dbzapproved-memoryzinstall-batch-proposed.jsonlzapproved-memories.jsonlzsource-only-index.jsonlai-archive-openbrain-bridgezOpenBrain-style local memory bridge for Bert's archive. Use this to search the archive, approved memories, and source-only evidence.)instructionsc                    V ^8  d   QhRRRR/# )   pathr   returnlist[dict[str, Any]] )formats   "?/Users/bertmahoney/workspace/ai-archive/mcp/openbrain_bridge.py__annotate__r   )   s      d 3     c                t   V P                  4       '       g   . # . pV P                  R RR7      ;_uu_ 4       pV FC  pVP                  4       pV'       g   K   VP                  \        P
                  ! V4      4       KE  	  RRR4       V#   \        P                   d     Ki  i ; i  + '       g   i     T# ; i)rzutf-8)encodingN)existsopenstripappendjsonloadsJSONDecodeError)r   itemsflines   &   r   _read_jsonlr#   )   s    ;;==	"$E	3	)	)QD::<DTZZ-.  
* L ''  
*	) Ls/    B&%B
<B&
B#	B&"B#	#B&&B7	c                    V ^8  d   QhRRRR/# )r   querystrr   r   )r   s   "r   r   r   9   s     0 0 0 0r   c                B    R V P                  R R4      ,           R ,           # )"z"")replace)r%   s   &r   _phrase_queryr*   9   s    sD))C//r   c          
     ,    V ^8  d   QhRRRRRRRRR	R
/# r   r%   r&   source
str | Nonelimitintraw_ftsboolr   r   r   )r   s   "r   r   r   =   s1     ' '# 'z ' 'SW 'dx 'r   c                   \         P                  4       '       g   . # \        P                  ! \         4      p\        P                  Vn         R pV'       d   T M
\        V 4      .pV'       d   VR,          pVP                  V4       VR,          pVP                  V4       VP                  WV4      P                  4       pVP                  4        . pV FR  p	\        V	4      p
 \        P                  ! V
P                  R4      ;'       g    R4      V
R&   VP                  V
4       KT  	  V#   TP                  4        i ; i  \        P                   d    RT
P                  R4      /T
R&    LYi ; i)uz  
        SELECT
          c.chunk_id,
          c.conversation_id,
          c.source,
          c.title,
          c.message_start,
          c.message_end,
          c.text,
          c.metadata_json,
          snippet(chunks_fts, 4, '[', ']', '…', 18) AS snippet
        FROM chunks_fts f
        JOIN chunks c ON c.rowid = f.rowid
        WHERE chunks_fts MATCH ?
        z AND c.source = ?z LIMIT ?metadata_json{}metadataraw_metadata_json)INDEX_DBr   sqlite3connectRowrow_factoryr*   r   executefetchallclosedictr   r   popr   )r%   r-   r/   r1   connsqlparamsrowspayloadrowitems   &&&&       r   _search_chunksrI   =   s1   ??	??8$D{{D '.U=3GH&&CMM&!ze||C(113

$&GCy	P#zz$((?*C*K*KtLD 	t  N 	

 ## 	P 3TXXo5NOD	Ps1   	D, D, -AD, #'E
E,D>+E/.E/c               (    V ^8  d   QhRRRRRRRR/# )	r   r   r   r%   r&   r/   r0   r   r   r   )r   s   "r   r   r   g   s)     	 	 	S 	 	>R 	r   c                
   . pVP                  4       P                  4       p\        V 4       FS  p\        P                  ! VR R7      P                  4       pWF9   d   VP                  V4       \        V4      V8  g   KR   V# 	  V# )Fensure_ascii)lowerr   r#   r   dumpsr   len)r   r%   r/   resultsqrG   blobs   &&&    r   _search_jsonlrT   g   so    GA4 zz#E288:9NN3w<5 N ! Nr   z:Get a quick status summary for the OpenBrain-style bridge.)descriptionc                   V ^8  d   QhRR/# )r   r   zdict[str, Any]r   )r   s   "r   r   r   t   s       r   c                     \        \        4      p \        R  V  4       4      p\        \        4      pRRR\	        \
        4      R\        P                  4       R\	        \        4      RVR\        V4      RR	R
R/# )c              3  T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5i)decisionAPPROVEN)get).0rG   s   & r   	<genexpr>status.<locals>.<genexpr>v   s      Shs''*2E2Rhs   (
(bridger
   rootindex_db_existsapproved_batch_pathapproved_countsource_only_countmcp_surfacezlocal stdiobackend_notezJOpenBrain-compatible bridge over local archive + reviewed memory artifacts)	r#   APPROVED_BATCHsumSOURCE_ONLY_INDEXr&   ROOTr8   r   rP   )approvedrc   source_onlys      r   statusrm   s   sp    >*HShSSN/0K/D	8??,s>2.S-}d	 	r   z<Search the archive index by phrase or raw SQLite FTS syntax.c          
     ,    V ^8  d   QhRRRRRRRRR	R
/# r,   r   )r   s   "r   r   r      s8     T T# Tz T TSW Tdx Tr   c                    \        WW#R 7      # )r%   r-   r/   r1   )rI   rp   s   &&&&r   search_archiverq      s    ESSr   z=Search approved memory items from the reviewed install batch.c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r   r%   r&   memory_typer.   projectr/   r0   r   r   r   )r   s   "r   r   r      s6      C j R\ lo   zN r   c                   . pV P                  4       P                  4       p\        \        4       F  pVP	                  R 4      R8w  d   K  \
        P                  ! VRR7      P                  4       pWW9  d   KI  V'       d   VP	                  R4      V8w  d   Ki  V'       d   VP	                  R4      V8w  d   K  VP                  V4       \        V4      V8  g   K   V# 	  V# )rY   rZ   FrL   rs   rt   )	rN   r   r#   rg   r[   r   rO   r   rP   )r%   rs   rt   r/   rE   rR   rG   rS   s   &&&&    r   search_approved_memoriesrv      s    DA>*77:)+zz#E288:=377=1[@swwy)W4Ct9K + Kr   zJList approved memory items, optionally filtered by memory type or project.c               (    V ^8  d   QhRRRRRRRR/# )r   rs   r.   rt   r/   r0   r   r   r   )r   s   "r   r   r      s*      
 J ^a k r   c                .   . p\        \        4       F  pVP                  R 4      R8w  d   K  V '       d   VP                  R4      V 8w  d   K;  V'       d   VP                  R4      V8w  d   K[  VP                  V4       \	        V4      V8  g   K~   V# 	  V# )rY   rZ   rs   rt   r#   rg   r[   r   rP   )rs   rt   r/   rE   rG   s   &&&  r   list_approved_memoriesrz      s}    D>*77:)+377=1[@swwy)W4Ct9K + Kr   z-Get one approved memory item by candidate ID.c                    V ^8  d   QhRRRR/# r   candidate_idr&   r   dict[str, Any] | Noner   )r   s   "r   r   r      s      S %: r   c                    \        \        4       F5  pVP                  R 4      V 8X  g   K  VP                  R4      R8X  g   K3  Vu # 	  R# )r}   rY   rZ   N)r#   rg   r[   r}   rG   s   & r   
get_memoryr      s<    >*77>"l2swwz7Ji7WJ + r   z)Get one source-only item by candidate ID.c                    V ^8  d   QhRRRR/# r|   r   )r   s   "r   r   r      s      # *? r   c                f    \        \        4       F  pVP                  R 4      V 8X  g   K  Vu # 	  R# )r}   N)r#   ri   r[   r   s   & r   get_source_onlyr      s-    ,-77>"l2J . r   z>Fetch a source chunk from the local archive index by chunk ID.c                    V ^8  d   QhRRRR/# )r   chunk_idr&   r   r~   r   )r   s   "r   r   r      s      s '< r   c                   \         P                  4       '       g   R # \        P                  ! \         4      p\        P                  Vn         VP                  RV 34      P                  4       pVP                  4        Vf   R # \        V4      p \        P                  ! VP                  R4      ;'       g    R4      VR&   V#   TP                  4        i ; i  \        P                   d    RTP                  R4      /TR&    T# i ; i)Nz
            SELECT chunk_id, conversation_id, source, title, message_start, message_end, text, metadata_json
            FROM chunks
            WHERE chunk_id = ?
            r4   r5   r6   r7   )r8   r   r9   r:   r;   r<   r=   fetchoner?   r@   r   r   rA   r   )r   rB   rG   rH   s   &   r   get_source_chunkr      s    ????8$D{{D
ll
 K
 (* 	 	


{9DL::dhh&?&G&G4HZ K 	

  L//1JKZKLs$   !C 'C 8
C C+DDz7List reviewed candidate packets from the install batch.c               $    V ^8  d   QhRRRRRR/# )r   rY   r.   r/   r0   r   r   r   )r   s   "r   r   r      s"      
 # G[ r   c                    . p\        \        4       FG  pV '       d   VP                  R 4      V 8w  d   K#  VP                  V4       \	        V4      V8  g   KF   V# 	  V# )rY   ry   )rY   r/   rE   rG   s   &&  r   list_review_itemsr      sS    D>*
+x7Ct9K + Kr   __main__z--transportstdio)defaultchoices)N   F)
   )NNr   )NN2   )Nr   )r   ssezstreamable-http)-
__future__r   dataclassesr   r   pathlibr   argparser   r9   systypingr   mcp.server.fastmcpr   __file__resolveparentsrj   r8   rg   APPROVED_MEMORIESri   mcpr#   r*   rI   rT   toolrm   rq   rv   rz   r   r   r   r   __name__ArgumentParserparseradd_argument
parse_argsargsrun	transportr   r   r   <module>r      s
   " *     
  &H~''*'>L()),JJ,,/HH ,,/HH !	W 0'T	 RS T  TUT VT UV W& bc d EF G AB C VW X4 OP Q z$$&F
w@cdDGGDNN	 r   