
    `gj`&                     ~   d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlZddlmZmZ ddlmZmZmZ  ej&                  e      Zded	efd
Zded	edz  fdZdej2                  dedej4                  ded	df
dZ	 ddej2                  dedej4                  de
ee	e   f   de
ee
eef   f   deg eeedz  f   f   dz  d	efdZdej2                  dedej4                  d	efdZdej2                  dedej4                  de
ee	e   f   de
ee
eef   f   d	efdZdej2                  dedej4                  d	efdZ y)a  Callback factories for bridging AIAgent events to ACP notifications.

Each factory returns a callable with the signature that AIAgent expects
for its callbacks. Internally, the callbacks push ACP session updates
to the client via ``conn.session_update()`` using
``asyncio.run_coroutine_threadsafe()`` (since AIAgent runs in a worker
thread while the event loop lives on the main thread).
    N)deque)AnyCallableDequeDict)AgentPlanUpdate	PlanEntry   )build_tool_completebuild_tool_startmake_tool_call_idvaluereturnc                     | j                         }	 t        j                  |      S # t        $ r- t        j                         }|j                  |      \  }}|cY S w xY w)zDParse a JSON object even when Hermes appended a human hint after it.)stripjsonloads	ExceptionJSONDecoder
raw_decode)r   textdecoderdata_s        E/root/.hermes/venv/lib/python3.12/site-packages/acp_adapter/events.py_json_loads_maybe_prefixr      sW    ;;=Dzz$ ""$$$T*as   ' 3AAresultc                    t        | t              r| j                         sy	 t        |       }t        |t
              rt        |j                  d      t              sy|d   }|st        dg       S ddddd}g }|D ]  }t        |t
              st        |j                  d	      xs |j                  d
      xs d      j                         }|sVt        |j                  d      xs d      j                         }|j                  |d      }|dk(  rd| }|j                  t        |d|              t        d|      S # t        $ r Y yw xY w)aV  Translate Hermes' todo tool result into ACP's native plan update.

    Zed renders ``sessionUpdate: plan`` as its first-class task/todo panel. The
    Hermes agent already maintains task state through the ``todo`` tool, so the
    ACP adapter should expose that state natively instead of only as a generic
    tool-call transcript block.
    Ntodosplan)session_updateentriespendingin_progress	completed)r#   r$   r%   	cancelledcontentid statusr&   z[cancelled] medium)r'   priorityr*   )
isinstancestrr   r   r   dictgetlistr   appendr	   )	r   r   r   
status_mapr"   itemr'   
raw_statusr*   s	            r   #_build_plan_update_from_todo_resultr6   '   sP    fc"&,,.'/ dD!DHHW4Et)LMEfbAA $  !J  "G 
U$%dhhy)ATXXd^ArBHHJ(+8y9??A

I6$$WI.Gy8FST
U &'BBA  s   E 	EEconn
session_idloopupdatec                     ddl m}  || j                  ||      |t        d      }|y	 |j	                  d       y# t
        $ r t        j                  dd	       Y yw xY w)
z;Fire-and-forget an ACP session update from a worker thread.r   )safe_schedule_threadsafezFailed to send ACP update)loggerlog_messageN   )timeoutTexc_info)agent.async_utilsr<   r!   r=   r   r   debug)r7   r8   r9   r:   r<   futures         r   _send_updaterF   W   sj     ;%J//	F ~Aa  A04@As   >  A! A!tool_call_idstool_call_metaedit_approval_policy_getterc                 ^     ddt         dt         dt         dt        ddf
 fd}|S )	a  Create a ``tool_progress_callback`` for AIAgent.

    Signature expected by AIAgent::

        tool_progress_callback(event_type: str, name: str, preview: str, args: dict, **kwargs)

    Emits ``ToolCallStart`` for ``tool.started`` events and tracks IDs in a FIFO
    queue per tool name so duplicate/parallel same-name calls still complete
    against the correct ACP tool call.  Other event types (``tool.completed``,
    ``reasoning.available``) are silently ignored.
    N
event_typenamepreviewargsr   c                    | dk7  ry t        |t              r	 t        j                  |      }t        |t              si }t               }j                  |      }|t               }||<   n!t        |t              rt        |g      }||<   |j                  |       d }|dv r	 ddlm}  |||      }||d	|<   d }	|d
v r,*	 ddlm}
m}  |
||      }|        \  }} ||||      r|}	t'        ||||	      }t)        |       y # t        j                  t
        f$ r d|i}Y w xY w# t        $ r t        j                  d|d       Y w xY w# t        $ r t        j                  d|d       Y w xY w)Nztool.startedraw>   patch
write_fileskill_manager   )capture_local_edit_snapshotz*Failed to capture ACP edit snapshot for %sTrA   )rN   snapshot>   rQ   rR   )build_edit_proposalshould_auto_approve_editz4Failed to prepare auto-approved ACP edit diff for %s)	edit_diff)r-   r.   r   r   JSONDecodeError	TypeErrorr/   r   r0   r   r2   agent.displayrT   r   r=   rD   acp_adapter.edit_approvalrV   rW   r   rF   )rK   rL   rM   rN   kwargstc_idqueuerU   rT   rX   rV   rW   proposalpolicycwdr:   r7   rI   r9   r8   rG   rH   s                   r   _tool_progressz-make_tool_progress_cb.<locals>._tool_progress   s   'dC %zz$' $%D!#!!$'=GE"'M$s#5'NE"'M$U::`E6tTB *.8 Du	**/J/V	jc.tT:'"="?KFC/&#F$,	 "%tyIT:tV4O (()4 %t}%*  `I4Z^_`  jSUYdhijs5   D &D0 )E D-,D-0!EE!E;:E;)NNN)r.   r   )r7   r8   r9   rG   rH   rI   rc   s   `````` r   make_tool_progress_cbrd   r   s;    (.53 .5c .53 .5UX .5nr .5 .5`     c                 ,     dt         ddf fd}|S )z+Create a ``thinking_callback`` for AIAgent.r   r   Nc                 R    | sy t        j                  |       }t        |       y N)acpupdate_agent_thought_textrF   r   r:   r7   r9   r8   s     r   	_thinkingz#make_thinking_cb.<locals>._thinking   '    ..t4T:tV4re   r.   )r7   r8   r9   rl   s   ``` r   make_thinking_cbro      s    5 5 5 re   c                 B     ddt         dt        ddf fd}|S )zCreate a ``step_callback`` for AIAgent.

    Signature expected by AIAgent::

        step_callback(api_call_count: int, prev_tools: list)
    Napi_call_count
prev_toolsr   c           
      0   |rt        |t              r|D ]y  }d }d }d }t        |t              rm|j                  d      xs |j                  d      }|j                  d      xs |j                  d      }|j                  d      xs |j                  d      }nt        |t              r|}j                  |xs d      }t        |t              rt        |g      }||<   |s|s|j                         }j                  |i       }t        |||t	        |      nd |xs |j                  d      |j                  d      	      }	t        |	       |d
k(  rt        |      }
|
t        |
       |rhj                  |d        | y y y )NrL   function_namer   output	argumentsrN   r)   rU   )r   function_argsrU   todo)r-   r1   r/   r0   r.   r   popleftpopr   rF   r6   )rq   rr   	tool_info	tool_namer   rw   r_   r^   metar:   plan_updater7   r9   r8   rG   rH   s              r   _stepzmake_step_cb.<locals>._step   s|   *Z6'  ;	 	 $i. )f 5 W9WI&]]84O	h8OF$-MM+$>$W)--PVBWM	3/ )I%)))/r:eS)!5'NE/4M),!MMOE)--eR8D0!.4.@s6{d&3&Gtxx7G!%*!5F !z4@ F*&I&&Q&2(z4M %)))T:A ; 7:re   rh   )intr   )r7   r8   r9   rG   rH   r   s   ````` r   make_step_cbr      s*    ";c ";s ";d "; ";H Lre   c                 ,     dt         ddf fd}|S )zACreate a callback that streams agent response text to the editor.r   r   Nc                 R    | sy t        j                  |       }t        |       y rh   )ri   update_agent_message_textrF   rk   s     r   _messagez!make_message_cb.<locals>._message  rm   re   rn   )r7   r8   r9   r   s   ``` r   make_message_cbr   
  s    5s 5t 5 Ore   rh   )!__doc__asyncior   loggingcollectionsr   typingr   r   r   r   ri   
acp.schemar   r	   toolsr   r   r   	getLogger__name__r=   r.   r   r6   ClientAbstractEventLooprF   tuplerd   ro   r   r    re   r   <module>r      s       - - 
 1  
		8	$C C -C -C$8N -C`A
**AA 
#
#A 	A
 
AB PTD
**DD 
#
#D U3Z(	D
 d38n,-D "*"eCtO.D*D!E!LD DV
** 
#
# 	(2
**22 
#
#2 U3Z(	2
 d38n,-2 2r
** 
#
# 	re   