+
    lHàjs^  ã                  ó.  € R t ^ RIHt ^ RIHt ^ RIHtHt RtRt	R R lt
R R	 ltR
 R lt]! RRR]
! R]4      /. 4      t]! RRR]
! RR4      RRRR. ]P                  ! 4       O]NRR/R]
! RR4      R]
! RR4      R]
! RR 4      /. 4      t]! R!R"R]
! R]4      R#]
! RR$4      R%]
! R&R'4      R(]
! RR)4      R*RR+R,RR/RR-/R.RR+R,RR/RR///. 4      t]! R0R1R]
! R]4      R2]
! RR34      R4RRR. R�ORR5//R2.4      t]! R6R7R]
! R]4      R2]
! RR84      /. 4      t]! R9R:R]
! R]4      R#]
! RR;4      R<]
! RR=4      R%RR&RR>R?R@/R.RR+R,RR/RRA//R#.4      t]! RBRCR]
! R]4      R2]
! RRD4      /R2.4      t]! RERFR]
! R]4      RG]
! RRH4      /. 4      t]! RIRJR]
! RRK4      RL]
! RRM4      /RRL.4      t]! RNROR]
! R]4      RP]
! RRQ4      RRRRRRS/RT]
! RRU4      /RPRR.4      t]! RVRWR]
! R]4      RX]
! RRY4      RP]
! RRZ4      RT]
! RR[4      /RX.4      t]! R\R]R]
! R]4      /. 4      t]! R^R_/ R`]
! RRa4      bR]
! RRb4      bRL]
! RRc4      bRdRR+R,RR/RRe/bR]
! RRf4      bRg]
! RRh4      bRiRRR. R�ORRj/bRk]
! RRl4      bRm]
! RRn4      bRo]
! RRp4      bRq]
! RRr4      bRs]
! RRt4      bRuRRRRvRw.RRx/bRyRR+R,RR/RRz/bR{]
! RR|4      bR}]
! RR~4      bR]
! RR€4      bR�]
! RR‚4      Rƒ]
! RR„4      /CR`R.4      t]! R…R†R]
! RR‡4      /R.4      t]! RˆR‰RŠRRRR‹/RŒRRRR�//RŠRŒ.4      tRŽ# )‘zLTool schemas for tools.kanban_tools (model-facing; strings are byte-frozen).)Úannotations)ÚAny)ÚARCHIVEDÚDEFAULT_WORKFLOWu  Task id. If omitted, defaults to HERMES_KANBAN_TASK from the env â€” the task the dispatcher spawned you to work on. That default only exists for a dispatcher-spawned worker; any other caller has no default and must pass an explicit task_id (use kanban_list to discover ids).uX  Kanban board slug to target. When omitted, the call resolves the active board the usual way: HERMES_KANBAN_DB env â†’ HERMES_KANBAN_BOARD env â†’ the 'current' symlink under the kanban home â†’ 'default'. Pass an explicit slug only when the caller (e.g. a Telegram routing layer) needs to override the env-pinned active board for this one call.c               ó$   € V ^8„  d   QhRRRRRR/# )é   Útype_ÚstrÚdescriptionÚreturnúdict[str, str]© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/tools/kanban_tools_schemas.pyÚ__annotate__r      s!   € ÷ 7ñ 7�ð 7 3ð 7¨>ñ 7ó    c                ó   € R V RV/# )Útyper
   r   )r   r
   s   &&r   Ú_propr      s   € Ø�E˜=¨+Ð6Ð6r   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r      s   € ÷ (ñ (˜Nñ (r   c                 ó"   € \        R\        4      # )zJSchema fragment for the optional ``board`` parameter (one place to tweak).Ústring)r   Ú_DESC_BOARDr   r   r   Ú_board_schema_propr      s   € ä�œ;Ó'Ð'r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Únamer	   r
   Ú
propertieszdict[str, Any]Úrequiredz	list[str]r   r   )r   s   "r   r   r   "   s0   € ÷ 
ñ 
�#ð 
 Cð 
°^ð 
Èyð 
Ð]kñ 
r   c                ó:   € RV RVRRRR/ VCR\        4       /CRV//# )	zLBuild a tool schema; every kanban tool takes an optional trailing ``board``.r   r
   Ú
parametersr   Úobjectr   Úboardr   )r   )r   r
   r   r   s   &&&&r   Ú_schemar"   "   s@   € ð 	�Ø�{ØØ�HØÐG˜ZÐG¨Ô2DÓ2FÑGØ˜ð
ðð r   Úkanban_showuÕ  Read a task's full state â€” title, body, assignee, parent task handoffs, your prior attempts on this task if any, comments, and recent events. Use this to (re)orient yourself before starting work, especially on retries. The response includes a pre-formatted ``worker_context`` string suitable for inclusion verbatim in your reasoning. Outside a dispatcher-spawned worker there is no default task: a bare call returns a pointer to ``kanban_list`` instead of task state.Útask_idr   Úkanban_listuÞ  List Kanban task summaries so an orchestrator profile can discover work to route. Supports the same core filters as the CLI: assignee, status, tenant, include_archived, and limit. Returns compact rows with ids, title, status, assignee, priority, parent/child ids, and counts. Bounded to 50 rows by default, 200 max, with truncation metadata. Also recomputes ready tasks before listing, matching the CLI. Orchestrator-only â€” dispatcher-spawned task workers never see this tool.Úassigneez!Optional assignee/profile filter.Ústatusr   Úenumr
   zOptional task status filter.Útenantz)Optional tenant/project namespace filter.Úinclude_archivedÚbooleanz*Include archived tasks. Defaults to false.ÚlimitÚintegerz6Optional maximum rows to return (default 50, max 200).Úkanban_completeuh  Mark your current task done with a structured handoff for downstream workers and humans. Prefer ``summary`` for a human-readable 1-3 sentence description of what you did; put machine-readable facts in ``metadata`` (changed_files, tests_run, decisions, findings, etc). At least one of ``summary`` or ``result`` is required. If you created new tasks via ``kanban_create`` during this run, list their ids in ``created_cards`` â€” the kernel verifies them so phantom references are caught before they leak into downstream automation. If you produced deliverable files (charts, PDFs, spreadsheets, generated images), list their absolute paths in ``artifacts`` â€” the gateway notifier will upload them as native attachments to the human who subscribed to the task, so the deliverable lands in their chat alongside the summary instead of being a path they have to fetch by hand.ÚsummaryzrHuman-readable handoff, 1-3 sentences. Appears in Run History on the dashboard and in downstream workers' context.Úmetadatar    u­   Free-form dict of structured facts about this attempt â€” {"changed_files": [...], "tests_run": 12, "findings": [...]}. Surfaced to downstream workers alongside ``summary``.Úresultz°Short result log line (legacy field, maps to task.result). Use ``summary`` instead when possible; this exists for compatibility with callers that still set --result on the CLI.Úcreated_cardsÚarrayÚitemsu·  Optional structured manifest of task ids you created via ``kanban_create`` during this run. The kernel verifies each id exists and was created by this worker's profile; any phantom id blocks the completion with an error listing what went wrong (auditable in the task's events). Only list ids you got back from a successful ``kanban_create`` call â€” do not invent or remember ids from prose. Omit the field if you did not create any cards.Ú	artifactsuê  Optional list of absolute paths to deliverable files you produced during this run â€” generated charts, PDFs, spreadsheets, images, archives. Examples: ["~/.hermes/cache/scratch/q3-revenue.png", "~/.hermes/cache/scratch/report.pdf"]. The gateway notifier uploads each path as a native attachment to the subscribed chat (images embed inline, everything else uploads as a file) so the deliverable lands with the completion notification. Skip intermediate scratch files and references that are not the deliverable. The path must exist on disk at completion. Files inside a managed scratch workspace are copied to durable task attachments before cleanup; a missing declared scratch artifact keeps the task in-flight so you can fix the path and retry.Úkanban_blockuq  Stop work on this task and route it according to WHY you're stuck. Set ``kind`` to say which: 'dependency' (waiting on another task â€” goes to todo and auto-resumes when that task finishes, no human needed), 'needs_input' (you need a human decision/answer), 'capability' (a hard wall: no access, missing credentials, an action no agent can do), or 'transient' (a flaky failure that may clear). ``reason`` is shown to the human on the board. If a task keeps getting unblocked and re-blocked for the same reason, it is auto-escalated to triage. Use for genuine blockers only â€” don't block on things you can resolve yourself.Úreasonz¥What you need answered or what stopped you, in one or two sentences. Don't paste the whole conversation; the human has the board and can ask follow-ups via comments.ÚkindzàWhy you're blocked. 'dependency' waits in todo and resumes automatically when an incomplete parent finishes; if no parent is open it is recorded as needs_input instead. The others surface to a human. Omit only if none apply.Úkanban_schedulea&  Park your current task in the 'scheduled' state while it waits for time or an external event. This ends the current run and makes the task non-dispatchable until an orchestrator unblocks it; it does not create a timer. Put any wake-up marker such as ``SCHEDULED_UNTIL=<ISO8601>`` in ``reason``.zeOptional reason or machine-readable wake-up marker recorded on the completed run and scheduled event.Úkanban_request_reviewuï  Hand the task off for review: implementation, self-review, and verification are complete and you want a human (or reviewer) to look before it is marked done. Moves the task to the 'review' column and notifies the subscriber. Unlike ``kanban_block`` this is NOT a blocker â€” it never counts toward unblock-loop detection, so a task can cycle through review across follow-ups without ever being falsely escalated to triage. Use this instead of blocking with a free-form 'review-required:' reason.u£   What was implemented and how it was verified, in one or two sentences â€” shown to the reviewer. Don't paste the whole diff; the reviewer has the board and the PR.ÚreviewerzhOptional reviewer profile. When provided, the task is reassigned to that profile before review dispatch.zkOptional structured handoff facts for the reviewer, such as changed_files, tests_run, commit, or decisions.ÚadditionalPropertiesTuH  Optional list of absolute paths to deliverable files this handoff names â€” generated charts, PDFs, spreadsheets, images, archives. Examples: ['~/.hermes/cache/scratch/q3-revenue.png', '~/.hermes/cache/scratch/report.pdf']. A review handoff is the last implementer transition, so the kernel copies these into the task's durable attachments before the reviewer's completion cleans the scratch workspace up, and the gateway notifier uploads them as native attachments to the subscribed chat. A missing declared scratch artifact keeps the task in place so you can fix the path and retry.Úkanban_request_changesaQ  Reviewer verdict: return the current review run to the original implementer with concrete required changes. This closes the review run, reapplies parent dependency gating, and requeues the task without using block-loop accounting. Only use from a task claimed from the review column; use kanban_block only for a genuine external blocker.zXSpecific, actionable changes the implementer must make before requesting another review.Úkanban_heartbeatuÊ   Signal that you're still alive during a long operation (training, encoding, large crawls). Call every few minutes so humans see liveness separately from PID checks. Pure side effect â€” no work changes.ÚnotezHOptional short note describing current progress. Shown in the event log.Úkanban_commentuã   Append a comment to a task's thread. Use for durable notes that should outlive this run (questions for the next worker, partial findings, rationale). Ephemeral reasoning doesn't belong here â€” use your normal response instead.u±   Task id. Required (may be your own task or another's â€” comment threads are per-task). Outside a dispatcher-spawned worker there is no default; use kanban_list to discover ids.Úbodyz Markdown-supported comment body.Úkanban_attachu]  Attach a file to a task by passing its bytes inline (base64). Use for genuine file artifacts the next worker or a human should be able to download â€” generated reports, images, exports. The file is stored as a real attachment (not a comment link) under the task's attachments dir, capped at 25 MB. Prefer kanban_attach_url when you only have a URL.ÚfilenamezjFile name to store it under (e.g. 'report.pdf'). Directory components are stripped; only the leaf is kept.Úcontent_base64z5The file contents, base64-encoded. Max 25 MB decoded.Úcontent_typez,Optional MIME type (e.g. 'application/pdf').Úkanban_attach_urluË   Attach a file to a task by URL â€” Hermes downloads it server-side and stores it as a real attachment (capped at 25 MB). Use when you have a link rather than the bytes. Only http/https URLs are accepted.Úurlzhttp(s) URL to fetch and store.zKOptional name to store it under. Defaults to the URL path's leaf component.zMOptional MIME type override. Defaults to the Content-Type the server returns.Úkanban_attachmentsz�List the files attached to a task: id, filename, content_type, size, who uploaded it, and the absolute on-disk path you can read.Úkanban_createuc  Create a new kanban task, optionally as a child of the current one (pass the current task id in ``parents``). Used by orchestrator workers to fan out â€” decompose work into child tasks with specific assignees, link them into a pipeline, then complete your own task. The dispatcher picks up the new tasks on its next tick and spawns the assigned profiles.ÚtitlezShort task title (required).u”   Profile name that should execute this task (e.g. 'researcher-a', 'reviewer', 'writer'). Required â€” tasks without an assignee are never dispatched.zkOpening post: full spec, acceptance criteria, links. The assigned worker reads this as part of its context.ÚparentszÅParent task ids. The new task stays in 'todo' until every parent reaches 'done'; then it auto-promotes to 'ready'. Typical fan-in: list all the researcher task ids when creating a synthesizer task.zUOptional namespace for multi-project isolation. Defaults to HERMES_TENANT env if set.ÚpriorityzZDispatcher tiebreaker. Higher = picked sooner when multiple ready tasks share an assignee.Úworkspace_kindzŒWorkspace flavor: 'scratch' (fresh tmp dir, default), 'dir' (shared directory, requires absolute workspace_path), 'worktree' (git worktree).Úworkspace_pathzYAbsolute path for 'dir' or 'worktree' workspace. Relative paths are rejected at dispatch.ÚprojectzÍOptional project id or slug to link the task to. When set, the task becomes a git worktree under the project's primary repo with a deterministic branch (project slug + task id), instead of a random branch.Útriageu   If true, task lands in 'triage' instead of 'todo' â€” a specifier profile is expected to flesh out the body before work starts.Úidempotency_keyz�If a non-archived task with this key already exists, return that task's id instead of creating a duplicate. Useful for retry-safe automation.Úmax_runtime_secondszxPer-task runtime cap. When exceeded, the dispatcher SIGTERMs the worker and re-queues the task with outcome='timed_out'.Úinitial_statusÚrunningÚblockedzÈInitial card status. Use 'blocked' for tasks that require immediate human ops (R3 gate) to skip the brief running-to-blocked transition. Defaults to 'running', which preserves the usual dispatch path.Úskillsu:  Skill names to force-load into the dispatched worker. The kanban lifecycle is already injected automatically; use this to pin a task to a specialist context â€” e.g. ['translation'] for a translation task, ['github-code-review'] for a reviewer task. The names must match skills installed on the assignee's profile.Ú	goal_modeaÖ  Run the dispatched worker in a goal loop. When true, after each turn an auxiliary judge checks the worker's response against this card's title/body; if the work isn't done and budget remains, the worker keeps going in the same session until the judge agrees it's complete (or the goal-turn budget is exhausted, which blocks the task for human review). Use this for open-ended cards where one shot rarely finishes the work. Defaults to false (classic single-shot worker).Úcompletion_contractzØDeclare at creation: local-only (default), OWNER/REPO for PR publication, or an exact GitHub PR URL. PR tasks cannot complete until repository-required exact-head CI passes. On publication pass metadata.published_pr.Úgoal_max_turnszÊTurn budget for goal_mode workers. Caps how many continuation turns the worker may take before the task is blocked for review. Ignored unless goal_mode is true. Defaults to the goal-engine default (20).Úmodelz²Pin the dispatched worker to this model instead of the assignee profile's configured model. Use the exact model name the target provider expects. Omit to use the profile default.Úprovideru   Provider the 'model' belongs to (e.g. 'openrouter', 'anthropic', 'nous'). Set this whenever the model is not from the assignee profile's configured provider â€” a model name alone is resolved against the profile's provider and will fail if it belongs to a different one. Requires 'model'.Úkanban_unblockuô   Unblock a Kanban task. It moves to ready when all parents are done, or todo while any parent remains open. Orchestrator-only â€” only profiles with the kanban toolset can unblock routed work; dispatcher-spawned task workers never see this tool.z6Blocked task id to move to ready or parent-gated todo.Úkanban_linku  Add a parentâ†’child dependency edge after both tasks already exist. The child won't promote to 'ready' until all parents are 'done'. Cycles and self-links are rejected. A running child is rejected unless the active owning worker is linking its own card for a dependency handoff.Ú	parent_idzParent task id.Úchild_idzChild task id.N)Ú
dependencyÚneeds_inputÚ
capabilityÚ	transient)ÚscratchÚdirÚworktree)Ú__doc__Ú
__future__r   Útypingr   Úhermes_cli.kanban_workflowr   r   Ú_DESC_TASK_ID_DEFAULTr   r   r   r"   ÚKANBAN_SHOW_SCHEMAÚkeysÚKANBAN_LIST_SCHEMAÚKANBAN_COMPLETE_SCHEMAÚKANBAN_BLOCK_SCHEMAÚKANBAN_SCHEDULE_SCHEMAÚKANBAN_REQUEST_REVIEW_SCHEMAÚKANBAN_REQUEST_CHANGES_SCHEMAÚKANBAN_HEARTBEAT_SCHEMAÚKANBAN_COMMENT_SCHEMAÚKANBAN_ATTACH_SCHEMAÚKANBAN_ATTACH_URL_SCHEMAÚKANBAN_ATTACHMENTS_SCHEMAÚKANBAN_CREATE_SCHEMAÚKANBAN_UNBLOCK_SCHEMAÚKANBAN_LINK_SCHEMAr   r   r   Ú<module>r|      sL  ðÙ RÝ "å ç AðBð ðð õ7õ(õ

ñ Øð	1ð 	‘5˜Ð#8Ó9ðð óÐ ñ$ Øð	ð 	‘E˜(Ð$GÓHØØ�HØÐ8Ð&×+Ò+Ó-Ð8¨xÐ8ØÐ9ð
ð
 	‘%˜Ð"MÓNØ™E )Ð-YÓZØ‘�yÐ"ZÓ[ð
ð ó/Ð ñ4 !Øð	>ð" 	‘5˜Ð#8Ó9Ø‘5˜ð$óð
 	‘E˜(ð1óð 	‘%˜ð>óð 	Ø�GØ�f˜hÐ'Øð	,ð	
ð  	Ø�GØ�f˜hÐ'ØðDð	
ðG8ðr óYMÐ ñ^ Øð		4ð 	‘5˜Ð#8Ó9Ø‘%˜ðKóð
 	Ø�HØÒLØðJð		
ðð$ €JóA!Ð ñF !Øð	7ð 	‘5˜Ð#8Ó9Ø‘%˜ð5óðð ó!Ð ñ(  'Øð	/ð 	‘5˜Ð#8Ó9Ø‘5˜ðIóð
 	‘E˜(ðEóð 	Ø�HØðEð # Dð
ð 	Ø�GØ�f˜hÐ'Øð5ð	
ð'%ðL €Kóe3 Ð ñj !(Øð	Oð 	‘5˜Ð#8Ó9Ø‘%˜ð4óðð €Jó!!Ð ñ& "Øð	&ð 	‘5˜Ð#8Ó9Ø‘�hð*óðð óÐ ñ$  Øð	<ð 	‘5˜ð/óð 	‘�hÐ BÓCðð �Ðó#Ð ñ( Øð	6ð 	‘5˜Ð#8Ó9Ø‘E˜(ðLóð 	Ø�HØÐRð
ð 	™˜hÐ(VÓWðð Ð!Ð"ó-Ð ñ2 #Øð	ð 	‘5˜Ð#8Ó9Ø‰u�XÐ@ÓAØ‘E˜(ð)óð 	™˜hð3óðð €Gó)Ð ñ. $Øð	Mð 	‘5˜Ð#8Ó9ðð ó
Ð ñ Øð	Cð|Ø‘�xÐ!?Ó@ð|à‘E˜(ðóð|ð 	‘�hðóð|ð 	Ø�GØ�f˜hÐ'Øð$ð	

ð|ð0 	‘%˜ð8óð1|ð8 	‘E˜)ð?óð9|ð@ 	Ø�HØÒ2ØðGð	
ðA|ðR 	™% ð;óðS|ðZ 	‘5˜ð8óð[|ðf 	‘%˜	ð/óðg|ðp 	™5 ðAóðq|ðz 	™u Yð1ó ð{|ðD 	Ø�HØ�Y 	Ð*ØðFð		
ðE|ðX 	Ø�GØ�f˜hÐ'Øð&ð	
ðY|ðr 	‘U˜9ðHó
ðs|ðH 	™u XðBó ðI|ðP 	™% 	ðBóðQ|ð\ 	‘�xð.óð 	‘E˜(ð8óñi|ðz ˆjÐóOHÐ ñT  Øð	?ð 	‘5˜Ð#[Ó\ðð €KóÐ ñ Øð	)ð 	�f˜h¨Ð7HÐIØ�f˜h¨Ð7GÐHðð �*ÐóÒ r   