feat(delegation): structured stall metadata + live per-child status in /agents

Completes #51690 on top of the salvaged #60378 timeout metadata:

- async_delegation: terminal 'stalled' events now carry structured
  stall context (stalled_after_quiet_seconds, stall_threshold_seconds,
  stall_phase idle|in_tool, stall_grace_seconds) on both single and
  batch paths, persisted in the durable row so restart-restored events
  keep it. Mirrors the sync path's timeout_seconds/timed_out_after_
  seconds/timeout_phase from #60378.
- list_async_delegations(): exposes seconds_since_progress and live
  children_activity (per-child api_calls, current_tool,
  seconds_since_activity) sampled from the dispatch's progress_fn
  outside the records lock; private monitor bookkeeping and callables
  never leak.
- /agents (CLI + gateway): background delegations render per-child
  activity rows, quiet-time hints, and the stalling state; gateway
  section is new (previously async delegations were invisible there).
  New locale key gateway.agents.background_delegations in all 17
  catalogs.

Tests: stall-metadata event shape, live-listing projection, gateway
/agents rendering (real registry dispatch, sabotage-verified), sync
timeout metadata fields, non-timeout None contract.
This commit is contained in:
teknium1
2026-07-26 16:32:49 -07:00
committed by Teknium
parent 8e163852d8
commit b792bd0529
23 changed files with 465 additions and 14 deletions
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... en nog {count}"
running_processes: "**Lopende agtergrondprosesse:** {count}"
async_jobs: "**Asinchrone werke van die gateway:** {count}"
background_delegations: "**Agtergrond-delegasies:** {count}"
none: "Geen aktiewe agente of lopende take nie."
state_starting: "begin"
state_running: "loop"
+1
View File
@@ -58,6 +58,7 @@ gateway:
more: "... و{count} آخر"
running_processes: "**العمليات الخلفية الجارية:** {count}"
async_jobs: "**مهام البوابة غير المتزامنة:** {count}"
background_delegations: "**التفويضات في الخلفية:** {count}"
none: "لا يوجد وكلاء نشطون أو مهام جارية."
state_starting: "قيد البدء"
state_running: "قيد التشغيل"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... und {count} weitere"
running_processes: "**Laufende Hintergrundprozesse:** {count}"
async_jobs: "**Gateway-Async-Jobs:** {count}"
background_delegations: "**Hintergrund-Delegationen:** {count}"
none: "Keine aktiven Agenten oder laufenden Aufgaben."
state_starting: "startet"
state_running: "läuft"
+1
View File
@@ -68,6 +68,7 @@ gateway:
more: "... and {count} more"
running_processes: "**Running background processes:** {count}"
async_jobs: "**Gateway async jobs:** {count}"
background_delegations: "**Background delegations:** {count}"
none: "No active agents or running tasks."
state_starting: "starting"
state_running: "running"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... y {count} más"
running_processes: "**Procesos en segundo plano en ejecución:** {count}"
async_jobs: "**Tareas asíncronas del gateway:** {count}"
background_delegations: "**Delegaciones en segundo plano:** {count}"
none: "No hay agentes activos ni tareas en ejecución."
state_starting: "iniciando"
state_running: "en ejecución"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... et {count} de plus"
running_processes: "**Processus d'arrière-plan en cours :** {count}"
async_jobs: "**Tâches asynchrones du gateway :** {count}"
background_delegations: "**Délégations en arrière-plan :** {count}"
none: "Aucun agent actif ni tâche en cours."
state_starting: "démarrage"
state_running: "en cours"
+1
View File
@@ -57,6 +57,7 @@ gateway:
more: "... agus {count} eile"
running_processes: "**Próisis chúlra ag rith:** {count}"
async_jobs: "**Tascanna asincrónacha gateway:** {count}"
background_delegations: "**Tarmligin sa chúlra:** {count}"
none: "Níl aon ghníomhairí gníomhacha ná tascanna ag rith."
state_starting: "ag tosú"
state_running: "ag rith"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... és még {count}"
running_processes: "**Futó háttérfolyamatok:** {count}"
async_jobs: "**Átjáró aszinkron feladatai:** {count}"
background_delegations: "**Háttérdelegálások:** {count}"
none: "Nincsenek aktív ügynökök vagy futó feladatok."
state_starting: "indul"
state_running: "fut"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... e {count} altri"
running_processes: "**Processi in background in esecuzione:** {count}"
async_jobs: "**Job asincroni del gateway:** {count}"
background_delegations: "**Delegazioni in background:** {count}"
none: "Nessun agente attivo o attività in esecuzione."
state_starting: "in avvio"
state_running: "in esecuzione"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... 他に {count} 件"
running_processes: "**実行中のバックグラウンドプロセス:** {count}"
async_jobs: "**ゲートウェイ非同期ジョブ:** {count}"
background_delegations: "**バックグラウンド委任:** {count}"
none: "アクティブなエージェントや実行中のタスクはありません。"
state_starting: "起動中"
state_running: "実行中"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... 외 {count}개 더"
running_processes: "**실행 중인 백그라운드 프로세스:** {count}"
async_jobs: "**게이트웨이 비동기 작업:** {count}"
background_delegations: "**백그라운드 위임:** {count}"
none: "활성 에이전트나 실행 중인 작업이 없습니다."
state_starting: "시작 중"
state_running: "실행 중"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... e mais {count}"
running_processes: "**Processos em segundo plano em execução:** {count}"
async_jobs: "**Tarefas assíncronas do gateway:** {count}"
background_delegations: "**Delegações em segundo plano:** {count}"
none: "Não há agentes ativos nem tarefas em execução."
state_starting: "a iniciar"
state_running: "em execução"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... и ещё {count}"
running_processes: "**Выполняющиеся фоновые процессы:** {count}"
async_jobs: "**Асинхронные задачи шлюза:** {count}"
background_delegations: "**Фоновые делегирования:** {count}"
none: "Нет активных агентов или выполняющихся задач."
state_starting: "запускается"
state_running: "выполняется"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... ve {count} tane daha"
running_processes: "**Çalışan arka plan süreçleri:** {count}"
async_jobs: "**Gateway asenkron işleri:** {count}"
background_delegations: "**Arka plan delegasyonları:** {count}"
none: "Aktif ajan veya çalışan görev yok."
state_starting: "başlatılıyor"
state_running: "çalışıyor"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... і ще {count}"
running_processes: "**Фонові процеси, що виконуються:** {count}"
async_jobs: "**Асинхронні задачі гейтвея:** {count}"
background_delegations: "**Фонові делегування:** {count}"
none: "Немає активних агентів або задач."
state_starting: "запускається"
state_running: "виконується"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... 還有 {count} 個"
running_processes: "**執行中的背景程序:** {count}"
async_jobs: "**閘道非同步任務:** {count}"
background_delegations: "**背景委派:** {count}"
none: "沒有作用中的代理或執行中的任務。"
state_starting: "啟動中"
state_running: "執行中"
+1
View File
@@ -53,6 +53,7 @@ gateway:
more: "... 还有 {count} 个"
running_processes: "**运行中的后台进程:** {count}"
async_jobs: "**网关异步任务:** {count}"
background_delegations: "**后台委派:** {count}"
none: "没有活跃的代理或运行中的任务。"
state_starting: "启动中"
state_running: "运行中"