0.167.28

Fixed

  • Санитизация ошибок в HTTP-ответах: proxy JSON и raw store-ошибки (#207 — P2). (1) #214 [A-026]: ошибки прокси (errorHandler reverse-proxy, WS-bridge dial-failed и no_remote в internal/connections/proxy.go) собирались через fmt.Fprintf/http.Errorf с сырой подстановкой err.Error() — кавычки, бэкслеши или управляющие символы в тексте ошибки ломали JSON-ответ (незакрытая строка), а http.Error вдобавок маркировал JSON-тело как text/plain. Все три пути переведены на общий writeProxyJSONError (json.NewEncoder, корректный Content-Type: application/json, код 502 сохранён). (2) #207 [A-019]: в todo.go (List/Replace/re-read) и soul.go (Update/ClearEvolved) тело 500-ответа содержало сырое сообщение об ошибке SQLite/Postgres — SQL-фрагменты, имена таблиц, дубликат-ключи (info-leak). По образцу skills.go: generic-сообщение (failed to list/save todos, failed to update soul, failed to clear evolved soul) + полный лог ошибки сервер-side через slog.Error с контекстом (agent_id). Тесты: errorHandler с кавычками/бэкслешами/\n\t в тексте ошибки → тело — валидный JSON, статус 502, Content-Type: application/json; WS-bridge no_remote и dial-failed (закрытый порт) → валидный JSON; todo List/Replace и soul ClearEvolved на закрытом store → 500 с generic-сообщением, в теле нет sql:/database is closed/SQL-ключевых слов.