Tela "Construtor" no painel Captain (acessivel em sidebar pra admins) que permite criar novo agente Hermes via chat guiado com agente Construtor (profile Hermes separado). Backend (admin scope): - POST /api/v1/accounts/:id/captain/hermes_builder — manda mensagem do admin pro gateway do Construtor (Hermes na porta 8646) - GET — retorna historico da sessao (Rails.cache, TTL 4h) - DELETE /reset — limpa sessao - POST /webhooks/captain/builder_callback — recebe respostas async do Construtor via plugin captain-http-callback do Hermes - HermesBuilder::Storage (Rails.cache) — persiste msgs por session_key (account_id + user_id) com role/content/created_at - HermesBuilder::Dispatcher — encaminha pro webhook do Construtor com HMAC opcional via ENV HERMES_BUILDER_WEBHOOK_SECRET Frontend: - Pagina Vue HermesBuilder/Index.vue — chat simples com: * Lista de mensagens com bubbles user/construtor * Indicador "digitando..." enquanto aguarda resposta * Input com Enter pra enviar / Shift+Enter pra nova linha * Polling 2s pra novas msgs * Botao Limpar conversa - API client em api/captain/hermesBuilder.js - Rota captain_hermes_builder_index (admin only) - Item no sidebar Captain "Construtor (Hermes)" - i18n keys CAPTAIN.HERMES_BUILDER em pt_BR + en UX flow: Admin abre tela → digita "olá" → Construtor pergunta nome → admin responde → marca, persona, tabela (com opcao copiar de existente), regras, FAQs, identidade → resumo → confirmar → Construtor chama save_agent_spec → JSON salvo em /tmp/agent-specs/<slug>.json pra revisao posterior. NAO cria filesystem do profile nem registros DB (etapa SEPARADA, prox sessao). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
860 B
Ruby
33 lines
860 B
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
|
|
end
|