You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
11 KiB
Python
306 lines
11 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import UTC, datetime
|
|
|
|
from admin_app.core.settings import AdminSettings
|
|
from shared.contracts import ServiceName, ToolLifecycleStatus, ToolParameterType
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class BootstrapToolCatalogEntry:
|
|
tool_name: str
|
|
display_name: str
|
|
description: str
|
|
domain: str
|
|
parameter_count: int
|
|
|
|
|
|
_BOOTSTRAP_TOOL_CATALOG: tuple[BootstrapToolCatalogEntry, ...] = (
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="consultar_estoque",
|
|
display_name="Consultar estoque",
|
|
description="Consulta veiculos disponiveis no estoque comercial.",
|
|
domain="vendas",
|
|
parameter_count=4,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="validar_cliente_venda",
|
|
display_name="Validar cliente para venda",
|
|
description="Avalia elegibilidade de credito para operacoes de venda.",
|
|
domain="vendas",
|
|
parameter_count=2,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="avaliar_veiculo_troca",
|
|
display_name="Avaliar veiculo de troca",
|
|
description="Estima o valor de entrada de um veiculo usado.",
|
|
domain="vendas",
|
|
parameter_count=3,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="agendar_revisao",
|
|
display_name="Agendar revisao",
|
|
description="Abre um agendamento de revisao ou manutencao.",
|
|
domain="revisao",
|
|
parameter_count=6,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="listar_agendamentos_revisao",
|
|
display_name="Listar agendamentos de revisao",
|
|
description="Consulta a fila de agendamentos de revisao do cliente.",
|
|
domain="revisao",
|
|
parameter_count=3,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="cancelar_agendamento_revisao",
|
|
display_name="Cancelar agendamento de revisao",
|
|
description="Cancela um agendamento existente por protocolo.",
|
|
domain="revisao",
|
|
parameter_count=2,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="editar_data_revisao",
|
|
display_name="Editar data de revisao",
|
|
description="Remarca uma revisao para um novo horario.",
|
|
domain="revisao",
|
|
parameter_count=2,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="realizar_pedido",
|
|
display_name="Realizar pedido",
|
|
description="Efetiva um pedido de compra com o veiculo escolhido.",
|
|
domain="vendas",
|
|
parameter_count=2,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="listar_pedidos",
|
|
display_name="Listar pedidos",
|
|
description="Consulta pedidos ja abertos pelo cliente.",
|
|
domain="vendas",
|
|
parameter_count=3,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="cancelar_pedido",
|
|
display_name="Cancelar pedido",
|
|
description="Cancela um pedido existente com motivo registrado.",
|
|
domain="vendas",
|
|
parameter_count=2,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="consultar_frota_aluguel",
|
|
display_name="Consultar frota de aluguel",
|
|
description="Lista veiculos disponiveis para locacao.",
|
|
domain="locacao",
|
|
parameter_count=6,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="abrir_locacao_aluguel",
|
|
display_name="Abrir locacao de aluguel",
|
|
description="Inicia um contrato de locacao de veiculo.",
|
|
domain="locacao",
|
|
parameter_count=7,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="registrar_devolucao_aluguel",
|
|
display_name="Registrar devolucao de aluguel",
|
|
description="Fecha uma locacao e devolve o veiculo para a frota.",
|
|
domain="locacao",
|
|
parameter_count=4,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="registrar_pagamento_aluguel",
|
|
display_name="Registrar pagamento de aluguel",
|
|
description="Registra comprovantes e pagamentos de contratos de locacao.",
|
|
domain="locacao",
|
|
parameter_count=7,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="limpar_contexto_conversa",
|
|
display_name="Limpar contexto de conversa",
|
|
description="Reinicia o contexto operacional atual do atendimento.",
|
|
domain="orquestracao",
|
|
parameter_count=1,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="continuar_proximo_pedido",
|
|
display_name="Continuar proximo pedido",
|
|
description="Retoma o proximo pedido pendente do fluxo atual.",
|
|
domain="orquestracao",
|
|
parameter_count=0,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="descartar_pedidos_pendentes",
|
|
display_name="Descartar pedidos pendentes",
|
|
description="Descarta apenas a fila pendente de pedidos do contexto.",
|
|
domain="orquestracao",
|
|
parameter_count=1,
|
|
),
|
|
BootstrapToolCatalogEntry(
|
|
tool_name="cancelar_fluxo_atual",
|
|
display_name="Cancelar fluxo atual",
|
|
description="Interrompe o fluxo corrente sem apagar todo o contexto.",
|
|
domain="orquestracao",
|
|
parameter_count=1,
|
|
),
|
|
)
|
|
|
|
_LIFECYCLE_DESCRIPTIONS = {
|
|
ToolLifecycleStatus.DRAFT: "Estado inicial de uma tool ainda em definicao.",
|
|
ToolLifecycleStatus.GENERATED: "Implementacao gerada e pronta para analise tecnica.",
|
|
ToolLifecycleStatus.VALIDATED: "Tool validada automaticamente com verificacoes basicas.",
|
|
ToolLifecycleStatus.APPROVED: "Versao revisada e aprovada para publicacao controlada.",
|
|
ToolLifecycleStatus.ACTIVE: "Tool publicada e apta a abastecer o runtime de produto.",
|
|
ToolLifecycleStatus.FAILED: "Falha registrada na geracao, validacao ou ativacao.",
|
|
ToolLifecycleStatus.ARCHIVED: "Versao retirada de circulacao e mantida apenas para historico.",
|
|
}
|
|
|
|
_PARAMETER_TYPE_DESCRIPTIONS = {
|
|
ToolParameterType.STRING: "Texto livre, codigos e identificadores.",
|
|
ToolParameterType.INTEGER: "Valores inteiros para limites, anos e contagens.",
|
|
ToolParameterType.NUMBER: "Valores numericos decimais, como preco e diaria.",
|
|
ToolParameterType.BOOLEAN: "Marcadores verdadeiro ou falso para decisoes operacionais.",
|
|
ToolParameterType.OBJECT: "Estruturas compostas para payloads complexos.",
|
|
ToolParameterType.ARRAY: "Colecoes ordenadas de valores.",
|
|
}
|
|
|
|
|
|
class ToolManagementService:
|
|
def __init__(self, settings: AdminSettings):
|
|
self.settings = settings
|
|
|
|
def build_overview_payload(self) -> dict:
|
|
catalog = self.list_publication_catalog()
|
|
return {
|
|
"mode": "bootstrap_catalog",
|
|
"metrics": [
|
|
{
|
|
"key": "active_catalog",
|
|
"label": "Tools mapeadas",
|
|
"value": str(len(catalog)),
|
|
"description": "Catalogo bootstrap refletindo a base de tools conhecida no monorepo.",
|
|
},
|
|
{
|
|
"key": "lifecycle_stages",
|
|
"label": "Etapas de lifecycle",
|
|
"value": str(len(ToolLifecycleStatus)),
|
|
"description": "Estados compartilhados entre governanca administrativa e publicacao.",
|
|
},
|
|
{
|
|
"key": "parameter_types",
|
|
"label": "Tipos de parametro",
|
|
"value": str(len(ToolParameterType)),
|
|
"description": "Tipos aceitos pelo contrato inicial de publicacao de tools.",
|
|
},
|
|
{
|
|
"key": "draft_persistence",
|
|
"label": "Persistencia de drafts",
|
|
"value": "pendente",
|
|
"description": "A fase atual entrega as superficies e o contrato; entidades de draft ainda nao existem.",
|
|
},
|
|
],
|
|
"workflow": self.build_lifecycle_payload(),
|
|
"next_steps": [
|
|
"Criar entidades administrativas para ToolDraft, ToolValidationRun e ToolPublication.",
|
|
"Ligar o formulario de cadastro de novas tools a uma persistencia propria do admin.",
|
|
"Abrir filas de revisao, aprovacao e ativacao com auditoria ponta a ponta.",
|
|
],
|
|
}
|
|
|
|
def build_contracts_payload(self) -> dict:
|
|
return {
|
|
"publication_source_service": ServiceName.ADMIN,
|
|
"publication_target_service": ServiceName.PRODUCT,
|
|
"lifecycle_statuses": self.build_lifecycle_payload(),
|
|
"parameter_types": [
|
|
{
|
|
"code": parameter_type,
|
|
"label": parameter_type.value.upper(),
|
|
"description": _PARAMETER_TYPE_DESCRIPTIONS[parameter_type],
|
|
}
|
|
for parameter_type in ToolParameterType
|
|
],
|
|
"publication_fields": [
|
|
"source_service",
|
|
"target_service",
|
|
"publication_id",
|
|
"published_tool",
|
|
"emitted_at",
|
|
],
|
|
"published_tool_fields": [
|
|
"tool_name",
|
|
"display_name",
|
|
"description",
|
|
"version",
|
|
"status",
|
|
"parameters",
|
|
"implementation_module",
|
|
"implementation_callable",
|
|
"checksum",
|
|
"published_at",
|
|
"published_by",
|
|
],
|
|
}
|
|
|
|
def build_drafts_payload(self) -> dict:
|
|
return {
|
|
"storage_status": "pending_persistence",
|
|
"message": (
|
|
"As rotas de gestao de tools ja existem, mas a persistencia de ToolDraft ainda sera criada nas proximas etapas."
|
|
),
|
|
"drafts": [],
|
|
"supported_statuses": [ToolLifecycleStatus.DRAFT],
|
|
}
|
|
|
|
def build_review_queue_payload(self) -> dict:
|
|
return {
|
|
"queue_mode": "bootstrap_empty_state",
|
|
"message": (
|
|
"A fila de revisao ainda opera em estado vazio ate a criacao das entidades de geracao e validacao."
|
|
),
|
|
"items": [],
|
|
"supported_statuses": [
|
|
ToolLifecycleStatus.GENERATED,
|
|
ToolLifecycleStatus.VALIDATED,
|
|
ToolLifecycleStatus.APPROVED,
|
|
ToolLifecycleStatus.FAILED,
|
|
],
|
|
}
|
|
|
|
def build_publications_payload(self) -> dict:
|
|
return {
|
|
"source": "bootstrap_catalog",
|
|
"target_service": ServiceName.PRODUCT,
|
|
"publications": self.list_publication_catalog(),
|
|
}
|
|
|
|
def build_lifecycle_payload(self) -> list[dict]:
|
|
return [
|
|
{
|
|
"code": status,
|
|
"label": status.value.replace("_", " ").title(),
|
|
"description": _LIFECYCLE_DESCRIPTIONS[status],
|
|
}
|
|
for status in ToolLifecycleStatus
|
|
]
|
|
|
|
def list_publication_catalog(self) -> list[dict]:
|
|
published_at = datetime.now(UTC)
|
|
return [
|
|
{
|
|
"publication_id": f"bootstrap::{entry.tool_name}::v1",
|
|
"tool_name": entry.tool_name,
|
|
"display_name": entry.display_name,
|
|
"description": entry.description,
|
|
"domain": entry.domain,
|
|
"version": 1,
|
|
"status": ToolLifecycleStatus.ACTIVE,
|
|
"parameter_count": entry.parameter_count,
|
|
"implementation_module": "app.services.tools.handlers",
|
|
"implementation_callable": entry.tool_name,
|
|
"published_by": "bootstrap_catalog",
|
|
"published_at": published_at,
|
|
}
|
|
for entry in _BOOTSTRAP_TOOL_CATALOG
|
|
]
|