Domain Layer — Entities, Aggregates & Value Objects
«aggregate root»
ChatSession
id: ChatSessionId
clientId: ClientId
persona: Persona
messages: List<Message>
language: Language
status: SessionStatus
sendMessage(content, tools): Message
executeAction(actionId): ActionResult
provideFeedback(msgId, fb): void
switchPersona(persona): void
close(): void
«entity»
Message
id: MessageId
role: Role (USER|MIA)
content: String
toolCalls: List<ToolCall>
citations: List<Citation>
confidence: ConfidenceScore
timestamp: Instant
attachCitation(c): void
markAsDelivered(): void
«entity»
ActionExecution
id: ActionId
type: ActionType
parameters: Map
status: ExecStatus
result: ActionResult?
execute(): ActionResult
compensate(): void
requiresConfirmation(): bool
«use case»
SendMessageUseCase
sessionRepo: ChatSessionRepository
llmPort: LlmPort
vectorStore: VectorStorePort
execute(cmd: SendMessageCommand): MessageResponse
«use case»
ExecuteActionUseCase
sessionRepo: ChatSessionRepository
orderExecPort: OrderExecPort
auditPort: AuditPort
execute(cmd: ExecuteActionCmd): ActionResult
«use case»
ProvideFeedbackUseCase
sessionRepo: ChatSessionRepository
analyticsPort: AnalyticsPort
execute(cmd: FeedbackCommand): void
«adapter»
ClaudeApiAdapter
apiKey: String
model: String
webClient: WebClient
chat(prompt, tools): LlmResponse
stream(prompt): Flux<Token>