Cardinal-System es un framework de Swift (SwiftPM) para construir aplicaciones orientadas a eventos, acciones y permisos, con un sistema de red basado en WebSockets y un módulo de agente (LLM) para tomar decisiones de forma distribuida entre nodos.
- Swift 5.9+ (probado con Swift 6.3 en Linux)
- macOS 10.14+ o Linux
Sources/
├── Cardinal-System/ # Librería principal
│ ├── Core/ # Protocolos base: Information, Event, Listener, Command, Entity
│ ├── Action/ # CardinalAction (protocolo) y ActionExecutor (actor, registro/despacho de acciones)
│ ├── Permission/ # Permission, Group, Context y PermissionManager (actor)
│ ├── Storage/ # Storage (protocolo) y ConfigStorage (YAML vía Yams)
│ ├── Network/ # Servidor WebSocket (SwiftNIO)
│ ├── Agent/ # Agente LLM híbrido (ver más abajo)
│ └── System/ # Cardinal (protocolo de entrada) y Application
└── Run/ # Ejecutable de ejemplo (target `Run`)
Tests/
└── Cardinal-SystemTests/ # Pruebas unitarias
Event/Listener/CardinalAction: modelo pub-sub. UnEventlleva asociada unaaction(@Sendable () -> Void); unListenerreacciona a eventos; unCardinalActionse dispara cuando ocurre un evento asociado.EventManager(actor): registra eventos y exponesubscribe()comoAsyncStream<Event>para consumidores async, además del modelo legacy deListeners.ActionExecutor(actor,ActionExecutor.shared): registro central de acciones (registerAction) y despacho (notifyActions). También exponetoolManifest()para listar las acciones registradas como herramientas utilizables por un agente.PermissionManager(actor): control de permisos (add,remove,isGranted).Cardinal(protocolo): punto de entrada de la aplicación (run(),excutableServer()para levantar el servidor WebSocket).
El módulo Agent implementa un ciclo de decisión basado en LLM, pensado para
un sistema distribuido donde cada nodo puede resolver localmente o escalar
("delegar") a un nodo líder:
CardinalAgentClient: protocolo que abstrae el proveedor del modelo. Implementaciones incluidas:OllamaClient— víaAsyncHTTPClientcontra/api/chatde Ollama.OpenRouterClient— víaAsyncHTTPClientcontra/chat/completionsde OpenRouter (API key inyectada por el llamador, nunca hardcodeada).
AgentMessage: mensaje de chat agnóstico de proveedor (role,content).Decision/ActionSchema: formato JSON estructurado que el modelo debe devolver, validado y convertido aAgentAction.AgentAction:respond,callTool,createSkillodelegate.ToolSpec: describe una herramienta disponible para el agente (se genera, entre otros, desdeActionExecutor.toolManifest()).PromptBuilder: construye el system prompt con el manifiesto de tools.CardinalAgent(actor): mantiene el historial de conversación por nodo y ejecuta un paso de decisión (step(input:tools:)) contra cualquierCardinalAgentClient.
Ver MIGRATION_PLAN.md para el diseño completo de la
arquitectura distribuida (nodos líder/worker, delegación, red) y el trabajo
pendiente (skill-registry, network-envelope, node-role, wire-example).
swift build
swift test --parallelswift run RunEl target Run (Sources/Run/ALO.swift) registra acciones de ejemplo y
levanta el servidor WebSocket vía Cardinal.excutableServer().
Apache License 2.0 — ver LICENSE.txt.