
    j-$              
         d Z ddlmZ ddlmZmZ ddlZddlZddlm	Z	m
Z
mZ ddlmZ dZ ed	           G d
 d                      Z ed	           G d d                      Zd5dZd6dZdddddddddd	d7d,Zd8d0Zd9d2Zd:d4ZdS );u  Kanban Swarm v1: thin swarm topology helpers on top of Kanban.

This module intentionally does not introduce a second scheduler. It writes a
small task graph into the existing Kanban kernel:

    planning root (completed immediately)
        ├─ parallel specialist workers (ready)
        └─ verifier (todo until all workers done)
             └─ synthesizer (todo until verifier done)

The shared blackboard is also deliberately low-tech: structured JSON comments on
the root task. That keeps all state in existing task_comments/task_events rows,
so the dashboard, notifier, slash command, and dispatcher keep working without a
new service.
    )annotations)	dataclassfieldN)AnyIterableOptional)	kanban_dbz[swarm:blackboard] T)frozenc                  p    e Zd ZU dZded<   ded<   ded<    ee          Zded<   d	Zd
ed<   dZ	ded<   dS )SwarmWorkerSpecz)A single parallel worker card in a swarm.strprofiletitlebody)default_factory	list[str]skillsr   intpriorityNzOptional[int]max_runtime_seconds)
__name__
__module____qualname____doc____annotations__r   listr   r   r        </home/ubuntu/.hermes/hermes-agent/hermes_cli/kanban_swarm.pyr   r      st         33LLLJJJIIId333F3333H)-------r   r   c                  D    e Zd ZU dZded<   ded<   ded<   ded<   dd
ZdS )SwarmCreatedz%IDs produced by :func:`create_swarm`.r   root_idr   
worker_idsverifier_idsynthesizer_idreturndict[str, Any]c                R    | j         t          | j                  | j        | j        dS )Nr"   r#   r$   r%   )r"   r   r#   r$   r%   )selfs    r   as_dictzSwarmCreated.as_dict2   s/    |t//+"1	
 
 	
r   N)r&   r'   )r   r   r   r   r   r+   r   r   r   r!   r!   )   s]         //LLL
 
 
 
 
 
r   r!   valuer   
field_namer&   c                Z    | pd                                 }|st          | d          |S )N z is required)strip
ValueError)r,   r-   texts      r   _require_textr3   ;   s;    KR  D 6J444555Kr   r"   goalc                8    d|  d|                                  dS )Nz7

## Swarm protocol
- Swarm root / shared blackboard: `z`.
- Read sibling/parent handoffs from Kanban context before working.
- Put machine-readable facts in completion metadata.
- Put cross-worker notes on the root task using structured comments.
- Goal: 
r0   )r"   r4   s     r   _swarm_contextr8   B   s5    	$.5	$ 	$
 ::<<	$ 	$ 	$r   zVerify swarm outputszSynthesize swarm outputszswarm-orchestratorscratch)	
root_titleverifier_titlesynthesizer_titletenant
created_byworkspace_kindworkspace_pathr   idempotency_keyconnsqlite3.ConnectionworkersIterable[SwarmWorkerSpec]verifier_assigneesynthesizer_assigneer:   Optional[str]r;   r<   r=   r>   r?   r@   r   r   rA   c               |   t          |d          }t          |d          }t          |d          }t          |          }|st          d          t          |d          D ]7\  }}t          |j        d| d           t          |j        d| d	           8t          j        | |p$d
|                                d         dd          d| |	|	||||
|dg          }t          | |          
                    d          }t          |t                    r}d |
                    dg           D             }|
                    d          }|
                    d          }|r1|r/|r-t          ||t          |          t          |                    S t          j        | |dd|t!          |          d           t#          ||          }g }|D ]_}t          j        | |j        |j        pd|z   |j        |	|g||j        p||
||j        pd|j                  }|                    |           `d|z   }t          j        | ||||	||||
|dg          }d |z   }t          j        | ||||	|g|||
|d!g          }t          ||||          }t/          | ||	d|                                d|iz  "           |S )#a  Create a durable Kanban swarm graph.

    The returned graph is immediately dispatchable: the planning root is marked
    ``done`` with topology metadata, parallel workers are ``ready``, the verifier
    waits for every worker, and the synthesizer waits for the verifier.
    r4   rF   rG   zat least one worker is required   )startzworkers[z	].profilez].titlezSwarm: r   NP   zKanban Swarm v1 planning/root card. This card is completed immediately so parallel workers can start while it remains the shared blackboard and audit anchor.

Goal:
zkanban-orchestrator)
r   r   assigneer>   r=   r   rA   r?   r@   r   topologyc                0    g | ]}|t          |          S r   )r   ).0xs     r   
<listcomp>z create_swarm.<locals>.<listcomp>   s#    JJJJc!ffJJJr   r#   r$   r%   r)   z;Swarm topology planned; root remains the shared blackboard.kanban_swarm_v1)kindr4   worker_count)summarymetadatar/   )r   r   rM   r>   parentsr=   r   r?   r@   r   r   zReview every worker handoff and blackboard update. Gate the swarm: complete only with metadata {"gate": "pass"} when evidence is sufficient; otherwise block with exact missing work.zrequesting-code-review)
r   r   rM   r>   rX   r=   r   r?   r@   r   zwSynthesize the verified worker outputs into the final deliverable. Do not start until the verifier has passed the gate.	humanizer)authorkeyr,   )r3   r   r1   	enumerater   r   kbcreate_task
splitlineslatest_blackboardget
isinstancedictr!   r   complete_tasklenr8   r   r   r   r   appendpost_blackboard_updater+   )rB   r4   rD   rF   rG   r:   r;   r<   r=   r>   r?   r@   r   rA   worker_specsispecrootexistingr#   r$   r%   context_suffix	worker_idverifier_bodyverifiersynthesizer_bodysynthesizercreateds                                r   create_swarmrt   M   s   0 v&&D%&79LMM()=?UVV==L <:;;;\333 9 94dl$;q$;$;$;<<<dj"7Q"7"7"78888>AAdoo&7&7&:3B3&?AA  
 '%%%&!  D, !t,,00<<H(D!! 
JJhll<&D&DJJJ
ll=11!&677 	+ 	. 	%,,">22	    M%--
 
		 	 	 	 $D$//NJ % %N*)/r^3\!F].h));&$ $ 8
 
 
	 	)$$$$	? 	  ~"%%()  H	?
	 
 .%
%%}  K 4X{CCGoo64.0    Nr   rZ   r[   r   c                   t          |d           t          |d          }t          |d          }t          j        ||ddd          }t          j        | ||t
          |z             S )	z:Append one structured update to the swarm root blackboard.r"   rZ   r[   )r[   r,   FT)ensure_ascii	sort_keys)rZ   r   )r3   jsondumpsr]   add_commentBLACKBOARD_PREFIX)rB   r"   rZ   r[   r,   payloads         r   rg   rg      sq     '9%%%68,,F
U
#
#Cju55EUYZZZG>$=NQX=XYYYYr   r'   c                   i }i }t          j        | |          D ]}|j        pd}|                    t                    s&	 t          j        |t          t                    d                   }n# t
          j        $ r Y gw xY w|	                    d          }t          |t                    r|s|	                    d          ||<   |j        ||<   |r||d<   |S )zMerge structured blackboard comments on a root card.

    Later comments replace earlier values for the same key. ``_authors`` records
    the author of the winning value for traceability.
    r/   Nr[   r,   _authors)r]   list_commentsr   
startswithr{   rx   loadsre   JSONDecodeErrorra   rb   r   rZ   )rB   r"   mergedauthorscommentr   r|   r[   s           r   r`   r`      s     F G#D'22 & &|!r011 		jc*;&<&<&=&=!>??GG# 	 	 	H	kk%  #s## 	3 	kk'**s~ %$zMs   .A00BBrawc                T   d |                      dd          D             }t          |          dk     rt          d          g }t          |          dk    r-|d         r%d |d                              d          D             }t          |d         |d	         |d	         |
          S )z:Parse CLI ``--worker profile:title[:skill,skill]`` values.c                6    g | ]}|                                 S r   r7   )rP   ps     r   rR   z$parse_worker_arg.<locals>.<listcomp>  s     2221QWWYY222r   :   z9worker must be profile:title or profile:title:skill,skill   c                ^    g | ]*}|                                 |                                 +S r   r7   )rP   ss     r   rR   z$parse_worker_arg.<locals>.<listcomp>  s-    FFFAGGIIF!''))FFFr   ,r   rJ   )r   r   r   r   )splitre   r1   r   )r   partsr   s      r   parse_worker_argr     s     32		#q 1 1222E
5zzA~~TUUUF
5zzQ58FFU1X^^C%8%8FFF5858%(SYZZZZr   )r,   r   r-   r   r&   r   )r"   r   r4   r   r&   r   )rB   rC   r4   r   rD   rE   rF   r   rG   r   r:   rH   r;   r   r<   r   r=   rH   r>   r   r?   r   r@   rH   r   r   rA   rH   r&   r!   )rB   rC   r"   r   rZ   r   r[   r   r,   r   r&   r   )rB   rC   r"   r   r&   r'   )r   r   r&   r   )r   
__future__r   dataclassesr   r   rx   sqlite3typingr   r   r   
hermes_clir	   r]   r{   r   r!   r3   r8   rt   rg   r`   r   r   r   r   <module>r      s     # " " " " " ( ( ( ( ( ( ( (   * * * * * * * * * * & & & & & &)  $. . . . . . . . $
 
 
 
 
 
 
 
"      $ !%07 *#$(%)R R R R R RjZ Z Z Z"   6	[ 	[ 	[ 	[ 	[ 	[r   