From 88a5adb65e9169965124b846d65c0e6c95216cb3 Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Sat, 2 May 2026 13:42:22 -0300 Subject: [PATCH] fix(captain/hermes): subscription_name e secret usam profile_name (slug) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: Captain dispatchava pra /webhooks/captain-inbox-, mas o script hermes-provision criava subscription com nome captain-inbox-. Mismatch → daemon retornava 404, Sidekiq retentava, AutoReact firava N reactions sem nunca dispatchar pro LLM. Fix: - subscription_name_for(inbox): se o assistant tem hermes_profile_name, usa "captain-inbox-" (estável por agente). Fallback pra "captain-inbox-" só se não tiver slug. - subscription_signing_secret(inbox): lê de assistant.hermes_subscription_secret primeiro (DB-driven, gravado pelo script). Fallback pra env var legacy CAPTAIN_HERMES_SUBSCRIPTION_SECRET_INBOX_. Resultado: admin pode apontar Angelina (inbox 1) pra qualquer agente Hermes (Valentina · Hermes / Nina · Hermes / Lara.H / Juliana · Hermes) e o roteamento funciona — não depende mais de inbox.id no path. Renomeei manualmente as subscriptions de Valentina e Nina nos profiles da VPS (eram captain-inbox-1 e captain-inbox-5 legado) pra captain-inbox-valentina e captain-inbox-nina. Co-Authored-By: Claude Opus 4.7 (1M context) --- enterprise/app/services/captain/hermes.rb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/enterprise/app/services/captain/hermes.rb b/enterprise/app/services/captain/hermes.rb index 500527545..219bdb162 100644 --- a/enterprise/app/services/captain/hermes.rb +++ b/enterprise/app/services/captain/hermes.rb @@ -65,13 +65,25 @@ module Captain::Hermes "#{webhook_base_url(inbox)}/webhooks/#{subscription_name_for(inbox)}" end - # Convenção de nome de subscription no Hermes: precisa bater com o que o - # admin criou via `hermes webhook subscribe captain-inbox- ...`. + # Convenção de nome de subscription no Hermes: + # - Pra Hermes assistant criado pelo Construtor (tem hermes_profile_name): + # usa "captain-inbox-" (única por agente, independente de qual + # inbox o admin atrelou). + # - Pra agentes legados (Valentina, Nina) criados antes do Construtor: + # fallback pro padrão velho "captain-inbox-". def subscription_name_for(inbox) - "captain-inbox-#{inbox.id}" + assistant = assistant_for(inbox) + if assistant&.hermes_profile_name.present? + "captain-inbox-#{assistant.hermes_profile_name}" + else + "captain-inbox-#{inbox.id}" + end end def subscription_signing_secret(inbox) + assistant = assistant_for(inbox) + return assistant.hermes_subscription_secret if assistant&.hermes_subscription_secret.present? + ENV.fetch("CAPTAIN_HERMES_SUBSCRIPTION_SECRET_INBOX_#{inbox.id}", nil) end