§
    øžyjˆó ã                  óè  — U d Z ddlmZ ddlZddlZddlZddl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 ddlmZ ddlmZ dd	d
dddddœZdod„Zdpd„Zdqd„Zdrd„Zdsd „Zdtd"„Z	 dudvd&„Zdwd*„Zdxd,„Zdyd-„Z eh d.£¦  «        Z d/e!d0<    eh d1£¦  «        Z"d/e!d2<   dzd4„Z#dxd5„Z$d{d8„Z%dxd9„Z&dxd:„Z'dxd;„Z(dxd<„Z)dxd=„Z*dxd>„Z+dxd?„Z,d|d@„Z-dxdA„Z.dxdB„Z/dxdC„Z0dxdD„Z1dxdE„Z2dxdF„Z3dxdG„Z4dxdH„Z5dxdI„Z6dxdJ„Z7dxdK„Z8dxdL„Z9dxdM„Z:dxdN„Z;dxdO„Z<dxdP„Z=dxdQ„Z>dxdR„Z?dxdS„Z@d}dU„ZAdxdV„ZBdxdW„ZCdxdX„ZDdxdY„ZEdxdZ„ZFdxd[„ZGdxd\„ZHdxd]„ZIdxd^„ZJdxd_„ZKdxd`„ZLdxda„ZMdxdb„ZNdxdc„ZOdxdd„ZPdxde„ZQdxdf„ZRdxdg„ZSdxdh„ZTdxdi„ZUdxdj„ZVdxdk„ZWdlZXd~dn„ZYdS )u)  CLI for the Hermes Kanban board â€” ``hermes kanban â€¦`` subcommand.

Exposes the full Kanban command surface documented in the design spec
(``docs/hermes-kanban-v1-spec.pdf``).  All DB work is delegated to
``kanban_db``.  This module adds:

  * Argparse subcommand construction (``build_parser``).
  * Argument dispatch (``kanban_command``).
  * Output formatting (plain text + ``--json``).
  * A short shared helper that parses a single slash-style string
    (used by ``/kanban â€¦`` in CLI and gateway) and forwards it to the
    argparse surface.
é    )ÚannotationsN)ÚPath)ÚAnyÚOptional)Ú	kanban_db)Úkanban_swarmu   â—»u   â–¶õ   â—�u   â�±u   âŠ˜u   âœ“u   â€”)ÚtodoÚreadyÚrunningÚ	scheduledÚblockedÚdoneÚarchivedÚtsúOptional[int]ÚreturnÚstrc                óX   — | sdS t          j        dt          j        | ¦  «        ¦  «        S )NÚ z%Y-%m-%d %H:%M)ÚtimeÚstrftimeÚ	localtime)r   s    ú7/home/ragecks/.hermes/hermes-agent/hermes_cli/kanban.pyÚ_fmt_tsr   .   s,   € Øð ØˆrÝŒ=Ð)­4¬>¸"Ñ+=Ô+=Ñ>Ô>Ð>ó    Útúkb.Taskc           
     óÂ   — t                                | j        d¦  «        }| j        pd}| j        rd| j        › d�nd}|› d| j        › d| j        d›d|d	›|› d| j        › �
S )
Nú?ú(unassigned)ú [Ú]r   Ú ú  Ú8sÚ20s)Ú_STATUS_ICONSÚgetÚstatusÚassigneeÚtenantÚidÚtitle)r   Úiconr+   r,   s       r   Ú_fmt_task_liner0   4   s�   € Ý×Ò˜QœX sÑ+Ô+€DØŒzÐ+˜^€HØ!"¤Ð1Ð�!”(ÐÐÐÐ¨r€FØÐMÐM�Q”TÐMÐM˜QœXÐMÐMÐM¨HÐMÐM¸&ÐMÐMÀAÄGÐMÐMÐMr   údict[str, Any]c                ó�  — i d| j         “d| j        “d| j        “d| j        “d| j        “d| j        “d| j        “d| j        “d	| j        “d
| j	        “d| j
        “d| j        “d| j        “d| j        “d| j        “d| j        “d| j        rt#          | j        ¦  «        ng “| j        | j        | j        | j        | j        | j        dœ¥S )Nr-   r.   Úbodyr+   r*   Úpriorityr,   Úworkspace_kindÚworkspace_pathÚbranch_nameÚ
project_idÚ
created_byÚ
created_atÚ
started_atÚcompleted_atÚresultÚskills)Úmax_retriesÚmodel_overrideÚprovider_overrideÚ
session_idÚworkflow_template_idÚcurrent_step_key)r-   r.   r3   r+   r*   r4   r,   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   Úlistr?   r@   rA   rB   rC   rD   )r   s    r   Ú_task_to_dictrF   ;   s<  € ðØˆaŒdðà�”ðð 	�”ðð 	�A”Jð	ð
 	�!”(ðð 	�A”Jðð 	�!”(ðð 	˜!Ô*ðð 	˜!Ô*ðð 	�q”}ðð 	�a”lðð 	�a”lðð 	�a”lðð 	�a”lðð 	˜œðð  	�!”(ð!ð" 	 A¤HÐ4•$�q”x‘.”.�.°"ð#ð$ ”}ØÔ*ØÔ0Ø”lØ !Ô 6ØÔ.ð/ð ð ð r   Úargsúargparse.NamespaceúOptional[dict[str, str]]c                óp   — t          | dd ¦  «        }t          | dd ¦  «        }|d u |d u k    rd S |€i S ||dœS )NÚ
state_typeÚ
state_name)rK   rL   )Úgetattr)rG   ÚstÚsns      r   Ú_run_state_kwargsrP   W   sT   € Ý	��| TÑ	*Ô	*€BÝ	��| TÑ	*Ô	*€BØ
ˆdˆ
˜˜d˜
Ò#Ð#ØˆtØ	€zØˆ	Ø¨BÐ/Ð/Ð/r   Úvalueútuple[str, Optional[str]]c                óx  — | sdS |                       ¦   «         }|dv r|dfS dD ]€\  }}|                     |¦  «        sŒ|t          |¦  «        d…                               ¦   «         }|st          j        d|› d�¦  «        ‚|t
          j                             |¦  «        fc S t          j        d| ›d�¦  «        ‚)	z„Parse ``--workspace`` into ``(kind, path|None)``.

    Accepts: ``scratch``, ``worktree``, ``worktree:<path>``, ``dir:<path>``.
    )ÚscratchN>   rT   ÚworktreeN))zdir:Údir)z	worktree:rU   z--workspace z  requires a path after the colonzunknown --workspace value z7: use scratch, worktree, worktree:<path>, or dir:<path>)ÚstripÚ
startswithÚlenÚargparseÚArgumentTypeErrorÚosÚpathÚ
expanduser)rQ   ÚvÚprefixÚkindr]   s        r   Ú_parse_workspace_flagrb   a   s÷   € ð
 ð !Ø Ð Ø�Š‰Œ€AØÐ#Ð#Ð#Ø�4ˆyÐØDð 0ð 0‰ˆ�Ø�|Š|˜FÑ#Ô#ð 	ØØ•�V‘”��Œ×$Ò$Ñ&Ô&ˆØð 	ÝÔ,ØG˜vÐGÐGÐGñô ð ð •b”g×(Ò(¨Ñ.Ô.Ð/Ð/Ð/Ð/Ý
Ô
$ð	) Uð 	)ð 	)ð 	)ñô ð r   úOptional[str]c                ó  — | €dS |                       ¦   «         }|st          j        d¦  «        ‚|                     d¦  «        rt          j        d¦  «        ‚t	          d„ |D ¦   «         ¦  «        rt          j        d¦  «        ‚|S )zBNormalize an optional branch name from ``kanban create --branch``.Nz"--branch requires a non-empty nameú-z --branch must not start with '-'c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Úisspace)Ú.0Úchs     r   ú	<genexpr>z%_parse_branch_flag.<locals>.<genexpr>ƒ   s*   è è € Ð
)Ð
)˜Bˆ2�:Š:‰<Œ<Ð
)Ð
)Ð
)Ð
)Ð
)Ð
)r   z$--branch must not contain whitespace)rW   rZ   r[   rX   Úany)rQ   Úbranchs     r   Ú_parse_branch_flagrn   z   s”   € à€}ØˆtØ�[Š[‰]Œ]€FØð OÝÔ(Ð)MÑNÔNÐNØ×Ò˜ÑÔð MÝÔ(Ð)KÑLÔLÐLÝ
Ð
)Ð
) &Ð
)Ñ
)Ô
)Ñ)Ô)ð QÝÔ(Ð)OÑPÔPÐPØ€Mr   Úhermes_homeúOptional[Path]útuple[bool, str]c                ór  — 	 ddl m} n# t          $ r Y dS w xY w	  || d¬¦  «        }n# t          $ r Y dS w xY w|j        rdS |j        }	 ddlm}  |¦   «         }t          |                     di ¦  «                             dd	¦  «        ¦  «        }n# t          $ r d	}Y nw xY w|r
|rd	d
|› d�fS |r|sdS dS )u…  Return ``(running, message)``.

    - ``running=True``: a gateway is alive for this HERMES_HOME and its
      config has ``kanban.dispatch_in_gateway`` on (default). Message
      is a short status line.
    - ``running=False``: either no gateway is running, or the gateway
      is running but the config flag is off. Message is human guidance
      explaining the next step.

    Used by ``hermes kanban create`` (and callers) to warn when a task
    will sit in ``ready`` because nothing is there to pick it up.
    Defensive against import failures and config-read errors â€” if the
    probe itself errors, we return ``(True, "")`` so we don't spam
    false warnings (better to miss a warning than to cry wolf).

    ``hermes_home`` scopes the probe to a named profile's directory. The
    dashboard plugin API passes it because the dashboard backend process can
    be running under a different HERMES_HOME than the profile the request
    targets, which otherwise produced a "no gateway is running" warning
    against a perfectly healthy profile gateway (#71211). CLI callers leave
    it ``None`` and keep the existing process-level behavior.
    r   )Úresolve_gateway_liveness)Tr   F)Úprofile_dirÚ	use_cache©Úload_configÚkanbanÚdispatch_in_gatewayTzgateway pid=z, dispatch enabled)Fuà   Gateway is running but kanban.dispatch_in_gateway=false in config.yaml â€” the task will sit in 'ready' until you flip it back on and restart the gateway, OR run the legacy standalone daemon (`hermes kanban daemon --force`).)Fuú   No gateway is running â€” the task will sit in 'ready' until you start it. Run:
    hermes gateway start
The gateway hosts an embedded dispatcher (tick interval 60s by default); your task will be picked up on the next tick after the gateway comes up.)	Úgateway.statusrs   Ú	ExceptionÚprobe_errorÚpidÚhermes_cli.configrw   Úboolr)   )ro   rs   Úlivenessr}   rw   ÚcfgÚdispatch_ons          r   Ú_check_dispatcher_presencerƒ   ˆ   s_  € ð2Ø;Ð;Ð;Ð;Ð;Ð;Ð;øÝð ð ð Øˆzˆzðøøøð
ð ,Ð+Ø#¨uð
ñ 
ô 
ˆˆøõ ð ð ð ØˆzˆzðøøøàÔð ð ˆzØ
Œ,€CðØ1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆÝ˜3Ÿ7š7 8¨RÑ0Ô0×4Ò4Ð5JÈDÑQÔQÑRÔRˆˆøÝð ð ð Øˆˆˆðøøøð ð >ˆ{ð >ØÐ< SÐ<Ð<Ð<Ð=Ð=Ø
ð 
�;ð 
ð
ð 
ðð s+   ‚	 ‰
–›) ©
7¶7ÁAB ÂB"Â!B"Úparent_subparsersúargparse._SubParsersActionúargparse.ArgumentParserc           	     ól,  — |                       ddd¬¦  «        }|                     dddd¬	¦  «         |                     d
¬¦  «        }|                      dd¬¦  «         |                      ddd¬¦  «        }|                     d¬¦  «        }|                      ddgd¬¦  «        }|                     dd¬¦  «         |                     ddd¬¦  «         |                      ddgd¬¦  «        }|                     d d!¬¦  «         |                     d"dd#¬$¦  «         |                     d%dd&¬$¦  «         |                     d'dd(¬$¦  «         |                     d)dd*¬$¦  «         |                     d+dd,¬¦  «         |                     d-dd.¬$¦  «         |                      d/d0d1gd2¬¦  «        }|                     d ¦  «         |                     d3dd4¬¦  «         |                      d5d6gd7¬¦  «        }|                     d ¦  «         |                      d8d9gd:¬¦  «         |                      d;d<¬¦  «        }	|	                     d ¦  «         |	                     d=d>¬¦  «         |                      d?d@¬¦  «        }
|
                     d ¦  «         |
                     dAdBddC¬D¦  «         |                      ddE¬¦  «        }|                     dFdG¬¦  «         |                     dHddI¬$¦  «         |                     dJddK¬$¦  «         |                     dLdMg dN¬O¦  «         |                     dPdQdR¬$¦  «         |                     dSddT¬$¦  «         |                     dUddV¬$¦  «         |                     dWddX¬$¦  «         |                     dYt          dZd[¬\¦  «         |                     d]dd^¬¦  «         |                     d_dd`¬$¦  «         |                     daddb¬$¦  «         |                     dcddde¬$¦  «         |                     dfdMg dgdh¬i¦  «         |                     djt          ddkdlt          j        › dm�¬n¦  «         |                     doddpdq¬r¦  «         |                     dsddtdu¬r¦  «         |                     dvddwdx¬y¦  «         |                     dzt          ddkd{d|¬}¦  «         |                     d~t          t          j        ¦  «        dd€¬�¦  «         |                     ddd‚¬¦  «         |                      dƒd„¬¦  «        }|                     d…d†¬¦  «         |                     d‡dMg dˆd‰¬Š¦  «         |                     d‹dŒd�¬Ž¦  «         |                     d�dŒd�¬Ž¦  «         |                     dWddX¬$¦  «         |                     dYt          dZd[¬\¦  «         |                     dcdd‘¬$¦  «         |                     d_dd’¬$¦  «         |                     ddd‚¬¦  «         |                      ddgd“¬¦  «        }|                     d”dd•¬¦  «         |                     dJd¬–¦  «         |                     d—dt          t          j        ¦  «        ¬˜¦  «         |                     dWd¬–¦  «         |                     d™ddš¬$¦  «         |                     d›ddœ¬¦  «         |                     dd¬¦  «         |                     d�dt          t          j	         
                    ¦   «         ¦  «        dž¬Ÿ¦  «         |                     d dd¡d¢¬	¦  «         |                     d£dd¤d¥d¦¬§¦  «         |                      d8d¨¬¦  «        }|                     d©¦  «         |                     dd¬¦  «         |                     dªd«dd¬¬�¦  «         |                     d­dd®d¯¬	¦  «         |                      d°d±¬¦  «        }|                     d©¦  «         |                     d²d³¬¦  «         |                      d´dµ¬¦  «        }|                     d©¦  «         |                     d¶dBdd·¬D¦  «         |                     dsdd¸¬$¦  «         |                      d¹dº¬¦  «        }|                     d©¦  «         |                     d»dd¼¬$¦  «         |                      d½d¾¬¦  «        }|                     d©¦  «         |                     d²d¿¬¦  «         |                     dÀddÁ¬¦  «         |                     d»dd¼¬$¦  «         |                      dÂdÃgdÄ¬¦  «        }|                     dÅg dÆ¢ddÇ¬�¦  «         |                     dÈddÉ¬$¦  «         |                     dddÊ¬¦  «         |                      dËdÌ¬¦  «        }|                     dÍ¦  «         |                     dÎ¦  «         |                      dÏdÐ¬¦  «        }|                     dÍ¦  «         |                     dÎ¦  «         |                      dÑdÒ¬¦  «        }|                     d©¦  «         |                     dÓt          t          j        dÔ¬\¦  «         |                      dÕdÖ¬¦  «        }|                     d©¦  «         |                     d×dØdÙ¬Ú¦  «         |                     dÛddÜ¬$¦  «         |                     dÝt          ddÞ¬\¦  «         |                      dßdà¬¦  «        }|                     d©¦  «         |                     dAdá¬¦  «         |                     dâddã¬$¦  «         |                     d"ddä¬$¦  «         |                     dÛddå¬$¦  «         |                      dædç¬¦  «        }|                     d©¦  «         |                     dd¬¦  «         |                      dèdé¬¦  «        }|                     dêt          ¬ë¦  «         |                      dìdí¬¦  «        }|                     dîdØdï¬Ú¦  «         |                     dðddñ¬$¦  «         |                     dòddó¬$¦  «         |                     dôddõ¬$¦  «         |                      död÷¬¦  «        }|                     d©¦  «         |                     dðdŒdø¬Ž¦  «         |                     dòddù¬$¦  «         |                     dôddú¬$¦  «         |                      dûdü¬¦  «        }|                     d©¦  «         |                     dýdþdÿ¬Ú¦  «         |                     �d dØd�d¬D¦  «         |                     �ddt          t          j        ¦  «        �d¬Ÿ¦  «         |                      �d�d¬¦  «        }|                     d©¦  «         |                     dýdþ�d¬Ú¦  «         |                     �d dØd�d¬D¦  «         |                      �d�d	¬¦  «        }|                     d»d�d
¬$¦  «         |                     dîdØ�¬¦  «         |                      �d�d¬¦  «        } |                      d©¦  «         |                      dýdþ�d¬Ú¦  «         |                      �d dØd�d¬D¦  «         |                      �dd�d¬¦  «         |                      �dd�d¬¦  «         |                      d�dd�d�¬¦  «         |                      �d�d¬¦  «        }!|!                     dîdþ�d¬Ú¦  «         |!                     �d�ddØd�d�¬¦  «         |                      �d�d¬¦  «        }"|"                     d©¦  «         |"                     �d t          �d!�¬"¦  «         |                      �d#�d$¬¦  «        }#|#                     �dd�d%¬¦  «         |#                     �d&t          d�d'¬\¦  «         |#                     �d(t          t          j        �d)t          j        › �d*�¬\¦  «         |#                     dd¬¦  «         |                      �d+�d,¬¦  «        }$|$                     �d t          �d-�d.¬\¦  «         |$                     �d&t          d�d/¬\¦  «         |$                     �d(t          t          j        �¬"¦  «         |$                     �d0d�d1¬$¦  «         |$                     �d2�d3d�d4¬¦  «         |$                     �ddt          j        ¬¦  «         |                      �d5�d6¬¦  «        }%|%                     dJd�d7¬$¦  «         |%                     dWd�d8¬$¦  «         |%                     �d9d�d:¬$¦  «         |%                     �d t          �d;�d<¬\¦  «         |                      �d=�d>¬¦  «        }&|&                     dd¬¦  «         |                      �d?�d@¬¦  «        }'|'                     d©¦  «         |'                     �dAdŒ�¬B¦  «         |'                     �dCdŒ�¬B¦  «         |'                     �dD�dE�dF¬$¦  «         |'                     �dGd¬–¦  «         |'                     �dHd¬–¦  «         |'                     �dId�dJ¬$¦  «         |                      �dK�dL¬¦  «        }(|(                     d©dBd�¬M¦  «         |(                     dd¬¦  «         |                      �dN�dO¬¦  «        })|)                     d©¦  «         |)                     �dAdŒ�¬B¦  «         |)                     �dCdŒ�¬B¦  «         |)                     �dGd¬–¦  «         |                      �dP�dQ¬¦  «        }*|*                     d©¦  «         |*                     �dRt          d�dS¬\¦  «         |                      �dT�dU¬¦  «        }+|+                     d©¦  «         |+                     dd¬¦  «         |+                     dªd«d�dV¬�¦  «         |+                     d­dd®d¯¬	¦  «         |                      �dW�dX¬¦  «        },|,                     d©¦  «         |,                     �dYd�dZ¬$¦  «         |                      �d[�d\¬¦  «        }-|-                     dd¬¦  «         |                      �d]�d^¬¦  «        }.|.                     d©¦  «         |                      �d_�d`¬¦  «        }/|/                     d©dBd�da¬D¦  «         |/                     d�dbd�dc�¬¦  «         |/                     dWd�dd¬$¦  «         |/                     dÛd�de¬$¦  «         |/                     dd�df¬¦  «         |                      �dg�dh¬¦  «        }0|0                     d©dBd�di¬D¦  «         |0                     d�dbd�dj�¬¦  «         |0                     dWd�dd¬$¦  «         |0                     dÛd�dk¬$¦  «         |0                     dd�df¬¦  «         |                      �dl�dm¬¦  «        }1|1                     �dnt          �do�dp¬\¦  «         |1                     �dqt          �do�dr¬\¦  «         |                      �ds�dt�du¬¦  «        }2|2                     dd�dv¬¦  «         |                     |�¬w¦  «         |S (x  z•Attach the ``kanban`` subcommand tree under an existing subparsers.

    Returns the top-level ``kanban`` parser so caller can ``set_defaults``.
    rx   z:Multi-profile collaboration board (tasks, links, comments)a7  Durable SQLite-backed task board shared across Hermes profiles. Tasks are claimed atomically, can depend on other tasks, and are executed by a named profile in an isolated workspace. See https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban or docs/hermes-kanban-v1-spec.pdf for the full design.)ÚhelpÚdescriptionz--boardNz<slug>z½Board slug to operate on. Defaults to the current board (set via `hermes kanban boards switch <slug>` or the HERMES_KANBAN_BOARD env var). Use `hermes kanban boards list` to see all boards.)ÚdefaultÚmetavarrˆ   Úkanban_action©ÚdestÚinitz(Create kanban.db if missing (idempotent))rˆ   Úboardsz9Manage kanban boards (one board per project / workstream)u  Boards let you separate unrelated streams of work (projects, repos, domains) into isolated queues. Each board has its own DB, workspaces directory, and dispatcher loop â€” tasks on one board cannot collide with tasks on another. The first board is 'default' and always exists.Úboards_actionrE   Úlsz List all boards with task counts)Úaliasesrˆ   z--jsonÚ
store_true)Úactionz--allzInclude archived boards too)r•   rˆ   ÚcreateÚnewzCreate a new boardÚslugz*Board slug (kebab-case, e.g. atm10-server)z--namez<Human-readable display name (defaults to Title Case of slug))rŠ   rˆ   z--descriptionzOptional descriptionz--iconz9Optional emoji or single-character icon for the dashboardz--colorz5Optional hex color (e.g. '#8b5cf6') for the dashboardz--switchz)Switch to the new board after creating itz--default-workdirz6Default workspace path for tasks created on this boardÚrmÚremoveÚdeletez#Archive (default) or delete a boardz--deletezxHard-delete the board directory instead of archiving it. Default is to move it to boards/_archived/ so it's recoverable.ÚswitchÚusez-Set the active board for subsequent CLI callsÚshowÚcurrentz%Print the currently-active board slugÚrenamez@Change a board's human-readable display name (slug is immutable)ÚnamezNew display nameúset-default-workdirz3Set the default workspace path for tasks on a boardr]   r    z7Absolute path to use as default workdir. Omit to clear.)ÚnargsrŠ   rˆ   zCreate a new taskr.   z
Task titlez--bodyzOptional opening postz
--assigneezProfile name to assignz--parentÚappendzParent task id (repeatable))r•   rŠ   rˆ   z--workspacerT   zDscratch | worktree | worktree:<path> | dir:<path> (default: scratch)z--branchz/Branch name for worktree tasks, e.g. wt/t6-wirez	--projectz”Link to a project (id or slug). Anchors the task's worktree under the project's primary repo with a deterministic branch. See `hermes project list`.z--tenantzTenant namespacez
--priorityr   zPriority tiebreaker)ÚtyperŠ   rˆ   z--triageuJ   Park in triage â€” a specifier will flesh out the spec and promote to todoz--idempotency-keyzkDedup key. If a non-archived task with this key exists, its id is returned instead of creating a duplicate.z--max-runtimez¦Per-task runtime cap. Accepts seconds (300) or durations (90s, 30m, 2h, 1d). When exceeded, the dispatcher SIGTERMs (then SIGKILLs) the worker and re-queues the task.z--created-byÚuserz0Author name recorded on the task (default: user)z--skillr>   z¡Skill to force-load into the worker (repeatable). The kanban lifecycle is already injected automatically. Example: --skill translation --skill github-code-review)r•   rŠ   rŽ   rˆ   z--max-retriesÚNu   Per-task override for the consecutive-failure circuit breaker. Trip on the Nth failure â€” e.g. --max-retries 1 blocks on the first failure (no retries), --max-retries 3 allows two retries. Omit to use the dispatcher's kanban.failure_limit config (default z).)r¥   rŠ   r‹   rˆ   z--modelr@   zÆPin the worker to this model (passed as -m <model>) without changing the profile's configured model. Combine with --provider when the model belongs to a different backend than the profile's default.)rŠ   rŽ   rˆ   z
--providerrA   z^Provider the --model belongs to (passed as --provider <name> to the worker). Requires --model.z--goalÚ	goal_modea=  Run the worker in a goal loop: after each turn a judge checks the response against the card title/body and, if not done, the worker keeps going in the same session until the judge agrees it's complete (or the turn budget runs out, which blocks the card for review). Best for open-ended cards one shot rarely finishes.)r•   rŽ   rˆ   z--goal-max-turnsÚgoal_max_turnszDTurn budget for --goal workers (default 20). Ignored without --goal.)r¥   rŠ   r‹   rŽ   rˆ   z--initial-statusr   zˆInitial card status. Use 'blocked' for cards that require immediate human ops (R3 gate) to skip the brief running-to-blocked transition.)ÚchoicesrŠ   rˆ   zEmit JSON outputÚswarmuN   Create a Kanban Swarm v1 graph (parallel workers â†’ verifier â†’ synthesizer)ÚgoalzSwarm goal / final outcomez--workerzPROFILE:TITLE[:SKILL,SKILL]z!Parallel worker card (repeatable))r•   rŠ   r‹   rˆ   z
--verifierTzVerifier profile)Úrequiredrˆ   z--synthesizerzSynthesizer/writer profilezCreator/anchor profilezDedup key for the root cardz
List tasksz--minez%Filter by $HERMES_PROFILE as assignee)rŠ   z--status)rŠ   rª   z	--sessionzZFilter by originating chat/agent session id (set on tasks created from inside an ACP loop)z
--archivedzInclude archived tasksz--sortz/Sort order for listed tasks (default: priority))rŠ   rª   rˆ   z--workflow-template-idÚIDz0Restrict to tasks with this workflow_template_idz
--step-keyrD   ÚKEYz,Restrict to tasks with this current_step_key)rŠ   rŽ   r‹   rˆ   z"Show a task with comments + eventsÚtask_idz--state-type)r*   Úoutcomez9With --state-name: filter listed runs by task_runs columnz--state-nameÚVALUEz;With --state-type: keep runs whose column equals this valueÚassignzAssign or reassign a taskÚprofilez$Profile name (or 'none' to unassign)ú	set-modelzQSet or clear a task's model/provider override (takes effect on the next dispatch)Úmodelz<Model to pin the worker to (or 'none' to clear the override)zjProvider the model belongs to (worker is spawned with --provider <name>). Cleared together with the model.Úreclaimz0Release an active worker claim on a running taskz--reasonz7Human-readable reason (recorded on the reclaimed event)ÚreassignzCReassign a task to a different profile, optionally reclaiming firstz(New profile name (or 'none' to unassign)z	--reclaimzIRelease any active claim before reassigning (required if task is running)ÚdiagnosticsÚdiagz,List active diagnostics on the current boardz
--severity©ÚwarningÚerrorÚcriticalz/Only show diagnostics at or above this severityz--taskz%Only show diagnostics for one task idz9Emit JSON (structured) instead of the default human tableÚlinkzAdd a parent->child dependencyÚ	parent_idÚchild_idÚunlinkz!Remove a parent->child dependencyÚclaimz>Atomically claim a ready task (prints resolved workspace path)z--ttlz#Claim TTL in seconds (default: 900)ÚcommentzAppend a commentÚtextú+zComment body)r£   rˆ   z--authorz0Author name (default: $HERMES_PROFILE or 'user')z	--max-lenz4Trim the stored comment body to this many charactersÚattachzAttach a local file to a taskz Path to the local file to attachz--content-typez4MIME type (default: guessed from the file extension)z5Stored filename (default: the source file's basename)z6uploaded_by label (default: $HERMES_PROFILE or 'user')ÚattachmentszList a task's attachmentsú	attach-rmzDelete an attachment by idÚattachment_id)r¥   ÚcompletezMark one or more tasks doneÚtask_idsz;One or more task ids (only --result applies to all of them)z--resultzResult summaryz	--summaryzSStructured handoff summary for downstream tasks. Falls back to --result if omitted.z
--metadatazlJSON dict of structured facts (e.g. '{"changed_files": [...], "tests_run": 12}'). Stored on the closing run.Úeditz1Edit recovery fields on an already-completed taskz+Backfilled task result text for a done taskz>Structured handoff summary. Falls back to --result if omitted.zCJSON dict of structured facts to store on the latest completed run.ÚblockzMark one or more tasks blockedÚreasonÚ*z#Reason (also appended as a comment)z--idsz=Additional task ids to block with the same reason (bulk mode)z--kinda2  Typed block reason. 'dependency' waits in todo (auto-promoted when parents finish, no human); 'needs_input'/'capability' go to blocked for a human; 'transient' marks a maybe-flaky failure. Repeated same-kind re-blocks after unblock route the task to triage to break unblock loops. Omit for a generic block.ÚschedulezFPark one or more tasks in Scheduled (waiting on time, not human input)z/Reason/timing note (also appended as a comment)z@Additional task ids to schedule with the same reason (bulk mode)ÚunblockzJReturn blocked/scheduled tasks to ready, or todo while parents remain openu[   Optional reason/note â€” recorded as a comment before unblocking. Quote multi-word reasons.)r£   ÚpromotezEManually move one or more todo/blocked tasks to ready (recovery path)z4Audit-trail reason (recorded on the task_events row)z?Additional task ids to promote with the same reason (bulk mode)z--forcez=Promote even if parent dependencies are not yet done/archivedz	--dry-runz-Validate the promotion without mutating stateÚjsonz!Emit machine-readable JSON result)rŽ   r•   rˆ   ÚarchivezArchive one or more tasksz"Task ids to archive (default mode)z--rmÚ	purge_idsz;Permanently delete already-archived task ids from the board)rŽ   r£   rŠ   rˆ   ÚtailzFollow a task's event streamz
--intervalg      ð?)r¥   rŠ   Údispatchz@One dispatcher pass: reclaim stale, promote ready, spawn workersz<Don't actually spawn processes; just print what would happenz--maxzCap number of spawns this passz--failure-limitzrAuto-block a task after this many consecutive non-success attempts (spawn_failed, timed_out, or crashed; default: ú)ÚdaemonuN   DEPRECATED â€” dispatcher now runs in the gateway. Use `hermes gateway start`.g      N@z,Seconds between dispatch ticks (default: 60)zCap number of spawns per tickz	--pidfilez,Write the daemon's PID to this file on startz	--verbosez-vz!Log each tick's outcome to stdoutÚwatchz8Live-stream task_events to the terminal (Ctrl+C to exit)z3Only show events for tasks assigned to this profilez*Only show events from tasks in this tenantz--kindsz[Comma-separated event kinds to include (e.g. 'completed,blocked,gave_up,crashed,timed_out')g      à?z'Poll interval in seconds (default: 0.5)Ústatsz3Per-status + per-assignee counts + oldest-ready ageúnotify-subscribeziSubscribe a gateway source to a task's terminal events (used by /kanban subscribe in the gateway adapter)z
--platform)r­   z	--chat-idz--chat-typer   z+dm / group / channel (used by wake routing)z--thread-idz	--user-idz--notifier-profilezNProfile gateway that owns/delivers this subscription (default: active profile)únotify-listz>List notification subscriptions (optionally for a single task))r£   rŠ   únotify-unsubscribez)Remove a gateway subscription from a taskÚlogzAPrint the worker log for a task (from <kanban-root>/kanban/logs/)z--tailzOnly print the last N bytesÚrunszUShow attempt history for a task (one row per run: profile, outcome, elapsed, summary)z2With --state-name: filter runs by task_runs columnÚ	heartbeatzBEmit a heartbeat event for a running task (worker liveness signal)z--notez3Optional short note attached to the heartbeat eventÚ	assigneeszoList known profiles + per-profile task counts (union of ~/.hermes/profiles/ and current assignees on the board)Úcontextz[Print the full context a worker sees for a task (title + body + parent results + comments).ÚspecifyzžFlesh out a triage-column task into a concrete spec (title + body) and promote it to todo. Uses the auxiliary LLM configured under auxiliary.triage_specifier.z3Task id to specify (required unless --all is given)Ú
all_triagez1Specify every task currently in the triage columnz7When used with --all, restrict the sweep to this tenantzSAuthor name recorded on the audit comment (default: $HERMES_PROFILE or 'specifier')z'Emit one JSON object per task on stdoutÚ	decomposezèDecompose a triage-column task into a graph of child tasks routed to specialist profiles by description. Falls back to specify-style single-task promotion when the task doesn't benefit from fan-out. Uses auxiliary.kanban_decomposer.z5Task id to decompose (required unless --all is given)z3Decompose every task currently in the triage columnzTAuthor name recorded on the audit comment (default: $HERMES_PROFILE or 'decomposer')ÚgczBGarbage-collect archived-task workspaces, old events, and old logsz--event-retention-daysé   zEDelete task_events older than N days for terminal tasks (default: 30)z--log-retention-daysz7Delete worker log files older than N days (default: 30)Úrepairz?Check kanban.db integrity and auto-repair index-only corruptionu  Runs PRAGMA integrity_check on the board's DB and reports the result. When the failure consists only of index-scoped errors ('wrong # of entries in index <name>' / 'row N missing from index <name>'), the corrupt file is quarantined to a .corrupt.<hash>.bak sibling first and the damaged indexes are rebuilt with REINDEX â€” the same narrow auto-repair the connect-time guard applies. Any other corruption class is reported and left untouched (fail-closed). Exits 0 when the DB is healthy or was repaired, non-zero when it is still corrupt.zEmit the repair report as JSON)Ú_kanban_parser)Ú
add_parserÚadd_argumentÚadd_subparsersÚintÚkbÚDEFAULT_FAILURE_LIMITÚsortedÚVALID_INITIAL_STATUSESÚVALID_STATUSESÚVALID_SORT_ORDERSÚkeysÚDEFAULT_CLAIM_TTL_SECONDSÚVALID_BLOCK_KINDSÚfloatÚDEFAULT_SPAWN_FAILURE_LIMITrZ   ÚSUPPRESSÚset_defaults)3r„   Úkanban_parserÚsubÚp_boardsÚ
boards_subÚb_listÚb_createÚb_rmÚb_switchÚb_renameÚb_set_wdÚp_createÚp_swarmÚp_listÚp_showÚp_assignÚp_set_modelÚ	p_reclaimÚ
p_reassignÚp_diagÚp_linkÚp_unlinkÚp_claimÚ	p_commentÚp_attachÚp_attachmentsÚp_attach_rmÚ
p_completeÚp_editÚp_blockÚ
p_scheduleÚ	p_unblockÚ	p_promoteÚ	p_archiveÚp_tailÚp_dispÚp_daemonÚp_watchÚp_statsÚp_nsubÚp_nlistÚp_nrmÚp_logÚp_runsÚp_hbÚp_asgÚp_ctxÚ	p_specifyÚp_decomposeÚp_gcÚp_repairs3                                                      r   Úbuild_parserr/  Ø   s™  € ð
 &×0Ò0ØØIðEð	 1ñ 
ô 
€Mð  ×ÒØØØð!ð ñ 
ô 
ð 
ð ×
&Ò
&¨OÐ
&Ñ
<Ô
<€Cð ‡N‚N�6Ð J€NÑKÔKÐKð �~Š~ØØHðGð	 ñ 
ô 
€Hð ×(Ò(¨oÐ(Ñ>Ô>€Jà×"Ò"Ø˜˜Ø/ð #ñ ô €Fð ×Ò˜¨ÐÑ6Ô6Ð6Ø
×Ò˜¨Ø:ð ñ <ô <ð <ð ×$Ò$Ø˜5˜'Ø!ð %ñ ô €Hð ×Ò˜&ØKð ñ Mô Mð Mà×Ò˜(¨DØ]ð ñ _ô _ð _à×Ò˜/°4Ø5ð ñ 7ô 7ð 7à×Ò˜(¨DØZð ñ \ô \ð \à×Ò˜)¨TØVð ñ Xô Xð Xà×Ò˜*¨\ØJð ñ Lô Lð Là×ÒÐ-°tØWð ñ Yô Yð Yð × Ò Ø�x Ð*Ø2ð !ñ ô €Dð 	×Ò�fÑÔÐØ×Ò�j¨ð]ð ñ ^ô ^ð ^ð ×$Ò$Ø˜5˜'Ø<ð %ñ ô €Hð ×Ò˜&Ñ!Ô!Ð!à×ÒØ˜˜Ø4ð ñ ô ð ð
 ×$Ò$ØØOð %ñ ô €Hð ×Ò˜&Ñ!Ô!Ð!Ø×Ò˜&Ð'9ÐÑ:Ô:Ð:à×$Ò$ØØBð %ñ ô €Hð ×Ò˜&Ñ!Ô!Ð!Ø×Ò˜&¨°TØXð ñ Zô Zð Zð �~Š~˜hÐ-@ˆ~ÑAÔA€HØ×Ò˜'¨ÐÑ5Ô5Ð5Ø×Ò˜(¨DÐ7NÐÑOÔOÐOØ×Ò˜,°Ð;SÐÑTÔTÐTØ×Ò˜*¨X¸rØ<ð ñ >ô >ð >à×Ò˜-°ð 4ð ñ 5ô 5ð 5ð ×Ò˜*¨dØPð ñ Rô Rð Rà×Ò˜+¨tð Rð ñ Sô Sð Sð ×Ò˜*¨dÐ9KÐÑLÔLÐLØ×Ò˜,­S¸!ÐBWÐÑXÔXÐXØ×Ò˜*¨\Økð ñ mô mð mà×ÒÐ-°tð Uð ñ Vô Vð Vð ×Ò˜/°4ð 9ð ñ :ô :ð :ð
 ×Ò˜.°&ØQð ñ Sô Sð Sà×Ò˜)¨H¸bÀxð Pð ñ Qô Qð Qð
 ×Ò˜/µ¸TØ"%ð Hõ ,.Ô+Cð Hð  Hð  Hð ñ Iô Ið Ið ×Ò˜)¨TÐ8Hð Eð ñ Fô Fð Fð ×Ò˜,°Ð;Nð *ð ñ +ô +ð +ð ×Ò˜(¨<¸kð 2ð ñ 3ô 3ð 3ð ×ÒÐ,µ3ÀØ"%Ð,<ð 9ð ñ :ô :ð :ð ×ÒÐ,Ý"(­Ô)BÑ"CÔ"CØ"+ð Rð ñ Sô Sð Sð ×Ò˜(¨<Ð>PÐÑQÔQÐQð �nŠnØØ]ð ñ ô €Gð ×Ò˜Ð&BÐÑCÔCÐCØ×ÒØØØØ-Ø0ð ñ ô ð ð ×Ò˜°Ð;MÐÑNÔNÐNØ×Ò˜°4Ð>ZÐÑ[Ô[Ð[Ø×Ò˜¨TÐ8JÐÑKÔKÐKØ×Ò˜­C¸ÐAVÐÑWÔWÐWØ×Ò˜°Ð<TÐÑUÔUÐUØ×ÒÐ,°dÐA^ÐÑ_Ô_Ð_Ø×Ò˜¨,Ð=OÐÑPÔPÐPð �^Š^˜F¨T¨F¸ˆ^ÑFÔF€FØ
×Ò˜¨ØDð ñ Fô Fð Fà
×Ò˜¨dÐÑ3Ô3Ð3Ø
×Ò˜
¨DÝ &¥rÔ'8Ñ 9Ô 9ð ñ ;ô ;ð ;à
×Ò˜
¨DÐÑ1Ô1Ð1Ø
×Ò˜¨TðNð ñ Oô Oð Oð ×Ò˜¨\Ø5ð ñ 7ô 7ð 7à
×Ò˜¨ÐÑ6Ô6Ð6Ø
×ÒØØÝ•rÔ+×0Ò0Ñ2Ô2Ñ3Ô3Ø>ð	 ñ ô ð ð ×ÒØ ØØØ?ð	 ñ ô ð ð ×ÒØØØØØ;ð ñ ô ð ð �^Š^˜FÐ)Mˆ^ÑNÔN€FØ
×Ò˜	Ñ"Ô"Ð"Ø
×Ò˜¨ÐÑ6Ô6Ð6Ø
×ÒØØ%ØØHð	 ñ ô ð ð ×ÒØØØØJð	 ñ ô ð ð �~Š~˜hÐ-Hˆ~ÑIÔI€HØ×Ò˜)Ñ$Ô$Ð$Ø×Ò˜)Ð*PÐÑQÔQÐQð —.’.Øð3ð !ñ ô €Kð
 ×Ò˜YÑ'Ô'Ð'Ø×ÒØ�s DØKð ñ ô ð ð ×ÒØ˜dðDð ñ ô ð ð —’ØØ?ð ñ ô €Ið ×Ò˜9Ñ%Ô%Ð%Ø×ÒØ˜DØFð ñ ô ð ð
 —’ØØRð  ñ ô €Jð ×Ò˜IÑ&Ô&Ð&Ø×ÒØØ7ð ñ ô ð ð ×ÒØ˜LØXð ñ ô ð ð ×ÒØ˜DØFð ñ ô ð ð �^Š^ØØ�Ø;ð ñ ô €Fð
 ×ÒØØ0Ð0Ð0ØØ>ð	 ñ ô ð ð ×ÒØØØ4ð ñ ô ð ð
 ×ÒØ˜ØHð ñ ô ð ð �^Š^˜FÐ)Iˆ^ÑJÔJ€FØ
×Ò˜Ñ$Ô$Ð$Ø
×Ò˜
Ñ#Ô#Ð#Ø�~Š~˜hÐ-Pˆ~ÑQÔQ€HØ×Ò˜+Ñ&Ô&Ð&Ø×Ò˜*Ñ%Ô%Ð%ð �nŠnØØMð ñ ô €Gð ×Ò˜Ñ#Ô#Ð#Ø×Ò˜¥sµBÔ4PØCð ñ Eô Eð Eð —’˜yÐ/A�ÑBÔB€IØ×Ò˜9Ñ%Ô%Ð%Ø×Ò˜6¨°>ÐÑBÔBÐBØ×Ò˜:¨tØ Rð ñ Tô Tð Tà×Ò˜;­S¸$Ø Vð ñ Xô Xð Xð �~Š~˜hÐ-Lˆ~ÑMÔM€HØ×Ò˜)Ñ$Ô$Ð$Ø×Ò˜&Ð'IÐÑJÔJÐJØ×ÒÐ*°DØUð ñ Wô Wð Wà×Ò˜(¨DØVð ñ Xô Xð Xà×Ò˜*¨dØWð ñ Yô Yð Yð —N’N =Ð7R�NÑSÔS€MØ×Ò˜yÑ)Ô)Ð)Ø×Ò˜x°ÐÑ=Ô=Ð=à—.’. Ð3O�.ÑPÔP€KØ×Ò˜_µ3ÐÑ7Ô7Ð7à—’ 
Ð1N�ÑOÔO€JØ×Ò˜J¨cØ!^ð ñ `ô `ð `à×Ò˜J°Ð;KÐÑLÔLÐLØ×Ò˜K°ð"Fð ñ Gô Gð Gð ×Ò˜L°$ð"Sð ñ Tô Tð Tð �^Š^ØØ@ð ñ ô €Fð ×Ò˜	Ñ"Ô"Ð"Ø
×ÒØØØ:ð ñ ô ð ð
 ×ÒØØØMð ñ ô ð ð
 ×ÒØØØRð ñ ô ð ð �nŠn˜WÐ+KˆnÑLÔL€GØ×Ò˜Ñ#Ô#Ð#Ø×Ò˜¨Ð3XÐÑYÔYÐYØ×Ò™¨°TÙ]ð ñ _ô _ð _à×ÒÙ˜$­­rÔ/CÑ(DÔ(DñGð ñ 	ô 	ð 	ð —’¡
Ñ1y�ÑzÔz€JØ×Ò˜IÑ&Ô&Ð&Ø×Ò˜H¨CÑ6gÐÑhÔhÐhØ×Ò™G¨3¸Ù!cð ñ eô eð eð —’ÙÙYð ñ ô €Ið ×ÒØØÙjð ñ ô ð ð
 ×Ò˜:¨SÑÑ1Ô1Ð1à—’ÙÙTð ñ ô €Ið ×Ò˜9Ñ%Ô%Ð%Ø×ÒØØÙCð ñ ô ð ð
 ×ÒÙØØÙNð	 ñ ô ð ð ×ÒÙØÙLð ñ ô ð ð
 ×ÒÙØÙ<ð ñ ô ð ð
 ×ÒØÙØÙ0ñ	 ñ ô ð ð —’™yÑ/J�ÑKÔK€IØ×Ò˜:¨SÙ Dð ñ Fô Fð Fà×ÒÙÙØØÙJñ ñ ô ð ð �^Š^™FÑ)Gˆ^ÑHÔH€FØ
×Ò˜	Ñ"Ô"Ð"Ø
×Ò™­5¹#ÑÑ>Ô>Ð>ð �^Š^ÙÙOð ñ ô €Fð ×Ò™¨LÙ[ð ñ ]ô ]ð ]à
×Ò™¥c°4Ù=ð ñ ?ô ?ð ?à
×ÒÑ)µÝ "Ô >ñqÝOQÔOmðqñ qð qð ñ rô rð rð ×Ò˜¨ÐÑ6Ô6Ð6ð �~Š~ÙÙ]ð ñ ô €Hð ×Ò™,­U¹DÙMð ñ Oô Oð Oà×Ò™'­°TÙ>ð ñ @ô @ð @à×ÒÑ+µ#Ý"$Ô"@ñ ñ Bô Bð Bà×Ò™+¨tÙMð ñ Oô Oð Oà×Ò™+¡t°LÙBð ñ Dô Dð Dð
 ×Ò™)¨LÝ'Ô0ð ñ 2ô 2ð 2ð �nŠnÙÙGð ñ ô €Gð ×Ò˜¨tÙSð ñ Uô Uð Uà×Ò˜¨TÙJð ñ Lô Lð Là×Ò™¨DñUð ñ Vô Vð Vð ×Ò™­E¹3ÙGð ñ Iô Ið Ið �nŠnÙÑKð ñ ô €Gð ×Ò˜¨,ÐÑ7Ô7Ð7ð �^Š^ÙñBð ñ ô €Fð
 ×Ò˜	Ñ"Ô"Ð"Ø
×Ò™¨tÑÑ4Ô4Ð4Ø
×Ò™¨dÑÑ3Ô3Ð3Ø
×Ò™©rÑ8eÐÑfÔfÐfØ
×Ò™¨tÐÑ4Ô4Ð4Ø
×Ò™¨TÐÑ2Ô2Ð2Ø
×ÒÙ dÙ]ð ñ ô ð ð
 �nŠnÙÙMð ñ ô €Gð ×Ò˜¨#°tÑÑ<Ô<Ð<Ø×Ò˜¨,ÐÑ7Ô7Ð7à�NŠNÙÙ8ð ñ ô €Eð 
×Ò�yÑ!Ô!Ð!Ø	×Ò‘|¨dÑÑ3Ô3Ð3Ø	×Ò‘{¨TÑÑ2Ô2Ð2Ø	×Ò‘}¨dÐÑ3Ô3Ð3ð �NŠNÙÙPð ñ ô €Eð 
×Ò�yÑ!Ô!Ð!Ø	×Ò‘x¥c°4Ù9ð ñ ;ô ;ð ;ð �^Š^Ùñ*ð ñ ô €Fð
 ×Ò˜	Ñ"Ô"Ð"Ø
×Ò˜¨ÐÑ6Ô6Ð6Ø
×ÒØØ%ØÙAð	 ñ ô ð ð ×ÒØØØØJð	 ñ ô ð ð �>Š>ÙÙQð ñ ô €Dð 	×Ò�iÑ Ô Ð Ø×Ò‘h¨ÙPð ñ Rô Rð Rð �NŠNÙñQð ñ ô €Eð
 
×Ò�x¨ÐÑ5Ô5Ð5ð �NŠNÙñ;ð ñ ô €Eð
 
×Ò�yÑ!Ô!Ð!ð —’Ùñ@ð ñ ô €Ið ×ÒØØØÙBð	 ñ ô ð ð ×ÒØÙØÙ@ñ	 ñ ô ð ð ×ÒØØÙFð ñ ô ð ð
 ×ÒØØñ9ð ñ ô ð ð ×ÒØØÙ6ð ñ ô ð ð —.’.ÙñGð !ñ ô €Kð ×ÒØØØÙDð	 ñ ô ð ð ×ÒØÙØÙBñ	 ñ ô ð ð ×ÒØØÙFð ñ ô ð ð
 ×ÒØØñ:ð ñ ô ð ð ×ÒØØÙ6ð ñ ô ð ð �>Š>ÙÑWð ñ ô €Dð 	×ÒÑ.µSÁ"Ùbð ñ dô dð dà×ÒÑ,µ3ÁÙTð ñ Vô Vð Vð �~Š~ÙÙNñMð	 ñ ô €Hð ×Ò˜(¨<Ù?ð ñ Aô Að Að ×Ò¨mÑÑ<Ô<Ð<ØÐr   rï   c                ó  — t          | dd¦  «        }|sEt          | dd¦  «        }|�|                     ¦   «          nt          dt          j        ¬¦  «         dS t          | ¦  «        rt          dt          j        ¬¦  «         dS |d	k    rt          | ¦  «        S t          | d
d¦  «        }t          j        ¦   «         }|rÇ	 t          j
        |¦  «        }n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d}~dS d}~ww xY w|st          dt          j        ¬¦  «         dS |t          j        k    r8t          j        |¦  «        s$t          d|›d|› d�t          j        ¬¦  «         dS t          j        |¦  «        }|5  |dk    rt          | ¦  «        cddd¦  «         S 	 t          j        ¦   «          nA# t"          $ r4}t          d|› �t          j        ¬¦  «         Y d}~ddd¦  «         dS d}~ww xY wi dt$          “dt&          “dt(          “dt*          “dt*          “dt,          “dt.          “dt0          “dt2          “dt4          “dt6          “dt6          “dt8          “d t:          “d!t<          “d"t>          “d#t@          “i d$tB          “d%tD          “d&tF          “d'tH          “d(tJ          “d)tL          “d*tN          “d+tP          “d,tR          “d-tT          “d.tV          “d/tX          “d0tZ          “d1t\          “d2t^          “d3t`          “d4tb          “¥td          tf          th          tj          tl          tn          tp          tr          d5œ¥}| :                    |¦  «        }|s,t          d6|›�t          j        ¬¦  «         	 ddd¦  «         dS 	 tw           || ¦  «        pd¦  «        cddd¦  «         S # t          tx          f$ r4}t          d|› �t          j        ¬¦  «         Y d}~ddd¦  «         dS d}~ww xY w# 1 swxY w Y   dS )7u†   Entry point from ``hermes kanban â€¦`` argparse dispatch.

    Returns a shell-style exit code (0 on success, non-zero on error).
    rŒ   Nrë   z`usage: hermes kanban <action> [options]
Run 'hermes kanban --help' for the full list of actions.©Úfiler   zKkanban: delegate_task child contexts cannot mutate Kanban tasks via the CLIé   r�   Úboardúkanban: é   zkanban: --board requires a slugzkanban: board ú= does not exist. Create it with `hermes kanban boards create ú`.rê   z'kanban: could not initialize database: r�   r–   r«   rE   r’   rž   r³   rµ   r·   r¸   r¹   rº   r¿   rÂ   rÃ   rÄ   rÇ   rÈ   rÉ   rË   rÍ   rÎ   rÑ   rÒ   rÓ   rÕ   r×   rØ   rÚ   rÛ   rÜ   rà   rá   râ   )rã   rÝ   rÞ   rß   rä   rå   rç   rè   zkanban: unknown action )=rM   Ú
print_helpÚprintÚsysÚstderrÚ _is_delegated_child_cli_mutationÚ_dispatch_boardsÚ
contextlibÚnullcontextrð   Ú_normalize_board_slugÚ
ValueErrorÚDEFAULT_BOARDÚboard_existsÚscoped_current_boardÚ_cmd_repairÚinit_dbr{   Ú	_cmd_initÚ_cmd_createÚ
_cmd_swarmÚ	_cmd_listÚ	_cmd_showÚ_cmd_assignÚ_cmd_set_modelÚ_cmd_reclaimÚ_cmd_reassignÚ_cmd_diagnosticsÚ	_cmd_linkÚ_cmd_unlinkÚ
_cmd_claimÚ_cmd_commentÚ_cmd_attachÚ_cmd_attachmentsÚ_cmd_attach_rmÚ_cmd_completeÚ	_cmd_editÚ
_cmd_blockÚ_cmd_scheduleÚ_cmd_unblockÚ_cmd_promoteÚ_cmd_archiveÚ	_cmd_tailÚ_cmd_dispatchÚ_cmd_daemonÚ
_cmd_watchÚ
_cmd_statsÚ_cmd_logÚ	_cmd_runsÚ_cmd_heartbeatÚ_cmd_assigneesÚ_cmd_notify_subscribeÚ_cmd_notify_listÚ_cmd_notify_unsubscribeÚ_cmd_contextÚ_cmd_specifyÚ_cmd_decomposeÚ_cmd_gcr)   rï   ÚRuntimeError)	rG   r•   ÚparserÚboard_overrideÚboard_scopeÚnormedÚexcÚhandlersÚhandlers	            r   Úkanban_commandrx  Á  s'  € õ
 �T˜?¨DÑ1Ô1€FØð å˜Ð/°Ñ6Ô6ˆØÐØ×ÒÑÔÐÐåðKå”Zðñ ô ð ð
 ˆqõ (¨Ñ-Ô-ð ÝØYÝ”ð	
ñ 	
ô 	
ð 	
ð ˆqð �ÒÐÝ Ñ%Ô%Ð%õ ˜T 7¨DÑ1Ô1€NÝÔ(Ñ*Ô*€KØð 6ð	ÝÔ-¨nÑ=Ô=ˆFˆFøÝð 	ð 	ð 	ÝÐ"˜SÐ"Ð"­¬Ð4Ñ4Ô4Ð4Ø�1�1�1�1�1øøøøð	øøøð ð 	ÝÐ3½#¼*ÐEÑEÔEÐEØ�1ð •RÔ%Ò%Ð%­b¬o¸fÑ.EÔ.EÐ%ÝðJ ð Jð JØ?EðJð Jð Jå”Zðñ ô ð ð
 �1ÝÔ-¨fÑ5Ô5ˆð 
ð Að Að
 �XÒÐÝ˜tÑ$Ô$ðAð Að Að Añ Aô Að Að Að	ÝŒJ‰LŒLˆLˆLøÝð 	ð 	ð 	ÝÐA¸CÐAÐAÍÌ
ÐSÑSÔSÐSØ�1�1�1ðAð Að Añ Aô Að Að Að Aøøøøð	øøøð+
Ø�	ð+
à�ð+
ð �
ð+
ð �	ð	+
ð
 �	ð+
ð �	ð+
ð �ð+
ð �ð+
ð �ð+
ð �ð+
ð Õ+ð+
ð Õ(ð+
ð �	ð+
ð �ð+
ð �
ð+
ð  �ð!+
ð" �ð#+
ð +
ð$ Õ+ð%+
ð& �ð'+
ð( �ð)+
ð* �	ð++
ð, �
ð-+
ð. �ð/+
ð0 �ð1+
ð2 �ð3+
ð4 �ð5+
ð6 �	ð7+
ð8 �ð9+
ð: �ð;+
ð< �
ð=+
ð> �
ð?+
ð@ �ðA+
ðB �	ðC+
ðD �ðE+
ð +
õF (Ý"7Ý"2Ý"9Ý$Ý$Ý(ÝðU+
ð +
ð +
ˆðX —,’,˜vÑ&Ô&ˆØð 	ÝÐ6¨FÐ6Ð6½S¼ZÐHÑHÔHÐHØðyAð Að Añ Aô Að Að Að Aðz	Ý�w�w˜t‘}”}Ð)¨Ñ*Ô*ð}Að Að Að Añ Aô Að Að Aøõ~ �LÐ)ð 	ð 	ð 	ÝÐ"˜SÐ"Ð"­¬Ð4Ñ4Ô4Ð4Ø�1�1�1ðCAð Að Añ Aô Að Að Að Aøøøøð~	øøøðAð Að Að Aøøøð Að Að Að Að Að Asy   ÃC Ã
D	Ã DÄD	Æ	O:Æ,G Æ?O:Ç 
G>Ç
G9Ç(O:Ç9G>Ç>F O:ÎN2Î2O7ÏO2Ï!O:Ï2O7Ï7O:Ï:O>ÐO>c                 óž   — dD ]'} t           j                             | ¦  «        }|r|c S Œ(	 ddlm}  |¦   «         pdS # t
          $ r Y dS w xY w)z4Best-effort author name for an interactive CLI call.)ÚHERMES_PROFILE_NAMEÚHERMES_PROFILEr   )Úget_active_profile_namer¦   )r\   Úenvironr)   Úhermes_cli.profilesr|  r{   )Úenvr_   r|  s      r   Ú_profile_authorr€  O  s‡   € à8ð ð ˆÝŒJ�NŠN˜3ÑÔˆØð 	ØˆHˆHˆHð	ðØ?Ð?Ð?Ð?Ð?Ð?Ø&Ð&Ñ(Ô(Ð2¨FÐ2øÝð ð ð Øˆvˆvðøøøs   ¬> ¾
AÁA>   rè   rÍ   r�   r¿   rÎ   rÃ   r«   r³   rÇ   r–   rÚ   rê   rÂ   rÕ   rÄ   rÓ   r·   rå   rÒ   rË   rØ   r¸   rÑ   rç   râ   rÉ   rÝ   rß   zfrozenset[str]Ú_DELEGATED_CHILD_DENIED_ACTIONS>	   r™   r—   r�   r–   r›   rš   r    rœ   r¢   Ú%_DELEGATED_CHILD_DENIED_BOARD_ACTIONSr   c                ó  — t          | dd ¦  «        }|dk    rt          | dd ¦  «        pd}|t          vrdS n|t          vrdS 	 ddlm}  |¦   «         S # t
          $ r/ t          t          j         	                    d¦  «        ¦  «        cY S w xY w)	NrŒ   r�   r‘   rE   Fr   )Ú"is_delegated_child_process_contextÚHERMES_DELEGATED_CHILD_CONTEXT)
rM   r‚  r�  Úagent.delegation_contextr„  r{   r   r\   r}  r)   )rG   r•   r‘   r„  s       r   r=  r=  ˆ  sÅ   € Ý�T˜?¨DÑ1Ô1€FØ�ÒÐÝ  o°tÑ<Ô<ÐFÀˆØÕ EÐEÐEØ�5ð Fà	Õ6Ð	6Ð	6ØˆuðFØOÐOÐOÐOÐOÐOà1Ð1Ñ3Ô3Ð3øÝð Fð Fð FÝ•B”J—N’NÐ#CÑDÔDÑEÔEÐEÐEÐEðFøøøs   ÁA Á6BÂBc                óz  — t          | dd¦  «        pd}|dv rt          | ¦  «        S |dv rt          | ¦  «        S |dv rt          | ¦  «        S |dv rt	          | ¦  «        S |dv rt          | ¦  «        S |d	k    rt          | ¦  «        S |d
k    rt          | ¦  «        S t          d|›�t          j
        ¬¦  «         dS )at  Handle ``hermes kanban boards <action>``.

    Boards management is deliberately separate from the task-level
    commands: it operates on the filesystem (board directories,
    ``current`` pointer, ``board.json``), not on the per-board SQLite
    DB, so a fresh HERMES_HOME that has never called ``kanban init``
    can still run ``boards create`` / ``boards list``.
    r‘   NrE   >   r’   rE   >   r—   r–   >   r™   r›   rš   >   r�   rœ   >   rž   rŸ   r    r¢   zkanban boards: unknown action r1  r6  )rM   Ú_cmd_boards_listÚ_cmd_boards_createÚ_cmd_boards_rmÚ_cmd_boards_switchÚ_cmd_boards_showÚ_cmd_boards_renameÚ_cmd_boards_set_default_workdirr:  r;  r<  )rG   rþ   s     r   r>  r>  œ  sï   € õ �$˜¨Ñ
.Ô
.Ð
8°&€CØ
ˆnÐÐÝ Ñ%Ô%Ð%Ø
ÐÐÐÝ! $Ñ'Ô'Ð'Ø
Ð(Ð(Ð(Ý˜dÑ#Ô#Ð#Ø
ÐÐÐÝ! $Ñ'Ô'Ð'Ø
Ð!Ð!Ð!Ý Ñ%Ô%Ð%Ø
ˆh‚€Ý! $Ñ'Ô'Ð'Ø
Ð#Ò#Ð#Ý.¨tÑ4Ô4Ð4Ý	Ð
2¨3Ð
2Ð
2½¼ÐDÑDÔDÐDØˆ1r   r˜   údict[str, int]c                ó>  — 	 t          j        | ¬¦  «        }|                     ¦   «         si S t          j        | ¬¦  «        5 }|                     d¦  «                             ¦   «         }ddd¦  «         n# 1 swxY w Y   d„ |D ¦   «         S # t          $ r i cY S w xY w)zDReturn ``{status: count}`` for a board. Safe to call on an empty DB.)r4  z7SELECT status, COUNT(*) AS n FROM tasks GROUP BY statusNc                óF   — i | ]}|d          t          |d         ¦  «        “ŒS )r*   Ún)rï   ©ri   Úrs     r   ú
<dictcomp>z&_board_task_counts.<locals>.<dictcomp>Â  s(   € Ð7Ð7Ð7¨Q��(”�S  3¤™[œ[Ð7Ð7Ð7r   )rð   Úkanban_db_pathÚexistsÚconnect_closingÚexecuteÚfetchallr{   )r˜   r]   ÚconnÚrowss       r   Ú_board_task_countsr�  ¸  sñ   € ð
ÝÔ  tÐ,Ñ,Ô,ˆØ�{Š{‰}Œ}ð 	ØˆIÝÔ dÐ+Ñ+Ô+ð 	¨tØ—<’<ØIñô çŠh‰jŒjð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 8Ð7°$Ð7Ñ7Ô7Ð7øÝð ð ð Øˆ	ˆ	ˆ	ðøøøs:   ‚*B ­B Á(A6Á*B Á6A:Á:B Á=A:Á>B ÂBÂBc           
     óê  — t          t          | dd¦  «        ¦  «        }t          j        |¬¦  «        }t          j        ¦   «         }|D ]S}|d         |k    |d<   t          |d         ¦  «        |d<   t          |d                              ¦   «         ¦  «        |d<   ŒTt          | dd¦  «        r&t          t          j
        |d	d¬
¦  «        ¦  «         dS |st          d¦  «         dS t          dd›ddd›ddd›d�¦  «         |D ]¬}|d         rdnd}|d         pi }d                     d„ t          |                     ¦   «         ¦  «        D ¦   «         ¦  «        pd}|                     d¦  «        pd}|                     d¦  «        r|dz  }t          |d›d|d         d›d|d›d|› �¦  «         Œ­t          ¦   «          t          d|› �¦  «         t          |¦  «        dk    rt          d¦  «         dS ) NÚallF©Úinclude_archivedr˜   Ú
is_currentÚcountsÚtotalrÔ   r6  ©ÚindentÚensure_asciir   uD   (no boards â€” create one with `hermes kanban boards create <slug>`)r   Ú2sr%   ÚSLUGÚ24sÚNAMEÚ28sú  COUNTSr	   r$   ú, c              3  ó*   K  — | ]\  }}|› d |› �V — ŒdS ©Ú=N© ©ri   Úkr_   s      r   rk   z#_cmd_boards_list.<locals>.<genexpr>Ü  s0   è è € ÐDÐD¡T Q¨˜�j�j˜Q�j�jÐDÐDÐDÐDÐDÐDr   z(empty)r¡   r   z [archived]úCurrent board: r3  z8Switch boards with `hermes kanban boards switch <slug>`.)r   rM   rð   Úlist_boardsÚget_current_boardr�  ÚsumÚvaluesr:  rÔ   ÚdumpsÚjoinrò   Úitemsr)   rY   )	rG   r¡  r�   rŸ   ÚbÚmarkerr£  Ú
counts_strr¡   s	            r   rˆ  rˆ  Ç  s9  € Ý�G D¨%°Ñ7Ô7Ñ8Ô8ÐÝŒ^Ð-=Ð>Ñ>Ô>€FåÔ"Ñ$Ô$€GØð /ð /ˆØ˜Vœ9¨Ò/ˆˆ,‰Ý(¨¨6¬Ñ3Ô3ˆˆ(‰Ý˜˜8œ×+Ò+Ñ-Ô-Ñ.Ô.ˆˆ'‰
ˆ
Ýˆt�V˜UÑ#Ô#ð Ý�dŒj˜¨¸Ð>Ñ>Ô>Ñ?Ô?Ð?Øˆqàð ÝÐTÑUÔUÐUØˆqÝ	ˆRÐ
8Ð
8Ð
8�fÐ
8Ð
8Ð
8 FÐ
8Ð
8Ð
8Ð
8Ñ9Ô9Ð9Øð 
Ið 
IˆØ˜Lœ/Ð2��¨sˆØ�8”Ð" ˆà�IŠIÐDÐD­V°F·L²L±N´NÑ-CÔ-CÐDÑDÔDÑDÔDð Øð 	ð �uŠu�V‰}Œ}Ð" ˆØ�5Š5�ÑÔð 	"Ø�MÑ!ˆDÝ�ÐGÐGÐG˜a œiÐGÐGÐG¨tÐGÐGÐG¸:ÐGÐGÑHÔHÐHÐHÝ	�G„G€GÝ	Ð
%˜GÐ
%Ð
%Ñ&Ô&Ð&Ý
ˆ6�{„{�Q‚€ÝÐHÑIÔIÐIØˆ1r   c                ó  — 	 t          j        | j        ¦  «        }n6# t          $ r)}t	          d|› �t
          j        ¬¦  «         Y d }~dS d }~ww xY w|st	          dt
          j        ¬¦  «         dS t          j        |¦  «        o|t           j        k    }t          j	        || j
        | j        | j        | j        | j        ¬¦  «        }|rdnd}t	          d|d	         ›d
|› d�¦  «         t	          d|                     dd¦  «        › �¦  «         t	          d|d         › �¦  «         t!          | dd¦  «        r4t          j        |d	         ¦  «         t	          d|d	         ›d�¦  «         nt	          d|d	         › d�¦  «         dS )Nzkanban boards create: r1  r6  z&kanban boards create: slug is required)r¡   r‰   r/   ÚcolorÚdefault_workdirzalready existsÚcreatedúBoard r˜   r$   ú.ú  Display name: r¡   r   ú  DB path:      Údb_pathrœ   Fz  Switched to z#  Use `hermes kanban boards switch z` to make it current.r   )rð   rA  r˜   rB  r:  r;  r<  rD  rC  Úcreate_boardr¡   r‰   r/   rÁ  rÂ  r)   rM   Úset_current_board)rG   rt  ru  ÚalreadyÚmetaÚverbs         r   r‰  r‰  ê  sÀ  € ðÝÔ)¨$¬)Ñ4Ô4ˆˆøÝð ð ð ÝÐ, sÐ,Ð,µ3´:Ð>Ñ>Ô>Ð>Øˆqˆqˆqˆqˆqøøøøðøøøð ð ÝÐ6½S¼ZÐHÑHÔHÐHØˆqÝŒo˜fÑ%Ô%ÐD¨&µBÔ4DÒ*D€GÝŒ?ØØŒYØÔ$ØŒYØŒjØÔ,ðñ ô €Dð  'Ð5ÐÐ¨I€DÝ	Ð
+�4˜”<Ð
+Ð
+ DÐ
+Ð
+Ð
+Ñ,Ô,Ð,Ý	Ð
3˜TŸXšX f¨bÑ1Ô1Ð
3Ð
3Ñ4Ô4Ð4Ý	Ð
.˜T )œ_Ð
.Ð
.Ñ/Ô/Ð/Ýˆt�X˜uÑ%Ô%ð YÝ
Ô˜T &œ\Ñ*Ô*Ð*ÝÐ0˜t Fœ|Ð0Ð0Ð0Ñ1Ô1Ð1Ð1åÐW°D¸´LÐWÐWÐWÑXÔXÐXØˆ1ó   ‚ œ
A¦A
Á
Ac                ó¦  — t          | dd¦  «        pt          | dd¦  «        dk    }	 t          j        | j        | ¬¦  «        }n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY w|d	         d
k    r1t          d|d         ›d|d         › �¦  «         t          d¦  «         nt          d|d         ›d�¦  «         dS )Nr›   Fr‘   r   )rÕ   zkanban boards rm: r1  r3  r•   r   rÄ  r˜   u    archived â†’ Únew_pathzERecover by moving the directory back to <root>/kanban/boards/<slug>/.z	 deleted.r   )rM   rð   Úremove_boardr˜   rB  r:  r;  r<  )rG   Úforce_deleteÚresru  s       r   rŠ  rŠ    s  € õ
 ˜4 ¨5Ñ1Ô1ÐcµW¸TÀ?ÐTVÑ5WÔ5WÐ[cÒ5c€LðÝŒo˜dœi°\Ð1AÐBÑBÔBˆˆøÝð ð ð ÝÐ( 3Ð(Ð(­s¬zÐ:Ñ:Ô:Ð:Øˆqˆqˆqˆqˆqøøøøðøøøð ˆ8„}˜
Ò"Ð"ÝÐE�s˜6”{ÐEÐE°C¸
´OÐEÐEÑFÔFÐFÝð .ñ 	/ô 	/ð 	/ð 	/õ 	Ð/�s˜6”{Ð/Ð/Ð/Ñ0Ô0Ð0Øˆ1s   ¨A Á
A8ÁA3Á3A8c                ó¤  — 	 t          j        | j        ¦  «        }n6# t          $ r)}t	          d|› �t
          j        ¬¦  «         Y d }~dS d }~ww xY w|st	          dt
          j        ¬¦  «         dS t          j        |¦  «        s$t	          d|›d|› d�t
          j        ¬¦  «         dS t          j        |¦  «         t	          d	|›d
�¦  «         dS )Nzkanban boards switch: r1  r6  z&kanban boards switch: slug is requiredzkanban boards switch: board r7  r8  r3  zActive board is now rÅ  r   )	rð   rA  r˜   rB  r:  r;  r<  rD  rÊ  )rG   rt  ru  s      r   r‹  r‹    s  € ðÝÔ)¨$¬)Ñ4Ô4ˆˆøÝð ð ð ÝÐ, sÐ,Ð,µ3´:Ð>Ñ>Ô>Ð>Øˆqˆqˆqˆqˆqøøøøðøøøð ð ÝÐ6½S¼ZÐHÑHÔHÐHØˆqÝŒ?˜6Ñ"Ô"ð ÝðF¨6ð Fð FØ;AðFð Fð Få”ð	
ñ 	
ô 	
ð 	
ð
 ˆqÝÔ˜Ñ Ô Ð Ý	Ð
, Ð
,Ð
,Ð
,Ñ-Ô-Ð-Øˆ1rÎ  c                ób  — t          j        ¦   «         }t          j        |¦  «        }t          |¦  «        }t	          |                     ¦   «         ¦  «        }t          d|› �¦  «         t          d|                     dd¦  «        › �¦  «         |                     d¦  «        rt          d|d         › �¦  «         t          d|d         › �¦  «         t          d	|› d
�|rBdd                     d„ t          | 
                    ¦   «         ¦  «        D ¦   «         ¦  «        › d�ndz   ¦  «         dS )Nrµ  rÆ  r¡   r   r‰   z  Description:  rÇ  rÈ  z  Tasks:        z totalú (r®  c              3  ó*   K  — | ]\  }}|› d |› �V — ŒdS r°  r²  r³  s      r   rk   z#_cmd_boards_show.<locals>.<genexpr><  s0   è è € ÐJÐJ©4¨1¨a˜q˜J˜J 1˜J˜JÐJÐJÐJÐJÐJÐJr   rÙ   r   )rð   r·  Úread_board_metadatar�  r¸  r¹  r:  r)   r»  rò   r¼  )rG   rŸ   rÌ  r£  r¤  s        r   rŒ  rŒ  1  s<  € ÝÔ"Ñ$Ô$€GÝÔ! 'Ñ*Ô*€DÝ Ñ(Ô(€FÝ�—’‘”Ñ Ô €EÝ	Ð
%˜GÐ
%Ð
%Ñ&Ô&Ð&Ý	Ð
3˜TŸXšX f¨bÑ1Ô1Ð
3Ð
3Ñ4Ô4Ð4Ø‡x‚x�ÑÔð 8ÝÐ6  mÔ!4Ð6Ð6Ñ7Ô7Ð7Ý	Ð
.˜T )œ_Ð
.Ð
.Ñ/Ô/Ð/Ý	Ð
*˜UÐ
*Ð
*Ð
*àðÐM�$—)’)ÐJÐJµ6¸&¿,º,¹.¼.Ñ3IÔ3IÐJÑJÔJÑJÔJÐMÐMÐMÐMØñ ñ !ô !ð !ð ˆ1r   c                óŽ  — 	 t          j        | j        ¦  «        }n6# t          $ r)}t	          d|› �t
          j        ¬¦  «         Y d }~dS d }~ww xY w|rt          j        |¦  «        s&t	          d| j        ›d�t
          j        ¬¦  «         dS t          j        || j	        ¬¦  «        }t	          d|›d	|d
         ›d�¦  «         dS )Nzkanban boards rename: r1  r6  zkanban boards rename: board ú does not existr3  )r¡   rÄ  z renamed to r¡   rÅ  r   )
rð   rA  r˜   rB  r:  r;  r<  rD  Úwrite_board_metadatar¡   )rG   rt  ru  rÌ  s       r   r�  r�  A  só   € ðÝÔ)¨$¬)Ñ4Ô4ˆˆøÝð ð ð ÝÐ, sÐ,Ð,µ3´:Ð>Ñ>Ô>Ð>Øˆqˆqˆqˆqˆqøøøøðøøøð ð �œ¨Ñ0Ô0ð ÝÐI¨T¬YÐIÐIÐIÝ”:ð	ñ 	ô 	ð 	àˆqÝÔ" 6°´	Ð:Ñ:Ô:€DÝ	Ð
:�6Ð
:Ð
:¨¨f¬Ð
:Ð
:Ð
:Ñ;Ô;Ð;Øˆ1rÎ  c                óØ  — 	 t          j        | j        ¦  «        }n6# t          $ r)}t	          d|› �t
          j        ¬¦  «         Y d }~dS d }~ww xY w|rt          j        |¦  «        s&t	          d| j        ›d�t
          j        ¬¦  «         dS t          j        || j	        ¬¦  «        }| 
                    d¦  «        }|rt	          d	|›d
|›d�¦  «         nt	          d	|›d�¦  «         dS )Nz#kanban boards set-default-workdir: r1  r6  z)kanban boards set-default-workdir: board rÚ  r3  )rÂ  rÂ  rÄ  z default workdir set to rÅ  z default workdir cleared.r   )rð   rA  r˜   rB  r:  r;  r<  rD  rÛ  r]   r)   )rG   rt  ru  rÌ  Únew_vals        r   rŽ  rŽ  P  s&  € ðÝÔ)¨$¬)Ñ4Ô4ˆˆøÝð ð ð ÝÐ9°CÐ9Ð9ÅÄ
ÐKÑKÔKÐKØˆqˆqˆqˆqˆqøøøøðøøøð ð �œ¨Ñ0Ô0ð ÝÐV¸$¼)ÐVÐVÐVÝ”:ð	ñ 	ô 	ð 	àˆqÝÔ" 6¸4¼9ÐEÑEÔE€DØ�hŠhÐ(Ñ)Ô)€GØð <ÝÐE�vÐEÐE¸ÐEÐEÐEÑFÔFÐFÐFåÐ:�vÐ:Ð:Ð:Ñ;Ô;Ð;Øˆ1rÎ  c                óÀ  — | �| dk    rdS t          | ¦  «                             ¦   «                              ¦   «         }	 t          |¦  «        S # t          $ r Y nw xY wdddddœ}|rf|d         |v r\	 t          |dd…         ¦  «        }n%# t          $ r}t	          d	| ›�¦  «        |‚d}~ww xY wt          |||d                  z  ¦  «        S t	          d	| ›d
�¦  «        ‚)uÅ   Parse ``30s`` / ``5m`` / ``2h`` / ``1d`` or a raw integer â†’ seconds.

    Returns None for empty input. Raises ValueError on malformed input so
    the CLI can surface a usage error cleanly.
    Nr   r3  é<   é  i€Q )ÚsÚmÚhÚdéÿÿÿÿzmalformed duration z( (expected 30s, 5m, 2h, 1d, or a number))r   rW   Úlowerrï   rB  rù   )Úvalrá  Úunitsr’  ru  s        r   Ú_parse_durationré  f  s  € ð €{�c˜R’i�iØˆtÝˆC‰Œ�ŠÑÔ×ÒÑ Ô €AðÝ�1‰vŒvˆøÝð ð ð Øˆðøøøð ˜" 4¨eÐ4Ð4€EØð %ˆQˆrŒU�eˆ^ˆ^ð	EÝ�a˜˜˜”f‘”ˆAˆAøÝð 	Eð 	Eð 	EÝÐ:°3Ð:Ð:Ñ;Ô;ÀÐDøøøøð	Eøøøå�1�u˜Q˜rœU”|Ñ#Ñ$Ô$Ð$Ý
ÐZ¨3ÐZÐZÐZÑ
[Ô
[Ð[s)   ¿A Á
AÁAÁ2B
 Â

B,ÂB'Â'B,c                óü  — t          j        ¦   «         }t          d|› �¦  «         t          ¦   «          	 t          j        ¦   «         }n# t          $ r g }Y nw xY w|r8t          dt          |¦  «        › d�¦  «         |D ]}t          d|› �¦  «         Œnt          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          t          d	¦  «         d
S )NzKanban DB initialized at zDiscovered z7 profile(s) on disk; any of these can be an --assignee:r%   z,No profiles found under ~/.hermes/profiles/.z@Create one with `hermes -p <name> setup` before assigning tasks.zCNext step: start the gateway so ready tasks actually get picked up.z  hermes gateway startzµThe gateway hosts an embedded dispatcher that ticks every 60 seconds
by default (config: kanban.dispatch_interval_seconds). Without a
running gateway, tasks stay in 'ready' forever.r   )rð   rG  r:  Úlist_profiles_on_diskr{   rY   )rG   r]   Úprofilesr¡   s       r   rH  rH    s6  € ÝŒ:‰<Œ<€DÝ	Ð
, dÐ
,Ð
,Ñ-Ô-Ð-å	�G„G€GðÝÔ+Ñ-Ô-ˆˆøÝð ð ð Øˆˆˆðøøøàð RÝð #�C ™MœMð #ð #ð #ñ 	$ô 	$ð 	$àð 	ð 	ˆDÝ�+�t�+�+ÑÔÐÐð	õ 	Ð<Ñ=Ô=Ð=ÝÐPÑQÔQÐQÝ	�G„G€GÝ	Ð
OÑPÔPÐPÝ	Ð
"Ñ#Ô#Ð#Ý	�G„G€GÝ	ð	:ñô ð ð
 ˆ1s   µA	 Á	AÁAc           
     óV  — t          j        ¦   «         5 }t          j        || j        t	          | dd ¦  «        t          | j        ¦  «        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |s&t          d| j        › d�t          j        ¬¦  «         dS t          d| j        › �¦  «         dS )	NÚnote)rî  Úexpected_run_idzcannot heartbeat z (not running?)r1  r3  zHeartbeat recorded for r   )	rð   r˜  Úheartbeat_workerr°   rM   Ú_worker_run_id_forr:  r;  r<  ©rG   r›  Úoks      r   rg  rg  ¡  sî   € Ý	Ô	Ñ	Ô	ð 
 ÝÔ ØØŒLÝ˜˜v tÑ,Ô,Ý.¨t¬|Ñ<Ô<ð	
ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð ð ÝÐ? $¤,Ð?Ð?Ð?ÅcÄjÐQÑQÔQÐQØˆqÝ	Ð
2 D¤LÐ
2Ð
2Ñ3Ô3Ð3Øˆ1s   ”?AÁA#Á&A#c                ó:  — t          j        ¦   «         5 }t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   t          | dd¦  «        r&t	          t          j        |dd¬¦  «        ¦  «         dS |st	          d¦  «         dS t	          dd›d	d
d›d�¦  «         |D ]w}|d         rdnd}|d         pi }d                     d„ t          | 	                    ¦   «         ¦  «        D ¦   «         ¦  «        pd}t	          |d         d›d	|d›d	|› �¦  «         ŒxdS )NrÔ   Fr6  r¥  r   uA   (no assignees â€” create a profile with `hermes -p <name> setup`)r«  r'   r%   zON DISKr&   r­  Úon_diskÚyesÚnor£  r®  c              3  ó*   K  — | ]\  }}|› d |› �V — ŒdS r°  r²  r³  s      r   rk   z!_cmd_assignees.<locals>.<genexpr>¾  ó0   è è € ÐLÐL©T¨Q° ˜j˜j Q˜j˜jÐLÐLÐLÐLÐLÐLr   z(idle)r¡   )
rð   r˜  Úknown_assigneesrM   r:  rÔ   rº  r»  rò   r¼  )rG   r›  ÚdataÚentryrõ  r£  Ú	count_strs          r   rh  rh  °  sŠ  € Ý	Ô	Ñ	Ô	ð ( ÝÔ! $Ñ'Ô'ˆð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (åˆt�V˜UÑ#Ô#ð Ý�dŒj˜ a°eÐ<Ñ<Ô<Ñ=Ô=Ð=ØˆqØð ÝÐQÑRÔRÐRØˆqå	ˆVÐ
1Ð
1Ð
1˜9Ð
1Ð
1Ð
1Ð
1Ñ2Ô2Ð2Øð Að AˆØ  Ô+Ð5�%�%°ˆØ�x”Ð& BˆØ—I’IÐLÐLµV¸F¿LºL¹N¼NÑ5KÔ5KÐLÑLÔLÑLÔLÐXÐPXˆ	Ý��v”Ð?Ð?Ð? gÐ?Ð?Ð?°IÐ?Ð?Ñ@Ô@Ð@Ð@Øˆ1ó   ”5µ9¼9c                ó’  — 	 t          | j        ¦  «        \  }}t          t          | dd ¦  «        ¦  «        }n;# t          j        $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY w|r#|dk    rt          dt          j        ¬¦  «         dS 	 t          t          | dd ¦  «        ¦  «        }n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY wt          | d	d ¦  «        }|�'|d
k     r!t          d|› d�t          j        ¬¦  «         dS t          j        ¦   «         5 }t          j        |fi d| j        “d| j        “d| j        “d| j        pt%          ¦   «         “d|“d|“d|“dt          | dd ¦  «        “d| j        “d| j        “dt+          | j        pd¦  «        “dt/          t          | dd¦  «        ¦  «        “dt          | dd ¦  «        “d|“dt          | dd ¦  «        pd “d	|“dt          | dd ¦  «        “d t          | d d ¦  «        “d!t/          t          | d!d¦  «        ¦  «        “d"t          | d"d ¦  «        “d#t          | d#d$¦  «        “Ž}t          j        ||¦  «        }	d d d ¦  «         n# 1 swxY w Y   t          | d%d¦  «        r2t          t3          j        t7          |	¦  «        dd¬&¦  «        ¦  «         njt          d'|› d(|	j        › d)|	j        pd*› d+�¦  «         |	j        d,k    r:|	j        r3t;          ¦   «         \  }
}|
s |rt          d-|› �t          j        ¬¦  «         d.S )/Nrm   r5  r1  r6  rU   z8kanban: --branch is only valid with --workspace worktreeÚmax_runtimezkanban: --max-runtime: r?   r3  z(kanban: --max-retries must be >= 1 (got z&); use 1 to trip on the first failure.r.   r3   r+   r9   r5   r6   r7   r8   Úprojectr,   r4   Úparentsr²  ÚtriageFÚidempotency_keyÚmax_runtime_secondsr>   r@   rA   r¨   r©   Úinitial_statusr   rÔ   r¥  zCreated ú  (z, assignee=re   rÙ   r   u   
âš   r   )rb   Ú	workspacern   rM   rZ   r[   r:  r;  r<  ré  rB  rð   r˜  Úcreate_taskr.   r3   r+   r9   r€  r,   r4   ÚtupleÚparentr   Úget_taskrÔ   rº  rF   r*   rƒ   )rG   Úws_kindÚws_pathr7   ru  r   r?   r›  r°   Útaskr   Úmessages               r   rI  rI  Ã  s{  € ðÝ0°´Ñ@Ô@Ñˆ�Ý(­°°xÀÑ)FÔ)FÑGÔGˆˆøÝÔ%ð ð ð ÝÐ˜ÐÐ¥S¤ZÐ0Ñ0Ô0Ð0Øˆqˆqˆqˆqˆqøøøøðøøøð ð �w *Ò,Ð,ÝÐHÍsÌzÐZÑZÔZÐZØˆqðÝ%¥g¨d°MÀ4Ñ&HÔ&HÑIÔIˆˆøÝð ð ð ÝÐ-¨Ð-Ð-µC´JÐ?Ñ?Ô?Ð?Øˆqˆqˆqˆqˆqøøøøðøøøõ ˜$ ¨tÑ4Ô4€KØÐ ;°¢? ?Ýð2°{ð 2ð 2ð 2å”ð	
ñ 	
ô 	
ð 	
ð
 ˆqÝ	Ô	Ñ	Ô	ð * Ý”.Øð
ð 
ð 
à”*�*ð
ð ”�ð
ð ”]�]ð	
ð
 ”Ð;­/Ñ*;Ô*;øð
ð #˜7ð
ð #˜7ð
ð $˜ð
õ ˜t Y°Ñ5Ô5Ð5ð
ð ”;�;ð
ð ”]�]ð
õ ˜$œ+Ð+¨Ñ,Ô,Ð,ð
õ �  h°Ñ6Ô6Ñ7Ô7Ð7ð
õ $ DÐ*;¸TÑBÔBÐBð
ð !, ð
õ  ˜4 ¨4Ñ0Ô0Ð8°Døð!
ð" $˜ð#
õ$ # 4Ð)9¸4Ñ@Ô@Ð@ð%
õ& & dÐ,?ÀÑFÔFÐFð'
õ( �7 4¨°eÑ<Ô<Ñ=Ô=Ð=ð)
õ* # 4Ð)9¸4Ñ@Ô@Ð@ð+
õ, # 4Ð)9¸9ÑEÔEÐEð-
ˆõ0 Œ{˜4 Ñ)Ô)ˆð3*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *õ4 ˆt�V˜UÑ#Ô#ð <Ý�dŒj� tÑ,Ô,°QÀUÐKÑKÔKÑLÔLÐLÐLåÐT˜ÐTÐT T¤[ÐTÐT¸T¼]Ð=QÈcÐTÐTÐTÑUÔUÐUð Œ;˜'Ò!Ð! d¤mÐ!Ý9Ñ;Ô;ÑˆG�WØð <˜wð <ÝÐ) Ð)Ð)µ´
Ð;Ñ;Ô;Ð;Øˆ1s@   ‚58 ¸A0ÁA+Á+A0ÂB8 Â8
C+ÃC&Ã&C+Ä;EJÊJÊJc                óN  — 	 d„ | j         pg D ¦   «         }n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY w|st          dt          j        ¬¦  «         dS t          j        ¦   «         5 }t          j        || j	        || j
        | j        | j        | j        pt          ¦   «         | j        t!          | dd ¦  «        ¬¦	  «	        }d d d ¦  «         n# 1 swxY w Y   t!          | dd	¦  «        r7t          t#          j        |                     ¦   «         dd	¬
¦  «        ¦  «         not          d|j        › �¦  «         t          dd                     |j        ¦  «        z   ¦  «         t          d|j        › �¦  «         t          d|j        › �¦  «         dS )Nc                ó6   — g | ]}t          j        |¦  «        ‘ŒS r²  )ÚksÚparse_worker_arg)ri   Úraws     r   ú
<listcomp>z_cmd_swarm.<locals>.<listcomp>	  s#   € ÐKÐKÐK°•2Ô& sÑ+Ô+ÐKÐKÐKr   zkanban swarm: r1  r6  z/kanban swarm: at least one --worker is requiredr  )r¬   ÚworkersÚverifier_assigneeÚsynthesizer_assigneer,   r9   r4   r  rÔ   Fr¥  zSwarm root: z	Workers: r®  z
Verifier: zSynthesizer: r   )ÚworkerrB  r:  r;  r<  rð   r˜  r  Úcreate_swarmr¬   ÚverifierÚsynthesizerr,   r9   r€  r4   rM   rÔ   rº  Úas_dictÚroot_idr»  Ú
worker_idsÚverifier_idÚsynthesizer_id)rG   r  ru  r›  rÃ  s        r   rJ  rJ    sÿ  € ðØKÐK¸¼Ð8IÀrÐKÑKÔKˆˆøÝð ð ð ÝÐ$˜sÐ$Ð$­3¬:Ð6Ñ6Ô6Ð6Øˆqˆqˆqˆqˆqøøøøðøøøð ð ÝÐ?ÅcÄjÐQÑQÔQÐQØˆqÝ	Ô	Ñ	Ô	ð 
 Ý”/ØØ”ØØ"œmØ!%Ô!1Ø”;Ø”Ð;­/Ñ*;Ô*;Ø”]Ý# DÐ*;¸TÑBÔBð

ñ 

ô 

ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ ˆt�V˜UÑ#Ô#ð 8Ý�dŒj˜ŸšÑ*Ô*°1À5ÐIÑIÔIÑJÔJÐJÐJåÐ.˜Wœ_Ð.Ð.Ñ/Ô/Ð/Ýˆk˜DŸIšI gÔ&8Ñ9Ô9Ñ9Ñ:Ô:Ð:ÝÐ0˜7Ô.Ð0Ð0Ñ1Ô1Ð1ÝÐ6˜gÔ4Ð6Ð6Ñ7Ô7Ð7Øˆ1s'   ‚ –
A	 AÁA	Á>AC#Ã#C'Ã*C'c                óB  — | j         }| j        r|st          ¦   «         }t          j        ¦   «         5 }t          j        |¦  «         t          j        ||| j        | j        | j	        | j
        t          | dd ¦  «        | j        | j        ¬¦	  «	        }d d d ¦  «         n# 1 swxY w Y   t          | dd¦  «        r0t          t          j        d„ |D ¦   «         dd¬¦  «        ¦  «         dS 	 t          j        d¬	¦  «        }n# t$          $ r g }Y nw xY wt'          |¦  «        d
k    rFt          j        ¦   «         }t'          |¦  «        d
z
  }t          d|› d|› d|d
k    rdnd› d�¦  «         |st          d¦  «         dS |D ]}t          t+          |¦  «        ¦  «         ŒdS )NÚsort)r+   r*   r,   rB   r¡  Úorder_byrC   rD   rÔ   Fc                ó,   — g | ]}t          |¦  «        ‘ŒS r²  )rF   )ri   r   s     r   r  z_cmd_list.<locals>.<listcomp>:  s    € Ð:Ð:Ð:¨q�-¨Ñ*Ô*Ð:Ð:Ð:r   r6  r¥  r   r   r3  zBoard: rÖ  z other boardrá  r   u"    â€” `hermes kanban boards list`)
z(no matching tasks))r+   Úminer€  rð   r˜  Úrecompute_readyÚ
list_tasksr*   r,   Úsessionr   rM   rC   rD   r:  rÔ   rº  r¶  r{   rY   r·  r0   )rG   r+   r›  ÚtasksÚ
all_boardsrŸ   Úother_countr   s           r   rK  rK  &  s5  € ØŒ}€HØ„yð %˜ð %Ý"Ñ$Ô$ˆÝ	Ô	Ñ	Ô	ð 
 õ 	Ô˜4Ñ Ô Ð Ý”ØØØ”;Ø”;Ø”|Ø!œ]Ý˜T 6¨4Ñ0Ô0Ø!%Ô!:Ø!Ô2ð

ñ 

ô 

ˆð	
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ ˆt�V˜UÑ#Ô#ð Ý�dŒjÐ:Ð:°EÐ:Ñ:Ô:À1ÐSXÐYÑYÔYÑZÔZÐZØˆqðÝ”^°UÐ;Ñ;Ô;ˆ
ˆ
øÝð ð ð Øˆ
ˆ
ˆ
ðøøøå
ˆ:�„˜ÒÐÝÔ&Ñ(Ô(ˆÝ˜*‘o”o¨Ñ)ˆÝð.�gð .ð .Øð.ð .Ø0;¸qÒ0@Ð0@¨¨Àbð.ð .ð .ñ	
ô 	
ð 	
ð
 ð ÝÐ#Ñ$Ô$Ð$ØˆqØð !ð !ˆÝ�n˜QÑÔÑ Ô Ð Ð Øˆ1s$   ²ABÂB!Â$B!Ã*D  Ä DÄDc                ó4  — t          | ¦  «        }|€t          dt          j        ¬¦  «         dS t	          j        ¦   «         5 }t	          j        || j        ¦  «        }|s1t          d| j        › �t          j        ¬¦  «         	 d d d ¦  «         dS t	          j        || j        ¦  «        }t	          j	        || j        ¦  «        }t	          j
        || j        ¦  «        }t	          j        || j        ¦  «        }t	          j        || j        fi |¤Ž}t	          j        || j        ¦  «        }	d d d ¦  «         n# 1 swxY w Y   t          | dd¦  «        r[t          |¦  «        |	||d„ |D ¦   «         d	„ |D ¦   «         d
„ |D ¦   «         dœ}
t          t!          j        |
dd¬¦  «        ¦  «         dS t          d|j        › d|j        › �¦  «         t          d|j        › �¦  «         t          d|j        pd› �¦  «         |j        rt          d|j        › �¦  «         t          d|j        › �|j        r
d|j        › �ndz   ¦  «         |j        rt          d|j        › �¦  «         |j        r*t          dd                     |j        ¦  «        › �¦  «         |j        r-|j        rd|j        › d�nd}t          d|j        › |› �¦  «         |j        �t          d|j        › d�¦  «         n¬	 ddlm }  |¦   «         }| !                    d i ¦  «        pi  !                    d!¦  «        }n# tD          $ r d }Y nw xY w|�>tG          |¦  «        t          j$        k    r!t          dtG          |¦  «        › d"�¦  «         nt          dt          j$        › d#�¦  «         t          d$tK          |j&        ¦  «        › d%|j'        pd› �¦  «         dd&l(m)} | *                    |||¦  «        }|�rFd'd(d)d*œ}t          d+tW          |¦  «        › d,�¦  «         |D �]}t          d-| !                    |j,        d.¦  «        › d/|j,        › d0|j        › �¦  «         |j-        r¯g }|j-         .                    ¦   «         D ]l\  }}t_          |t`          ¦  «        r8| 1                    |› d1d2                     d3„ |D ¦   «         ¦  «        › �¦  «         ŒR| 1                    |› d1|› �¦  «         Œm|r%t          d4d5                     |¦  «        › �¦  «         |j2        D ] }|j3        rt          d6|j4        › �¦  «         Œ!�Œ|j5        r$t          d7tK          |j5        ¦  «        › �¦  «         |j6        r$t          d8tK          |j6        ¦  «        › �¦  «         |r%t          d9d                     |¦  «        › �¦  «         |r%t          d:d                     |¦  «        › �¦  «         |j7        r1t          ¦   «          t          d;¦  «         t          |j7        ¦  «         |j8        r2t          ¦   «          t          d<¦  «         t          |j8        ¦  «         n.|	r,t          ¦   «          t          d=¦  «         t          |	¦  «         |rgt          ¦   «          t          d>tW          |¦  «        › d,�¦  «         |D ]6}t          d?tK          |j&        ¦  «        › d0|j9        › d|j7        › �¦  «         Œ7|r“t          ¦   «          t          d@tW          |¦  «        › d,�¦  «         |dAd …         D ]Z}|j:        r
dB|j:        › �nd}|j;        rdC|j;        › dD�nd}t          d?tK          |j&        ¦  «        › dD|› dB|j<        › |› �¦  «         Œ[|�r,t          ¦   «          t          dEtW          |¦  «        › d,�¦  «         |D ]û}|j=        rt}          d|j=        |j5        z
  ¦  «        nd }|�|› dF�ndG}|j?        p|j        pdG}t          dH|j        dI›dB|dJ›dK|j@        pd› dL|› dLtK          |j5        ¦  «        › �
¦  «         |jA        r7t          dM|jA         B                    ¦   «         d         d dN…         › �¦  «         |jC        r7t          dO|jC         B                    ¦   «         d         d dN…         › �¦  «         ŒüdS )PNzBkanban show: pass both --state-type and --state-name, or omit bothr1  r6  úno such task: r3  rÔ   Fc                ó8   — g | ]}|j         |j        |j        d œ‘ŒS )©Úauthorr3   r:   r1  )ri   Úcs     r   r  z_cmd_show.<locals>.<listcomp>p  s8   € ð ð ð àð œ8¨Q¬VÀ1Ä<ÐPÐPðð ð r   c                óD   — g | ]}|j         |j        |j        |j        d œ‘ŒS )©ra   Úpayloadr:   Úrun_idr5  )ri   Úes     r   r  z_cmd_show.<locals>.<listcomp>t  sE   € ð ð ð ð ð œFØ œyØ"#¤,Øœhð	ð ðð ð r   c                ó˜   — g | ]G}|j         |j        |j        |j        |j        |j        |j        |j        |j        |j	        |j
        d œ‘ŒHS )©r-   r´   Ústep_keyr*   r±   Úsummaryr½   ÚmetadataÚ
worker_pidr;   Úended_atr:  r“  s     r   r  z_cmd_show.<locals>.<listcomp>}  sh   € ð ð ð ð ð œ$Ø œyØ !¤
ØœhØ œyØ œyØœWØ !¤
Ø"#¤,Ø"#¤,Ø !¤
ðð ðð ð r   )r  Úlatest_summaryr  ÚchildrenÚcommentsÚeventsrá   r¥  r   zTask ú: z  status:    z  assignee:  re   z  tenant:    z  workspace: z @ r   z  branch:    z  skills:    r®  z (provider: rÙ   z  model:     z  max-retries: z (task)rv   rx   Úfailure_limitz (config kanban.failure_limit)z
 (default)z  created:   z by ©Úkanban_diagnosticsõ   âš ú!!ú!!!r»   z
  Diagnostics (z):ú    r    r"   ú] r±  ú,c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rg   ©r   ©ri   Úxs     r   rk   z_cmd_show.<locals>.<genexpr>À  ó(   è è € Ð3FÐ3F¸qµC¸±F´FÐ3FÐ3FÐ3FÐ3FÐ3FÐ3Fr   ú       data: ú | õ          â†’ z  started:   z  completed: z  parents:   z  children:  zBody:zResult:zLatest summary:z
Comments (ú  [zEvents (iìÿÿÿr$   z [run r#   zRuns (rá  Úactivez  #z<3z<12z @r%   u           â†’ é    z
        ! )DrP   r:  r;  r<  rð   r˜  r  r°   Úlist_commentsÚlist_eventsÚ
parent_idsÚ	child_idsÚ	list_runsr@  rM   rF   rÔ   rº  r-   r.   r*   r+   r,   r5   r6   r7   r>   r»  r@   rA   r?   r~   rw   r)   r{   rï   rñ   r   r:   r9   Ú
hermes_clirG  Úcompute_task_diagnosticsrY   Úseverityrû  r¼  Ú
isinstancerE   r¤   ÚactionsÚ	suggestedÚlabelr;   r<   r3   r=   r2  r6  r7  ra   r?  Úmaxr±   r´   r<  Ú
splitlinesr½   )rG   Úrskr›  r  rB  rC  r  rA  rá   r@  r6  Ú_provrw   r�   Úcfg_valÚkdÚdiagsÚ
sev_markerrä  Úbitsr´  r_   Úar3  r8  ÚplÚrun_tagr”  ÚelapsedÚelr±   s                                  r   rL  rL  S  sg
  € Ý
˜DÑ
!Ô
!€CØ
€{ÝØPÝ”ð	
ñ 	
ô 	
ð 	
ð ˆqÝ	Ô	Ñ	Ô	ð ? ÝŒ{˜4 ¤Ñ.Ô.ˆØð 	ÝÐ1 4¤<Ð1Ð1½¼
ÐCÑCÔCÐCØð	?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?õ
 Ô# D¨$¬,Ñ7Ô7ˆÝ”  d¤lÑ3Ô3ˆÝ”-  d¤lÑ3Ô3ˆÝ”<  d¤lÑ3Ô3ˆÝŒ|˜D $¤,Ð6Ð6°#Ð6Ð6ˆõ Ô*¨4°´Ñ>Ô>ˆð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?õ ˆt�V˜UÑ#Ô#ð %å! $Ñ'Ô'Ø,ØØ ðð à!ðñ ô ðð ð  ðñ ô ðð ð ðñ ô ð%"
ð "
ˆõF 	�dŒj˜¨¸Ð?Ñ?Ô?Ñ@Ô@Ð@Øˆqå	Ð
)�$”'Ð
)Ð
)˜TœZÐ
)Ð
)Ñ*Ô*Ð*Ý	Ð
'˜$œ+Ð
'Ð
'Ñ(Ô(Ð(Ý	Ð
0˜$œ-Ð.¨3Ð
0Ð
0Ñ1Ô1Ð1Ø„{ð -ÝÐ+˜dœkÐ+Ð+Ñ,Ô,Ð,Ý	Ð
/˜$Ô-Ð
/Ð
/Ø*.Ô*=ÐEÐ&�Ô$Ð&Ð&Ð&À2ñGñ Hô Hð HàÔð 2ÝÐ0˜dÔ.Ð0Ð0Ñ1Ô1Ð1Ø„{ð 8ÝÐ6˜dŸiši¨¬Ñ4Ô4Ð6Ð6Ñ7Ô7Ð7ØÔð <Ø<@Ô<RÐZÐ8˜tÔ5Ð8Ð8Ð8Ð8ÐXZˆÝÐ:˜dÔ1Ð:°5Ð:Ð:Ñ;Ô;Ð;ð
 ÔÐ#ÝÐ9 Ô 0Ð9Ð9Ð9Ñ:Ô:Ð:Ð:ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø�+‘-”-ˆCØ—w’w˜x¨Ñ,Ô,Ð2°×7Ò7¸ÑHÔHˆGˆGøÝð 	ð 	ð 	ØˆGˆGˆGð	øøøàÐ¥3 w¡<¤<µ2Ô3KÒ#KÐ#KÝÐP¥C¨¡L¤LÐPÐPÐPÑQÔQÐQÐQåÐH¥BÔ$<ÐHÐHÐHÑIÔIÐIÝ	Ð
P�' $¤/Ñ2Ô2Ð
PÐ
P¸¼Ð8NÈ3Ð
PÐ
PÑQÔQÐQð
 4Ð3Ð3Ð3Ð3Ð3Ø×'Ò'¨¨f°dÑ;Ô;€EØñ 3Ø!&°À5ÐIÐIˆ
ÝÐ0¥# e¡*¤*Ð0Ð0Ð0Ñ1Ô1Ð1Øð 	3ñ 	3ˆAÝÐS˜Ÿš¨¬
°CÑ8Ô8ÐSÐS¸A¼JÐSÐSÈ!Ì'ÐSÐSÑTÔTÐTØŒvð >Ø�ØœFŸLšL™NœNð 0ð 0‘D�A�qÝ! !¥TÑ*Ô*ð 0ØŸš qÐ$HÐ$H¨3¯8ª8Ð3FÐ3FÀAÐ3FÑ3FÔ3FÑ+FÔ+FÐ$HÐ$HÑIÔIÐIÐIàŸš q J J¨1 J JÑ/Ô/Ð/Ð/Øð >ÝÐ<¨%¯*ª*°TÑ*:Ô*:Ð<Ð<Ñ=Ô=Ð=ð ”Yð 3ð 3�Ø”;ð 3ÝÐ1¨¬Ð1Ð1Ñ2Ô2Ð2øñ3ð „ð :ÝÐ8�g d¤oÑ6Ô6Ð8Ð8Ñ9Ô9Ð9ØÔð <ÝÐ:�g dÔ&7Ñ8Ô8Ð:Ð:Ñ;Ô;Ð;Øð 4ÝÐ2˜dŸiši¨Ñ0Ô0Ð2Ð2Ñ3Ô3Ð3Øð 5ÝÐ3˜dŸiši¨Ñ1Ô1Ð3Ð3Ñ4Ô4Ð4Ø„yð Ý‰ŒˆÝˆg‰ŒˆÝˆdŒiÑÔÐØ„{ð 
Ý‰ŒˆÝˆiÑÔÐÝˆdŒkÑÔÐÐØ	ð õ 	‰ŒˆÝÐÑ Ô Ð ÝˆnÑÔÐØð GÝ‰ŒˆÝÐ,�3˜x™=œ=Ð,Ð,Ð,Ñ-Ô-Ð-Øð 	Gð 	GˆAÝÐE� ¤Ñ-Ô-ÐEÐE°´ÐEÐE¸Q¼VÐEÐEÑFÔFÐFÐFØð HÝ‰ŒˆÝÐ(�˜V™œÐ(Ð(Ð(Ñ)Ô)Ð)Ø˜˜˜”ð 	Hð 	HˆAØ$%¤IÐ5��Q”Y���°2ˆBØ./¬hÐ>Ð*˜qœxÐ*Ð*Ð*Ð*¸BˆGÝÐF� ¤Ñ-Ô-ÐFÐF°ÐFÐF¸!¼&ÐFÀ"ÐFÐFÑGÔGÐGÐGØñ DÝ‰ŒˆÝÐ$•s˜4‘y”yÐ$Ð$Ð$Ñ%Ô%Ð%Øð 	Dð 	DˆAð œ*ð/•s˜1˜aœj¨1¬<Ñ7Ñ8Ô8Ð8Ø*.ð à")Ð"5�G����¸8ˆBØ”iÐ7 1¤8Ð7¨xˆGÝð -˜œÐKð -ð - 'ÐKð -ð -°´Ð1A¸cð -ð -ÀRð -ð -Ý˜Qœ\Ñ*Ô*ð-ð -ñ .ô .ð .àŒyð HÝÐF Q¤Y×%9Ò%9Ñ%;Ô%;¸AÔ%>¸tÀ¸tÔ%DÐFÐFÑGÔGÐGØŒwð DÝÐB 1¤7×#5Ò#5Ñ#7Ô#7¸Ô#:¸4¸C¸4Ô#@ÐBÐBÑCÔCÐCøØˆ1s,   ÁAD6ÂBD6Ä6D:Ä=D:Ë);L% Ì%L4Ì3L4c                ó`  — | j                              ¦   «         dv rd n| j         }t          j        ¦   «         5 }t          j        || j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   |s%t          d| j        › �t          j        ¬¦  «         dS t          d| j        › d|pd› �¦  «         dS )	N>   ÚnoneÚnullre   r/  r1  r3  z	Assigned ú to r!   r   )	r´   ræ  rð   r˜  Úassign_taskr°   r:  r;  r<  ©rG   r´   r›  ró  s       r   rM  rM  ÿ  sô   € Ø”l×(Ò(Ñ*Ô*Ð.CÐCÐCˆdˆdÈÌ€GÝ	Ô	Ñ	Ô	ð 9 ÝŒ^˜D $¤,°Ñ8Ô8ˆð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9àð ÝÐ-˜tœ|Ð-Ð-µC´JÐ?Ñ?Ô?Ð?ØˆqÝ	Ð
C�d”lÐ
CÐ
C¨Ð(A°>Ð
CÐ
CÑDÔDÐDØˆ1s   ¸A Á A$Á'A$c                óH  — | j         }|�|                     ¦   «         dv rd }t          | dd ¦  «        }	 t          j        ¦   «         5 }t          j        || j        ||¬¦  «        }d d d ¦  «         n# 1 swxY w Y   n=# t          t          f$ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY w|s%t          d| j        › �t          j        ¬¦  «         dS |r'|r|› d	|› �n|}t          d
| j        › d|› d�¦  «         nt          d| j        › d�¦  «         dS )N>   r   rt  ru  re   Úprovider)rz  r5  r1  r6  r/  r3  ú:zSet model override on rD  z (applies on next dispatch)zCleared model override on z" (worker uses its profile default)r   )r¶   ræ  rM   rð   r˜  Úset_model_overrider°   rB  rp  r:  r;  r<  )rG   r¶   rz  r›  ró  ru  rd  s          r   rN  rN  
  sÙ  € ØŒJ€EØÐ˜UŸ[š[™]œ]Ð.GÐGÐGØˆÝ�t˜Z¨Ñ.Ô.€HðÝÔÑ!Ô!ð 	U TÝÔ& t¨T¬\¸5È8ÐTÑTÔTˆBð	Uð 	Uð 	Uñ 	Uô 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uøøøð 	Uð 	Uð 	Uð 	Uøøå�Ð%ð ð ð ÝÐ˜ÐÐ¥S¤ZÐ0Ñ0Ô0Ð0Øˆqˆqˆqˆqˆqøøøøðøøøð ð ÝÐ-˜tœ|Ð-Ð-µC´JÐ?Ñ?Ô?Ð?ØˆqØð 3Ø)1Ð<�8Ð%Ð%˜eÐ%Ð%Ð%°uˆÝð + t¤|ð +ð +°uð +ð +ð +ñ 	,ô 	,ð 	,ð 	,õ 	ð 2¨4¬<ð 2ð 2ð 2ñ 	3ô 	3ð 	3àˆ1s;   ´A= ÁA1Á%A= Á1A5Á5A= Á8A5Á9A= Á=B7ÂB2Â2B7c           
     ó0  — t          j        ¦   «         5 }t          j        || j        t	          | dd ¦  «        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |s&t          d| j        › d�t          j        ¬¦  «         dS t          d| j        › �¦  «         dS )	NrÏ   )rÏ   zcannot reclaim z (not running or unknown id)r1  r3  z
Reclaimed r   )rð   r˜  Úreclaim_taskr°   rM   r:  r;  r<  rò  s      r   rO  rO  "  sê   € Ý	Ô	Ñ	Ô	ð 
 ÝŒ_Ø�$”,Ý˜4 ¨4Ñ0Ô0ð
ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð
 ð ÝØH˜dœlÐHÐHÐHÝ”ð	
ñ 	
ô 	
ð 	
ð ˆqÝ	Ð
%�t”|Ð
%Ð
%Ñ&Ô&Ð&Øˆ1s   ”,AÁAÁAc                óê  — | j                              ¦   «         dv rd n| j         }t          j        ¦   «         5 }t          j        || j        |t          t          | dd¦  «        ¦  «        t          | dd ¦  «        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |s&t          d| j        › d�t          j
        ¬¦  «         d	S t          d
| j        › d|pd› �t          | dd¦  «        rdndz   ¦  «         dS )N>   rt  ru  re   r·   FrÏ   )Úreclaim_firstrÏ   zcannot reassign uC    (unknown id, or still running â€” pass --reclaim to release first)r1  r3  zReassigned rv  r!   z (claim reclaimed)r   r   )r´   ræ  rð   r˜  Úreassign_taskr°   r   rM   r:  r;  r<  rx  s       r   rP  rP  2  st  € Ø”l×(Ò(Ñ*Ô*Ð.CÐCÐCˆdˆdÈÌ€GÝ	Ô	Ñ	Ô	ð 
 ÝÔØ�$”, Ý�w t¨Y¸Ñ>Ô>Ñ?Ô?Ý˜4 ¨4Ñ0Ô0ð
ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð ð ÝðR˜tœ|ð Rð Rð Rå”ð	
ñ 	
ô 	
ð 	
ð
 ˆqÝ	ð	'�d”lð 	'ð 	'ØÐ$�nð	'ð 	'å#*¨4°¸EÑ#BÔ#BÐJÐÐÈñ	Lñô ð ð
 ˆ1s   ¸A
BÂBÂBc                óø  ‡‡‡— ddl mŠ ddlm} ‰                      |¦   «         ¦  «        }t          j        ¦   «         5 }t          | dd¦  «        rŸt          j        || j	        ¦  «        }|€1t          d| j	        › �t          j        ¬¦  «         	 ddd¦  «         dS | j	        ‰                     |t          j        || j	        ¦  «        t          j        || j	        ¦  «        |¬	¦  «        i}�n�t!          |                     d
¦  «                             ¦   «         ¦  «        }d„ |D ¦   «         }|si }�nGd                     dgt)          |¦  «        z  ¦  «        }d„ |D ¦   «         }	|                     d|› d�t+          |¦  «        ¦  «        D ]1}
|	                     |
d         g ¦  «                             |
¦  «         Œ2d„ |D ¦   «         }|                     d|› d�t+          |¦  «        ¦  «        D ]1}
|                     |
d         g ¦  «                             |
¦  «         Œ2i }|D ]R}|d         }‰                     ||	                     |g ¦  «        |                     |g ¦  «        |¬	¦  «        }|r|||<   ŒSt          | dd¦  «        Š‰rDt!          |                     ¦   «         ¦  «        D ]"}ˆˆfd„||         D ¦   «         }|r|||<   Œ||= Œ#i Š|rƒd                     dgt)          |¦  «        z  ¦  «        }|                     d|› d�t+          |                     ¦   «         ¦  «        ¦  «        D ]#}|d         |d         |d         dœ‰|d         <   Œ$ddd¦  «         n# 1 swxY w Y   t          | dd¦  «        rFˆfd„|                     ¦   «         D ¦   «         }t          t7          j        |d d¬!¦  «        ¦  «         dS |st          d"¦  «         dS d#d$d%d&œ}t;          d'„ |                     ¦   «         D ¦   «         ¦  «        }t          |› d(t)          |¦  «        › d)�¦  «         |                     ¦   «         D �]´\  }}‰                     |i ¦  «        }|                     d¦  «        pd*}|                     d¦  «        pd}|                     d¦  «        pd+}t          d,|› d,|d-›d.|d/›d,|› �¦  «         |D �]$}t          d0|                     |j        d¦  «        › d1|j        › d2|j         › d3|j!        › �¦  «         |j"        r¯g }|j"                             ¦   «         D ]l\  }}tG          |t           ¦  «        r8|                     |› d4d                     d5„ |D ¦   «         ¦  «        › �¦  «         ŒR|                     |› d4|› �¦  «         Œm|r%t          d6d7                     |¦  «        › �¦  «         |j$        D ] }|j%        rt          d8|j&        › �¦  «         Œ!�Œ&t          ¦   «          �Œ¶dS )9z†List active diagnostics on the board. Wraps the same rule engine
    the dashboard uses, so CLI output matches what the UI shows.
    r   rF  rv   r  Nr/  r1  r3  )Úconfigz.SELECT * FROM tasks WHERE status != 'archived'c                ó   — g | ]
}|d          ‘ŒS )r-   r²  r“  s     r   r  z$_cmd_diagnostics.<locals>.<listcomp>f  s   € Ð)Ð)Ð)˜q�1�T”7Ð)Ð)Ð)r   rM  r    c                ó   — i | ]}|g “ŒS r²  r²  ©ri   Úis     r   r•  z$_cmd_diagnostics.<locals>.<dictcomp>k  s   € Ð,Ð,Ð, 1˜˜BÐ,Ð,Ð,r   z,SELECT * FROM task_events WHERE task_id IN (z) ORDER BY idr°   c                ó   — i | ]}|g “ŒS r²  r²  r†  s     r   r•  z$_cmd_diagnostics.<locals>.<dictcomp>q  s   € Ð-Ð-Ð- A˜!˜RÐ-Ð-Ð-r   z*SELECT * FROM task_runs WHERE task_id IN (r-   r`  c                óŠ   •— g | ]?}‰j                              |j        ¦  «        ‰j                              ‰¦  «        k    ¯=|‘Œ@S r²  )ÚSEVERITY_ORDERÚindexr`  )ri   rä  rj  Úsevs     €€r   r  z$_cmd_diagnostics.<locals>.<listcomp>‡  sK   ø€ Ð}Ð}Ð}˜a¸Ô9J×9PÒ9PÐQRÔQ[Ñ9\Ô9\Ð`bÔ`q×`wÒ`wÐx{Ñ`|Ô`|Ò9|Ð9|˜Ð9|Ð9|Ð9|r   z;SELECT id, title, status, assignee FROM tasks WHERE id IN (rÙ   r.   r*   r+   )r.   r*   r+   rÔ   Fc                óf   •— g | ]-\  }}d |i‰                      |i ¦  «        ¥dd„ |D ¦   «         i¥‘Œ.S )r°   r¹   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r²  )Úto_dict)ri   rä  s     r   r  z/_cmd_diagnostics.<locals>.<listcomp>.<listcomp>Ÿ  s    € Ð8Ð8Ð8° §	¢	¡¤Ð8Ð8Ð8r   )r)   )ri   ÚtidÚdlrÌ  s      €r   r  z$_cmd_diagnostics.<locals>.<listcomp>›  sl   ø€ ð 
ð 
ð 
ñ ��Rð	 ˜3ðà—(’(˜3 Ñ#Ô#ðð Ð8Ð8°RÐ8Ñ8Ô8ðð ð
ð 
ð 
r   r6  r¥  z$No active diagnostics on this board.rH  rI  rJ  r»   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rg   )rY   )ri   r‘  s     r   rk   z#_cmd_diagnostics.<locals>.<genexpr>­  s(   è è € Ð9Ð9˜B•�B‘”Ð9Ð9Ð9Ð9Ð9Ð9r   z active diagnostic(s) across z
 task(s):
z
(untitled)r!   r%   r&   z  @Ú18srK  r"   rL  rD  r±  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rg   rO  rP  s     r   rk   z#_cmd_diagnostics.<locals>.<genexpr>¿  rR  r   rS  rT  rU  )'r^  rG  r~   rw   Úconfig_from_runtime_configrð   r˜  rM   r  r  r:  r;  r<  r_  rZ  r]  rE   r™  rš  r»  rY   r
  Ú
setdefaultr¤   r)   rö   r¼  rÔ   rº  r¸  r¹  r`  ra   r.   rû  ra  rb  rc  rd  )rG   rw   Údiag_configr›  r  Údiags_by_taskrœ  ÚidsÚplaceholdersÚev_byÚrowÚrun_byr”  r�  r‘  ÚkeptÚout_jsonrl  r¤  râ  r.   r*   r+   rä  rm  r´  r_   rn  rj  rÌ  rŒ  s                               @@@r   rQ  rQ  I  s  øøø€ ð 4Ð3Ð3Ð3Ð3Ð3Ø-Ð-Ð-Ð-Ð-Ð-à×/Ò/°°±´Ñ>Ô>€Kå	Ô	Ñ	Ô	ð F å�4˜ Ñ&Ô&ð -	0Ý”;˜t T¤YÑ/Ô/ˆDØˆ|ÝÐ2 t¤yÐ2Ð2½¼ÐDÑDÔDÐDØðFð Fð Fñ Fô Fð Fð Fð Fð ”	˜2×6Ò6ØÝ”N 4¨¬Ñ3Ô3Ý”L  t¤yÑ1Ô1Ø&ð	 7ñ ô ðˆM‰Mõ ˜ŸšØ@ñô çŠh‰jŒjñô ˆDð *Ð) DÐ)Ñ)Ô)ˆCØð 0Ø "�‘à"Ÿxšx¨¨µ°C±´Ñ(8Ñ9Ô9�Ø,Ð,¨Ð,Ñ,Ô,�ØŸ<š<Ø^À<Ð^Ð^Ð^Ý˜#‘J”Jñô ð Eð E�Cð ×$Ò$ S¨¤^°RÑ8Ô8×?Ò?ÀÑDÔDÐDÐDØ-Ð-¨Ð-Ñ-Ô-�ØŸ<š<Ø\ÀÐ\Ð\Ð\Ý˜#‘J”Jñô ð Fð F�Cð ×%Ò% c¨)¤n°bÑ9Ô9×@Ò@ÀÑEÔEÐEÐEØ "�Øð 	0ð 	0�AØ˜Dœ'�CØ×4Ò4ØØŸ	š	 # rÑ*Ô*ØŸ
š
 3¨Ñ+Ô+Ø*ð	 5ñ ô �Bð ð 0Ø-/˜ cÑ*øõ �d˜J¨Ñ-Ô-ˆØð 	+Ý˜M×.Ò.Ñ0Ô0Ñ1Ô1ð +ð +�Ø}Ð}Ð}Ð}Ð} =°Ô#5Ð}Ñ}Ô}�Øð +Ø)-�M #Ñ&Ð&à% cÐ*Ð*ð !#ˆØð 		ØŸ8š8 S E­C°Ñ,>Ô,>Ñ$>Ñ?Ô?ˆLØ—\’\Ø]ÈlÐ]Ð]Ð]Ý�m×(Ò(Ñ*Ô*Ñ+Ô+ñô ð ð �ð
 ˜wœZ°1°X´;Ø ! *¤ð!ð !��Q�t”W‘�ðGFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð FõP ˆt�V˜UÑ#Ô#ð 
ð
ð 
ð 
ð 
ð )×.Ò.Ñ0Ô0ð
ñ 
ô 
ˆõ 	�dŒj˜¨!¸%Ð@Ñ@Ô@ÑAÔAÐAØˆqàð ÝÐ4Ñ5Ô5Ð5Øˆqð #¨T¸uÐEÐE€JÝÐ9Ð9 -×"6Ò"6Ñ"8Ô"8Ð9Ñ9Ô9Ñ9Ô9€EÝ	Øð 	+ð 	+Ýˆ}ÑÔð	+ð 	+ð 	+ñô ð ð !×&Ò&Ñ(Ô(ð ñ ‰ˆˆRØ�HŠH�S˜"ÑÔˆØ—’�g‘”Ð. ,ˆØ—’�x‘”Ð' CˆØ—5’5˜Ñ$Ô$Ð6¨ˆÝÐ?�3Ð?Ð?˜&Ð?Ð?Ð?¨Ð?Ð?Ð?¸Ð?Ð?Ñ@Ô@Ð@Øð 	3ñ 	3ˆAÝÐ]˜Ÿš¨¬
°CÑ8Ô8Ð]Ð]¸A¼JÐ]Ð]È!Ì&Ð]Ð]ÐTUÔT[Ð]Ð]Ñ^Ô^Ð^ØŒvð 	>à�ØœFŸLšL™NœNð 0ð 0‘D�A�qÝ! !¥TÑ*Ô*ð 0ØŸš qÐ$HÐ$H¨3¯8ª8Ð3FÐ3FÀAÐ3FÑ3FÔ3FÑ+FÔ+FÐ$HÐ$HÑIÔIÐIÐIàŸš q J J¨1 J JÑ/Ô/Ð/Ð/Øð >ÝÐ<¨%¯*ª*°TÑ*:Ô*:Ð<Ð<Ñ=Ô=Ð=à”Yð 3ð 3�Ø”;ð 3ÝÐ1¨¬Ð1Ð1Ñ2Ô2Ð2øñ3õ 	‰Œˆ‰Øˆ1s   Á AM(ÂJ=M(Í(M,Í/M,c                óÚ   — t          j        ¦   «         5 }t          j        || j        | j        ¦  «         d d d ¦  «         n# 1 swxY w Y   t          d| j        › d| j        › �¦  «         dS )NzLinked ú -> r   )rð   r˜  Ú
link_tasksrÀ   rÁ   r:  ©rG   r›  s     r   rR  rR  Ì  s£   € Ý	Ô	Ñ	Ô	ð ; Ý
Œ�d˜DœN¨D¬MÑ:Ô:Ð:ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;å	Ð
7�D”NÐ
7Ð
7¨¬Ð
7Ð
7Ñ8Ô8Ð8Øˆ1ó   ”!AÁAÁAc                ó8  — t          j        ¦   «         5 }t          j        || j        | j        ¦  «        }d d d ¦  «         n# 1 swxY w Y   |s-t          d| j        › d| j        › �t          j        ¬¦  «         dS t          d| j        › d| j        › �¦  «         dS )NzNo such link: r¡  r1  r3  z	Unlinked r   )rð   r˜  Úunlink_tasksrÀ   rÁ   r:  r;  r<  rò  s      r   rS  rS  Ó  sé   € Ý	Ô	Ñ	Ô	ð B ÝŒ_˜T 4¤>°4´=ÑAÔAˆðBð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bàð ÝÐB˜tœ~ÐBÐB°4´=ÐBÐBÍÌÐTÑTÔTÐTØˆqÝ	Ð
9�d”nÐ
9Ð
9¨$¬-Ð
9Ð
9Ñ:Ô:Ð:Øˆ1r¤  c           	     óŒ  — t          j        ¦   «         5 }t          j        || j        | j        ¬¦  «        }|€�t          j        || j        ¦  «        }|€1t          d| j        › �t          j        ¬¦  «         	 d d d ¦  «         dS t          d| j        › d|j	        › d|j
        pd› �t          j        ¬¦  «         	 d d d ¦  «         dS t          j        |¦  «        }t          j        ||j        t          |¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   t          d	|j        › �¦  «         t          d
|› �¦  «         dS )N)Úttl_secondsr/  r1  r3  zcannot claim z	: status=z lock=z(none)zClaimed zWorkspace: r   )rð   r˜  Ú
claim_taskr°   Úttlr  r:  r;  r<  r*   Ú
claim_lockÚresolve_workspaceÚset_workspace_pathr-   r   )rG   r›  r  Úexistingr  s        r   rT  rT  Ý  sÍ  € Ý	Ô	Ñ	Ô	ð = ÝŒ}˜T 4¤<¸T¼XÐFÑFÔFˆØˆ<å”{ 4¨¬Ñ6Ô6ˆHØÐÝÐ5 t¤|Ð5Ð5½C¼JÐGÑGÔGÐGØð=ð =ð =ñ =ô =ð =ð =ð =õ ð: ¤ð :ð :°x´ð :ð :Ø Ô+Ð7¨xð:ð :å”Zðñ ô ð ð
 ð=ð =ð =ñ =ô =ð =ð =ð =õ Ô(¨Ñ.Ô.ˆ	Ý
Ô˜d D¤G­S°©^¬^Ñ<Ô<Ð<ð=ð =ð =ñ =ô =ð =ð =ð =ð =ð =ð =øøøð =ð =ð =ð =õ  
Ð
�T”WÐ
Ð
ÑÔÐÝ	Ð
#˜	Ð
#Ð
#Ñ$Ô$Ð$Øˆ1s   ”A$DÂ6DÃ<DÄDÄDc           	     ól  — d                      | j        ¦  «                             ¦   «         }| j        ��| j        dk     rt	          dt
          j        ¬¦  «         dS t          |¦  «        | j        k    rMd| j        › d�}|d t          d| j        t          |¦  «        z
  ¦  «        …          	                    ¦   «         |z   }| j
        pt          ¦   «         }t          j        ¦   «         5 }t          j        || j        ||¦  «         d d d ¦  «         n# 1 swxY w Y   t	          d	| j        › �¦  «         dS )
Nr$   r3  z"kanban: --max-len must be positiver1  r6  z

[trimmed to z chars by --max-len]r   zComment added to )r»  rÅ   rW   Úmax_lenr:  r;  r<  rY   re  Úrstripr2  r€  rð   r˜  Úadd_commentr°   )rG   r3   Úsuffixr2  r›  s        r   rU  rU  ó  sW  € Ø�8Š8�D”IÑÔ×$Ò$Ñ&Ô&€DØ„|ÐØŒ<˜!ÒÐÝÐ6½S¼ZÐHÑHÔHÐHØ�1Ýˆt‰9Œ9�t”|Ò#Ð#ØJ¨¬ÐJÐJÐJˆFØÐ<�#˜a ¤µ°F±´Ñ!;Ñ<Ô<Ð<Ô=×DÒDÑFÔFÈÑOˆDØŒ[Ð-�OÑ-Ô-€FÝ	Ô	Ñ	Ô	ð 9 Ý
Œ�t˜Tœ\¨6°4Ñ8Ô8Ð8ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9å	Ð
,˜dœlÐ
,Ð
,Ñ-Ô-Ð-Øˆ1s   Ã)DÄDÄDc                óÞ  — ddl }t          | j        ¦  «                             ¦   «         }|                     ¦   «         s t          d|› �t          j        ¬¦  «         dS |                     ¦   «         }| j	        p|j	        }| j
        p|                     |¦  «        d         }| j        pt          ¦   «         }	 t          j        ¦   «         5 }t          j        || j        ||||¬¦  «        }ddd¦  «         n# 1 swxY w Y   n;# t          j        $ r)}	t          d|	› �t          j        ¬¦  «         Y d}	~	dS d}	~	ww xY wt          d|› d	| j        › d
|› dt'          |¦  «        › d�	¦  «         dS )aD  Attach a local file to a task.

    Reads the file off disk, writes it under the task's attachments dir,
    and records the metadata row via the shared ``store_attachment_bytes``
    path (same code the dashboard upload and the agent tool use), so the
    25 MB cap and name-sanitisation behave identically everywhere.
    r   Nzkanban: no such file: r1  r3  )Úcontent_typeÚuploaded_byr5  z	Attached rv  z (attachment r®  z bytes))Ú	mimetypesr   r]   r^   Úis_filer:  r;  r<  Ú
read_bytesr¡   rµ  Ú
guess_typer2  r€  rð   r˜  Ústore_attachment_bytesr°   ÚAttachmentTooLargerY   )
rG   r·  Úsrcrû  r¡   rµ  r¶  r›  Úatt_idru  s
             r   rV  rV    sÍ  € ð ÐÐÐå
ˆtŒy‰/Œ/×
$Ò
$Ñ
&Ô
&€CØ�;Š;‰=Œ=ð ÝÐ, sÐ,Ð,µ3´:Ð>Ñ>Ô>Ð>ØˆqØ�>Š>ÑÔ€DØŒ9Ð ˜œ€DØÔ$ÐE¨	×(<Ò(<¸TÑ(BÔ(BÀ1Ô(E€LØ”+Ð2¥Ñ!2Ô!2€KðÝÔÑ!Ô!ð 	 TÝÔ.ØØ”ØØØ)Ø'ðñ ô ˆFð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ Ô ð ð ð ÝÐ˜ÐÐ¥S¤ZÐ0Ñ0Ô0Ð0Øˆqˆqˆqˆqˆqøøøøðøøøõ 
Ð
W�dÐ
WÐ
W ¤Ð
WÐ
W¸6Ð
WÐ
WÅSÈÁYÄYÐ
WÐ
WÐ
WÑXÔXÐXØˆ1s<   Â9D Ã C8Ã,D Ã8C<Ã<D Ã?C<Ä D ÄD<ÄD7Ä7D<c                óÀ  — t          j        ¦   «         5 }t          j        || j        ¦  «        €1t	          d| j        › �t
          j        ¬¦  «         	 ddd¦  «         dS t          j        || j        ¦  «        }ddd¦  «         n# 1 swxY w Y   t          | dd¦  «        r/t	          t          j
        d„ |D ¦   «         d¬	¦  «        ¦  «         d
S |st	          d| j        › �¦  «         d
S t	          d| j        › d�¦  «         |D ]W}|j        pd}t	          d|j        › d|j        › d|j        › d|› d|j        pd› d�¦  «         t	          d|j        › �¦  «         ŒXd
S )zList a task's attachments.Nr/  r1  r3  rÔ   Fc           
     óh   — g | ]/}|j         |j        |j        |j        |j        |j        |j        d œ‘Œ0S )©r-   Úfilenamerµ  Úsizer¶  Ústored_pathr:   rÁ  )ri   rn  s     r   r  z$_cmd_attachments.<locals>.<listcomp>.  sT   € ð 
ð 
ð 
ð ð ”dØœJØ !¤ØœØ œ}Ø œ}Øœlðð ð
ð 
ð 
r   r6  ©r¦  r   zNo attachments on zAttachments on r{  re   rV  rL  r  z bytes, z, by rÙ   z        )rð   r˜  r  r°   r:  r;  r<  Úlist_attachmentsrM   rÔ   rº  rµ  r-   rÂ  rÃ  r¶  rÄ  )rG   r›  Úattsrn  Úcts        r   rW  rW  &  s  € å	Ô	Ñ	Ô	ð 7 ÝŒ;�t˜Tœ\Ñ*Ô*Ð2ÝÐ1 4¤<Ð1Ð1½¼
ÐCÑCÔCÐCØð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7õ Ô" 4¨¬Ñ6Ô6ˆð	7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7õ
 ˆt�V˜UÑ#Ô#ð Ý�dŒjð 
ð 
ð ð
ñ 
ô 
ð ðñ ô ñ 	ô 	ð 	ð ˆqØð ÝÐ1 4¤<Ð1Ð1Ñ2Ô2Ð2ØˆqÝ	Ð
+˜DœLÐ
+Ð
+Ð
+Ñ,Ô,Ð,Øð *ð *ˆØŒ^Ð"˜sˆÝÐ[�A”DÐ[Ð[˜AœJÐ[Ð[¨1¬6Ð[Ð[¸2Ð[Ð[ÀAÄMÐDXÐUXÐ[Ð[Ð[Ñ\Ô\Ð\ÝÐ(˜œÐ(Ð(Ñ)Ô)Ð)Ð)Øˆ1s   ”?BÁ BÂB
ÂB
c                ó,  — t          j        ¦   «         5 }t          j        || j        ¦  «        }ddd¦  «         n# 1 swxY w Y   |€%t	          d| j        › �t
          j        ¬¦  «         dS t	          d| j        › d|j        › d|j        › �¦  «         dS )	zBDelete an attachment by id (removes the row and the on-disk blob).Nzno such attachment: r1  r3  zDeleted attachment rÖ  z) from r   )	rð   r˜  Údelete_attachmentrÊ   r:  r;  r<  rÂ  r°   )rG   r›  Úremoveds      r   rX  rX  F  sç   € å	Ô	Ñ	Ô	ð A ÝÔ& t¨TÔ-?Ñ@Ô@ˆðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Aà€ÝÐ9 TÔ%7Ð9Ð9ÅÄ
ÐKÑKÔKÐKØˆqÝ	Ð
` Ô 2Ð
`Ð
`°gÔ6FÐ
`Ð
`ÈwÌÐ
`Ð
`ÑaÔaÐaØˆ1ó   ”;»?Á?r°   c                óÔ   — t           j                             d¦  «        | k    rd S t           j                             d¦  «        }|sd S 	 t          |¦  «        S # t          $ r Y d S w xY w)NÚHERMES_KANBAN_TASKÚHERMES_KANBAN_RUN_ID)r\   r}  r)   rï   rB  )r°   r  s     r   rñ  rñ  Q  st   € Ý	„z‡~‚~Ð*Ñ+Ô+¨wÒ6Ð6ØˆtÝ
Œ*�.Š.Ð/Ñ
0Ô
0€CØð ØˆtðÝ�3‰xŒxˆøÝð ð ð Øˆtˆtðøøøs   Á
A Á
A'Á&A'c                óþ  — t          | j        pg ¦  «        }|st          dt          j        ¬¦  «         dS t          | dd¦  «        }t          | dd¦  «        }t          |¦  «        dk    r!|s|rt          dt          j        ¬¦  «         dS d}|r|	 t          j        |¦  «        }t          |t          ¦  «        st          d	¦  «        ‚nB# t          t          j        f$ r)}t          d
|› �t          j        ¬¦  «         Y d}~dS d}~ww xY wg }t          j        ¦   «         5 }|D �]»}t          j        ||¦  «        }	|	�r,|	j        �r$d}
	 ddlm}  |d¦  «        \  }}|duot'          |¦  «        }
n# t(          $ r Y nw xY w|
rçddlm} d}d}	  ||	j        › d|	j        pd› �                     ¦   «         |p| j        pd                     ¦   «         ¬¦  «        \  }}}}}nK# t(          $ r>}ddl}|                     t:          ¦  «                             d|d¬¦  «         Y d}~nd}~ww xY w|dk    r9t          d|› d|› d�t          j        ¬¦  «         |                     |¦  «         �ŒGt          j         ||| j        ||tC          |¦  «        ¬¦  «        s6|                     |¦  «         t          d|› d�t          j        ¬¦  «         �Œ©t          d|› �¦  «         �Œ½	 ddd¦  «         n# 1 swxY w Y   |sdndS )z<Mark one or more tasks done. Supports a single id or a list.ú at least one task_id is requiredr1  r3  r<  Nr=  zÁkanban: --summary / --metadata are per-task and can't be used with multiple ids (would apply the same handoff to every task). Complete tasks one at a time, or drop the flags for the bulk close.r6  úmust be a JSON objectúkanban: --metadata: Fr   )Úget_text_auxiliary_clientÚ
goal_judge)Ú
judge_goalr   r   z

)r¬   Úlast_responsez0goal judge check failed, allowing completion: %sT)Úexc_infozkanban: goal completion of z rejected by judge: z;. Provide evidence matching the task's acceptance criteria.)r=   r<  r=  rï  zcannot complete z (unknown id or terminal state)z
Completed )"rE   rÌ   r:  r;  r<  rM   rY   rÔ   Úloadsra  ÚdictrB  ÚJSONDecodeErrorrð   r˜  r  r¨   Úagent.auxiliary_clientrÔ  r   r{   Úhermes_cli.goalsrÖ  r.   r3   rW   r=   ÚloggingÚ	getLoggerÚ__name__r¼   r¤   Úcomplete_taskrñ  )rG   r™  r<  Úraw_metar=  ru  Úfailedr›  r�  r  Újudge_availablerÔ  Ú_clientÚ_modelrÖ  ÚverdictrÏ   Ú_Ú	judge_excÚ_loggings                       r   rY  rY  ]  sL  € å
ˆtŒ}Ð" Ñ
#Ô
#€CØð ÝÐ0µs´zÐBÑBÔBÐBØˆqÝ�d˜I tÑ,Ô,€GÝ�t˜Z¨Ñ.Ô.€Hõ ˆ3�x„x�!‚|€|˜€| H€|ÝðRõ ”ð		
ñ 	
ô 	
ð 	
ð ˆqØ€HØð ð	Ý”z (Ñ+Ô+ˆHÝ˜h­Ñ-Ô-ð :Ý Ð!8Ñ9Ô9Ð9ð:øå�DÔ0Ð1ð 	ð 	ð 	ÝÐ.¨Ð.Ð.µS´ZÐ@Ñ@Ô@Ð@Ø�1�1�1�1�1øøøøð	øøøð €FÝ	Ô	Ñ	Ô	ð 8* Øð 7	*ñ 7	*ˆCõ ”;˜t SÑ)Ô)ˆDØñ $!˜œñ $!Ø"'�ðØPÐPÐPÐPÐPÐPØ&?Ð&?ÀÑ&MÔ&M‘O�G˜VØ&-°TÐ&9Ð&J½dÀ6¹l¼l�O�OøÝ ð ð ð Ø�Dðøøøà"ð !Ø;Ð;Ð;Ð;Ð;Ð;Ø$�GØ�Fðð 4>°:Ø$(¤JÐ!EÐ!E°D´I°OÀÐ!EÐ!E×!KÒ!KÑ!MÔ!MØ+2Ð+G°d´kÐ+GÀR×*NÒ*NÑ*PÔ*Pð4ñ 4ô 4Ñ0˜ ¨¨A¨q¨qøõ %ð ð ð Ø2Ð2Ð2Ð2Ø ×*Ò*­8Ñ4Ô4×<Ò<ØNØ%Ø%)ð =ñ ô ð ð ð ð ð ð øøøøðøøøð  &Ò(Ð(ÝðY¸#ð Yð YÐSYð Yð Yð Yå!$¤ðñ ô ð ð
 Ÿš cÑ*Ô*Ð*Ù åÔ#Ø�cØ”{ØØ!Ý 2°3Ñ 7Ô 7ðñ ô ð 
*ð —’˜cÑ"Ô"Ð"ÝÐM¨ÐMÐMÐMÕTWÔT^Ð_Ñ_Ô_Ð_Ñ_åÐ( 3Ð(Ð(Ñ)Ô)Ð)Ñ)ðo7	*ð8*ð 8*ð 8*ñ 8*ô 8*ð 8*ð 8*ð 8*ð 8*ð 8*ð 8*øøøð 8*ð 8*ð 8*ð 8*ðr Ð!ˆ1ˆ1 Ð!sz   Â8C
 Ã
D	Ã DÄD	Ä!(K.Å
'E2Å1K.Å2
E?Å<K.Å>E?Å?K.ÆAG!Ç K.Ç!
H)Ç+4H$ÈK.È$H)È)B8K.Ë.K2Ë5K2c                óv  — t          | dd ¦  «        }d }|r|	 t          j        |¦  «        }t          |t          ¦  «        st          d¦  «        ‚nB# t
          t          j        f$ r)}t          d|› �t          j	        ¬¦  «         Y d }~dS d }~ww xY wt          j        ¦   «         5 }t          j        || j        | j        t          | dd ¦  «        |¬¦  «        s2t          d| j        › d	�t          j	        ¬¦  «         	 d d d ¦  «         d
S 	 d d d ¦  «         n# 1 swxY w Y   t          d| j        › �¦  «         dS )Nr=  rÒ  rÓ  r1  r6  r<  )r=   r<  r=  zcannot edit z! (unknown id or task is not done)r3  zEdited r   )rM   rÔ   rÙ  ra  rÚ  rB  rÛ  r:  r;  r<  rð   r˜  Úedit_completed_task_resultr°   r=   )rG   râ  r=  ru  r›  s        r   rZ  rZ  ¶  sÈ  € Ý�t˜Z¨Ñ.Ô.€HØ€HØð ð	Ý”z (Ñ+Ô+ˆHÝ˜h­Ñ-Ô-ð :Ý Ð!8Ñ9Ô9Ð9ð:øå�DÔ0Ð1ð 	ð 	ð 	ÝÐ.¨Ð.Ð.µS´ZÐ@Ñ@Ô@Ð@Ø�1�1�1�1�1øøøøð	øøøõ 
Ô	Ñ	Ô	ð  ÝÔ,ØØŒLØ”;Ý˜D )¨TÑ2Ô2Øð
ñ 
ô 
ð 	õ ØN˜tœ|ÐNÐNÐNÝ”Zðñ ô ð ð ðð ð ñ ô ð ð ð ð	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ 
Ð
"�D”LÐ
"Ð
"Ñ#Ô#Ð#Øˆ1s*   —8A ÁBÁ&B
Â
BÂ%ADÄDÄDc                ó@  — | j         r,d                     | j         ¦  «                             ¦   «         nd }t          | dd ¦  «        }t	          ¦   «         }| j        gt          t          | dd ¦  «        pg ¦  «        z   }g }t          j        ¦   «         5 }|D ]ë}|rt          j	        |||d|› �¦  «         t          j
        ||||t          |¦  «        ¬¦  «        s4|                     |¦  «         t          d|› �t          j        ¬¦  «         Œxt          j        ||¦  «        }|r|j        nd}	|rd	|› �nd
}
|	dk    rt          |› d|
› �¦  «         Œ¼|	dk    rt          |› d|
› �¦  «         Œ×t          d|› |
› �¦  «         Œì	 d d d ¦  «         n# 1 swxY w Y   |sdndS )Nr$   ra   r™  z	BLOCKED: )rÏ   ra   rï  zcannot block r1  r   rD  r   r
   u    â†’ todo (dependency wait)r  u>    â†’ triage (unblock loop detected â€” needs a human decision)zBlocked r   r3  )rÏ   r»  rW   rM   r€  r°   rE   rð   r˜  r²  Ú
block_taskrñ  r¤   r:  r;  r<  r  r*   )rG   rÏ   ra   r2  r™  rã  r›  r�  ÚlandedÚwherer³  s              r   r[  r[  Ò  sD  € Ø.2¬kÐCˆS�XŠX�d”kÑ"Ô"×(Ò(Ñ*Ô*Ð*¸t€FÝ�4˜ Ñ&Ô&€DÝÑÔ€FØŒ<ˆ.�4¥¨¨e°TÑ :Ô :Ð @¸bÑAÔAÑ
A€CØ€FÝ	Ô	Ñ	Ô	ð 4 Øð 	4ð 	4ˆCØð HÝ”˜t S¨&Ð2F¸fÐ2FÐ2FÑGÔGÐGÝ”=ØØØØÝ 2°3Ñ 7Ô 7ðñ ô ð 4ð —’˜cÑ"Ô"Ð"ÝÐ+ cÐ+Ð+µ#´*Ð=Ñ=Ô=Ð=Ð=õ œ T¨3Ñ/Ô/�Ø)/Ð>˜œ˜°Y�Ø*0Ð8˜˜f˜˜˜°b�Ø˜F’?�?Ý˜SÐEÐE¸VÐEÐEÑFÔFÐFÐFØ˜hÒ&Ð&ÝØð 3ð 3Ø*0ð3ð 3ñô ð ð õ
 Ð2 SÐ2¨&Ð2Ð2Ñ3Ô3Ð3Ð3ð5	4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð8 Ð!ˆ1ˆ1 Ð!s   ÂC/FÆFÆFc           
     ón  — | j         r,d                     | j         ¦  «                             ¦   «         nd }t          ¦   «         }| j        gt          t          | dd ¦  «        pg ¦  «        z   }g }t          j        ¦   «         5 }|D ]“}|rt          j	        |||d|› �¦  «         t          j
        |||t          |¦  «        ¬¦  «        s4|                     |¦  «         t          d|› �t          j        ¬¦  «         Œwt          d|› �|rd|› �nd	z   ¦  «         Œ”	 d d d ¦  «         n# 1 swxY w Y   |sd
ndS )Nr$   r™  zSCHEDULED: )rÏ   rï  zcannot schedule r1  z
Scheduled rD  r   r   r3  )rÏ   r»  rW   r€  r°   rE   rM   rð   r˜  r²  Úschedule_taskrñ  r¤   r:  r;  r<  )rG   rÏ   r2  r™  rã  r›  r�  s          r   r\  r\  ÷  s·  € Ø.2¬kÐCˆS�XŠX�d”kÑ"Ô"×(Ò(Ñ*Ô*Ð*¸t€FÝÑÔ€FØŒ<ˆ.�4¥¨¨e°TÑ :Ô :Ð @¸bÑAÔAÑ
A€CØ€FÝ	Ô	Ñ	Ô	ð N Øð 	Nð 	NˆCØð JÝ”˜t S¨&Ð2HÀÐ2HÐ2HÑIÔIÐIÝÔ#ØØØÝ 2°3Ñ 7Ô 7ð	ñ ô ð 	Nð —’˜cÑ"Ô"Ð"ÝÐ.¨Ð.Ð.µS´ZÐ@Ñ@Ô@Ð@Ð@åÐ( 3Ð(Ð(¸VÐ,K¨M°¨M¨M¨MÈÑLÑMÔMÐMÐMð	NðNð Nð Nñ Nô Nð Nð Nð Nð Nð Nð Nøøøð Nð Nð Nð Nð Ð!ˆ1ˆ1 Ð!s   ÂBD&Ä&D*Ä-D*c           	     óX  — t          | j        pg ¦  «        }|st          dt          j        ¬¦  «         dS t          | dd ¦  «        }|�|                     ¦   «         pd }|rt          ¦   «         nd }g }t          j	        ¦   «         5 }|D ]„}|rt          j
        |||d|› �¦  «         t          j        ||¦  «        s5|                     |¦  «         t          d|› d�t          j        ¬¦  «         Œht          d|› �|rd	|› �nd
z   ¦  «         Œ…	 d d d ¦  «         n# 1 swxY w Y   |sdndS )NrÑ  r1  r3  rÏ   z	UNBLOCK: zcannot unblock z (not blocked/scheduled?)z
Unblocked rD  r   r   )rE   rÌ   r:  r;  r<  rM   rW   r€  rð   r˜  r²  Úunblock_taskr¤   )rG   r™  rÏ   r2  rã  r›  r�  s          r   r]  r]  	  s¶  € Ý
ˆtŒ}Ð" Ñ
#Ô
#€CØð ÝÐ0µs´zÐBÑBÔBÐBØˆqÝ�T˜8 TÑ*Ô*€FØÐØ—’‘”Ð' 4ˆØ"(Ð2�_ÑÔÐ¨d€FØ€FÝ	Ô	Ñ	Ô	ð N Øð 	Nð 	NˆCØð HÝ”˜t S¨&Ð2F¸fÐ2FÐ2FÑGÔGÐGÝ”? 4¨Ñ-Ô-ð NØ—’˜cÑ"Ô"Ð"ÝÐF¨ÐFÐFÐFÍSÌZÐXÑXÔXÐXÐXåÐ( 3Ð(Ð(¸VÐ,K¨M°¨M¨M¨MÈÑLÑMÔMÐMÐMð	NðNð Nð Nñ Nô Nð Nð Nð Nð Nð Nð Nøøøð Nð Nð Nð Nð Ð!ˆ1ˆ1 Ð!s   ÂBDÄDÄ"Dc                ó�  — | j         r,d                     | j         ¦  «                             ¦   «         nd }t          ¦   «         }t	          | dd¦  «        }t          t	          | dd ¦  «        pg ¦  «        }g }t          ¦   «         }| j        g|¢D ]0}||vr*|                     |¦  «         | 	                    |¦  «         Œ1g }t          j        ¦   «         5 }	|D ]ƒ}t          j        |	|||t          | j        ¦  «        t          | j        ¦  «        ¬¦  «        \  }
}|                     ||
t          | j        ¦  «        t          | j        ¦  «        ||dœ¦  «         Œ„	 d d d ¦  «         n# 1 swxY w Y   d„ |D ¦   «         }|rGt!          |¦  «        dk    r|d	         n|}t#          t%          j        |d
d¬¦  «        ¦  «         |sd	ndS | j        rdnd}| j        rdnd}|D ]`}|d         r)|rd|› �nd}t#          |› d|d         › d|› |› �¦  «         Œ3t#          d|d         › d|d         › �t(          j        ¬¦  «         Œa|sd	ndS )Nr$   rÔ   Fr™  )ÚactorrÏ   ÚforceÚdry_run)r°   Úpromotedrø  ÚforcedrÏ   r½   c                ó"   — g | ]}|d          °
|‘ŒS )rù  r²  r“  s     r   r  z _cmd_promote.<locals>.<listcomp>D	  s!   € Ð6Ð6Ð6�A¨¨*¬Ð6ˆaÐ6Ð6Ð6r   r3  r   r6  r¥  ú (dry)r   zWould promoteÚPromotedrù  rD  r°   z	 -> readyzcannot promote r½   r1  )rÏ   r»  rW   r€  rM   rE   Úsetr°   r¤   Úaddrð   r˜  Úpromote_taskr   r÷  rø  rY   r:  rÔ   rº  r;  r<  )rG   rÏ   r2  Úas_jsonÚ	extra_idsr™  Úseenr�  Úresultsr›  ró  Úerrrã  r6  Útagrd  r”  r³  s                     r   r^  r^  #	  sç  € Ø.2¬kÐCˆS�XŠX�d”kÑ"Ô"×(Ò(Ñ*Ô*Ð*¸t€FÝÑÔ€FÝ�d˜F EÑ*Ô*€GÝ•W˜T 5¨$Ñ/Ô/Ð5°2Ñ6Ô6€Ià€CÝ‘U”U€DØ”Ð)˜yÐ)ð ð ˆØ�dˆ?ˆ?Ø�JŠJ�s‰OŒOˆOØ�HŠH�S‰MŒMˆMøà')€GÝ	Ô	Ñ	Ô	ð  Øð 	ð 	ˆCÝ”oØØØØÝ˜4œ:Ñ&Ô&Ý˜Tœ\Ñ*Ô*ðñ ô ‰GˆB�ð �NŠNØØÝ ¤Ñ-Ô-Ý˜tœzÑ*Ô*Ø Øðð ñ ô ð ð ð	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð& 7Ð6˜Ð6Ñ6Ô6€FØð &å(+¨G©¬¸Ò(9Ð(9˜' !œ*˜*¸wˆÝ�dŒj˜¨¸Ð?Ñ?Ô?Ñ@Ô@Ð@ØÐ%ˆqˆq AÐ%à”lÐ
*ˆ(ˆ(¨€CØ#œ|Ð;ˆOˆO°€EØð Sð SˆØˆZŒ=ð 	SØ&,Ð4�]˜&�]�]�]°"ˆFÝ�UÐAÐA˜Q˜yœ\ÐAÐA°CÐA¸ÐAÐAÑBÔBÐBÐBåÐ@ A i¤LÐ@Ð@°A°g´JÐ@Ð@ÅsÄzÐRÑRÔRÐRÐRØÐ!ˆ1ˆ1 Ð!s   ÃBE)Å)E-Å0E-c                ó  — t          | j        pg ¦  «        }t          t          | dd ¦  «        pg ¦  «        }|r|rt          dt          j        ¬¦  «         dS |s|st          dt          j        ¬¦  «         dS g }t          j        ¦   «         5 }|rs|D ]^}t          j        ||¦  «        s5| 	                    |¦  «         t          d|› d�t          j        ¬¦  «         ŒLt          d|› �¦  «         Œ_|sd	ndcd d d ¦  «         S |D ]]}t          j
        ||¦  «        s4| 	                    |¦  «         t          d
|› �t          j        ¬¦  «         ŒKt          d|› �¦  «         Œ^	 d d d ¦  «         n# 1 swxY w Y   |sd	ndS )NrÖ   z;choose either task_ids to archive or --rm archived task_idsr1  r3  rÑ  zcannot delete z (must already be archived)zDeleted r   zcannot archive z	Archived )rE   rÌ   rM   r:  r;  r<  rð   r˜  Údelete_archived_taskr¤   Úarchive_task)rG   r™  rÖ   rã  r›  r�  s         r   r_  r_  V	  s*  € Ý
ˆtŒ}Ð" Ñ
#Ô
#€CÝ•W˜T ;°Ñ5Ô5Ð;¸Ñ<Ô<€IØ
ð ˆyð ÝÐKÕRUÔR\Ð]Ñ]Ô]Ð]ØˆqØð �yð ÝÐ0µs´zÐBÑBÔBÐBØˆqØ€FÝ	Ô	Ñ	Ô	ð ) Øð 	*Ø ð ,ð ,�ÝÔ.¨t°SÑ9Ô9ð ,Ø—M’M #Ñ&Ô&Ð&ÝÐK¨3ÐKÐKÐKÕRUÔR\Ð]Ñ]Ô]Ð]Ð]åÐ* SÐ*Ð*Ñ+Ô+Ð+Ð+Ø"Ð)�1�1¨ð)ð )ð )ð )ñ )ô )ð )ð )ð ð 	)ð 	)ˆCÝ”? 4¨Ñ-Ô-ð )Ø—’˜cÑ"Ô"Ð"ÝÐ-¨Ð-Ð-µC´JÐ?Ñ?Ô?Ð?Ð?åÐ' #Ð'Ð'Ñ(Ô(Ð(Ð(ð	)ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð Ð!ˆ1ˆ1 Ð!s   ÂA)E1ÄA E1Å1E5Å8E5c                ó  — d}t          d| j        › d�¦  «         	 	 t          j        ¦   «         5 }t          j        || j        ¦  «        }d d d ¦  «         n# 1 swxY w Y   |D ]W}|j        |k    rJ|j        r
d|j        › �nd}t          dt          |j        ¦  «        › d|j	        › |› �d¬	¦  «         |j        }ŒXt          j        t          d
| j        ¦  «        ¦  «         ŒÇ# t          $ r t          d¦  «         Y dS w xY w)Nr   zTailing events for z. Ctrl-C to stop.Tr$   r   Ú[rL  ©Úflushçš™™™™™¹?ú

(stopped))r:  r°   rð   r˜  rZ  r-   r6  r   r:   ra   r   Úsleepre  ÚintervalÚKeyboardInterrupt)rG   Úlast_idr›  rC  r8  ro  s         r   r`  r`  r	  sc  € Ø€GÝ	Ð
? ¤Ð
?Ð
?Ð
?Ñ@Ô@Ð@ðð	0ÝÔ#Ñ%Ô%ð <¨Ýœ¨¨d¬lÑ;Ô;�ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <àð #ð #�Ø”4˜'’>�>Ø,-¬IÐ=˜˜QœY˜˜˜¸2�BÝÐC�g a¤lÑ3Ô3ÐCÐC°q´vÐC¸rÐCÐCÈ4ÐPÑPÔPÐPØœd�GøÝŒJ•s˜3 ¤Ñ.Ô.Ñ/Ô/Ð/ð	0øõ ð ð ð ÝˆmÑÔÐØˆqˆqðøøøs5   œC$ °AÁC$ ÁAÁC$ ÁAÁBC$ Ã$DÄ Dc                ó*	  — 	 ddl m}  |¦   «         }t          |t          ¦  «        r|                     di ¦  «        ni }|                     d¦  «        pd                     ¦   «         pd }d„ } ||                     d¦  «        ¦  «        } ||                     d¦  «        ¦  «        }t          | d	d ¦  «        }|�|n ||                     d
¦  «        ¦  «        }	n'# t          $ r d }d }d }t          | d	d ¦  «        }	Y nw xY wt          j	        ¦   «         5 }
t          j
        |
| j        |	|t          | dt          j        ¦  «        ||¬¦  «        }d d d ¦  «         n# 1 swxY w Y   t          | dd¦  «        r|t          t          j        |j        |j        |j        |j        |j        |j        d„ |j        D ¦   «         |j        |j        d„ |j        D ¦   «         |j        dœd¬¦  «        ¦  «         dS t          d|j        › �¦  «         t          dt7          |j        ¦  «        › �¦  «         |j        r*t          dd                     |j        ¦  «        › �¦  «         t          dt7          |j        ¦  «        › �¦  «         |j        r*t          dd                     |j        ¦  «        › �¦  «         t          dt7          |j        ¦  «        › �¦  «         |j        r*t          dd                     |j        ¦  «        › �¦  «         t          dt7          |j        ¦  «        › �¦  «         |j        r*t          dd                     |j        ¦  «        › �¦  «         t          d|j        › �¦  «         t          dt7          |j        ¦  «        › �¦  «         |j        D ]-\  }}}| j        rdnd}t          d|› d|› d |pd!› |› �¦  «         Œ.|j        r-t          d"|›d#d                     |j        ¦  «        › �¦  «         |j        r*t          d$d                     |j        ¦  «        › �¦  «         |j        r&|j        D ]\  }}}t          d%|› d&|› d'|› �¦  «         Œ|j        r*t          d(d                     |j        ¦  «        › �¦  «         dS ))Nr   rv   rx   Údefault_assigneer   c                óp   — | €d S 	 t          | ¦  «        }n# t          t          f$ r Y d S w xY w|dk    r|nd S )Nr3  )rï   Ú	TypeErrorrB  )rQ   Úivals     r   Ú_coerce_positive_intz+_cmd_dispatch.<locals>._coerce_positive_int’	  sW   € Øˆ}Ø�tðÝ˜5‘z”z��øÝ�zÐ*ð ð ð Ø�t�tðøøøà 1š9˜9�4�4¨$Ð.s   † –+ª+Úmax_in_progress_per_profileÚmax_in_progressre  Ú	max_spawnrE  )rø  r  r  rE  r  r  rÔ   Fc                ó"   — g | ]\  }}}|||d œ‘ŒS ))r°   r+   r  r²  )ri   r�  ÚwhoÚwss       r   r  z!_cmd_dispatch.<locals>.<listcomp>¼	  s8   € ð ð ð á"�S˜#˜rð  ¨S¸rÐBÐBðð ð r   c                ó"   — g | ]\  }}}|||d œ‘ŒS ))r°   r+   rŸ   r²  )ri   r�  r  rŸ   s       r   r  z!_cmd_dispatch.<locals>.<listcomp>Â	  s8   € ð +ð +ð +á'�S˜#˜wð  ¨S¸WÐEÐEð+ð +ð +r   )Ú	reclaimedÚcrashedÚ	timed_outÚstaleÚauto_blockedrù  ÚspawnedÚskipped_unassignedÚskipped_nonspawnableÚskipped_per_profile_cappedÚauto_assigned_defaultr6  rÅ  zReclaimed:    zCrashed:      r%   r®  zTimed out:    zStale:        zAuto-blocked: zPromoted:     zSpawned:      rü  z  - z  ->  z  @ re   z)Auto-assigned to kanban.default_assignee=rD  zSkipped (unassigned): z
Deferred (z at per-profile cap, z running): u8   Skipped (non-spawnable assignee â€” terminal lane, OK): )r~   rw   ra  rÚ  r)   rW   rM   r{   rð   r˜  Údispatch_oncerø  rú   r:  rÔ   rº  r!  r"  r#  r$  r%  rù  r&  r'  r(  r)  r*  rY   r»  )rG   rw   Ú_cfgÚ_kanban_cfgr  r  r  r  Úcli_maxr  r›  rÓ  r�  r  r  r  rŸ   s                    r   ra  ra  „	  s¸  € ð/Ø1Ð1Ð1Ð1Ð1Ð1Øˆ{‰}Œ}ˆÝ0:¸4ÅÑ0FÔ0FÐN�d—h’h˜x¨Ñ,Ô,Ð,ÈBˆØ'ŸOšOÐ,>Ñ?Ô?ÐEÀ2×LÒLÑNÔNÐVÐRVÐð	/ð 	/ð 	/ð ';Ð&:Ø�OŠOÐ9Ñ:Ô:ñ'
ô '
Ð#ð /Ð.¨{¯ªÐ?PÑ/QÔ/QÑRÔRˆõ ˜$  tÑ,Ô,ˆØ&Ð2�G�GÐ8LÐ8LØ�OŠO˜KÑ(Ô(ñ9
ô 9
ˆ	ˆ	øõ ð /ð /ð /ØÐØ&*Ð#ØˆÝ˜D %¨Ñ.Ô.ˆ	ˆ	ˆ	ð	/øøøõ
 
Ô	Ñ	Ô	ð 	
 ÝÔØØ”LØØ+Ý! $¨½Ô9WÑXÔXØ-Ø(Cð
ñ 
ô 
ˆð	
ð 	
ð 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøð 	
ð 	
ð 	
ð 	
õ ˆt�V˜UÑ#Ô#ð Ý�dŒjØœØ”{ØœØ”YØÔ,Øœðð à&)¤kðñ ô ð #&Ô"8Ø$'Ô$<ð+ð +à+.Ô+Ið+ñ +ô +ð &)Ô%>ð#
ð 
ð$ ð%ñ ô ñ 	ô 	ð 	ð& ˆqÝ	Ð
*˜3œ=Ð
*Ð
*Ñ+Ô+Ð+Ý	Ð
-�3˜sœ{Ñ+Ô+Ð
-Ð
-Ñ.Ô.Ð.Ø
„{ð -ÝÐ+�4—9’9˜Sœ[Ñ)Ô)Ð+Ð+Ñ,Ô,Ð,Ý	Ð
/�3˜sœ}Ñ-Ô-Ð
/Ð
/Ñ0Ô0Ð0Ø
„}ð /ÝÐ-�4—9’9˜Sœ]Ñ+Ô+Ð-Ð-Ñ.Ô.Ð.Ý	Ð
+�3˜sœy™>œ>Ð
+Ð
+Ñ,Ô,Ð,Ø
„yð +ÝÐ)�4—9’9˜SœYÑ'Ô'Ð)Ð)Ñ*Ô*Ð*Ý	Ð
2�3˜sÔ/Ñ0Ô0Ð
2Ð
2Ñ3Ô3Ð3Ø
Ôð 2ÝÐ0�4—9’9˜SÔ-Ñ.Ô.Ð0Ð0Ñ1Ô1Ð1Ý	Ð
)˜3œ<Ð
)Ð
)Ñ*Ô*Ð*Ý	Ð
-�3˜sœ{Ñ+Ô+Ð
-Ð
-Ñ.Ô.Ð.Øœð ;ð ;‰ˆˆS�"Øœ,Ð.ˆhˆh¨BˆÝÐ9�SÐ9Ð9 Ð9Ð9¨¨¨sÐ9°CÐ9Ð9Ñ:Ô:Ð:Ð:Ø
Ô ð 
Ýð6Ð8Hð 6ð 6Ø�yŠy˜Ô2Ñ3Ô3ð6ð 6ñ	
ô 	
ð 	
ð Ôð LÝÐJ t§y¢y°Ô1GÑ'HÔ'HÐJÐJÑKÔKÐKØ
Ô%ð Ø!$Ô!?ð 	ð 	ÑˆC��gÝØP˜SÐPÐP°wÐPÐPÈ3ÐPÐPñô ð ð ð Ôð 
Ýð5Ø�yŠy˜Ô1Ñ2Ô2ð5ð 5ñ	
ô 	
ð 	
ð ˆ1s$   ‚CC Ã!DÄ DÄ:EÅE!Å$E!c           	     óH  ‡‡‡‡— t          | dd¦  «        st          dt          j        ¬¦  «         dS t	          j        ¦   «          t          | dd¦  «        }|r¥	 t          |¦  «        j                             dd¬	¦  «         t          |¦  «         	                    t          t          j        ¦   «         ¦  «        d
¬¦  «         n8# t          $ r+}t          d|› d|› �t          j        ¬¦  «         Y d}~nd}~ww xY wt          t          | dd¦  «        ¦  «        Št          d| j        › dt          j        ¦   «         › d�t          j        ¬¦  «         dŠdddœŠˆˆˆˆfd„}dd„Š	 t	          j        | j        | j        t          | dt          j        ¦  «        |¬¦  «         |r3	 t          |¦  «                             ¦   «          nK# t          $ r Y n?w xY wn:# |r3	 t          |¦  «                             ¦   «          w # t          $ r Y w w xY ww xY wt          d¦  «         dS )u:  Deprecated â€” the dispatcher now runs inside the gateway.

    Left in as a stub so users with the old command in scripts/systemd
    units get a clear migration message instead of a cryptic
    "no such command" error. A ``--force`` escape hatch keeps the old
    standalone daemon alive for the rare edge case where someone truly
    cannot run the gateway (e.g. running on a host that forbids
    long-lived background services), but the default path exits 2
    with guidance so nobody accidentally keeps running two dispatchers
    against the same kanban.db.
    r÷  Fuy  hermes kanban daemon: DEPRECATED â€” the dispatcher now runs
inside the gateway. To use kanban:

    hermes gateway start       # starts the gateway + embedded dispatcher

Ready tasks will be picked up on the next dispatcher tick
(default: every 60 seconds). Configure via config.yaml:

    kanban:
      dispatch_in_gateway: true      # default
      dispatch_interval_seconds: 60
      failure_limit: 2              # consecutive non-success attempts before auto-block

Running both the gateway AND this standalone daemon will
race for claims. If you truly need the old standalone
daemon (no gateway available), rerun with --force.r1  r6  ÚpidfileNT)r  Úexist_okzutf-8)Úencodingz!warning: could not write pidfile rD  Úverbosez;Kanban dispatcher running STANDALONE via --force (interval=zs, pid=zŠ). Ctrl-C to stop. NOTE: if a gateway is also running with dispatch_in_gateway=true (default), you have two dispatchers racing for claims.é   r   )Ú	bad_ticksÚlast_warn_atc                ón  •— t          | j        ¦  «        p	 ‰¦   «         }t          | j        ¦  «        }|r|s‰dxx         dz  cc<   nd‰d<   ‰d         ‰k    rjt          t	          j        ¦   «         ¦  «        }|‰d         z
  dk    r;t          dt          |¦  «        › d‰d         › d�t          j        d	¬
¦  «         |‰d<   ‰sd S | j	        p)| j
        p"| j        p| j        p| j        p| j        p| j        }|rºt          dt          t          t	          j        ¦   «         ¦  «        ¦  «        › d| j	        › dt          | j
        ¦  «        › dt          | j        ¦  «        › dt          | j        ¦  «        › d| j        › dt          | j        ¦  «        › dt          | j        ¦  «        › �d	¬¦  «         d S d S )Nr5  r3  r   r6  i,  r  z3] WARN dispatcher stuck: ready queue non-empty for zÔ consecutive ticks but 0 workers spawned successfully. Check profile health (venv, PATH, credentials) and `hermes kanban list --status ready` / `hermes kanban list --status blocked` for recent spawn_failed tasks.T)r2  r  z] reclaimed=z	 crashed=z timed_out=z stale=z
 promoted=z	 spawned=z auto_blocked=r  )r   r'  r&  rï   r   r:  r   r;  r<  r!  r"  r#  rù  r%  r$  rY   )	rÓ  Úready_pendingÚspawned_anyÚnowÚdid_workÚHEALTH_WINDOWÚ_ready_queue_nonemptyÚhealth_stater3  s	        €€€€r   Ú_on_tickz_cmd_daemon.<locals>._on_tick3
  sE  ø€ Ý˜SÔ3Ñ4Ô4ÐOÐ8MÐ8MÑ8OÔ8OˆÝ˜3œ;Ñ'Ô'ˆØð 	* ð 	*Ø˜Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%Ð%à()ˆL˜Ñ%ð ˜Ô$¨Ò5Ð5Ý•d”i‘k”kÑ"Ô"ˆCà�\ .Ô1Ñ1°SÒ8Ð8Ýð+� ™œð +ð +Ø1=¸kÔ1Jð+ð +ð +õ œ¨4ð	ñ 	ô 	ð 	ð 03�˜^Ñ,Øð 	ØˆFàŒMð <˜Sœ[ð <¨C¬Mð <¸S¼\ð <ØŒ{ð<Ø!Ô.ð<Ø25´)ð 	ð ð 	Ýð8•G�C¥¤	¡¤Ñ,Ô,Ñ-Ô-ð 8ð 8Ø œ]ð8ð 8Ý58¸¼Ñ5EÔ5Eð8ð 8å  ¤Ñ/Ô/ð8ð 8å8;¸C¼I¹¼ð8ð 8ð  œLð8ð 8õ 47°s´{Ñ3CÔ3Cð8ð 8õ !$ CÔ$4Ñ 5Ô 5ð	8ð 8ð
 ðñ ô ð ð ð ð	ð 	r   r   r   c                 ó¨   — 	 t          j        ¦   «         5 } t          j        | ¦  «        cddd¦  «         S # 1 swxY w Y   dS # t          $ r Y dS w xY w)uÃ  Cheap probe â€” is there at least one ready+assigned+unclaimed
        task whose assignee maps to a real Hermes profile (i.e. one the
        dispatcher would actually try to spawn for)?

        Filters out tasks assigned to control-plane lanes
        (e.g. ``orion-cc``, ``orion-research``) that are pulled by
        terminals via ``claim_task`` directly â€” those are correctly idle
        from the dispatcher's perspective, not stuck.
        NF)rð   r˜  Úhas_spawnable_readyr{   )r›  s    r   r=  z*_cmd_daemon.<locals>._ready_queue_nonempty[
  s§   € ð	ÝÔ#Ñ%Ô%ð 4¨ÝÔ-¨dÑ3Ô3ð4ð 4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4ð 4øåð 	ð 	ð 	Ø�5�5ð	øøøs,   ‚A •6©A ¶:ºA ½:¾A Á
AÁArE  )r  r  rE  Úon_tickz(dispatcher stopped))r   r   )rM   r:  r;  r<  rð   rG  r   r  ÚmkdirÚ
write_textr   r\   ÚgetpidÚOSErrorr   r  Ú
run_daemonre  rú   rÂ   )rG   r0  ru  r?  r<  r=  r>  r3  s       @@@@r   rb  rb  ï	  sÆ  øøøø€ õ �4˜ %Ñ(Ô(ð ÝðAõ  ”ð#	
ñ 	
ô 	
ð 	
ð& ˆqõ
 „J�L„L€Lå�d˜I tÑ,Ô,€GØð Yð	YÝ�‰MŒMÔ ×&Ò&¨t¸dÐ&ÑCÔCÐCÝ�‰MŒM×$Ò$¥S­¬©¬Ñ%5Ô%5ÀÐ$ÑHÔHÐHÐHøÝð 	Yð 	Yð 	YÝÐF°gÐFÐFÀÐFÐFÍSÌZÐXÑXÔXÐXÐXÐXÐXÐXÐXøøøøð	Yøøøõ •7˜4 ¨EÑ2Ô2Ñ3Ô3€GÝ	ð	Ø”]ð	ð 	Ý+-¬9©;¬;ð	ð 	ð 	õ
 ŒZðñ ô ð ð €MØ!"°AÐ6Ð6€Lð&ð &ð &ð &ð &ð &ð &ð &ðPð ð ð ð Ý
ŒØ”]Ø”hÝ! $¨½Ô9WÑXÔXØð		
ñ 	
ô 	
ð 	
ð ð 	ðÝ�W‘”×$Ò$Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøð	øˆ7ð 	ðÝ�W‘”×$Ò$Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøð	øøøõ
 
Ð
 Ñ!Ô!Ð!Øˆ1s[   ÁA+C Ã
C;Ã!C6Ã6C;Å(;G Æ&!G Ç
GÇGÇHÇ!G?Ç>HÇ?
HÈ	HÈHÈHc                óp  — | j         r$d„ | j                              d¦  «        D ¦   «         nd}d}t          dd¬¦  «         t          j        ¦   «         5 }|                     d¦  «                             ¦   «         }t          |d	         ¦  «        }ddd¦  «         n# 1 swxY w Y   	 	 t          j        ¦   «         5 }|                     d
|f¦  «                             ¦   «         }ddd¦  «         n# 1 swxY w Y   |D ]î}t          |t          |d         ¦  «        ¦  «        }|r|d         |vrŒ2| j
        r|d         | j
        k    rŒK| j        r|d         | j        k    rŒd	 |d         rt          j        |d         ¦  «        nd}n# t          $ r d}Y nw xY w|rd|› �nd}t          dt          |d         ¦  «        › d|d         d›d|d         d›d|d         pd› d|› �
d¬¦  «         Œït!          j        t          d| j        ¦  «        ¦  «         �Œn# t&          $ r t          d¦  «         Y dS w xY w)z(Live-stream task_events to the terminal.c                ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S r²  )rW   )ri   r´  s     r   ú	<setcomp>z_cmd_watch.<locals>.<setcomp>
  s-   € Ð?Ð?Ð?�q°Q·W²W±Y´YÐ?ˆ�Š‰ŒÐ?Ð?Ð?r   rM  Nr   z'Watching kanban events. Ctrl-C to stop.Tr  z1SELECT COALESCE(MAX(id), 0) AS m FROM task_eventsrâ  z¸SELECT e.id, e.task_id, e.kind, e.payload, e.created_at,        t.assignee, t.tenant FROM task_events e LEFT JOIN tasks t ON t.id = e.task_id WHERE e.id > ? ORDER BY e.id ASC LIMIT 200r-   ra   r+   r,   r6  r$   r   r  r:   rL  r°   Ú10sr“  z (@re   rÙ   r  r  )ÚkindsÚsplitr:  rð   r˜  r™  Úfetchonerï   rš  re  r+   r,   rÔ   rÙ  r{   r   r   r  r  r  )	rG   rL  Úcursorr›  rœ  rœ  r”  r6  ro  s	            r   rc  rc  |
  sE  € ð Œ:ð	 Ð?Ð?˜DœJ×,Ò,¨SÑ1Ô1Ð?Ñ?Ô?Ð?Øð 
ð €FÝ	Ð
3¸4Ð@Ñ@Ô@Ð@å	Ô	Ñ	Ô	ð  Ø�lŠlØ?ñ
ô 
ç
Š(‰*Œ*ð 	õ �S˜”X‘”ˆð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðð	0ÝÔ#Ñ%Ô%ð ¨Ø—|’|ðAð �Iñô ÷ ’(‘*”*ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð �Ý˜V¥S¨¨4¬¡\¤\Ñ2Ô2�Øð ˜Q˜vœY¨eÐ3Ð3ØØ”=ð  Q z¤]°d´mÒ%CÐ%CØØ”;ð  1 X¤;°$´+Ò#=Ð#=Øð#Ø:;¸I¼,ÐP�dœj¨¨9¬Ñ6Ô6Ð6ÈD�G�GøÝ ð #ð #ð #Ø"�G�G�Gð#øøøà&-Ð5�]˜�]�]�]°2�ÝðE�  ,¤Ñ0Ô0ð Eð E°A°i´LÐGð Eð EØ˜”yÐDðEð EØ)*¨:¬Ð)=¸#ðEð EØ@BðEð Eàðñ ô ð ð õ
 ŒJ•s˜3 ¤Ñ.Ô.Ñ/Ô/Ð/ñ7	0øõ8 ð ð ð ÝˆmÑÔÐØˆqˆqðøøøsn   Á=BÂB!Â$B!Â)H Â=*C3Ã'H Ã3C7Ã7H Ã:C7Ã;A)H Å%$F
Æ	H Æ
FÆH ÆFÆA?H ÈH5È4H5c           
     óþ  — t          j        ¦   «         5 }t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   t          | dd¦  «        r&t	          t          j        |dd¬¦  «        ¦  «         dS t	          d¦  «         dD ]2}t	          d|d	›d|d
                              |d¦  «        › �¦  «         Œ3|d         r�t	          d¦  «         t          |d          	                    ¦   «         ¦  «        D ]Y\  }}d 
                    d„ t          | 	                    ¦   «         ¦  «        D ¦   «         ¦  «        }t	          d|d›d|› �¦  «         ŒZ|d         }|� t	          dt          |¦  «        › d�¦  «         dS )NrÔ   Fr6  r¥  r   z
By status:)r  r
   r   r   r   r   r   r%   r&   Ú	by_statusÚby_assigneez
By assignee:r®  c              3  ó*   K  — | ]\  }}|› d |› �V — ŒdS r°  r²  r³  s      r   rk   z_cmd_stats.<locals>.<genexpr>¹
  rù  r   r'   Úoldest_ready_age_secondsz
Oldest ready task age: rá  )rð   r˜  Úboard_statsrM   r:  rÔ   rº  r)   rò   r¼  r»  rï   )rG   r›  rÜ   r´  r  r£  ÚpartsÚages           r   rd  rd  ­
  sÓ  € Ý	Ô	Ñ	Ô	ð % Ý”˜tÑ$Ô$ˆð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %åˆt�V˜UÑ#Ô#ð Ý�dŒj˜ q°uÐ=Ñ=Ô=Ñ>Ô>Ð>ØˆqÝ	ˆ,ÑÔÐØSð ;ð ;ˆÝÐ9�1Ð9Ð9Ð9˜5 Ô-×1Ò1°!°QÑ7Ô7Ð9Ð9Ñ:Ô:Ð:Ð:Øˆ]Ôð +ÝÐÑÔÐÝ! %¨Ô"6×"<Ò"<Ñ">Ô">Ñ?Ô?ð 	+ð 	+‰KˆC�Ø—I’IÐLÐLµV¸F¿LºL¹N¼NÑ5KÔ5KÐLÑLÔLÑLÔLˆEÝÐ)�sÐ)Ð)Ð) %Ð)Ð)Ñ*Ô*Ð*Ð*Ø
Ð*Ô
+€CØ
€ÝÐ5­#¨c©(¬(Ð5Ð5Ð5Ñ6Ô6Ð6Øˆ1rþ  c                ó  — t          j        ¦   «         5 }t          j        || j        ¦  «        €1t	          d| j        › �t
          j        ¬¦  «         	 d d d ¦  «         dS t          j        || j        | j        | j	        | j
        | j        | j        | j        pt          ¦   «         ¬¦  «         d d d ¦  «         n# 1 swxY w Y   t	          d| j        › d| j	        › �| j        r
d| j        › �ndz   d| j        › �z   ¦  «         d	S )
Nr/  r1  r3  )r°   ÚplatformÚchat_idÚ	chat_typeÚ	thread_idÚuser_idÚnotifier_profilezSubscribed r{  r   rv  r   )rð   r˜  r  r°   r:  r;  r<  Úadd_notify_subrY  rZ  r[  r\  r]  r^  r€  r£  s     r   ri  ri  Á
  sp  € Ý	Ô	Ñ	Ô	ð 

 ÝŒ;�t˜Tœ\Ñ*Ô*Ð2ÝÐ1 4¤<Ð1Ð1½¼
ÐCÑCÔCÐCØð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

õ 	ÔØ˜$œ,Ø”]¨D¬LØ”nØ”n¨d¬lØ!Ô2ÐGµoÑ6GÔ6Gð	
ñ 	
ô 	
ð 	
ð	

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

õ 
Ð
6˜œÐ
6Ð
6¨¬Ð
6Ð
6Ø%)¤^Ð;Ð!�”Ð!Ð!Ð!¸ñ=à!�4”<Ð!Ð!ñ"ñ #ô #ð #ð ˆ1s   ”?B9Á AB9Â9B=Ã B=c                ó(  — t          j        ¦   «         5 }t          j        || j        ¦  «        }d d d ¦  «         n# 1 swxY w Y   t	          | dd¦  «        r&t          t          j        |dd¬¦  «        ¦  «         dS |st          d¦  «         dS |D ]}|                     d¦  «        rd|d         › �nd	}|                     d
¦  «        rd|d
         › �nd	}t          d|d         d›d|d         › d|d         › |› d|d         › d|› �¦  «         Œ€dS )NrÔ   Fr6  r¥  r   z(no subscriptions)r\  r{  r   r^  z  owner=r%   r°   rK  rY  rZ  z  (since event Úlast_event_idrÙ   )	rð   r˜  Úlist_notify_subsr°   rM   r:  rÔ   rº  r)   )rG   r›  Úsubsrá  ÚthrÚowners         r   rj  rj  Ó
  s¨  € Ý	Ô	Ñ	Ô	ð 7 ÝÔ" 4¨¬Ñ6Ô6ˆð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7åˆt�V˜UÑ#Ô#ð Ý�dŒj˜ a°eÐ<Ñ<Ô<Ñ=Ô=Ð=ØˆqØð ÝÐ"Ñ#Ô#Ð#ØˆqØð >ð >ˆØ&'§e¢e¨KÑ&8Ô&8Ð@Ð"�!�K”.Ð"Ð"Ð"¸bˆØ67·e²eÐ<NÑ6OÔ6OÐWÐ2˜1Ð/Ô0Ð2Ð2Ð2ÐUWˆÝð =�1�Y”<ÐJð =ð = q¨¤}ð =ð =°q¸´|ð =ÀSð =ð =Ø ! /Ô 2ð=ð =Ø5:ð=ð =ñ 	>ô 	>ð 	>ð 	>àˆ1rÌ  c                ó"  — t          j        ¦   «         5 }t          j        || j        | j        | j        | j        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |st          dt          j	        ¬¦  «         dS t          d| j        › �¦  «         dS )N)r°   rY  rZ  r\  z(no such subscription)r1  r3  zUnsubscribed from r   )
rð   r˜  Úremove_notify_subr°   rY  rZ  r\  r:  r;  r<  rò  s      r   rk  rk  ä
  sÒ   € Ý	Ô	Ñ	Ô	ð 
 ÝÔ!Ø˜$œ,Ø”]¨D¬LØ”nð
ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð ð ÝÐ&­S¬ZÐ8Ñ8Ô8Ð8ØˆqÝ	Ð
-˜tœ|Ð
-Ð
-Ñ.Ô.Ð.Øˆ1s   ”.AÁAÁAc                ó<  — t          j        | j        | j        ¬¦  «        }|€&t	          d| j        › d�t
          j        ¬¦  «         dS t
          j                             |¦  «         | 	                    d¦  «        st
          j                             d¦  «         dS )N)Ú
tail_bytesz(no log for u#    â€” task may not have spawned yet)r1  r3  Ú
r   )
rð   Úread_worker_logr°   r×   r:  r;  r<  ÚstdoutÚwriteÚendswith)rG   Úcontents     r   re  re  ò
  s˜   € ÝÔ  ¤¸$¼)ÐDÑDÔD€GØ€ÝÐN˜Tœ\ÐNÐNÐNÝ”:ð	ñ 	ô 	ð 	àˆqÝ„J×Ò�WÑÔÐØ×Ò˜DÑ!Ô!ð ÝŒ
×Ò˜ÑÔÐØˆ1r   c                óD  — t          | ¦  «        }|€t          dt          j        ¬¦  «         dS t	          j        ¦   «         5 }t	          j        || j        fi |¤Ž}ddd¦  «         n# 1 swxY w Y   t          | dd¦  «        r0t          t          j
        d„ |D ¦   «         dd¬¦  «        ¦  «         d	S |st          d
| j        › d�¦  «         d	S t          dd›ddd›ddd›ddd›d�¦  «         t          |d¦  «        D �] \  }}|j        pt          t          j        ¦   «         ¦  «        }t          d	||j        z
  ¦  «        }|dk     r|› d�}n|dk     r	|dz  › d�}n	|dz  d›d�}|j        p|j        sdn|j        }	t          |d›d|	d›d|j        pdd›d|d›dt)          |j        ¦  «        › �	¦  «         |j        r9|j                             ¦   «         d	         dd …         }
t          d!|
› �¦  «         |j        rt          d"|j        dd …         › �¦  «         �Œ"d	S )#z Show attempt history for a task.NzBkanban runs: pass both --state-type and --state-name, or omit bothr1  r6  rÔ   Fc                ó˜   — g | ]G}|j         |j        |j        |j        |j        |j        |j        |j        |j        |j	        |j
        d œ‘ŒHS )©r-   r´   r*   r±   r;   r?  r<  r½   r=  r>  r;  rr  r“  s     r   r  z_cmd_runs.<locals>.<listcomp>
  sb   € ð 
ð 
ð 
ð ð ”d q¤y¸A¼HØœ9°A´LØœJ°1´9Øœ¨a¬jØœl¸¼
ðð ð
ð 
ð 
r   r¥  r   z(no runs yet for rÙ   ú#Ú3sr%   ÚOUTCOMEÚ12sÚPROFILEÚ16sÚELAPSEDz>8sz	  STARTEDr3  rß  rá  rà  râ  z.1frã  z	(running)Ú3dre   éd   u	        â†’ u	        âœ– )rP   r:  r;  r<  rð   r˜  r]  r°   rM   rÔ   rº  Ú	enumerater?  rï   r   re  r;   r±   r*   r´   r   r<  rf  r½   )rG   rg  r›  rá   r‡  r”  Úendrq  rr  r±   r<  s              r   rf  rf  þ
  só  € å
˜DÑ
!Ô
!€CØ
€{ÝØPÝ”ð	
ñ 	
ô 	
ð 	
ð ˆqÝ	Ô	Ñ	Ô	ð 7 ÝŒ|˜D $¤,Ð6Ð6°#Ð6Ð6ˆð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7åˆt�V˜UÑ#Ô#ð 
Ý�dŒjð 
ð 
ð ð
ñ 
ô 
ð  %ð)ñ )ô )ñ 	*ô 	*ð 	*ð ˆqØð ÝÐ1 $¤,Ð1Ð1Ð1Ñ2Ô2Ð2ØˆqÝ	ˆSÐ
QÐ
QÐ
Q�yÐ
QÐ
QÐ
Q¨	Ð
QÐ
QÐ
Q¸Ð
QÐ
QÐ
QÐ
QÑRÔRÐRÝ˜$ Ñ"Ô"ð /ñ /‰ˆˆ1ØŒjÐ,�C¥¤	¡¤Ñ,Ô,ˆå�a˜˜qœ|Ñ+Ñ,Ô,ˆØ�RŠ<ˆ<Ø���ˆBˆBØ�tŠ^ˆ^Ø˜r‘MÐ$Ð$Ð$ˆBˆBà˜d‘NÐ)Ð)Ð)Ð)ˆBØ”)ÐL°1´:Ð K  À1Ä8ˆÝ�ÐcÐcÐc˜ÐcÐcÐc¨¬Ð)9°cÐcÐcÐcÀ"ÐcÐcÐcÍGÐTUÔT`ÑLaÔLaÐcÐcÑdÔdÐdØŒ9ð 	)à”i×*Ò*Ñ,Ô,¨QÔ/°°°Ô5ˆGÝÐ'˜gÐ'Ð'Ñ(Ô(Ð(ØŒ7ð 	/ÝÐ-˜aœg d s dœmÐ-Ð-Ñ.Ô.Ð.ùØˆ1s   ÁA'Á'A+Á.A+c                ó®   — t          j        ¦   «         5 }t          j        || j        ¦  «        }d d d ¦  «         n# 1 swxY w Y   t	          |¦  «         dS ©Nr   )rð   r˜  Úbuild_worker_contextr°   r:  )rG   r›  rÅ   s      r   rl  rl  -  s‡   € Ý	Ô	Ñ	Ô	ð ; ÝÔ& t¨T¬\Ñ:Ô:ˆð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;å	ˆ$�K„K€KØˆ1rÌ  c           
     ó  — ddl m} t          t          | dd¦  «        ¦  «        }t          | dd¦  «        }t          | dd¦  «        pt	          ¦   «         }t          t          | dd¦  «        ¦  «        }| j        r|rt          d	t          j        ¬
¦  «         dS |r`| 	                    |¬¦  «        }|sGd|rd|›�ndz   dz   }|r%t          t          j        dddœ¦  «        ¦  «         nt          |¦  «         dS n-| j        r	| j        g}nt          dt          j        ¬
¦  «         dS d}d}	|D ]È}
|                     |
|¬¦  «        }|j        r|dz  }n|	dz  }	|r;t          t          j        |j        |j        |j        |j        dœ¦  «        ¦  «         Œh|j        r.|j        r
d|j        ›�nd}t          d|j        › d|› �¦  «         Œ�t          d|j        › d|j        › �t          j        ¬
¦  «         ŒÉ|s
|dk    rdndS |dk    s|sdndS )z{Flesh out a triage task (or all of them) via auxiliary LLM,
    then promote to todo. Thin wrapper over ``kanban_specify``.r   )Úkanban_specifyræ   Fr,   Nr2  rÔ   ú0kanban: pass either a task id OR --all, not bothr1  r6  ©r,   úNo triage tasksú for tenant r   rÅ  )Ú	specifiedr¤  z+kanban: specify requires a task id or --all©r2  r3  )r°   ró  rÏ   Ú	new_titleõ    â€” retitled: ú
Specified u	    â†’ todozkanban: specify rD  )r^  r‚  r   rM   r€  r°   r:  r;  r<  Úlist_triage_idsrÔ   rº  Úspecify_taskró  rÏ   r‰  )rG   ÚspecÚall_flagr,   r2  Ú	want_jsonr™  ÚmsgÚok_countÚ
fail_countr�  r±   Útitle_suffixs                r   rm  rm  4  sÜ  € ð 2Ð1Ð1Ð1Ð1Ð1å•G˜D ,°Ñ6Ô6Ñ7Ô7€HÝ�T˜8 TÑ*Ô*€FÝ�T˜8 TÑ*Ô*Ð?­oÑ.?Ô.?€FÝ•W˜T 6¨5Ñ1Ô1Ñ2Ô2€Ià„|ð ˜ð ÝØ>Ý”ð	
ñ 	
ô 	
ð 	
ð ˆqàð Ø×"Ò"¨&Ð"Ñ1Ô1ˆØð 
	à!Ø06Ð>Ð, &Ð,Ð,Ð,¸Bñ@àñð ð
 ð Ý•d”j¨q¸1Ð!=Ð!=Ñ>Ô>Ñ?Ô?Ð?Ð?å�c‘
”
�
Ø�1ð
	ð 
Œð ØŒ|ˆnˆˆåØ9Ý”ð	
ñ 	
ô 	
ð 	
ð ˆqà€HØ€JØð ð ˆØ×#Ò# C°Ð#Ñ7Ô7ˆØŒ:ð 	Ø˜‰MˆHˆHà˜!‰OˆJØð 	Ý•$”*Ø"œ?Ø”jØ!œ.Ø$Ô.ð	ð ñ ô ñ ô ð ð ð ŒZð 	ð Ô$ðÐ7 'Ô"3Ð7Ð7Ð7àð õ
 ÐG˜wœÐGÐG¸ÐGÐGÑHÔHÐHÐHåØF 7¤?ÐFÐF°g´nÐFÐFÝ”Zðñ ô ð ð ð ð )Ø ’M�Mˆqˆq qÐ(ð ˜A’� S�ˆ1ˆ1¨qÐ0r   c                óÜ  — ddl m} t          t          | dd¦  «        ¦  «        }t          | dd¦  «        }t          | dd¦  «        pt	          ¦   «         }t          t          | dd¦  «        ¦  «        }| j        r|rt          d	t          j        ¬
¦  «         dS |r`| 	                    |¬¦  «        }|sGd|rd|›�ndz   dz   }|r%t          t          j        dddœ¦  «        ¦  «         nt          |¦  «         dS n-| j        r	| j        g}nt          dt          j        ¬
¦  «         dS d}|D �](}	|                     |	|¬¦  «        }
|
j        r|dz  }|rGt          t          j        |
j        |
j        |
j        |
j        |
j        |
j        dœ¦  «        ¦  «         Œo|
j        r‡|
j        rR|
j        rKd                     |
j        ¦  «        }t          d|
j        › dt'          |
j        ¦  «        › d|› d�¦  «         ŒÏ|
j        r
d|
j        ›�nd}t          d|
j        › d|› �¦  «         Œýt          d|
j        › d|
j        › �t          j        ¬
¦  «         �Œ*|s
|dk    rdndS |dk    s|sdndS ) z·Fan a triage task (or all of them) out into a graph of child
    tasks via the auxiliary LLM, routed to specialist profiles by
    description. Thin wrapper over ``kanban_decompose``.r   )Úkanban_decomposeræ   Fr,   Nr2  rÔ   rƒ  r1  r6  r„  r…  r†  r   rÅ  )Ú
decomposedr¤  z-kanban: decompose requires a task id or --allrˆ  r3  )r°   ró  rÏ   Úfanoutr\  r‰  r®  zDecomposed u    â†’ z children (z); root promoted to todorŠ  r‹  u    â†’ todo (no fanout)zkanban: decompose rD  )r^  r–  r   rM   r€  r°   r:  r;  r<  rŒ  rÔ   rº  Údecompose_taskró  rÏ   r˜  r\  r‰  r»  rY   )rG   Údecompr�  r,   r2  r�  r™  r‘  r’  r�  r±   Úchild_summaryr”  s                r   rn  rn  }  sm  € ð 6Ð5Ð5Ð5Ð5Ð5å•G˜D ,°Ñ6Ô6Ñ7Ô7€HÝ�T˜8 TÑ*Ô*€FÝ�T˜8 TÑ*Ô*Ð?­oÑ.?Ô.?€FÝ•W˜T 6¨5Ñ1Ô1Ñ2Ô2€Ià„|ð ˜ð ÝØ>Ý”ð	
ñ 	
ô 	
ð 	
ð ˆqàð Ø×$Ò$¨FÐ$Ñ3Ô3ˆØð 
	à!Ø06Ð>Ð, &Ð,Ð,Ð,¸Bñ@àñð ð
 ð Ý•d”j°¸AÐ!>Ð!>Ñ?Ô?Ñ@Ô@Ð@Ð@å�c‘
”
�
Ø�1ð
	ð 
Œð ØŒ|ˆnˆˆåØ;Ý”ð	
ñ 	
ô 	
ð 	
ð ˆqà€HØð "ñ "ˆØ×'Ò'¨°FÐ'Ñ;Ô;ˆØŒ:ð 	Ø˜‰MˆHØð 	Ý•$”*Ø"œ?Ø”jØ!œ.Ø!œ.Ø$Ô.Ø$Ô.ðð ñ ô ñ ô ð ð ð ŒZð 	ØŒ~ð  'Ô"3ð Ø $§	¢	¨'Ô*;Ñ <Ô <�ÝðI '¤/ð Ið I½¸GÔ<MÑ8NÔ8Nð Ið IØ!.ðIð Ið Iñô ð ð ð Ô(ðÐ; gÔ&7Ð;Ð;Ð;àð õ
 ð1 ¤ð 1ð 1Ø".ð1ð 1ñô ð ð õ
 ØH W¤_ÐHÐH¸¼ÐHÐHÝ”Zðñ ô ð ñ ð ð )Ø ’M�Mˆqˆq qÐ(Ø˜A’� S�ˆ1ˆ1¨qÐ0r   c           	     óÀ  — ddl }t          j        ¦   «         }d}t          j        ¦   «         5 }|                     d¦  «                             ¦   «         }ddd¦  «         n# 1 swxY w Y   |D ]Ò}|d         dk    rŒt          |d         p
||d         z  ¦  «        }	 |                     ¦   «         }n# t          $ r Y ŒQw xY w	 | 	                    |                     ¦   «         ¦  «         n# t          $ r Y ŒŠw xY w|                     ¦   «         r0|                     ¦   «         r|                     |d¬	¦  «         |d
z  }ŒÓt          | dd¦  «        }t          | dd¦  «        }	t          j        ¦   «         5 }t          j        ||dz  dz  ¬¦  «        }
ddd¦  «         n# 1 swxY w Y   t          j        |	dz  dz  ¬¦  «        }t#          d|› d|
› d|› d�¦  «         dS )z^Remove scratch workspaces of archived tasks, prune old events, and
    delete old worker logs.r   NzNSELECT id, workspace_kind, workspace_path FROM tasks WHERE status = 'archived'r5   rT   r6   r-   T)Úignore_errorsr3  Úevent_retention_daysré   Úlog_retention_daysé   rà  )Úolder_than_secondszGC complete: z workspace(s), z event row(s), z log file(s) removed)Úshutilrð   Úworkspaces_rootr˜  r™  rš  r   ÚresolverF  Úrelative_torB  r—  Úis_dirÚrmtreerM   Ú	gc_eventsÚgc_worker_logsr:  )rG   r¢  Úscratch_rootÚ
removed_wsr›  rœ  rœ  r]   Ú
event_daysÚlog_daysÚremoved_eventsÚremoved_logss               r   ro  ro  Î  sÈ  € ð €M€M€MÝÔ%Ñ'Ô'€LØ€JÝ	Ô	Ñ	Ô	ð  Ø�|Š|Ø\ñ
ô 
ç
Š(‰*Œ*ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ˆØÐÔ  IÒ-Ð-ØÝ�CÐ(Ô)ÐG¨l¸SÀ¼YÑ.FÑHÔHˆð	Ø—<’<‘>”>ˆDˆDøÝð 	ð 	ð 	ØˆHð	øøøð	Ø×Ò˜\×1Ò1Ñ3Ô3Ñ4Ô4Ð4Ð4øÝð 	ð 	ð 	àˆHð	øøøð �;Š;‰=Œ=ð 	˜TŸ[š[™]œ]ð 	Ø�MŠM˜$¨dˆMÑ3Ô3Ð3Ø˜!‰OˆJøå˜Ð5°rÑ:Ô:€JÝ�tÐ1°2Ñ6Ô6€HÝ	Ô	Ñ	Ô	ð 
 ÝœØ Z°"¡_°tÑ%;ð
ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ Ô$Ø# b™=¨4Ñ/ðñ ô €Lõ 
ð O˜*ð Oð OØðOð OØ,8ðOð Oð Oñ Pô Pð Pàˆ1sG   ­(A!Á!A%Á(A%ÂB3Â3
C Â?C Ã'C,Ã,
C9Ã8C9Å6FÆF#Æ&F#c                ó‚  — 	 t          j        ¦   «         }n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d}~dS d}~ww xY wt          | dd¦  «        rxt          t          j        |j	        t          |j        ¦  «        |j        |j        |j        rt          |j        ¦  «        nd|j        dœd¬	¦  «        ¦  «         |j	        d
v rdndS |j	        dk    rt          d|j        › d�¦  «         dS |j	        dk    rt          |j        › d�¦  «         dS |j	        dk    rpt          |j        › d�¦  «         t          dd                     |j        ¦  «        › �¦  «         |j        rt          d|j        › �¦  «         t          d¦  «         dS t          |j        › d�t          j        ¬¦  «         |j        pg dd…         D ] }t          d|› �t          j        ¬¦  «         Œ!|j        rjt          dd                     |j        ¦  «        › d�t          j        ¬¦  «         |j        pg dd…         D ] }t          d|› �t          j        ¬¦  «         Œ!nt          dt          j        ¬¦  «         |j        r#t          d|j        › �t          j        ¬¦  «         t          dt          j        ¬¦  «         dS ) a†  Check DB integrity and apply the narrow index-REINDEX auto-repair.

    Dispatched BEFORE the auto ``kb.init_db()`` in :func:`kanban_command`
    (init itself refuses corrupt DBs), so this is reachable on exactly the
    boards that need it. Exit codes: 0 = healthy / repaired / no DB file,
    1 = still corrupt (non-index corruption, or REINDEX did not produce a
    clean re-check).
    zkanban repair: r1  Nr3  rÔ   F)r*   rÈ  ÚmessagesÚpost_repair_messagesÚbackup_pathÚ	reindexedr6  rÅ  >   ró  ÚmissingÚrepairedr   rµ  zNo kanban DB at u    â€” nothing to repair.ró  u*   : integrity_check ok â€” no repair needed.r¶  z: repaired.z  reindexed: r®  z  pre-repair backup: z  integrity_check now ok.z
: CORRUPT.é
   r%   z  REINDEX (z1) attempted but integrity_check is still failing:rK  uV     Not an index-only failure â€” automatic REINDEX repair does not apply (fail-closed).z  corrupt copy quarantined at: zw  Recover manually (e.g. `sqlite3 kanban.db ".recover"` into a fresh file) or move the file aside to start a new board.)rð   Ú	repair_dbr{   r:  r;  r<  rM   rÔ   rº  r*   r   rÈ  r±  r²  r³  r´  r»  )rG   Úreportru  Úlines       r   rF  rF  ÷  sP  € ðÝ”‘”ˆˆøÝð ð ð ÝÐ% Ð%Ð%­C¬JÐ7Ñ7Ô7Ð7Øˆqˆqˆqˆqˆqøøøøðøøøõ ˆt�V˜UÑ#Ô#ð JÝ�dŒjØ”mÝ˜6œ>Ñ*Ô*ØœØ$*Ô$?à+1Ô+=ÐG•�FÔ&Ñ'Ô'Ð'À4àÔ)ð	
ð 	
ð ð	ñ 	ô 	ñ 		ô 		ð 		ð ”MÐ%BÐBÐBˆqˆqÈÐIà„}˜	Ò!Ð!ÝÐH ¤ÐHÐHÐHÑIÔIÐIØˆqØ„}˜ÒÐÝ�”ÐKÐKÐKÑLÔLÐLØˆqØ„}˜
Ò"Ð"Ý�”Ð,Ð,Ð,Ñ-Ô-Ð-ÝÐ;˜dŸiši¨Ô(8Ñ9Ô9Ð;Ð;Ñ<Ô<Ð<ØÔð 	@ÝÐ>¨&Ô*<Ð>Ð>Ñ?Ô?Ð?ÝÐ)Ñ*Ô*Ð*Øˆqå	ˆVŒ^Ð
'Ð
'Ð
'­c¬jÐ9Ñ9Ô9Ð9Ø”Ð& B¨¨¨Ô,ð ,ð ,ˆÝˆk�4ˆkˆk¥¤
Ð+Ñ+Ô+Ð+Ð+ØÔð 
Ýð1˜$Ÿ)š) FÔ$4Ñ5Ô5ð 1ð 1ð 1å”ð	
ñ 	
ô 	
ð 	
ð
 Ô0Ð6°B¸¸¸Ô<ð 	2ð 	2ˆDÝ�-˜�-�-¥c¤jÐ1Ñ1Ô1Ð1Ð1ð	2õ 	ð'å”ð	
ñ 	
ô 	
ð 	
ð
 Ôð ÝÐD°Ô0BÐDÐDÝ”:ð	ñ 	ô 	ð 	å	ð	CåŒZðñ ô ð ð
 ˆ1s   ‚ –
A	 AÁA	u�  **/kanban** â€” manage the shared task board.

Common subcommands:
  `list` (alias `ls`)   List tasks on the current board
  `show <id>`           Task details + comments + events
  `stats`               Per-status / per-assignee counts
  `create <title>â€¦`     Create a task (auto-subscribes you to events)
  `comment <id> <msg>`  Append a comment
  `attach <id> <path>`  Attach a local file; `attachments <id>` to list
  `complete <id>â€¦`      Mark task(s) done
  `block <id> [reason]` Mark blocked; `schedule <id> [reason]` parks time-delay work; `unblock <id>` to revive
  `assign <id> <profile>`  Reassign
  `boards list`         Show all boards
  `assignees`           Known profiles + counts
  `context <id>`        Full worker-context dump
  `runs <id>`           Attempt history
  `log <id>`            Worker log

Run `/kanban <subcommand> -h` for arguments. Read-only commands are safe while an agent is running.Úrestc                óZ  ‡‡— ddl }ddl}| r(|                      ¦   «         rt          j        | ¦  «        ng Š‰r
‰d         dv rt
          S t          j        dd¬¦  «        }d|_        | 	                    d¬¦  «        }t          |¦  «        Šd	‰_        d‰_        ‰j        D ]L}t          |t          j        ¦  «        r0|j                             ¦   «         D ]\  }}d
|› �|_        d|_        ŒŒMdˆˆfd„}|                     ¦   «         }	|                     ¦   «         }
	  |j        |	¦  «        5   |j        |
¦  «        5  ‰                     ‰¦  «        }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   n©# t*          $ ru}|	                     ¦   «                              ¦   «         }|
                     ¦   «                              ¦   «         }|j        dv r	|r|cY d}~S |p|}|rd|› �ndcY d}~S d}~wt          j        $ r}d |¦   «         › d|› �cY d}~S d}~ww xY w |j        |	¦  «        5   |j        |
¦  «        5  	 t5          |¦  «         n@# t*          $ r Y n4t6          $ r(}t9          d|› �t:          j        ¬¦  «         Y d}~nd}~ww xY wddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |	                     ¦   «                              ¦   «         }|
                     ¦   «                              ¦   «         }|r	|r|› d|› �S |r|n|pdS )u  Execute a ``/kanban â€¦`` string and return captured stdout/stderr.

    ``rest`` is everything after ``/kanban`` (may be empty).  Used from
    both the interactive CLI (``self._handle_kanban_command``) and the
    gateway (``_handle_kanban_command``) so formatting is identical.
    r   N>   ú-hú--helprˆ   r    z/kanban-wrapF)ÚprogÚadd_helpÚ_topr�   z/kanbanz/kanban r   r   c                 ó0  •— ‰rn‰j         D ]f} t          | t          j        ¦  «        rJ| j                             ‰d         ¦  «        }|�(|                     ¦   «                              ¦   «         c S Œg‰                     ¦   «                              ¦   «         S r  )Ú_actionsra  rZ   Ú_SubParsersActionrª   r)   Úformat_usager±  )Ú_actionÚ	subparserrý   Útokenss     €€r   Ú_usage_for_errorz#run_slash.<locals>._usage_for_error|  s˜   ø€ Øð 	AØ(Ô1ð Að A�Ý˜g¥xÔ'AÑBÔBð AØ '¤× 3Ò 3°F¸1´IÑ >Ô >�IØ Ð,Ø(×5Ò5Ñ7Ô7×>Ò>Ñ@Ô@Ð@Ð@Ð@øØ×)Ò)Ñ+Ô+×2Ò2Ñ4Ô4Ð4r   >   Nr   u   âš  /kanban usage error
u   âš  /kanban usage errorrj  zerror: r1  z(no output)©r   r   )Úior?  rW   ÚshlexrM  Ú_SLASH_KANBAN_HELPrZ   ÚArgumentParserÚexit_on_errorrî   r/  r¿  rÃ  ra  rÄ  rª   r¼  ÚStringIOÚredirect_stdoutÚredirect_stderrÚ
parse_argsÚ
SystemExitÚgetvaluer±  ÚcodeÚArgumentErrorrx  r{   r:  r;  r<  )r»  rË  r?  Ú_wrapÚ_top_subrÆ  Ú_nameÚ_choicerÉ  Úbuf_outÚbuf_errrG   ru  Úoutr  r3   rý   rÈ  s                   @@r   Ú	run_slashrß  Y  sð  øø€ ð €I€I€IØÐÐÐà"&Ð?¨4¯:ª:©<¬<Ð?�UŒ[˜ÑÔÐ¸R€Fð ð "�V˜A”YÐ"?Ð?Ð?Ý!Ð!õ Ô#¨À%ÐHÑHÔH€EØ€EÔØ×#Ò#¨Ð#Ñ0Ô0€HÝ  Ñ*Ô*€MØ"€MÔØ"'€MÔØ Ô)ð .ð .ˆÝ�g�xÔ9Ñ:Ô:ð 	.Ø")¤/×"7Ò"7Ñ"9Ô"9ð .ð .‘��wØ1¨%Ð1Ð1�”Ø(-�Ô%Ð%øð5ð 5ð 5ð 5ð 5ð 5ð 5ð �kŠk‰mŒm€GØ�kŠk‰mŒm€GðGØ'ˆZÔ'¨Ñ0Ô0ð 	4ð 	4Ð2L°*Ô2LÈWÑ2UÔ2Uð 	4ð 	4Ø ×+Ò+¨FÑ3Ô3ˆDð	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4øøåð Yð Yð YØ×ÒÑ Ô ×'Ò'Ñ)Ô)ˆØ×ÒÑ Ô ×'Ò'Ñ)Ô)ˆàŒ8�yÐ Ð  SÐ ØˆJˆJˆJˆJˆJˆJØˆz�cˆØ59ÐXÐ1¨4Ð1Ð1Ð1Ð?XÐXÐXÐXÐXÐXÐXøøøøÝÔ!ð Gð Gð GØFÐ+;Ð+;Ñ+=Ô+=ÐFÐFÀÐFÐFÐFÐFÐFÐFÐFÐFøøøøðGøøøð 
$ˆÔ	# GÑ	,Ô	,ð 4ð 4Ð.H¨jÔ.HÈÑ.QÔ.Qð 4ð 4ð	4Ý˜4Ñ Ô Ð Ð øÝð 	ð 	ð 	ØˆDÝð 	4ð 	4ð 	4Ý�/˜C�/�/­¬
Ð3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð	4øøøð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð ×
Ò
Ñ
Ô
×
#Ò
#Ñ
%Ô
%€CØ
×
Ò
Ñ
Ô
×
#Ò
#Ñ
%Ô
%€CØ
ð ˆsð Øˆˆ˜ˆˆÐØÐ1ˆ3ˆ3˜CÐ0 =Ð1sñ   ÄF Ä.E8Ä?E!ÅE8Å!E%	Å%E8Å(E%	Å)E8Å,F Å8E<Å<F Å?E<Æ F Æ
H*ÆAG>Ç&H*Ç,G>Ç8H*Ç>H*ÈH%ÈH*È%H*È=KÉJ,ÉI ÉJ,É 
JÉ*J,É,	JÉ5JÊJ,ÊJÊJ,Ê KÊ,J0	Ê0KÊ3J0	Ê4KËKË
K)r   r   r   r   )r   r   r   r   )r   r   r   r1   )rG   rH   r   rI   )rQ   r   r   rR   )rQ   rc   r   rc   rg   )ro   rp   r   rq   )r„   r…   r   r†   )rG   rH   r   rï   rÊ  )rG   rH   r   r   )r˜   r   r   r�  )r   r   )r°   r   r   r   )r»  r   r   r   )ZÚ__doc__Ú
__future__r   rZ   r?  rÔ   r\   rÌ  r;  r   Úpathlibr   Útypingr   r   r^  r   rð   r   r  r(   r   r0   rF   rP   rb   rn   rƒ   r/  rx  r€  Ú	frozensetr�  Ú__annotations__r‚  r=  r>  r�  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  ré  rH  rg  rh  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rñ  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  ri  rj  rk  re  rf  rl  rm  rn  ro  rF  rÍ  rß  r²  r   r   ú<module>ræ     sÂ  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à &Ð &Ð &Ð &Ð &Ð &Ø )Ð )Ð )Ð )Ð )Ð )ð ØØØØØØðð €ð?ð ?ð ?ð ?ðNð Nð Nð Nðð ð ð ð80ð 0ð 0ð 0ðð ð ð ð2ð ð ð ð #'ðIð Ið Ið Ið Ið`bð bð bð bðRGð Gð Gð Gð\
ð 
ð 
ð 
ð 3<°)ð =ð =ð =ñ 3ô 3Ð ð ð ð ñ ð> 9B¸	ð 
Cð 
Cð 
Cñ 
9ô 
9Ð %ð 
ð 
ð 
ñ 
ðFð Fð Fð Fð(ð ð ð ð8ð ð ð ð ð  ð  ð  ðFð ð ð ð<ð ð ð ð(ð ð ð ð*ð ð ð ð ð ð ð ðð ð ð ð,\ð \ð \ð \ð2ð ð ð ðDð ð ð ðð ð ð ð&Að Að Að AðHð ð ð ð>*ð *ð *ð *ðZið ið ið iðXð ð ð ðð ð ð ð0ð ð ð ð ð ð ð ð.@ð @ð @ð @ðFð ð ð ðð ð ð ðð ð ð ð,ð ð ð ð  ð  ð  ð  ðFð ð ð ð@ð ð ð ð	ð 	ð 	ð 	ðV"ð V"ð V"ð V"ðrð ð ð ð8""ð ""ð ""ð ""ðJ"ð "ð "ð "ð,"ð "ð "ð "ð,0"ð 0"ð 0"ð 0"ðf"ð "ð "ð "ð8ð ð ð ð$hð hð hð hðVJð Jð Jð JðZ.ð .ð .ð .ðbð ð ð ð(ð ð ð ð$ð ð ð ð"ð ð ð ð	ð 	ð 	ð 	ð,ð ,ð ,ð ,ð^ð ð ð ðF1ð F1ð F1ð F1ðRN1ð N1ð N1ð N1ðb&ð &ð &ð &ðRCð Cð Cð CðTÐ ð0K2ð K2ð K2ð K2ð K2ð K2r   