
    }i                        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
mZmZ g dZd+d,dZd+d-dZd.d/dZd0d1dZd2dZd3d!Zd4d%Zd5d&Zd6d)Zd7d*ZdS )8    )annotations)Any)MeetingPlanMeetingState
PMDecisionAgentConfigbuild_meeting_planbuild_pm_promptbuild_feedback_promptload_role_names)real_powellgstack_commercialgstack_technical	gstack_uxNtopicstr	availablelist[str] | Nonereturn	list[str]c                    |pt                      fdt          D             }|r|S t                    dk    r
d d         S S )Nc                    g | ]}|v |	S  r   ).0namepools     I/root/.openclaw/workspace/skills/meeting-orchestrator/scripts/handlers.py
<listcomp>z!suggest_roles.<locals>.<listcomp>   s    DDDtt|||||       )r   DEFAULT_ROLE_ORDERlen)r   r   selectedr   s      @r   suggest_rolesr$      s[    )))DDDDD!3DDDH 
4yyA~~BQBxKr   contextclientr   c                    |pt                      }d}d|  d|pd dd                    |           }|                    |d|dg	          }t          |||           S )
NzYou are a meeting role selector. Given a topic and context, choose the best participants for a meeting. Return only a JSON object with fields: analysis, roles, rationale. roles must be a list of role names from the available pool.z
## Topic

z

## Context

Nonez

## Available Roles

z, userrolecontentsystemmessages)r   joinchatparse_role_selection)r   r%   r&   r   r   r.   r)   raws           r   suggest_roles_with_air4   "   s    )))D	F 	3u 	3 	3 *F	3 	3!%4	3 	3 	
 ++V4/P/P.Q+
R
RCT5111r    
   roles
max_roundsintdict[str, Any]c                4    |pt          |           }| |||ddS )Nz!Review or adjust before starting.)r   r%   r7   r8   notes)r$   )r   r%   r7   r8   	suggesteds        r   build_meeting_start_briefr>   3   s2    -u--I 4  r   c                L    t          | ||          }t          | |||          S )N)r   r%   r&   )r   r%   r7   r8   )r4   r>   )r   r%   r&   r8   r=   s        r   !build_meeting_start_brief_with_air@   >   s.    %E76RRRI$5'_ijjjjr   planr   c                F    | j         r| j         S t          | j                  S N)r7   r$   r   )rA   s    r   select_participantsrD   C   s$    z z$$$r   stater   participantsdict[str, AgentConfig]r   c                |    t          | ||          }d}|                    |d|dg          }t          |          S )NzYou are the PM router for a multi-role meeting. Decide which role should speak next, or finish with a report. Output only valid JSON with fields analysis, next_action, target_agent, prompt_for_agent, final_report.r)   r*   r-   )r
   r1   parse_pm_decision)rA   rE   rF   r&   promptr.   r3   s          r   route_pmrK   I   sM    T5,77F	*  ++V6/R/R.S+
T
TCS!!!r   role_configr   rJ   c                B    |                     | j        d|dg          S )Nr)   r*   r-   )r1   system_prompt)rL   rJ   r&   s      r   run_rolerO   U   s'    ;;k7F_eCfCfBg;hhhr   c                "    t          | |          S rC   )r   )rA   rE   s     r   build_feedbackrQ   Y   s     u---r   r3   available_rolesc                   dd l }|                                 }|                    d          rUd|v r|                    dd          d         n|}|                    d          r
|d d         }|                                }|                    d          sI|                    d          }|                    d          }|dk    r|dk    r||k    r|||dz            }|                    |          }|                    d	g           }t          |t                    st          |          S fd
|D             }	|	pt          |          S )Nr   ```
   {}r7   c                    g | ]}|v |	S r   r   )r   r+   rR   s     r   r   z(parse_role_selection.<locals>.<listcomp>r   s#    BBB$/*A*A*A*A*Ar   )jsonstrip
startswithsplitendswithfindrfindloadsget
isinstancelistr$   )
r3   rR   r   r\   cleanedstartenddatar7   filtereds
    `        r   r2   r2   ]   s[   KKKiikkG%   "/3w'--a((++GE"" 	#crclG--//c"" /S!!mmC  B;;3"99uecAgo.G::gDHHWb!!EeT"" 5UO444BBBBBBBH<}UO<<<r   c                f   dd l }ddlm} |                                 }|                    d          rUd|v r|                    dd          d         n|}|                    d          r
|d d         }|                                }|                    d          sI|                    d          }|                    d          }|d	k    r|d	k    r||k    r|||dz            }|	                    |          }	 t          d
i |S # |$ r"}t          t          |                    |d }~ww xY w)Nr   )ValidationErrorrT   rU   rV   rW   rX   rY   rZ   r   )r\   pydanticrm   r]   r^   r_   r`   ra   rb   rc   r   
ValueErrorr   )r3   r\   rm   rg   rh   ri   rj   excs           r   rI   rI   v   sW   KKK((((((iikkG%   "/3w'--a((++GE"" 	#crclG--//c"" /S!!mmC  B;;3"99uecAgo.G::gD,!!D!!! , , ,S""+,s   =D	 	D0D++D0rC   )r   r   r   r   r   r   )
r   r   r%   r   r&   r   r   r   r   r   )r5   Nr6   )
r   r   r%   r   r7   r   r8   r9   r   r:   )r6   )
r   r   r%   r   r&   r   r8   r9   r   r:   )rA   r   r   r   )
rA   r   rE   r   rF   rG   r&   r   r   r   )rL   r   rJ   r   r&   r   r   r   )rA   r   rE   r   r   r   )r3   r   rR   r   r   r   r   r   )r3   r   r   r   )
__future__r   typingr   runtimer   r   r   r   r	   r
   r   r   r!   r$   r4   r>   r@   rD   rK   rO   rQ   r2   rI   r   r   r   <module>rt      s   " " " " " "      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	       2 2 2 2 2"    k k k k k
% % % %	" 	" 	" 	"i i i i. . . .= = = =2, , , , , ,r   