iachat/enterprise/app/services/hermes_builder/storage.rb
Rodribm10 5f6aed05c9 fix(captain/hermes-builder): callback resolve session via last_session
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>
2026-05-01 22:53:43 -03:00

44 lines
1.3 KiB
Ruby

# Storage de mensagens da UI Hermes Builder.
#
# Persistência em Rails.cache (Redis em prod) — TTL 4h. Suficiente pra uma
# sessão de criação completa de agente (geralmente ~10-20min).
#
# Cada mensagem tem: role ('user' | 'construtor'), content (string),
# created_at (ISO8601). Lista cresce em ordem cronológica.
module HermesBuilder
end
module HermesBuilder::Storage
TTL = 4.hours
MAX_MESSAGES = 200
module_function
def messages_for(session_key)
Rails.cache.fetch(session_key) { [] }
end
def append(session_key, role:, content:)
msgs = messages_for(session_key)
msgs << { role: role, content: content.to_s, created_at: Time.current.iso8601 }
msgs = msgs.last(MAX_MESSAGES)
Rails.cache.write(session_key, msgs, expires_in: TTL)
msgs
end
def clear(session_key)
Rails.cache.delete(session_key)
end
# Última sessão ativa por account — usada pelo callback do Hermes pra
# roteamento (Hermes nao propaga chat_id no metadata da resposta).
# Aceitavel pra MVP com 1 admin por vez por conta.
def remember_last_session(account_id, session_key)
Rails.cache.write("hermes_builder:last_session:account:#{account_id}", session_key, expires_in: TTL)
end
def last_session_for(account_id)
Rails.cache.read("hermes_builder:last_session:account:#{account_id}")
end
end