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.gowsChannel.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-результатов нет (парность гарантирована); код не менялся по решению пользователя.