
    kKjF                        U d Z ddlmZ ddlmZmZmZ ddlmZmZm	Z	 ddl
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 ddlZdd	lmZ dd
lmZ ddlmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ erddl,m-Z- ej\                  dej^                  dej`                  dejb                  dejd                  dejf                  diZ4de5d<   ddZ6	 	 	 	 	 	 	 	 d dZ7d!dZ8d"dZ9	 	 	 	 	 	 d#dZ:	 	 	 	 	 	 d$dZ;y)%a7  SEP-1686 task request handlers.

Handles MCP task protocol requests: tasks/get, tasks/result, tasks/list, tasks/cancel.
These handlers query and manage existing tasks (contrast with handlers.py which creates tasks).

This module requires fastmcp[tasks] (pydocket). It is only imported when docket is available.
    )annotations)datetime	timedeltatimezone)TYPE_CHECKINGAnyLiteralN)ExecutionState)McpError)INTERNAL_ERRORINVALID_PARAMSCancelTaskResult	ErrorDataGetTaskResultListTasksResult)NotFoundError)Prompt)Resource)ResourceTemplate)DEFAULT_POLL_INTERVAL_MSDEFAULT_TTL_MS)get_task_scope)parse_task_keytask_redis_prefix)Tool)VersionSpec)FastMCPworking	completedfailed	cancelledzdict[ExecutionState, str]DOCKET_TO_MCP_STATEc                N    d| vr| dfS | j                  dd      \  }}||r|fS dfS )u  Parse a key suffix into (name_or_uri, version).

    Keys always contain @ as a version delimiter (sentinel pattern):
    - "add@1.0" → ("add", "1.0")  # versioned
    - "add@" → ("add", None)      # unversioned
    - "user@example.com@1.0" → ("user@example.com", "1.0")  # @ in URI

    Uses rsplit to split on the LAST @ which is always the version delimiter.
    Falls back to treating the whole string as the name if @ is not present
    (for backwards compatibility with legacy task keys).
    @N   )rsplit)
key_suffixname_or_uriversions      n/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/server/tasks/requests.py_parse_key_versionr+   5   sC     *4%,,S!4K74444    c                  K   t        |      }| j                  | d|       }| j                  | d| d      }| j                  | d| d      }| j                         4 d{   }|j                  |||       d{   \  }}	}
ddd      d{    r|j	                  d      nd}|st        t        t        d| d            | j                  |       d{   }|st        t        t        d| d	            	r|	j	                  d      nd}	 
rt        |
j	                  d            nt        }|||fS 7 7 7 # 1 d{  7  sw Y   xY w7 |# t        t        f$ r	 t        }Y 9w xY ww)
a  Look up task execution and metadata from Redis.

    Consolidates the common pattern of fetching task metadata from Redis,
    validating it exists, and retrieving the Docket execution.

    Args:
        docket: Docket instance
        task_scope: Authorization scope
        client_task_id: Client-provided task ID

    Returns:
        Tuple of (execution, created_at, poll_interval_ms)

    Raises:
        McpError: If task not found or execution not found
    :z:created_atz:poll_intervalNutf-8zTask 
 not foundcodemessagez execution not found)r   keyredismgetdecoder   r   r   get_executionintr   
ValueErrorUnicodeDecodeError)docket
task_scopeclient_task_idprefixtask_meta_keycreated_at_keypoll_interval_keyr5   task_key_bytescreated_at_bytespoll_interval_bytestask_key	execution
created_atpoll_interval_mss                  r*   _lookup_task_executionrJ   H   s    * z*FJJ&>*:;<MZZ6(!N+;; GHN

fXQ~.>n#MN ||~~FKjj>+<G
 A
=(*= ~ 2@~$$W-TH>U>:J*3UV
 	

 **844I#//CD
 	
 6F!((14J4 # #**734) 	 j"222C A
 ~~~ 5" *+ 434s   A$E=&E'E=*EEE
E=E	AE=#E $9E="E"  E=E	E=EEEE="E:7E=9E::E=c           
       K   t         j                  j                  j                  |       4 d{    |j	                  d      }|st        t        t        d            t               }| j                  }|t        t        t        d            t        |||       d{   \  }}}|j                          d{    t        }|j	                  |j                  d      }	d}
d}|j                  t        j                   k(  r&	 |j#                  t%        d	      
       d{    n8|j*                  r,|j*                  j,                  r|j*                  j,                  }|r'	 t/        j0                  |j3                  dd            }n#t/        j8                  t:        j<                        }t?        ||	|t/        j8                  t:        j<                        t@        ||      cddd      d{    S 7 7 Y7 @7 # t&        $ r}t)        |      }
d|
 }Y d}~d}~ww xY w# t4        t6        f$ r& t/        j8                  t:        j<                        }Y w xY w7 n# 1 d{  7  sw Y   yxY ww)zHandle MCP 'tasks/get' request (SEP-1686).

    Args:
        server: FastMCP server instance
        params: Request params containing taskId

    Returns:
        GetTaskResult: Task status response with spec-compliant fields
    fastmcpNtaskId"Missing required parameter: taskIdr1   Background tasks require Docketr    r   secondstimeoutzTask failed: Zz+00:00rN   status	createdAtlastUpdatedAtttlpollIntervalstatusMessage)!rM   servercontextContextgetr   r   r   r   _docketr   rJ   syncr"   stater
   FAILED
get_resultr   	Exceptionstrprogressr3   r   fromisoformatreplacer:   AttributeErrornowr   utcr   r   )r]   paramsr>   r=   r<   rG   rH   rI   	state_map	mcp_stateerror_messagestatus_messageerrorcreated_at_dts                 r*   tasks_get_handlerru      s)     ~~%%--f-==H-'1U  $%
 >'=  9OJ9
 3
/	:/
 nn (	 MM)//84 	 ??n333A**9Q3G*HHH I$6$6$>$>&//77N ; ( 6 6&&sH5! %LL6M!#",,x||4)(
A >==.3

 	  I A #E
#0!@A / ; (X\\ :;w >===s   /I;G;I;A0I&%G>&I&HAI&
H)H*H.;I&*%H,AI&)I;5I$6I;>I&I&H	H)H$I&$H))I&,2I!I& I!!I&$I;&I8,I/-I84I;c           
     F  K   t         j                  j                  j                  |       4 d{    |j	                  d      }|st        t        t        d            t               }| j                  }|t        t        t        d            |j                  t        |       d|       }|j                         4 d{   }|j	                  |       d{   }ddd      d{    dn|j                  d      }|t        t        t        d	| d
            |j                  |       d{   }	|	t        t        t        d	| d
            |	j!                          d{    t"        }
|	j$                  t&        j(                  t&        j*                  fvr:|
j	                  |	j$                  d      }t        t        t        d| d            	 |	j-                  t/        d             d{   }t=        |      }|d   }d}	 |j?                  d      r<tA        |dd       \  }}|rtC        |      nd}| jE                  ||       d{   }n|j?                  d      r<tA        |dd       \  }}|rtC        |      nd}| jG                  ||       d{   }n|j?                  d      r<tA        |dd       \  }}|rtC        |      nd}| jI                  ||       d{   }nL|j?                  d      r;tA        |dd       \  }}|rtC        |      nd}| jK                  ||       d{   }|t        t        t        d|             dd|ii}tO        |tP              r|jS                  |      }|jU                         }tO        |t2        j4                  j6                        ri |jV                  xs i |}||_,        nYtO        |tZ              r(|\  }}t2        j4                  j7                  |||       }n!t2        j4                  j7                  ||!      }|cddd      d{    S tO        |t\              rO|jS                  |      }|j_                         }i |jV                  xs i |}||_,        |cddd      d{    S tO        |t`              rZ|jS                  |      }|jU                  |jb                        }i |jV                  xs i |}||_,        |cddd      d{    S tO        |td              rc|jS                  |      }|jU                  t;        |jf                              }i |jV                  xs i |}||_,        |cddd      d{    S t        t        t        d"ti        |      jj                               7 7 7 7 # 1 d{  7  sw Y   xY w7 7 o7 # t0        $ rk}t2        j4                  j7                  t2        j4                  j9                  dt;        |            gddd|ii      cY d}~cddd      d{  7   S d}~ww xY w7 7 7 h7 # tL        $ r d}Y *w xY w7 27 7 o7 # 1 d{  7  sw Y   yxY ww)#a6  Handle MCP 'tasks/result' request (SEP-1686).

    Converts raw task return values to MCP types based on task type.

    Args:
        server: FastMCP server instance
        params: Request params containing taskId

    Returns:
        MCP result (CallToolResult, GetPromptResult, or ReadResourceResult)
    rL   NrN   rO   r1   rP   r.   r/   zInvalid taskId: r0   r    z'Task not completed yet (current state: )r   rQ   rS   text)typerx   Tz$io.modelcontextprotocol/related-task)contentisError_metacomponent_identifierztool:   )eqz	resource:	   z	template:zprompt:   zComponent not found for task: )rz   structuredContentr|   )rz   r|   z(Internal error: Unknown component type: )6rM   r]   r^   r_   r`   r   r   r   r   ra   r   r4   r   r5   r7   r8   rb   r"   rc   r
   	COMPLETEDrd   re   r   rf   mcptypesCallToolResultTextContentrg   r   
startswithr+   r   get_toolget_resourceget_resource_template
get_promptr   
isinstancer   convert_resultto_mcp_resultmetar|   tupler   to_mcp_prompt_resultr   uri_templater   uriry   __name__)r]   rn   r>   r=   r<   r@   r5   rC   rF   rG   ro   rp   	raw_valuers   	key_partscomponent_key	componentnameversion_strr)   r   related_task_metafastmcp_result
mcp_resultmergedrz   structured_contents                              r*   tasks_result_handlerr      sf     ~~%%--f-==H-'1U  $%
 >'=  

&7
&C%DAnEU#VW<<>>U#(99]#;;N "> *14~7L7LW7U'.~.>jI  !..x88	'.~.>jI  nn (	??>#;#;^=R=R"SS!ioox@I'Ei[PQR 	'229Q;O2PPI #8,	!"89 IM		''0$6}QR7H$I!k9D+5$"(//$"@@	))+6#5mAB6G#H [9D+5$"("5"5c7"CC	))+6#5mAB6G#H [9D+5$"(">">sG"LL	)))4$6}QR7H$I!k9D+5$"("3"3D'"BB	 '<]OL  3.5
 i&&55i@N'557J*cii&>&>?IZ__2I7HI#)
 J..8++ YY55#&8+ 6 
 !YY55&+ 6 
 S >==V 	6*&55i@N'<<>JE.BE3DEF%Ja >==d 	#34&55i@N'55i6L6LMJE.BE3DEF%Jo >==r 	8,&55i@N'55c)--6HIJE.BE3DEF%J} >==B 'FtIG_G_F`a C >0 "; ">>> 9 	 Q 
	99++..FU.LM: .= ,  C >==~
	, A D M C 	I	E >======s  /Z!WZ!BZW	ZW!W"W&Z1W
2AZ?W# 7Z7W&8A0Z)W,W)	W,Z AY/'Y#(AY/4Y&5AY/Y)AY/Y,Y/C0ZZ!ZZ!AZ"Z!.Z/Z!4AZZ!ZZ!A!Z?Z!Z
Z!0ZZ!ZW
ZW 	WW 		Z&Z)W,,	Y 5AYY ZZ!YZ!Y  Z#Y/&Y/)Y/,Y//Y>:Z=Y>>ZZ!Z!Z!
Z!ZZZZ!c                $   K   t        g d      S w)a"  Handle MCP 'tasks/list' request (SEP-1686).

    Note: With client-side tracking, this returns minimal info.

    Args:
        server: FastMCP server instance
        params: Request params (cursor, limit)

    Returns:
        ListTasksResult: Response with tasks list and pagination
    N)tasks
nextCursor)r   )r]   rn   s     r*   tasks_list_handlerr     s      55s   c           
       K   t         j                  j                  j                  |       4 d{    |j	                  d      }|st        t        t        d            t               }| j                  }|t        t        t        d            t        |||       d{   \  }}}|j                  |j                         d{    t        |d|rt        j                   |      n"t        j"                  t$        j&                        t        j"                  t$        j&                        t(        |d	      cddd      d{    S 7  7 7 7 # 1 d{  7  sw Y   yxY ww)
a-  Handle MCP 'tasks/cancel' request (SEP-1686).

    Cancels a running task, transitioning it to cancelled state.

    Args:
        server: FastMCP server instance
        params: Request params containing taskId

    Returns:
        CancelTaskResult: Task status response showing cancelled state
    rL   NrN   rO   r1   rP   r!   zTask cancelledrV   )rM   r]   r^   r_   r`   r   r   r   r   ra   r   rJ   cancelr4   r   r   ri   rl   r   rm   r   )r]   rn   r>   r=   r<   rG   rH   rI   s           r*   tasks_cancel_handlerr     s4     ~~%%--f-==H-'1U  $%
 >'=  9OJ9
 3
/	:/ mmIMM***
  ! ,,Z8hll+",,x||4)*

E >==.3
 	+; >===sj   /E/EE/A0E%E&&EEA2E?E/EE/EEE/E, E#!E,(E/)r'   rg   returnztuple[str, str | None])r<   r   r=   z
str | Noner>   rg   r   ztuple[Any, str | None, int])r]   r   rn   dict[str, Any]r   r   )r]   r   rn   r   r   r   )r]   r   rn   r   r   r   )r]   r   rn   r   r   r   )<__doc__
__future__r   r   r   r   typingr   r   r	   	mcp.typesr   docket.executionr
   mcp.shared.exceptionsr   r   r   r   r   r   r   fastmcp.server.contextrM   fastmcp.exceptionsr   fastmcp.prompts.baser   fastmcp.resources.baser   fastmcp.resources.templater   fastmcp.server.tasks.configr   r   fastmcp.server.tasks.contextr   fastmcp.server.tasks.keysr   r   fastmcp.tools.baser   fastmcp.utilities.versionsr   fastmcp.server.serverr   	SCHEDULEDQUEUEDRUNNINGr   rd   	CANCELLEDr"   __annotations__r+   rJ   ru   r   r   r    r,   r*   <module>r      s   # 2 2 . .  + *   , ' + 7 P 7 G # 2- i9Ik8k2 . 5&<3<3<3 <3 !	<3~R
jrj66+66$:
:
+:
:
r,   