
    Tji,                       d 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
 ddlmZmZ ddlmZmZmZmZmZmZmZ e G d	 d
                      Z	 d@dAdZdBd#ZdCd&ZdDd*ZdEd+ZdFd.ZdGd1ZdHd4ZdId7ZdJd9Z dKd:Z!dLd;Z"dMd=Z#dNd?Z$dS )Oz.Meeting runtime and PM-led orchestration loop.    )annotations)	dataclassPath)ValidationError)build_context_bundle)	LLMClientLLMParseError)AgentConfigAgentTurnResultContextBundleDocumentCitationMeetingInputMeetingState
PMDecisionc                  (    e Zd ZU dZded<   ded<   dS )MeetingRunResultz'Result returned by the meeting runtime.strfinal_reportr   stateN)__name__
__module____qualname____doc____annotations__     3/root/projects/multi-agents-meeting/core/meeting.pyr   r      s0         11r   r   Nmeeting_inputr   agentsdict[str, AgentConfig]providerr   model	max_loopsint
llm_clientLLMClient | Nonemeeting_file_pathPath | Nonereturnc           
        |pt                      }t          | |pt                                }t          | j        t          |          d|d| j        | |          }	d}
	 |	j        |	j        k    rt          |	|||||
          S t          ||||	|d|
          }|t          |	d	          S |j        d
k    r/t          |	|j        pd          }d|	_        t          ||	          S t!          |||||	|          }|dk    rGt          ||||	|dd          }|	|j        |vrt          |	d	          S t!          |||||	|          }|dk    rd}
d}
)z8Run a single PM-led meeting until finish or forced stop.)r(   r   running)topicparticipants
loop_countr$   statussummaryr   context_bundleNTnormalclientr"   r#   r   r    mode
last_errorforcedFINISHz# Reportfinishedr   r   )pm_decisionr5   r"   r#   r   r    routing_errorzunknown target agentagent_errorzagent invocation failed)r	   r   _virtual_meeting_filer   r-   listr/   r$   _force_finish_get_pm_decision_fallback_finishnext_action_normalize_or_fallback_reportr   r0   r   _handle_call_agenttarget_agent)r   r    r"   r#   r$   r&   r(   r5   r2   r   r7   r=   r   handledsecond_decisions                  r   run_meetingrK      s    &9;;F)+F/D/F/F  N !&\\##%	 	 	E "J5u.. %TTT&!
 
 
 #E$7777"h..8@X@f\fggL%EL#UKKKK$#
 
 
 o%%.!1  O &/*Ff*T*T'd;;;;(+!  G m##2J
k5r   r5   r	   r   r   r6   r7   
str | NonePMDecision | Nonec                    t          d          D ]c}	 |                     |||d         j        t          ||||                    }t	          j        |          c S # t          t          f$ r Y `w xY wd S )N   pmr"   r#   system_promptuser_prompt)rangegenerate_structured_responserR   _build_pm_promptr   model_validater   r
   )	r5   r"   r#   r   r    r6   r7   _payloads	            r   rC   rC   s   s     1XX 
 
		99!$Tl8,UFD*MM	 :  G ,W55555/ 	 	 	H	4s   AAA10A1r=   r   c           
     "   | j         }|r||vr!|j                            d|pdd           dS t          d          D ]}	 |                    ||||         j        t          || j        pd                    }t          j	        |          }	t          |	j        |j                   t          ||	           |xj        dz  c_         dS # t          t           f$ r Y w xY w|xj        dz  c_        |j                            d	|d           d	S )
Npm_routing_error )typerH   r>   rO   rQ      okr?   )rH   	event_logappendrT   rU   rR   _build_agent_promptprompt_for_agentr   rW   _validate_citations	citationsr2   _merge_agent_turnr/   r   r
   )
r=   r5   r"   r#   r   r    rH   rX   rY   turn_results
             r   rG   rG      sT    +L <v55(:LL^\^__```1XX  	99!$\2@/{7S7YWYZZ	 :  G *8AAK 5u7KLLLe[111!44/ 	 	 	H	 
	OM<PPQQQ=s   BCCCrg   r   Nonec                   || j         |j        <   | j                            d|j        d           |j        D ]=}|| j        vr2t          | j                  dk     r| j                            |           >|j        D ]=}|| j        vr2t          | j                  dk     r| j                            |           >|j        D ]=}|| j	        vr2t          | j	                  dk     r| j	                            |           >|j
                                        d         d d         }| j         d|j         d| dt          | j                   d	t          | j	                   d
t          | j                   d d         | _        d S )N
agent_turn)r]   
agent_name   r      z	
Latest: z - z
Counts: key_points=z, open_questions=z, decisions=i  )latest_agent_outputsrk   r`   ra   
key_pointslenrecommendations	decisionsrisksopen_questionsresponse
splitlinesr-   r1   )r   rg   itemlatest_summarys       r   rf   rf      s   9DE{56	OL@VWWXXX& * *u'''C0@,A,AB,F,F##D)))+ ) )u&&3u+?+?"+D+DO""4(((! . .u+++E4H0I0IB0N0N ''--- )4466q9$3$?N; 	D 	D)	D 	D.<	D 	D!%"233	D 	DFI%J^F_F_	D 	Dmpqv  rA  nB  nB	D 	D te	EMMMr   c           	         d| _         t          |||| |d|          }|<|j        dk    r1|j        r*d| _         t	          t          |j                  |           S t          | d          S )	Nforced_stopforced_finishr4   r:   r;   r<   Tr8   )r0   rC   rE   r   r   _ensure_process_noterD   )r   r    r"   r#   r5   r7   r=   s          r   rB   rB      s     !EL"  K ;#:h#F#F;Kc#F!-A+BZ-[-[chiiiiE$////r   r9   boolc                F   d}d                     dd| j         d| j         dt          | j                  z   dt          | j                  z   dt          | j                  z   d	t          | j                  z   d
|r|nd g          }d| _	        t          ||           S )NzFMeeting stopped after reaching max loop limit before full convergence.z

z# Meeting Reportz	## Topic
z## Current Summary
z## Key Findings
z## Open Questions
z## Candidate Decisions
z## Evidence Reviewed
z## Process Note
z#Meeting ended with fallback report.r;   r<   )joinr-   r1   _render_listro   rt   rr   _render_evidencer2   r0   r   )r   r9   process_notereports       r   rD   rD      s    [L[[&&&25=22,u/?"@"@@!L1E$F$FF&eo)F)FF$'78L'M'MMc a<acc		
 F ELu====r   items	list[str]c                H    | sdS d                     d | D                       S )N- None
c              3      K   | ]	}d | V  
dS z- Nr   ).0rw   s     r   	<genexpr>z_render_list.<locals>.<genexpr>   s(      33T[$[[333333r   )r   )r   s    r   r   r      s0     x9933U333333r   r2   r   c                \    | j         sdS d                    d | j         D                       S )Nr   r   c              3  *   K   | ]}d |j          V  dS r   )source_pathr   documents     r   r   z#_render_evidence.<locals>.<genexpr>   s.      ZZX0(.00ZZZZZZr   )	documentsr   )r2   s    r   r   r      s6    # x99ZZAYZZZZZZr   re   list[DocumentCitation]c                >   d |j         D             }| D ]}|                    |j                  }|t          d|j                   |j        |j        k    rt          d|j                   |j        r%|j        |j        vrt          d|j                   d S )Nc                    i | ]
}|j         |S r   )document_idr   s     r   
<dictcomp>z'_validate_citations.<locals>.<dictcomp>   s    ___(x+X___r   zunknown citation document_id: z1citation source_path does not match document_id: z7citation quote does not match excerpt for document_id: )r   getr   r
   r   quoteexcerpt)re   r2   documents_by_idcitationr   s        r   rd   rd      s    __nF^___O  "&&x';<< WAU W WXXX8#777ZHDXZZ   > 	hnH4DDD`(J^``   r   r   c                <    d| v r| S |                                  dz   S )Nz## Process NotezX

## Process Note
Meeting stopped after reaching max loop limit before full convergence.)rstrip)r   s    r   r|   r|   
  s&    F""==??zzzr   c                r    ddg}t          fd|D                       rS t          | d          j        S )Nz## Topicz## Evidence Reviewedc              3      K   | ]}|v V  	d S Nr   )r   sectionr   s     r   r   z0_normalize_or_fallback_report.<locals>.<genexpr>  s(      
>
>7f
>
>
>
>
>
>r   Fr8   )allrD   r   )r   r   required_sectionss    ` r   rF   rF     sP    #%;<

>
>
>
>,=
>
>
>>> E%000==r   c                f   | j         j        }t          | j        | j        z
  d          }d| j         d|j         dd                    |j                   dd                    |j	                   dd                    |j
                   d|j         d	|j         d
| j         dd                    d |                                D                        dd                    | j                   dd                    | j                   dd                    | j                   d| d| d|pd S )Nr   ztopic=
decision_to_make=z	
options= | z
evaluation_dimensions=z
required_questions=z
risk_tolerance=z
time_horizon=z	
summary=z
participants=z, c              3  4   K   | ]\  }}| d |j          V  dS ):N)role)r   nameagents      r   r   z#_build_pm_prompt.<locals>.<genexpr>(  s6      ![![[T5T"8"8EJ"8"8![![![![![![r   z
key_points=z
open_questions=z
decisions=z
mode=z
remaining_loops=z
last_error=r\   )r   decision_packetmaxr$   r/   r-   decision_to_maker   optionsevaluation_dimensionsrequired_questionsrisk_tolerancetime_horizonr1   r   ro   rt   rr   )r   r    r6   r7   r   remaining_loopss         r   rV   rV     s    )9O%/E,<<a@@O	) 	) 	)+<	) 	)::o566	) 	) "'O,Q!R!R	) 	) $jj)KLL		) 	)
 *8	) 	) (4	) 	) =	) 	) 		![![FLLNN![![![[[	) 	) jj!122	) 	)  **U%9::	) 	) ZZ00	) 	) 	) 	) +	) 	) !&B	) 	)r   rc   c                   | j         j        }d                    d | j        j        D                       }d| d| j         d| j         j        j         d|j         d|j	         dd                    |j
                   d	d                    |j                   d
d                    |j                   d| j        j         d| S )Nr   c              3  8   K   | ]}|j          d |j         V  dS )z: N)r   r   r   s     r   r   z&_build_agent_prompt.<locals>.<genexpr>4  sG        :B8558#355     r   zprompt=z
meeting_summary=r   z
project_background=z
current_state=z
constraints=z
success_criteria=z
non_goals=z
context_summary=z
documents=)r   briefr   r2   r   r1   r   r   project_backgroundcurrent_stateconstraintssuccess_criteria	non_goals)r   rc   r   r   s       r   rb   rb   2  s   %E

  FKFZFd    I		!" 		! 		! =		! 		!!/?P		! 		! $6		! 		! ,			! 		!
 zz%"344		! 		! "JJu'=>>		! 		! ZZ00		! 		! !/7		! 		! 		! 		!r   r   c                      t          d          S )Nzmeeting.yamlr   r   r   r   r@   r@   E  s    r   r   )r   r   r    r!   r"   r   r#   r   r$   r%   r&   r'   r(   r)   r*   r   )r5   r	   r"   r   r#   r   r   r   r    r!   r6   r   r7   rL   r*   rM   )r=   r   r5   r	   r"   r   r#   r   r   r   r    r!   r*   r   )r   r   rg   r   r*   rh   )r   r   r    r!   r"   r   r#   r   r5   r	   r7   rL   r*   r   )r   r   r9   r}   r*   r   )r   r   r*   r   )r2   r   r*   r   )re   r   r2   r   r*   rh   )r   r   r*   r   )r   r   r   r   r*   r   )
r   r   r    r!   r6   r   r7   rL   r*   r   )r   r   rc   r   r*   r   )r*   r   )%r   
__future__r   dataclassesr   pathlibr   pydanticr   core.context_loaderr   core.llmr	   r
   core.modelsr   r   r   r   r   r   r   r   rK   rC   rG   rf   rB   rD   r   r   rd   r|   rF   rV   rb   r@   r   r   r   <module>r      sF   4 4 " " " " " " ! ! ! ! ! !       $ $ $ $ $ $ 4 4 4 4 4 4 - - - - - - - -                          &*Q Q Q Q Qh   .   D   00 0 0 00> > > >$4 4 4 4[ [ [ [    { { { {> > > >   6   &           r   