
    i+                        d Z ddlmZ ddlZddlZddlmZ dZeej                  vrej                  j                  de       ddZ
y)u;  
Genesis KB MCP Tools — Module 9
=================================
Registers 3 MCP tools on a FastMCP instance for platform knowledge base
operations: search, list, and ingest.

Stories implemented:
  9.01 — search_platform_kb   — Semantic search across the KB bloodstream
  9.02 — list_platform_kbs    — List platforms with vector + ingestion stats
  9.03 — ingest_platform_kb   — Trigger full platform ingestion pipeline

Usage:
    from kb_tools import register_kb_tools
    register_kb_tools(mcp)          # adds 3 tools to an existing FastMCP instance
    )annotationsN)TYPE_CHECKINGz/mnt/e/genesis-systemc                    | j                         ddd       }| j                         dd       }| j                         dd	d       }y)
z|Register all 3 KB tools on the given FastMCP instance.

    Args:
        mcp: A FastMCP instance to register tools on.
    c                   | r| j                         s	 yddlm}m} |r|j                         r|j                         j	                         } || |      }|D cg c]V  }|j                  dd      j	                         |k(  s/|j                  dd      j	                         j                  |      r|X }}|s
 || |      S d| d	t        |       d
g}	t        |d      D ]  \  }
}|	j                  d|
 d|j                  dd       d|j                  dd       d|j                  dd       d	       |	j                  d|j                  dd              t        |j                  dd            dd }|	j                  d|        |	j                  d        dj                  |	      S  || |      S c c}w )a  Search the platform knowledge base for relevant documentation.

        Performs semantic search across the Genesis bloodstream Qdrant collection
        using Gemini embeddings.  Returns a formatted context string suitable for
        injection into an LLM prompt.

        Args:
            query:    Natural language search query.
            platform: Optional platform filter (e.g. "hubspot", "telnyx", "ghl").
                      Leave empty to search all platforms.
            top_k:    Number of results to return (default 5).

        Returns:
            Formatted context string with the top matching KB entries, or a
            message indicating no results were found.
        zPlease provide a non-empty search query to search the platform KB.
Example: search_platform_kb('How do I configure a Telnyx AI assistant?')r   )rag_context	rag_query)questiontop_kplatform sourcez$=== BLOODSTREAM KNOWLEDGE (platform=, z matches) ===
   [z] titlez	 (score: scorez, type: type)z    Source: contentNi  z    
)stripcore.rag_queryr   r   lowerget
startswithlen	enumerateappendstrjoin)queryr   r
   r   r   platresultsrfilteredlinesir   s               :/mnt/e/genesis-system/mcp-servers/genesis-core/kb_tools.pysearch_platform_kbz-register_kb_tools.<locals>.search_platform_kb)   s   $ EKKM[
 	:
 (>>#))+De<G#* IaaeeJ.C.I.I.Kt.S552.446AA$G  IH I"E??;D6CM?RabcE!(A. !1q2aeeGR&8%9155RSCTBU V''(uuVR'8&9< =|AEE(B,?+@ABaeeIr23DS9tG9-.R ! 99U## E77#Is   AF=c                    ddl m} m} ddlm} ddlm}m}  |        }|sy	  |       }i }d}		  |       }	|D ]  }
	  ||	|
d      }|r|d   ni ||
<    	 |		 |	j                          d	d
g}|D ]   }
 ||
      }|r|j                  n|
}|j                  di       }|j                  |
i       j                  dd      }|dk(  r|j                  |
d      }|j                  |
i       }t        |j                  d|j                  dd                  }|rt        |      dkD  r|dd }|j                  dd      }|j                  dd      }|j                  d|
 d| d| d| d| d| d        |j                  dd      }|j                  d       |j                  d|        |j                  dt        |              dj                  |      S # t        $ r}i }Y d}~d}~ww xY w# t        $ r	 i ||
<   Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# |	!	 |	j                          w # t        $ r Y w w xY ww xY w)a  List all available platform knowledge bases with ingestion stats.

        Combines data from:
        - The Platform Registry (registered platform configs)
        - Qdrant (per-platform vector counts)
        - PostgreSQL (last ingestion timestamp and chunk/page counts)

        Returns:
            A markdown table with columns: Platform, Display Name, Vectors,
            Last Ingest, Pages, Chunks.
        r   )list_platformsget_platform)get_platform_stats)get_ingestion_historyget_connectionz5No platform knowledge bases are currently registered.Nr   )limitzD| Platform | Display Name | Vectors | Last Ingest | Pages | Chunks |zC|----------|-------------|---------|-------------|-------|--------|	platformscountcompleted_at
started_atu   —   pages_fetchedchunks_createdz| z | z |total_vectorsr   z!**Total vectors in collection:** z**Registered platforms:** r   )core.kb.platform_registryr+   r,   core.kb.qdrant_storer-   core.kb.pg_storer.   r/   	Exceptionclosedisplay_namer   r   r   r   r    )r+   r,   r-   r.   r/   r1   qdrant_statsexc
pg_historyconnnamehistoryr&   configdisplayper_platformvectorshistlast_ingestpageschunksr8   s                         r(   list_platform_kbsz,register_kb_tools.<locals>.list_platform_kbsa   s    	K;J"$	J	-/L
 ')
	!#D! **3D$aHG5<wqz"Jt$* JJL SQ
  	D!$'F-3f))G (++K<L"&&tR044Wa@G!|&**43 >>$+Ddhh~txxe7TUVKs;/"4)#2.HH_e4EXX.6FLLTF#gYc'#k]#eWCPVxWYZ'	. %((!<R8HI1#i.1ABCyyo  	L	 ! *')Jt$* 		 !  JJL    s   G H G0H H% H 	G- G((G-0H>H HH 	HH% HH% 	H"!H"%I
)H:9I
:	II
II
c                   ddl m}m} ddlm}  ||       }|& |       }d|  d|rdj                  |       d	S d d	S 	 t        j                   || |
            }|j                  dd      }	|j                  dd      }
d}|
dkD  r2|j                  dg       dd }dj                  d |D              }d| }d|j                   d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       d |
 d!|	d"d#| S # t        $ r}d| cY d}~S d}~wt        $ r}d|  d| dcY d}~S d}~ww xY w)$aS  Trigger platform KB ingestion and return a progress summary.

        Runs the full ingestion pipeline: sitemap fetch -> extract -> chunk ->
        embed -> upsert to Qdrant + PostgreSQL.

        Args:
            platform:  Platform name (e.g. "hubspot", "telnyx", "ghl").
                       Must match a registered platform in the registry.
            max_pages: Maximum number of pages to ingest (default 100, safety
                       limit to prevent runaway ingestions).

        Returns:
            Formatted summary with pages, chunks, vectors, errors, and duration.
        r   )r,   r+   )ingest_platformNzUnknown platform: 'z'.
Registered platforms: r   z(none)z8
Use list_platform_kbs() to see all available platforms.)r   	max_pageszIngestion failed: zIngestion error for platform 'z': z
Check server logs for details.duration_secondserrorsr   error_details   z; c              3  j   K   | ]+  }|j                  d d       d|j                  dd        - yw)step?z: errorN)r   ).0ds     r(   	<genexpr>z@register_kb_tools.<locals>.ingest_platform_kb.<locals>.<genexpr>   s;      ! 55$%Rgc(:';<!s   13z
First errors: zIngestion complete for 'z'
  Pages fetched:    r6   z
  Pages skipped:    pages_skippedz"  (unchanged)
  Chunks created:   r7   z
  Vectors upserted: vectors_upsertedz
  Errors:           z
  Duration:         z.1fs)r9   r,   r+   core.kb.orchestratorrO   r    asynciorun
ValueErrorr<   r   r>   )r   rP   r,   r+   rO   rE   
registeredstatsr@   durationrR   
error_notedetailssnippetss                 r(   ingest_platform_kbz-register_kb_tools.<locals>.ingest_platform_kb   s     	K8 h'>')J%hZ 0)BL:)>([ \JJRZ([ \JJ
	KKYGE 99/38Q'
A:ii4Ra8Gyy ! ! H ,H:6J 'v':':&; <##(99_a#@"A B##(99_a#@"A B##(99-=q#A"B C##(99-?#C"D E##)( +##+C.l		
)  	.'u-- 	0
#cU C1 1	s0    D 	E(D2,E2E>EEEN)r      )r!   r   r   r   r
   intreturnr   )rl   r   )d   )r   r   rP   rk   rl   r   )tool)mcpr)   rM   ri   s       r(   register_kb_toolsrp   "   sT     	XXZ18 18n 	XXZN  N h 	XXZ>
 >
    )rl   None)__doc__
__future__r   r`   systypingr   _PROJECT_ROOTpathinsertrp    rq   r(   <module>r{      sC     #  
   ( HHOOA}%S
rq   