
    P(iA                        S SK Jr  S SKrS SKJr  S SKJrJr  S SKJ	r	  S SK
JrJr  SSKJr  S	S
.SS jjrSS jrSS jrSS jrSS jrSSS.SS jjrg)    )annotationsN)
HTTPStatus)BaseHTTPRequestHandlerThreadingHTTPServer)Any)parse_qsurlparse   )MemoryServiceF)defaultc               N    U c  U$ U R                  5       R                  5       S;   $ )N>   1onyestrue)striplower)valuer   s     #src/shared_agent_memory/http_api.py_parse_boolr      s'    };;= $>>>    c                p    U R                  U5      nU(       d  g US   R                  5       nU=(       d    S $ )Nr   )getr   )querykeyvaluesr   s       r   _firstr      s/    YYs^F1IOOE=Dr   c                8    [        X5      nUc  U$ [        U5      $ N)r   int)r   r   r   r   s       r   
_first_intr!      s     5E}u:r   c                   0 nU R                  5        He  u  p#UR                  S5      (       d  M  UR                  S5      R                  5       nU(       d  ME  US   R                  5       nU(       d  Ma  XQU'   Mg     U=(       d    S $ )Nz	metadata.r   )items
startswithremoveprefixr   )r   metadatar   r   namer   s         r   _metadata_filtersr(   !   ss    !H{{}~~k**,224q	!5"TN % tr   c                ,   ^   " U 4S jS[         5      nU$ )Nc                     > \ rS rSrSS jrSU 4S jjrSU 4S jjrSU 4S jjrSS jrSS jr	SS jr
\R                  S	.SS
 jjrSrg)'build_handler.<locals>.MemoryAPIHandler0   c                    U R                  [        R                  5        U R                  SSS9  U R	                  5         g )Napplication/json; charset=utf-8r   content_typecontent_length)send_responser   
NO_CONTENT_send_common_headersend_headers)selfs    r   
do_OPTIONS2build_handler.<locals>.MemoryAPIHandler.do_OPTIONS1   s7    z445%%3Tef%gr   c                  > [        U R                  5      n[        UR                  5      n UR                  S:X  aN  STR                  R
                  TR                  5       S.n TR                  5       US'   U R                  U5        g UR                  S:X  Gal  [        US5      nUc!  U R                  [        R                  S5        g UR                  S	/ 5       Vs/ s H)  ofR!                  5       (       d  M  UR!                  5       PM+     nn[        US
5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      S.R#                  5        VV	s0 s H  u  pU	c  M
  X_M     n
nn	U R                  TR%                  UU=(       d    S U
=(       d    S ['        USS5      [)        [        US5      5      S95        g UR                  S:X  aJ  U R                  TR+                  [        US5      [        US5      [        US5      [        US5      S95        g UR                  S :X  a  U R                  S!TR-                  S"U;   a  [        US"5      OS#[        US	5      [        US
5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [        US5      [/        U5      ['        USS$5      S%905        g UR                  R1                  S&5      (       a=  U R                  TR3                  UR                  R5                  S'5      S(   5      5        g UR                  S):X  ak  S nS*U;   a  [)        [        US*5      5      nU R                  S!TR7                  [        US"5      [        US+5      U[        US5      ['        USS$5      S,905        g UR                  R1                  S-5      (       a]  UR                  R9                  S.5      (       a=  U R                  TR;                  UR                  R5                  S'5      S(   5      5        g UR                  R1                  S-5      (       a=  U R                  TR=                  UR                  R5                  S'5      S(   5      5        g UR                  S/:X  aB  U R                  S!TR?                  [        US5      [        US"5      ['        USS$5      S0905        g UR                  R1                  S15      (       a=  U R                  TRA                  UR                  R5                  S'5      S(   5      5        g UR                  S2:X  a7  U R                  S!TRC                  [        US5      ['        USS$5      S3905        g UR                  R1                  S45      (       a=  U R                  TRE                  UR                  R5                  S'5      S(   5      5        g  U R                  [        RH                  5        g ! [         a  n[        U5      US'    S nAGN
S nAff = fs  snf s  sn	nf ! [F         a3  nU R                  [        RH                  [        U5      5         S nAg S nAf[J         a3  nU R                  [        R                  [        U5      5         S nAg S nAf[         a3  nU R                  [        RL                  [        U5      5         S nAg S nAff = f)5Nz/api/statusT)okdb_path	dashboardauditaudit_errorz/api/searchqzMissing query parameter 'q'scopetypesubtype
project_idrepo_id
source_refevidence_refrun_idtask_idorigin_agenturldomain)rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   limit
   include_inbox)filtersrL   rN   z/api/contextprojectrepoagenttask)rP   rQ   rR   rS   z/api/memoriesr#   statusactive2   )rT   r@   memory_typerB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   r&   rL   z/api/memories//   
/api/tasksrequires_human_inputowner_agent)rT   r\   r[   rG   rL   /api/tasks/z/bundle/api/task-runs)rH   rT   rL   /api/task-runs//api/artifacts)rH   rL   z/api/artifacts/)'r	   pathr   r   storer;   dashboard_snapshotaudit_v2	Exceptionstr
_send_jsonr   
send_errorr   BAD_REQUESTr   r   r#   searchr!   r   context_forlist_memoriesr(   r$   
get_memorysplit
list_tasksendswithtask_bundleget_tasklist_task_runsget_task_runlist_artifactsget_artifactKeyError	NOT_FOUND
ValueErrorINTERNAL_SERVER_ERROR)r6   parsedr   payloadexcsearch_queryr@   scopesr   r   rO   r[   services               r   do_GET.build_handler.<locals>.MemoryAPIHandler.do_GET6   sa   dii(FV\\*EK;;-/"#*==#8#8%,%?%?%AG
:+2+;+;+=( OOG,;;-/#)%#5L#+
(>(>@]^9>7B9Oa9OS^S^S`mekkm9OFa %+5&$9'-eY'?*0*E'-eY'?*0*E,25.,I&,UH&='-eY'?,25.,I#)%#7&,UH&=+  %'+"+"JC ! #
+"  " OO("Nd$+Ot",UGR"@*5fUO6T*U '  ;;.0OO++$*5)$<!'v!6"("8!'v!6	 ,  ;;/1OO#W%:%:BJeBSveX'>Ya&,UG&<,25&,A(.ui(@+1%+F(.ui(@+1%+F-3E>-J'-eX'>(.ui(@-3E>-J$*5%$8'-eX'>):5)A&0&D &; &* ;;))*:;;OOG$6$6v{{7H7H7Ma7P$QR;;,.+/(-6/:6%I_;`/a,OO#W%7%7'-eX'>,25-,H5I'-eX'>&0&D &8 &
 ;;))-88V[[=Q=QR[=\=\OOG$7$78I8I#8Nq8Q$RS;;))-88OOG$4$4V[[5F5Fs5KA5N$OP;;"22OO#W%;%;(.ui(@'-eX'>&0&D &< & ;;))*;<<OOG$8$89J9J39OPQ9R$ST;;"22OO#W%;%;(.ui(@&0&D &< & ;;))*;<<OOG$8$89J9J39OPQ9R$ST = OOJ001I % :14S.: b`  
 4 4c#h? 
 6 6CA 
 @ @#c(Ks   8Z &Y% 9Z A Z Z  Z<ZBZ 	Z,Z2AZ AZ "CZ ?AZ A:Z A<Z AZ 1AZ AZ  AZ 'AZ %
Z/Z=Z ZZ 
]	 )[]	)\		]	)]]	c                
  > [        U R                  5      n U R                  5       n UR                  S:X  a.  U R                  TR                  U5      [        R                  S9  g UR                  S:X  Ga   U R                  TR                  US   US   UR                  SS5      UR                  S	S
5      UR                  SS5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      [        UR                  SS5      5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      S9[        R                  S9  g UR                  S:X  Ga  UR                  S5      nUR                  S5      n[!        U["        5      (       a  UR%                  5       (       d!  U R                  [        R                  S5        g [!        U["        5      (       a  UR%                  5       (       d!  U R                  [        R                  S5        g U R                  TR'                  UUUR                  S5      UR                  S5      S9[        R                  S9  g UR                  R)                  S 5      (       a  UR                  R+                  S!5      (       a  UR                  R-                  S"5      S   nUR                  S	5      n[!        U["        5      (       a  UR%                  5       (       d!  U R                  [        R                  S#5        g U R                  TR/                  UUUR                  S$5      UR                  S%5      S&95        g UR                  S':X  a  UR                  S5      nUR                  S(5      nUR                  S5      nUR                  S)5      n	[1        S* X7X4 5       5      (       d!  U R                  [        R                  S+5        g U R                  TR3                  UUUU	UR                  S5      UR                  S,5      S-9[        R                  S9  g  U R                  [        R:                  5        g ! [        [        R
                  [        4 a#    U R                  [        R                  S5         g f = f! [4         a-  n
U R                  [        R                  S.U
 35         S n
A
g S n
A
f[6         a3  n
U R                  [        R8                  [#        U
5      5         S n
A
g S n
A
ff = f)/NInvalid JSON bodyz/api/ingestrT   rZ   titleintentkindrS   rT   openpriorityrY   rC   rD   parent_task_idoriginr\   blocked_reasonr[   Fdue_atr&   rH   rG   )r   r   r   rT   r   rC   rD   r   r   r\   r   r[   r   r&   rH   rG   r^   agent_idzMissing or invalid 'task_id'zMissing or invalid 'agent_id'input_payload)r   r&   r_   z/finishrX   zMissing or invalid 'status'result_summaryerror_message)rT   r   r   r`   artifact_typecontentc              3  p   #    U  H,  n[        U[        5      =(       a    UR                  5       v   M.     g 7fr   )
isinstancerf   r   ).0r   s     r   	<genexpr>Bbuild_handler.<locals>.MemoryAPIHandler.do_POST.<locals>.<genexpr>  s'     ~U}Ez%5G%++-GU}s   46z+Missing or invalid required artifact fieldsrE   )rH   r   r   r   r&   rE   zMissing field: )r	   ra   
_json_bodyUnicodeDecodeErrorjsonJSONDecodeErrorry   rh   r   ri   rg   ingestCREATEDcreate_taskr   boolr   rf   r   start_task_runr$   rp   rn   finish_task_runallcreate_artifactrw   re   rz   rx   )r6   r{   r|   rH   r   rG   rT   r   r   r   r}   r   s              r   do_POST/build_handler.<locals>.MemoryAPIHandler.do_POST   st   dii(F//+
Y;;-/OOGNN7$;JDVDVOW;;,.OO++")'"2#*8#4!(VV!<#*;;x#@%,[[Q%?'.{{<'@$+KK	$:+2;;7G+H#*;;x#8(/M(B+2;;7G+H15gkkBXZ_6`1a#*;;x#8%,[[%<$+KK	$:#*;;x#8! , $  *11' $ * ;;"22%kk)4G&{{:6H%gs337==??
(>(>@^_%h44HNN<L<L
(>(>@_`OO..#$*1++o*F%,[[%<	 /   *11 $  ;;))*;<<AUAUV_A`A`#[[..s3A6F$[[2F%fc22&,,..
(>(>@]^OO//"#)+2;;7G+H*1++o*F	 0  ;;"22%kk)4G$+KK$@M#KK0E%kk)4G~V]nsU}~~~&22I OO//$+*7"'$+%,[[%<'.{{<'@ 0   *11 $ 
 - 3< OOJ001 '(<(<jI 
 6 68KLp  
 6 6/#8OP 
 @ @#c(Ksk   R& =S+ 'D0S+ A=S+ A
S+ !AS+ .B9S+ (?S+ (BS+ 6AS+ &?S('S(+
U5#TU*)UUc                  > [        U R                  5      nUR                  R                  S5      (       d   U R                  [        R
                  5        g  U R                  5       n U R                  TR                  UR                  R                  S5      S   UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S	5      UR                  S
5      S95        g ! [        [        R                  [        4 a#    U R                  [        R                  S5         g f = f! [          a3  nU R                  [        R
                  [#        U5      5         S nAg S nAf[$         a3  nU R                  [        R&                  [#        U5      5         S nAg S nAff = f)Nr]   r   rX   rY   rT   r\   r   r[   r&   rG   )rT   r\   r   r[   r&   rG   )r	   ra   r$   rh   r   rx   r   r   r   r   ry   ri   rg   update_taskrn   r   rw   rf   re   rz   )r6   r{   r|   r}   r   s       r   do_PATCH0build_handler.<locals>.MemoryAPIHandler.do_PATCH.  s[   dii(F;;))-88
 4 45//+L''))#.q1&{{84$+KK$>'.{{3C'D-4[[9O-P!(Z!8&{{84 ( 
	 '(<(<jI 
 6 68KL  @
 4 4c#h?? L
 @ @#c(KKLs7   D )BE	 ?EE	
G)FG)F<<Gc                    g r    )r6   fmtargss      r   log_message3build_handler.<locals>.MemoryAPIHandler.log_messageI  s    r   c                "   [        U R                  R                  SS5      5      nU(       a  U R                  R	                  U5      OSn[
        R                  " UR                  S5      5      n[        U[        5      (       d  [        S5      eU$ )NContent-Length0s   {}utf-8zJSON body must be an object)r    headersr   rfilereadr   loadsdecoder   dictry   )r6   lengthrawr|   s       r   r   2build_handler.<locals>.MemoryAPIHandler._json_bodyL  si    ))*:C@AF-3$**//&)CjjG!45Ggt,, !>??Nr   c                   U R                  SU5        U R                  S[        U5      5        U R                  SS5        U R                  SS5        U R                  SS5        g )NzContent-Typer   zAccess-Control-Allow-Origin*zAccess-Control-Allow-HeaderszAccess-Control-Allow-MethodszGET,POST,PATCH,OPTIONS)send_headerrf   )r6   r0   r1   s      r   r4   <build_handler.<locals>.MemoryAPIHandler._send_common_headersT  s\    ^\:-s>/BC:C@;^L;=UVr   r   c                   [         R                  " USS9R                  S5      nU R                  U5        U R	                  S[        U5      S9  U R                  5         U R                  R                  U5        g )NT)ensure_asciir   r.   r/   )	r   dumpsencoder2   r4   lenr5   wfilewrite)r6   r|   rT   bodys       r   rg   2build_handler.<locals>.MemoryAPIHandler._send_json[  sd    ::gD9@@IDv&%%3Tehimen%oJJT"r   r   N)returnNone)r   rf   r   r   r   r   )r   dict[str, Any])r0   rf   r1   r    r   r   )r|   r   rT   r   r   r   )__name__
__module____qualname____firstlineno__r7   r   r   r   r   r   r4   r   OKrg   __static_attributes__)r   s   r   MemoryAPIHandlerr+   0   sA    	
Q	2fc	2J	L6			W OYmm 	# 	#r   r   )r   )r   r   s   ` r   build_handlerr   /   s    p#1 p#d	 r   z	127.0.0.1i  )hostportc                    [        U 5      n[        X4[        U5      5      n[        SU SU 3SS9   UR	                  5         UR                  5         g ! UR                  5         f = f)Nz$agents-database listening on http://:T)flush)r   r   r   printserve_foreverserver_close)r;   r   r   r   servers        r   run_http_serverr   e  sa    G$G $}W/EFF	0av
>dKs   A A&)r   
str | Noner   r   r   r   )r   dict[str, list[str]]r   rf   r   r   )r   r   r   rf   r   r    r   r    )r   r   r   zdict[str, Any] | None)r   r   )r;   rf   r   rf   r   r    r   r   )
__future__r   r   httpr   http.serverr   r   typingr   urllib.parser   r	   r   r   r   r   r!   r(   r   r   r   r   r   <module>r      sK    "   C  + " 7< ?sl	 2=$  r   