From 28e880d7b68ec00b38d3ba9bb512af1b96b82991 Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Sat, 2 May 2026 15:27:40 -0300 Subject: [PATCH] =?UTF-8?q?feat(captain/hermes-builder):=20aba=20Verifica?= =?UTF-8?q?=C3=A7=C3=A3o=20com=2022+=20checks=20+=20reparo=20autom=C3=A1ti?= =?UTF-8?q?co?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UI nova dentro do Construtor (Hermes) — TabBar com Chat e Verificação. Verificação roda HermesBuilder::Validator (DB+runtime) e exibe resultado agrupado por categoria, com botão Refazer inline em FAIL/WARN reparáveis. Backend (porta dos checks DB do CLI bin/hermes-validate): - HermesBuilder::Validator com 22+ checks: engine, profile, port, secret, parent, unit, Brand, CaptainInbox sync (o bug que travou Juliana), pricing dry-run, Inter creds, typing/response_delay, registry MCP completo. - HermesBuilder::Repairer com 4 handlers automáticos: set_engine_hermes, sync_captain_inbox_unit, set_default_typing_delay, set_default_response_delay. - Endpoints novos: GET assistants, GET validate?slug=, POST repair. Frontend: - builder/Index.vue: wrapper com TabBar. - builder/BuilderChat.vue: extraído do Index original. - builder/BuilderVerification.vue: dropdown + Conferir agora + lista agrupada por categoria com badges + botão Refazer inline. i18n: keys em pt_BR e en sob CAPTAIN_HERMES_BUILDER.VERIFY.*. Filesystem/systemd checks ficam pro CLI hermes-validate (Rails container não enxerga /root/.hermes/profiles do host). Validado HTTP: GET /validate?slug=juliana_qnn1 → 28 PASS / 0 FAIL / 1 WARN. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dashboard/api/captain/hermesBuilder.js | 12 + .../dashboard/i18n/locale/en/captain.json | 31 +- .../dashboard/i18n/locale/pt_BR/captain.json | 31 +- .../dashboard/captain/builder/BuilderChat.vue | 362 ++++++++++++++ .../captain/builder/BuilderVerification.vue | 443 ++++++++++++++++++ .../dashboard/captain/builder/Index.vue | 372 +-------------- config/routes.rb | 3 + .../captain/hermes_builder_controller.rb | 27 ++ .../app/services/hermes_builder/repairer.rb | 87 ++++ .../app/services/hermes_builder/validator.rb | 199 ++++++++ 10 files changed, 1219 insertions(+), 348 deletions(-) create mode 100644 app/javascript/dashboard/routes/dashboard/captain/builder/BuilderChat.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/builder/BuilderVerification.vue create mode 100644 enterprise/app/services/hermes_builder/repairer.rb create mode 100644 enterprise/app/services/hermes_builder/validator.rb diff --git a/app/javascript/dashboard/api/captain/hermesBuilder.js b/app/javascript/dashboard/api/captain/hermesBuilder.js index cea68963f..47853be2b 100644 --- a/app/javascript/dashboard/api/captain/hermesBuilder.js +++ b/app/javascript/dashboard/api/captain/hermesBuilder.js @@ -21,6 +21,18 @@ class HermesBuilder extends ApiClient { reset() { return axios.delete(`${this.url}/reset`); } + + fetchAssistants() { + return axios.get(`${this.url}/assistants`); + } + + validate(slug) { + return axios.get(`${this.url}/validate`, { params: { slug } }); + } + + repair(slug, repairId) { + return axios.post(`${this.url}/repair`, { slug, repair_id: repairId }); + } } export default new HermesBuilder(); diff --git a/app/javascript/dashboard/i18n/locale/en/captain.json b/app/javascript/dashboard/i18n/locale/en/captain.json index 08b88f46a..0704405d8 100644 --- a/app/javascript/dashboard/i18n/locale/en/captain.json +++ b/app/javascript/dashboard/i18n/locale/en/captain.json @@ -905,6 +905,35 @@ "SESSION_LABEL": "Session:", "SEND_FAILED": "Send failed: {message}", "RESET_FAILED": "Failed to clear session.", - "START": "Start creation" + "START": "Start creation", + "TAB_CHAT": "Chat (Builder)", + "TAB_VERIFY": "Verification", + "VERIFY": { + "TITLE": "Agent verification", + "DESCRIPTION": "Runs health checks (database, routing, pricing, MCP) for a Hermes agent. For each failure with a Repair button, the UI attempts an automatic fix. Other failures need hermes-provision on the VPS.", + "NO_ASSISTANTS": "No Hermes agents registered", + "RUN": "Run check", + "RUNNING": "Checking...", + "REPAIR": "Repair", + "REPAIRING": "Repairing...", + "OK_LABEL": "OK", + "FAILS_LABEL": "failures", + "WARN_LABEL": "warnings", + "OF_TOTAL": "of {total} checks", + "VERDICT_PASS": "Ready to ship", + "VERDICT_FAIL": "Critical failures — fix first", + "EMPTY": "Select an agent and click Run check to start verification.", + "EMPTY_RESULTS": "No checks returned — agent removed?", + "REPAIR_FAILED": "Failed: {message}", + "REPAIR_OK": "Repaired: {message}", + "FETCH_FAILED": "Error loading assistants: {message}", + "VALIDATE_FAILED": "Validation failed: {message}", + "CATEGORY_DB": "Database", + "CATEGORY_PRICING": "Pricing", + "CATEGORY_ROUTING": "Captain → Hermes routing", + "CATEGORY_HUMANIZATION": "Humanization (typing/delay/gallery)", + "CATEGORY_MCP": "Registered MCP tools", + "CATEGORY_OTHER": "Other" + } } } \ No newline at end of file diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/captain.json b/app/javascript/dashboard/i18n/locale/pt_BR/captain.json index cbbc6c9a2..abc7825e6 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/captain.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/captain.json @@ -906,6 +906,35 @@ "SESSION_LABEL": "Sessão:", "SEND_FAILED": "Erro ao enviar: {message}", "RESET_FAILED": "Falha ao limpar sessão.", - "START": "Iniciar criação" + "START": "Iniciar criação", + "TAB_CHAT": "Chat (Construtor)", + "TAB_VERIFY": "Verificação", + "VERIFY": { + "TITLE": "Verificação de agente", + "DESCRIPTION": "Roda os checks de saúde (banco, roteamento, preços, MCP) de um agente Hermes. Para cada falha com botão Refazer, a UI tenta corrigir automaticamente. Demais falhas precisam de hermes-provision na VPS.", + "NO_ASSISTANTS": "Nenhum agente Hermes cadastrado", + "RUN": "Conferir agora", + "RUNNING": "Conferindo...", + "REPAIR": "Refazer", + "REPAIRING": "Reparando...", + "OK_LABEL": "OK", + "FAILS_LABEL": "falhas", + "WARN_LABEL": "atenção", + "OF_TOTAL": "de {total} checks", + "VERDICT_PASS": "Pode soltar", + "VERDICT_FAIL": "Há falhas críticas — corrija antes", + "EMPTY": "Selecione um agente e clique em Conferir agora pra rodar a verificação.", + "EMPTY_RESULTS": "Sem checks retornados — o agente foi removido?", + "REPAIR_FAILED": "Falha: {message}", + "REPAIR_OK": "Reparado: {message}", + "FETCH_FAILED": "Erro carregando assistentes: {message}", + "VALIDATE_FAILED": "Falha ao validar: {message}", + "CATEGORY_DB": "Banco de dados", + "CATEGORY_PRICING": "Preços", + "CATEGORY_ROUTING": "Roteamento Captain → Hermes", + "CATEGORY_HUMANIZATION": "Humanização (typing/delay/galeria)", + "CATEGORY_MCP": "Tools MCP registradas", + "CATEGORY_OTHER": "Outros" + } } } \ No newline at end of file diff --git a/app/javascript/dashboard/routes/dashboard/captain/builder/BuilderChat.vue b/app/javascript/dashboard/routes/dashboard/captain/builder/BuilderChat.vue new file mode 100644 index 000000000..c830741f9 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/captain/builder/BuilderChat.vue @@ -0,0 +1,362 @@ + + +