tasks/¶
Delegated background task system (TaskHub) for long-running autonomous work.
Files¶
tasks/hub.py: task lifecycle (submit/run/resume/question/cancel/shutdown)tasks/registry.py: persistent registry + task-folder seeding + cleanup/deletetasks/models.py:TaskSubmit,TaskEntry,TaskInFlight,TaskResultorchestrator/selectors/task_selector.py:/tasksUI callbacks (tsc:*)_home_defaults/workspace/tools/task_tools/*.py: CLI tools (create,resume,ask_parent,list,cancel,delete)
Purpose¶
Run long work asynchronously while keeping parent chat responsive.
High-level flow:
- create (
/tasks/create) - execute (
TaskHub._run) - optional question (
/tasks/ask_parent) - optional resume (
/tasks/resume) - result delivery + parent-session injection
- optional permanent deletion (
/tasks/delete)
Persistence and folders¶
Main-home task data:
- registry:
~/.sygen/tasks.json - folders:
~/.sygen/workspace/tasks/<task_id>/
Task folder seeds include:
TASKMEMORY.mdCLAUDE.md,AGENTS.md,GEMINI.md
Startup/maintenance behavior:
- stale
runningentries -> downgraded tofailed - orphan entries/folders are cleaned
- periodic orphan cleanup runs every 5 hours
Config (AgentConfig.tasks)¶
enabledmax_parallel(per chat)timeout_seconds
Execution model (TaskHub)¶
submit(TaskSubmit):
- resolves chat ID from
parent_agentmapping when missing - creates registry entry and folder
- appends mandatory task rules suffix
- spawns async execution
_run(...):
- builds
AgentRequestwithprocess_label=task:<task_id> - applies provider/model overrides when supplied
- persists resolved provider/model on first run
- updates status:
donewaiting(question asked)failedcancelled
Resume behavior:
- allowed from
done|failed|cancelled|waiting - requires stored
session_idand provider - keeps same
task_idand folder
Topic-aware routing¶
Tasks preserve topic context:
TaskEntry.thread_idstores origin topic/threadcreate_task.pyforwardsSYGEN_CHAT_IDandSYGEN_TOPIC_IDto/tasks/create- result/question envelopes map
thread_id -> topic_id - parent-session injection resumes the correct topic session
InternalAgentAPI endpoints¶
POST /tasks/createPOST /tasks/resumePOST /tasks/ask_parentGET /tasks/listPOST /tasks/cancelPOST /tasks/delete
Behavior details:
- no task hub attached ->
503for mutating endpoints (/tasks/listreturns empty list) /tasks/list?from=<agent>filters by task owner- ownership checks for
/tasks/resume,/tasks/cancel,/tasks/deletewhenfromis provided /tasks/deleteonly deletes finished tasks (done|failed|cancelled)
Registry deletion semantics¶
TaskRegistry.delete(task_id):
- returns
Falseif task is missing or not in a finished state - removes both registry entry and task folder
- resolves folder path before entry removal (prevents per-agent folder resolution bug)
Bulk cleanup path:
cleanup_finished(chat_id=None)removes all finished tasks
Telegram UX (/tasks)¶
/tasks is quick-command routed and renders selector UI:
- sections: Running, Waiting for answer, Finished
- callbacks (
tsc:*): refresh, cancel one, cancel all, delete finished - if disabled:
Task system is not enabled.
Tool scripts¶
From task agent context:
create_task.pyresume_task.pyask_parent.pylist_tasks.pycancel_task.pydelete_task.py
delete_task.py TASK_ID performs permanent removal of one finished task via /tasks/delete.