Bug: Hermes nao propaga chat_id no metadata do callback. Callback controller nao conseguia resolver qual session armazenar a resposta. WARN "no session_key resolvable — ignorando" descartava todas as respostas do Construtor. Fix: HermesBuilder::Storage.remember_last_session() grava ultima session por account quando admin chama /start ou /create. Callback le essa key via last_session_for(account_id). MVP-safe pra 1 admin por conta. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
44 lines
1.6 KiB
Ruby
44 lines
1.6 KiB
Ruby
# Recebe callback do Hermes Construtor (plugin captain-http-callback).
|
|
#
|
|
# Construtor responde async via POST pra esta URL com:
|
|
# { content: "<resposta>", reply_to: ..., metadata: {...}, timestamp: ... }
|
|
#
|
|
# Este controller identifica a sessão do admin (por session_id no metadata
|
|
# OU pelo cache key derivado de account_id que veio na query string) e
|
|
# armazena a resposta no Rails.cache pra UI poder ler via polling.
|
|
class Webhooks::Captain::HermesBuilderCallbackController < ApplicationController
|
|
skip_before_action :verify_authenticity_token, raise: false
|
|
|
|
def process_payload
|
|
content = params[:content].to_s.strip
|
|
return head :bad_request if content.blank?
|
|
|
|
session_key = resolve_session_key
|
|
if session_key.blank?
|
|
Rails.logger.warn('[HermesBuilder::Callback] no session_key resolvable — ignorando')
|
|
return head :ok
|
|
end
|
|
|
|
HermesBuilder::Storage.append(session_key, role: 'construtor', content: content)
|
|
Rails.logger.info("[HermesBuilder::Callback] reply received for #{session_key} (#{content.length} chars)")
|
|
|
|
head :ok
|
|
rescue StandardError => e
|
|
Rails.logger.error("[HermesBuilder::Callback] error: #{e.class}: #{e.message}")
|
|
head :internal_server_error
|
|
end
|
|
|
|
private
|
|
|
|
# Hermes nao propaga chat_id no metadata da resposta de callback, entao
|
|
# usamos a ultima sessao ativa do account (gravada por
|
|
# HermesBuilder::Storage.remember_last_session no /start e /create).
|
|
# MVP-safe pra 1 admin por vez por conta.
|
|
def resolve_session_key
|
|
account_id = params[:account_id]
|
|
return nil if account_id.blank?
|
|
|
|
HermesBuilder::Storage.last_session_for(account_id)
|
|
end
|
|
end
|