1.0.1
Fixed (#364)
- Кнопка «Задачи» (бейдж-счётчик в шапке чата и панель) обновляется реактивно, когда список меняет сам агент (#364): WS-событие
todo.updatedотправлял только HTTP-хендлерPUT /api/v1/agents/{id}/todos, а агентские мутации — тулtodo_writeи plan_execute-стратегия (syncPlanTodos/flipTodoStatus) — писали в БД напрямую, без события; UI узнавал об изменениях только после перезагрузки страницы (фронтенд-цепочкаtodo.updated → todosStore.handleUpdated → $state → бейджбыла исправна, но не получала событий от агентских путей). Новая обёрткаtodoBroadcastStore(internal/agent/todo_notify.go, переопределяет толькоReplaceAgentTodos): после успешной замены — best-effort перечитываниеListAgentTodosи колбэк; перечитывание обязательно (паритет сtodo.go) — фронтенд-валидаторisTodoтребуетid/position/created_at/updated_atи молча отбрасывает сконструированный список; ошибка перечитывания не ломает ход агента (Warn + пропуск: замена уже зафиксирована в БД), nil-колбэк — no-op. Wiring:AgentLoop.onTodoChanged+SetOnTodoChanged(зеркалоSetOnFactCreated) →main.go→wsChannel.Hub().BroadcastTodoEvent("todo.updated", …)(общее замыкание сtodoHandler.OnTodoChanged); обёртка подключена вbuildToolsдляtodo_write(покрывает ReAct, шаги плана, субагентов) и в раннере plan_execute (actor.go) — самplan_strategy.goне менялся. Фронтенд-страховка: наturn_end— фоновыйtodosStore.load(самовосстановление бейджа после пропущенных событий, реконнектов WS). Тесты:TestTodoBroadcastStore_*(колбэк с перечитанным списком DB-записей; ошибка re-read → без колбэка и без ошибки замены; nil-колбэк → no-op без перечитывания; ошибка замены → проброс, колбэк и перечитывание не выполняются). Попутная диагностика без изменений кода: повторныеmy checkв одном ходе — 3 идентичных tool_use-блока в одном ответе модели (current_iteration: 0у всех — одна итерация, не ретраи между итерациями), раннер исполняет все вызовы ответа параллельным батчем, анти-луп намеренно exempt’ит repeatable-вызовы (self.go: IsCallRepeatable, дизайн поллинга, #291); потери tool-результатов нет (парность гарантирована); код не менялся по решению пользователя.