iachat/enterprise/app/services/captain/mcp/tool_registry.rb
Rodribm10 e94cadbdf6 feat(captain): pix_mode manual_static pra Padova e Express
Adiciona caminho paralelo de PIX manual estático pra unidades sem
integração Inter (Padova, Express AL). Mudança 100% aditiva — todas as
outras unidades continuam no fluxo Inter inalterado (default
pix_mode=inter_dynamic aplicado pela migration).

Backend (sem SOUL/SKILL ainda — Frente 7 vem depois):
- Migration concurrent: pix_mode + 4 campos manual_pix_* em captain_units;
  provider + manual_proof_payload + manual_review_reason em captain_pix_charges
- Captain::Unit: enum pix_mode (prefix), validação condicional manual_*
- Captain::PixCharge: status estendido (awaiting_proof, pending_review),
  scope manual/inter, nota interna ramificada por modo
- GeneratePixTool MCP: branch manual_static (chave fixa, mensagem direta
  sem QR/Inter), preserva fluxo Inter intacto
- 4 tools MCP novas: verificar_comprovante_pix (vision gpt-5.3-codex),
  criar_nota_interna (genérica), confirmar_reserva_pix_manual (wrapper
  do ConfirmationService), marcar_reserva_pendente
- ConfirmationService: source_label cobre 'manual_pix_proof'

Próximos passos manuais (não inclusos neste commit):
1. Rodar migration em prod (entrypoint não roda no boot)
2. Seed Padova/Express com pix_mode=manual_static + chaves Stone
3. Deploy nova imagem via docker service update
4. Editar SOUL/SKILL Padova/Express na VPS Hermes + kill+boot

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:01:01 -03:00

53 lines
2.0 KiB
Ruby

# Registry centralizado das tools MCP do Captain.
#
# Adicionar uma tool nova = incluir a classe em TOOLS abaixo. Cada tool
# herda de Captain::Mcp::Tools::BaseTool e responde a .to_mcp_descriptor
# (pra `tools/list`) e #call(args, context:) (pra `tools/call`).
#
# Hermes consulta tools/list pra saber o que pode chamar e tools/call pra
# executar. Toda tool aqui está disponível pra qualquer profile do Hermes
# que se conecte ao MCP server do Captain via `hermes mcp add`.
class Captain::Mcp::ToolRegistry
TOOLS = [
Captain::Mcp::Tools::AddLabelTool,
Captain::Mcp::Tools::FaqLookupTool,
Captain::Mcp::Tools::GeneratePixTool,
Captain::Mcp::Tools::UpdateContactTool,
Captain::Mcp::Tools::GetContactHistoryTool,
Captain::Mcp::Tools::CheckPixPaymentTool,
Captain::Mcp::Tools::SendSuiteImagesTool,
Captain::Mcp::Tools::RescheduleReservationTool,
Captain::Mcp::Tools::ReactToMessageTool,
Captain::Mcp::Tools::CheckSuiteAvailabilityTool,
# PIX manual estático (Padova, Express AL) — fluxo paralelo ao Inter
Captain::Mcp::Tools::VerifyPixProofTool,
Captain::Mcp::Tools::CreateInternalNoteTool,
Captain::Mcp::Tools::ConfirmPixManualTool,
Captain::Mcp::Tools::MarkReservationPendingTool,
# Construtor (admin scope) — usadas pelo profile Hermes "construtor" pra criar novos agentes
Captain::Mcp::Tools::ListAssistantsTool,
Captain::Mcp::Tools::GetAssistantPricingTool,
Captain::Mcp::Tools::GetAssistantFaqsTool,
Captain::Mcp::Tools::GetAssistantScenarioTool,
Captain::Mcp::Tools::SaveAgentSpecTool
# Captain::Mcp::Tools::HandoffTool — fluxo via automation hoje, MCP futuro
].freeze
class << self
def descriptors
TOOLS.map(&:to_mcp_descriptor)
end
def find(name)
TOOLS.find { |klass| klass.name == name.to_s }
end
def call(name, args, context:)
klass = find(name)
raise ArgumentError, "Tool não registrada: #{name}" if klass.nil?
klass.new.call(args || {}, context: context || {})
end
end
end