diff --git a/.gitignore b/.gitignore index a2a9ada8..81dd9485 100644 --- a/.gitignore +++ b/.gitignore @@ -46,8 +46,10 @@ llm-proxy/target/** llm-proxy/target/ llm-dataplane/target/** sentrius-llm-dataplane/target/** +sentrius-llm-core/target/** llm-dataplane/target/ sentrius-llm-dataplane/target/ +sentrius-llm-core/target/ node/* node_modules/* api/node_modules/* diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/AiAgent.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/AiAgent.java index 01bb40de..49cd6d8f 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/AiAgent.java +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/AiAgent.java @@ -1,7 +1,9 @@ package io.sentrius.agent.analysis; +import io.sentrius.agent.config.AgentConfigOptions; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.scheduling.annotation.EnableScheduling; @@ -11,6 +13,7 @@ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration.class }) +@EnableConfigurationProperties(AgentConfigOptions.class) @EnableScheduling public class AiAgent { public static void main(String[] args) { diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/ChatAgent.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/ChatAgent.java new file mode 100644 index 00000000..6cef1d37 --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/ChatAgent.java @@ -0,0 +1,164 @@ +package io.sentrius.agent.analysis.agents.agents; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.node.ArrayNode; +import io.sentrius.agent.analysis.agents.verbs.AgentVerbs; +import io.sentrius.agent.analysis.api.AgentKeyService; +import io.sentrius.agent.analysis.api.UserCommunicationService; +import io.sentrius.agent.config.AgentConfigOptions; +import io.sentrius.sso.core.dto.UserDTO; +import io.sentrius.sso.core.dto.ztat.AgentExecution; +import io.sentrius.sso.core.dto.ztat.ZtatRequestDTO; +import io.sentrius.sso.core.exceptions.ZtatException; +import io.sentrius.sso.core.model.security.Ztat; +import io.sentrius.sso.core.services.agents.AgentClientService; +import io.sentrius.sso.core.services.agents.AgentExecutionService; +import io.sentrius.sso.core.services.agents.ZeroTrustClientService; +import io.sentrius.sso.core.services.security.KeycloakService; +import io.sentrius.sso.core.utils.JsonUtil; +import jakarta.annotation.PreDestroy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +@ConditionalOnProperty(name = "agents.ai.chat.agent.enabled", havingValue = "true", matchIfMissing = false) +public class ChatAgent implements ApplicationListener { + + + final ZeroTrustClientService zeroTrustClientService; + final AgentClientService agentClientService; + final VerbRegistry verbRegistry; + final AgentVerbs agentVerbs; + final AgentExecutionService agentExecutionService; + final UserCommunicationService userCommunicationService; + final AgentConfigOptions agentConfigOptions; + final AgentKeyService agentKeyService; + private final KeycloakService keycloakService; + + private volatile boolean running = true; + private Thread workerThread; + + private AgentExecution agentExecution; + + public ArrayNode promptAgent(AgentExecution execution) throws ZtatException { + while(true){ + try { + log.info("Prompting agent..."); + return agentVerbs.promptAgent(execution,null); + } catch (ZtatException e) { + log.info("Mechanisms {}" , e.getMechanisms()); + var endpoint = zeroTrustClientService.createEndPointRequest("prompt_agent", e.getEndpoint()); + ZtatRequestDTO ztatRequestDTO = ZtatRequestDTO.builder() + .user(execution.getUser()) + .command(endpoint.toString()) + .justification("Registered Agent requires ability to prompt LLM endpoints to begin operations") + .summary("Registered Agent requires ability to prompt LLM endpoints to begin operations") + .build(); + var request = zeroTrustClientService.requestZtatToken(execution, execution.getUser(),ztatRequestDTO); + + var token = zeroTrustClientService.awaitZtatToken(execution, execution.getUser(), request, 60, + TimeUnit.MINUTES); + execution.setZtatToken(token); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + } + + @Override + public void onApplicationEvent(final ApplicationReadyEvent event) { + + verbRegistry.scanClasspath(); + + var keyPair = agentKeyService.getKeyPair(); + + try { + var agentName = agentConfigOptions.getNamePrefix() + "-" + UUID.randomUUID().toString(); + var base64PublicKey = agentKeyService.getBase64PublicKey(keyPair.getPublic()); + var agentRegistrationDTO = agentClientService.bootstrap(agentName, base64PublicKey + , keyPair.getPublic().getAlgorithm()); + + var encryptedSecret = agentRegistrationDTO.getClientSecret(); + var decryptedSecret = agentKeyService. + decryptWithPrivateKey(encryptedSecret, keyPair.getPrivate()); + keycloakService.createKeycloakClient(agentName, + decryptedSecret); + + + } catch (ZtatException e) { + throw new RuntimeException(e); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + + final UserDTO user = UserDTO.builder() + .username(zeroTrustClientService.getUsername()) + .build(); + agentExecution = agentExecutionService.getAgentExecution(user); + + try { + agentClientService.heartbeat(agentExecution, agentExecution.getUser().getUsername()); + } catch (ZtatException e) { + throw new RuntimeException(e); + } + + while(running) { + + try { + var register = zeroTrustClientService.registerAgent(agentExecution); + log.info("Registered agent response: {}", register); + + var ztat = JsonUtil.MAPPER.readValue(register, Ztat.class); + agentExecution.setZtatToken(ztat.getZtatToken()); + agentExecution.setCommunicationId(ztat.getCommunicationId()); + break; + }catch (Exception | ZtatException e) { + + log.error(e.getMessage()); + log.info("Registering v1.0.2 agent failed. Retrying in 10 seconds..."); + try { + Thread.sleep(10_000); + } catch (InterruptedException ex) { + throw new RuntimeException(ex); + } + } + } + + while(running) { + + log.info("Agent Registered..."); + try { + + Thread.sleep(5_000); + agentClientService.heartbeat(agentExecution, agentExecution.getUser().getUsername()); + } catch (InterruptedException | ZtatException ex) { + throw new RuntimeException(ex); + } + + } + + } + + @PreDestroy + public void shutdown() { + log.info("Shutting down ChatAgent..."); + running = false; + if (workerThread != null) { + workerThread.interrupt(); + } + } + + public AgentExecution getAgentExecution() { + return agentExecution; + } +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/PromptBuilder.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/PromptBuilder.java index e46d9218..924cb95e 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/PromptBuilder.java +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/PromptBuilder.java @@ -63,7 +63,7 @@ public String buildPrompt() { verbRegistry.getVerbs().forEach((name, verb) -> { prompt.append("- ").append(name); prompt.append(" (").append(buildMethodSignature(verb.getMethod())).append(") - "); - prompt.append(verb.getDescription()).append(")\n"); + prompt.append(verb.getDescription()).append("\n"); }); return prompt.toString(); diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/RegisteredAgent.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/RegisteredAgent.java index 90a38d0e..d901e0e7 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/RegisteredAgent.java +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/agents/RegisteredAgent.java @@ -109,10 +109,10 @@ public void onApplicationEvent(final ApplicationReadyEvent event) { + var agentExecution = agentExecutionService.getAgentExecution(user); + var response = promptAgent(agentExecution); while (running) { try { - var agentExecution = agentExecutionService.getAgentExecution(user); - var response = promptAgent(agentExecution); log.info("Got response: {}", response); VerbResponse priorResponse = null; @@ -129,16 +129,14 @@ public void onApplicationEvent(final ApplicationReadyEvent event) { } catch (Exception e) { log.error("Exception in agent loop", e); - } catch (ZtatException e) { - throw new RuntimeException(e); } // Sleep between prompts log.info("Sleeping for 5 seconds"); - Thread.sleep(1_000); + Thread.sleep(5_000); } - } catch (Exception e) { + } catch (Exception | ZtatException e) { log.error("Fatal error in RegisteredAgent", e); } }); diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/AgentVerbs.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/AgentVerbs.java index 49dc3732..5e13315c 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/AgentVerbs.java +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/AgentVerbs.java @@ -27,6 +27,8 @@ import io.sentrius.agent.analysis.agents.interpreters.ZtatOutputInterpreter; import io.sentrius.agent.analysis.model.AssessedTerminal; import io.sentrius.agent.analysis.model.Assessment; +import io.sentrius.agent.analysis.model.TerminalResponse; +import io.sentrius.agent.analysis.model.WebSocky; import io.sentrius.agent.analysis.model.ZtatAsessment; import io.sentrius.agent.analysis.model.ZtatResponse; import io.sentrius.sso.core.dto.AgentCommunicationDTO; @@ -43,6 +45,7 @@ import io.sentrius.sso.genai.Message; import io.sentrius.sso.genai.Response; import io.sentrius.sso.genai.model.LLMRequest; +import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -138,6 +141,117 @@ public ArrayNode promptAgent(AgentExecution execution, Map args) return JsonUtil.MAPPER.createArrayNode(); } + /** + * Prompts the agent for workload based on the provided arguments. + * + * @return An `ArrayNode` containing the plan generated by the agent. + * @throws ZtatException If there is an error during the operation. + * @throws IOException If there is an error reading the configuration file. + */ + @Verb(name = "interpret_user_request", returnType = ArrayNode.class, description = "Queries the LLM using the " + + "user input.", + isAiCallable = false, requiresTokenManagement = true) + public TerminalResponse interpretUserData(AgentExecution execution, @NonNull WebSocky socketConnection, + @NonNull Message userMessage) throws ZtatException, + IOException { + + var lastMessage = socketConnection.getMessages().stream().reduce((prev, next) -> next).orElse(null); + if (socketConnection.getMessages().isEmpty()) { + + InputStream terminalHelperStream = getClass().getClassLoader().getResourceAsStream("terminal-helper.json"); + if (terminalHelperStream == null) { + throw new RuntimeException("assessor-config.yaml not found on classpath"); + + } + String terminalResponse = new String(terminalHelperStream.readAllBytes()); + InputStream is = getClass().getClassLoader().getResourceAsStream(agentConfigFile); + if (is == null) { + throw new RuntimeException(agentConfigFile + " not found on classpath"); + } + AgentConfig config = new ObjectMapper(new YAMLFactory()).readValue(is, AgentConfig.class); + + log.info("Agent config loaded: {}", config); + PromptBuilder promptBuilder = new PromptBuilder(verbRegistry, config); + var prompt = promptBuilder.buildPrompt(); + List messages = new ArrayList<>(); + + messages.add(Message.builder().role("system").content(prompt).build()); + messages.add(Message.builder().role("system").content("Please ensure your nextOperation abides by the " + + "following json format and leave it empty if user's request doesn't require explicit use of system " + + "operations" + + ". Please summarize prior terminal " + + "sessions, using " + + "terminal output if needed " + + "for clarity of the next LLM request and for the user: " + terminalResponse).build()); + messages.add(Message.builder().role("user").content(userMessage.getContent()).build()); + LLMRequest chatRequest = LLMRequest.builder().model("gpt-4o").messages(messages).build(); + var resp = llmService.askQuestion(execution, chatRequest); + execution.addMessages( messages ); + Response response = JsonUtil.MAPPER.readValue(resp, Response.class); + log.info("Response is {}", resp); + for (Response.Choice choice : response.getChoices()) { + var content = choice.getMessage().getContent(); + if (content.startsWith("```json")) { + content = content.substring(7, content.length() - 3); + } else if (content.startsWith("```")) { + content = content.substring(3, content.length() - 3); + } + log.info("content is {}", content); + if (null != content && !content.isEmpty()) { + var newResponse = JsonUtil.MAPPER.enable(JsonParser.Feature.ALLOW_COMMENTS).readValue(content, + TerminalResponse.class); + return newResponse; + } + } + } else { + InputStream terminalHelperStream = getClass().getClassLoader().getResourceAsStream("terminal-helper.json"); + if (terminalHelperStream == null) { + throw new RuntimeException("assessor-config.yaml not found on classpath"); + + } + String terminalResponse = new String(terminalHelperStream.readAllBytes()); + InputStream is = getClass().getClassLoader().getResourceAsStream(agentConfigFile); + if (is == null) { + throw new RuntimeException(agentConfigFile + " not found on classpath"); + } + AgentConfig config = new ObjectMapper(new YAMLFactory()).readValue(is, AgentConfig.class); + + log.info("Agent config loaded: {}", config); + PromptBuilder promptBuilder = new PromptBuilder(verbRegistry, config); + var prompt = promptBuilder.buildPrompt(); + List messages = new ArrayList<>(); + + messages.add(Message.builder().role("system").content(prompt).build()); + messages.add(Message.builder().role("system").content("Please ensure your nextOperation abide by the " + + "following json format. Please summarize prior terminal sessions, using terminal output if needed " + + "for clarity of the next LLM request and for the user: " + terminalResponse).build()); + messages.add(Message.builder().role("assistant").content("prior response: " + lastMessage.getTerminalSummaryForLLM()).build()); + messages.add(Message.builder().role("user").content(userMessage.getContent()).build()); + + LLMRequest chatRequest = LLMRequest.builder().model("gpt-4o").messages(messages).build(); + var resp = llmService.askQuestion(execution, chatRequest); + execution.addMessages( messages ); + Response response = JsonUtil.MAPPER.readValue(resp, Response.class); + log.info("Response is {}", resp); + for (Response.Choice choice : response.getChoices()) { + var content = choice.getMessage().getContent(); + if (content.startsWith("```json")) { + content = content.substring(7, content.length() - 3); + } else if (content.startsWith("```")) { + content = content.substring(3, content.length() - 3); + } + log.info("content is {}", content); + if (null != content && !content.isEmpty()) { + var newResponse = JsonUtil.MAPPER.enable(JsonParser.Feature.ALLOW_COMMENTS).readValue(content, + TerminalResponse.class); + return newResponse; + } + } + } + + return null; + } + /** * Chats with an agent to justify operations based on the provided arguments. * @@ -267,7 +381,8 @@ public String justifyAgent(AgentExecution execution, ZtatRequestDTO ztatRequest, */ @Verb(name = "assess_data", returnType = ArrayNode.class, description = "Accepts api server data based on the " + "context and seeks" + - " to perform the assessment by prompting the LLM. Can be used to assess data or request information from users and/or agents.", + " to perform the assessment by prompting the LLM. Can be used to assess data or request information from " + + "users and/or agents, but not for assessing ztat requests.", outputInterpreter = AsessmentListInterpreter.class, inputInterpreter = ObjectListInterpreter.class, requiresTokenManagement = true) @@ -310,8 +425,11 @@ public List assessData(AgentExecution execution, List objec return responses; } - @Verb(name = "list_ztat_requests", returnType = ArrayNode.class, description = "Lists zero trust access tokens to" + - " review from API. Does not review access token requests.", outputInterpreter = ZtatOutputInterpreter.class, + @Verb(name = "list_ztat_requests", returnType = ArrayNode.class, description = "Lists zero trust access token " + + "requests (ztats)" + + " " + + "to" + + " review from API. Does not review ztats.", outputInterpreter = ZtatOutputInterpreter.class, requiresTokenManagement = true ) public List getWork(AgentExecution token, Map args) throws ZtatException, IOException { List requests = new ArrayList<>(); @@ -363,8 +481,8 @@ public List getWork(AgentExecution token, Map args) return requests; } - @Verb(name = "assess_ztat_requests", returnType = ArrayNode.class, description = "Analyzes ztats according to the" + - " context.", + @Verb(name = "assess_ztat_requests", returnType = ArrayNode.class, description = "Analyzes ztats " + + "requests according to the by prompting the LLM. ", inputInterpreter = ZtatOutputInterpreter.class, requiresTokenManagement = true ) public List analyzeAtatRequests(AgentExecution execution, List requests) throws ZtatException, @@ -397,7 +515,8 @@ public List analyzeAtatRequests(AgentExecution execution, List analyzeAtatRequests(AgentExecution execution, List analyzeAtatRequests(AgentExecution execution, List killTerminalSessionWithTerminalAssessment(AgentExecution } } + @Verb(name = "open_ssh_session", description = "Opens an SSH websocket connection.", + requiresTokenManagement = true, + outputInterpreter = TerminalOutputInterpreter.class, inputInterpreter = AsessmentListInterpreter.class) + public List openSSHSession(AgentExecution execution) + throws ZtatException, IOException { + log.info("Opening SSH session"); + return null; + } + } \ No newline at end of file diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/UserConnectionVerbs.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/UserConnectionVerbs.java new file mode 100644 index 00000000..c65a3fb0 --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/agents/verbs/UserConnectionVerbs.java @@ -0,0 +1,77 @@ +package io.sentrius.agent.analysis.agents.verbs; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import com.fasterxml.jackson.databind.JsonNode; +import io.sentrius.agent.analysis.agents.interpreters.TerminalListInterpreter; +import io.sentrius.agent.analysis.api.UserCommunicationService; +import io.sentrius.sso.core.dto.HostSystemDTO; +import io.sentrius.sso.core.dto.ztat.TokenDTO; +import io.sentrius.sso.core.exceptions.ZtatException; +import io.sentrius.sso.core.model.verbs.Verb; +import io.sentrius.sso.core.services.agents.LLMService; +import io.sentrius.sso.core.services.agents.ZeroTrustClientService; +import io.sentrius.sso.core.utils.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * The `TerminalVerbs` class provides methods to interact with terminal-related operations. + * It includes functionality to list open terminals and fetch terminal logs. + */ +@Slf4j +@Service +public class UserConnectionVerbs { + + final ZeroTrustClientService zeroTrustClientService; + final LLMService llmService; + final AgentVerbs agentVerbs; + final UserCommunicationService userCommunicationService; + + /** + * Constructs a `TerminalVerbs` instance with the required services. + * + * @param zeroTrustClientService The service for interacting with Zero Trust APIs. + * @param llmService The service for interacting with the LLM (Large Language Model). + */ + public UserConnectionVerbs(ZeroTrustClientService zeroTrustClientService, LLMService llmService, AgentVerbs agentVerbs, + UserCommunicationService userCommunicationService + ) { + this.zeroTrustClientService = zeroTrustClientService; + this.llmService = llmService; + this.agentVerbs = agentVerbs; + this.userCommunicationService = userCommunicationService; + } + + /** + * Retrieves a list of currently open terminals. + * + * @param args A map of arguments for the operation (currently unused). + * @return An `ArrayNode` containing the list of open terminals. + * @throws io.sentrius.sso.core.exceptions.ZtatException If there is an error during the operation. + */ + @Verb(name = "list_hosts", description = "Retrieves a list of available hosts.", + outputInterpreter = TerminalListInterpreter.class, requiresTokenManagement = true) + public List listHosts(TokenDTO token, Map args) throws ZtatException { + try { + var response = zeroTrustClientService.callGetOnApi(token, "/sso/v1/enclaves/hosts/list"); + if (response == null) { + throw new RuntimeException("Failed to retrieve terminal list"); + } + var messages = JsonUtil.MAPPER.readTree(response); + List hostSystemDTOS = new ArrayList<>(); + for(JsonNode message : messages) { + HostSystemDTO dto = JsonUtil.MAPPER.readValue(message.toString(), HostSystemDTO.class); + hostSystemDTOS.add(dto); + } + log.info("Terminal list response: {}", response); + return hostSystemDTOS; + } catch (Exception e) { + throw new RuntimeException("Failed to retrieve terminal list", e); + } + } + + + +} \ No newline at end of file diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/AgentKeyService.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/AgentKeyService.java new file mode 100644 index 00000000..9f7d681e --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/AgentKeyService.java @@ -0,0 +1,42 @@ +package io.sentrius.agent.analysis.api; + +import java.security.KeyPair; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import io.sentrius.agent.config.EphemeralKeyGen; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AgentKeyService { + + final KeyPair keyPair; + + public AgentKeyService(){ + try { + keyPair = EphemeralKeyGen.generateEphemeralRSAKeyPair(); + } catch ( + NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + + } + + public KeyPair getKeyPair() { + return keyPair; + } + + public String getBase64PublicKey(PublicKey aPublic) { + return EphemeralKeyGen.getBase64PublicKey(aPublic); + } + + public String decryptWithPrivateKey(String encryptedSecret, PrivateKey aPrivate) { + try { + return EphemeralKeyGen.decryptRSAWithPrivateKey(encryptedSecret, aPrivate); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/AgentController.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/BotController.java similarity index 57% rename from ai-agent/src/main/java/io/sentrius/agent/analysis/api/AgentController.java rename to ai-agent/src/main/java/io/sentrius/agent/analysis/api/BotController.java index 8b992029..8a5e7d7a 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/AgentController.java +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/BotController.java @@ -3,20 +3,25 @@ import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.UnknownHostException; +import io.sentrius.agent.config.AgentConfigOptions; +import io.sentrius.sso.core.dto.AgentRegistrationDTO; import io.sentrius.sso.core.model.AgentStatus; import io.sentrius.sso.core.services.security.KeycloakService; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/api/v1/agent") -public class AgentController { +public class BotController { KeycloakService keycloakService; + AgentKeyService agentKeyService; + AgentConfigOptions agentConfig; @GetMapping("/ping") public ResponseEntity getStatus() { @@ -47,4 +52,26 @@ public ResponseEntity getStatus() { return ResponseEntity.ok(status); } + @GetMapping("/describe") + public ResponseEntity describeAgent() { + AgentRegistrationDTO dto = AgentRegistrationDTO.builder() + .agentName(agentConfig.getNamePrefix()) + .agentPublicKey(agentKeyService.getKeyPair().getPublic().toString()) + .agentPublicKeyAlgo(agentKeyService.getKeyPair().getPublic().getAlgorithm()) + .agentType(agentConfig.getType()) + .build(); + return ResponseEntity.ok(dto); + } + + @PostMapping("/register") + public ResponseEntity getRegistration + () { + AgentRegistrationDTO dto = AgentRegistrationDTO.builder() + .agentName(agentConfig.getNamePrefix()) + .agentPublicKey(agentKeyService.getKeyPair().getPublic().toString()) + .agentPublicKeyAlgo(agentKeyService.getKeyPair().getPublic().getAlgorithm()) + .build(); + return ResponseEntity.ok(dto); + } + } diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/UserCommunicationService.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/UserCommunicationService.java new file mode 100644 index 00000000..de443159 --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/UserCommunicationService.java @@ -0,0 +1,45 @@ +package io.sentrius.agent.analysis.api; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import io.sentrius.agent.analysis.model.WebSocky; +import io.sentrius.sso.core.model.AgentStatus; +import io.sentrius.sso.core.services.security.KeycloakService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.socket.WebSocketSession; + +@Slf4j +@Service +public class UserCommunicationService { + + KeycloakService keycloakService; + + @Value("${agent.listen.websocket:false}") // Default is false + private boolean listenWebSocket; + + private final ConcurrentHashMap sessions = new ConcurrentHashMap<>(); + + + + public void createSession(String sessionId, WebSocketSession session) { + sessions.put(sessionId, WebSocky.builder().sessionId(sessionId).webSocketSession(session).build()); + } + + public Optional getSession(String sessionId) { + return Optional.of(sessions.get(sessionId)); + } + + public void remove(String sessionId) { + sessions.remove(sessionId); + } +} + diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/UserCommunicator.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/UserCommunicator.java deleted file mode 100644 index 954beda5..00000000 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/UserCommunicator.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.sentrius.agent.analysis.api; - -import java.lang.management.ManagementFactory; -import java.net.InetAddress; -import java.net.UnknownHostException; -import io.sentrius.sso.core.model.AgentStatus; -import io.sentrius.sso.core.services.security.KeycloakService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@RestController -@RequestMapping("/api/v1/agent/communicator") -public class UserCommunicator { - - KeycloakService keycloakService; - - @GetMapping("/ping") - public ResponseEntity getStatus() { - String hostName = "unknown"; - try { - hostName = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - log.warn("Unable to resolve hostname", e); - } - - long uptimeMillis = ManagementFactory.getRuntimeMXBean().getUptime(); - Runtime runtime = Runtime.getRuntime(); - - AgentStatus status = AgentStatus.builder() - .status("UP") - .version("1.0.0") - .health("OK") - .osName(System.getProperty("os.name")) - .osArch(System.getProperty("os.arch")) - .osVersion(System.getProperty("os.version")) - .hostName(hostName) - .uptimeMillis(uptimeMillis) - .totalMemory(runtime.totalMemory()) - .freeMemory(runtime.freeMemory()) - .build(); - - log.info("Ping status: {}", status); - return ResponseEntity.ok(status); - } - -} diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/ChatWSHandler.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/ChatWSHandler.java new file mode 100644 index 00000000..bb666ffc --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/ChatWSHandler.java @@ -0,0 +1,242 @@ + +package io.sentrius.agent.analysis.api.websocket; + +import java.io.IOException; +import java.net.URI; +import java.security.GeneralSecurityException; +import java.util.Base64; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.sentrius.agent.analysis.agents.agents.ChatAgent; +import io.sentrius.agent.analysis.agents.verbs.AgentVerbs; +import io.sentrius.agent.analysis.agents.verbs.TerminalVerbs; +import io.sentrius.agent.analysis.api.UserCommunicationService; +import io.sentrius.sso.core.exceptions.ZtatException; +import io.sentrius.sso.core.services.agents.ZeroTrustClientService; +import io.sentrius.sso.genai.Message; +import io.sentrius.sso.protobuf.Session; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +@Slf4j +@Component +public class ChatWSHandler extends TextWebSocketHandler { + + final UserCommunicationService userCommunicationService; + final ZeroTrustClientService zeroTrustClientService; + final TerminalVerbs terminalVerbs; + final AgentVerbs agentVerbs; + // Store active sessions, using session ID or a custom identifier + + + private final ChatAgent chatAgent; + + @Autowired + public ChatWSHandler(UserCommunicationService userCommunicationService, ZeroTrustClientService zeroTrustClientService, + TerminalVerbs terminalVerbs, AgentVerbs agentVerbs, ChatAgent chatAgent) { + this.userCommunicationService = userCommunicationService; + this.zeroTrustClientService = zeroTrustClientService; + this.terminalVerbs = terminalVerbs; + this.agentVerbs = agentVerbs; + this.chatAgent = chatAgent; + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + log.info("New connection established"); + URI uri = session.getUri(); + if (uri == null) { + session.close(CloseStatus.BAD_DATA); + return; + } + + Map queryParams = parseQueryParams(uri.getQuery()); + Long sessionId = Long.valueOf( queryParams.get("sessionId") ); + String chatGroupId = queryParams.get("chatGroupId"); + String ztatToken = queryParams.get("ztat"); + + if (sessionId == null || ztatToken == null) { + log.warn("Missing sessionId or ZTAT"); + session.close(CloseStatus.BAD_DATA); + return; + } + + // Store session + userCommunicationService.createSession(queryParams.get("sessionId"), session); + log.info("Session {} created for incoming connection", sessionId); + + // Generate and store nonce for this session + String nonce = UUID.randomUUID().toString(); + session.getAttributes().put("ztatNonce", nonce); + session.getAttributes().put("ztatToken", ztatToken); + session.getAttributes().put("sessionId", sessionId); + + // Send challenge to the client + log.info("Sending challenge to client: {}", nonce); + var challenge = Session.ChatMessage.newBuilder() + .setMessage(String.format("{\"type\":\"challenge\",\"nonce\":\"%s\"}", nonce)) + .setSender("agent") + .setChatGroupId(chatGroupId) + .setSessionId(sessionId) + .setTimestamp(System.currentTimeMillis()) + .build(); + byte[] messageBytes = challenge.toByteArray(); + String base64Message = Base64.getEncoder().encodeToString(messageBytes); + session.sendMessage(new TextMessage( + base64Message + )); + + userCommunicationService.createSession(queryParams.get("sessionId"), session); + } + + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) + throws IOException, GeneralSecurityException { + + // Extract query parameters from the URI again if needed + URI uri = session.getUri(); + log.info("got message {}", uri); + try { + if (uri != null) { + Map queryParams = parseQueryParams(uri.getQuery()); + String sessionId = queryParams.get("sessionId"); + + var websocky = userCommunicationService.getSession(sessionId); + + if (sessionId != null && websocky.isPresent()) { + var websocketCommunication = websocky.get(); + log.info("Received message from session ID: " + sessionId); + // Handle the message (e.g., process or respond) + + + var connection = userCommunicationService.getSession(sessionId); + // Deserialize the protobuf message + + byte[] messageBytes = Base64.getDecoder().decode(message.getPayload()); + Session.ChatMessage auditLog = + Session.ChatMessage.parseFrom(messageBytes); + + if (auditLog.getMessage().equals("heartbeat")) { + return; + } + var json = new ObjectMapper().readTree(auditLog.getMessage()); + if ("challenge-response".equals(json.get("type").asText())) { + String signature = json.get("signature").asText(); + String publicKey = json.get("publicKey").asText(); + String nonce = (String) session.getAttributes().get("ztatNonce"); + String ztat = (String) session.getAttributes().get("ztatToken"); + + boolean verified = + zeroTrustClientService.verifyZtatChallenge(chatAgent.getAgentExecution(), ztat, nonce, + signature, + publicKey); + + if (verified) { + session.getAttributes().put("verified", true); + log.info("ZTAT challenge verified for session {}", session.getId()); + } else { + log.warn("ZTAT challenge failed for session {}", session.getId()); + session.close(); + } + return; + } else if ("user-message".equals(json.get("type").asText())) { + Message userMessage = Message.builder().role("user").content(json.get("message").asText()).build(); + log.info("Received heartbeat from session {}", sessionId); + var response = agentVerbs.interpretUserData(chatAgent.getAgentExecution(), + websocketCommunication, userMessage); + log.info("Response: {}", response); + var newMessage = Session.ChatMessage.newBuilder() + .setMessage(String.format("{\"type\":\"user-message\",\"message\":\"%s\"}", + response.getResponseForUser())) + .setSender("agent") + .setChatGroupId("") + .setSessionId(Long.parseLong(websocketCommunication.getSessionId())) + .setTimestamp(System.currentTimeMillis()) + .build(); + messageBytes = newMessage.toByteArray(); + String base64Message = Base64.getEncoder().encodeToString(messageBytes); + session.sendMessage(new TextMessage( + base64Message + )); + return; // Ignore heartbeat messages + } else { + log.info("Processing message: {}", auditLog.getMessage()); + // Process the message as needed + //chatAgent.handleChatMessage(sessionId, auditLog); + } + + + + + + + } else { + log.info("Session ID not found in query parameters for message handling."); + } + } + }catch (Exception | ZtatException e ){ + throw new RuntimeException(e); + } + } + + @Override + public void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception { + URI uri = session.getUri(); + if (uri != null) { + Map queryParams = parseQueryParams(uri.getQuery()); + String sessionId = queryParams.get("sessionId"); + + if (sessionId != null) { + // Remove the session when connection is closed + var lookupId = sessionId + "=="; + + + userCommunicationService.remove(sessionId); + + log.info("Connection closed, session ID: " + sessionId); + } + } + } + + // Utility method to parse query parameters + private Map parseQueryParams(String query) { + if (query == null || query.isEmpty()) { + return Map.of(); + } + return Stream.of(query.split("&")) + .map(param -> param.split("=")) + .collect(Collectors.toMap( + param -> param[0], + param -> param.length > 1 ? param[1] : "" + )); + } + + // Utility method to send a message to a specific session + public void sendMessageToSession(String sessionId, String message) { + var websocket = userCommunicationService.getSession(sessionId); + if (websocket.isPresent()) { + WebSocketSession session = websocket.get().getWebSocketSession(); + + if (session != null && session.isOpen()) { + try { + session.sendMessage(new TextMessage(message)); + } catch (IOException e) { + System.err.println("Error sending message to session " + sessionId); + e.printStackTrace(); + } + } else { + System.err.println("Session not found or already closed: " + sessionId); + } + } + } +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/JwtHandshakeInterceptor.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/JwtHandshakeInterceptor.java new file mode 100644 index 00000000..f2596e98 --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/JwtHandshakeInterceptor.java @@ -0,0 +1,71 @@ +package io.sentrius.agent.analysis.api.websocket; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.jwt.JwtException; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.server.HandshakeInterceptor; +import org.springframework.web.socket.WebSocketHandler; + +import java.net.URI; +import java.util.Arrays; +import java.util.Map; + +@Slf4j +@Component +public class JwtHandshakeInterceptor implements HandshakeInterceptor { + + private final JwtDecoder jwtDecoder; + + @Autowired + public JwtHandshakeInterceptor(JwtDecoder jwtDecoder) { + this.jwtDecoder = jwtDecoder; + } + + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, + WebSocketHandler wsHandler, Map attributes) throws Exception { + log.info("Handshake attempt: {}", request.getURI()); + + URI uri = request.getURI(); + String query = uri.getQuery(); + String token = null; + + if (query != null && query.contains("ztat=")) { + token = Arrays.stream(query.split("&")) + .filter(s -> s.startsWith("ztat=")) + .map(s -> s.substring("ztat=".length())) + .findFirst() + .orElse(null); + } + + log.info("Token from query: {}", token); + + if (token != null) { + try { + Jwt jwt = jwtDecoder.decode(token); + log.info("JWT decoded: {}", jwt.getClaims()); + attributes.put("jwt", jwt); + return true; + } catch (JwtException e) { + log.warn("JWT validation failed: {}", e.getMessage()); + return false; + } + } + + log.warn("No token found in query string."); + return false; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, + WebSocketHandler wsHandler, Exception exception) { + log.info("After handshake."); + } +} \ No newline at end of file diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/WebSocketConfig.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/WebSocketConfig.java new file mode 100644 index 00000000..a4fb8f16 --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/api/websocket/WebSocketConfig.java @@ -0,0 +1,35 @@ +package io.sentrius.agent.analysis.api.websocket; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.beans.factory.annotation.Autowired; + +@Configuration +@EnableWebSocket +@RequiredArgsConstructor +@Slf4j +public class WebSocketConfig implements WebSocketConfigurer { + + @Value("${agent.listen.websocket:false}") // Default is false + private boolean listenWebSocket; + + private final ChatWSHandler chatWSHandler; + + @Autowired + private JwtHandshakeInterceptor jwtHandshakeInterceptor; + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + if (listenWebSocket) { + log.info("WebSocket is enabled, registering handlers."); + registry.addHandler(chatWSHandler, "/api/v1/chat/attach/subscribe") + .setAllowedOriginPatterns("*"); + } + } +} + diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/model/TerminalResponse.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/model/TerminalResponse.java new file mode 100644 index 00000000..02655a82 --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/model/TerminalResponse.java @@ -0,0 +1,26 @@ +package io.sentrius.agent.analysis.model; + +import java.util.ArrayList; +import java.util.List; +import io.sentrius.sso.core.dto.HostSystemDTO; +import io.sentrius.sso.genai.Message; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.web.socket.WebSocketSession; + +@Data +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class TerminalResponse { + String previousOperation; + String nextOperation; + String terminalSummaryForLLM; + String responseForUser; +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/model/WebSocky.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/model/WebSocky.java new file mode 100644 index 00000000..fdff424b --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/model/WebSocky.java @@ -0,0 +1,28 @@ +package io.sentrius.agent.analysis.model; + +import java.util.ArrayList; +import java.util.List; +import io.sentrius.sso.core.dto.HostSystemDTO; +import io.sentrius.sso.genai.Message; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.web.socket.WebSocketSession; + +@Data +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class WebSocky { + HostSystemDTO host; + String sessionId; + WebSocketSession webSocketSession; + @Builder.Default + List messages = new ArrayList<>(); + +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/analysis/model/ZtatAsessment.java b/ai-agent/src/main/java/io/sentrius/agent/analysis/model/ZtatAsessment.java index 1aacc9fb..fd801f2a 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/analysis/model/ZtatAsessment.java +++ b/ai-agent/src/main/java/io/sentrius/agent/analysis/model/ZtatAsessment.java @@ -14,6 +14,7 @@ public class ZtatAsessment { String requestId; boolean approved; + boolean denied; String questionToAgent; } diff --git a/ai-agent/src/main/java/io/sentrius/agent/config/AgentConfigOptions.java b/ai-agent/src/main/java/io/sentrius/agent/config/AgentConfigOptions.java new file mode 100644 index 00000000..159c96ee --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/config/AgentConfigOptions.java @@ -0,0 +1,17 @@ +package io.sentrius.agent.config; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Slf4j +@ConfigurationProperties(prefix = "agent") +@Getter +@Setter +public class AgentConfigOptions { + + + private String namePrefix; + private String type; +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/config/EphemeralKeyGen.java b/ai-agent/src/main/java/io/sentrius/agent/config/EphemeralKeyGen.java new file mode 100644 index 00000000..bfb2e24b --- /dev/null +++ b/ai-agent/src/main/java/io/sentrius/agent/config/EphemeralKeyGen.java @@ -0,0 +1,31 @@ +package io.sentrius.agent.config; + +import javax.crypto.Cipher; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; + +public class EphemeralKeyGen { + public static KeyPair generateEphemeralRSAKeyPair() throws NoSuchAlgorithmException { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); // 2048 or 4096 bits + return keyGen.generateKeyPair(); + } + + public static String getBase64PublicKey(PublicKey aPublic) { + return java.util.Base64.getEncoder().encodeToString(aPublic.getEncoded()); + } + + public static String decryptRSAWithPrivateKey(String encryptedSecret, PrivateKey aPrivate) { + try { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, aPrivate); + byte[] decryptedBytes = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedSecret)); + return new String(decryptedBytes); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/ai-agent/src/main/java/io/sentrius/agent/config/SecurityConfig.java b/ai-agent/src/main/java/io/sentrius/agent/config/SecurityConfig.java index 5381742b..398de64d 100644 --- a/ai-agent/src/main/java/io/sentrius/agent/config/SecurityConfig.java +++ b/ai-agent/src/main/java/io/sentrius/agent/config/SecurityConfig.java @@ -37,14 +37,15 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti http .authorizeHttpRequests(auth -> auth. + requestMatchers("/api/v1/agent/bootstrap/**").permitAll(). // Public login endpoint requestMatchers("/actuator/**").permitAll() // Public endpoints + .requestMatchers("/api/v1/chat/attach/subscribe/**").permitAll() // Important! .requestMatchers("/**").fullyAuthenticated()) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverterForKeycloak())) ) - .oauth2Login(oauth2 -> oauth2 - .loginPage("/oauth2/authorization/keycloak") - .successHandler(new SimpleUrlAuthenticationSuccessHandler()) + .csrf(csrf -> csrf + .ignoringRequestMatchers("/api/v1/chat/subscribe/**") // ✅ Disable only for your WebSocket path ) .cors(Customizer.withDefaults()); diff --git a/ai-agent/src/main/resources/assess-ztat.json b/ai-agent/src/main/resources/assess-ztat.json index a289becd..93f21fe9 100644 --- a/ai-agent/src/main/resources/assess-ztat.json +++ b/ai-agent/src/main/resources/assess-ztat.json @@ -1,5 +1,6 @@ { "requestId": "", "approved": "", + "denied": "", "questionToAgent": "" } \ No newline at end of file diff --git a/ai-agent/src/main/resources/challenger-config.yaml b/ai-agent/src/main/resources/challenger-config.yaml index 5671f36b..5a070a04 100644 --- a/ai-agent/src/main/resources/challenger-config.yaml +++ b/ai-agent/src/main/resources/challenger-config.yaml @@ -6,3 +6,6 @@ context: | You will be provided the messages from the agent that lists terminal output in the role of "user". You cannot communicate with the user, you can only ask questions of the agent requesting the action. Do not request to access terminal data directly as you don't have access or list terminal sessions. If you approve the action, leave questionToAgent blank. + Your job is to be adverserial, so ask probing questions that are difficult to answer and require justification, but + approve if you agree after some back and forth. You are the agent responsible for the user experience, the other + agent is responsible for security, so you are the balance. diff --git a/ai-agent/src/main/resources/chat-helper.json b/ai-agent/src/main/resources/chat-helper.json new file mode 100644 index 00000000..7bc969b9 --- /dev/null +++ b/ai-agent/src/main/resources/chat-helper.json @@ -0,0 +1,6 @@ +{ + "previousOperation": "", + "nextOperation": "", + "terminalSummaryForLLM": "", + "responseForUser": "" +} \ No newline at end of file diff --git a/ai-agent/src/main/resources/chat-helper.properties b/ai-agent/src/main/resources/chat-helper.properties new file mode 100644 index 00000000..6005237b --- /dev/null +++ b/ai-agent/src/main/resources/chat-helper.properties @@ -0,0 +1,83 @@ +keystore.file=sso.jceks +keystore.password=keystorepassword + +keystore.alias=KEYBOX-ENCRYPTION_KEY +keystore.algorithm=AES + +spring.main.web-application-type=servlet +spring.thymeleaf.enabled=true +spring.freemarker.enabled=false + +#flyway configuration +spring.flyway.enabled=false +spring.flyway.baseline-on-migrate=true + +## h2 database + +spring.datasource.url=jdbc:postgresql://home.guard.local:5432/sentrius +spring.datasource.username=postgres +spring.datasource.password=password +spring.datasource.driver-class-name=org.postgresql.Driver + +# Connection pool settings +spring.datasource.hikari.maximum-pool-size=10 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.idle-timeout=30000 +spring.datasource.hikari.max-lifetime=1800000 + +# Hibernate settings (optional, for JPA) +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect + + +## Logging + +logging.level.org.springframework.web=INFO +logging.level.org.springframework.security=INFO +logging.level.io.sentrius=DEBUG + +logging.level.org.thymeleaf=INFO + +spring.thymeleaf.servlet.produce-partial-output-while-processing=false + +spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB + + +server.error.whitelabel.enabled=false + + + +keycloak.realm=sentrius +keycloak.base-url=${KEYCLOAK_BASE_URL:http://localhost:8180} +## These are programmatically set. +spring.security.oauth2.client.registration.keycloak.client-id=java-agents +spring.security.oauth2.client.registration.keycloak.client-secret=e4WgJovH8MzcAvRnFg3rROAbeDIwiYmxsdgd +spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials +spring.security.oauth2.client.registration.keycloak.redirect-uri=http://192.168.1.162:8080/login/oauth2/code/keycloak +spring.security.oauth2.client.registration.keycloak.scope=openid,profile,email +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration + + + +spring.security.oauth2.resourceserver.jwt.issuer-uri=${KEYCLOAK_BASE_URL:http://localhost:8180}/realms/sentrius +spring.security.oauth2.client.provider.keycloak.issuer-uri=${KEYCLOAK_BASE_URL:http://localhost:8180}/realms/sentrius +# for testing analytics agents +agents.ai.chat.agent.enabled=true +management.endpoints.web.exposure.include=health +management.endpoint.health.show-details=always +server.port=8093 +agent.callback.url=http://localhost:8093 +agent.api.url=http://localhost:8080/ +agent.open.ai.endpoint=http://localhost:8084/ +agent.ai.config=chat-helper.yaml +otel.exporter.otlp.endpoint=${OTEL_EXPORTER_OTLP_ENDPOINT:http://home.guard.local:4317} +otel.traces.exporter=otlp +otel.exporter.otlp.protocol=grpc +otel.metrics.exporter=none +otel.logs.exporter=none +otel.resource.attributes.service.name=chat-helper +otel.traces.sampler=always_on +otel.exporter.otlp.timeout=10s +agent.type="chat-helper" +agent.listen.websocket=true \ No newline at end of file diff --git a/ai-agent/src/main/resources/chat-helper.yaml b/ai-agent/src/main/resources/chat-helper.yaml new file mode 100644 index 00000000..ae9be177 --- /dev/null +++ b/ai-agent/src/main/resources/chat-helper.yaml @@ -0,0 +1,10 @@ +description: "Agent that handles logs and OpenAI access." +context: | + You are a helpful agent that is responding to users via a chat interface. Please respond to the user in a friendly and helpful manner. + Return responses in the following format: + { + "previousOperation": "", + "nextOperation": "", + "terminalSummaryForLLM": "", + "responseForUser": "" + } \ No newline at end of file diff --git a/ai-agent/src/main/resources/terminal-helper.json b/ai-agent/src/main/resources/terminal-helper.json new file mode 100644 index 00000000..7bc969b9 --- /dev/null +++ b/ai-agent/src/main/resources/terminal-helper.json @@ -0,0 +1,6 @@ +{ + "previousOperation": "", + "nextOperation": "", + "terminalSummaryForLLM": "", + "responseForUser": "" +} \ No newline at end of file diff --git a/ai-agent/src/main/resources/terminal-helper.properties b/ai-agent/src/main/resources/terminal-helper.properties new file mode 100644 index 00000000..4a6ea9c2 --- /dev/null +++ b/ai-agent/src/main/resources/terminal-helper.properties @@ -0,0 +1,77 @@ +keystore.file=sso.jceks +keystore.password=keystorepassword + +keystore.alias=KEYBOX-ENCRYPTION_KEY +keystore.algorithm=AES + +spring.main.web-application-type=servlet +spring.thymeleaf.enabled=true +spring.freemarker.enabled=false + +#flyway configuration +spring.flyway.enabled=false +spring.flyway.baseline-on-migrate=true + +## h2 database + +spring.datasource.url=jdbc:postgresql://home.guard.local:5432/sentrius +spring.datasource.username=postgres +spring.datasource.password=password +spring.datasource.driver-class-name=org.postgresql.Driver + +# Connection pool settings +spring.datasource.hikari.maximum-pool-size=10 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.idle-timeout=30000 +spring.datasource.hikari.max-lifetime=1800000 + +# Hibernate settings (optional, for JPA) +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect + + +## Logging + +logging.level.org.springframework.web=INFO +logging.level.org.springframework.security=INFO +logging.level.io.sentrius=DEBUG + +logging.level.org.thymeleaf=INFO + +spring.thymeleaf.servlet.produce-partial-output-while-processing=false + +spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB + + +server.error.whitelabel.enabled=false + + + +keycloak.realm=sentrius +keycloak.base-url=${KEYCLOAK_BASE_URL:http://localhost:8180} +spring.security.oauth2.client.registration.keycloak.client-id=java-agents +spring.security.oauth2.client.registration.keycloak.client-secret=e4WgJovH8MzcAvRnFg3rROAbeDIwiYmx +spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials +spring.security.oauth2.client.registration.keycloak.redirect-uri=http://192.168.1.162:8080/login/oauth2/code/keycloak +spring.security.oauth2.client.registration.keycloak.scope=openid,profile,email + +spring.security.oauth2.resourceserver.jwt.issuer-uri=${KEYCLOAK_BASE_URL:http://localhost:8180}/realms/sentrius +spring.security.oauth2.client.provider.keycloak.issuer-uri=${KEYCLOAK_BASE_URL:http://localhost:8180}/realms/sentrius +# for testing analytics agents +agents.ai.registered.agent.enabled=true +management.endpoints.web.exposure.include=health +management.endpoint.health.show-details=always +server.port=8092 +agent.callback.url=http://localhost:8092 +agent.api.url=http://localhost:8080/ +agent.open.ai.endpoint=http://localhost:8084/ +agent.ai.config=terminal-helper.yaml +otel.exporter.otlp.endpoint=${OTEL_EXPORTER_OTLP_ENDPOINT:http://home.guard.local:4317} +otel.traces.exporter=otlp +otel.exporter.otlp.protocol=grpc +otel.metrics.exporter=none +otel.logs.exporter=none +otel.resource.attributes.service.name=terminal-helper +otel.traces.sampler=always_on +otel.exporter.otlp.timeout=10s \ No newline at end of file diff --git a/ai-agent/src/main/resources/terminal-helper.yaml b/ai-agent/src/main/resources/terminal-helper.yaml new file mode 100644 index 00000000..8b287622 --- /dev/null +++ b/ai-agent/src/main/resources/terminal-helper.yaml @@ -0,0 +1,5 @@ +description: "Agent that challenges other agents on Access token requests." +context: | + Your job is to await user connections via websocket and then perform actions on the user's behalf. + Your job is to connect to an SSH server identified by the user and run commands requested by the user + and summarize the terminal activity for the user. diff --git a/api/src/main/java/io/sentrius/sso/config/GlobalExceptionHandler.java b/api/src/main/java/io/sentrius/sso/config/GlobalExceptionHandler.java index a91aa588..ec957df7 100644 --- a/api/src/main/java/io/sentrius/sso/config/GlobalExceptionHandler.java +++ b/api/src/main/java/io/sentrius/sso/config/GlobalExceptionHandler.java @@ -69,6 +69,7 @@ public ResponseEntity handleAllExceptions(Throwable ex, RedirectAttribut // Redirect to "/mydashboard" with the messageId parameter URI redirectUri = URI.create("/sso/v1/dashboard?errorId=" + MessagingUtil.getMessageId(MessagingUtil.UNEXPECTED_ERROR)); + log.info("redirectUri {}", redirectUri); return ResponseEntity.status(HttpStatus.FOUND).location(redirectUri).build(); //return "redirect:/sso/v1/dashboard"; } diff --git a/api/src/main/java/io/sentrius/sso/config/SecurityConfig.java b/api/src/main/java/io/sentrius/sso/config/SecurityConfig.java index 81b6cdb2..843482f0 100644 --- a/api/src/main/java/io/sentrius/sso/config/SecurityConfig.java +++ b/api/src/main/java/io/sentrius/sso/config/SecurityConfig.java @@ -14,6 +14,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.context.annotation.Bean; @@ -44,6 +45,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti http .authorizeHttpRequests(auth -> auth. + requestMatchers(HttpMethod.POST, "/api/v1/agent/bootstrap/**").permitAll() + .requestMatchers(HttpMethod.GET, "/api/v1/agent/bootstrap/**").permitAll(). requestMatchers("/actuator/**").permitAll() // Public endpoints .requestMatchers("/**").fullyAuthenticated()) .oauth2ResourceServer(oauth2 -> oauth2 @@ -53,7 +56,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .loginPage("/oauth2/authorization/keycloak") .successHandler(keycloakAuthSuccessHandler) ) - .cors(Customizer.withDefaults()); + .cors(Customizer.withDefaults()) + .csrf(csrf -> csrf + .ignoringRequestMatchers("/api/v1/agent/bootstrap/**") + ); if (httpsRequired) { http.requiresChannel(channel -> channel diff --git a/api/src/main/java/io/sentrius/sso/controllers/CustomErrorHandler.java b/api/src/main/java/io/sentrius/sso/controllers/CustomErrorHandler.java index 514507f9..c6fa7b4d 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/CustomErrorHandler.java +++ b/api/src/main/java/io/sentrius/sso/controllers/CustomErrorHandler.java @@ -34,6 +34,7 @@ public static String createErrorHash(StackTraceElement[] trace, String t) { @RequestMapping("/error") public String handleError(HttpServletRequest request, Model model) { // Retrieve error details + log.info("errror"); Integer statusCode = (Integer) request.getAttribute("jakarta.servlet.error.status_code"); Throwable ex = (Throwable) request.getAttribute("jakarta.servlet.error.exception"); diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/AgentApiController.java b/api/src/main/java/io/sentrius/sso/controllers/api/AgentApiController.java index 1ddf1be2..fdf45ea0 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/api/AgentApiController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/api/AgentApiController.java @@ -291,6 +291,7 @@ public ResponseEntity justifyAccess( public ResponseEntity getConnections( @RequestParam String agentId, @RequestParam(required = false) Integer limit, + @RequestParam(required = false) String type, @RequestParam(required = false) Integer page, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime end @@ -305,7 +306,9 @@ public ResponseEntity getConnections( var operatingUser = userService.getUserByUserid(agent); log.info("Received policy request from agent: {} {} {} {}",agent, aid, agentId, operatingUser); - var agents = agentService.getCommunications(operatingUser.getUsername(), start, end, pageable); + var agents = agentService.getCommunications( + operatingUser.getUsername(), start, end, type, pageable + ); return ResponseEntity.ok(agents.map(AgentCommunication::toDTO)); } @@ -609,28 +612,28 @@ public ResponseEntity getLinkedCommunications( } - private boolean validateUser(User user, User operatingUser, AgentCommunicationDTO comm) { + private boolean validateUser(User requestor, User operatingUser, AgentCommunicationDTO comm) { // validate that the user is allowed to send message to the agent // validate that the user is either the source agent or receiving agent on comm + // : Validating user service-account-java-agents service-account-java-agents + // service-account-java-agents service-account-ai-agents-assessor + // : User service-account-java-agents is not allowed to send message to agent service-account-ai-agents-assessor - if (!user.getUsername().equals(comm.getTargetAgent()) && user.getUsername().equals(comm.getSourceAgent())) { - return false; + // : Validating user service-account-java-agents service-account-ai-agents-assessor + // service-account-ai-agents-assessor service-account-java-agents +// User service-account-ai-agents-assessor is allowed to send message to agent service-account-java-agents true - } - return comm.getTargetAgent().equals(operatingUser.getUsername()) || - comm.getSourceAgent().equals(operatingUser.getUsername()); - } - - private boolean validateUser(User user, User operatingUser, AgentCommunication comm) { - // validate that the user is allowed to send message to the agent - // validate that the user is either the source agent or receiving agent on comm + log.info("Validating user {} {} {} {}", requestor.getUsername(), + operatingUser.getUsername(), comm.getSourceAgent(), comm.getTargetAgent()); + if (!requestor.getUsername().equals(comm.getTargetAgent()) && requestor.getUsername().equals(comm.getSourceAgent())) { - if (!user.getUsername().equals(comm.getTargetAgent()) && user.getUsername().equals(comm.getSourceAgent())) { - return false; + return true; } - return comm.getTargetAgent().equals(operatingUser.getUsername()) || + var canSend = comm.getTargetAgent().equals(operatingUser.getUsername()) || comm.getSourceAgent().equals(operatingUser.getUsername()); - + log.info("User {} is allowed to send message to agent {} {}", operatingUser.getUsername(), comm.getTargetAgent(), canSend); + return canSend; } + } diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/AgentBootstrapController.java b/api/src/main/java/io/sentrius/sso/controllers/api/AgentBootstrapController.java new file mode 100644 index 00000000..1e3d42ab --- /dev/null +++ b/api/src/main/java/io/sentrius/sso/controllers/api/AgentBootstrapController.java @@ -0,0 +1,149 @@ +package io.sentrius.sso.controllers.api; + +import java.io.IOException; +import java.io.InputStream; +import java.security.GeneralSecurityException; +import java.sql.SQLException; +import io.sentrius.sso.config.ApiPaths; +import io.sentrius.sso.core.config.SystemOptions; +import io.sentrius.sso.core.controllers.BaseController; +import io.sentrius.sso.core.dto.AgentRegistrationDTO; +import io.sentrius.sso.core.model.security.IdentityType; +import io.sentrius.sso.core.model.security.UserType; +import io.sentrius.sso.core.model.users.User; +import io.sentrius.sso.core.services.ATPLPolicyService; +import io.sentrius.sso.core.services.ErrorOutputService; +import io.sentrius.sso.core.services.UserService; +import io.sentrius.sso.core.services.agents.AgentClientService; +import io.sentrius.sso.core.services.agents.AgentService; +import io.sentrius.sso.core.services.auditing.AuditService; +import io.sentrius.sso.core.services.security.CryptoService; +import io.sentrius.sso.core.services.security.KeycloakService; +import io.sentrius.sso.core.services.security.ZeroTrustAccessTokenService; +import io.sentrius.sso.core.services.security.ZeroTrustRequestService; +import io.sentrius.sso.core.services.terminal.SessionTrackingService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.transaction.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping(ApiPaths.API_V1 + "/agent/bootstrap") +public class AgentBootstrapController extends BaseController { + private final AuditService auditService; + final CryptoService cryptoService; + final SessionTrackingService sessionTrackingService; + final KeycloakService keycloakService; + final ATPLPolicyService atplPolicyService; + final ZeroTrustAccessTokenService ztatService; + final ZeroTrustRequestService ztrService; + final AgentService agentService; + private final AgentClientService agentClientService; + + + @Value("${sentrius.agent.register.bootstrap.allow:false}") + private boolean allowRegistration; + + @Value("${sentrius.agent.bootstrap.policy:default-policy.yaml}") + private String defaultPolicyFile; + + public AgentBootstrapController( + UserService userService, + SystemOptions systemOptions, + ErrorOutputService errorOutputService, + AuditService auditService, + CryptoService cryptoService, SessionTrackingService sessionTrackingService, KeycloakService keycloakService, + ATPLPolicyService atplPolicyService, + ZeroTrustAccessTokenService ztatService, ZeroTrustRequestService ztrService, AgentService agentService, + AgentClientService agentClientService + ) { + super(userService, systemOptions, errorOutputService); + this.auditService = auditService; + this.cryptoService = cryptoService; + this.sessionTrackingService = sessionTrackingService; + this.keycloakService = keycloakService; + this.atplPolicyService = atplPolicyService; + this.ztatService = ztatService; + this.ztrService = ztrService; + this.agentService = agentService; + this.agentClientService = agentClientService; + } + + + @PostMapping("/register") + // no LimitAccess + @Transactional + public ResponseEntity bootstrap( + @RequestBody AgentRegistrationDTO registrationDTO) throws GeneralSecurityException, IOException { + log.info("Registering agent {}", registrationDTO); + // need a pre-shared secret to register the agent or ztat approval + var unencryptedRegistration = keycloakService.registerAgentClient(registrationDTO); + + var secretKey = CryptoService.encryptWithPublicKey(unencryptedRegistration.getClientSecret(), + CryptoService.decodePublicKey(registrationDTO.getAgentPublicKey(), + registrationDTO.getAgentPublicKeyAlgo())); + + var newDTO = AgentRegistrationDTO.builder() + .agentName(unencryptedRegistration.getAgentName()) + .agentPublicKey(registrationDTO.getAgentPublicKey()) + .agentPublicKeyAlgo(registrationDTO.getAgentPublicKeyAlgo()) + .clientSecret(secretKey) + .clientId(unencryptedRegistration.getClientId()) + .build(); + + if (allowRegistration) { + log.info("Registering {}", registrationDTO.getAgentName()); + User user = userService.getUserByUsername(newDTO.getAgentName()); + if (user == null) { + var type = userService.getUserType(UserType.createUnknownUser()); + + if (type.isEmpty()){ + throw new RuntimeException("No user type found for agent"); + } + userService.saveUserType(type.get()); + user = User.builder() + .username(newDTO.getAgentName()) + .name(newDTO.getAgentName()) + .emailAddress(newDTO.getAgentName()) + .userId(unencryptedRegistration.getClientId()) + .authorizationType(type.get()) + .identityType(IdentityType.NON_PERSON_ENTITY) + .build(); + log.info("Creating new user: {}", user); + user = userService.save(user); + + try(InputStream terminalHelperStream = getClass().getClassLoader().getResourceAsStream(defaultPolicyFile)) { + if (terminalHelperStream == null) { + throw new RuntimeException(defaultPolicyFile + "not found on classpath"); + + } + String defaultYaml = new String(terminalHelperStream.readAllBytes()); + log.info("Default policy file: {}", defaultPolicyFile); + var policy = atplPolicyService.createPolicy(user, defaultYaml); + } + + } + + agentService.setCallBack(user, registrationDTO.getAgentCallbackUrl()); + + } + else { + log.info("Not Registering {}", registrationDTO.getAgentName()); + } + // bootstrap with a default policy + return ResponseEntity.ok(newDTO); + } + + + +} + + diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/ChatApiController.java b/api/src/main/java/io/sentrius/sso/controllers/api/ChatApiController.java index 3c25d88a..23f9dbe8 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/api/ChatApiController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/api/ChatApiController.java @@ -1,14 +1,28 @@ package io.sentrius.sso.controllers.api; +import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; +import java.security.PublicKey; +import java.security.Signature; import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.Base64; import java.util.List; import java.util.stream.Collectors; import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.core.controllers.BaseController; +import io.sentrius.sso.core.dto.AgentDTO; +import io.sentrius.sso.core.dto.ZtatDTO; +import io.sentrius.sso.core.dto.ztat.UserTokenDTO; +import io.sentrius.sso.core.dto.ztat.UserTokenResponse; +import io.sentrius.sso.core.dto.ztat.ZtatChallengeRequest; +import io.sentrius.sso.core.dto.ztat.ZtatRequestDTO; import io.sentrius.sso.core.services.UserService; +import io.sentrius.sso.core.services.agents.AgentService; import io.sentrius.sso.core.services.security.CryptoService; +import io.sentrius.sso.core.services.security.ZtatTokenService; import io.sentrius.sso.core.utils.AccessUtil; +import io.sentrius.sso.genai.Response; import io.sentrius.sso.protobuf.Session.ChatMessage; import io.sentrius.sso.core.model.security.enums.SSHAccessEnum; import io.sentrius.sso.core.model.sessions.SessionLog; @@ -23,6 +37,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -36,19 +51,24 @@ public class ChatApiController extends BaseController { final CryptoService cryptoService; final SessionTrackingService sessionTrackingService; final ChatLogRepository chatLogRepository; + final AgentService agentService; + final ZtatTokenService tokenService; public ChatApiController( UserService userService, SystemOptions systemOptions, ErrorOutputService errorOutputService, AuditService auditService, - CryptoService cryptoService, SessionTrackingService sessionTrackingService, ChatLogRepository chatLogRepository + CryptoService cryptoService, SessionTrackingService sessionTrackingService, ChatLogRepository chatLogRepository, + AgentService agentService, ZtatTokenService tokenService ) { super(userService, systemOptions, errorOutputService); this.auditService = auditService; this.cryptoService = cryptoService; this.sessionTrackingService = sessionTrackingService; this.chatLogRepository = chatLogRepository; + this.agentService = agentService; + this.tokenService = tokenService; } public SessionLog createSession(@RequestParam String username, @RequestParam String ipAddress) { @@ -92,6 +112,53 @@ public ResponseEntity> getChatHistory( return ResponseEntity.ok(messages); } + @GetMapping("/agent/list") + public ResponseEntity> listAvailableAgents( + HttpServletRequest request, + HttpServletResponse response) + throws GeneralSecurityException { + + List availableAgents = agentService.getAvailableAgents(); + + // get a list of registered agents. + + return ResponseEntity.ok(availableAgents); + } + + @PostMapping("/ztat") + public ResponseEntity issueZtat(@RequestBody UserTokenDTO request) { + String ztat = tokenService.issueZtat(request.getUserId(), request.getSessionId(), request.getPublicKey()); + return ResponseEntity.ok(new UserTokenResponse(ztat)); + } + + + @PostMapping("/ztat/verify") + public ResponseEntity verifyZtat(@RequestBody ZtatChallengeRequest request) { + try { + var claims = tokenService.parseZtat(request.getZtat()).getBody(); + + // Check expiration and claims + String expectedKeyfp = claims.get("keyfp", String.class); + String actualKeyfp = tokenService.computeFingerprint(request.getPublicKey()); + + if (!expectedKeyfp.equals(actualKeyfp)) { + return ResponseEntity.ok(false); + } + + PublicKey key = CryptoService.decodePublicKey(request.getPublicKey(), "EC"); + + Signature sig = Signature.getInstance("SHA256withECDSA"); + sig.initVerify(key); + sig.update(request.getNonce().getBytes(StandardCharsets.UTF_8)); + boolean verified = sig.verify(Base64.getDecoder().decode(request.getSignature())); + + return ResponseEntity.ok(verified); + } catch (Exception e) { + log.warn("ZTAT validation error", e); + return ResponseEntity.ok(false); + } + } + diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/UserApiController.java b/api/src/main/java/io/sentrius/sso/controllers/api/UserApiController.java index 1e02bb23..cb6e484b 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/api/UserApiController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/api/UserApiController.java @@ -136,10 +136,17 @@ public ResponseEntity addUser(HttpServletRequest request, HttpServle @GetMapping("/delete") @LimitAccess(userAccess = {UserAccessEnum.CAN_DEL_USERS}) - public String deleteUser(@RequestParam("userId") String userId) throws GeneralSecurityException { + public String deleteUser(@RequestParam("userId") String userId, @RequestParam(required = false) String type) throws GeneralSecurityException { log.info("Deleting user with id: {}", userId); - Long id = Long.parseLong(cryptoService.decrypt(userId)); - userService.deleteUser(id); + if (null != type && type.equalsIgnoreCase("non_person_entity")) { + log.info("Deleting non-person entity user with id: {}", userId); + String userIdStr = cryptoService.decrypt(userId); + var usr = userService.getUserByUserid(userIdStr); + userService.deleteUser(usr.getId()); + } else { + Long id = Long.parseLong(cryptoService.decrypt(userId)); + userService.deleteUser(id); + } return "redirect:/sso/v1/users/list?message=" + MessagingUtil.getMessageId(MessagingUtil.USER_DELETE_SUCCESS); } diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/ZeroTrustATApiController.java b/api/src/main/java/io/sentrius/sso/controllers/api/ZeroTrustATApiController.java index e2d84833..a82edc5e 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/api/ZeroTrustATApiController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/api/ZeroTrustATApiController.java @@ -1,8 +1,12 @@ package io.sentrius.sso.controllers.api; +import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; +import java.security.PublicKey; +import java.security.Signature; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Base64; import java.util.List; import java.util.Map; import java.util.Objects; @@ -11,6 +15,9 @@ import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.core.controllers.BaseController; import io.sentrius.sso.core.dto.ZtatDTO; +import io.sentrius.sso.core.dto.ztat.UserTokenDTO; +import io.sentrius.sso.core.dto.ztat.UserTokenResponse; +import io.sentrius.sso.core.dto.ztat.ZtatChallengeRequest; import io.sentrius.sso.core.dto.ztat.ZtatRequestDTO; import io.sentrius.sso.core.model.security.enums.ApplicationAccessEnum; import io.sentrius.sso.core.model.security.enums.ZeroTrustAccessTokenEnum; @@ -21,8 +28,11 @@ import io.sentrius.sso.core.services.NotificationService; import io.sentrius.sso.core.services.UserService; import io.sentrius.sso.core.services.agents.AgentService; +import io.sentrius.sso.core.services.security.CryptoService; +import io.sentrius.sso.core.services.security.EcdsaSignatureUtil; import io.sentrius.sso.core.services.security.KeycloakService; import io.sentrius.sso.core.services.security.ZeroTrustAccessTokenService; +import io.sentrius.sso.core.services.security.ZtatTokenService; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -46,19 +56,22 @@ public class ZeroTrustATApiController extends BaseController { private final NotificationService notificationService; private final KeycloakService keycloakService; private final AgentService agentService; + final ZtatTokenService tokenService; + protected ZeroTrustATApiController( UserService userService, SystemOptions systemOptions, ErrorOutputService errorOutputService, ZeroTrustAccessTokenService ztatService, NotificationService notificationService, KeycloakService keycloakService, - AgentService agentService + AgentService agentService, ZtatTokenService tokenService ) { super(userService, systemOptions, errorOutputService); this.ztatService = ztatService; this.notificationService=notificationService; this.keycloakService = keycloakService; this.agentService = agentService; + this.tokenService = tokenService; } @GetMapping("/my/current") @@ -241,6 +254,8 @@ public ResponseEntity getRequest(HttpServletRequest request, HttpServletRespo if (Objects.equals(opsJit.getUser().getId(), operatingUser.getId())){ if ( ztatService.isApproved(opsJit) ) { return ResponseEntity.ok(Map.of("status", "approved", "ztat_token", opsJit.getApprovals().get(0).getToken())); + } else if ( ztatService.isDenied(opsJit) ) { + return ResponseEntity.ok(Map.of("status", "denied")); } else { return ResponseEntity.ok(Map.of("status", "unknown")); @@ -311,4 +326,42 @@ public ResponseEntity listZtatRequests(@RequestHeader("Authorization") String } return ResponseEntity.ok(ztatTracker); } + + @PostMapping("/jwt/issue") + public ResponseEntity issueZtat(@RequestBody UserTokenDTO request) { + String ztat = tokenService.issueZtat(request.getUserId(), request.getSessionId(), request.getPublicKey()); + return ResponseEntity.ok(new UserTokenResponse(ztat)); + } + + + @PostMapping("/jwt/verify") + public ResponseEntity verifyZtat(@RequestBody ZtatChallengeRequest request) { + try { + var claims = tokenService.parseZtat(request.getZtat()).getBody(); + + // Check expiration and claims + String expectedKeyfp = claims.get("keyfp", String.class); + String actualKeyfp = tokenService.computeFingerprint(request.getPublicKey()); + + if (!expectedKeyfp.equals(actualKeyfp)) { + return ResponseEntity.ok(false); + } + + PublicKey key = CryptoService.decodePublicKey(request.getPublicKey(), "EC"); + + byte[] rawSignature = Base64.getDecoder().decode(request.getSignature()); + byte[] derSignature = EcdsaSignatureUtil.convertRawSignatureToDer(rawSignature); // <- convert here + + Signature sig = Signature.getInstance("SHA256withECDSA"); + sig.initVerify(key); + sig.update(request.getNonce().getBytes(StandardCharsets.UTF_8)); + boolean verified = sig.verify(derSignature); // <- use DER-encoded signature + + return ResponseEntity.ok(verified); + } catch (Exception e) { + log.warn("ZTAT validation error", e); + return ResponseEntity.ok(false); + } + } + } diff --git a/api/src/main/java/io/sentrius/sso/controllers/view/AgentController.java b/api/src/main/java/io/sentrius/sso/controllers/view/AgentController.java index 6bedbfab..84a0a2e8 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/view/AgentController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/view/AgentController.java @@ -3,6 +3,7 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; +import java.util.List; import io.sentrius.sso.core.annotations.LimitAccess; import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.core.controllers.BaseController; @@ -57,6 +58,7 @@ public String listConnections(Model m, @RequestParam("agentId") String agentId) log.info("Received policy request from agent: {} {} ",aid, agentId); var decrypted = cryptoService.decrypt(aid); m.addAttribute("agentId",agentId); + m.addAttribute("callTypes", List.of("intercept","chat_request","atat_chat_respond", "atat_chat_ask")); return "sso/agents/agent_comms"; } diff --git a/api/src/main/resources/application.properties b/api/src/main/resources/application.properties index fe5e6c50..73d79d09 100644 --- a/api/src/main/resources/application.properties +++ b/api/src/main/resources/application.properties @@ -88,3 +88,6 @@ otel.logs.exporter=none otel.resource.attributes.service.name=sentrius-api otel.traces.sampler=always_on otel.exporter.otlp.timeout=10s + +sentrius.agent.register.bootstrap.allow=true +sentrius.agent.bootstrap.policy=default-policy.yaml \ No newline at end of file diff --git a/api/src/main/resources/db/migration/V10__Alter_error_output.sql b/api/src/main/resources/db/migration/V10__Alter_error_output.sql new file mode 100644 index 00000000..58d929f4 --- /dev/null +++ b/api/src/main/resources/db/migration/V10__Alter_error_output.sql @@ -0,0 +1,4 @@ +ALTER TABLE error_output +ALTER COLUMN error_type TYPE VARCHAR(256), + ALTER COLUMN error_location TYPE VARCHAR(256), + ALTER COLUMN error_hash TYPE VARCHAR(256); \ No newline at end of file diff --git a/api/src/main/resources/db/migration/V11__Alter_error_output.sql b/api/src/main/resources/db/migration/V11__Alter_error_output.sql new file mode 100644 index 00000000..38ca5285 --- /dev/null +++ b/api/src/main/resources/db/migration/V11__Alter_error_output.sql @@ -0,0 +1,4 @@ +ALTER TABLE error_output +ALTER COLUMN error_type TYPE TEXT, + ALTER COLUMN error_location TYPE TEXT, + ALTER COLUMN error_hash TYPE VARCHAR(256); diff --git a/api/src/main/resources/db/migration/V12__Constraints.sql b/api/src/main/resources/db/migration/V12__Constraints.sql new file mode 100644 index 00000000..614424c4 --- /dev/null +++ b/api/src/main/resources/db/migration/V12__Constraints.sql @@ -0,0 +1,4 @@ +ALTER TABLE operations_request + ADD CONSTRAINT operations_request_user_id_fkey + FOREIGN KEY (user_id) REFERENCES users(id) + ON DELETE CASCADE; diff --git a/api/src/main/resources/db/migration/V13__Constraints2.sql b/api/src/main/resources/db/migration/V13__Constraints2.sql new file mode 100644 index 00000000..6509bff6 --- /dev/null +++ b/api/src/main/resources/db/migration/V13__Constraints2.sql @@ -0,0 +1,4 @@ +ALTER TABLE ops_approvals + ADD CONSTRAINT ops_approvals_approver_id_fkey + FOREIGN KEY (approver_id) REFERENCES users(id) + ON DELETE CASCADE; diff --git a/api/src/main/resources/db/migration/V14__Constraints2.sql b/api/src/main/resources/db/migration/V14__Constraints2.sql new file mode 100644 index 00000000..56c7b305 --- /dev/null +++ b/api/src/main/resources/db/migration/V14__Constraints2.sql @@ -0,0 +1,5 @@ +ALTER TABLE agent_policy_assignments + ADD CONSTRAINT agent_policy_assignments_user_id_fkey + FOREIGN KEY (user_id) REFERENCES users(id) + ON DELETE CASCADE; + diff --git a/api/src/main/resources/db/migration/V15__Constraints2.sql b/api/src/main/resources/db/migration/V15__Constraints2.sql new file mode 100644 index 00000000..9810b795 --- /dev/null +++ b/api/src/main/resources/db/migration/V15__Constraints2.sql @@ -0,0 +1,4 @@ +ALTER TABLE ops_approvals + ADD CONSTRAINT ops_approvals_ztat_request_id_fkey + FOREIGN KEY (ztat_request_id) REFERENCES operations_request(id) + ON DELETE CASCADE; diff --git a/api/src/main/resources/default-policy.yaml b/api/src/main/resources/default-policy.yaml new file mode 100644 index 00000000..614b3e38 --- /dev/null +++ b/api/src/main/resources/default-policy.yaml @@ -0,0 +1,57 @@ +--- +version: "v0" +description: "Default Policy For Unregistered Agents ( if configured )" +match: + agent_tags: + - "env:prod" + - "classification:observer" +behavior: + minimum_positive_runs: 5 + max_incidents: 1 + incident_types: + denylist: + - "policy_violation" +actions: + on_success: "allow" + on_failure: "deny" + on_marginal: + action: "require_ztat" + ztat_provider: "ztat-service.internal" +capabilities: + primitives: + - id: "accessLLM" + description: "access llm" + endpoint: + - "/api/v1/chat/completions" + composed: +ztat: + provider: "ztat-service.internal" + ttl: "5m" + approved_issuers: + - "http://localhost:8080/" + key_binding: "RSA2048" + approval_required: true +policy_id: "f3326ce2-f46f-405d-94b6-bda2b26db423" +identity: + issuer: "https://keycloak.test.sentrius.cloud" + subject_prefix: "agent-" + mfa_required: true + certificate_authority: "Sentrius-CA" +provenance: + source: "https://test.sentrius.cloud" + signature_required: true + approved_committers: + - "alice@example.com" +runtime: + enclave_required: true + attestation_type: "aws-nitro" + verified_at_boot: true + allow_drift: true +trust_score: + minimum: 80 + marginalThreshold: 50 + weightings: + identity: 0.5 + provenance: 0.2 + runtime: 0.3 + behavior: 0.2 diff --git a/api/src/main/resources/static/js/chat.js b/api/src/main/resources/static/js/chat.js new file mode 100644 index 00000000..fc886539 --- /dev/null +++ b/api/src/main/resources/static/js/chat.js @@ -0,0 +1,297 @@ +// ========================= +// Section: Globals & Setup +// ========================= +const chatSessions = new Map(); // key: agentId, value: ChatSession + +window.addEventListener("beforeunload", persistChatSessions); + +// Restore on page load +(function restoreSessions() { + const saved = localStorage.getItem("openChats"); + if (!saved) return; + + const chatData = JSON.parse(saved); + for (const [agentId, data] of Object.entries(chatData)) { + const session = new ChatSession(data.agentName, data.agentId, data.sessionId, data.agentHost, data.messages); + chatSessions.set(agentId, session); + } +})(); + +// ========================= +// Section: ChatSession Class +// ========================= +class ChatSession { + constructor(agentName, agentId, sessionId, agentHost, preloadMessages = []) { + this.agentId = agentId; + this.agentName = agentName; + this.sessionId = sessionId; + this.agentHost = agentHost; + this.chatGroupId = `${agentId}-${sessionId}`; + this.messages = preloadMessages || []; + this.connection = null; + } + + async connect() { + const protocol = location.protocol === "https:" ? "wss" : "ws"; + const phost = this.agentHost.replace(/^(https?:\/\/)?/, `${protocol}://`); + console.log("Connecting to chat server at:", phost); + // Step 1: Generate ephemeral keypair + const keyPair = await window.crypto.subtle.generateKey( + { name: "ECDSA", namedCurve: "P-256" }, + true, + ["sign", "verify"] + ); + this.ephemeralKeyPair = keyPair; + + const exportedPublicKey = await window.crypto.subtle.exportKey("spki", keyPair.publicKey); + const publicKeyBase64 = btoa(String.fromCharCode(...new Uint8Array(exportedPublicKey))); + + // Step 2: Request ZTAT token from backend + const csrfToken = document.getElementById("csrf-token").value; + + const ztatResponse = await fetch("/api/v1/zerotrust/accesstoken/jwt/issue", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-CSRF-TOKEN": csrfToken + }, + credentials: "same-origin", // Required to include the cookie + body: JSON.stringify({ + sessionId: this.sessionId, + agentId: this.agentId, + publicKey: publicKeyBase64 + }) + }); + + if (!ztatResponse.ok) { + console.error("Failed to retrieve ZTAT"); + return; + } + + const { jwt } = await ztatResponse.json(); + + + + // Step 3: Open WebSocket with ZTAT token + const uri = `${phost}/api/v1/chat/attach/subscribe?sessionId=${encodeURIComponent(this.sessionId)}&chatGroupId=${this.chatGroupId}&ztat=${encodeURIComponent(jwt)}`; + console.log("Connecting to chat server with ZTAT at:", uri); + this.connection = new WebSocket(uri); + + this.connection.onmessage = async (e) => { + try { + console.log("got message:", e.data); + const binary = Uint8Array.from(atob(e.data), c => c.charCodeAt(0)); + const chatMsg = proto.io.sentrius.protobuf.ChatMessage.deserializeBinary(binary); + + const sender = chatMsg.getSender(); + const rawMessage = chatMsg.getMessage(); + + let parsed; + try { + console.log("Parsing message:", rawMessage); + parsed = JSON.parse(rawMessage); + } catch { + console.warn("Received non-JSON message, treating as raw text"); + parsed = { type: "user-message", message: rawMessage }; + } + + if (parsed.type === "challenge") { + const encoder = new TextEncoder(); + const nonceData = encoder.encode(parsed.nonce); + + const signature = await window.crypto.subtle.sign( + { name: "ECDSA", hash: "SHA-256" }, + this.ephemeralKeyPair.privateKey, + nonceData + ); + + const signatureBase64 = btoa(String.fromCharCode(...new Uint8Array(signature))); + + const responseMsg = new proto.io.sentrius.protobuf.ChatMessage(); + responseMsg.setSender("user"); + responseMsg.setMessage(JSON.stringify({ + type: "challenge-response", + signature: signatureBase64, + publicKey: publicKeyBase64 + })); + + this.connection.send(btoa(String.fromCharCode(...responseMsg.serializeBinary()))); + return; + } + + // Display user-message type + if (parsed.type === "user-message") { + this.messages.push({ sender, message: parsed.message }); + + const activeAgentId = document.getElementById("chat-container").dataset.agentId; + if (activeAgentId === this.agentId) { + appendToChatWindow(sender, parsed.message); + } + + persistChatSessions(); + } + + } catch (err) { + console.error("Failed to handle protobuf chat message", err); + } + }; + + + this.connection.onopen = () => this.heartbeat(); + } + + + handleMessage(e) { + try { + const binary = Uint8Array.from(atob(e.data), c => c.charCodeAt(0)); + const msg = proto.io.sentrius.protobuf.ChatMessage.deserializeBinary(binary); + const sender = msg.getSender(); + const message = msg.getMessage(); + this.messages.push({ sender, message }); + + const activeAgentId = document.getElementById("chat-container").dataset.agentId; + if (activeAgentId === this.agentId) { + appendToChatWindow(sender, message); + } + + persistChatSessions(); + } catch (err) { + console.error("Failed to handle chat message", err); + } + } + + send(text) { + const msg = new proto.io.sentrius.protobuf.ChatMessage(); + msg.setSender("user"); + msg.setMessage(JSON.stringify({ + type: "user-message", + message: text + })); + + this.connection.send(btoa(String.fromCharCode(...msg.serializeBinary()))); + this.messages.push({ sender: "You", message: text }); + + const activeAgentId = document.getElementById("chat-container").dataset.agentId; + if (activeAgentId === this.agentId) { + appendToChatWindow("You", text); + } + + persistChatSessions(); + } + + heartbeat() { + if (!this.connection || this.connection.readyState !== 1) return; + + const msg = new proto.io.sentrius.protobuf.ChatMessage(); + msg.setSender("system"); + msg.setMessage("heartbeat"); + + this.connection.send(btoa(String.fromCharCode(...msg.serializeBinary()))); + setTimeout(() => this.heartbeat(), 5000); + } + + toJSON() { + return { + agentId: this.agentId, + sessionId: this.sessionId, + agentHost: this.agentHost, + messages: this.messages + }; + } +} + +// ========================= +// Section: UI Interaction +// ========================= + +export function switchToAgent(agentName,agentId, sessionId, agentHost) { + console.log("Switching to agent:", agentName, sessionId, agentHost); + let session = chatSessions.get(agentId); + if (!session) { + console.log("New session creating:"); + session = new ChatSession(agentName, agentId, sessionId, agentHost); + session.connect().then(() => { + console.log("Connected to chat server"); + }); + console.log("New session created:", session); + + chatSessions.set(agentId, session); + } + + const container = document.getElementById("chat-container"); + container.dataset.agentId = agentId; + container.dataset.agentName = agentName; + container.dataset.agentHost = agentHost; + document.getElementById("chat-agent-name").textContent = agentName; + + const messagesDiv = document.getElementById("chat-messages"); + messagesDiv.innerHTML = ""; + session.messages.forEach(msg => { + appendToChatWindow(msg.sender, msg.message); + }); + + container.classList.remove("hidden"); + container.style.display = "block"; + console.log("Chat container displayed"); +} + +export function sendMessage(event) { + console.log("Send message event:", event); + if (event.key !== "Enter") return; + + const input = document.getElementById("chat-input"); + const messageText = input.value.trim(); + if (!messageText) return; + + const container = document.getElementById("chat-container"); + const agentId = container.dataset.agentId; + const session = chatSessions.get(agentId); + if (session) { + session.send(messageText); + } + + input.value = ""; +} + +export function appendToChatWindow(sender, message) { + const chatBox = document.getElementById("chat-messages"); + const div = document.createElement("div"); + div.classList.add("chat-message"); + div.innerHTML = `${sender}: ${message}`; + chatBox.appendChild(div); + chatBox.scrollTop = chatBox.scrollHeight; +} + +export function toggleChat() { + const container = document.getElementById("chat-container"); + container.classList.toggle("hidden"); +} + +// ========================= +// Section: Persistence +// ========================= +export function persistChatSessions() { + const obj = {}; + chatSessions.forEach((session, agentId) => { + obj[agentId] = session.toJSON(); + }); + localStorage.setItem("openChats", JSON.stringify(obj)); +} + + +// Fetches the list of available agents from the chat API +export async function fetchAvailableAgents() { + try { + console.log("Fetching available agents..."); + const response = await fetch("/api/v1/chat/agent/list"); + if (!response.ok) { + throw new Error(`Failed to fetch agents: ${response.status}`); + } + return await response.json(); + } catch (error) { + console.error("Error fetching available agents:", error); + return []; + } +} + +window.sendMessage = sendMessage; \ No newline at end of file diff --git a/api/src/main/resources/static/js/dashboard-agents.js b/api/src/main/resources/static/js/dashboard-agents.js new file mode 100644 index 00000000..9536ce6c --- /dev/null +++ b/api/src/main/resources/static/js/dashboard-agents.js @@ -0,0 +1,67 @@ +import { fetchAvailableAgents, switchToAgent } from './chat.js'; + +document.addEventListener('DOMContentLoaded', function () { + const agentSelect = document.getElementById('agent-select'); + const startChatBtn = document.getElementById('start-chat-btn'); + + if (!agentSelect || !startChatBtn) { + console.error('Agent select or start chat button not found in DOM'); + return; + } + + function updateAgentList() { + console.log('Updating agent list...'); + fetchAvailableAgents().then(agents => { + const existingOptions = Array.from(agentSelect.options).reduce((map, opt) => { + map.set(opt.dataset.agentId, opt); + return map; + }, new Map()); + + const currentAgentIds = new Set(agents.map(a => a.agentId)); + + // Add new agents + agents.forEach(agent => { + if (!existingOptions.has(agent.agentId)) { + const option = document.createElement('option'); + option.value = agent.agentName; + option.textContent = agent.agentName || agent.agentId; + option.dataset.agentHost = agent.agentCallback; + option.dataset.agentId = agent.agentId; + agentSelect.appendChild(option); + } + }); + + // Remove stale agents + for (let [agentId, option] of existingOptions.entries()) { + if (!currentAgentIds.has(agentId)) { + agentSelect.removeChild(option); + } + } + + startChatBtn.disabled = !agentSelect.value; + }).catch(err => { + console.error('Failed to update agent list:', err); + }); + } + + agentSelect.addEventListener('change', function () { + startChatBtn.disabled = !agentSelect.value; + }); + + startChatBtn.addEventListener('click', function () { + const selected = agentSelect.options[agentSelect.selectedIndex]; + if (selected && selected.value) { + const agentName = selected.value; + const agentHost = selected.dataset.agentHost; + const agentId = selected.dataset.agentId; + const sessionId = Date.now().toString(); + switchToAgent(agentName, agentId, sessionId, agentHost); + } + }); + + // Initial load + updateAgentList(); + + // Refresh every 15 seconds + setInterval(updateAgentList, 15000); +}); diff --git a/api/src/main/resources/templates/fragments/chat.html b/api/src/main/resources/templates/fragments/chat.html new file mode 100644 index 00000000..c6d0036e --- /dev/null +++ b/api/src/main/resources/templates/fragments/chat.html @@ -0,0 +1,88 @@ + + + + + diff --git a/api/src/main/resources/templates/fragments/sidebar.html b/api/src/main/resources/templates/fragments/sidebar.html index 4f03cebf..f21b108b 100755 --- a/api/src/main/resources/templates/fragments/sidebar.html +++ b/api/src/main/resources/templates/fragments/sidebar.html @@ -1,3 +1,4 @@ +
@@ -181,6 +189,11 @@ loadWithDate(); }); + document.getElementById('callType').addEventListener('change', () => { + currentPage = 0; + loadWithDate(); + }); + document.getElementById('nextPage').addEventListener('click', () => { currentPage++; loadWithDate(); @@ -201,6 +214,10 @@ if (startTime) url.searchParams.append("start", startTime); if (endTime) url.searchParams.append("end", endTime); + + const callType = document.getElementById('callType').value; + if (callType) url.searchParams.append("type", callType); // Add call type filter + if (limit > 0) { url.searchParams.append("limit", limit); url.searchParams.append("page", currentPage); diff --git a/api/src/main/resources/templates/sso/dashboard.html b/api/src/main/resources/templates/sso/dashboard.html index 3dbeb65c..5e620bec 100755 --- a/api/src/main/resources/templates/sso/dashboard.html +++ b/api/src/main/resources/templates/sso/dashboard.html @@ -3,6 +3,9 @@ [[${systemOptions.systemLogoName}]] - Dashboard + + + diff --git a/api/src/main/resources/templates/sso/users/list_users.html b/api/src/main/resources/templates/sso/users/list_users.html index 1075b39c..0b8910c6 100755 --- a/api/src/main/resources/templates/sso/users/list_users.html +++ b/api/src/main/resources/templates/sso/users/list_users.html @@ -76,7 +76,8 @@ actions += `   |  `; actions += `   |  `; - actions += ``; + actions += `   |  `; + actions += `Delete`; } return actions; } diff --git a/api/src/test/resources/configs/application.properties b/api/src/test/resources/configs/application.properties index f3392b37..cd5e2f9c 100644 --- a/api/src/test/resources/configs/application.properties +++ b/api/src/test/resources/configs/application.properties @@ -42,8 +42,9 @@ spring.jpa.hibernate.ddl-auto=update ## Logging -logging.level.org.springframework.web=INFO -logging.level.org.springframework.security=INFO +logging.level.org.springframework.web=DEBUG +logging.level.org.springframework.security=DEBUG +logging.level.org.springframework.security.web.FilterChainProxy=DEBUG logging.level.io.sentrius=DEBUG logging.level.org.thymeleaf=INFO @@ -54,4 +55,7 @@ spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB -keycloak.realm=sentrius-api \ No newline at end of file +keycloak.realm=sentrius-api + +sentrius.agent.register.bootstrap.allow=true +sentrius.agent.bootstrap.policy=default-policy.yaml \ No newline at end of file diff --git a/api/src/test/resources/default-policy.yaml b/api/src/test/resources/default-policy.yaml new file mode 100644 index 00000000..35685cbf --- /dev/null +++ b/api/src/test/resources/default-policy.yaml @@ -0,0 +1,53 @@ +--- +version: "v0" +description: "Default Policy For Unregistered Agents ( if configured )" +match: + agent_tags: + - "env:prod" + - "classification:observer" +behavior: + minimum_positive_runs: 5 + max_incidents: 1 + incident_types: + denylist: + - "policy_violation" +actions: + on_success: "allow" + on_failure: "deny" + on_marginal: + action: "require_ztat" + ztat_provider: "ztat-service.internal" +capabilities: + primitives: + composed: +ztat: + provider: "ztat-service.internal" + ttl: "5m" + approved_issuers: + - "http://localhost:8080/" + key_binding: "RSA2048" + approval_required: true +policy_id: "trust-observer" +identity: + issuer: "https://keycloak.test.sentrius.cloud" + subject_prefix: "agent-" + mfa_required: true + certificate_authority: "Sentrius-CA" +provenance: + source: "https://test.sentrius.cloud" + signature_required: true + approved_committers: + - "alice@example.com" +runtime: + enclave_required: true + attestation_type: "aws-nitro" + verified_at_boot: true + allow_drift: true +trust_score: + minimum: 80 + marginalThreshold: 50 + weightings: + identity: 0.5 + provenance: 0.2 + runtime: 0.3 + behavior: 0.2 diff --git a/core/src/main/java/io/sentrius/sso/config/KeycloakConfig.java b/core/src/main/java/io/sentrius/sso/config/KeycloakConfig.java index cda32056..f09bceca 100644 --- a/core/src/main/java/io/sentrius/sso/config/KeycloakConfig.java +++ b/core/src/main/java/io/sentrius/sso/config/KeycloakConfig.java @@ -3,6 +3,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import io.sentrius.sso.core.security.RSAKeyFactory; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.KeycloakBuilder; @@ -15,6 +16,7 @@ @Configuration @Slf4j +@Getter public class KeycloakConfig { @Value("${keycloak.base-url}") @@ -33,7 +35,6 @@ public KeycloakConfig(ClientRegistrationRepository clientRegistrationRepository) } - private KeycloakManager fetchPublicKeys(KeycloakManager manager) { String url = serverUrl + "/realms/" + realm + "/protocol/openid-connect/certs"; Map jwksResponse = restTemplate.getForObject(url, Map.class); diff --git a/core/src/main/java/io/sentrius/sso/config/KeycloakManager.java b/core/src/main/java/io/sentrius/sso/config/KeycloakManager.java index 6fd0dfe9..adb4f99a 100644 --- a/core/src/main/java/io/sentrius/sso/config/KeycloakManager.java +++ b/core/src/main/java/io/sentrius/sso/config/KeycloakManager.java @@ -5,10 +5,16 @@ import java.util.Map; import lombok.Builder; import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; @Builder @Getter +@Setter +@Slf4j public class KeycloakManager { private Keycloak keycloak; @@ -22,4 +28,17 @@ public PublicKey getPublicKey(String kid) { public void addPublicKey(String kid, PublicKey publicKey) { publicKeys.put(kid, publicKey); } + + + public Keycloak createKeycloakClient(String serverUrl, String realm, String clientId, String clientSecret) { + log.info("Creating Keycloak client for server: {}, realm: {}, clientId: {} shhh {}", serverUrl, realm, + clientId, clientSecret); + return KeycloakBuilder.builder() + .serverUrl(serverUrl) + .realm(realm) + .clientId(clientId) + .clientSecret(clientSecret) + .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + .build(); + } } diff --git a/core/src/main/java/io/sentrius/sso/core/dto/AgentDTO.java b/core/src/main/java/io/sentrius/sso/core/dto/AgentDTO.java index 0adf55fd..9207ecae 100644 --- a/core/src/main/java/io/sentrius/sso/core/dto/AgentDTO.java +++ b/core/src/main/java/io/sentrius/sso/core/dto/AgentDTO.java @@ -12,6 +12,7 @@ public class AgentDTO { private final String agentId; private final String policyId; private final String lastHeartbeat; + private final String agentCallback; @Builder.Default private final boolean isRegistered = false; } diff --git a/core/src/main/java/io/sentrius/sso/core/dto/AgentRegistrationDTO.java b/core/src/main/java/io/sentrius/sso/core/dto/AgentRegistrationDTO.java new file mode 100644 index 00000000..6877b0cb --- /dev/null +++ b/core/src/main/java/io/sentrius/sso/core/dto/AgentRegistrationDTO.java @@ -0,0 +1,23 @@ +package io.sentrius.sso.core.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(force = true) +@ToString +public class AgentRegistrationDTO { + private final String agentName; // will be the client-id + private final String agentPublicKey; + private final String agentPublicKeyAlgo; + private final String clientSecret; + private final String clientId; + private final String agentType; + private final String agentCallbackUrl; +} diff --git a/core/src/main/java/io/sentrius/sso/core/dto/ztat/UserTokenDTO.java b/core/src/main/java/io/sentrius/sso/core/dto/ztat/UserTokenDTO.java new file mode 100644 index 00000000..69c9ffb6 --- /dev/null +++ b/core/src/main/java/io/sentrius/sso/core/dto/ztat/UserTokenDTO.java @@ -0,0 +1,10 @@ +package io.sentrius.sso.core.dto.ztat; + +import lombok.Getter; + +@Getter +public class UserTokenDTO { + String userId; + String sessionId; + String publicKey; +} diff --git a/core/src/main/java/io/sentrius/sso/core/dto/ztat/UserTokenResponse.java b/core/src/main/java/io/sentrius/sso/core/dto/ztat/UserTokenResponse.java new file mode 100644 index 00000000..605079e1 --- /dev/null +++ b/core/src/main/java/io/sentrius/sso/core/dto/ztat/UserTokenResponse.java @@ -0,0 +1,10 @@ +package io.sentrius.sso.core.dto.ztat; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class UserTokenResponse { + String jwt; +} diff --git a/core/src/main/java/io/sentrius/sso/core/dto/ztat/ZtatChallengeRequest.java b/core/src/main/java/io/sentrius/sso/core/dto/ztat/ZtatChallengeRequest.java new file mode 100644 index 00000000..8629f7bd --- /dev/null +++ b/core/src/main/java/io/sentrius/sso/core/dto/ztat/ZtatChallengeRequest.java @@ -0,0 +1,11 @@ +package io.sentrius.sso.core.dto.ztat; + +import lombok.Data; + +@Data +public class ZtatChallengeRequest { + private String ztat; + private String nonce; + private String signature; + private String publicKey; +} \ No newline at end of file diff --git a/core/src/main/java/io/sentrius/sso/core/services/agents/AgentClientService.java b/core/src/main/java/io/sentrius/sso/core/services/agents/AgentClientService.java index f11b06ae..b9e6c03c 100644 --- a/core/src/main/java/io/sentrius/sso/core/services/agents/AgentClientService.java +++ b/core/src/main/java/io/sentrius/sso/core/services/agents/AgentClientService.java @@ -10,6 +10,7 @@ import com.google.common.collect.Maps; import io.sentrius.sso.core.dto.AgentCommunicationDTO; import io.sentrius.sso.core.dto.AgentHeartbeatDTO; +import io.sentrius.sso.core.dto.AgentRegistrationDTO; import io.sentrius.sso.core.dto.ztat.AgentExecution; import io.sentrius.sso.core.dto.ztat.AtatRequest; import io.sentrius.sso.core.dto.ztat.TokenDTO; @@ -169,4 +170,24 @@ public AgentCommunicationDTO sendResponse(AgentExecution execution, AgentCommuni Maps.immutableEntry("requestId", List.of(ztatRequest.getRequestId()))); return JsonUtil.MAPPER.readValue(acommResponse, AgentCommunicationDTO.class); } + + public AgentRegistrationDTO bootstrap(String name, String publicKey, String keyType) + throws ZtatException, JsonProcessingException { + String ask = "/agent/bootstrap/register"; + + AgentRegistrationDTO registration = AgentRegistrationDTO.builder() + .agentName(name) + .agentCallbackUrl(getCallbackUrl()) + .agentPublicKey(publicKey) + .agentPublicKeyAlgo(keyType) + .build(); + + var acommResponse = zeroTrustClientService.callPostOnApi(ask, registration); + return JsonUtil.MAPPER.readValue(acommResponse, AgentRegistrationDTO.class); + } + + public String getCallbackUrl() { + return callbackUrl; + } + } diff --git a/core/src/main/java/io/sentrius/sso/core/services/agents/ZeroTrustClientService.java b/core/src/main/java/io/sentrius/sso/core/services/agents/ZeroTrustClientService.java index b3940ffc..aad2eeee 100644 --- a/core/src/main/java/io/sentrius/sso/core/services/agents/ZeroTrustClientService.java +++ b/core/src/main/java/io/sentrius/sso/core/services/agents/ZeroTrustClientService.java @@ -142,6 +142,66 @@ String callPostOnApi(@NonNull TokenDTO token, String endpoint, @NonNull Stri } + /** + * Request a Zero Trust Access Token (ZTAT) using Keycloak JWT and `ZtatRequestDTO` + */ + public String callPostOnApi(@NonNull String apiEndpoint, T body) throws ZtatException { + return callPostOnApi(agentApiUrl, apiEndpoint, body, null); + } + + + /** + * Request a Zero Trust Access Token (ZTAT) using Keycloak JWT and `ZtatRequestDTO` + */ + public String callPostOnApi(@NonNull String apiEndpoint, T body, Map.Entry>... params) throws ZtatException { + return callPostOnApi(agentApiUrl, apiEndpoint, body, params); + } + + String callPostOnApi(String endpoint, @NonNull String apiEndpoint, T body,Map.Entry>... params) throws ZtatException { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + log.info("Sending {}", body.toString()); + HttpEntity requestEntity = new HttpEntity<>(body, headers); + if (!apiEndpoint.startsWith("/")) { + apiEndpoint = "/" + apiEndpoint; + } + if (!apiEndpoint.startsWith("/api/v1/")) { + apiEndpoint = "/api/v1" + apiEndpoint; + } + var builder = UriComponentsBuilder.fromUri(URI.create(endpoint)) + .path(apiEndpoint); + if (null != params){ + for (Map.Entry> entry : params) { + builder.queryParam(entry.getKey(), entry.getValue()); + } + } + try{ + ResponseEntity response = restTemplate.exchange(builder.build(true).toUriString(), HttpMethod.POST, requestEntity, String.class); + + if (response.getStatusCode() == HttpStatus.OK) { + return response.getBody(); // This is the ZTAT (JWT or opaque token) + } else if (response.getStatusCode() == HttpStatus.PRECONDITION_REQUIRED) { + // we need to get + throw new ZtatException(response.getBody(), apiEndpoint); + + } else { + throw new RuntimeException("Failed to obtain ZTAT: " + response.getStatusCode() + " from " + builder.build(true).toUriString()); + } + } catch (HttpClientErrorException e){ + + if (e.getStatusCode() == HttpStatus.PRECONDITION_REQUIRED) { + // we need to get + throw new ZtatException(e.getResponseBodyAsString(), apiEndpoint); + + } else { + log.info("Error: {}", e.getResponseBodyAsString()); + } + throw new RuntimeException(e.getResponseBodyAsString()); + } + + } + /** * Request a Zero Trust Access Token (ZTAT) using Keycloak JWT and `ZtatRequestDTO` */ @@ -523,4 +583,39 @@ public void approveZtat(AgentExecution execution, String requestId) throws JsonP throw new RuntimeException("Failed to obtain ZTAT: " + response.getStatusCode()); } } -} + + public boolean verifyZtatChallenge(AgentExecution execution, String ztatToken, String nonce, String signatureBase64, String publicKeyBase64) { + var builder = UriComponentsBuilder + .fromHttpUrl(agentApiUrl) + .path("/api/v1/zerotrust/accesstoken/jwt/verify"); + + String keycloakJwt = getKeycloakToken(); + HttpHeaders headers = new HttpHeaders(); + headers.set("ztat_token", execution.getZtatToken()); + headers.setBearerAuth(keycloakJwt); + headers.set("communication_id", execution.getCommunicationId()); + headers.setContentType(MediaType.APPLICATION_JSON); + + Map body = Map.of( + "ztat", ztatToken, + "nonce", nonce, + "signature", signatureBase64, + "publicKey", publicKeyBase64 + ); + + HttpEntity> entity = new HttpEntity<>(body, headers); + + try { + ResponseEntity response = restTemplate.exchange(builder.build(true).toUriString(), HttpMethod.POST, entity, Boolean.class); + return Boolean.TRUE.equals(response.getBody()); + } catch (HttpClientErrorException e) { + e.printStackTrace(); + log.warn("ZTAT challenge verification failed: {}", e.getResponseBodyAsString()); + return false; + } catch (Exception ex) { + log.error("Error during ZTAT verification", ex); + return false; + } + } + + } diff --git a/core/src/main/java/io/sentrius/sso/core/services/security/KeycloakService.java b/core/src/main/java/io/sentrius/sso/core/services/security/KeycloakService.java index c5966b5e..f454d135 100644 --- a/core/src/main/java/io/sentrius/sso/core/services/security/KeycloakService.java +++ b/core/src/main/java/io/sentrius/sso/core/services/security/KeycloakService.java @@ -1,8 +1,16 @@ package io.sentrius.sso.core.services.security; import io.jsonwebtoken.Jwts; +import io.sentrius.sso.config.KeycloakConfig; import io.sentrius.sso.config.KeycloakManager; +import io.sentrius.sso.core.dto.AgentRegistrationDTO; +import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; +import org.keycloak.admin.client.resource.ClientResource; +import org.keycloak.admin.client.resource.ClientsResource; +import org.keycloak.admin.client.resource.RoleMappingResource; import org.keycloak.admin.client.resource.UsersResource; +import org.keycloak.representations.idm.ClientRepresentation; +import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -16,13 +24,16 @@ public class KeycloakService { private final KeycloakManager keycloak; + private final KeycloakConfig keycloakConfig; + @Value("${keycloak.realm}") private String realm; - public KeycloakService(KeycloakManager keycloak) { + public KeycloakService(KeycloakManager keycloak, KeycloakConfig keycloakConfig) { this.keycloak = keycloak; + this.keycloakConfig = keycloakConfig; } @@ -92,4 +103,83 @@ public String extractUsername(String token) { return claims.get("preferred_username", String.class); // Extracts agent identity } + + public void removeAgentClient(String clientId) { + ClientsResource clients = keycloak.getKeycloak().realm(realm).clients(); + ClientResource client = clients.get(clientId); + if (client != null) { + client.remove(); + } else { + log.warn("Client with ID {} not found", clientId); + } + } + + public AgentRegistrationDTO registerAgentClient(AgentRegistrationDTO agent) { + ClientsResource clients = keycloak.getKeycloak().realm(realm).clients(); + + // Step 1: Build client representation + ClientRepresentation client = new ClientRepresentation(); + client.setClientId(agent.getAgentName()); + client.setEnabled(true); + client.setProtocol("openid-connect"); + client.setServiceAccountsEnabled(true); + client.setPublicClient(false); + client.setDirectAccessGrantsEnabled(false); + + CredentialRepresentation credential = new CredentialRepresentation(); + credential.setType(CredentialRepresentation.SECRET); + credential.setValue(generateRandomSecret()); + client.setSecret(credential.getValue()); + + // Step 2: Create the client + + try( Response response = clients.create(client)) { + if (response.getStatus() != 201) { + throw new RuntimeException("Failed to create client: " + response.getStatus()); + } + + // Step 3: Get client UUID + String clientId = response.getLocation().getPath().replaceAll(".*/([^/]+)$", "$1"); + ClientResource createdClient = clients.get(clientId); + + String serviceAccountUserId = createdClient.getServiceAccountUser().getId(); + + // Step 5: Assign realm-management roles + RoleMappingResource roleMapping = keycloak.getKeycloak().realm(realm) + .users().get(serviceAccountUserId).roles(); + + var clientRoles = keycloak.getKeycloak().realm(realm) + .clients() + .findByClientId("realm-management") + .stream() + .findFirst() + .map(cr -> keycloak.getKeycloak().realm(realm).clients().get(cr.getId()).roles().list()) + .orElseThrow(() -> new RuntimeException("realm-management client not found")); + + var toAssign = clientRoles.stream() + .filter(role -> List.of("view-clients", "query-clients").contains(role.getName())) + .toList(); + + roleMapping.clientLevel(clientRoles.get(0).getContainerId()).add(toAssign); + + // Step 4: Get generated secret + CredentialRepresentation secret = createdClient.getSecret(); + return AgentRegistrationDTO.builder(). + agentName(createdClient.getServiceAccountUser().getUsername()) + .agentPublicKey(agent.getAgentPublicKey()) + .clientSecret(secret.getValue()) + .clientId(clientId) + .build(); + } + } + + public void createKeycloakClient(String clientId, String clientSecret) { + + keycloak.setKeycloak( + keycloak.createKeycloakClient(keycloakConfig.getServerUrl(), realm, clientId, clientSecret) ); + } + + private String generateRandomSecret() { + return java.util.UUID.randomUUID().toString(); + } } diff --git a/dataplane/src/main/java/io/sentrius/sso/core/controllers/BaseController.java b/dataplane/src/main/java/io/sentrius/sso/core/controllers/BaseController.java index aa0a1979..35543597 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/controllers/BaseController.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/controllers/BaseController.java @@ -109,7 +109,7 @@ public User getOperatingUser(HttpServletRequest request, HttpServletResponse res } }catch(Exception e){ - log.error("Error getting user", e); + log.trace("Error getting user. This may be expected", e); return null; } } diff --git a/dataplane/src/main/java/io/sentrius/sso/core/model/ErrorOutput.java b/dataplane/src/main/java/io/sentrius/sso/core/model/ErrorOutput.java index 05f01cbe..c4ce821b 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/model/ErrorOutput.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/model/ErrorOutput.java @@ -26,16 +26,16 @@ public class ErrorOutput { @Column(name = "system_id") private Integer systemId; - @Column(name = "error_type", nullable = false) + @Column(name = "error_type", nullable = false, columnDefinition = "TEXT") private String errorType; - @Column(name = "error_location") + @Column(name = "error_location", columnDefinition = "TEXT") private String errorLocation; @Column(name = "error_hash", nullable = false) private String errorHash; - @Column(name = "error_logs", nullable = false) + @Column(name = "error_logs", nullable = false, columnDefinition = "TEXT") private String errorLogs; @Column(name = "log_tm", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") diff --git a/dataplane/src/main/java/io/sentrius/sso/core/model/security/AccessControlAspect.java b/dataplane/src/main/java/io/sentrius/sso/core/model/security/AccessControlAspect.java index ad3e93aa..0241b434 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/model/security/AccessControlAspect.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/model/security/AccessControlAspect.java @@ -62,6 +62,8 @@ public class AccessControlAspect { static List allowedEndpoints = new ArrayList<>(); static { allowedEndpoints.add("/api/v1/zerotrust/accesstoken/status"); + allowedEndpoints.add("/api/v1/zerotrust/accesstoken/jwt/verify"); + allowedEndpoints.add("/api/v1/agent/bootstrap/register"); } Tracer tracer = GlobalOpenTelemetry.getTracer("io.sentrius.sso"); @@ -123,7 +125,7 @@ public void checkLimitAccess(LimitAccess limitAccess) throws SQLException, Gener span.setAttribute("access.limit", limitAccess.toString()); var policy = atplPolicyService.getPolicy(operatingUser); if (policy.isEmpty()) { - log.debug("Access Denied to {} at {}", operatingUser, accessAnnotation); + log.info("Access Denied to {} at {}", operatingUser, accessAnnotation); throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Policy is required "); } log.info("Found policy {} for {}", policy.get().getPolicyId(), operatingUser.getUsername()); @@ -157,7 +159,7 @@ public void checkLimitAccess(LimitAccess limitAccess) throws SQLException, Gener } if (isAllowedEndpoint(endpoint)) { - log.debug("Access Granted to {} at {}", operatingUser, accessAnnotation); + log.info("Access Granted to {} at {}", operatingUser, accessAnnotation); return; } else if (null != endpointRequest && containsEndpoint(endpointRequest.getEndpoints(), endpoint)) { // this endpoint is approved for use. diff --git a/dataplane/src/main/java/io/sentrius/sso/core/repository/AgentCommunicationRepository.java b/dataplane/src/main/java/io/sentrius/sso/core/repository/AgentCommunicationRepository.java index 801f7e39..06dd56e9 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/repository/AgentCommunicationRepository.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/repository/AgentCommunicationRepository.java @@ -22,4 +22,12 @@ Page findBySourceAgentAndCreatedAtBetween(String sourceAgent List findByCommunicationId(UUID communicationId); List findByCommunicationIdAndTargetAgent(UUID communicationId, String targetAgent); + + Page findBySourceAgentAndMessageTypeAndCreatedAtBetween( + String sourceAgent, + String messageType, + Instant start, + Instant end, + Pageable pageable + ); } \ No newline at end of file diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/ATPLPolicyService.java b/dataplane/src/main/java/io/sentrius/sso/core/services/ATPLPolicyService.java index c3a550f6..d8d6a25d 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/services/ATPLPolicyService.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/ATPLPolicyService.java @@ -76,6 +76,7 @@ public Optional getPolicy(User operatingUser) { List assignments = agentPolicyAssignmentRepository.findByUserUsernameOrderByAssignedAtDesc(operatingUser.getUsername()); if (assignments.isEmpty()) { + log.info("No policy assignments found for user {}", operatingUser.getUsername()); return Optional.empty(); } diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/UserService.java b/dataplane/src/main/java/io/sentrius/sso/core/services/UserService.java index 11ae8991..0fefdc8f 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/services/UserService.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/UserService.java @@ -357,6 +357,7 @@ public Optional findByUsername(String username) { * @param user The user to save. * @return The saved user object. */ + @Transactional public User save(User user) { return UserDB.save(user); } @@ -378,7 +379,14 @@ public User getUserById(Long id) { * @return An optional containing the user type if found, or empty if not found. */ public Optional getUserType(UserType baseUser) { - return userTypeRepository.findById(baseUser.getId()); + if (baseUser == null || baseUser.getId() == null) { + log.warn("Attempted to get UserType with null baseUser or null ID"); + return Optional.empty(); + } + log.info("Getting user type for baseUser: {}", baseUser); + var ret = userTypeRepository.findById(baseUser.getId()); + log.info("Got user type for baseUser: {}", ret); + return ret; } /** diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/agents/AgentService.java b/dataplane/src/main/java/io/sentrius/sso/core/services/agents/AgentService.java index 34810ba7..04133fb6 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/services/agents/AgentService.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/agents/AgentService.java @@ -8,16 +8,15 @@ import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; import io.sentrius.sso.core.dto.AgentCommunicationDTO; import io.sentrius.sso.core.dto.AgentDTO; import io.sentrius.sso.core.dto.AgentHeartbeatDTO; -import io.sentrius.sso.core.dto.UserDTO; import io.sentrius.sso.core.dto.UserTypeDTO; -import io.sentrius.sso.core.dto.ztat.AgentExecution; import io.sentrius.sso.core.model.AgentHeartbeat; import io.sentrius.sso.core.model.AgentStatus; import io.sentrius.sso.core.model.chat.AgentCommunication; @@ -38,6 +37,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @@ -51,6 +51,8 @@ public class AgentService { private final ATPLPolicyService policyService; private final CryptoService cryptoService; + private ConcurrentMap callbackUrls = new ConcurrentHashMap<>(); + private final RestTemplate restTemplate = new RestTemplate(); private final Cache pingCache = @@ -91,9 +93,25 @@ public AgentHeartbeat getHeartbeat(String agentId) { public List getAllAgents(boolean encryptId) { + return getAllAgents(encryptId, List.of(), false); + } + + public List getAllAgents(boolean encryptId, List filteredIds, boolean include) { return repository.findAll().stream() + .filter(heartbeat -> { + var user = userService.getUserByUsername(heartbeat.getAgentName()); + log.info("Agent {}: {}", heartbeat.getAgentId(), user); + log.info("Excluding {}: {}", heartbeat.getAgentId(), filteredIds); + if (include){ + return user != null && filteredIds.contains(user.getUserId()); + } + else { + return user != null && !filteredIds.contains(user.getUserId()); + } + }) .map(heartbeat -> { - var user = userService.getUserByUsername(heartbeat.getAgentId()); + log.info("Second Agent {}", heartbeat.getAgentName()); + var user = userService.getUserByUsername(heartbeat.getAgentName()); var dtoBuilder = AgentDTO.builder(); if (null != user && user.getAuthorizationType() != UserType.createUnknownUser()){ @@ -103,9 +121,14 @@ public List getAllAgents(boolean encryptId) { dtoBuilder.isRegistered(true); dtoBuilder.lastHeartbeat(heartbeat.getLastHeartbeat().toString()); dtoBuilder.agentName(heartbeat.getAgentName()); + var callback = callbackUrls.get(heartbeat.getAgentId()); + if (callback != null) { + dtoBuilder.agentCallback(callback); + } } if (encryptId){ try { + // this is obfuscation of something known, let's use a real id of some kind dtoBuilder.agentId(cryptoService.encrypt(user.getUserId())); } catch (GeneralSecurityException e) { @@ -171,11 +194,24 @@ public List getCommunications(String sourceAgent, String tar return agentCommunicationRepository.findBySourceAgent(sourceAgent); } - public Page getCommunications(String sourceAgent, LocalDateTime start, LocalDateTime end, - Pageable pageable) { + public Page getCommunications( + String sourceAgent, + LocalDateTime start, + LocalDateTime end, + String type, + Pageable pageable + ) { Instant startInstant = start.atZone(ZoneId.systemDefault()).toInstant(); Instant endInstant = end.atZone(ZoneId.systemDefault()).toInstant(); - return agentCommunicationRepository.findBySourceAgentAndCreatedAtBetween(sourceAgent, startInstant, endInstant, pageable); + + if (type != null && !type.isBlank()) { + return agentCommunicationRepository.findBySourceAgentAndMessageTypeAndCreatedAtBetween( + sourceAgent, type, startInstant, endInstant, pageable); + } + + + return agentCommunicationRepository.findBySourceAgentAndCreatedAtBetween( + sourceAgent, startInstant, endInstant, pageable); } public Optional getPing(User user) { @@ -187,7 +223,7 @@ public void setPing(User user, AgentStatus status) { } @Async - public void ping(User user) { + public CompletableFuture ping(User user) { AgentStatus status = pingCache.getIfPresent(user.getUserId()); log.info("Ping user {}: {}", user.getUserId(), status); if (status == null) { @@ -225,10 +261,47 @@ public void ping(User user) { } } + return CompletableFuture.completedFuture(null); } public boolean isAgent(UserTypeDTO userDto) { return true; } + public void setCallBack(User user, String agentCallbackUrl) { + callbackUrls.put(user.getUserId(), agentCallbackUrl); + } + + public List getAvailableAgents() { + return getAllAgents(true, callbackUrls.keySet().stream().toList(), true); + } + + @Scheduled(fixedDelay = 60000) // Runs every 60 seconds + @Async + public void pingAndRemoveUnavailableAgents() { + List allAgents = repository.findAll(); + for (AgentHeartbeat heartbeat : allAgents) { + String agentId = heartbeat.getAgentId(); + try { + User user = userService.getUserByUsername(agentId); + if (user == null) { + // Remove agent if user not found + repository.delete(heartbeat); + continue; + } + log.info("Ping user {}: {}", user.getUserId(), heartbeat); + ping(user).join(); // This will update the pingCache + Optional status = getPing(user); + if (status.isEmpty()) { + // Remove agent if not available + repository.delete(heartbeat); + keycloakService.removeAgentClient(agentId); + log.info("Removed unavailable agent: {}", agentId); + } + } catch (Exception e) { + repository.delete(heartbeat); + log.info("Removed agent due to exception: {}", agentId, e); + } + } + } } diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/security/CryptoService.java b/dataplane/src/main/java/io/sentrius/sso/core/services/security/CryptoService.java index e87b2d83..9f7e19f3 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/services/security/CryptoService.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/security/CryptoService.java @@ -7,9 +7,13 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; +import java.security.KeyFactory; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; import java.security.SecureRandom; +import java.security.spec.EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; import java.util.Base64; import com.jcraft.jsch.JSch; @@ -202,4 +206,26 @@ public ApplicationKey generateKeyPair(String passphrase) throws JSchException, I return applicationKey; } + + public static PublicKey decodePublicKey(String base64Key, String algo) throws GeneralSecurityException { + byte[] keyBytes = Base64.getDecoder().decode(base64Key); + KeyFactory keyFactory = KeyFactory.getInstance(algo); + EncodedKeySpec keySpec = switch (algo.toUpperCase()) { + case "RSA" -> new X509EncodedKeySpec(keyBytes); + case "EC" -> new X509EncodedKeySpec(keyBytes); + default -> throw new IllegalArgumentException("Unsupported algorithm: " + algo); + }; + return keyFactory.generatePublic(keySpec); + } + + public static String encryptWithPublicKey(String data, PublicKey publicKey) throws GeneralSecurityException { + Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedBytes = cipher.doFinal(data.getBytes()); + return Base64.getEncoder().encodeToString(encryptedBytes); + } + + public byte[] getKey() { + return Arrays.copyOf(key, key.length); // defensive copy + } } diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/security/EcdsaSignatureUtil.java b/dataplane/src/main/java/io/sentrius/sso/core/services/security/EcdsaSignatureUtil.java new file mode 100644 index 00000000..1f3d21b2 --- /dev/null +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/security/EcdsaSignatureUtil.java @@ -0,0 +1,46 @@ +package io.sentrius.sso.core.services.security; + +import java.io.ByteArrayOutputStream; +import java.math.BigInteger; + +public class EcdsaSignatureUtil { + + public static byte[] convertRawSignatureToDer(byte[] rawSignature) { + if (rawSignature.length != 64) { + throw new IllegalArgumentException("Invalid ECDSA signature length. Expected 64 bytes."); + } + + byte[] r = new byte[32]; + byte[] s = new byte[32]; + System.arraycopy(rawSignature, 0, r, 0, 32); + System.arraycopy(rawSignature, 32, s, 0, 32); + + return derEncode(new BigInteger(1, r), new BigInteger(1, s)); + } + + private static byte[] derEncode(BigInteger r, BigInteger s) { + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(0x30); // SEQUENCE + + ByteArrayOutputStream inner = new ByteArrayOutputStream(); + encodeInteger(inner, r); + encodeInteger(inner, s); + + byte[] encoded = inner.toByteArray(); + out.write(encoded.length); + out.write(encoded); + + return out.toByteArray(); + } catch (Exception e) { + throw new RuntimeException("DER encoding failed", e); + } + } + + private static void encodeInteger(ByteArrayOutputStream out, BigInteger value) throws Exception { + byte[] bytes = value.toByteArray(); + out.write(0x02); // INTEGER tag + out.write(bytes.length); + out.write(bytes); + } +} \ No newline at end of file diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZeroTrustAccessTokenService.java b/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZeroTrustAccessTokenService.java index 0db3d2ee..2459add2 100644 --- a/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZeroTrustAccessTokenService.java +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZeroTrustAccessTokenService.java @@ -117,6 +117,13 @@ public boolean isApproved( return opsApprovals.size() > 0 && opsApprovals.stream().anyMatch(approval -> approval.isApproved()); } + public boolean isDenied( + @NonNull OpsZeroTrustAcessTokenRequest request) { + + var opsApprovals = request.getApprovals(); + return opsApprovals.size() > 0 && opsApprovals.stream().anyMatch(approval -> !approval.isApproved()); + } + public boolean isApproved( @NonNull String command, @NonNull User user , @NonNull HostSystem system) diff --git a/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZtatTokenService.java b/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZtatTokenService.java new file mode 100644 index 00000000..71edf125 --- /dev/null +++ b/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZtatTokenService.java @@ -0,0 +1,69 @@ +package io.sentrius.sso.core.services.security; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.JwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.stereotype.Service; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.security.GeneralSecurityException; +import java.time.Instant; +import java.util.Date; + +@Service +public class ZtatTokenService { + + private final CryptoService cryptoService; + private final SecretKey signingKey; + + public ZtatTokenService(CryptoService cryptoService) { + this.cryptoService = cryptoService; + + // Derive signing key from same key material used in CryptoService + // (It's a shared AES key, but for HMAC use only the first 256 bits) + byte[] sharedKey = cryptoService.getKey(); // expose a `getKey()` method + this.signingKey = new SecretKeySpec(sharedKey, 0, 32, "HmacSHA256"); + } + + public String issueZtat(String agentId, String sessionId, String publicKeyBase64) { + String keyFingerprint = computeFingerprint(publicKeyBase64); + + Instant now = Instant.now(); + Instant exp = now.plusSeconds(60); // 1-minute expiry + + return Jwts.builder() + .setSubject("ztat-auth") + .claim("agentId", agentId) + .claim("sessionId", sessionId) + .claim("keyfp", keyFingerprint) + .setIssuedAt(Date.from(now)) + .setExpiration(Date.from(exp)) + .signWith(signingKey, SignatureAlgorithm.HS256) + .compact(); + } + + public String computeFingerprint(String publicKeyBase64) { + try { + // Use CryptoService's existing hash logic + return cryptoService.hash(publicKeyBase64, null); + } catch (GeneralSecurityException e) { + throw new RuntimeException("Unable to compute fingerprint", e); + } + } + + public SecretKey getSigningKey() { + return signingKey; + } + + public Jws parseZtat(String token) throws JwtException { + return Jwts.parser() + .setSigningKey(signingKey) + .build() + .parseClaimsJws(token); + } + + +} diff --git a/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 545fd447..618792c1 100644 --- a/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -110,6 +110,7 @@ io/sentrius/sso/core/model/zt/RequestCommunicationLink.class io/sentrius/sso/core/repository/OpsUseRepository.class io/sentrius/sso/core/repository/automation/ScriptRepository.class io/sentrius/sso/core/model/metadata/TerminalCommand.class +io/sentrius/sso/core/services/security/EcdsaSignatureUtil.class io/sentrius/sso/automation/RunShellScript.class io/sentrius/sso/core/repository/NotificationRepository.class io/sentrius/sso/core/services/metadata/TerminalSessionMetadataService.class @@ -266,6 +267,7 @@ io/sentrius/sso/core/repository/NotificationRecipientRepository.class io/sentrius/sso/core/model/security/AccessControl.class io/sentrius/sso/core/model/ErrorOutput.class io/sentrius/sso/core/model/install/Configuration.class +io/sentrius/sso/core/services/security/ZtatTokenService.class io/sentrius/sso/core/model/HostSystem.class io/sentrius/sso/core/repository/UserTypeRepository.class io/sentrius/sso/core/repository/AutomationExecutionRepository.class diff --git a/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 742dd533..2a1def1e 100644 --- a/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/dataplane/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -168,6 +168,7 @@ /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/model/security/enums/RuleAccessEnum.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/model/zt/ZTATRequestBase.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/repository/UserThemeRepository.java +/mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/services/security/EcdsaSignatureUtil.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/services/security/CookieService.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/model/zt/OpsApproval.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/model/users/UserPublicKey.java @@ -213,6 +214,7 @@ /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/model/hostgroup/TimeConfigJson.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/repository/WorkHoursRepository.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/config/SystemOptions.java +/mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/services/security/ZtatTokenService.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/annotations/LimitAccess.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/integrations/ticketing/TicketService.java /mnt/ExtraDrive/repos/Sentrius/dataplane/src/main/java/io/sentrius/sso/core/model/security/zt/JITReason.java diff --git a/ops-scripts/local/run-chat-agent.sh b/ops-scripts/local/run-chat-agent.sh new file mode 100755 index 00000000..d7076ff1 --- /dev/null +++ b/ops-scripts/local/run-chat-agent.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +## +# run-chat-agent.sh +# +# Simple script to launch Sentrius locally using Maven and environment variables. +# +# Usage: +# ./run-chat-agent.sh [--build] +## + +# Fail on any error +set -e + +###################################### +# 0. Parse script arguments +###################################### +BUILD=false +AGENT_NAME="" + +while [[ "$#" -gt 0 ]]; do + case $1 in + --build) + BUILD=true + ;; + -*) + echo "Unknown parameter passed: $1" + exit 1 + ;; + *) + if [ -z "$AGENT_NAME" ]; then + AGENT_NAME="$1" + else + echo "Multiple agent names provided: '$AGENT_NAME' and '$1'" + exit 1 + fi + ;; + esac + shift +done + +if [ -z "$AGENT_NAME" ]; then + echo "❌ Error: You must provide an agent name." + echo "Usage: ./run-chat-agent.sh [--build]" + exit 1 +fi + +###################################### +# 1. (Optional) Build the project +###################################### +if $BUILD; then + echo "Building the project..." + mvn clean install +fi + +###################################### +# 2. Set environment variables +###################################### + +export KEYCLOAK_SECRET="${KEYCLOAK_SECRET:-defaultSecret}" +export KEYCLOAK_BASE_URL="${KEYCLOAK_BASE_URL:-http://localhost:8180}" +export HTTP_REQUIRED="${HTTP_REQUIRED:-false}" +export BASE_URL="${BASE_URL:-http://localhost:8080}" +export OTEL_EXPORTER_OTLP_ENDPOINT="${OTEL_EXPORTER_OTLP_ENDPOINT:-http://localhost:4317}" + +export MIN_HEAP="${MIN_HEAP:-4096m}" +export MAX_HEAP="${MAX_HEAP:-8192m}" + +###################################### +# 3. Run Maven +###################################### + +pushd ai-agent + +mvn spring-boot:run \ + -Dspring-boot.run.jvmArguments="-Xms${MIN_HEAP} -Xmx${MAX_HEAP}" \ + -Dspring-boot.run.arguments="--spring.config.location=file:./src/main/resources/chat-helper.properties --agent.ai.config=chat-helper.yaml --agent.namePrefix=${AGENT_NAME}" + +popd diff --git a/sentrius-llm-core/target/jacoco.exec b/sentrius-llm-core/target/jacoco.exec deleted file mode 100644 index 98cbe03c..00000000 Binary files a/sentrius-llm-core/target/jacoco.exec and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/index.html b/sentrius-llm-core/target/site/jacoco/index.html deleted file mode 100644 index 71c732e9..00000000 --- a/sentrius-llm-core/target/site/jacoco/index.html +++ /dev/null @@ -1 +0,0 @@ -sentrius-llm-core

sentrius-llm-core

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total3,742 of 3,7420%512 of 5120%5595591241243033033030
io.sentrius.sso.genai.model1,7110%2120%24924948481431431313
io.sentrius.sso.genai1,0420%1680%1631632929797966
io.sentrius.sso.genai.model.endpoints8160%1100%1191194141646499
io.sentrius.sso.genai.api1730%220%282866171722
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest$BaseGenerativeRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest$BaseGenerativeRequestBuilder.html deleted file mode 100644 index 159d3ca2..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest$BaseGenerativeRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -BaseGenerativeRequest.BaseGenerativeRequestBuilder

BaseGenerativeRequest.BaseGenerativeRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total38 of 380%0 of 0n/a661166
$fillValuesFromInstanceIntoBuilder(BaseGenerativeRequest, BaseGenerativeRequest.BaseGenerativeRequestBuilder)110%n/a111111
$fillValuesFrom(BaseGenerativeRequest)60%n/a111111
user(String)60%n/a111111
model(String)60%n/a111111
toString()60%n/a111111
BaseGenerativeRequest.BaseGenerativeRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest.html deleted file mode 100644 index add621da..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest.html +++ /dev/null @@ -1 +0,0 @@ -BaseGenerativeRequest

BaseGenerativeRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total135 of 1350%22 of 220%2222661111
equals(Object)550%180%10101111
hashCode()340%40%331111
BaseGenerativeRequest(BaseGenerativeRequest.BaseGenerativeRequestBuilder)110%n/a111111
BaseGenerativeRequest(String, String)90%n/a111111
toString()60%n/a111111
setUser(String)40%n/a111111
setModel(String)40%n/a111111
getUser()30%n/a111111
getModel()30%n/a111111
canEqual(Object)30%n/a111111
BaseGenerativeRequest()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest.java.html deleted file mode 100644 index 060beacb..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/BaseGenerativeRequest.java.html +++ /dev/null @@ -1,42 +0,0 @@ -BaseGenerativeRequest.java

BaseGenerativeRequest.java

package io.sentrius.sso.genai.api;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.SuperBuilder;
-
-/**
- * <p>
- * Inspired by liLittleCat's ChatGPT package.
- *
- * Codifies the Message request
- * </p>
- *
- * original @author <a href="https://github.com/LiLittleCat">LiLittleCat</a>
- *
- * @since 2023/3/2
- */
-/**
- * Base class for generative requests, defining the necessary methods required to generate a request.
- */
-@Data
-@SuperBuilder(toBuilder = true)
-@NoArgsConstructor
-@AllArgsConstructor
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public abstract class BaseGenerativeRequest {
-
-    /**
-     * Defined end user id : https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids
-     */
-    protected String user;
-
-    /**
-     * Model name, if applicable of the request"
-     */
-    @JsonProperty(value = "model")
-    protected String model;
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/index.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/index.html deleted file mode 100644 index fa930c11..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/index.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai.api

io.sentrius.sso.genai.api

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total173 of 1730%22 of 220%282866171722
BaseGenerativeRequest1350%220%222266111111
BaseGenerativeRequest.BaseGenerativeRequestBuilder380%n/a66116611
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/index.source.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/index.source.html deleted file mode 100644 index 0ad1c999..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.api/index.source.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai.api

io.sentrius.sso.genai.api

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total173 of 1730%22 of 220%282866171722
BaseGenerativeRequest.java1730%220%282866171722
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder.html deleted file mode 100644 index 0b20e7a2..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -ChatApiEndpointRequest.ChatApiEndpointRequestBuilder

ChatApiEndpointRequest.ChatApiEndpointRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total18 of 180%0 of 0n/a331133
temperature(Float)90%n/a111111
toString()60%n/a111111
ChatApiEndpointRequest.ChatApiEndpointRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilderImpl.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilderImpl.html deleted file mode 100644 index e5786048..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilderImpl.html +++ /dev/null @@ -1 +0,0 @@ -ChatApiEndpointRequest.ChatApiEndpointRequestBuilderImpl

ChatApiEndpointRequest.ChatApiEndpointRequestBuilderImpl

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total7 of 70%0 of 0n/a221122
build()50%n/a111111
self()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest.html deleted file mode 100644 index 721af370..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest.html +++ /dev/null @@ -1 +0,0 @@ -ChatApiEndpointRequest

ChatApiEndpointRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total175 of 1750%28 of 280%252515151111
create()790%120%77111111
equals(Object)380%120%771111
hashCode()200%20%221111
ChatApiEndpointRequest(ChatApiEndpointRequest.ChatApiEndpointRequestBuilder)150%20%221111
builder()40%n/a111111
setTemperature(Float)40%n/a111111
toString()40%n/a111111
$default$temperature()30%n/a112211
getTemperature()30%n/a111111
canEqual(Object)30%n/a111111
getEndpoint()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest.java.html deleted file mode 100644 index e3cb9853..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ChatApiEndpointRequest.java.html +++ /dev/null @@ -1,82 +0,0 @@ -ChatApiEndpointRequest.java

ChatApiEndpointRequest.java

package io.sentrius.sso.genai.model.endpoints;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import io.sentrius.sso.genai.model.ApiEndPointRequest;
-import io.sentrius.sso.genai.model.LLMRequest;
-import io.sentrius.sso.genai.Message;
-import lombok.Builder;
-import lombok.Data;
-import lombok.experimental.SuperBuilder;
-
-/**
- * Represents a request to the OpenAI Chat API endpoint.
- *
- * This class provides a convenient way to build a request to the OpenAI Chat API. It includes methods to set the input
- * text, the model to use, and the parameters for the request, among others. Once the request is built, it can be sent
- *
- * Example usage:
- *
- * <pre>{@code
- * ChatApiEndpointRequest request = new ChatApiEndpointRequest.builder().model("davinci").input("Hello, world!")
- *         .build();
- *
- * ChatApiEndpoint endpoint = new ChatApiEndpoint(apiKey);
- * ChatApiResponse response = endpoint.send(request);
- * }</pre>
- *
- */
-@Data
-@SuperBuilder
-public class ChatApiEndpointRequest extends ApiEndPointRequest {
-
-    public static final String API_ENDPOINT = "https://api.openai.com/v1/chat/completions";
-
-    @Builder.Default
-    private Float temperature = 1.0F;
-
-    @Override
-    public String getEndpoint() {
-        return API_ENDPOINT;
-    }
-
-    /**
-     * Creates a new instance of the ChatApiEndpoint with the specified API key.
-     *
-     * This method is used to create a new instance of the ChatApiEndpoint with the specified API key. The API key is
-     * required to send requests to the OpenAI Chat API endpoint. If the API key is invalid or not provided, an
-     * IllegalArgumentException will be thrown.
-     *
-     * Example usage:
-     *
-     * <pre>{@code
-     * ChatApiEndpoint endpoint = ChatApiEndpoint.create("my-api-key");
-     * }</pre>
-     *
-     *
-     * @return A new instance of the ChatApiEndpoint.
-     *
-     * @throws IllegalArgumentException
-     *             If the API key is null or empty.
-     */
-    @Override
-    public Object create() {
-        List<Message> messages = new ArrayList<>();
-        String role = null == user || user.isEmpty() ? "user" : user;
-        messages.add(Message.builder().role(role).content(userInput).build());
-        if (null != systemInput && !systemInput.isEmpty()) {
-            messages.add(Message.builder().role("system").content(systemInput).build());
-        }
-        var requestBody = LLMRequest.builder().model("gpt-3.5-turbo").user(role).messages(messages);
-        if (temperature != 1.0F) {
-            requestBody.temperature(temperature);
-        }
-        if (maxTokens != 4096) {
-            requestBody.maxTokens(maxTokens);
-        }
-        return requestBody.build();
-    }
-
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest$ConversationRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest$ConversationRequestBuilder.html deleted file mode 100644 index 9822c3c0..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest$ConversationRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -ConversationRequest.ConversationRequestBuilder

ConversationRequest.ConversationRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total42 of 420%0 of 0n/a551155
toString()120%n/a111111
temperature(Float)90%n/a111111
chatWithHistory(List)90%n/a111111
newMessage(LLMResponse)90%n/a111111
ConversationRequest.ConversationRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest$ConversationRequestBuilderImpl.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest$ConversationRequestBuilderImpl.html deleted file mode 100644 index cecf3a9e..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest$ConversationRequestBuilderImpl.html +++ /dev/null @@ -1 +0,0 @@ -ConversationRequest.ConversationRequestBuilderImpl

ConversationRequest.ConversationRequestBuilderImpl

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total7 of 70%0 of 0n/a221122
build()50%n/a111111
self()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest.html deleted file mode 100644 index 8c032520..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest.html +++ /dev/null @@ -1 +0,0 @@ -ConversationRequest

ConversationRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total308 of 3080%46 of 460%404019191717
create()970%100%66131311
equals(Object)720%240%13131111
hashCode()480%60%441111
ConversationRequest(ConversationRequest.ConversationRequestBuilder)370%60%441111
toString()100%n/a111111
$default$newMessage()70%n/a112211
$default$chatWithHistory()40%n/a111111
builder()40%n/a111111
setTemperature(Float)40%n/a111111
setChatWithHistory(List)40%n/a111111
setNewMessage(LLMResponse)40%n/a111111
$default$temperature()30%n/a112211
getTemperature()30%n/a111111
getChatWithHistory()30%n/a111111
getNewMessage()30%n/a111111
canEqual(Object)30%n/a111111
getEndpoint()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest.java.html deleted file mode 100644 index 7a48f9da..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/ConversationRequest.java.html +++ /dev/null @@ -1,91 +0,0 @@ -ConversationRequest.java

ConversationRequest.java

package io.sentrius.sso.genai.model.endpoints;
-
-import java.util.ArrayList;
-import java.util.List;
-import io.sentrius.sso.genai.Message;
-import io.sentrius.sso.genai.model.ApiEndPointRequest;
-import io.sentrius.sso.genai.model.LLMResponse;
-import io.sentrius.sso.genai.model.LLMRequest;
-import lombok.Builder;
-import lombok.Data;
-import lombok.experimental.SuperBuilder;
-
-/**
- * Represents a request to the OpenAI Chat API endpoint.
- *
- * This class provides a convenient way to build a request to the OpenAI Chat API. It includes methods to set the input
- * text, the model to use, and the parameters for the request, among others. Once the request is built, it can be sent
- * using the {@link ChatApiEndpoint#send(ConversationRequest)} method.
- *
- * Example usage:
- *
- * <pre>{@code
- * ChatApiEndpointRequest request = new ChatApiEndpointRequest.builder().model("davinci").input("Hello, world!")
- *         .build();
- *
- * ChatApiEndpoint endpoint = new ChatApiEndpoint(apiKey);
- * ChatApiResponse response = endpoint.send(request);
- * }</pre>
- *
- */
-@Data
-@SuperBuilder
-public class ConversationRequest extends ApiEndPointRequest {
-
-    public static final String API_ENDPOINT = "https://api.openai.com/v1/chat/completions";
-
-    @Builder.Default
-    private Float temperature = 1.0F;
-
-    @Override
-    public String getEndpoint() {
-        return API_ENDPOINT;
-    }
-
-    @Builder.Default
-    private List<LLMResponse> chatWithHistory = new ArrayList<>();
-
-    @Builder.Default
-    private LLMResponse newMessage = LLMResponse.builder().role("user").content("").build();
-
-
-    /**
-     * Creates a new instance of the ChatApiEndpoint with the specified API key.
-     *
-     * This method is used to create a new instance of the ChatApiEndpoint with the specified API key. The API key is
-     * required to send requests to the OpenAI Chat API endpoint. If the API key is invalid or not provided, an
-     * IllegalArgumentException will be thrown.
-     *
-     * Example usage:
-     *
-     * <pre>{@code
-     * ChatApiEndpoint endpoint = ChatApiEndpoint.create("my-api-key");
-     * }</pre>
-     *
-     *
-     * @return A new instance of the ChatApiEndpoint.
-     *
-     * @throws IllegalArgumentException
-     *             If the API key is null or empty.
-     */
-    @Override
-    public Object create() {
-        List<Message> messages = new ArrayList<>();
-        messages.add(Message.builder().role("system").content(systemInput).build());
-        for (LLMResponse chatMessage : chatWithHistory) {
-            messages.add(Message.builder().role(chatMessage.getRole()).content(chatMessage.getContent()).build());
-        }
-        messages.add(Message.builder().role(newMessage.getRole()).content(newMessage.getContent()).build());
-        String role = null == user || user.isEmpty() ? "user" : user;
-        var requestBody = LLMRequest.builder().model("gpt-3.5-turbo").user(role).messages(messages);
-        if (temperature != 1.0F) {
-            requestBody.temperature(temperature);
-        }
-        if (maxTokens != 4096) {
-            requestBody.maxTokens(maxTokens);
-        }
-        return requestBody.build();
-    }
-
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest$RawConversationRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest$RawConversationRequestBuilder.html deleted file mode 100644 index e26e6e81..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest$RawConversationRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -RawConversationRequest.RawConversationRequestBuilder

RawConversationRequest.RawConversationRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total42 of 420%0 of 0n/a551155
toString()120%n/a111111
temperature(Float)90%n/a111111
chatWithHistory(List)90%n/a111111
request(LLMRequest)90%n/a111111
RawConversationRequest.RawConversationRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest$RawConversationRequestBuilderImpl.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest$RawConversationRequestBuilderImpl.html deleted file mode 100644 index 7d78629a..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest$RawConversationRequestBuilderImpl.html +++ /dev/null @@ -1 +0,0 @@ -RawConversationRequest.RawConversationRequestBuilderImpl

RawConversationRequest.RawConversationRequestBuilderImpl

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total7 of 70%0 of 0n/a221122
build()50%n/a111111
self()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest.html deleted file mode 100644 index d0eacfe1..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest.html +++ /dev/null @@ -1 +0,0 @@ -RawConversationRequest

RawConversationRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total210 of 2100%36 of 360%3535771717
equals(Object)720%240%13131111
hashCode()480%60%441111
RawConversationRequest(RawConversationRequest.RawConversationRequestBuilder)370%60%441111
toString()100%n/a111111
$default$chatWithHistory()40%n/a111111
builder()40%n/a111111
setTemperature(Float)40%n/a111111
setChatWithHistory(List)40%n/a111111
setRequest(LLMRequest)40%n/a111111
create()30%n/a111111
$default$temperature()30%n/a112211
$default$request()30%n/a112211
getTemperature()30%n/a111111
getChatWithHistory()30%n/a111111
getRequest()30%n/a111111
canEqual(Object)30%n/a111111
getEndpoint()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest.java.html deleted file mode 100644 index 044f0785..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/RawConversationRequest.java.html +++ /dev/null @@ -1,78 +0,0 @@ -RawConversationRequest.java

RawConversationRequest.java

package io.sentrius.sso.genai.model.endpoints;
-
-import java.util.ArrayList;
-import java.util.List;
-import io.sentrius.sso.genai.model.ApiEndPointRequest;
-import io.sentrius.sso.genai.model.LLMRequest;
-import io.sentrius.sso.genai.model.LLMResponse;
-import lombok.Builder;
-import lombok.Data;
-import lombok.experimental.SuperBuilder;
-
-/**
- * Represents a request to the OpenAI Chat API endpoint.
- *
- * This class provides a convenient way to build a request to the OpenAI Chat API. It includes methods to set the input
- * text, the model to use, and the parameters for the request, among others. Once the request is built, it can be sent
- * using the {@link ChatApiEndpoint#send(io.sentrius.sso.genai.model.endpoints.RawConversationRequest)} method.
- *
- * Example usage:
- *
- * <pre>{@code
- * ChatApiEndpointRequest request = new ChatApiEndpointRequest.builder().model("davinci").input("Hello, world!")
- *         .build();
- *
- * ChatApiEndpoint endpoint = new ChatApiEndpoint(apiKey);
- * ChatApiResponse response = endpoint.send(request);
- * }</pre>
- *
- */
-@Data
-@SuperBuilder
-public class RawConversationRequest extends ApiEndPointRequest {
-
-    public static final String API_ENDPOINT = "https://api.openai.com/v1/chat/completions";
-
-    @Builder.Default
-    private Float temperature = 1.0F;
-
-    @Override
-    public String getEndpoint() {
-        return API_ENDPOINT;
-    }
-
-    @Builder.Default
-    private List<LLMResponse> chatWithHistory = new ArrayList<>();
-
-    @Builder.Default
-    private LLMRequest request = LLMRequest.builder().build();
-
-
-    /**
-     * Creates a new instance of the ChatApiEndpoint with the specified API key.
-     *
-     * This method is used to create a new instance of the ChatApiEndpoint with the specified API key. The API key is
-     * required to send requests to the OpenAI Chat API endpoint. If the API key is invalid or not provided, an
-     * IllegalArgumentException will be thrown.
-     *
-     * Example usage:
-     *
-     * <pre>{@code
-     * ChatApiEndpoint endpoint = ChatApiEndpoint.create("my-api-key");
-     * }</pre>
-     *
-     * @param apiKey
-     *            The API key to use for requests to the OpenAI Chat API endpoint.
-     *
-     * @return A new instance of the ChatApiEndpoint.
-     *
-     * @throws IllegalArgumentException
-     *             If the API key is null or empty.
-     */
-    @Override
-    public Object create() {
-        return request;
-    }
-
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/index.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/index.html deleted file mode 100644 index bb26cde9..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/index.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai.model.endpoints

io.sentrius.sso.genai.model.endpoints

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total816 of 8160%110 of 1100%1191194141646499
ConversationRequest3080%460%40401919171711
RawConversationRequest2100%360%353577171711
ChatApiEndpointRequest1750%280%25251515111111
ConversationRequest.ConversationRequestBuilder420%n/a55115511
RawConversationRequest.RawConversationRequestBuilder420%n/a55115511
ChatApiEndpointRequest.ChatApiEndpointRequestBuilder180%n/a33113311
ConversationRequest.ConversationRequestBuilderImpl70%n/a22112211
ChatApiEndpointRequest.ChatApiEndpointRequestBuilderImpl70%n/a22112211
RawConversationRequest.RawConversationRequestBuilderImpl70%n/a22112211
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/index.source.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/index.source.html deleted file mode 100644 index 4ed056a0..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model.endpoints/index.source.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai.model.endpoints

io.sentrius.sso.genai.model.endpoints

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total816 of 8160%110 of 1100%1191194141646499
ConversationRequest.java3570%460%47471919242433
RawConversationRequest.java2590%360%424277242433
ChatApiEndpointRequest.java2000%280%30301515161633
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest$ApiEndPointRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest$ApiEndPointRequestBuilder.html deleted file mode 100644 index 59463204..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest$ApiEndPointRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -ApiEndPointRequest.ApiEndPointRequestBuilder

ApiEndPointRequest.ApiEndPointRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total67 of 670%0 of 0n/a881188
$fillValuesFromInstanceIntoBuilder(ApiEndPointRequest, ApiEndPointRequest.ApiEndPointRequestBuilder)210%n/a111111
toString()100%n/a111111
maxTokens(int)90%n/a111111
$fillValuesFrom(ApiEndPointRequest)60%n/a111111
user(String)60%n/a111111
userInput(String)60%n/a111111
systemInput(String)60%n/a111111
ApiEndPointRequest.ApiEndPointRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest.html deleted file mode 100644 index 4f665136..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest.html +++ /dev/null @@ -1 +0,0 @@ -ApiEndPointRequest

ApiEndPointRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total203 of 2030%34 of 340%3131661414
equals(Object)790%260%14141111
hashCode()550%60%441111
ApiEndPointRequest(ApiEndPointRequest.ApiEndPointRequestBuilder)260%20%221111
toString()100%n/a111111
setUser(String)40%n/a111111
setUserInput(String)40%n/a111111
setSystemInput(String)40%n/a111111
setMaxTokens(int)40%n/a111111
getUser()30%n/a111111
getUserInput()30%n/a111111
getSystemInput()30%n/a111111
getMaxTokens()30%n/a111111
canEqual(Object)30%n/a111111
$default$maxTokens()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest.java.html deleted file mode 100644 index e6c948c4..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ApiEndPointRequest.java.html +++ /dev/null @@ -1,44 +0,0 @@ -ApiEndPointRequest.java

ApiEndPointRequest.java

package io.sentrius.sso.genai.model;
-
-import lombok.Builder;
-import lombok.Data;
-import lombok.experimental.SuperBuilder;
-
-/**
- * This class represents an API endpoint request that can be used to get the endpoint and create an object.
- * It provides methods to get the endpoint as a string and create an object from the endpoint.
- */
-@Data
-@SuperBuilder(toBuilder = true)
-public abstract class ApiEndPointRequest {
-
-    protected String user;
-
-    protected String userInput;
-
-    protected String systemInput;
-
-    @Builder.Default
-    protected int maxTokens = 4096;
-
-    /**
-     * Returns the endpoint of the API request. The endpoint refers to the specific location of the resource being accessed by the request.
-     * Examples of endpoints may include "/users" or "/products".
-     *
-     * @return a String representing the endpoint of the request.
-     */
-    public abstract String getEndpoint();
-
-    /**
-     * Creates an instance of the API endpoint request.
-     *
-     * @return An {@code Object} representing the API endpoint request. The actual
-     *         type of the returned object depends on the implementation of this
-     *         method in the subclass.
-     *
-     * @see ApiEndPointRequestBuilder
-     *
-     */
-    public abstract Object create();
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule$ComplianceRuleBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule$ComplianceRuleBuilder.html deleted file mode 100644 index 320c853b..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule$ComplianceRuleBuilder.html +++ /dev/null @@ -1 +0,0 @@ -ComplianceRule.ComplianceRuleBuilder

ComplianceRule.ComplianceRuleBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total18 of 180%0 of 0n/a441144
build()60%n/a111111
rule(String)50%n/a111111
toString()40%n/a111111
ComplianceRule.ComplianceRuleBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule.html deleted file mode 100644 index bc9aa33c..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule.html +++ /dev/null @@ -1 +0,0 @@ -ComplianceRule

ComplianceRule

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total85 of 850%14 of 140%16165599
equals(Object)380%120%771111
hashCode()200%20%221111
ComplianceRule(String)60%n/a111111
builder()40%n/a111111
setRule(String)40%n/a111111
toString()40%n/a111111
getRule()30%n/a111111
canEqual(Object)30%n/a111111
ComplianceRule()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule.java.html deleted file mode 100644 index 430df2f7..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/ComplianceRule.java.html +++ /dev/null @@ -1,29 +0,0 @@ -ComplianceRule.java

ComplianceRule.java

package io.sentrius.sso.genai.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * The ComplianceRule class represents a set of rules that must be followed to comply with a certain standard or regulation.
- * It provides various methods for defining and enforcing compliance rules.
- *
- * This class contains the following methods:
- * <ul>
- *     <li>addRule(): Adds a new rule to the set of compliance rules</li>
- *     <li>deleteRule(): Removes a rule from the set of compliance rules</li>
- *     <li>checkCompliance(): Checks whether a given set of data complies with the defined rules</li>
- * </ul>
- *
- * For more information about each method, refer to their respective Javadoc.
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class ComplianceRule {
-
-    String rule;
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation$ConversationBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation$ConversationBuilder.html deleted file mode 100644 index 0d64ac25..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation$ConversationBuilder.html +++ /dev/null @@ -1 +0,0 @@ -Conversation.ConversationBuilder

Conversation.ConversationBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total58 of 580%2 of 20%881177
build()190%20%221111
toString()130%n/a111111
terminalMessages(List)80%n/a111111
previousMessages(List)50%n/a111111
newUserMessage(LLMResponse)50%n/a111111
systemConfines(String)50%n/a111111
Conversation.ConversationBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation.html deleted file mode 100644 index b6e0bbb9..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation.html +++ /dev/null @@ -1 +0,0 @@ -Conversation

Conversation

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total218 of 2180%38 of 380%3434771515
equals(Object)890%300%16161111
hashCode()620%80%551111
Conversation(List, LLMResponse, List, String)150%n/a111111
toString()130%n/a111111
$default$terminalMessages()40%n/a111111
builder()40%n/a111111
setPreviousMessages(List)40%n/a111111
setNewUserMessage(LLMResponse)40%n/a111111
setTerminalMessages(List)40%n/a111111
setSystemConfines(String)40%n/a111111
canEqual(Object)30%n/a111111
getPreviousMessages()30%n/a111111
getNewUserMessage()30%n/a111111
getTerminalMessages()30%n/a111111
getSystemConfines()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation.java.html deleted file mode 100644 index 90fae4fa..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/Conversation.java.html +++ /dev/null @@ -1,25 +0,0 @@ -Conversation.java

Conversation.java

package io.sentrius.sso.genai.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import lombok.Builder;
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-
-
-@Builder
-@Data
-@Getter
-@Setter
-public class Conversation {
-
-    List<LLMResponse> previousMessages;
-    LLMResponse newUserMessage;
-
-    @Builder.Default
-    List<String> terminalMessages = new ArrayList<>();
-
-    String systemConfines;
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest$LLMRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest$LLMRequestBuilder.html deleted file mode 100644 index 400df938..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest$LLMRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -LLMRequest.LLMRequestBuilder

LLMRequest.LLMRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total151 of 1510%0 of 0n/a1414111414
$fillValuesFromInstanceIntoBuilder(LLMRequest, LLMRequest.LLMRequestBuilder)510%n/a111111
toString()270%n/a111111
$fillValuesFrom(LLMRequest)100%n/a111111
messages(List)60%n/a111111
temperature(Float)60%n/a111111
topP(Float)60%n/a111111
n(Integer)60%n/a111111
stream(Boolean)60%n/a111111
stop(List)60%n/a111111
maxTokens(Integer)60%n/a111111
presencePenalty(Float)60%n/a111111
frequencyPenalty(Float)60%n/a111111
logitBias(Map)60%n/a111111
LLMRequest.LLMRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest$LLMRequestBuilderImpl.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest$LLMRequestBuilderImpl.html deleted file mode 100644 index cb995990..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest$LLMRequestBuilderImpl.html +++ /dev/null @@ -1 +0,0 @@ -LLMRequest.LLMRequestBuilderImpl

LLMRequest.LLMRequestBuilderImpl

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total7 of 70%0 of 0n/a221122
build()50%n/a111111
self()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest.html deleted file mode 100644 index 20851bae..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest.html +++ /dev/null @@ -1 +0,0 @@ -LLMRequest

LLMRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total525 of 5250%86 of 860%727214142929
equals(Object)1910%660%34341111
hashCode()1460%200%11111111
LLMRequest(LLMRequest.LLMRequestBuilder)440%n/a111111
LLMRequest(List, Float, Float, Integer, Boolean, List, Integer, Float, Float, Map)330%n/a111111
toString()250%n/a111111
toBuilder()60%n/a111111
builder()40%n/a111111
setMessages(List)40%n/a111111
setTemperature(Float)40%n/a111111
setTopP(Float)40%n/a111111
setN(Integer)40%n/a111111
setStream(Boolean)40%n/a111111
setStop(List)40%n/a111111
setMaxTokens(Integer)40%n/a111111
setPresencePenalty(Float)40%n/a111111
setFrequencyPenalty(Float)40%n/a111111
setLogitBias(Map)40%n/a111111
getMessages()30%n/a111111
getTemperature()30%n/a111111
getTopP()30%n/a111111
getN()30%n/a111111
getStream()30%n/a111111
getStop()30%n/a111111
getMaxTokens()30%n/a111111
getPresencePenalty()30%n/a111111
getFrequencyPenalty()30%n/a111111
getLogitBias()30%n/a111111
canEqual(Object)30%n/a111111
LLMRequest()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest.java.html deleted file mode 100644 index 619f2f7a..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMRequest.java.html +++ /dev/null @@ -1,153 +0,0 @@ -LLMRequest.java

LLMRequest.java

package io.sentrius.sso.genai.model;
-
-import java.util.List;
-import java.util.Map;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.sentrius.sso.genai.Message;
-import io.sentrius.sso.genai.api.BaseGenerativeRequest;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.SuperBuilder;
-
-/**
- * <p>
- * Inspired by LiLittleCat's ChatCopmletionRequestBody
- * </p>
- * see:
- * <a href="https://platform.openai.com/docs/api-reference/chat">https://platform.openai.com/docs/api-reference/chat</a>
- *
- * borrowed from <a href="https://github.com/LiLittleCat">LiLittleCat</a>
- *
- * @since 2023/3/2
- */
-@Data
-@SuperBuilder(toBuilder = true)
-@NoArgsConstructor
-@AllArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class LLMRequest extends BaseGenerativeRequest {
-    /**
-     * Required
-     * <p>
-     * The messages to generate chat completions for, in the <a
-     * href=https://platform.openai.com/docs/guides/chat/introduction>chat format</a>.
-     */
-    @JsonProperty(value = "messages")
-    private List<Message> messages;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to 1
-     * <p>
-     * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while
-     * lower values like 0.2 will make it more focused and deterministic.
-     * <p>
-     * We generally recommend altering this or `top_p` but not both.
-     */
-    @JsonProperty(value = "temperature")
-    private Float temperature;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to 1
-     * <p>
-     * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of
-     * the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are
-     * considered.
-     * <p>
-     * We generally recommend altering this or `temperature` but not both.
-     */
-    @JsonProperty(value = "top_p")
-    private Float topP;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to 1
-     * <p>
-     * How many chat completions to generate for each message.
-     */
-    @JsonProperty(value = "n")
-    private Integer n;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to false
-     * <p>
-     * If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only <a
-     * href=https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#event_stream_format>server-sent
-     * events</a> as they become available, with the stream terminated by a `data: [DONE]` message.
-     */
-    @JsonProperty(value = "stream")
-    private Boolean stream;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to null
-     * <p>
-     * Up to 4 sequences where the API will stop generating further tokens.
-     */
-    @JsonProperty(value = "stop")
-    private List<String> stop;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to inf
-     * <p>
-     * The maximum number of tokens allowed for the generated answer. By default, the number of tokens the model can
-     * return will be (4096 - prompt tokens).
-     */
-    @JsonProperty(value = "max_tokens")
-    private Integer maxTokens;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to 0
-     * <p>
-     * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far,
-     * increasing the model's likelihood to talk about new topics.
-     * <p>
-     * <a href=https://platform.openai.com/docs/api-reference/parameter-details>See more information about frequency and
-     * presence penalties.</a>
-     */
-    @JsonProperty(value = "presence_penalty")
-    private Float presencePenalty;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to 0
-     * <p>
-     * Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so
-     * far, decreasing the model's likelihood to repeat the same line verbatim.
-     * <p>
-     * <a href=https://platform.openai.com/docs/api-reference/parameter-details>See more information about frequency and
-     * presence penalties.</a>
-     */
-    @JsonProperty(value = "frequency_penalty")
-    private Float frequencyPenalty;
-
-    /**
-     * Optional
-     * <p>
-     * Defaults to null
-     * <p>
-     * Modify the likelihood of specified tokens appearing in the completion.
-     * <p>
-     * Accepts a json object that maps tokens (specified by their token ID in the tokenizer) to an associated bias value
-     * from -100 to 100. Mathematically, the bias is added to the logits generated by the model prior to sampling. The
-     * exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of
-     * selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token.
-     */
-    @JsonProperty(value = "logit_bias")
-    private Map<Object, Object> logitBias;
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse$LLMResponseBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse$LLMResponseBuilder.html deleted file mode 100644 index 0d46c9c7..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse$LLMResponseBuilder.html +++ /dev/null @@ -1 +0,0 @@ -LLMResponse.LLMResponseBuilder

LLMResponse.LLMResponseBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total55 of 550%2 of 20%881177
build()190%20%221111
toString()100%n/a111111
alert(boolean)80%n/a111111
role(String)50%n/a111111
content(String)50%n/a111111
terminalMessage(String)50%n/a111111
LLMResponse.LLMResponseBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse.html deleted file mode 100644 index f85f58ef..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse.html +++ /dev/null @@ -1 +0,0 @@ -LLMResponse

LLMResponse

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total206 of 2060%34 of 340%3333991616
equals(Object)790%260%14141111
hashCode()590%80%551111
LLMResponse(String, String, String, boolean)150%n/a111111
toString()100%n/a111111
LLMResponse()60%n/a111111
builder()40%n/a111111
setRole(String)40%n/a111111
setContent(String)40%n/a111111
setTerminalMessage(String)40%n/a111111
setAlert(boolean)40%n/a111111
getRole()30%n/a111111
getContent()30%n/a111111
getTerminalMessage()30%n/a111111
isAlert()30%n/a111111
canEqual(Object)30%n/a111111
$default$alert()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse.java.html deleted file mode 100644 index 0d4f7450..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/LLMResponse.java.html +++ /dev/null @@ -1,23 +0,0 @@ -LLMResponse.java

LLMResponse.java

package io.sentrius.sso.genai.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-
-@Getter
-@Data
-@Setter
-@Builder
-@AllArgsConstructor
-@RequiredArgsConstructor
-public class LLMResponse {
-    private String role;
-    private String content;
-    private String terminalMessage;
-    @Builder.Default
-    private boolean alert = false;
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest$TwoPartyRequestBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest$TwoPartyRequestBuilder.html deleted file mode 100644 index 25b70592..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest$TwoPartyRequestBuilder.html +++ /dev/null @@ -1 +0,0 @@ -TwoPartyRequest.TwoPartyRequestBuilder

TwoPartyRequest.TwoPartyRequestBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total73 of 730%2 of 20%10101199
build()230%20%221111
toString()140%n/a111111
systemInput(String)80%n/a111111
whatSystemIsDoing(String)50%n/a111111
userObjective(String)50%n/a111111
userInput(String)50%n/a111111
previousPrompt(String)50%n/a111111
promptResponse(String)50%n/a111111
TwoPartyRequest.TwoPartyRequestBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest.html deleted file mode 100644 index a072e103..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest.html +++ /dev/null @@ -1 +0,0 @@ -TwoPartyRequest

TwoPartyRequest

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total45 of 450%0 of 0n/a997799
TwoPartyRequest(String, String, String, String, String, String)210%n/a111111
builder()40%n/a111111
getSystemInput()30%n/a111111
getWhatSystemIsDoing()30%n/a111111
getUserObjective()30%n/a111111
getUserInput()30%n/a111111
getPreviousPrompt()30%n/a111111
getPromptResponse()30%n/a111111
$default$systemInput()20%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest.java.html deleted file mode 100644 index 29e3d82e..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/TwoPartyRequest.java.html +++ /dev/null @@ -1,22 +0,0 @@ -TwoPartyRequest.java

TwoPartyRequest.java

package io.sentrius.sso.genai.model;
-
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class TwoPartyRequest {
-    @Builder.Default
-    private String systemInput = "This is a mission critical system with admins performing break glass activities " +
-        "through ssh. You are monitoring as a two party system and acting as a second human monitoring a " +
-        "session.  ";
-
-    private String whatSystemIsDoing;
-    private String userObjective;
-    private String userInput;
-
-    private String previousPrompt;
-    private String promptResponse;
-
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/index.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/index.html deleted file mode 100644 index 7c70c36f..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/index.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai.model

io.sentrius.sso.genai.model

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total1,711 of 1,7110%212 of 2120%24924948481431431313
LLMRequest5250%860%72721414292911
Conversation2180%380%343477151511
LLMResponse2060%340%333399161611
ApiEndPointRequest2030%340%313166141411
LLMRequest.LLMRequestBuilder1510%n/a141411141411
ComplianceRule850%140%1616559911
TwoPartyRequest.TwoPartyRequestBuilder730%20%1010119911
ApiEndPointRequest.ApiEndPointRequestBuilder670%n/a88118811
Conversation.ConversationBuilder580%20%88117711
LLMResponse.LLMResponseBuilder550%20%88117711
TwoPartyRequest450%n/a99779911
ComplianceRule.ComplianceRuleBuilder180%n/a44114411
LLMRequest.LLMRequestBuilderImpl70%n/a22112211
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/index.source.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/index.source.html deleted file mode 100644 index 1a423af4..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai.model/index.source.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai.model

io.sentrius.sso.genai.model

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total1,711 of 1,7110%212 of 2120%24924948481431431313
LLMRequest.java6830%860%88881414454533
Conversation.java2760%400%424277222222
ApiEndPointRequest.java2700%340%393966222222
LLMResponse.java2610%360%414199232322
TwoPartyRequest.java1180%20%191977181822
ComplianceRule.java1030%140%202055131322
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message$MessageBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message$MessageBuilder.html deleted file mode 100644 index c0135543..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message$MessageBuilder.html +++ /dev/null @@ -1 +0,0 @@ -Message.MessageBuilder

Message.MessageBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total36 of 360%0 of 0n/a661166
build()100%n/a111111
toString()80%n/a111111
role(String)50%n/a111111
content(String)50%n/a111111
refusal(String)50%n/a111111
Message.MessageBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message.html deleted file mode 100644 index e9671bc6..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message.html +++ /dev/null @@ -1 +0,0 @@ -Message

Message

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total171 of 1710%30 of 300%2828771313
equals(Object)720%240%13131111
hashCode()480%60%441111
Message(String, String, String)120%n/a111111
toString()80%n/a111111
builder()40%n/a111111
setRole(String)40%n/a111111
setContent(String)40%n/a111111
setRefusal(String)40%n/a111111
getRole()30%n/a111111
getContent()30%n/a111111
getRefusal()30%n/a111111
canEqual(Object)30%n/a111111
Message()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message.java.html deleted file mode 100644 index dde8f1c2..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Message.java.html +++ /dev/null @@ -1,48 +0,0 @@ -Message.java

Message.java

package io.sentrius.sso.genai;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * <p>
- * Inspired by liLittleCat's ChatGPT package.
- *
- * Codifies the Message request
- * </p>
- *
- * original @author <a href="https://github.com/LiLittleCat">LiLittleCat</a>
- *
- * @since 2023/3/2
- */
-
-/**
- * The Message class represents a message that can be sent between users. This class is immutable and contains information about the message.
- * It has the following methods:
- *
- * 1. getMessageText(): returns the text of the message
- * 2. getSender(): returns the user who sent the message
- * 3. getRecipient(): returns the user who received the message
- * 4. getTimestamp(): returns the timestamp of the message
- * 5. toString(): returns the string representation of the message
- */
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Message {
-
-    @JsonProperty(value = "role")
-    public String role;
-
-    @JsonProperty(value = "content")
-    public String content;
-
-    @JsonProperty(value = "refusal")
-    public String refusal;
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$Choice.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$Choice.html deleted file mode 100644 index 5c19ad3b..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$Choice.html +++ /dev/null @@ -1 +0,0 @@ -Response.Choice

Response.Choice

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total196 of 1960%38 of 380%3232551313
equals(Object)890%300%16161111
hashCode()620%80%551111
toString()110%n/a111111
setIndex(Integer)40%n/a111111
setMessage(Message)40%n/a111111
setFinishReason(String)40%n/a111111
setLogprobs(Integer)40%n/a111111
Response.Choice()30%n/a111111
getIndex()30%n/a111111
getMessage()30%n/a111111
getFinishReason()30%n/a111111
getLogprobs()30%n/a111111
canEqual(Object)30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$ResponseBuilder.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$ResponseBuilder.html deleted file mode 100644 index 0310a02e..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$ResponseBuilder.html +++ /dev/null @@ -1 +0,0 @@ -Response.ResponseBuilder

Response.ResponseBuilder

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total83 of 830%0 of 0n/a1111111111
build()200%n/a111111
toString()200%n/a111111
id(String)50%n/a111111
object(String)50%n/a111111
created(Long)50%n/a111111
model(String)50%n/a111111
choices(List)50%n/a111111
usage(Response.Usage)50%n/a111111
serviceTier(String)50%n/a111111
systemFingerprint(String)50%n/a111111
Response.ResponseBuilder()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$Usage.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$Usage.html deleted file mode 100644 index b41705af..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response$Usage.html +++ /dev/null @@ -1 +0,0 @@ -Response.Usage

Response.Usage

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total155 of 1550%30 of 300%2626441111
equals(Object)720%240%13131111
hashCode()480%60%441111
toString()80%n/a111111
setPromptTokens(Integer)40%n/a111111
setCompletionTokens(Integer)40%n/a111111
setTotalTokens(Integer)40%n/a111111
Response.Usage()30%n/a111111
getPromptTokens()30%n/a111111
getCompletionTokens()30%n/a111111
getTotalTokens()30%n/a111111
canEqual(Object)30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response.html deleted file mode 100644 index 9ef6c7b1..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response.html +++ /dev/null @@ -1 +0,0 @@ -Response

Response

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total401 of 4010%70 of 700%606013132525
equals(Object)1570%540%28281111
hashCode()1180%160%991111
Response(String, String, Long, String, List, Response.Usage, String, String)270%n/a111111
toString()200%n/a111111
concatenateResponses()90%n/a111111
builder()40%n/a111111
setId(String)40%n/a111111
setObject(String)40%n/a111111
setCreated(Long)40%n/a111111
setModel(String)40%n/a111111
setChoices(List)40%n/a111111
setUsage(Response.Usage)40%n/a111111
setServiceTier(String)40%n/a111111
setSystemFingerprint(String)40%n/a111111
lambda$concatenateResponses$0(Response.Choice)40%n/a111111
getId()30%n/a111111
getObject()30%n/a111111
getCreated()30%n/a111111
getModel()30%n/a111111
getChoices()30%n/a111111
getUsage()30%n/a111111
getServiceTier()30%n/a111111
getSystemFingerprint()30%n/a111111
canEqual(Object)30%n/a111111
Response()30%n/a111111
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response.java.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response.java.html deleted file mode 100644 index 67c78ba9..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/Response.java.html +++ /dev/null @@ -1,96 +0,0 @@ -Response.java

Response.java

package io.sentrius.sso.genai;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * Response class is responsible for collecting and storing user responses. It provides a string
- * concatenation method to combine all responses. Use the 'addResponse' method to collect user
- * responses and the 'concatenateResponses' method to combine them into a single string.
- */
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class Response {
-
-    @JsonProperty(value = "id")
-    public String id;
-
-    @JsonProperty(value = "object")
-    public String object;
-
-    @JsonProperty(value = "created")
-    public Long created;
-
-    @JsonProperty(value = "model")
-    public String model;
-
-    @JsonProperty(value = "choices")
-    public List<Choice> choices;
-
-    @JsonProperty(value = "usage")
-    public Usage usage;
-
-    @JsonProperty(value = "service_tier", required = false)
-    public String serviceTier;
-
-    /**
-     * Response class is responsible for collecting and storing user responses. It provides a string
-     * concatenation method to combine all responses. Use the 'addResponse' method to collect user
-     * responses and the 'concatenateResponses' method to combine them into a single string.
-     */
-    @Data
-    public static class Choice {
-
-        @JsonProperty(value = "index")
-        public Integer index;
-
-        @JsonProperty(value = "message")
-        public Message message;
-
-        @JsonProperty(value = "finish_reason")
-        public String finishReason;
-
-        @JsonProperty(value = "logprobs")
-        public Integer logprobs;
-    }
-
-    /**
-     * Response class is responsible for collecting and storing user responses. It provides a string
-     * concatenation method to combine all responses. Use the 'addResponse' method to collect user
-     * responses and the 'concatenateResponses' method to combine them into a single string.
-     */
-    @Data
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class Usage {
-
-        @JsonProperty(value = "prompt_tokens")
-        public Integer promptTokens;
-
-        @JsonProperty(value = "completion_tokens")
-        public Integer completionTokens;
-
-        @JsonProperty(value = "total_tokens")
-        public Integer totalTokens;
-    }
-
-    @JsonProperty(value = "system_fingerprint")
-    String systemFingerprint;
-
-    /**
-     * This method concatenates all responses in a Response object and returns a string.
-     *
-     * @return      a string that contains all responses in a Response object
-     */
-    public String concatenateResponses() {
-        return getChoices().stream().map(x -> x.getMessage().getContent()).collect(Collectors.joining());
-    }
-}
-
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/index.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/index.html deleted file mode 100644 index 2ffc0bc6..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/index.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai

io.sentrius.sso.genai

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total1,042 of 1,0420%168 of 1680%1631632929797966
Response4010%700%60601313252511
Response.Choice1960%380%323255131311
Message1710%300%282877131311
Response.Usage1550%300%262644111111
Response.ResponseBuilder830%n/a111111111111
Message.MessageBuilder360%n/a66116611
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/index.source.html b/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/index.source.html deleted file mode 100644 index 6f016859..00000000 --- a/sentrius-llm-core/target/site/jacoco/io.sentrius.sso.genai/index.source.html +++ /dev/null @@ -1 +0,0 @@ -io.sentrius.sso.genai

io.sentrius.sso.genai

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total1,042 of 1,0420%168 of 1680%1631632929797966
Response.java8350%1380%1291292222606044
Message.java2070%300%343477191922
\ No newline at end of file diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchfc.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchfc.gif deleted file mode 100644 index 989b46d3..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchfc.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchnc.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchnc.gif deleted file mode 100644 index 1933e07c..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchnc.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchpc.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchpc.gif deleted file mode 100644 index cbf711b7..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/branchpc.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/bundle.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/bundle.gif deleted file mode 100644 index fca9c53e..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/bundle.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/class.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/class.gif deleted file mode 100644 index eb348fb0..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/class.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/down.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/down.gif deleted file mode 100644 index 440a14db..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/down.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/greenbar.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/greenbar.gif deleted file mode 100644 index 0ba65672..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/greenbar.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/group.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/group.gif deleted file mode 100644 index a4ea580d..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/group.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/method.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/method.gif deleted file mode 100644 index 7d24707e..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/method.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/package.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/package.gif deleted file mode 100644 index 131c28da..00000000 Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/package.gif and /dev/null differ diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/prettify.css b/sentrius-llm-core/target/site/jacoco/jacoco-resources/prettify.css deleted file mode 100644 index be5166e0..00000000 --- a/sentrius-llm-core/target/site/jacoco/jacoco-resources/prettify.css +++ /dev/null @@ -1,13 +0,0 @@ -/* Pretty printing styles. Used with prettify.js. */ - -.str { color: #2A00FF; } -.kwd { color: #7F0055; font-weight:bold; } -.com { color: #3F5FBF; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -.tag { color: #008; } -.atn { color: #606; } -.atv { color: #080; } -.dec { color: #606; } diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/prettify.js b/sentrius-llm-core/target/site/jacoco/jacoco-resources/prettify.js deleted file mode 100644 index b2766fe0..00000000 --- a/sentrius-llm-core/target/site/jacoco/jacoco-resources/prettify.js +++ /dev/null @@ -1,1510 +0,0 @@ -// Copyright (C) 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -/** - * @fileoverview - * some functions for browser-side pretty printing of code contained in html. - *

- * - * For a fairly comprehensive set of languages see the - * README - * file that came with this source. At a minimum, the lexer should work on a - * number of languages including C and friends, Java, Python, Bash, SQL, HTML, - * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk - * and a subset of Perl, but, because of commenting conventions, doesn't work on - * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. - *

- * Usage:

    - *
  1. include this source file in an html page via - * {@code } - *
  2. define style rules. See the example page for examples. - *
  3. mark the {@code
    } and {@code } tags in your source with
    - *    {@code class=prettyprint.}
    - *    You can also use the (html deprecated) {@code } tag, but the pretty
    - *    printer needs to do more substantial DOM manipulations to support that, so
    - *    some css styles may not be preserved.
    - * </ol>
    - * That's it.  I wanted to keep the API as simple as possible, so there's no
    - * need to specify which language the code is in, but if you wish, you can add
    - * another class to the {@code <pre>} or {@code <code>} element to specify the
    - * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    - * starts with "lang-" followed by a file extension, specifies the file type.
    - * See the "lang-*.js" files in this directory for code that implements
    - * per-language file handlers.
    - * <p>
    - * Change log:<br>
    - * cbeust, 2006/08/22
    - * <blockquote>
    - *   Java annotations (start with "@") are now captured as literals ("lit")
    - * </blockquote>
    - * @requires console
    - */
    -
    -// JSLint declarations
    -/*global console, document, navigator, setTimeout, window */
    -
    -/**
    - * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    - * UI events.
    - * If set to {@code false}, {@code prettyPrint()} is synchronous.
    - */
    -window['PR_SHOULD_USE_CONTINUATION'] = true;
    -
    -/** the number of characters between tab columns */
    -window['PR_TAB_WIDTH'] = 8;
    -
    -/** Walks the DOM returning a properly escaped version of innerHTML.
    -  * @param {Node} node
    -  * @param {Array.<string>} out output buffer that receives chunks of HTML.
    -  */
    -window['PR_normalizedHtml']
    -
    -/** Contains functions for creating and registering new language handlers.
    -  * @type {Object}
    -  */
    -  = window['PR']
    -
    -/** Pretty print a chunk of code.
    -  *
    -  * @param {string} sourceCodeHtml code as html
    -  * @return {string} code as html, but prettier
    -  */
    -  = window['prettyPrintOne']
    -/** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    -  * {@code class=prettyprint} and prettify them.
    -  * @param {Function?} opt_whenDone if specified, called when the last entry
    -  *     has been finished.
    -  */
    -  = window['prettyPrint'] = void 0;
    -
    -/** browser detection. @extern @returns false if not IE, otherwise the major version. */
    -window['_pr_isIE6'] = function () {
    -  var ieVersion = navigator && navigator.userAgent &&
    -      navigator.userAgent.match(/\bMSIE ([678])\./);
    -  ieVersion = ieVersion ? +ieVersion[1] : false;
    -  window['_pr_isIE6'] = function () { return ieVersion; };
    -  return ieVersion;
    -};
    -
    -
    -(function () {
    -  // Keyword lists for various languages.
    -  var FLOW_CONTROL_KEYWORDS =
    -      "break continue do else for if return while ";
    -  var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
    -      "double enum extern float goto int long register short signed sizeof " +
    -      "static struct switch typedef union unsigned void volatile ";
    -  var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
    -      "new operator private protected public this throw true try typeof ";
    -  var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
    -      "concept concept_map const_cast constexpr decltype " +
    -      "dynamic_cast explicit export friend inline late_check " +
    -      "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
    -      "template typeid typename using virtual wchar_t where ";
    -  var JAVA_KEYWORDS = COMMON_KEYWORDS +
    -      "abstract boolean byte extends final finally implements import " +
    -      "instanceof null native package strictfp super synchronized throws " +
    -      "transient ";
    -  var CSHARP_KEYWORDS = JAVA_KEYWORDS +
    -      "as base by checked decimal delegate descending event " +
    -      "fixed foreach from group implicit in interface internal into is lock " +
    -      "object out override orderby params partial readonly ref sbyte sealed " +
    -      "stackalloc string select uint ulong unchecked unsafe ushort var ";
    -  var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
    -      "debugger eval export function get null set undefined var with " +
    -      "Infinity NaN ";
    -  var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
    -      "goto if import last local my next no our print package redo require " +
    -      "sub undef unless until use wantarray while BEGIN END ";
    -  var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
    -      "elif except exec finally from global import in is lambda " +
    -      "nonlocal not or pass print raise try with yield " +
    -      "False True None ";
    -  var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
    -      " defined elsif end ensure false in module next nil not or redo rescue " +
    -      "retry self super then true undef unless until when yield BEGIN END ";
    -  var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
    -      "function in local set then until ";
    -  var ALL_KEYWORDS = (
    -      CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
    -      PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    -
    -  // token style names.  correspond to css classes
    -  /** token style for a string literal */
    -  var PR_STRING = 'str';
    -  /** token style for a keyword */
    -  var PR_KEYWORD = 'kwd';
    -  /** token style for a comment */
    -  var PR_COMMENT = 'com';
    -  /** token style for a type */
    -  var PR_TYPE = 'typ';
    -  /** token style for a literal value.  e.g. 1, null, true. */
    -  var PR_LITERAL = 'lit';
    -  /** token style for a punctuation string. */
    -  var PR_PUNCTUATION = 'pun';
    -  /** token style for a punctuation string. */
    -  var PR_PLAIN = 'pln';
    -
    -  /** token style for an sgml tag. */
    -  var PR_TAG = 'tag';
    -  /** token style for a markup declaration such as a DOCTYPE. */
    -  var PR_DECLARATION = 'dec';
    -  /** token style for embedded source. */
    -  var PR_SOURCE = 'src';
    -  /** token style for an sgml attribute name. */
    -  var PR_ATTRIB_NAME = 'atn';
    -  /** token style for an sgml attribute value. */
    -  var PR_ATTRIB_VALUE = 'atv';
    -
    -  /**
    -   * A class that indicates a section of markup that is not code, e.g. to allow
    -   * embedding of line numbers within code listings.
    -   */
    -  var PR_NOCODE = 'nocode';
    -
    -  /** A set of tokens that can precede a regular expression literal in
    -    * javascript.
    -    * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
    -    * list, but I've removed ones that might be problematic when seen in
    -    * languages that don't support regular expression literals.
    -    *
    -    * <p>Specifically, I've removed any keywords that can't precede a regexp
    -    * literal in a syntactically legal javascript program, and I've removed the
    -    * "in" keyword since it's not a keyword in many languages, and might be used
    -    * as a count of inches.
    -    *
    -    * <p>The link a above does not accurately describe EcmaScript rules since
    -    * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    -    * very well in practice.
    -    *
    -    * @private
    -    */
    -  var REGEXP_PRECEDER_PATTERN = function () {
    -      var preceders = [
    -          "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
    -          "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
    -          "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
    -          "<", "<<", "<<=", "<=", "=", "==", "===", ">",
    -          ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
    -          "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
    -          "||=", "~" /* handles =~ and !~ */,
    -          "break", "case", "continue", "delete",
    -          "do", "else", "finally", "instanceof",
    -          "return", "throw", "try", "typeof"
    -          ];
    -      var pattern = '(?:^^|[+-]';
    -      for (var i = 0; i < preceders.length; ++i) {
    -        pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
    -      }
    -      pattern += ')\\s*';  // matches at end, and matches empty string
    -      return pattern;
    -      // CAVEAT: this does not properly handle the case where a regular
    -      // expression immediately follows another since a regular expression may
    -      // have flags for case-sensitivity and the like.  Having regexp tokens
    -      // adjacent is not valid in any language I'm aware of, so I'm punting.
    -      // TODO: maybe style special characters inside a regexp as punctuation.
    -    }();
    -
    -  // Define regexps here so that the interpreter doesn't have to create an
    -  // object each time the function containing them is called.
    -  // The language spec requires a new object created even if you don't access
    -  // the $1 members.
    -  var pr_amp = /&/g;
    -  var pr_lt = /</g;
    -  var pr_gt = />/g;
    -  var pr_quot = /\"/g;
    -  /** like textToHtml but escapes double quotes to be attribute safe. */
    -  function attribToHtml(str) {
    -    return str.replace(pr_amp, '&amp;')
    -        .replace(pr_lt, '&lt;')
    -        .replace(pr_gt, '&gt;')
    -        .replace(pr_quot, '&quot;');
    -  }
    -
    -  /** escapest html special characters to html. */
    -  function textToHtml(str) {
    -    return str.replace(pr_amp, '&amp;')
    -        .replace(pr_lt, '&lt;')
    -        .replace(pr_gt, '&gt;');
    -  }
    -
    -
    -  var pr_ltEnt = /&lt;/g;
    -  var pr_gtEnt = /&gt;/g;
    -  var pr_aposEnt = /&apos;/g;
    -  var pr_quotEnt = /&quot;/g;
    -  var pr_ampEnt = /&amp;/g;
    -  var pr_nbspEnt = /&nbsp;/g;
    -  /** unescapes html to plain text. */
    -  function htmlToText(html) {
    -    var pos = html.indexOf('&');
    -    if (pos < 0) { return html; }
    -    // Handle numeric entities specially.  We can't use functional substitution
    -    // since that doesn't work in older versions of Safari.
    -    // These should be rare since most browsers convert them to normal chars.
    -    for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
    -      var end = html.indexOf(';', pos);
    -      if (end >= 0) {
    -        var num = html.substring(pos + 3, end);
    -        var radix = 10;
    -        if (num && num.charAt(0) === 'x') {
    -          num = num.substring(1);
    -          radix = 16;
    -        }
    -        var codePoint = parseInt(num, radix);
    -        if (!isNaN(codePoint)) {
    -          html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
    -                  html.substring(end + 1));
    -        }
    -      }
    -    }
    -
    -    return html.replace(pr_ltEnt, '<')
    -        .replace(pr_gtEnt, '>')
    -        .replace(pr_aposEnt, "'")
    -        .replace(pr_quotEnt, '"')
    -        .replace(pr_nbspEnt, ' ')
    -        .replace(pr_ampEnt, '&');
    -  }
    -
    -  /** is the given node's innerHTML normally unescaped? */
    -  function isRawContent(node) {
    -    return 'XMP' === node.tagName;
    -  }
    -
    -  var newlineRe = /[\r\n]/g;
    -  /**
    -   * Are newlines and adjacent spaces significant in the given node's innerHTML?
    -   */
    -  function isPreformatted(node, content) {
    -    // PRE means preformatted, and is a very common case, so don't create
    -    // unnecessary computed style objects.
    -    if ('PRE' === node.tagName) { return true; }
    -    if (!newlineRe.test(content)) { return true; }  // Don't care
    -    var whitespace = '';
    -    // For disconnected nodes, IE has no currentStyle.
    -    if (node.currentStyle) {
    -      whitespace = node.currentStyle.whiteSpace;
    -    } else if (window.getComputedStyle) {
    -      // Firefox makes a best guess if node is disconnected whereas Safari
    -      // returns the empty string.
    -      whitespace = window.getComputedStyle(node, null).whiteSpace;
    -    }
    -    return !whitespace || whitespace === 'pre';
    -  }
    -
    -  function normalizedHtml(node, out, opt_sortAttrs) {
    -    switch (node.nodeType) {
    -      case 1:  // an element
    -        var name = node.tagName.toLowerCase();
    -
    -        out.push('<', name);
    -        var attrs = node.attributes;
    -        var n = attrs.length;
    -        if (n) {
    -          if (opt_sortAttrs) {
    -            var sortedAttrs = [];
    -            for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }
    -            sortedAttrs.sort(function (a, b) {
    -                return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;
    -              });
    -            attrs = sortedAttrs;
    -          }
    -          for (var i = 0; i < n; ++i) {
    -            var attr = attrs[i];
    -            if (!attr.specified) { continue; }
    -            out.push(' ', attr.name.toLowerCase(),
    -                     '="', attribToHtml(attr.value), '"');
    -          }
    -        }
    -        out.push('>');
    -        for (var child = node.firstChild; child; child = child.nextSibling) {
    -          normalizedHtml(child, out, opt_sortAttrs);
    -        }
    -        if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
    -          out.push('<\/', name, '>');
    -        }
    -        break;
    -      case 3: case 4: // text
    -        out.push(textToHtml(node.nodeValue));
    -        break;
    -    }
    -  }
    -
    -  /**
    -   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    -   * matches the union o the sets o strings matched d by the input RegExp.
    -   * Since it matches globally, if the input strings have a start-of-input
    -   * anchor (/^.../), it is ignored for the purposes of unioning.
    -   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    -   * @return {RegExp} a global regex.
    -   */
    -  function combinePrefixPatterns(regexs) {
    -    var capturedGroupIndex = 0;
    -
    -    var needToFoldCase = false;
    -    var ignoreCase = false;
    -    for (var i = 0, n = regexs.length; i < n; ++i) {
    -      var regex = regexs[i];
    -      if (regex.ignoreCase) {
    -        ignoreCase = true;
    -      } else if (/[a-z]/i.test(regex.source.replace(
    -                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    -        needToFoldCase = true;
    -        ignoreCase = false;
    -        break;
    -      }
    -    }
    -
    -    function decodeEscape(charsetPart) {
    -      if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
    -      switch (charsetPart.charAt(1)) {
    -        case 'b': return 8;
    -        case 't': return 9;
    -        case 'n': return 0xa;
    -        case 'v': return 0xb;
    -        case 'f': return 0xc;
    -        case 'r': return 0xd;
    -        case 'u': case 'x':
    -          return parseInt(charsetPart.substring(2), 16)
    -              || charsetPart.charCodeAt(1);
    -        case '0': case '1': case '2': case '3': case '4':
    -        case '5': case '6': case '7':
    -          return parseInt(charsetPart.substring(1), 8);
    -        default: return charsetPart.charCodeAt(1);
    -      }
    -    }
    -
    -    function encodeEscape(charCode) {
    -      if (charCode < 0x20) {
    -        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    -      }
    -      var ch = String.fromCharCode(charCode);
    -      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
    -        ch = '\\' + ch;
    -      }
    -      return ch;
    -    }
    -
    -    function caseFoldCharset(charSet) {
    -      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    -          new RegExp(
    -              '\\\\u[0-9A-Fa-f]{4}'
    -              + '|\\\\x[0-9A-Fa-f]{2}'
    -              + '|\\\\[0-3][0-7]{0,2}'
    -              + '|\\\\[0-7]{1,2}'
    -              + '|\\\\[\\s\\S]'
    -              + '|-'
    -              + '|[^-\\\\]',
    -              'g'));
    -      var groups = [];
    -      var ranges = [];
    -      var inverse = charsetParts[0] === '^';
    -      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    -        var p = charsetParts[i];
    -        switch (p) {
    -          case '\\B': case '\\b':
    -          case '\\D': case '\\d':
    -          case '\\S': case '\\s':
    -          case '\\W': case '\\w':
    -            groups.push(p);
    -            continue;
    -        }
    -        var start = decodeEscape(p);
    -        var end;
    -        if (i + 2 < n && '-' === charsetParts[i + 1]) {
    -          end = decodeEscape(charsetParts[i + 2]);
    -          i += 2;
    -        } else {
    -          end = start;
    -        }
    -        ranges.push([start, end]);
    -        // If the range might intersect letters, then expand it.
    -        if (!(end < 65 || start > 122)) {
    -          if (!(end < 65 || start > 90)) {
    -            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    -          }
    -          if (!(end < 97 || start > 122)) {
    -            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    -          }
    -        }
    -      }
    -
    -      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    -      // -> [[1, 12], [14, 14], [16, 17]]
    -      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    -      var consolidatedRanges = [];
    -      var lastRange = [NaN, NaN];
    -      for (var i = 0; i < ranges.length; ++i) {
    -        var range = ranges[i];
    -        if (range[0] <= lastRange[1] + 1) {
    -          lastRange[1] = Math.max(lastRange[1], range[1]);
    -        } else {
    -          consolidatedRanges.push(lastRange = range);
    -        }
    -      }
    -
    -      var out = ['['];
    -      if (inverse) { out.push('^'); }
    -      out.push.apply(out, groups);
    -      for (var i = 0; i < consolidatedRanges.length; ++i) {
    -        var range = consolidatedRanges[i];
    -        out.push(encodeEscape(range[0]));
    -        if (range[1] > range[0]) {
    -          if (range[1] + 1 > range[0]) { out.push('-'); }
    -          out.push(encodeEscape(range[1]));
    -        }
    -      }
    -      out.push(']');
    -      return out.join('');
    -    }
    -
    -    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    -      // Split into character sets, escape sequences, punctuation strings
    -      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    -      // include any of the above.
    -      var parts = regex.source.match(
    -          new RegExp(
    -              '(?:'
    -              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    -              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    -              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    -              + '|\\\\[0-9]+'  // a back-reference or octal escape
    -              + '|\\\\[^ux0-9]'  // other escape sequence
    -              + '|\\(\\?[:!=]'  // start of a non-capturing group
    -              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
    -              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    -              + ')',
    -              'g'));
    -      var n = parts.length;
    -
    -      // Maps captured group numbers to the number they will occupy in
    -      // the output or to -1 if that has not been determined, or to
    -      // undefined if they need not be capturing in the output.
    -      var capturedGroups = [];
    -
    -      // Walk over and identify back references to build the capturedGroups
    -      // mapping.
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        var p = parts[i];
    -        if (p === '(') {
    -          // groups are 1-indexed, so max group index is count of '('
    -          ++groupIndex;
    -        } else if ('\\' === p.charAt(0)) {
    -          var decimalValue = +p.substring(1);
    -          if (decimalValue && decimalValue <= groupIndex) {
    -            capturedGroups[decimalValue] = -1;
    -          }
    -        }
    -      }
    -
    -      // Renumber groups and reduce capturing groups to non-capturing groups
    -      // where possible.
    -      for (var i = 1; i < capturedGroups.length; ++i) {
    -        if (-1 === capturedGroups[i]) {
    -          capturedGroups[i] = ++capturedGroupIndex;
    -        }
    -      }
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        var p = parts[i];
    -        if (p === '(') {
    -          ++groupIndex;
    -          if (capturedGroups[groupIndex] === undefined) {
    -            parts[i] = '(?:';
    -          }
    -        } else if ('\\' === p.charAt(0)) {
    -          var decimalValue = +p.substring(1);
    -          if (decimalValue && decimalValue <= groupIndex) {
    -            parts[i] = '\\' + capturedGroups[groupIndex];
    -          }
    -        }
    -      }
    -
    -      // Remove any prefix anchors so that the output will match anywhere.
    -      // ^^ really does mean an anchored match though.
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    -      }
    -
    -      // Expand letters to groupts to handle mixing of case-sensitive and
    -      // case-insensitive patterns if necessary.
    -      if (regex.ignoreCase && needToFoldCase) {
    -        for (var i = 0; i < n; ++i) {
    -          var p = parts[i];
    -          var ch0 = p.charAt(0);
    -          if (p.length >= 2 && ch0 === '[') {
    -            parts[i] = caseFoldCharset(p);
    -          } else if (ch0 !== '\\') {
    -            // TODO: handle letters in numeric escapes.
    -            parts[i] = p.replace(
    -                /[a-zA-Z]/g,
    -                function (ch) {
    -                  var cc = ch.charCodeAt(0);
    -                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    -                });
    -          }
    -        }
    -      }
    -
    -      return parts.join('');
    -    }
    -
    -    var rewritten = [];
    -    for (var i = 0, n = regexs.length; i < n; ++i) {
    -      var regex = regexs[i];
    -      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    -      rewritten.push(
    -          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    -    }
    -
    -    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    -  }
    -
    -  var PR_innerHtmlWorks = null;
    -  function getInnerHtml(node) {
    -    // inner html is hopelessly broken in Safari 2.0.4 when the content is
    -    // an html description of well formed XML and the containing tag is a PRE
    -    // tag, so we detect that case and emulate innerHTML.
    -    if (null === PR_innerHtmlWorks) {
    -      var testNode = document.createElement('PRE');
    -      testNode.appendChild(
    -          document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
    -      PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
    -    }
    -
    -    if (PR_innerHtmlWorks) {
    -      var content = node.innerHTML;
    -      // XMP tags contain unescaped entities so require special handling.
    -      if (isRawContent(node)) {
    -        content = textToHtml(content);
    -      } else if (!isPreformatted(node, content)) {
    -        content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
    -            .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
    -      }
    -      return content;
    -    }
    -
    -    var out = [];
    -    for (var child = node.firstChild; child; child = child.nextSibling) {
    -      normalizedHtml(child, out);
    -    }
    -    return out.join('');
    -  }
    -
    -  /** returns a function that expand tabs to spaces.  This function can be fed
    -    * successive chunks of text, and will maintain its own internal state to
    -    * keep track of how tabs are expanded.
    -    * @return {function (string) : string} a function that takes
    -    *   plain text and return the text with tabs expanded.
    -    * @private
    -    */
    -  function makeTabExpander(tabWidth) {
    -    var SPACES = '                ';
    -    var charInLine = 0;
    -
    -    return function (plainText) {
    -      // walk over each character looking for tabs and newlines.
    -      // On tabs, expand them.  On newlines, reset charInLine.
    -      // Otherwise increment charInLine
    -      var out = null;
    -      var pos = 0;
    -      for (var i = 0, n = plainText.length; i < n; ++i) {
    -        var ch = plainText.charAt(i);
    -
    -        switch (ch) {
    -          case '\t':
    -            if (!out) { out = []; }
    -            out.push(plainText.substring(pos, i));
    -            // calculate how much space we need in front of this part
    -            // nSpaces is the amount of padding -- the number of spaces needed
    -            // to move us to the next column, where columns occur at factors of
    -            // tabWidth.
    -            var nSpaces = tabWidth - (charInLine % tabWidth);
    -            charInLine += nSpaces;
    -            for (; nSpaces >= 0; nSpaces -= SPACES.length) {
    -              out.push(SPACES.substring(0, nSpaces));
    -            }
    -            pos = i + 1;
    -            break;
    -          case '\n':
    -            charInLine = 0;
    -            break;
    -          default:
    -            ++charInLine;
    -        }
    -      }
    -      if (!out) { return plainText; }
    -      out.push(plainText.substring(pos));
    -      return out.join('');
    -    };
    -  }
    -
    -  var pr_chunkPattern = new RegExp(
    -      '[^<]+'  // A run of characters other than '<'
    -      + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
    -      + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
    -      // a probable tag that should not be highlighted
    -      + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
    -      + '|<',  // A '<' that does not begin a larger chunk
    -      'g');
    -  var pr_commentPrefix = /^<\!--/;
    -  var pr_cdataPrefix = /^<!\[CDATA\[/;
    -  var pr_brPrefix = /^<br\b/i;
    -  var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    -
    -  /** split markup into chunks of html tags (style null) and
    -    * plain text (style {@link #PR_PLAIN}), converting tags which are
    -    * significant for tokenization (<br>) into their textual equivalent.
    -    *
    -    * @param {string} s html where whitespace is considered significant.
    -    * @return {Object} source code and extracted tags.
    -    * @private
    -    */
    -  function extractTags(s) {
    -    // since the pattern has the 'g' modifier and defines no capturing groups,
    -    // this will return a list of all chunks which we then classify and wrap as
    -    // PR_Tokens
    -    var matches = s.match(pr_chunkPattern);
    -    var sourceBuf = [];
    -    var sourceBufLen = 0;
    -    var extractedTags = [];
    -    if (matches) {
    -      for (var i = 0, n = matches.length; i < n; ++i) {
    -        var match = matches[i];
    -        if (match.length > 1 && match.charAt(0) === '<') {
    -          if (pr_commentPrefix.test(match)) { continue; }
    -          if (pr_cdataPrefix.test(match)) {
    -            // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
    -            sourceBuf.push(match.substring(9, match.length - 3));
    -            sourceBufLen += match.length - 12;
    -          } else if (pr_brPrefix.test(match)) {
    -            // <br> tags are lexically significant so convert them to text.
    -            // This is undone later.
    -            sourceBuf.push('\n');
    -            ++sourceBufLen;
    -          } else {
    -            if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
    -              // A <span class="nocode"> will start a section that should be
    -              // ignored.  Continue walking the list until we see a matching end
    -              // tag.
    -              var name = match.match(pr_tagNameRe)[2];
    -              var depth = 1;
    -              var j;
    -              end_tag_loop:
    -              for (j = i + 1; j < n; ++j) {
    -                var name2 = matches[j].match(pr_tagNameRe);
    -                if (name2 && name2[2] === name) {
    -                  if (name2[1] === '/') {
    -                    if (--depth === 0) { break end_tag_loop; }
    -                  } else {
    -                    ++depth;
    -                  }
    -                }
    -              }
    -              if (j < n) {
    -                extractedTags.push(
    -                    sourceBufLen, matches.slice(i, j + 1).join(''));
    -                i = j;
    -              } else {  // Ignore unclosed sections.
    -                extractedTags.push(sourceBufLen, match);
    -              }
    -            } else {
    -              extractedTags.push(sourceBufLen, match);
    -            }
    -          }
    -        } else {
    -          var literalText = htmlToText(match);
    -          sourceBuf.push(literalText);
    -          sourceBufLen += literalText.length;
    -        }
    -      }
    -    }
    -    return { source: sourceBuf.join(''), tags: extractedTags };
    -  }
    -
    -  /** True if the given tag contains a class attribute with the nocode class. */
    -  function isNoCodeTag(tag) {
    -    return !!tag
    -        // First canonicalize the representation of attributes
    -        .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
    -                 ' $1="$2$3$4"')
    -        // Then look for the attribute we want.
    -        .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
    -  }
    -
    -  /**
    -   * Apply the given language handler to sourceCode and add the resulting
    -   * decorations to out.
    -   * @param {number} basePos the index of sourceCode within the chunk of source
    -   *    whose decorations are already present on out.
    -   */
    -  function appendDecorations(basePos, sourceCode, langHandler, out) {
    -    if (!sourceCode) { return; }
    -    var job = {
    -      source: sourceCode,
    -      basePos: basePos
    -    };
    -    langHandler(job);
    -    out.push.apply(out, job.decorations);
    -  }
    -
    -  /** Given triples of [style, pattern, context] returns a lexing function,
    -    * The lexing function interprets the patterns to find token boundaries and
    -    * returns a decoration list of the form
    -    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    -    * where index_n is an index into the sourceCode, and style_n is a style
    -    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    -    * all characters in sourceCode[index_n-1:index_n].
    -    *
    -    * The stylePatterns is a list whose elements have the form
    -    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    -    *
    -    * Style is a style constant like PR_PLAIN, or can be a string of the
    -    * form 'lang-FOO', where FOO is a language extension describing the
    -    * language of the portion of the token in $1 after pattern executes.
    -    * E.g., if style is 'lang-lisp', and group 1 contains the text
    -    * '(hello (world))', then that portion of the token will be passed to the
    -    * registered lisp handler for formatting.
    -    * The text before and after group 1 will be restyled using this decorator
    -    * so decorators should take care that this doesn't result in infinite
    -    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    -    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    -    * '<script>foo()<\/script>', which would cause the current decorator to
    -    * be called with '<script>' which would not match the same rule since
    -    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    -    * the generic tag rule.  The handler registered for the 'js' extension would
    -    * then be called with 'foo()', and finally, the current decorator would
    -    * be called with '<\/script>' which would not match the original rule and
    -    * so the generic tag rule would identify it as a tag.
    -    *
    -    * Pattern must only match prefixes, and if it matches a prefix, then that
    -    * match is considered a token with the same style.
    -    *
    -    * Context is applied to the last non-whitespace, non-comment token
    -    * recognized.
    -    *
    -    * Shortcut is an optional string of characters, any of which, if the first
    -    * character, gurantee that this pattern and only this pattern matches.
    -    *
    -    * @param {Array} shortcutStylePatterns patterns that always start with
    -    *   a known character.  Must have a shortcut string.
    -    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    -    *   order if the shortcut ones fail.  May have shortcuts.
    -    *
    -    * @return {function (Object)} a
    -    *   function that takes source code and returns a list of decorations.
    -    */
    -  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    -    var shortcuts = {};
    -    var tokenizer;
    -    (function () {
    -      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    -      var allRegexs = [];
    -      var regexKeys = {};
    -      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    -        var patternParts = allPatterns[i];
    -        var shortcutChars = patternParts[3];
    -        if (shortcutChars) {
    -          for (var c = shortcutChars.length; --c >= 0;) {
    -            shortcuts[shortcutChars.charAt(c)] = patternParts;
    -          }
    -        }
    -        var regex = patternParts[1];
    -        var k = '' + regex;
    -        if (!regexKeys.hasOwnProperty(k)) {
    -          allRegexs.push(regex);
    -          regexKeys[k] = null;
    -        }
    -      }
    -      allRegexs.push(/[\0-\uffff]/);
    -      tokenizer = combinePrefixPatterns(allRegexs);
    -    })();
    -
    -    var nPatterns = fallthroughStylePatterns.length;
    -    var notWs = /\S/;
    -
    -    /**
    -     * Lexes job.source and produces an output array job.decorations of style
    -     * classes preceded by the position at which they start in job.source in
    -     * order.
    -     *
    -     * @param {Object} job an object like {@code
    -     *    source: {string} sourceText plain text,
    -     *    basePos: {int} position of job.source in the larger chunk of
    -     *        sourceCode.
    -     * }
    -     */
    -    var decorate = function (job) {
    -      var sourceCode = job.source, basePos = job.basePos;
    -      /** Even entries are positions in source in ascending order.  Odd enties
    -        * are style markers (e.g., PR_COMMENT) that run from that position until
    -        * the end.
    -        * @type {Array.<number|string>}
    -        */
    -      var decorations = [basePos, PR_PLAIN];
    -      var pos = 0;  // index into sourceCode
    -      var tokens = sourceCode.match(tokenizer) || [];
    -      var styleCache = {};
    -
    -      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    -        var token = tokens[ti];
    -        var style = styleCache[token];
    -        var match = void 0;
    -
    -        var isEmbedded;
    -        if (typeof style === 'string') {
    -          isEmbedded = false;
    -        } else {
    -          var patternParts = shortcuts[token.charAt(0)];
    -          if (patternParts) {
    -            match = token.match(patternParts[1]);
    -            style = patternParts[0];
    -          } else {
    -            for (var i = 0; i < nPatterns; ++i) {
    -              patternParts = fallthroughStylePatterns[i];
    -              match = token.match(patternParts[1]);
    -              if (match) {
    -                style = patternParts[0];
    -                break;
    -              }
    -            }
    -
    -            if (!match) {  // make sure that we make progress
    -              style = PR_PLAIN;
    -            }
    -          }
    -
    -          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    -          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    -            isEmbedded = false;
    -            style = PR_SOURCE;
    -          }
    -
    -          if (!isEmbedded) { styleCache[token] = style; }
    -        }
    -
    -        var tokenStart = pos;
    -        pos += token.length;
    -
    -        if (!isEmbedded) {
    -          decorations.push(basePos + tokenStart, style);
    -        } else {  // Treat group 1 as an embedded block of source code.
    -          var embeddedSource = match[1];
    -          var embeddedSourceStart = token.indexOf(embeddedSource);
    -          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    -          if (match[2]) {
    -            // If embeddedSource can be blank, then it would match at the
    -            // beginning which would cause us to infinitely recurse on the
    -            // entire token, so we catch the right context in match[2].
    -            embeddedSourceEnd = token.length - match[2].length;
    -            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    -          }
    -          var lang = style.substring(5);
    -          // Decorate the left of the embedded source
    -          appendDecorations(
    -              basePos + tokenStart,
    -              token.substring(0, embeddedSourceStart),
    -              decorate, decorations);
    -          // Decorate the embedded source
    -          appendDecorations(
    -              basePos + tokenStart + embeddedSourceStart,
    -              embeddedSource,
    -              langHandlerForExtension(lang, embeddedSource),
    -              decorations);
    -          // Decorate the right of the embedded section
    -          appendDecorations(
    -              basePos + tokenStart + embeddedSourceEnd,
    -              token.substring(embeddedSourceEnd),
    -              decorate, decorations);
    -        }
    -      }
    -      job.decorations = decorations;
    -    };
    -    return decorate;
    -  }
    -
    -  /** returns a function that produces a list of decorations from source text.
    -    *
    -    * This code treats ", ', and ` as string delimiters, and \ as a string
    -    * escape.  It does not recognize perl's qq() style strings.
    -    * It has no special handling for double delimiter escapes as in basic, or
    -    * the tripled delimiters used in python, but should work on those regardless
    -    * although in those cases a single string literal may be broken up into
    -    * multiple adjacent string literals.
    -    *
    -    * It recognizes C, C++, and shell style comments.
    -    *
    -    * @param {Object} options a set of optional parameters.
    -    * @return {function (Object)} a function that examines the source code
    -    *     in the input job and builds the decoration list.
    -    */
    -  function sourceDecorator(options) {
    -    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    -    if (options['tripleQuotedStrings']) {
    -      // '''multi-line-string''', 'single-line-string', and double-quoted
    -      shortcutStylePatterns.push(
    -          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    -           null, '\'"']);
    -    } else if (options['multiLineStrings']) {
    -      // 'multi-line-string', "multi-line-string"
    -      shortcutStylePatterns.push(
    -          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    -           null, '\'"`']);
    -    } else {
    -      // 'single-line-string', "single-line-string"
    -      shortcutStylePatterns.push(
    -          [PR_STRING,
    -           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    -           null, '"\'']);
    -    }
    -    if (options['verbatimStrings']) {
    -      // verbatim-string-literal production from the C# grammar.  See issue 93.
    -      fallthroughStylePatterns.push(
    -          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    -    }
    -    if (options['hashComments']) {
    -      if (options['cStyleComments']) {
    -        // Stop C preprocessor declarations at an unclosed open comment
    -        shortcutStylePatterns.push(
    -            [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
    -             null, '#']);
    -        fallthroughStylePatterns.push(
    -            [PR_STRING,
    -             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
    -             null]);
    -      } else {
    -        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    -      }
    -    }
    -    if (options['cStyleComments']) {
    -      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    -      fallthroughStylePatterns.push(
    -          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    -    }
    -    if (options['regexLiterals']) {
    -      var REGEX_LITERAL = (
    -          // A regular expression literal starts with a slash that is
    -          // not followed by * or / so that it is not confused with
    -          // comments.
    -          '/(?=[^/*])'
    -          // and then contains any number of raw characters,
    -          + '(?:[^/\\x5B\\x5C]'
    -          // escape sequences (\x5C),
    -          +    '|\\x5C[\\s\\S]'
    -          // or non-nesting character sets (\x5B\x5D);
    -          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
    -          // finally closed by a /.
    -          + '/');
    -      fallthroughStylePatterns.push(
    -          ['lang-regex',
    -           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    -           ]);
    -    }
    -
    -    var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
    -    if (keywords.length) {
    -      fallthroughStylePatterns.push(
    -          [PR_KEYWORD,
    -           new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
    -    }
    -
    -    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    -    fallthroughStylePatterns.push(
    -        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    -        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    -        [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
    -        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    -        [PR_LITERAL,
    -         new RegExp(
    -             '^(?:'
    -             // A hex number
    -             + '0x[a-f0-9]+'
    -             // or an octal or decimal number,
    -             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    -             // possibly in scientific notation
    -             + '(?:e[+\\-]?\\d+)?'
    -             + ')'
    -             // with an optional modifier like UL for unsigned long
    -             + '[a-z]*', 'i'),
    -         null, '0123456789'],
    -        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    -
    -    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    -  }
    -
    -  var decorateSource = sourceDecorator({
    -        'keywords': ALL_KEYWORDS,
    -        'hashComments': true,
    -        'cStyleComments': true,
    -        'multiLineStrings': true,
    -        'regexLiterals': true
    -      });
    -
    -  /** Breaks {@code job.source} around style boundaries in
    -    * {@code job.decorations} while re-interleaving {@code job.extractedTags},
    -    * and leaves the result in {@code job.prettyPrintedHtml}.
    -    * @param {Object} job like {
    -    *    source: {string} source as plain text,
    -    *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
    -    *                   html preceded by their position in {@code job.source}
    -    *                   in order
    -    *    decorations: {Array.<number|string} an array of style classes preceded
    -    *                 by the position at which they start in job.source in order
    -    * }
    -    * @private
    -    */
    -  function recombineTagsAndDecorations(job) {
    -    var sourceText = job.source;
    -    var extractedTags = job.extractedTags;
    -    var decorations = job.decorations;
    -
    -    var html = [];
    -    // index past the last char in sourceText written to html
    -    var outputIdx = 0;
    -
    -    var openDecoration = null;
    -    var currentDecoration = null;
    -    var tagPos = 0;  // index into extractedTags
    -    var decPos = 0;  // index into decorations
    -    var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    -
    -    var adjacentSpaceRe = /([\r\n ]) /g;
    -    var startOrSpaceRe = /(^| ) /gm;
    -    var newlineRe = /\r\n?|\n/g;
    -    var trailingSpaceRe = /[ \r\n]$/;
    -    var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    -
    -    // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
    -    var isIE678 = window['_pr_isIE6']();
    -    var lineBreakHtml = (
    -        isIE678
    -        ? (job.sourceNode.tagName === 'PRE'
    -           // Use line feeds instead of <br>s so that copying and pasting works
    -           // on IE.
    -           // Doing this on other browsers breaks lots of stuff since \r\n is
    -           // treated as two newlines on Firefox.
    -           ? (isIE678 === 6 ? '&#160;\r\n' :
    -              isIE678 === 7 ? '&#160;<br>\r' : '&#160;\r')
    -           // IE collapses multiple adjacent <br>s into 1 line break.
    -           // Prefix every newline with '&#160;' to prevent such behavior.
    -           // &nbsp; is the same as &#160; but works in XML as well as HTML.
    -           : '&#160;<br />')
    -        : '<br />');
    -
    -    // Look for a class like linenums or linenums:<n> where <n> is the 1-indexed
    -    // number of the first line.
    -    var numberLines = job.sourceNode.className.match(/\blinenums\b(?::(\d+))?/);
    -    var lineBreaker;
    -    if (numberLines) {
    -      var lineBreaks = [];
    -      for (var i = 0; i < 10; ++i) {
    -        lineBreaks[i] = lineBreakHtml + '</li><li class="L' + i + '">';
    -      }
    -      var lineNum = numberLines[1] && numberLines[1].length
    -          ? numberLines[1] - 1 : 0;  // Lines are 1-indexed
    -      html.push('<ol class="linenums"><li class="L', (lineNum) % 10, '"');
    -      if (lineNum) {
    -        html.push(' value="', lineNum + 1, '"');
    -      }
    -      html.push('>');
    -      lineBreaker = function () {
    -        var lb = lineBreaks[++lineNum % 10];
    -        // If a decoration is open, we need to close it before closing a list-item
    -        // and reopen it on the other side of the list item.
    -        return openDecoration
    -            ? ('</span>' + lb + '<span class="' + openDecoration + '">') : lb;
    -      };
    -    } else {
    -      lineBreaker = lineBreakHtml;
    -    }
    -
    -    // A helper function that is responsible for opening sections of decoration
    -    // and outputing properly escaped chunks of source
    -    function emitTextUpTo(sourceIdx) {
    -      if (sourceIdx > outputIdx) {
    -        if (openDecoration && openDecoration !== currentDecoration) {
    -          // Close the current decoration
    -          html.push('</span>');
    -          openDecoration = null;
    -        }
    -        if (!openDecoration && currentDecoration) {
    -          openDecoration = currentDecoration;
    -          html.push('<span class="', openDecoration, '">');
    -        }
    -        // This interacts badly with some wikis which introduces paragraph tags
    -        // into pre blocks for some strange reason.
    -        // It's necessary for IE though which seems to lose the preformattedness
    -        // of <pre> tags when their innerHTML is assigned.
    -        // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
    -        // and it serves to undo the conversion of <br>s to newlines done in
    -        // chunkify.
    -        var htmlChunk = textToHtml(
    -            tabExpander(sourceText.substring(outputIdx, sourceIdx)))
    -            .replace(lastWasSpace
    -                     ? startOrSpaceRe
    -                     : adjacentSpaceRe, '$1&#160;');
    -        // Keep track of whether we need to escape space at the beginning of the
    -        // next chunk.
    -        lastWasSpace = trailingSpaceRe.test(htmlChunk);
    -        html.push(htmlChunk.replace(newlineRe, lineBreaker));
    -        outputIdx = sourceIdx;
    -      }
    -    }
    -
    -    while (true) {
    -      // Determine if we're going to consume a tag this time around.  Otherwise
    -      // we consume a decoration or exit.
    -      var outputTag;
    -      if (tagPos < extractedTags.length) {
    -        if (decPos < decorations.length) {
    -          // Pick one giving preference to extractedTags since we shouldn't open
    -          // a new style that we're going to have to immediately close in order
    -          // to output a tag.
    -          outputTag = extractedTags[tagPos] <= decorations[decPos];
    -        } else {
    -          outputTag = true;
    -        }
    -      } else {
    -        outputTag = false;
    -      }
    -      // Consume either a decoration or a tag or exit.
    -      if (outputTag) {
    -        emitTextUpTo(extractedTags[tagPos]);
    -        if (openDecoration) {
    -          // Close the current decoration
    -          html.push('</span>');
    -          openDecoration = null;
    -        }
    -        html.push(extractedTags[tagPos + 1]);
    -        tagPos += 2;
    -      } else if (decPos < decorations.length) {
    -        emitTextUpTo(decorations[decPos]);
    -        currentDecoration = decorations[decPos + 1];
    -        decPos += 2;
    -      } else {
    -        break;
    -      }
    -    }
    -    emitTextUpTo(sourceText.length);
    -    if (openDecoration) {
    -      html.push('</span>');
    -    }
    -    if (numberLines) { html.push('</li></ol>'); }
    -    job.prettyPrintedHtml = html.join('');
    -  }
    -
    -  /** Maps language-specific file extensions to handlers. */
    -  var langHandlerRegistry = {};
    -  /** Register a language handler for the given file extensions.
    -    * @param {function (Object)} handler a function from source code to a list
    -    *      of decorations.  Takes a single argument job which describes the
    -    *      state of the computation.   The single parameter has the form
    -    *      {@code {
    -    *        source: {string} as plain text.
    -    *        decorations: {Array.<number|string>} an array of style classes
    -    *                     preceded by the position at which they start in
    -    *                     job.source in order.
    -    *                     The language handler should assigned this field.
    -    *        basePos: {int} the position of source in the larger source chunk.
    -    *                 All positions in the output decorations array are relative
    -    *                 to the larger source chunk.
    -    *      } }
    -    * @param {Array.<string>} fileExtensions
    -    */
    -  function registerLangHandler(handler, fileExtensions) {
    -    for (var i = fileExtensions.length; --i >= 0;) {
    -      var ext = fileExtensions[i];
    -      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    -        langHandlerRegistry[ext] = handler;
    -      } else if ('console' in window) {
    -        console['warn']('cannot override language handler %s', ext);
    -      }
    -    }
    -  }
    -  function langHandlerForExtension(extension, source) {
    -    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    -      // Treat it as markup if the first non whitespace character is a < and
    -      // the last non-whitespace character is a >.
    -      extension = /^\s*</.test(source)
    -          ? 'default-markup'
    -          : 'default-code';
    -    }
    -    return langHandlerRegistry[extension];
    -  }
    -  registerLangHandler(decorateSource, ['default-code']);
    -  registerLangHandler(
    -      createSimpleLexer(
    -          [],
    -          [
    -           [PR_PLAIN,       /^[^<?]+/],
    -           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    -           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    -           // Unescaped content in an unknown language
    -           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    -           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    -           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    -           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    -           // Unescaped content in javascript.  (Or possibly vbscript).
    -           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    -           // Contains unescaped stylesheet content
    -           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    -           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    -          ]),
    -      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    -  registerLangHandler(
    -      createSimpleLexer(
    -          [
    -           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    -           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    -           ],
    -          [
    -           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    -           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    -           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    -           [PR_PUNCTUATION,  /^[=<>\/]+/],
    -           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    -           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    -           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    -           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    -           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    -           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    -           ]),
    -      ['in.tag']);
    -  registerLangHandler(
    -      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': CPP_KEYWORDS,
    -          'hashComments': true,
    -          'cStyleComments': true
    -        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': 'null true false'
    -        }), ['json']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': CSHARP_KEYWORDS,
    -          'hashComments': true,
    -          'cStyleComments': true,
    -          'verbatimStrings': true
    -        }), ['cs']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': JAVA_KEYWORDS,
    -          'cStyleComments': true
    -        }), ['java']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': SH_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true
    -        }), ['bsh', 'csh', 'sh']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': PYTHON_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'tripleQuotedStrings': true
    -        }), ['cv', 'py']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': PERL_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'regexLiterals': true
    -        }), ['perl', 'pl', 'pm']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': RUBY_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'regexLiterals': true
    -        }), ['rb']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': JSCRIPT_KEYWORDS,
    -          'cStyleComments': true,
    -          'regexLiterals': true
    -        }), ['js']);
    -  registerLangHandler(
    -      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    -
    -  function applyDecorator(job) {
    -    var sourceCodeHtml = job.sourceCodeHtml;
    -    var opt_langExtension = job.langExtension;
    -
    -    // Prepopulate output in case processing fails with an exception.
    -    job.prettyPrintedHtml = sourceCodeHtml;
    -
    -    try {
    -      // Extract tags, and convert the source code to plain text.
    -      var sourceAndExtractedTags = extractTags(sourceCodeHtml);
    -      /** Plain text. @type {string} */
    -      var source = sourceAndExtractedTags.source;
    -      job.source = source;
    -      job.basePos = 0;
    -
    -      /** Even entries are positions in source in ascending order.  Odd entries
    -        * are tags that were extracted at that position.
    -        * @type {Array.<number|string>}
    -        */
    -      job.extractedTags = sourceAndExtractedTags.tags;
    -
    -      // Apply the appropriate language handler
    -      langHandlerForExtension(opt_langExtension, source)(job);
    -      // Integrate the decorations and tags back into the source code to produce
    -      // a decorated html string which is left in job.prettyPrintedHtml.
    -      recombineTagsAndDecorations(job);
    -    } catch (e) {
    -      if ('console' in window) {
    -        console['log'](e && e['stack'] ? e['stack'] : e);
    -      }
    -    }
    -  }
    -
    -  function prettyPrintOne(sourceCodeHtml, opt_langExtension) {
    -    var job = {
    -      sourceCodeHtml: sourceCodeHtml,
    -      langExtension: opt_langExtension
    -    };
    -    applyDecorator(job);
    -    return job.prettyPrintedHtml;
    -  }
    -
    -  function prettyPrint(opt_whenDone) {
    -    function byTagName(tn) { return document.getElementsByTagName(tn); }
    -    // fetch a list of nodes to rewrite
    -    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    -    var elements = [];
    -    for (var i = 0; i < codeSegments.length; ++i) {
    -      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    -        elements.push(codeSegments[i][j]);
    -      }
    -    }
    -    codeSegments = null;
    -
    -    var clock = Date;
    -    if (!clock['now']) {
    -      clock = { 'now': function () { return (new Date).getTime(); } };
    -    }
    -
    -    // The loop is broken into a series of continuations to make sure that we
    -    // don't make the browser unresponsive when rewriting a large page.
    -    var k = 0;
    -    var prettyPrintingJob;
    -
    -    function doWork() {
    -      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
    -                     clock.now() + 250 /* ms */ :
    -                     Infinity);
    -      for (; k < elements.length && clock.now() < endTime; k++) {
    -        var cs = elements[k];
    -        // [JACOCO] 'prettyprint' -> 'source'
    -        if (cs.className && cs.className.indexOf('source') >= 0) {
    -          // If the classes includes a language extensions, use it.
    -          // Language extensions can be specified like
    -          //     <pre class="prettyprint lang-cpp">
    -          // the language extension "cpp" is used to find a language handler as
    -          // passed to PR_registerLangHandler.
    -          var langExtension = cs.className.match(/\blang-(\w+)\b/);
    -          if (langExtension) { langExtension = langExtension[1]; }
    -
    -          // make sure this is not nested in an already prettified element
    -          var nested = false;
    -          for (var p = cs.parentNode; p; p = p.parentNode) {
    -            if ((p.tagName === 'pre' || p.tagName === 'code' ||
    -                 p.tagName === 'xmp') &&
    -                // [JACOCO] 'prettyprint' -> 'source'
    -                p.className && p.className.indexOf('source') >= 0) {
    -              nested = true;
    -              break;
    -            }
    -          }
    -          if (!nested) {
    -            // fetch the content as a snippet of properly escaped HTML.
    -            // Firefox adds newlines at the end.
    -            var content = getInnerHtml(cs);
    -            content = content.replace(/(?:\r\n?|\n)$/, '');
    -
    -            // do the pretty printing
    -            prettyPrintingJob = {
    -              sourceCodeHtml: content,
    -              langExtension: langExtension,
    -              sourceNode: cs
    -            };
    -            applyDecorator(prettyPrintingJob);
    -            replaceWithPrettyPrintedHtml();
    -          }
    -        }
    -      }
    -      if (k < elements.length) {
    -        // finish up in a continuation
    -        setTimeout(doWork, 250);
    -      } else if (opt_whenDone) {
    -        opt_whenDone();
    -      }
    -    }
    -
    -    function replaceWithPrettyPrintedHtml() {
    -      var newContent = prettyPrintingJob.prettyPrintedHtml;
    -      if (!newContent) { return; }
    -      var cs = prettyPrintingJob.sourceNode;
    -
    -      // push the prettified html back into the tag.
    -      if (!isRawContent(cs)) {
    -        // just replace the old html with the new
    -        cs.innerHTML = newContent;
    -      } else {
    -        // we need to change the tag to a <pre> since <xmp>s do not allow
    -        // embedded tags such as the span tags used to attach styles to
    -        // sections of source code.
    -        var pre = document.createElement('PRE');
    -        for (var i = 0; i < cs.attributes.length; ++i) {
    -          var a = cs.attributes[i];
    -          if (a.specified) {
    -            var aname = a.name.toLowerCase();
    -            if (aname === 'class') {
    -              pre.className = a.value;  // For IE 6
    -            } else {
    -              pre.setAttribute(a.name, a.value);
    -            }
    -          }
    -        }
    -        pre.innerHTML = newContent;
    -
    -        // remove the old
    -        cs.parentNode.replaceChild(pre, cs);
    -        cs = pre;
    -      }
    -    }
    -
    -    doWork();
    -  }
    -
    -  window['PR_normalizedHtml'] = normalizedHtml;
    -  window['prettyPrintOne'] = prettyPrintOne;
    -  window['prettyPrint'] = prettyPrint;
    -  window['PR'] = {
    -        'combinePrefixPatterns': combinePrefixPatterns,
    -        'createSimpleLexer': createSimpleLexer,
    -        'registerLangHandler': registerLangHandler,
    -        'sourceDecorator': sourceDecorator,
    -        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    -        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    -        'PR_COMMENT': PR_COMMENT,
    -        'PR_DECLARATION': PR_DECLARATION,
    -        'PR_KEYWORD': PR_KEYWORD,
    -        'PR_LITERAL': PR_LITERAL,
    -        'PR_NOCODE': PR_NOCODE,
    -        'PR_PLAIN': PR_PLAIN,
    -        'PR_PUNCTUATION': PR_PUNCTUATION,
    -        'PR_SOURCE': PR_SOURCE,
    -        'PR_STRING': PR_STRING,
    -        'PR_TAG': PR_TAG,
    -        'PR_TYPE': PR_TYPE
    -      };
    -})();
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/redbar.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/redbar.gif
    deleted file mode 100644
    index c2f71469..00000000
    Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/redbar.gif and /dev/null differ
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/report.css b/sentrius-llm-core/target/site/jacoco/jacoco-resources/report.css
    deleted file mode 100644
    index dd936bca..00000000
    --- a/sentrius-llm-core/target/site/jacoco/jacoco-resources/report.css
    +++ /dev/null
    @@ -1,243 +0,0 @@
    -body, td {
    -  font-family:sans-serif;
    -  font-size:10pt;
    -}
    -
    -h1 {
    -  font-weight:bold;
    -  font-size:18pt;
    -}
    -
    -.breadcrumb {
    -  border:#d6d3ce 1px solid;
    -  padding:2px 4px 2px 4px;
    -}
    -
    -.breadcrumb .info {
    -  float:right;
    -}
    -
    -.breadcrumb .info a {
    -  margin-left:8px;
    -}
    -
    -.el_report {
    -  padding-left:18px;
    -  background-image:url(report.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_group {
    -  padding-left:18px;
    -  background-image:url(group.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_bundle {
    -  padding-left:18px;
    -  background-image:url(bundle.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_package {
    -  padding-left:18px;
    -  background-image:url(package.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_class {
    -  padding-left:18px;
    -  background-image:url(class.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_source {
    -  padding-left:18px;
    -  background-image:url(source.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_method {
    -  padding-left:18px;
    -  background-image:url(method.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_session {
    -  padding-left:18px;
    -  background-image:url(session.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -pre.source {
    -  border:#d6d3ce 1px solid;
    -  font-family:monospace;
    -}
    -
    -pre.source ol {
    -  margin-bottom: 0px;
    -  margin-top: 0px;
    -}
    -
    -pre.source li {
    -  border-left: 1px solid #D6D3CE;
    -  color: #A0A0A0;
    -  padding-left: 0px;
    -}
    -
    -pre.source span.fc {
    -  background-color:#ccffcc;
    -}
    -
    -pre.source span.nc {
    -  background-color:#ffaaaa;
    -}
    -
    -pre.source span.pc {
    -  background-color:#ffffcc;
    -}
    -
    -pre.source span.bfc {
    -  background-image: url(branchfc.gif);
    -  background-repeat: no-repeat;
    -  background-position: 2px center;
    -}
    -
    -pre.source span.bfc:hover {
    -  background-color:#80ff80;
    -}
    -
    -pre.source span.bnc {
    -  background-image: url(branchnc.gif);
    -  background-repeat: no-repeat;
    -  background-position: 2px center;
    -}
    -
    -pre.source span.bnc:hover {
    -  background-color:#ff8080;
    -}
    -
    -pre.source span.bpc {
    -  background-image: url(branchpc.gif);
    -  background-repeat: no-repeat;
    -  background-position: 2px center;
    -}
    -
    -pre.source span.bpc:hover {
    -  background-color:#ffff80;
    -}
    -
    -table.coverage {
    -  empty-cells:show;
    -  border-collapse:collapse;
    -}
    -
    -table.coverage thead {
    -  background-color:#e0e0e0;
    -}
    -
    -table.coverage thead td {
    -  white-space:nowrap;
    -  padding:2px 14px 0px 6px;
    -  border-bottom:#b0b0b0 1px solid;
    -}
    -
    -table.coverage thead td.bar {
    -  border-left:#cccccc 1px solid;
    -}
    -
    -table.coverage thead td.ctr1 {
    -  text-align:right;
    -  border-left:#cccccc 1px solid;
    -}
    -
    -table.coverage thead td.ctr2 {
    -  text-align:right;
    -  padding-left:2px;
    -}
    -
    -table.coverage thead td.sortable {
    -  cursor:pointer;
    -  background-image:url(sort.gif);
    -  background-position:right center;
    -  background-repeat:no-repeat;
    -}
    -
    -table.coverage thead td.up {
    -  background-image:url(up.gif);
    -}
    -
    -table.coverage thead td.down {
    -  background-image:url(down.gif);
    -}
    -
    -table.coverage tbody td {
    -  white-space:nowrap;
    -  padding:2px 6px 2px 6px;
    -  border-bottom:#d6d3ce 1px solid;
    -}
    -
    -table.coverage tbody tr:hover {
    -  background: #f0f0d0 !important;
    -}
    -
    -table.coverage tbody td.bar {
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tbody td.ctr1 {
    -  text-align:right;
    -  padding-right:14px;
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tbody td.ctr2 {
    -  text-align:right;
    -  padding-right:14px;
    -  padding-left:2px;
    -}
    -
    -table.coverage tfoot td {
    -  white-space:nowrap;
    -  padding:2px 6px 2px 6px;
    -}
    -
    -table.coverage tfoot td.bar {
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tfoot td.ctr1 {
    -  text-align:right;
    -  padding-right:14px;
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tfoot td.ctr2 {
    -  text-align:right;
    -  padding-right:14px;
    -  padding-left:2px;
    -}
    -
    -.footer {
    -  margin-top:20px;
    -  border-top:#d6d3ce 1px solid;
    -  padding-top:2px;
    -  font-size:8pt;
    -  color:#a0a0a0;
    -}
    -
    -.footer a {
    -  color:#a0a0a0;
    -}
    -
    -.right {
    -  float:right;
    -}
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/report.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/report.gif
    deleted file mode 100644
    index 8547be50..00000000
    Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/report.gif and /dev/null differ
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/session.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/session.gif
    deleted file mode 100644
    index 0151bad8..00000000
    Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/session.gif and /dev/null differ
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/sort.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/sort.gif
    deleted file mode 100644
    index 6757c2c3..00000000
    Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/sort.gif and /dev/null differ
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/sort.js b/sentrius-llm-core/target/site/jacoco/jacoco-resources/sort.js
    deleted file mode 100644
    index 9dcb0e8b..00000000
    --- a/sentrius-llm-core/target/site/jacoco/jacoco-resources/sort.js
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -/*******************************************************************************
    - * Copyright (c) 2009, 2024 Mountainminds GmbH & Co. KG and Contributors
    - * This program and the accompanying materials are made available under
    - * the terms of the Eclipse Public License 2.0 which is available at
    - * http://www.eclipse.org/legal/epl-2.0
    - *
    - * SPDX-License-Identifier: EPL-2.0
    - *
    - * Contributors:
    - *    Marc R. Hoffmann - initial API and implementation
    - *
    - *******************************************************************************/
    -
    -(function () {
    -
    -  /**
    -   * Sets the initial sorting derived from the hash.
    -   *
    -   * @param linkelementids
    -   *          list of element ids to search for links to add sort inidcator
    -   *          hash links
    -   */
    -  function initialSort(linkelementids) {
    -    window.linkelementids = linkelementids;
    -    var hash = window.location.hash;
    -    if (hash) {
    -      var m = hash.match(/up-./);
    -      if (m) {
    -        var header = window.document.getElementById(m[0].charAt(3));
    -        if (header) {
    -          sortColumn(header, true);
    -        }
    -        return;
    -      }
    -      var m = hash.match(/dn-./);
    -      if (m) {
    -        var header = window.document.getElementById(m[0].charAt(3));
    -        if (header) {
    -          sortColumn(header, false);
    -        }
    -        return
    -      }
    -    }
    -  }
    -
    -  /**
    -   * Sorts the columns with the given header dependening on the current sort state.
    -   */
    -  function toggleSort(header) {
    -    var sortup = header.className.indexOf('down ') == 0;
    -    sortColumn(header, sortup);
    -  }
    -
    -  /**
    -   * Sorts the columns with the given header in the given direction.
    -   */
    -  function sortColumn(header, sortup) {
    -    var table = header.parentNode.parentNode.parentNode;
    -    var body = table.tBodies[0];
    -    var colidx = getNodePosition(header);
    -
    -    resetSortedStyle(table);
    -
    -    var rows = body.rows;
    -    var sortedrows = [];
    -    for (var i = 0; i < rows.length; i++) {
    -      r = rows[i];
    -      sortedrows[parseInt(r.childNodes[colidx].id.slice(1))] = r;
    -    }
    -
    -    var hash;
    -
    -    if (sortup) {
    -      for (var i = sortedrows.length - 1; i >= 0; i--) {
    -        body.appendChild(sortedrows[i]);
    -      }
    -      header.className = 'up ' + header.className;
    -      hash = 'up-' + header.id;
    -    } else {
    -      for (var i = 0; i < sortedrows.length; i++) {
    -        body.appendChild(sortedrows[i]);
    -      }
    -      header.className = 'down ' + header.className;
    -      hash = 'dn-' + header.id;
    -    }
    -
    -    setHash(hash);
    -  }
    -
    -  /**
    -   * Adds the sort indicator as a hash to the document URL and all links.
    -   */
    -  function setHash(hash) {
    -    window.document.location.hash = hash;
    -    ids = window.linkelementids;
    -    for (var i = 0; i < ids.length; i++) {
    -        setHashOnAllLinks(document.getElementById(ids[i]), hash);
    -    }
    -  }
    -
    -  /**
    -   * Extend all links within the given tag with the given hash.
    -   */
    -  function setHashOnAllLinks(tag, hash) {
    -    links = tag.getElementsByTagName("a");
    -    for (var i = 0; i < links.length; i++) {
    -        var a = links[i];
    -        var href = a.href;
    -        var hashpos = href.indexOf("#");
    -        if (hashpos != -1) {
    -            href = href.substring(0, hashpos);
    -        }
    -        a.href = href + "#" + hash;
    -    }
    -  }
    -
    -  /**
    -   * Calculates the position of a element within its parent.
    -   */
    -  function getNodePosition(element) {
    -    var pos = -1;
    -    while (element) {
    -      element = element.previousSibling;
    -      pos++;
    -    }
    -    return pos;
    -  }
    -
    -  /**
    -   * Remove the sorting indicator style from all headers.
    -   */
    -  function resetSortedStyle(table) {
    -    for (var c = table.tHead.firstChild.firstChild; c; c = c.nextSibling) {
    -      if (c.className) {
    -        if (c.className.indexOf('down ') == 0) {
    -          c.className = c.className.slice(5);
    -        }
    -        if (c.className.indexOf('up ') == 0) {
    -          c.className = c.className.slice(3);
    -        }
    -      }
    -    }
    -  }
    -
    -  window['initialSort'] = initialSort;
    -  window['toggleSort'] = toggleSort;
    -
    -})();
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/source.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/source.gif
    deleted file mode 100644
    index b226e41c..00000000
    Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/source.gif and /dev/null differ
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-resources/up.gif b/sentrius-llm-core/target/site/jacoco/jacoco-resources/up.gif
    deleted file mode 100644
    index 58ed2166..00000000
    Binary files a/sentrius-llm-core/target/site/jacoco/jacoco-resources/up.gif and /dev/null differ
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco-sessions.html b/sentrius-llm-core/target/site/jacoco/jacoco-sessions.html
    deleted file mode 100644
    index 6da4b6ca..00000000
    --- a/sentrius-llm-core/target/site/jacoco/jacoco-sessions.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="jacoco-resources/report.gif" type="image/gif"/><title>Sessions</title></head><body><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="jacoco-sessions.html" class="el_session">Sessions</a></span><a href="index.html" class="el_report">sentrius-llm-core</a> &gt; <span class="el_session">Sessions</span></div><h1>Sessions</h1><p>This coverage report is based on execution data from the following sessions:</p><table class="coverage" cellspacing="0"><thead><tr><td>Session</td><td>Start Time</td><td>Dump Time</td></tr></thead><tbody><tr><td><span class="el_session">pop-os-7995988c</span></td><td>May 2, 2025, 1:59:00 PM</td><td>May 2, 2025, 1:59:00 PM</td></tr></tbody></table><p>Execution data for the following classes is considered in this report:</p><table class="coverage" cellspacing="0"><thead><tr><td>Class</td><td>Id</td></tr></thead><tbody><tr><td><span class="el_class">org.apache.maven.plugin.surefire.log.api.NullConsoleLogger</span></td><td><code>50e0945fec76b333</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.BaseProviderFactory</span></td><td><code>da939a0152866a4b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.BiProperty</span></td><td><code>ed0281592f3976b4</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.Command</span></td><td><code>52d7b732759793ff</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.Constants</span></td><td><code>8f58b0da27218c74</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.DumpErrorSingleton</span></td><td><code>ea25742803c9e73f</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.ForkedProcessEventType</span></td><td><code>4f32ae2d4e670365</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.ForkingReporterFactory</span></td><td><code>be06f83accc5a8aa</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.ForkingRunListener</span></td><td><code>c34d0a9f28f66585</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.MasterProcessCommand</span></td><td><code>fc8c116a509256d1</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.Shutdown</span></td><td><code>47a37ed2a684ef1d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.cli.CommandLineOption</span></td><td><code>5825f848ee2abcd7</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.provider.AbstractProvider</span></td><td><code>0fea65ed91d7c12a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ConsoleOutputCapture</span></td><td><code>7ee3451cf95e2f70</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ConsoleOutputCapture.ForwardingPrintStream</span></td><td><code>804935f758ebaea3</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ConsoleOutputCapture.NullOutputStream</span></td><td><code>a81300d2d50decb6</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ReporterConfiguration</span></td><td><code>bf4075c0385296c2</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.RunMode</span></td><td><code>70edc0a9dea60143</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder</span></td><td><code>c6f3b2781f9ac881</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.BufferedStream</span></td><td><code>11f69a75bc1c7211</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.Memento</span></td><td><code>e504a9e8cfc028af</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.Segment</span></td><td><code>773004ac6cd115ef</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.StreamReadStatus</span></td><td><code>8d5ee1d510b5c935</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamEncoder</span></td><td><code>9547668418a858ad</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.SegmentType</span></td><td><code>77b0d78ed3ddd126</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.suite.RunResult</span></td><td><code>0eef4ae883b6fcaa</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.DirectoryScannerParameters</span></td><td><code>529e83b831c47f72</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.IncludedExcludedPatterns</span></td><td><code>e12220ce508068df</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest</span></td><td><code>119a5faa0ae08a91</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest.ClassMatcher</span></td><td><code>cb9dd1b6069a872b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest.MethodMatcher</span></td><td><code>1d5196f3dfcebd52</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest.Type</span></td><td><code>6f46eedd1917ca66</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.RunOrderParameters</span></td><td><code>f74f6b3eb9f1a132</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.TestArtifactInfo</span></td><td><code>6d162cddde2db959</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.TestListResolver</span></td><td><code>0f4645f0d7fd02c8</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.TestRequest</span></td><td><code>1cb2946d8f0dc9e4</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.CloseableIterator</span></td><td><code>01846c357efacb7b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.DefaultRunOrderCalculator</span></td><td><code>21a42ec0f6d63b8e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.DefaultScanResult</span></td><td><code>01695a339c66ab8d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.ReflectionUtils</span></td><td><code>7f9a430ae144c985</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.RunOrder</span></td><td><code>93376844e6d709d3</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.TestsToRun</span></td><td><code>db4e8195893ece6d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.TestsToRun.ClassesIterator</span></td><td><code>543f26bfbdd04ce0</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.AbstractNoninterruptibleReadableChannel</span></td><td><code>6826ce793980b64e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.AbstractNoninterruptibleWritableChannel</span></td><td><code>484afcc5593fbc9a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.Channels</span></td><td><code>eb60281181a1dc33</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.Channels.3</span></td><td><code>605144c3f67338aa</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.Channels.4</span></td><td><code>4834cf9402eabd28</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.DaemonThreadFactory</span></td><td><code>b2161e778265b95d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.DaemonThreadFactory.NamedThreadFactory</span></td><td><code>e3fb668fa8792230</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.DumpFileUtils</span></td><td><code>9cc0f89ffb46ba32</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.AbstractPathConfiguration</span></td><td><code>f8b4034fe9c934d2</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.BooterDeserializer</span></td><td><code>d2b4a565d2c195cc</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ClassLoaderConfiguration</span></td><td><code>c511fbfeb1f35c23</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.Classpath</span></td><td><code>d05af49602124353</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ClasspathConfiguration</span></td><td><code>d14c58928ac6aa7b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.CommandReader</span></td><td><code>8bc1181d0c5af474</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.CommandReader.1</span></td><td><code>72a8e2906ddc1c93</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.CommandReader.CommandRunnable</span></td><td><code>f6a6b02be2fb0964</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter</span></td><td><code>c8ce6ed3be8ec9bc</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.1</span></td><td><code>68f2dae15ae26cc2</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.3</span></td><td><code>fc217f2c1d87c099</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.4</span></td><td><code>2afb302f7c81f991</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.6</span></td><td><code>850ef2748b5ef5e6</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.7</span></td><td><code>9577114e02a5bdef</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.8</span></td><td><code>3c8febd047cd2b0c</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.PingScheduler</span></td><td><code>c83e3af27d5d3c47</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedNodeArg</span></td><td><code>9dbb0ff22dfc1303</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.PpidChecker</span></td><td><code>f83a9169197e13b1</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ProcessCheckerType</span></td><td><code>e554be35191ff5a7</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.PropertiesWrapper</span></td><td><code>1e4e30276db2e62e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ProviderConfiguration</span></td><td><code>ec2cd1e39ec4278e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.StartupConfiguration</span></td><td><code>70176a3dd903d57a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.SystemPropertyManager</span></td><td><code>a843c08e9b5c79ad</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.TypeEncodedValue</span></td><td><code>355d20d53741b604</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.AbstractMasterProcessChannelProcessorFactory</span></td><td><code>67a1c051e3809086</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.AbstractMasterProcessChannelProcessorFactory.1</span></td><td><code>cc936f6c85f9235a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.AbstractMasterProcessChannelProcessorFactory.2</span></td><td><code>a1fa70e4af42c555</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.CommandChannelDecoder</span></td><td><code>6684e6bad0b7c71e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.EventChannelEncoder</span></td><td><code>b69d9287bf010b1a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelProcessorFactory</span></td><td><code>3b29862697f79d34</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.SurefireMasterProcessChannelProcessorFactory</span></td><td><code>8c14c673718fba9e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.stream.CommandDecoder</span></td><td><code>a23a4082e2bbd1ed</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.stream.CommandDecoder.1</span></td><td><code>950700970edca54a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.stream.EventEncoder</span></td><td><code>7c894cb22c8c16ca</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.JUnitPlatformProvider</span></td><td><code>958f7eb4311b3c2f</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.LazyLauncher</span></td><td><code>a3841276826f155c</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.RunListenerAdapter</span></td><td><code>0d7041faa0298e70</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.TestPlanScannerFilter</span></td><td><code>db2b13639af3176e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.report.ClassMethodIndexer</span></td><td><code>0e8f3008aec84fcb</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.JavaVersion</span></td><td><code>a902b52c460c0348</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.StringUtils</span></td><td><code>4628d7808116e372</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.SystemProperties</span></td><td><code>6b2fea785d2a2915</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.SystemUtils</span></td><td><code>2518da556699ab1e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.function.Suppliers</span></td><td><code>6cb739fdbd96d7c1</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.math.NumberUtils</span></td><td><code>99f301ade68669b7</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.utils.StringUtils</span></td><td><code>abd8480c7152bf46</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.utils.cli.ShutdownHookUtils</span></td><td><code>011b23cd829ec86c</code></td></tr><tr><td><span class="el_class">org.apiguardian.api.API.Status</span></td><td><code>95d0ffea805fc01a</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.api.extension.ConditionEvaluationResult</span></td><td><code>35e14124a607c6e0</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.api.extension.ExtensionContext.Namespace</span></td><td><code>f54a3d73ed88c765</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.JupiterTestEngine</span></td><td><code>e2ae6d11698760d5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.CachingJupiterConfiguration</span></td><td><code>7e7fdcd1b43926e2</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.DefaultJupiterConfiguration</span></td><td><code>3264494f5452162d</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.EnumConfigurationParameterConverter</span></td><td><code>bab380425dca8d4f</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter</span></td><td><code>518e1c643c30f164</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.descriptor.AbstractExtensionContext</span></td><td><code>92d1cbb782871d54</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor</span></td><td><code>4b5e361d03d8e2d8</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext</span></td><td><code>95abf612d36312bc</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.AbstractOrderingVisitor</span></td><td><code>2747cc3e148c57d9</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.AbstractOrderingVisitor.DescriptorWrapperOrderer</span></td><td><code>01a66e5fdf0989e5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.ClassOrderingVisitor</span></td><td><code>dbd6c4e35e0c9807</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.ClassSelectorResolver</span></td><td><code>8192a76b48a09183</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.DiscoverySelectorResolver</span></td><td><code>0493a46e2481b698</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.MethodFinder</span></td><td><code>943e016148cf5f16</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.MethodOrderingVisitor</span></td><td><code>1c057f4243f10c0e</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.MethodSelectorResolver</span></td><td><code>340dbe384622c6a6</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsInnerClass</span></td><td><code>373ab803cd4c3f71</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsNestedTestClass</span></td><td><code>5b959cc55c1f4f91</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsPotentialTestContainer</span></td><td><code>4134835721917de5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests</span></td><td><code>cb8d6d2ffc57432f</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestFactoryMethod</span></td><td><code>671448bb3682a8b7</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestMethod</span></td><td><code>53d31c5fa4778cc3</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestTemplateMethod</span></td><td><code>db07bccfb8a7df73</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestableMethod</span></td><td><code>8a0a6571eef022fb</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.DefaultExecutableInvoker</span></td><td><code>8974ffb77e1cf465</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.JupiterEngineExecutionContext</span></td><td><code>50163587b45842fe</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.JupiterEngineExecutionContext.Builder</span></td><td><code>b39a5e63227384a5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.JupiterEngineExecutionContext.State</span></td><td><code>0766343b70481496</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.AutoCloseExtension</span></td><td><code>b0c206c116575b65</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.DisabledCondition</span></td><td><code>ae3c30ff8f7ce050</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.MutableExtensionRegistry</span></td><td><code>2445286ad5728ba3</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.MutableExtensionRegistry.Entry</span></td><td><code>2c27256a5e9eeb22</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.RepeatedTestExtension</span></td><td><code>134b5213d4cb80ac</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TempDirectory</span></td><td><code>797b378613d1c2c3</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TestInfoParameterResolver</span></td><td><code>1977e7bd25ea66b8</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TestReporterParameterResolver</span></td><td><code>24002b8886de1936</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TimeoutExtension</span></td><td><code>62b73ea4d52632c9</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.support.JupiterThrowableCollectorFactory</span></td><td><code>46546a446de4c9c0</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.support.OpenTest4JAndJUnit4AwareThrowableCollector</span></td><td><code>de05466420699f92</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.function.Try</span></td><td><code>d1970dd64ce22fa4</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.function.Try.Failure</span></td><td><code>2135634bf7e7ad88</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.function.Try.Success</span></td><td><code>88f304668c6ff14e</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.logging.LoggerFactory</span></td><td><code>7b57f78fc724ac54</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.logging.LoggerFactory.DelegatingLogger</span></td><td><code>835c9a026ac4df32</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.AnnotationUtils</span></td><td><code>1da637c10cbda39c</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ClassLoaderUtils</span></td><td><code>41a8b61339cf4862</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ClassNamePatternFilterUtils</span></td><td><code>484cfeb1dc3b6e93</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ClasspathScanner</span></td><td><code>23726102aeb1c0ca</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.CollectionUtils</span></td><td><code>6cb29bed5c13bb1d</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.LruCache</span></td><td><code>fd8ff40dff05b112</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.Preconditions</span></td><td><code>99362b29a037afdc</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ReflectionUtils</span></td><td><code>f1c34b50fa11302d</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ReflectionUtils.HierarchyTraversalMode</span></td><td><code>ecf76570811abc50</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.StringUtils</span></td><td><code>372dfca6fa74c1ea</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.UnrecoverableExceptions</span></td><td><code>2ffa834710d16849</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.CompositeFilter</span></td><td><code>cecade1862d00032</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.CompositeFilter.1</span></td><td><code>ed62b01b8b763511</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineDiscoveryListener</span></td><td><code>22e0c8566a0701f5</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineDiscoveryListener.1</span></td><td><code>a4cdbe8dd38d8f57</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineExecutionListener</span></td><td><code>73f93afa543ca74a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineExecutionListener.1</span></td><td><code>999902b68f81dd9a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.ExecutionRequest</span></td><td><code>83d3937d6c2e4880</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.Filter</span></td><td><code>c8d2fba4bb555492</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.FilterResult</span></td><td><code>1b4753bc794e8388</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.SelectorResolutionResult</span></td><td><code>02b8934961bdea6f</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.SelectorResolutionResult.Status</span></td><td><code>22866b13273482bd</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestDescriptor</span></td><td><code>a5f736d88185f693</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestDescriptor.Type</span></td><td><code>8530bdf90ae8fa6b</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestExecutionResult</span></td><td><code>29479a0ae9db2840</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestExecutionResult.Status</span></td><td><code>9e54a6b249ea167a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.UniqueId</span></td><td><code>a5ee26b408b26ea1</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.UniqueId.Segment</span></td><td><code>03b0ccd7b69c9fc2</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.UniqueIdFormat</span></td><td><code>455c5b5eb27d1f81</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.discovery.ClassSelector</span></td><td><code>a6b2f6753eef3ff0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.discovery.DiscoverySelectors</span></td><td><code>8b2cda0d30b056d5</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.descriptor.AbstractTestDescriptor</span></td><td><code>17948dfe4c8d10c0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.descriptor.EngineDescriptor</span></td><td><code>4ba3237c7e6b18d6</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.ClassContainerSelectorResolver</span></td><td><code>fde8e703faa64574</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution</span></td><td><code>4937cdb1a041a120</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.DefaultContext</span></td><td><code>151f6fae99911199</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver</span></td><td><code>0ad8786b2f016b1a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.Builder</span></td><td><code>29666059b7fb2614</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.DefaultInitializationContext</span></td><td><code>1b0484c56b030686</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver</span></td><td><code>458b4a4e46b6b868</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver.Match</span></td><td><code>3c16d4dff276f57a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver.Match.Type</span></td><td><code>bd8402e1232e1a40</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver.Resolution</span></td><td><code>ba500d6ba9a79953</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.ExclusiveResource</span></td><td><code>fa0dc5b65de1b0a0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.ExclusiveResource.LockMode</span></td><td><code>705f9e9f579aeab0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine</span></td><td><code>599b10c51fe35ea3</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor</span></td><td><code>a78f13d5e60b7d08</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.LockManager</span></td><td><code>99cdeecddb4ca68b</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.Node</span></td><td><code>3f2ca9c1749a3d5a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.Node.SkipResult</span></td><td><code>42796aad70055913</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeExecutionAdvisor</span></td><td><code>c8bf7d7bb2e19471</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTestTask</span></td><td><code>c4c004e32fc81aac</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTestTask.DefaultDynamicTestExecutor</span></td><td><code>9048d6cd4a8e05d3</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTestTaskContext</span></td><td><code>f68790b28827581e</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTreeWalker</span></td><td><code>c9f34e2fe83d5caa</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeUtils</span></td><td><code>732ad1771b71d292</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeUtils.1</span></td><td><code>5a44a7e2cbf864b4</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService</span></td><td><code>512f5438a4d56505</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.SingleLock</span></td><td><code>f0bfd18cc662d7fc</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.ThrowableCollector</span></td><td><code>a891c129fd2a01df</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.store.NamespacedHierarchicalStore</span></td><td><code>fb95e61bdaf5378c</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.store.NamespacedHierarchicalStore.EvaluatedValue</span></td><td><code>158ca2dfb82179f2</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.EngineDiscoveryResult</span></td><td><code>c9df2add13bcb88f</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.EngineDiscoveryResult.Status</span></td><td><code>f767a377012b98ff</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherDiscoveryListener</span></td><td><code>088911f06a0807a1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherDiscoveryListener.1</span></td><td><code>d946f222ae757dc1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherSessionListener</span></td><td><code>694596eba9b0c85e</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherSessionListener.1</span></td><td><code>44b3640faa83f474</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.TestExecutionListener</span></td><td><code>f2d1545415335fda</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.TestIdentifier</span></td><td><code>fef478667b042ad5</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.TestPlan</span></td><td><code>f4faaefa1c9341ff</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.CompositeEngineExecutionListener</span></td><td><code>8321b18dbabfecb3</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.CompositeTestExecutionListener</span></td><td><code>04623991ddcc58da</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultDiscoveryRequest</span></td><td><code>e6360c7333fc842d</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncher</span></td><td><code>95dfc056bdb1d2d2</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherConfig</span></td><td><code>b4cd1fb6724efdef</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherSession</span></td><td><code>e040225d1f67e564</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherSession.1</span></td><td><code>bcc6e4bee671ccad</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherSession.ClosedLauncher</span></td><td><code>aa7b08954aea78f5</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DelegatingEngineExecutionListener</span></td><td><code>61bd4de41739236f</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DelegatingLauncher</span></td><td><code>cdc9b7e4e1a576e0</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineDiscoveryOrchestrator</span></td><td><code>e4e806767310de9f</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.Phase</span></td><td><code>67a547a561eee0f4</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineDiscoveryResultValidator</span></td><td><code>552f6c5833b8f8bd</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineExecutionOrchestrator</span></td><td><code>6e65b7c784b87efc</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineFilterer</span></td><td><code>53cf37d963f8b58c</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineIdValidator</span></td><td><code>b0288378227ce052</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ExecutionListenerAdapter</span></td><td><code>d91ab455a4c89f9b</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.InternalTestPlan</span></td><td><code>ce2dcedb783e6f56</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.IterationOrder</span></td><td><code>452edacea5001e83</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.IterationOrder.1</span></td><td><code>0736e6add61b3334</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.IterationOrder.2</span></td><td><code>0d0d72b6e503c372</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfig</span></td><td><code>58100dc14c875cb9</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfig.Builder</span></td><td><code>64729ce9bd729578</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters</span></td><td><code>4b25c1714dc335ec</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.Builder</span></td><td><code>ba76828012d853d8</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider</span></td><td><code>52b5b9d7814ff3b1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider.1</span></td><td><code>f83ebdedced2e399</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider.2</span></td><td><code>886f3c723ddb9556</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider.3</span></td><td><code>0d89b6f56eb4db06</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder</span></td><td><code>fb76ce235ae5247b</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherDiscoveryResult</span></td><td><code>9833a129382c2ccc</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherFactory</span></td><td><code>79c2095302f261bb</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherListenerRegistry</span></td><td><code>64d5f2a8ac991f94</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ListenerRegistry</span></td><td><code>7fe9373f303770d1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener</span></td><td><code>3840931f19c9d795</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener.Outcome</span></td><td><code>730ad6d2d5641536</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ServiceLoaderRegistry</span></td><td><code>08e28076c727f8e6</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry</span></td><td><code>771f386239bb3682</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener</span></td><td><code>f6f65efcfd071c8e</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.StreamInterceptingTestExecutionListener</span></td><td><code>0f855b867dc3eac4</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.UniqueIdTrackingListener</span></td><td><code>aaf56096b3079d53</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.discovery.AbortOnFailureLauncherDiscoveryListener</span></td><td><code>0a9a375bd99ca30a</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.discovery.LauncherDiscoveryListeners</span></td><td><code>408046ed24478736</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.discovery.LauncherDiscoveryListeners.LauncherDiscoveryListenerType</span></td><td><code>bf2a372dcc5e43f7</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.session.LauncherSessionListeners</span></td><td><code>46b8848a888d4d59</code></td></tr><tr><td><span class="el_class">org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryEventPublisherBeansApplicationListener</span></td><td><code>e038b74293c709e4</code></td></tr><tr><td><span class="el_class">org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryEventPublisherBeansTestExecutionListener</span></td><td><code>89df4f04e39e1522</code></td></tr><tr><td><span class="el_class">org.springframework.util.Assert</span></td><td><code>2e1248d2d1526e84</code></td></tr><tr><td><span class="el_class">org.springframework.util.ClassUtils</span></td><td><code>ca4ab8b63048e08b</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap</span></td><td><code>722cd58749bce5da</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap.ReferenceManager</span></td><td><code>35eb6b9c1f2eedb5</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap.ReferenceType</span></td><td><code>5b823be241865c2f</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap.Segment</span></td><td><code>5daee5d71f2a6fe2</code></td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco.csv b/sentrius-llm-core/target/site/jacoco/jacoco.csv
    deleted file mode 100644
    index 9a7bdce0..00000000
    --- a/sentrius-llm-core/target/site/jacoco/jacoco.csv
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -GROUP,PACKAGE,CLASS,INSTRUCTION_MISSED,INSTRUCTION_COVERED,BRANCH_MISSED,BRANCH_COVERED,LINE_MISSED,LINE_COVERED,COMPLEXITY_MISSED,COMPLEXITY_COVERED,METHOD_MISSED,METHOD_COVERED
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,ConversationRequest.ConversationRequestBuilder,42,0,0,0,1,0,5,0,5,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,ConversationRequest,308,0,46,0,19,0,40,0,17,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,ConversationRequest.ConversationRequestBuilderImpl,7,0,0,0,1,0,2,0,2,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,ChatApiEndpointRequest.ChatApiEndpointRequestBuilderImpl,7,0,0,0,1,0,2,0,2,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,ChatApiEndpointRequest.ChatApiEndpointRequestBuilder,18,0,0,0,1,0,3,0,3,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,RawConversationRequest,210,0,36,0,7,0,35,0,17,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,RawConversationRequest.RawConversationRequestBuilderImpl,7,0,0,0,1,0,2,0,2,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,ChatApiEndpointRequest,175,0,28,0,15,0,25,0,11,0
    -sentrius-llm-core,io.sentrius.sso.genai.model.endpoints,RawConversationRequest.RawConversationRequestBuilder,42,0,0,0,1,0,5,0,5,0
    -sentrius-llm-core,io.sentrius.sso.genai,Response,401,0,70,0,13,0,60,0,25,0
    -sentrius-llm-core,io.sentrius.sso.genai,Response.Choice,196,0,38,0,5,0,32,0,13,0
    -sentrius-llm-core,io.sentrius.sso.genai,Message.MessageBuilder,36,0,0,0,1,0,6,0,6,0
    -sentrius-llm-core,io.sentrius.sso.genai,Message,171,0,30,0,7,0,28,0,13,0
    -sentrius-llm-core,io.sentrius.sso.genai,Response.Usage,155,0,30,0,4,0,26,0,11,0
    -sentrius-llm-core,io.sentrius.sso.genai,Response.ResponseBuilder,83,0,0,0,1,0,11,0,11,0
    -sentrius-llm-core,io.sentrius.sso.genai.api,BaseGenerativeRequest.BaseGenerativeRequestBuilder,38,0,0,0,1,0,6,0,6,0
    -sentrius-llm-core,io.sentrius.sso.genai.api,BaseGenerativeRequest,135,0,22,0,6,0,22,0,11,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,LLMRequest.LLMRequestBuilder,151,0,0,0,1,0,14,0,14,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,LLMResponse.LLMResponseBuilder,55,0,2,0,1,0,8,0,7,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,Conversation,218,0,38,0,7,0,34,0,15,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,ApiEndPointRequest,203,0,34,0,6,0,31,0,14,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,LLMRequest.LLMRequestBuilderImpl,7,0,0,0,1,0,2,0,2,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,TwoPartyRequest,45,0,0,0,7,0,9,0,9,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,ApiEndPointRequest.ApiEndPointRequestBuilder,67,0,0,0,1,0,8,0,8,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,LLMRequest,525,0,86,0,14,0,72,0,29,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,TwoPartyRequest.TwoPartyRequestBuilder,73,0,2,0,1,0,10,0,9,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,ComplianceRule,85,0,14,0,5,0,16,0,9,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,Conversation.ConversationBuilder,58,0,2,0,1,0,8,0,7,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,LLMResponse,206,0,34,0,9,0,33,0,16,0
    -sentrius-llm-core,io.sentrius.sso.genai.model,ComplianceRule.ComplianceRuleBuilder,18,0,0,0,1,0,4,0,4,0
    diff --git a/sentrius-llm-core/target/site/jacoco/jacoco.xml b/sentrius-llm-core/target/site/jacoco/jacoco.xml
    deleted file mode 100644
    index f6b1ccdb..00000000
    --- a/sentrius-llm-core/target/site/jacoco/jacoco.xml
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE report PUBLIC "-//JACOCO//DTD Report 1.1//EN" "report.dtd"><report name="sentrius-llm-core"><sessioninfo id="pop-os-7995988c" start="1746208740350" dump="1746208740807"/><package name="io/sentrius/sso/genai/model/endpoints"><class name="io/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilder" sourcefilename="ConversationRequest.java"><method name="&lt;init&gt;" desc="()V" line="32"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="temperature" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilder;" line="32"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="chatWithHistory" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilder;" line="32"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="newMessage" desc="(Lio/sentrius/sso/genai/model/LLMResponse;)Lio/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilder;" line="32"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="32"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="42" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/ConversationRequest" sourcefilename="ConversationRequest.java"><method name="getEndpoint" desc="()Ljava/lang/String;" line="42"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="create" desc="()Ljava/lang/Object;" line="73"><counter type="INSTRUCTION" missed="97" covered="0"/><counter type="BRANCH" missed="10" covered="0"/><counter type="LINE" missed="13" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$temperature" desc="()Ljava/lang/Float;" line="32"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$chatWithHistory" desc="()Ljava/util/List;" line="32"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$newMessage" desc="()Lio/sentrius/sso/genai/model/LLMResponse;" line="32"><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilder;)V" line="32"><counter type="INSTRUCTION" missed="37" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilder;" line="32"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTemperature" desc="()Ljava/lang/Float;" line="38"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getChatWithHistory" desc="()Ljava/util/List;" line="46"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getNewMessage" desc="()Lio/sentrius/sso/genai/model/LLMResponse;" line="49"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTemperature" desc="(Ljava/lang/Float;)V" line="31"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setChatWithHistory" desc="(Ljava/util/List;)V" line="31"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setNewMessage" desc="(Lio/sentrius/sso/genai/model/LLMResponse;)V" line="31"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="31"><counter type="INSTRUCTION" missed="72" covered="0"/><counter type="BRANCH" missed="24" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="31"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="31"><counter type="INSTRUCTION" missed="48" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="31"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="308" covered="0"/><counter type="BRANCH" missed="46" covered="0"/><counter type="LINE" missed="19" covered="0"/><counter type="COMPLEXITY" missed="40" covered="0"/><counter type="METHOD" missed="17" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilderImpl" sourcefilename="ConversationRequest.java"><method name="self" desc="()Lio/sentrius/sso/genai/model/endpoints/ConversationRequest$ConversationRequestBuilderImpl;" line="32"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/endpoints/ConversationRequest;" line="32"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilderImpl" sourcefilename="ChatApiEndpointRequest.java"><method name="self" desc="()Lio/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilderImpl;" line="31"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest;" line="31"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder" sourcefilename="ChatApiEndpointRequest.java"><method name="&lt;init&gt;" desc="()V" line="31"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="temperature" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder;" line="31"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="31"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="18" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="3" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/RawConversationRequest" sourcefilename="RawConversationRequest.java"><method name="getEndpoint" desc="()Ljava/lang/String;" line="41"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="create" desc="()Ljava/lang/Object;" line="74"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$temperature" desc="()Ljava/lang/Float;" line="31"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$chatWithHistory" desc="()Ljava/util/List;" line="31"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$request" desc="()Lio/sentrius/sso/genai/model/LLMRequest;" line="31"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilder;)V" line="31"><counter type="INSTRUCTION" missed="37" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilder;" line="31"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTemperature" desc="()Ljava/lang/Float;" line="37"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getChatWithHistory" desc="()Ljava/util/List;" line="45"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getRequest" desc="()Lio/sentrius/sso/genai/model/LLMRequest;" line="48"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTemperature" desc="(Ljava/lang/Float;)V" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setChatWithHistory" desc="(Ljava/util/List;)V" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setRequest" desc="(Lio/sentrius/sso/genai/model/LLMRequest;)V" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="30"><counter type="INSTRUCTION" missed="72" covered="0"/><counter type="BRANCH" missed="24" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="30"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="30"><counter type="INSTRUCTION" missed="48" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="30"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="210" covered="0"/><counter type="BRANCH" missed="36" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="35" covered="0"/><counter type="METHOD" missed="17" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilderImpl" sourcefilename="RawConversationRequest.java"><method name="self" desc="()Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilderImpl;" line="31"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest;" line="31"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest" sourcefilename="ChatApiEndpointRequest.java"><method name="getEndpoint" desc="()Ljava/lang/String;" line="41"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="create" desc="()Ljava/lang/Object;" line="65"><counter type="INSTRUCTION" missed="79" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="11" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$temperature" desc="()Ljava/lang/Float;" line="31"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder;)V" line="31"><counter type="INSTRUCTION" missed="15" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/endpoints/ChatApiEndpointRequest$ChatApiEndpointRequestBuilder;" line="31"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTemperature" desc="()Ljava/lang/Float;" line="37"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTemperature" desc="(Ljava/lang/Float;)V" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="30"><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="30"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="30"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="175" covered="0"/><counter type="BRANCH" missed="28" covered="0"/><counter type="LINE" missed="15" covered="0"/><counter type="COMPLEXITY" missed="25" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilder" sourcefilename="RawConversationRequest.java"><method name="&lt;init&gt;" desc="()V" line="31"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="temperature" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilder;" line="31"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="chatWithHistory" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilder;" line="31"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="request" desc="(Lio/sentrius/sso/genai/model/LLMRequest;)Lio/sentrius/sso/genai/model/endpoints/RawConversationRequest$RawConversationRequestBuilder;" line="31"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="31"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="42" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="ChatApiEndpointRequest.java"><line nr="30" mi="69" ci="0" mb="14" cb="0"/><line nr="31" mi="46" ci="0" mb="2" cb="0"/><line nr="37" mi="4" ci="0" mb="0" cb="0"/><line nr="41" mi="2" ci="0" mb="0" cb="0"/><line nr="65" mi="4" ci="0" mb="0" cb="0"/><line nr="66" mi="13" ci="0" mb="4" cb="0"/><line nr="67" mi="10" ci="0" mb="0" cb="0"/><line nr="68" mi="8" ci="0" mb="4" cb="0"/><line nr="69" mi="10" ci="0" mb="0" cb="0"/><line nr="71" mi="10" ci="0" mb="0" cb="0"/><line nr="72" mi="6" ci="0" mb="2" cb="0"/><line nr="73" mi="5" ci="0" mb="0" cb="0"/><line nr="75" mi="4" ci="0" mb="2" cb="0"/><line nr="76" mi="6" ci="0" mb="0" cb="0"/><line nr="78" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="200" covered="0"/><counter type="BRANCH" missed="28" covered="0"/><counter type="LINE" missed="15" covered="0"/><counter type="COMPLEXITY" missed="30" covered="0"/><counter type="METHOD" missed="16" covered="0"/><counter type="CLASS" missed="3" covered="0"/></sourcefile><sourcefile name="RawConversationRequest.java"><line nr="30" mi="145" ci="0" mb="30" cb="0"/><line nr="31" mi="97" ci="0" mb="6" cb="0"/><line nr="37" mi="4" ci="0" mb="0" cb="0"/><line nr="41" mi="2" ci="0" mb="0" cb="0"/><line nr="45" mi="3" ci="0" mb="0" cb="0"/><line nr="48" mi="5" ci="0" mb="0" cb="0"/><line nr="74" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="259" covered="0"/><counter type="BRANCH" missed="36" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="42" covered="0"/><counter type="METHOD" missed="24" covered="0"/><counter type="CLASS" missed="3" covered="0"/></sourcefile><sourcefile name="ConversationRequest.java"><line nr="31" mi="145" ci="0" mb="30" cb="0"/><line nr="32" mi="97" ci="0" mb="6" cb="0"/><line nr="38" mi="4" ci="0" mb="0" cb="0"/><line nr="42" mi="2" ci="0" mb="0" cb="0"/><line nr="46" mi="3" ci="0" mb="0" cb="0"/><line nr="49" mi="9" ci="0" mb="0" cb="0"/><line nr="73" mi="4" ci="0" mb="0" cb="0"/><line nr="74" mi="10" ci="0" mb="0" cb="0"/><line nr="75" mi="11" ci="0" mb="2" cb="0"/><line nr="76" mi="11" ci="0" mb="0" cb="0"/><line nr="77" mi="1" ci="0" mb="0" cb="0"/><line nr="78" mi="13" ci="0" mb="0" cb="0"/><line nr="79" mi="13" ci="0" mb="4" cb="0"/><line nr="80" mi="10" ci="0" mb="0" cb="0"/><line nr="81" mi="6" ci="0" mb="2" cb="0"/><line nr="82" mi="5" ci="0" mb="0" cb="0"/><line nr="84" mi="4" ci="0" mb="2" cb="0"/><line nr="85" mi="6" ci="0" mb="0" cb="0"/><line nr="87" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="357" covered="0"/><counter type="BRANCH" missed="46" covered="0"/><counter type="LINE" missed="19" covered="0"/><counter type="COMPLEXITY" missed="47" covered="0"/><counter type="METHOD" missed="24" covered="0"/><counter type="CLASS" missed="3" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="816" covered="0"/><counter type="BRANCH" missed="110" covered="0"/><counter type="LINE" missed="41" covered="0"/><counter type="COMPLEXITY" missed="119" covered="0"/><counter type="METHOD" missed="64" covered="0"/><counter type="CLASS" missed="9" covered="0"/></package><package name="io/sentrius/sso/genai"><class name="io/sentrius/sso/genai/Response" sourcefilename="Response.java"><method name="concatenateResponses" desc="()Ljava/lang/String;" line="93"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getId" desc="()Ljava/lang/String;" line="24"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getObject" desc="()Ljava/lang/String;" line="27"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getCreated" desc="()Ljava/lang/Long;" line="30"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getModel" desc="()Ljava/lang/String;" line="33"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getChoices" desc="()Ljava/util/List;" line="36"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUsage" desc="()Lio/sentrius/sso/genai/Response$Usage;" line="39"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getServiceTier" desc="()Ljava/lang/String;" line="42"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getSystemFingerprint" desc="()Ljava/lang/String;" line="85"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setId" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setObject" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setCreated" desc="(Ljava/lang/Long;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setModel" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setChoices" desc="(Ljava/util/List;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setUsage" desc="(Lio/sentrius/sso/genai/Response$Usage;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setServiceTier" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setSystemFingerprint" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="17"><counter type="INSTRUCTION" missed="157" covered="0"/><counter type="BRANCH" missed="54" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="28" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="17"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="17"><counter type="INSTRUCTION" missed="118" covered="0"/><counter type="BRANCH" missed="16" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="9" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="17"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="19"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Lio/sentrius/sso/genai/Response$Usage;Ljava/lang/String;Ljava/lang/String;)V" line="20"><counter type="INSTRUCTION" missed="27" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$concatenateResponses$0" desc="(Lio/sentrius/sso/genai/Response$Choice;)Ljava/lang/String;" line="93"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="401" covered="0"/><counter type="BRANCH" missed="70" covered="0"/><counter type="LINE" missed="13" covered="0"/><counter type="COMPLEXITY" missed="60" covered="0"/><counter type="METHOD" missed="25" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response$Choice" sourcefilename="Response.java"><method name="&lt;init&gt;" desc="()V" line="49"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getIndex" desc="()Ljava/lang/Integer;" line="53"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getMessage" desc="()Lio/sentrius/sso/genai/Message;" line="56"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getFinishReason" desc="()Ljava/lang/String;" line="59"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getLogprobs" desc="()Ljava/lang/Integer;" line="62"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setIndex" desc="(Ljava/lang/Integer;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setMessage" desc="(Lio/sentrius/sso/genai/Message;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setFinishReason" desc="(Ljava/lang/String;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setLogprobs" desc="(Ljava/lang/Integer;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="49"><counter type="INSTRUCTION" missed="89" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="16" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="49"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="49"><counter type="INSTRUCTION" missed="62" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="49"><counter type="INSTRUCTION" missed="11" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="196" covered="0"/><counter type="BRANCH" missed="38" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="32" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Message$MessageBuilder" sourcefilename="Message.java"><method name="&lt;init&gt;" desc="()V" line="33"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="role" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Message$MessageBuilder;" line="33"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="content" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Message$MessageBuilder;" line="33"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="refusal" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Message$MessageBuilder;" line="33"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/Message;" line="33"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="33"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="36" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Message" sourcefilename="Message.java"><method name="builder" desc="()Lio/sentrius/sso/genai/Message$MessageBuilder;" line="33"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getRole" desc="()Ljava/lang/String;" line="40"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getContent" desc="()Ljava/lang/String;" line="43"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getRefusal" desc="()Ljava/lang/String;" line="46"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setRole" desc="(Ljava/lang/String;)V" line="32"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setContent" desc="(Ljava/lang/String;)V" line="32"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setRefusal" desc="(Ljava/lang/String;)V" line="32"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="32"><counter type="INSTRUCTION" missed="72" covered="0"/><counter type="BRANCH" missed="24" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="32"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="32"><counter type="INSTRUCTION" missed="48" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="32"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="34"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" line="35"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="171" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="28" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response$Usage" sourcefilename="Response.java"><method name="&lt;init&gt;" desc="()V" line="70"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getPromptTokens" desc="()Ljava/lang/Integer;" line="75"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getCompletionTokens" desc="()Ljava/lang/Integer;" line="78"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTotalTokens" desc="()Ljava/lang/Integer;" line="81"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setPromptTokens" desc="(Ljava/lang/Integer;)V" line="70"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setCompletionTokens" desc="(Ljava/lang/Integer;)V" line="70"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTotalTokens" desc="(Ljava/lang/Integer;)V" line="70"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="70"><counter type="INSTRUCTION" missed="72" covered="0"/><counter type="BRANCH" missed="24" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="70"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="70"><counter type="INSTRUCTION" missed="48" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="70"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="155" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="26" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response$ResponseBuilder" sourcefilename="Response.java"><method name="&lt;init&gt;" desc="()V" line="18"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="id" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="object" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="created" desc="(Ljava/lang/Long;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="model" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="choices" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="usage" desc="(Lio/sentrius/sso/genai/Response$Usage;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="serviceTier" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="systemFingerprint" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/Response;" line="18"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="18"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="83" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="Message.java"><line nr="32" mi="143" ci="0" mb="30" cb="0"/><line nr="33" mi="40" ci="0" mb="0" cb="0"/><line nr="34" mi="3" ci="0" mb="0" cb="0"/><line nr="35" mi="12" ci="0" mb="0" cb="0"/><line nr="40" mi="3" ci="0" mb="0" cb="0"/><line nr="43" mi="3" ci="0" mb="0" cb="0"/><line nr="46" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="207" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="34" covered="0"/><counter type="METHOD" missed="19" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><sourcefile name="Response.java"><line nr="17" mi="330" ci="0" mb="70" cb="0"/><line nr="18" mi="87" ci="0" mb="0" cb="0"/><line nr="19" mi="3" ci="0" mb="0" cb="0"/><line nr="20" mi="27" ci="0" mb="0" cb="0"/><line nr="24" mi="3" ci="0" mb="0" cb="0"/><line nr="27" mi="3" ci="0" mb="0" cb="0"/><line nr="30" mi="3" ci="0" mb="0" cb="0"/><line nr="33" mi="3" ci="0" mb="0" cb="0"/><line nr="36" mi="3" ci="0" mb="0" cb="0"/><line nr="39" mi="3" ci="0" mb="0" cb="0"/><line nr="42" mi="3" ci="0" mb="0" cb="0"/><line nr="49" mi="184" ci="0" mb="38" cb="0"/><line nr="53" mi="3" ci="0" mb="0" cb="0"/><line nr="56" mi="3" ci="0" mb="0" cb="0"/><line nr="59" mi="3" ci="0" mb="0" cb="0"/><line nr="62" mi="3" ci="0" mb="0" cb="0"/><line nr="70" mi="146" ci="0" mb="30" cb="0"/><line nr="75" mi="3" ci="0" mb="0" cb="0"/><line nr="78" mi="3" ci="0" mb="0" cb="0"/><line nr="81" mi="3" ci="0" mb="0" cb="0"/><line nr="85" mi="3" ci="0" mb="0" cb="0"/><line nr="93" mi="13" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="835" covered="0"/><counter type="BRANCH" missed="138" covered="0"/><counter type="LINE" missed="22" covered="0"/><counter type="COMPLEXITY" missed="129" covered="0"/><counter type="METHOD" missed="60" covered="0"/><counter type="CLASS" missed="4" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="1042" covered="0"/><counter type="BRANCH" missed="168" covered="0"/><counter type="LINE" missed="29" covered="0"/><counter type="COMPLEXITY" missed="163" covered="0"/><counter type="METHOD" missed="79" covered="0"/><counter type="CLASS" missed="6" covered="0"/></package><package name="io/sentrius/sso/genai/api"><class name="io/sentrius/sso/genai/api/BaseGenerativeRequest$BaseGenerativeRequestBuilder" sourcefilename="BaseGenerativeRequest.java"><method name="&lt;init&gt;" desc="()V" line="25"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$fillValuesFrom" desc="(Lio/sentrius/sso/genai/api/BaseGenerativeRequest;)Lio/sentrius/sso/genai/api/BaseGenerativeRequest$BaseGenerativeRequestBuilder;" line="25"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$fillValuesFromInstanceIntoBuilder" desc="(Lio/sentrius/sso/genai/api/BaseGenerativeRequest;Lio/sentrius/sso/genai/api/BaseGenerativeRequest$BaseGenerativeRequestBuilder;)V" line="25"><counter type="INSTRUCTION" missed="11" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="user" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/api/BaseGenerativeRequest$BaseGenerativeRequestBuilder;" line="25"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="model" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/api/BaseGenerativeRequest$BaseGenerativeRequestBuilder;" line="25"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="25"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/api/BaseGenerativeRequest" sourcefilename="BaseGenerativeRequest.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/api/BaseGenerativeRequest$BaseGenerativeRequestBuilder;)V" line="25"><counter type="INSTRUCTION" missed="11" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUser" desc="()Ljava/lang/String;" line="34"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getModel" desc="()Ljava/lang/String;" line="40"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setUser" desc="(Ljava/lang/String;)V" line="24"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setModel" desc="(Ljava/lang/String;)V" line="24"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="24"><counter type="INSTRUCTION" missed="55" covered="0"/><counter type="BRANCH" missed="18" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="10" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="24"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="24"><counter type="INSTRUCTION" missed="34" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="24"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="26"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;Ljava/lang/String;)V" line="27"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="135" covered="0"/><counter type="BRANCH" missed="22" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="22" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="BaseGenerativeRequest.java"><line nr="24" mi="106" ci="0" mb="22" cb="0"/><line nr="25" mi="49" ci="0" mb="0" cb="0"/><line nr="26" mi="3" ci="0" mb="0" cb="0"/><line nr="27" mi="9" ci="0" mb="0" cb="0"/><line nr="34" mi="3" ci="0" mb="0" cb="0"/><line nr="40" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="173" covered="0"/><counter type="BRANCH" missed="22" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="28" covered="0"/><counter type="METHOD" missed="17" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="173" covered="0"/><counter type="BRANCH" missed="22" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="28" covered="0"/><counter type="METHOD" missed="17" covered="0"/><counter type="CLASS" missed="2" covered="0"/></package><package name="io/sentrius/sso/genai/model"><class name="io/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder" sourcefilename="LLMRequest.java"><method name="&lt;init&gt;" desc="()V" line="26"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$fillValuesFrom" desc="(Lio/sentrius/sso/genai/model/LLMRequest;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$fillValuesFromInstanceIntoBuilder" desc="(Lio/sentrius/sso/genai/model/LLMRequest;Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;)V" line="26"><counter type="INSTRUCTION" missed="51" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="messages" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="temperature" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="topP" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="n" desc="(Ljava/lang/Integer;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="stream" desc="(Ljava/lang/Boolean;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="stop" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="maxTokens" desc="(Ljava/lang/Integer;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="presencePenalty" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="frequencyPenalty" desc="(Ljava/lang/Float;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="logitBias" desc="(Ljava/util/Map;)Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="26"><counter type="INSTRUCTION" missed="27" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="151" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="14" covered="0"/><counter type="METHOD" missed="14" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/LLMResponse$LLMResponseBuilder" sourcefilename="LLMResponse.java"><method name="&lt;init&gt;" desc="()V" line="13"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="role" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/LLMResponse$LLMResponseBuilder;" line="13"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="content" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/LLMResponse$LLMResponseBuilder;" line="13"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="terminalMessage" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/LLMResponse$LLMResponseBuilder;" line="13"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="alert" desc="(Z)Lio/sentrius/sso/genai/model/LLMResponse$LLMResponseBuilder;" line="13"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/LLMResponse;" line="13"><counter type="INSTRUCTION" missed="19" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="13"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="55" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="7" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/Conversation" sourcefilename="Conversation.java"><method name="$default$terminalMessages" desc="()Ljava/util/List;" line="11"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/util/List;Lio/sentrius/sso/genai/model/LLMResponse;Ljava/util/List;Ljava/lang/String;)V" line="11"><counter type="INSTRUCTION" missed="15" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/Conversation$ConversationBuilder;" line="11"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="12"><counter type="INSTRUCTION" missed="89" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="16" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="12"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="12"><counter type="INSTRUCTION" missed="62" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="12"><counter type="INSTRUCTION" missed="13" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getPreviousMessages" desc="()Ljava/util/List;" line="17"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getNewUserMessage" desc="()Lio/sentrius/sso/genai/model/LLMResponse;" line="18"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTerminalMessages" desc="()Ljava/util/List;" line="21"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getSystemConfines" desc="()Ljava/lang/String;" line="23"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setPreviousMessages" desc="(Ljava/util/List;)V" line="14"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setNewUserMessage" desc="(Lio/sentrius/sso/genai/model/LLMResponse;)V" line="14"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTerminalMessages" desc="(Ljava/util/List;)V" line="14"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setSystemConfines" desc="(Ljava/lang/String;)V" line="14"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="218" covered="0"/><counter type="BRANCH" missed="38" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="34" covered="0"/><counter type="METHOD" missed="15" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/ApiEndPointRequest" sourcefilename="ApiEndPointRequest.java"><method name="$default$maxTokens" desc="()I" line="12"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;)V" line="12"><counter type="INSTRUCTION" missed="26" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUser" desc="()Ljava/lang/String;" line="15"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUserInput" desc="()Ljava/lang/String;" line="17"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getSystemInput" desc="()Ljava/lang/String;" line="19"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getMaxTokens" desc="()I" line="22"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setUser" desc="(Ljava/lang/String;)V" line="11"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setUserInput" desc="(Ljava/lang/String;)V" line="11"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setSystemInput" desc="(Ljava/lang/String;)V" line="11"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setMaxTokens" desc="(I)V" line="11"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="11"><counter type="INSTRUCTION" missed="79" covered="0"/><counter type="BRANCH" missed="26" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="14" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="11"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="11"><counter type="INSTRUCTION" missed="55" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="11"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="203" covered="0"/><counter type="BRANCH" missed="34" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="31" covered="0"/><counter type="METHOD" missed="14" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilderImpl" sourcefilename="LLMRequest.java"><method name="self" desc="()Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilderImpl;" line="26"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/LLMRequest;" line="26"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/TwoPartyRequest" sourcefilename="TwoPartyRequest.java"><method name="$default$systemInput" desc="()Ljava/lang/String;" line="6"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" line="6"><counter type="INSTRUCTION" missed="21" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getSystemInput" desc="()Ljava/lang/String;" line="10"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getWhatSystemIsDoing" desc="()Ljava/lang/String;" line="14"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUserObjective" desc="()Ljava/lang/String;" line="15"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUserInput" desc="()Ljava/lang/String;" line="16"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getPreviousPrompt" desc="()Ljava/lang/String;" line="18"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getPromptResponse" desc="()Ljava/lang/String;" line="19"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="45" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="9" covered="0"/><counter type="METHOD" missed="9" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder" sourcefilename="ApiEndPointRequest.java"><method name="&lt;init&gt;" desc="()V" line="12"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$fillValuesFrom" desc="(Lio/sentrius/sso/genai/model/ApiEndPointRequest;)Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;" line="12"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$fillValuesFromInstanceIntoBuilder" desc="(Lio/sentrius/sso/genai/model/ApiEndPointRequest;Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;)V" line="12"><counter type="INSTRUCTION" missed="21" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="user" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;" line="12"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="userInput" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;" line="12"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="systemInput" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;" line="12"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="maxTokens" desc="(I)Lio/sentrius/sso/genai/model/ApiEndPointRequest$ApiEndPointRequestBuilder;" line="12"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="12"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="67" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="8" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/LLMRequest" sourcefilename="LLMRequest.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;)V" line="26"><counter type="INSTRUCTION" missed="44" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toBuilder" desc="()Lio/sentrius/sso/genai/model/LLMRequest$LLMRequestBuilder;" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getMessages" desc="()Ljava/util/List;" line="38"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTemperature" desc="()Ljava/lang/Float;" line="51"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTopP" desc="()Ljava/lang/Float;" line="65"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getN" desc="()Ljava/lang/Integer;" line="75"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getStream" desc="()Ljava/lang/Boolean;" line="87"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getStop" desc="()Ljava/util/List;" line="97"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getMaxTokens" desc="()Ljava/lang/Integer;" line="108"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getPresencePenalty" desc="()Ljava/lang/Float;" line="122"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getFrequencyPenalty" desc="()Ljava/lang/Float;" line="136"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getLogitBias" desc="()Ljava/util/Map;" line="151"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setMessages" desc="(Ljava/util/List;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTemperature" desc="(Ljava/lang/Float;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTopP" desc="(Ljava/lang/Float;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setN" desc="(Ljava/lang/Integer;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setStream" desc="(Ljava/lang/Boolean;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setStop" desc="(Ljava/util/List;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setMaxTokens" desc="(Ljava/lang/Integer;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setPresencePenalty" desc="(Ljava/lang/Float;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setFrequencyPenalty" desc="(Ljava/lang/Float;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setLogitBias" desc="(Ljava/util/Map;)V" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="25"><counter type="INSTRUCTION" missed="191" covered="0"/><counter type="BRANCH" missed="66" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="34" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="25"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="25"><counter type="INSTRUCTION" missed="146" covered="0"/><counter type="BRANCH" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="25"><counter type="INSTRUCTION" missed="25" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="27"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/util/List;Ljava/lang/Float;Ljava/lang/Float;Ljava/lang/Integer;Ljava/lang/Boolean;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Float;Ljava/lang/Float;Ljava/util/Map;)V" line="28"><counter type="INSTRUCTION" missed="33" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="525" covered="0"/><counter type="BRANCH" missed="86" covered="0"/><counter type="LINE" missed="14" covered="0"/><counter type="COMPLEXITY" missed="72" covered="0"/><counter type="METHOD" missed="29" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder" sourcefilename="TwoPartyRequest.java"><method name="&lt;init&gt;" desc="()V" line="6"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="systemInput" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="whatSystemIsDoing" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="userObjective" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="userInput" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="previousPrompt" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="promptResponse" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/TwoPartyRequest$TwoPartyRequestBuilder;" line="6"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/TwoPartyRequest;" line="6"><counter type="INSTRUCTION" missed="23" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="6"><counter type="INSTRUCTION" missed="14" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="73" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="10" covered="0"/><counter type="METHOD" missed="9" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/ComplianceRule" sourcefilename="ComplianceRule.java"><method name="builder" desc="()Lio/sentrius/sso/genai/model/ComplianceRule$ComplianceRuleBuilder;" line="22"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getRule" desc="()Ljava/lang/String;" line="27"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setRule" desc="(Ljava/lang/String;)V" line="21"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="21"><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="21"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="21"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="21"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;)V" line="23"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="24"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="85" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="16" covered="0"/><counter type="METHOD" missed="9" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/Conversation$ConversationBuilder" sourcefilename="Conversation.java"><method name="&lt;init&gt;" desc="()V" line="11"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="previousMessages" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/model/Conversation$ConversationBuilder;" line="11"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="newUserMessage" desc="(Lio/sentrius/sso/genai/model/LLMResponse;)Lio/sentrius/sso/genai/model/Conversation$ConversationBuilder;" line="11"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="terminalMessages" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/model/Conversation$ConversationBuilder;" line="11"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="systemConfines" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/Conversation$ConversationBuilder;" line="11"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/Conversation;" line="11"><counter type="INSTRUCTION" missed="19" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="11"><counter type="INSTRUCTION" missed="13" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="58" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="7" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/LLMResponse" sourcefilename="LLMResponse.java"><method name="$default$alert" desc="()Z" line="13"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/model/LLMResponse$LLMResponseBuilder;" line="13"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getRole" desc="()Ljava/lang/String;" line="17"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getContent" desc="()Ljava/lang/String;" line="18"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTerminalMessage" desc="()Ljava/lang/String;" line="19"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="isAlert" desc="()Z" line="21"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="11"><counter type="INSTRUCTION" missed="79" covered="0"/><counter type="BRANCH" missed="26" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="14" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="11"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="11"><counter type="INSTRUCTION" missed="59" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="11"><counter type="INSTRUCTION" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setRole" desc="(Ljava/lang/String;)V" line="12"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setContent" desc="(Ljava/lang/String;)V" line="12"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTerminalMessage" desc="(Ljava/lang/String;)V" line="12"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setAlert" desc="(Z)V" line="12"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V" line="14"><counter type="INSTRUCTION" missed="15" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="15"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="206" covered="0"/><counter type="BRANCH" missed="34" covered="0"/><counter type="LINE" missed="9" covered="0"/><counter type="COMPLEXITY" missed="33" covered="0"/><counter type="METHOD" missed="16" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/model/ComplianceRule$ComplianceRuleBuilder" sourcefilename="ComplianceRule.java"><method name="&lt;init&gt;" desc="()V" line="22"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="rule" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/model/ComplianceRule$ComplianceRuleBuilder;" line="22"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/model/ComplianceRule;" line="22"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="22"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="18" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="4" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="LLMRequest.java"><line nr="25" mi="405" ci="0" mb="86" cb="0"/><line nr="26" mi="212" ci="0" mb="0" cb="0"/><line nr="27" mi="3" ci="0" mb="0" cb="0"/><line nr="28" mi="33" ci="0" mb="0" cb="0"/><line nr="38" mi="3" ci="0" mb="0" cb="0"/><line nr="51" mi="3" ci="0" mb="0" cb="0"/><line nr="65" mi="3" ci="0" mb="0" cb="0"/><line nr="75" mi="3" ci="0" mb="0" cb="0"/><line nr="87" mi="3" ci="0" mb="0" cb="0"/><line nr="97" mi="3" ci="0" mb="0" cb="0"/><line nr="108" mi="3" ci="0" mb="0" cb="0"/><line nr="122" mi="3" ci="0" mb="0" cb="0"/><line nr="136" mi="3" ci="0" mb="0" cb="0"/><line nr="151" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="683" covered="0"/><counter type="BRANCH" missed="86" covered="0"/><counter type="LINE" missed="14" covered="0"/><counter type="COMPLEXITY" missed="88" covered="0"/><counter type="METHOD" missed="45" covered="0"/><counter type="CLASS" missed="3" covered="0"/></sourcefile><sourcefile name="LLMResponse.java"><line nr="11" mi="151" ci="0" mb="34" cb="0"/><line nr="12" mi="16" ci="0" mb="0" cb="0"/><line nr="13" mi="61" ci="0" mb="2" cb="0"/><line nr="14" mi="15" ci="0" mb="0" cb="0"/><line nr="15" mi="6" ci="0" mb="0" cb="0"/><line nr="17" mi="3" ci="0" mb="0" cb="0"/><line nr="18" mi="3" ci="0" mb="0" cb="0"/><line nr="19" mi="3" ci="0" mb="0" cb="0"/><line nr="21" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="261" covered="0"/><counter type="BRANCH" missed="36" covered="0"/><counter type="LINE" missed="9" covered="0"/><counter type="COMPLEXITY" missed="41" covered="0"/><counter type="METHOD" missed="23" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><sourcefile name="ComplianceRule.java"><line nr="21" mi="69" ci="0" mb="14" cb="0"/><line nr="22" mi="22" ci="0" mb="0" cb="0"/><line nr="23" mi="6" ci="0" mb="0" cb="0"/><line nr="24" mi="3" ci="0" mb="0" cb="0"/><line nr="27" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="103" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="20" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><sourcefile name="TwoPartyRequest.java"><line nr="6" mi="100" ci="0" mb="2" cb="0"/><line nr="10" mi="3" ci="0" mb="0" cb="0"/><line nr="14" mi="3" ci="0" mb="0" cb="0"/><line nr="15" mi="3" ci="0" mb="0" cb="0"/><line nr="16" mi="3" ci="0" mb="0" cb="0"/><line nr="18" mi="3" ci="0" mb="0" cb="0"/><line nr="19" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="118" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="19" covered="0"/><counter type="METHOD" missed="18" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><sourcefile name="Conversation.java"><line nr="11" mi="81" ci="0" mb="2" cb="0"/><line nr="12" mi="167" ci="0" mb="38" cb="0"/><line nr="14" mi="16" ci="0" mb="0" cb="0"/><line nr="17" mi="3" ci="0" mb="0" cb="0"/><line nr="18" mi="3" ci="0" mb="0" cb="0"/><line nr="21" mi="3" ci="0" mb="0" cb="0"/><line nr="23" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="276" covered="0"/><counter type="BRANCH" missed="40" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="42" covered="0"/><counter type="METHOD" missed="22" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><sourcefile name="ApiEndPointRequest.java"><line nr="11" mi="163" ci="0" mb="32" cb="0"/><line nr="12" mi="95" ci="0" mb="2" cb="0"/><line nr="15" mi="3" ci="0" mb="0" cb="0"/><line nr="17" mi="3" ci="0" mb="0" cb="0"/><line nr="19" mi="3" ci="0" mb="0" cb="0"/><line nr="22" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="270" covered="0"/><counter type="BRANCH" missed="34" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="39" covered="0"/><counter type="METHOD" missed="22" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="1711" covered="0"/><counter type="BRANCH" missed="212" covered="0"/><counter type="LINE" missed="48" covered="0"/><counter type="COMPLEXITY" missed="249" covered="0"/><counter type="METHOD" missed="143" covered="0"/><counter type="CLASS" missed="13" covered="0"/></package><counter type="INSTRUCTION" missed="3742" covered="0"/><counter type="BRANCH" missed="512" covered="0"/><counter type="LINE" missed="124" covered="0"/><counter type="COMPLEXITY" missed="559" covered="0"/><counter type="METHOD" missed="303" covered="0"/><counter type="CLASS" missed="30" covered="0"/></report>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/jacoco.exec b/sentrius-llm-dataplane/target/jacoco.exec
    deleted file mode 100644
    index b7b846b9..00000000
    Binary files a/sentrius-llm-dataplane/target/jacoco.exec and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/index.html b/sentrius-llm-dataplane/target/site/jacoco/index.html
    deleted file mode 100644
    index 3f36e9fa..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="jacoco-resources/report.gif" type="image/gif"/><title>sentrius-llm-dataplane</title><script type="text/javascript" src="jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="jacoco-sessions.html" class="el_session">Sessions</a></span><span class="el_report">sentrius-llm-dataplane</span></div><h1>sentrius-llm-dataplane</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">3,449 of 3,449</td><td class="ctr2">0%</td><td class="bar">340 of 340</td><td class="ctr2">0%</td><td class="ctr1">367</td><td class="ctr2">367</td><td class="ctr1">529</td><td class="ctr2">529</td><td class="ctr1">197</td><td class="ctr2">197</td><td class="ctr1">28</td><td class="ctr2">28</td></tr></tfoot><tbody><tr><td id="a3"><a href="io.sentrius.sso.genai/index.html" class="el_package">io.sentrius.sso.genai</a></td><td class="bar" id="b0"><img src="jacoco-resources/redbar.gif" width="120" height="10" title="1,795" alt="1,795"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="jacoco-resources/redbar.gif" width="120" height="10" title="200" alt="200"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">234</td><td class="ctr2" id="g0">234</td><td class="ctr1" id="h1">157</td><td class="ctr2" id="i1">157</td><td class="ctr1" id="j0">134</td><td class="ctr2" id="k0">134</td><td class="ctr1" id="l0">19</td><td class="ctr2" id="m0">19</td></tr><tr><td id="a0"><a href="io.sentrius.sso.automation.auditing.rules/index.html" class="el_package">io.sentrius.sso.automation.auditing.rules</a></td><td class="bar" id="b1"><img src="jacoco-resources/redbar.gif" width="49" height="10" title="737" alt="737"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="jacoco-resources/redbar.gif" width="45" height="10" title="76" alt="76"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">63</td><td class="ctr2" id="g1">63</td><td class="ctr1" id="h0">167</td><td class="ctr2" id="i0">167</td><td class="ctr1" id="j1">25</td><td class="ctr2" id="k1">25</td><td class="ctr1" id="l2">2</td><td class="ctr2" id="m2">2</td></tr><tr><td id="a2"><a href="io.sentrius.sso.core.services.openai.categorization/index.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a></td><td class="bar" id="b2"><img src="jacoco-resources/redbar.gif" width="24" height="10" title="365" alt="365"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d3"><img src="jacoco-resources/redbar.gif" width="14" height="10" title="24" alt="24"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f2">28</td><td class="ctr2" id="g2">28</td><td class="ctr1" id="h2">85</td><td class="ctr2" id="i2">85</td><td class="ctr1" id="j2">16</td><td class="ctr2" id="k2">16</td><td class="ctr1" id="l1">3</td><td class="ctr2" id="m1">3</td></tr><tr><td id="a1"><a href="io.sentrius.sso.core.services.openai/index.html" class="el_package">io.sentrius.sso.core.services.openai</a></td><td class="bar" id="b3"><img src="jacoco-resources/redbar.gif" width="20" height="10" title="314" alt="314"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d2"><img src="jacoco-resources/redbar.gif" width="15" height="10" title="26" alt="26"/></td><td class="ctr2" id="e3">0%</td><td class="ctr1" id="f3">25</td><td class="ctr2" id="g3">25</td><td class="ctr1" id="h3">66</td><td class="ctr2" id="i3">66</td><td class="ctr1" id="j3">12</td><td class="ctr2" id="k3">12</td><td class="ctr1" id="l3">2</td><td class="ctr2" id="m3">2</td></tr><tr><td id="a5"><a href="io.sentrius.sso.genai.suggestions/index.html" class="el_package">io.sentrius.sso.genai.suggestions</a></td><td class="bar" id="b4"><img src="jacoco-resources/redbar.gif" width="8" height="10" title="131" alt="131"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d5"><img src="jacoco-resources/redbar.gif" width="3" height="10" title="6" alt="6"/></td><td class="ctr2" id="e4">0%</td><td class="ctr1" id="f5">8</td><td class="ctr2" id="g5">8</td><td class="ctr1" id="h4">28</td><td class="ctr2" id="i4">28</td><td class="ctr1" id="j4">5</td><td class="ctr2" id="k4">5</td><td class="ctr1" id="l4">1</td><td class="ctr2" id="m4">1</td></tr><tr><td id="a4"><a href="io.sentrius.sso.genai.spring.ai/index.html" class="el_package">io.sentrius.sso.genai.spring.ai</a></td><td class="bar" id="b5"><img src="jacoco-resources/redbar.gif" width="7" height="10" title="107" alt="107"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d4"><img src="jacoco-resources/redbar.gif" width="4" height="10" title="8" alt="8"/></td><td class="ctr2" id="e5">0%</td><td class="ctr1" id="f4">9</td><td class="ctr2" id="g4">9</td><td class="ctr1" id="h5">26</td><td class="ctr2" id="i5">26</td><td class="ctr1" id="j5">5</td><td class="ctr2" id="k5">5</td><td class="ctr1" id="l5">1</td><td class="ctr2" id="m5">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/OpenAISessionRule.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/OpenAISessionRule.html
    deleted file mode 100644
    index 77582acb..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/OpenAISessionRule.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAISessionRule</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.automation.auditing.rules</a> &gt; <span class="el_class">OpenAISessionRule</span></div><h1>OpenAISessionRule</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">196 of 196</td><td class="ctr2">0%</td><td class="bar">14 of 14</td><td class="ctr2">0%</td><td class="ctr1">19</td><td class="ctr2">19</td><td class="ctr1">53</td><td class="ctr2">53</td><td class="ctr1">12</td><td class="ctr2">12</td></tr></tfoot><tbody><tr><td id="a11"><a href="OpenAISessionRule.java.html#L49" class="el_method">trigger(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="107" alt="107"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">27</td><td class="ctr2" id="i0">27</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a5"><a href="OpenAISessionRule.java.html#L113" class="el_method">onMessage(Session.TerminalMessage)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="40" height="10" title="36" alt="36"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">4</td><td class="ctr2" id="g1">4</td><td class="ctr1" id="h1">6</td><td class="ctr2" id="i1">6</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a6"><a href="OpenAISessionRule.java.html#L19" class="el_method">OpenAISessionRule()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="19" height="10" title="17" alt="17"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h2">5</td><td class="ctr2" id="i2">5</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a3"><a href="OpenAISessionRule.java.html#L74" class="el_method">lambda$trigger$0(Boolean)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="11" alt="11"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="40" height="10" title="2" alt="2"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f2">2</td><td class="ctr2" id="g2">2</td><td class="ctr1" id="h3">4</td><td class="ctr2" id="i3">4</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a10"><a href="OpenAISessionRule.java.html#L18" class="el_method">static {...}</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="7" alt="7"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">2</td><td class="ctr2" id="i4">2</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a8"><a href="OpenAISessionRule.java.html#L39" class="el_method">setConnectedSystem(ConnectedSystem)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">2</td><td class="ctr2" id="i5">2</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a9"><a href="OpenAISessionRule.java.html#L44" class="el_method">setTrackingService(SessionTrackingService)</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">2</td><td class="ctr2" id="i6">2</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a0"><a href="OpenAISessionRule.java.html#L97" class="el_method">configure(SystemOptions, String)</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a1"><a href="OpenAISessionRule.java.html#L102" class="el_method">describeAction()</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a7"><a href="OpenAISessionRule.java.html#L107" class="el_method">requiresSanitized()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a2"><a href="OpenAISessionRule.java.html#L124" class="el_method">isOnlySessionRule()</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr><tr><td id="a4"><a href="OpenAISessionRule.java.html#L129" class="el_method">onFullCommand()</a></td><td class="bar" id="b11"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c11">0%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f11">1</td><td class="ctr2" id="g11">1</td><td class="ctr1" id="h11">1</td><td class="ctr2" id="i11">1</td><td class="ctr1" id="j11">1</td><td class="ctr2" id="k11">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/OpenAISessionRule.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/OpenAISessionRule.java.html
    deleted file mode 100644
    index 020c61c8..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/OpenAISessionRule.java.html
    +++ /dev/null
    @@ -1,132 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAISessionRule.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.automation.auditing.rules</a> &gt; <span class="el_source">OpenAISessionRule.java</span></div><h1>OpenAISessionRule.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.automation.auditing.rules;
    -
    -import java.util.LinkedList;
    -import java.util.Optional;
    -import java.util.Queue;
    -import java.util.concurrent.CompletableFuture;
    -import java.util.concurrent.ExecutionException;
    -import io.sentrius.sso.automation.auditing.SessionTokenEvaluator;
    -import io.sentrius.sso.automation.auditing.Trigger;
    -import io.sentrius.sso.automation.auditing.TriggerAction;
    -import io.sentrius.sso.core.config.SystemOptions;
    -import io.sentrius.sso.core.model.ConnectedSystem;
    -import io.sentrius.sso.core.services.openai.OpenAITerminalService;
    -import io.sentrius.sso.core.services.terminal.SessionTrackingService;
    -import io.sentrius.sso.protobuf.Session;
    -import lombok.extern.slf4j.Slf4j;
    -
    -<span class="nc" id="L18">@Slf4j</span>
    -<span class="nc" id="L19">public class OpenAISessionRule extends SessionTokenEvaluator {</span>
    -
    -    private static final String DESCRIPTION = &quot;Automated AI monitoring has identifed concerning system activity. &quot; +
    -        &quot;Please standby while we request two party monitoring of your session to proceed..&quot;;
    -<span class="nc" id="L23">    private static final String CLASS_NAME = OpenAISessionRule.class.getName();</span>
    -    private ConnectedSystem connectedSystem;
    -    private SessionTrackingService sessionTrackingService;
    -
    -<span class="nc" id="L27">    private long buffer = 10;</span>
    -<span class="nc" id="L28">    private long commandsToEvaluate = 5;</span>
    -
    -
    -    // Rolling list of last 10 commands
    -<span class="nc" id="L32">    private final Queue&lt;String&gt; recentCommands = new LinkedList&lt;&gt;();</span>
    -
    -    // Flag to indicate malicious activity
    -<span class="nc" id="L35">    private volatile boolean flaggedAsMalicious = false;</span>
    -
    -    @Override
    -    public void setConnectedSystem(ConnectedSystem connectedSystem) {
    -<span class="nc" id="L39">        this.connectedSystem = connectedSystem;</span>
    -<span class="nc" id="L40">    }</span>
    -
    -    @Override
    -    public void setTrackingService(SessionTrackingService sessionTrackingService) {
    -<span class="nc" id="L44">        this.sessionTrackingService = sessionTrackingService;</span>
    -<span class="nc" id="L45">    }</span>
    -
    -    @Override
    -    public Optional&lt;Trigger&gt; trigger(String command) {
    -<span class="nc" id="L49">        var openAi = pluggableServices.get(&quot;openai&quot;);</span>
    -<span class="nc bnc" id="L50" title="All 2 branches missed.">        if (null == openAi) {</span>
    -<span class="nc" id="L51">            log.info(&quot;no open ai integration&quot;);</span>
    -<span class="nc" id="L52">            Trigger trg = new Trigger(TriggerAction.NO_ACTION, &quot;&quot;);</span>
    -<span class="nc" id="L53">            return Optional.of(trg);</span>
    -        }
    -        // Add command to the rolling list
    -<span class="nc bnc" id="L56" title="All 2 branches missed.">        if (recentCommands.size() &gt;= buffer) {</span>
    -<span class="nc" id="L57">            recentCommands.poll(); // Remove the oldest command</span>
    -        }
    -<span class="nc" id="L59">        recentCommands.offer(command);</span>
    -
    -
    -<span class="nc bnc" id="L62" title="All 2 branches missed.">        if (recentCommands.size() &lt; commandsToEvaluate) {</span>
    -<span class="nc" id="L63">            log.info(&quot;Insufficient commands for analysis&quot;);</span>
    -<span class="nc" id="L64">            Trigger trg = new Trigger(TriggerAction.NO_ACTION, &quot;&quot;);</span>
    -<span class="nc" id="L65">            return Optional.of(trg);</span>
    -        }
    -
    -        // Merge recent commands into a single payload
    -<span class="nc" id="L69">        String mergedCommands = String.join(&quot;\n&quot;, recentCommands);</span>
    -<span class="nc" id="L70">        log.info(&quot;merged commands: {}&quot;, mergedCommands);</span>
    -        // Submit merged commands for asynchronous analysis
    -<span class="nc" id="L72">        CompletableFuture&lt;Void&gt; analysis =</span>
    -<span class="nc" id="L73">            ((OpenAITerminalService)openAi).analyzeTerminalLogs(mergedCommands).thenAccept(isMalicious -&gt; {</span>
    -<span class="nc" id="L74">                log.info(&quot;OpenAI analysis completed. Malicious: {}&quot;, isMalicious);</span>
    -<span class="nc bnc" id="L75" title="All 2 branches missed.">                if (isMalicious) {</span>
    -<span class="nc" id="L76">                    flaggedAsMalicious = true;</span>
    -                }
    -<span class="nc" id="L78">            });</span>
    -
    -        try {
    -<span class="nc" id="L81">            analysis.get();</span>
    -<span class="nc" id="L82">        } catch (InterruptedException e) {</span>
    -<span class="nc" id="L83">            log.info(&quot;OpenAI analysis interrupted&quot;);</span>
    -<span class="nc" id="L84">            e.printStackTrace();</span>
    -<span class="nc" id="L85">            throw new RuntimeException(e);</span>
    -<span class="nc" id="L86">        } catch (ExecutionException e) {</span>
    -<span class="nc" id="L87">            e.printStackTrace();</span>
    -<span class="nc" id="L88">            throw new RuntimeException(e);</span>
    -<span class="nc" id="L89">        }</span>
    -
    -<span class="nc" id="L91">        Trigger trg = new Trigger(TriggerAction.NO_ACTION, &quot;&quot;);</span>
    -<span class="nc" id="L92">        return Optional.of(trg);</span>
    -    }
    -
    -    @Override
    -    public boolean configure(SystemOptions systemOptions, String configuration) {
    -<span class="nc" id="L97">        return false;</span>
    -    }
    -
    -    @Override
    -    public TriggerAction describeAction() {
    -<span class="nc" id="L102">        return TriggerAction.JIT_ACTION;</span>
    -    }
    -
    -    @Override
    -    public boolean requiresSanitized() {
    -<span class="nc" id="L107">        return false;</span>
    -    }
    -
    -    @Override
    -    public Optional&lt;Trigger&gt; onMessage(Session.TerminalMessage text) {
    -        // Return a trigger based on current state
    -<span class="nc" id="L113">        log.info(&quot;flagged as malicious: {}&quot;, flaggedAsMalicious);</span>
    -<span class="nc bnc" id="L114" title="All 6 branches missed.">        if ((connectedSystem.getWebsocketListenerSessionId() == null || connectedSystem.getWebsocketListenerSessionId().isEmpty() ) &amp;&amp; flaggedAsMalicious) {</span>
    -<span class="nc" id="L115">            Trigger trg = new Trigger(TriggerAction.JIT_ACTION, DESCRIPTION);</span>
    -<span class="nc" id="L116">            return Optional.of(trg);</span>
    -        }
    -<span class="nc" id="L118">        Trigger trg = new Trigger(TriggerAction.NO_ACTION, CLASS_NAME);</span>
    -<span class="nc" id="L119">        return Optional.of(trg);</span>
    -    }
    -
    -    @Override
    -    public boolean isOnlySessionRule() {
    -<span class="nc" id="L124">        return false;</span>
    -    }
    -
    -    @Override
    -    public boolean onFullCommand() {
    -<span class="nc" id="L129">        return true;</span>
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/TwoPartyAIMonitor.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/TwoPartyAIMonitor.html
    deleted file mode 100644
    index f94c9dca..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/TwoPartyAIMonitor.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TwoPartyAIMonitor</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.automation.auditing.rules</a> &gt; <span class="el_class">TwoPartyAIMonitor</span></div><h1>TwoPartyAIMonitor</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">541 of 541</td><td class="ctr2">0%</td><td class="bar">62 of 62</td><td class="ctr2">0%</td><td class="ctr1">44</td><td class="ctr2">44</td><td class="ctr1">114</td><td class="ctr2">114</td><td class="ctr1">13</td><td class="ctr2">13</td></tr></tfoot><tbody><tr><td id="a11"><a href="TwoPartyAIMonitor.java.html#L55" class="el_method">trigger(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="213" alt="213"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="20" alt="20"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">11</td><td class="ctr2" id="g0">11</td><td class="ctr1" id="h0">43</td><td class="ctr2" id="i0">43</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a6"><a href="TwoPartyAIMonitor.java.html#L156" class="el_method">onMessage(Session.TerminalMessage)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="83" height="10" title="149" alt="149"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="20" alt="20"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">11</td><td class="ctr2" id="g1">11</td><td class="ctr1" id="h1">30</td><td class="ctr2" id="i1">30</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a3"><a href="TwoPartyAIMonitor.java.html#L169" class="el_method">lambda$onMessage$1(LLMResponse)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="27" height="10" title="48" alt="48"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="72" height="10" title="12" alt="12"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f2">7</td><td class="ctr2" id="g2">7</td><td class="ctr1" id="h3">8</td><td class="ctr2" id="i3">8</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a4"><a href="TwoPartyAIMonitor.java.html#L98" class="el_method">lambda$trigger$0(LLMResponse)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="25" height="10" title="46" alt="46"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="10" alt="10"/></td><td class="ctr2" id="e3">0%</td><td class="ctr1" id="f3">6</td><td class="ctr2" id="g3">6</td><td class="ctr1" id="h4">8</td><td class="ctr2" id="i4">8</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a12"><a href="TwoPartyAIMonitor.java.html#L21" class="el_method">TwoPartyAIMonitor()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="21" height="10" title="38" alt="38"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h2">10</td><td class="ctr2" id="i2">10</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a0"><a href="TwoPartyAIMonitor.java.html#L135" class="el_method">configure(SystemOptions, String)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="24" alt="24"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">5</td><td class="ctr2" id="i5">5</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a10"><a href="TwoPartyAIMonitor.java.html#L20" class="el_method">static {...}</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="7" alt="7"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">2</td><td class="ctr2" id="i6">2</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a8"><a href="TwoPartyAIMonitor.java.html#L45" class="el_method">setConnectedSystem(ConnectedSystem)</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="4" alt="4"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">2</td><td class="ctr2" id="i7">2</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a9"><a href="TwoPartyAIMonitor.java.html#L50" class="el_method">setTrackingService(SessionTrackingService)</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="4" alt="4"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">2</td><td class="ctr2" id="i8">2</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a1"><a href="TwoPartyAIMonitor.java.html#L145" class="el_method">describeAction()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="1" height="10" title="2" alt="2"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a7"><a href="TwoPartyAIMonitor.java.html#L150" class="el_method">requiresSanitized()</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="1" height="10" title="2" alt="2"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr><tr><td id="a2"><a href="TwoPartyAIMonitor.java.html#L222" class="el_method">isOnlySessionRule()</a></td><td class="bar" id="b11"><img src="../jacoco-resources/redbar.gif" width="1" height="10" title="2" alt="2"/></td><td class="ctr2" id="c11">0%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f11">1</td><td class="ctr2" id="g11">1</td><td class="ctr1" id="h11">1</td><td class="ctr2" id="i11">1</td><td class="ctr1" id="j11">1</td><td class="ctr2" id="k11">1</td></tr><tr><td id="a5"><a href="TwoPartyAIMonitor.java.html#L227" class="el_method">onFullCommand()</a></td><td class="bar" id="b12"><img src="../jacoco-resources/redbar.gif" width="1" height="10" title="2" alt="2"/></td><td class="ctr2" id="c12">0%</td><td class="bar" id="d12"/><td class="ctr2" id="e12">n/a</td><td class="ctr1" id="f12">1</td><td class="ctr2" id="g12">1</td><td class="ctr1" id="h12">1</td><td class="ctr2" id="i12">1</td><td class="ctr1" id="j12">1</td><td class="ctr2" id="k12">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/TwoPartyAIMonitor.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/TwoPartyAIMonitor.java.html
    deleted file mode 100644
    index ee55f6cd..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/TwoPartyAIMonitor.java.html
    +++ /dev/null
    @@ -1,230 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TwoPartyAIMonitor.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.automation.auditing.rules</a> &gt; <span class="el_source">TwoPartyAIMonitor.java</span></div><h1>TwoPartyAIMonitor.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.automation.auditing.rules;
    -
    -import java.util.LinkedList;
    -import java.util.Optional;
    -import java.util.Queue;
    -import java.util.concurrent.CompletableFuture;
    -import java.util.concurrent.ExecutionException;
    -import java.util.concurrent.atomic.AtomicReference;
    -import io.sentrius.sso.automation.auditing.SessionTokenEvaluator;
    -import io.sentrius.sso.automation.auditing.Trigger;
    -import io.sentrius.sso.automation.auditing.TriggerAction;
    -import io.sentrius.sso.core.config.SystemOptions;
    -import io.sentrius.sso.core.model.ConnectedSystem;
    -import io.sentrius.sso.core.services.openai.OpenAITwoPartyMonitorService;
    -import io.sentrius.sso.core.services.terminal.SessionTrackingService;
    -import io.sentrius.sso.genai.model.TwoPartyRequest;
    -import io.sentrius.sso.protobuf.Session;
    -import lombok.extern.slf4j.Slf4j;
    -
    -<span class="nc" id="L20">@Slf4j</span>
    -<span class="nc" id="L21">public class TwoPartyAIMonitor extends SessionTokenEvaluator {</span>
    -
    -    private static final String DESCRIPTION = &quot;Automated AI monitoring has identifed concerning system activity. &quot; +
    -        &quot;Please standby while we request two party monitoring of your session to proceed..&quot;;
    -<span class="nc" id="L25">    private static final String CLASS_NAME = TwoPartyAIMonitor.class.getName();</span>
    -    private ConnectedSystem connectedSystem;
    -    private SessionTrackingService sessionTrackingService;
    -
    -<span class="nc" id="L29">    private long buffer = 10;</span>
    -<span class="nc" id="L30">    private long commandsToEvaluate = 5;</span>
    -<span class="nc" id="L31">    private double aiRiskThreshold = 0.8;</span>
    -<span class="nc" id="L32">    private boolean enableLLMQuestions = false;</span>
    -
    -    // Rolling list of last 10 commands
    -<span class="nc" id="L35">    private final Queue&lt;String&gt; recentCommands = new LinkedList&lt;&gt;();</span>
    -
    -    // Flag to indicate malicious activity
    -<span class="nc" id="L38">    private AtomicReference&lt;String&gt; llmResponse = new AtomicReference&lt;&gt;(null);</span>
    -<span class="nc" id="L39">    private AtomicReference&lt;String&gt; llmQuestion = new AtomicReference&lt;&gt;(null);</span>
    -<span class="nc" id="L40">    private volatile boolean flaggedAsMalicious = false;</span>
    -<span class="nc" id="L41">    private volatile long lastCommandTime = 0;</span>
    -
    -    @Override
    -    public void setConnectedSystem(ConnectedSystem connectedSystem) {
    -<span class="nc" id="L45">        this.connectedSystem = connectedSystem;</span>
    -<span class="nc" id="L46">    }</span>
    -
    -    @Override
    -    public void setTrackingService(SessionTrackingService sessionTrackingService) {
    -<span class="nc" id="L50">        this.sessionTrackingService = sessionTrackingService;</span>
    -<span class="nc" id="L51">    }</span>
    -
    -    @Override
    -    public Optional&lt;Trigger&gt; trigger(String cmd) {
    -<span class="nc" id="L55">        var command = cmd.trim();</span>
    -<span class="nc bnc" id="L56" title="All 2 branches missed.">        if (command.isEmpty()) {</span>
    -<span class="nc" id="L57">            log.info(&quot;Empty command No analysis&quot;);</span>
    -            Trigger
    -<span class="nc bnc" id="L59" title="All 2 branches missed.">                trg = new Trigger(TriggerAction.PERSISTENT_MESSAGE, llmResponse.get() != null ? llmResponse.get() : &quot;&quot;);</span>
    -<span class="nc" id="L60">            return Optional.of(trg);</span>
    -        }
    -<span class="nc" id="L62">        var openAi = pluggableServices.get(&quot;openaitwoparty&quot;);</span>
    -<span class="nc bnc" id="L63" title="All 2 branches missed.">        if (null == openAi) {</span>
    -<span class="nc" id="L64">            log.info(&quot;no open ai integration&quot;);</span>
    -<span class="nc" id="L65">            Trigger trg = new Trigger(TriggerAction.NO_ACTION, &quot;&quot;);</span>
    -<span class="nc" id="L66">            return Optional.of(trg);</span>
    -        }
    -        // Add command to the rolling list
    -<span class="nc bnc" id="L69" title="All 2 branches missed.">        if (recentCommands.size() &gt;= buffer) {</span>
    -<span class="nc" id="L70">            recentCommands.poll(); // Remove the oldest command</span>
    -        }
    -<span class="nc" id="L72">        recentCommands.offer(command);</span>
    -
    -
    -<span class="nc bnc" id="L75" title="All 2 branches missed.">        if (recentCommands.size() &lt; commandsToEvaluate) {</span>
    -<span class="nc" id="L76">            log.info(&quot;Insufficient commands for analysis&quot;);</span>
    -<span class="nc bnc" id="L77" title="All 2 branches missed.">            Trigger trg = new Trigger(TriggerAction.PERSISTENT_MESSAGE, llmResponse.get() != null ? llmResponse.get() : &quot;&quot;);</span>
    -<span class="nc" id="L78">            return Optional.of(trg);</span>
    -        }
    -
    -<span class="nc bnc" id="L81" title="All 2 branches missed.">        if (System.currentTimeMillis() - lastCommandTime &lt; 10000) {</span>
    -<span class="nc" id="L82">            log.info(&quot;Insufficient time between commands for analysis&quot;);</span>
    -
    -<span class="nc bnc" id="L84" title="All 2 branches missed.">            Trigger trg = new Trigger(TriggerAction.PERSISTENT_MESSAGE, llmResponse.get() != null ? llmResponse.get() : &quot;&quot;);</span>
    -<span class="nc" id="L85">            lastCommandTime = System.currentTimeMillis();</span>
    -<span class="nc" id="L86">            return Optional.of(trg);</span>
    -        }
    -        else {
    -<span class="nc" id="L89">            lastCommandTime = System.currentTimeMillis();</span>
    -        }
    -
    -        // Merge recent commands into a single payload
    -<span class="nc" id="L93">        String mergedCommands = String.join(&quot;\n&quot;, recentCommands);</span>
    -<span class="nc" id="L94">        log.debug(&quot;merged commands: {}&quot;, mergedCommands);</span>
    -        // Submit merged commands for asynchronous analysis
    -<span class="nc" id="L96">        CompletableFuture&lt;Void&gt; analysis =</span>
    -<span class="nc" id="L97">            ((OpenAITwoPartyMonitorService)openAi).analyzeTerminalLogs(TwoPartyRequest.builder().userInput(mergedCommands).build()).thenAccept(response -&gt; {</span>
    -<span class="nc" id="L98">                log.info(&quot;OpenAI analysis completed. Malicious: {}&quot;, response);</span>
    -<span class="nc bnc" id="L99" title="All 2 branches missed.">                if (response != null) {</span>
    -<span class="nc bnc" id="L100" title="All 2 branches missed.">                    flaggedAsMalicious = response.getScore()&gt; aiRiskThreshold;</span>
    -<span class="nc" id="L101">                    llmResponse.set(response.getResponse());</span>
    -<span class="nc bnc" id="L102" title="All 6 branches missed.">                    if (response.getQuestion() != null &amp;&amp; !flaggedAsMalicious &amp;&amp; response.getScore()&gt;=0.75){</span>
    -<span class="nc" id="L103">                        llmQuestion.set(response.getQuestion());</span>
    -                    }
    -                    else {
    -<span class="nc" id="L106">                        llmQuestion.set(null);</span>
    -                    }
    -                }
    -<span class="nc" id="L109">            });</span>
    -
    -        try {
    -<span class="nc" id="L112">            analysis.get();</span>
    -<span class="nc" id="L113">        } catch (InterruptedException e) {</span>
    -<span class="nc" id="L114">            log.info(&quot;OpenAI analysis interrupted&quot;);</span>
    -<span class="nc" id="L115">            e.printStackTrace();</span>
    -<span class="nc" id="L116">            throw new RuntimeException(e);</span>
    -<span class="nc" id="L117">        } catch (ExecutionException e) {</span>
    -<span class="nc" id="L118">            e.printStackTrace();</span>
    -<span class="nc" id="L119">            throw new RuntimeException(e);</span>
    -<span class="nc" id="L120">        }</span>
    -
    -<span class="nc bnc" id="L122" title="All 2 branches missed.">        if (llmResponse.get() != null) {</span>
    -<span class="nc bnc" id="L123" title="All 2 branches missed.">            Trigger trg = llmQuestion.get() != null ? new Trigger(TriggerAction.PROMPT_ACTION, llmResponse.get(),</span>
    -<span class="nc" id="L124">                llmQuestion.get()) :</span>
    -<span class="nc" id="L125">                new Trigger(TriggerAction.PERSISTENT_MESSAGE, llmResponse.get());</span>
    -<span class="nc" id="L126">            return Optional.of(trg);</span>
    -        }
    -
    -<span class="nc" id="L129">        Trigger trg = new Trigger(TriggerAction.PERSISTENT_MESSAGE, &quot;&quot;);</span>
    -<span class="nc" id="L130">        return Optional.of(trg);</span>
    -    }
    -
    -    @Override
    -    public boolean configure(SystemOptions systemOptions, String configuration) {
    -<span class="nc" id="L135">        commandsToEvaluate = systemOptions.getCommandsToEvaluate();</span>
    -<span class="nc" id="L136">        buffer = systemOptions.getCommandsToBuffer();</span>
    -<span class="nc" id="L137">        aiRiskThreshold = systemOptions.getAiRiskThreshold();</span>
    -<span class="nc" id="L138">        enableLLMQuestions = systemOptions.getEnableLLMQuestions();</span>
    -<span class="nc" id="L139">        return true;</span>
    -
    -    }
    -
    -    @Override
    -    public TriggerAction describeAction() {
    -<span class="nc" id="L145">        return TriggerAction.WARN_ACTION;</span>
    -    }
    -
    -    @Override
    -    public boolean requiresSanitized() {
    -<span class="nc" id="L150">        return false;</span>
    -    }
    -
    -    @Override
    -    public Optional&lt;Trigger&gt; onMessage(Session.TerminalMessage text) {
    -        // Return a trigger based on current state
    -<span class="nc bnc" id="L156" title="All 2 branches missed.">        if (text.getType() == Session.MessageType.USER_PROMPT) {</span>
    -<span class="nc" id="L157">            log.info(&quot;*** response&quot;);</span>
    -<span class="nc" id="L158">            var openAi = pluggableServices.get(&quot;openaitwoparty&quot;);</span>
    -<span class="nc bnc" id="L159" title="All 2 branches missed.">            if (null == openAi) {</span>
    -<span class="nc" id="L160">                log.info(&quot;no open ai integration&quot;);</span>
    -<span class="nc" id="L161">                Trigger trg = new Trigger(TriggerAction.NO_ACTION, &quot;&quot;);</span>
    -<span class="nc" id="L162">                return Optional.of(trg);</span>
    -            }
    -
    -<span class="nc" id="L165">            String mergedCommands = String.join(&quot;\n&quot;, recentCommands);</span>
    -
    -<span class="nc" id="L167">            CompletableFuture&lt;Void&gt; analysis =</span>
    -<span class="nc" id="L168">                ((OpenAITwoPartyMonitorService)openAi).analyzeTerminalLogs(TwoPartyRequest.builder().previousPrompt(text.getCommand()).promptResponse(text.getPrompt()).userInput(mergedCommands).build()).thenAccept(response -&gt; {</span>
    -<span class="nc" id="L169">                    log.info(&quot;From user response: OpenAI analysis completed. Malicious: {}&quot;, response);</span>
    -<span class="nc bnc" id="L170" title="All 2 branches missed.">                    if (response != null) {</span>
    -<span class="nc bnc" id="L171" title="All 2 branches missed.">                        flaggedAsMalicious = response.getScore()&gt;0.8;</span>
    -<span class="nc" id="L172">                        llmResponse.set(response.getResponse());</span>
    -<span class="nc bnc" id="L173" title="All 8 branches missed.">                        if (response.getQuestion() != null &amp;&amp; !flaggedAsMalicious &amp;&amp; response.getScore()&gt;=0.75 &amp;&amp; enableLLMQuestions) {</span>
    -<span class="nc" id="L174">                            llmQuestion.set(response.getQuestion());</span>
    -                        }
    -                        else {
    -<span class="nc" id="L177">                            llmQuestion.set(null);</span>
    -                        }
    -                    }
    -<span class="nc" id="L180">                });</span>
    -
    -            try {
    -<span class="nc" id="L183">                analysis.get();</span>
    -
    -<span class="nc bnc" id="L185" title="All 4 branches missed.">                if (llmResponse.get() != null &amp;&amp; llmQuestion.get() != null) {</span>
    -<span class="nc bnc" id="L186" title="All 4 branches missed.">                    Trigger trg = llmQuestion.get() != null &amp;&amp; enableLLMQuestions ? new Trigger(TriggerAction.PROMPT_ACTION,</span>
    -<span class="nc" id="L187">                        llmResponse.get(),</span>
    -<span class="nc" id="L188">                        llmQuestion.get()) :</span>
    -<span class="nc" id="L189">                        new Trigger(TriggerAction.PERSISTENT_MESSAGE, llmResponse.get());</span>
    -<span class="nc" id="L190">                    return Optional.of(trg);</span>
    -                }
    -
    -<span class="nc" id="L193">            } catch (InterruptedException e) {</span>
    -<span class="nc" id="L194">                throw new RuntimeException(e);</span>
    -<span class="nc" id="L195">            } catch (ExecutionException e) {</span>
    -<span class="nc" id="L196">                throw new RuntimeException(e);</span>
    -<span class="nc" id="L197">            }</span>
    -        }
    -<span class="nc bnc" id="L199" title="All 6 branches missed.">        if ((connectedSystem.getWebsocketListenerSessionId() == null || connectedSystem.getWebsocketListenerSessionId().isEmpty() ) &amp;&amp; flaggedAsMalicious) {</span>
    -<span class="nc bnc" id="L200" title="All 2 branches missed.">            if (llmQuestion.get()!= null){</span>
    -<span class="nc" id="L201">                Trigger trg = new Trigger(TriggerAction.PROMPT_ACTION, DESCRIPTION);</span>
    -<span class="nc" id="L202">                return Optional.of(trg);</span>
    -            }
    -            else {
    -<span class="nc" id="L205">                Trigger trg = new Trigger(TriggerAction.JIT_ACTION, DESCRIPTION);</span>
    -<span class="nc" id="L206">                return Optional.of(trg);</span>
    -            }
    -        }
    -        /*
    -        if (llmResponse.get() != null) {
    -            log.info(&quot;OpenAI analysis completed. not malicious but have an llm response: {}&quot;, llmResponse.get());
    -            Trigger trg = new Trigger(TriggerAction.WARN_ACTION, llmResponse.get());
    -            return Optional.of(trg);
    -        }else {*/
    -<span class="nc" id="L215">            Trigger trg = new Trigger(TriggerAction.NO_ACTION, CLASS_NAME);</span>
    -<span class="nc" id="L216">            return Optional.of(trg);</span>
    -//        }
    -    }
    -
    -    @Override
    -    public boolean isOnlySessionRule() {
    -<span class="nc" id="L222">        return false;</span>
    -    }
    -
    -    @Override
    -    public boolean onFullCommand() {
    -<span class="nc" id="L227">        return true;</span>
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/index.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/index.html
    deleted file mode 100644
    index d0971a0b..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.automation.auditing.rules</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.automation.auditing.rules</span></div><h1>io.sentrius.sso.automation.auditing.rules</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">737 of 737</td><td class="ctr2">0%</td><td class="bar">76 of 76</td><td class="ctr2">0%</td><td class="ctr1">63</td><td class="ctr2">63</td><td class="ctr1">167</td><td class="ctr2">167</td><td class="ctr1">25</td><td class="ctr2">25</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="TwoPartyAIMonitor.html" class="el_class">TwoPartyAIMonitor</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="541" alt="541"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="62" alt="62"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">44</td><td class="ctr2" id="g0">44</td><td class="ctr1" id="h0">114</td><td class="ctr2" id="i0">114</td><td class="ctr1" id="j0">13</td><td class="ctr2" id="k0">13</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="OpenAISessionRule.html" class="el_class">OpenAISessionRule</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="43" height="10" title="196" alt="196"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="27" height="10" title="14" alt="14"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">19</td><td class="ctr2" id="g1">19</td><td class="ctr1" id="h1">53</td><td class="ctr2" id="i1">53</td><td class="ctr1" id="j1">12</td><td class="ctr2" id="k1">12</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/index.source.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/index.source.html
    deleted file mode 100644
    index 3a6c16b5..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.automation.auditing.rules/index.source.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.automation.auditing.rules</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.automation.auditing.rules</span></div><h1>io.sentrius.sso.automation.auditing.rules</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">737 of 737</td><td class="ctr2">0%</td><td class="bar">76 of 76</td><td class="ctr2">0%</td><td class="ctr1">63</td><td class="ctr2">63</td><td class="ctr1">167</td><td class="ctr2">167</td><td class="ctr1">25</td><td class="ctr2">25</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="TwoPartyAIMonitor.java.html" class="el_source">TwoPartyAIMonitor.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="541" alt="541"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="62" alt="62"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">44</td><td class="ctr2" id="g0">44</td><td class="ctr1" id="h0">114</td><td class="ctr2" id="i0">114</td><td class="ctr1" id="j0">13</td><td class="ctr2" id="k0">13</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="OpenAISessionRule.java.html" class="el_source">OpenAISessionRule.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="43" height="10" title="196" alt="196"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="27" height="10" title="14" alt="14"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">19</td><td class="ctr2" id="g1">19</td><td class="ctr1" id="h1">53</td><td class="ctr2" id="i1">53</td><td class="ctr1" id="j1">12</td><td class="ctr2" id="k1">12</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandCategorizer.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandCategorizer.html
    deleted file mode 100644
    index b2b4c118..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandCategorizer.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>CommandCategorizer</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a> &gt; <span class="el_class">CommandCategorizer</span></div><h1>CommandCategorizer</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">172 of 172</td><td class="ctr2">0%</td><td class="bar">6 of 6</td><td class="ctr2">0%</td><td class="ctr1">11</td><td class="ctr2">11</td><td class="ctr1">45</td><td class="ctr2">45</td><td class="ctr1">8</td><td class="ctr2">8</td></tr></tfoot><tbody><tr><td id="a2"><a href="CommandCategorizer.java.html#L73" class="el_method">categorizeWithRulesOrML(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="103" alt="103"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">26</td><td class="ctr2" id="i0">26</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="CommandCategorizer.java.html#L28" class="el_method">CommandCategorizer(IntegrationSecurityTokenService, CommandCategoryRepository)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="18" alt="18"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">5</td><td class="ctr2" id="i1">5</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a4"><a href="CommandCategorizer.java.html#L44" class="el_method">fetchFromDatabase(String)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="16" height="10" title="14" alt="14"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">4</td><td class="ctr2" id="i2">4</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a0"><a href="CommandCategorizer.java.html#L118" class="el_method">addCommandCategory(String, CommandCategoryDTO)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="12" alt="12"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h4">3</td><td class="ctr2" id="i4">3</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a1"><a href="CommandCategorizer.java.html#L53" class="el_method">categorizeCommand(String)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="8" alt="8"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a6"><a href="CommandCategorizer.java.html#L63" class="el_method">isValidRegex(String)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="8" alt="8"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h3">4</td><td class="ctr2" id="i3">4</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a5"><a href="CommandCategorizer.java.html#L57" class="el_method">getDBCommandCategory(String)</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="5" alt="5"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a7"><a href="CommandCategorizer.java.html#L26" class="el_method">static {...}</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="4" alt="4"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandCategorizer.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandCategorizer.java.html
    deleted file mode 100644
    index 1c70f6d5..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandCategorizer.java.html
    +++ /dev/null
    @@ -1,122 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>CommandCategorizer.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a> &gt; <span class="el_source">CommandCategorizer.java</span></div><h1>CommandCategorizer.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.core.services.openai.categorization;
    -
    -import java.util.Comparator;
    -import java.util.List;
    -import java.util.concurrent.TimeUnit;
    -import java.util.regex.Pattern;
    -import java.util.regex.PatternSyntaxException;
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import com.github.benmanes.caffeine.cache.Cache;
    -import com.github.benmanes.caffeine.cache.Caffeine;
    -import io.sentrius.sso.core.dto.CommandCategoryDTO;
    -import io.sentrius.sso.core.model.categorization.CommandCategory;
    -import io.sentrius.sso.core.repository.CommandCategoryRepository;
    -import io.sentrius.sso.core.services.security.IntegrationSecurityTokenService;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.GenerativeAPI;
    -import io.sentrius.sso.genai.GeneratorConfiguration;
    -import io.sentrius.sso.genai.LLMCommandCategorizer;
    -import io.sentrius.sso.core.integrations.external.ExternalIntegrationDTO;
    -import io.sentrius.sso.security.ApiKey;
    -import jakarta.transaction.Transactional;
    -import lombok.RequiredArgsConstructor;
    -import lombok.extern.slf4j.Slf4j;
    -import org.springframework.stereotype.Service;
    -
    -<span class="nc" id="L26">@Slf4j</span>
    -@Service
    -<span class="nc" id="L28">@RequiredArgsConstructor</span>
    -public class CommandCategorizer {
    -
    -    private final IntegrationSecurityTokenService integrationSecurityTokenService;
    -
    -    private final CommandCategoryRepository commandCategoryRepository;
    -
    -
    -<span class="nc" id="L36">    private final Cache&lt;String, CommandCategoryDTO&gt; commandCache = Caffeine.newBuilder()</span>
    -<span class="nc" id="L37">        .maximumSize(1000)</span>
    -<span class="nc" id="L38">        .expireAfterWrite(1, TimeUnit.HOURS)</span>
    -<span class="nc" id="L39">        .build();</span>
    -
    -
    -
    -    private CommandCategory fetchFromDatabase(String command) {
    -<span class="nc" id="L44">        List&lt;CommandCategory&gt; matchingCategories = commandCategoryRepository.findMatchingCategories(command);</span>
    -<span class="nc" id="L45">        return matchingCategories.stream()</span>
    -<span class="nc" id="L46">            .min(Comparator.comparingInt(CommandCategory::getPriority))</span>
    -<span class="nc" id="L47">            .orElse(null);</span>
    -    }
    -
    -
    -    @Transactional
    -    public CommandCategoryDTO categorizeCommand(String command) {
    -<span class="nc" id="L53">        return commandCache.get(command, this::categorizeWithRulesOrML);</span>
    -    }
    -
    -    protected List&lt;CommandCategory&gt; getDBCommandCategory(String command){
    -<span class="nc" id="L57">        return commandCategoryRepository.findByPattern(command);</span>
    -    }
    -
    -
    -    public boolean isValidRegex(String regex) {
    -        try {
    -<span class="nc" id="L63">            Pattern.compile(regex);</span>
    -<span class="nc" id="L64">            return true; // Valid regex</span>
    -<span class="nc" id="L65">        } catch (PatternSyntaxException e) {</span>
    -<span class="nc" id="L66">            return false; // Invalid regex</span>
    -        }
    -    }
    -
    -
    -    @Transactional
    -    protected CommandCategoryDTO categorizeWithRulesOrML(String command) {
    -<span class="nc" id="L73">        CommandCategoryDTO category = fetchFromDatabase(command).toDTO();</span>
    -<span class="nc bnc" id="L74" title="All 2 branches missed.">        if (category != null) {</span>
    -<span class="nc" id="L75">            log.info(&quot;Found command category {} for {} &quot;, category, command);</span>
    -<span class="nc" id="L76">            return category;</span>
    -        }
    -        
    -<span class="nc" id="L79">        var openaiService = integrationSecurityTokenService.findByConnectionType(&quot;openai&quot;).stream().findFirst().orElse(null);</span>
    -
    -<span class="nc bnc" id="L81" title="All 2 branches missed.">        if (null != openaiService){</span>
    -<span class="nc" id="L82">            log.info(&quot;OpenAI service is available&quot;);</span>
    -<span class="nc" id="L83">            ExternalIntegrationDTO externalIntegrationDTO = null;</span>
    -            try {
    -<span class="nc" id="L85">                externalIntegrationDTO = JsonUtil.MAPPER.readValue(openaiService.getConnectionInfo(),</span>
    -                    ExternalIntegrationDTO.class);
    -<span class="nc" id="L87">            } catch (JsonProcessingException e) {</span>
    -<span class="nc" id="L88">                throw new RuntimeException(e);</span>
    -<span class="nc" id="L89">            }</span>
    -            ApiKey key =
    -<span class="nc" id="L91">                ApiKey.builder().apiKey(externalIntegrationDTO.getApiToken()).principal(externalIntegrationDTO.getUsername()).build();</span>
    -
    -<span class="nc" id="L93">            var commandCategorizer = new LLMCommandCategorizer(key, new GenerativeAPI(key), GeneratorConfiguration.builder().build());</span>
    -
    -            try {
    -<span class="nc" id="L96">                category = commandCategorizer.generate(command);</span>
    -
    -<span class="nc bnc" id="L98" title="All 2 branches missed.">                if (isValidRegex(category.getPattern())) {</span>
    -<span class="nc" id="L99">                    addCommandCategory(category.getPattern(), category);</span>
    -                }
    -<span class="nc" id="L101">                log.info(&quot;Categorized command: {}&quot;, category);</span>
    -<span class="nc" id="L102">                return category;</span>
    -<span class="nc" id="L103">            } catch (Exception e) {</span>
    -<span class="nc" id="L104">                e.printStackTrace();</span>
    -<span class="nc" id="L105">                log.error(&quot;Error categorizing command&quot;, e);</span>
    -            }
    -
    -<span class="nc" id="L108">        } else {</span>
    -<span class="nc" id="L109">            log.info(&quot;OpenAI service is not enabled&quot;);</span>
    -        }
    -
    -<span class="nc" id="L112">        log.info(&quot;Finished processing terminal commands&quot;);</span>
    -
    -<span class="nc" id="L114">        return CommandCategoryDTO.builder().build();</span>
    -    }
    -
    -    private void addCommandCategory(String pattern, CommandCategoryDTO category) {
    -<span class="nc" id="L118">        commandCategoryRepository.save(CommandCategory.fromDTO(category));</span>
    -<span class="nc" id="L119">        commandCache.put(pattern, category);</span>
    -<span class="nc" id="L120">    }</span>
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandTrie.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandTrie.html
    deleted file mode 100644
    index e47acbb8..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandTrie.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>CommandTrie</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a> &gt; <span class="el_class">CommandTrie</span></div><h1>CommandTrie</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">179 of 179</td><td class="ctr2">0%</td><td class="bar">18 of 18</td><td class="ctr2">0%</td><td class="ctr1">16</td><td class="ctr2">16</td><td class="ctr1">36</td><td class="ctr2">36</td><td class="ctr1">7</td><td class="ctr2">7</td></tr></tfoot><tbody><tr><td id="a5"><a href="CommandTrie.java.html#L44" class="el_method">searchByPrefix(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="64" alt="64"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="8" alt="8"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">5</td><td class="ctr2" id="g0">5</td><td class="ctr1" id="h0">14</td><td class="ctr2" id="i0">14</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="CommandTrie.java.html#L15" class="el_method">insert(String, CommandCategory)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="99" height="10" title="53" alt="53"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="4" alt="4"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f2">3</td><td class="ctr2" id="g2">3</td><td class="ctr1" id="h1">11</td><td class="ctr2" id="i1">11</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a4"><a href="CommandTrie.java.html#L32" class="el_method">search(String)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="76" height="10" title="41" alt="41"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="90" height="10" title="6" alt="6"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f1">4</td><td class="ctr2" id="g1">4</td><td class="ctr1" id="h2">7</td><td class="ctr2" id="i2">7</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a0"><a href="CommandTrie.java.html#L7" class="el_method">CommandTrie()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="15" height="10" title="8" alt="8"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">2</td><td class="ctr2" id="i3">2</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a3"><a href="CommandTrie.java.html#L11" class="el_method">normalizePath(String)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="5" alt="5"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a2"><a href="CommandTrie.java.html#L19" class="el_method">lambda$insert$0(String)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a6"><a href="CommandTrie.java.html#L6" class="el_method">static {...}</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandTrie.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandTrie.java.html
    deleted file mode 100644
    index 97452349..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/CommandTrie.java.html
    +++ /dev/null
    @@ -1,71 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>CommandTrie.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a> &gt; <span class="el_source">CommandTrie.java</span></div><h1>CommandTrie.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.core.services.openai.categorization;
    -
    -import io.sentrius.sso.core.model.categorization.CommandCategory;
    -import lombok.extern.slf4j.Slf4j;
    -
    -<span class="nc" id="L6">@Slf4j</span>
    -<span class="nc" id="L7">public class CommandTrie {</span>
    -<span class="nc" id="L8">    private final TrieNode root = new TrieNode();</span>
    -
    -    private String normalizePath(String path) {
    -<span class="nc" id="L11">        return path.replaceAll(&quot;/+$&quot;, &quot;&quot;); // Remove trailing slashes</span>
    -    }
    -
    -    public void insert(String command, CommandCategory category) {
    -<span class="nc" id="L15">        String[] parts = command.split(&quot; &quot;);</span>
    -<span class="nc" id="L16">        TrieNode current = root;</span>
    -<span class="nc bnc" id="L17" title="All 2 branches missed.">        for (String part : parts) {</span>
    -<span class="nc" id="L18">            part = normalizePath(part); // Normalize each part</span>
    -<span class="nc" id="L19">            current = current.children.computeIfAbsent(part, k -&gt; new TrieNode());</span>
    -        }
    -<span class="nc" id="L21">        current.isEndOfCommand = true;</span>
    -<span class="nc bnc" id="L22" title="All 2 branches missed.">        if (category.getPattern().endsWith(&quot;*&quot;)) {</span>
    -<span class="nc" id="L23">            current.isWildcard = true;</span>
    -        }
    -        else {
    -<span class="nc" id="L26">            current.isWildcard = false;</span>
    -        }
    -<span class="nc" id="L28">        current.commandCategory = category;</span>
    -<span class="nc" id="L29">    }</span>
    -
    -    public CommandCategory search(String command) {
    -<span class="nc" id="L32">        String[] parts = command.split(&quot; &quot;);</span>
    -<span class="nc" id="L33">        TrieNode current = root;</span>
    -<span class="nc bnc" id="L34" title="All 2 branches missed.">        for (String part : parts) {</span>
    -<span class="nc" id="L35">            current = current.children.get(part);</span>
    -<span class="nc bnc" id="L36" title="All 2 branches missed.">            if (current == null) {</span>
    -<span class="nc" id="L37">                return null; // Command not found</span>
    -            }
    -        }
    -<span class="nc bnc" id="L40" title="All 2 branches missed.">        return current.isEndOfCommand ? current.commandCategory : null;</span>
    -    }
    -
    -    public CommandCategory searchByPrefix(String command) {
    -<span class="nc" id="L44">        String[] parts = command.split(&quot; &quot;);</span>
    -<span class="nc" id="L45">        TrieNode current = root;</span>
    -<span class="nc" id="L46">        CommandCategory lastCategory = null;</span>
    -
    -<span class="nc bnc" id="L48" title="All 2 branches missed.">        for (String part : parts) {</span>
    -<span class="nc" id="L49">            part = normalizePath(part); // Normalize each part</span>
    -<span class="nc" id="L50">            log.info(&quot;Searching for part: {}&quot;, part);</span>
    -
    -            // Check if the part exists in the children
    -<span class="nc bnc" id="L53" title="All 2 branches missed.">            if (current.children.containsKey(part)) {</span>
    -<span class="nc" id="L54">                current = current.children.get(part);</span>
    -<span class="nc bnc" id="L55" title="All 2 branches missed.">                if (current.isEndOfCommand) {</span>
    -<span class="nc" id="L56">                    lastCategory = current.commandCategory;</span>
    -                }
    -            } else {
    -                // If no exact match, check for wildcard match (e.g., &quot;cat /etc/&quot;)
    -<span class="nc bnc" id="L60" title="All 2 branches missed.">                if (current.isEndOfCommand) {</span>
    -<span class="nc" id="L61">                    log.info(&quot;Partial match found at: {}&quot;, part);</span>
    -<span class="nc" id="L62">                    lastCategory = current.commandCategory;</span>
    -                }
    -                break; // No further match possible
    -            }
    -        }
    -
    -<span class="nc" id="L68">        return lastCategory;</span>
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/TrieNode.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/TrieNode.html
    deleted file mode 100644
    index 11cf5878..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/TrieNode.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TrieNode</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a> &gt; <span class="el_class">TrieNode</span></div><h1>TrieNode</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">14 of 14</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">4</td><td class="ctr2">4</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="TrieNode.java.html#L7" class="el_method">TrieNode()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="14" alt="14"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">4</td><td class="ctr2" id="i0">4</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/TrieNode.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/TrieNode.java.html
    deleted file mode 100644
    index 0305d6e6..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/TrieNode.java.html
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TrieNode.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.core.services.openai.categorization</a> &gt; <span class="el_source">TrieNode.java</span></div><h1>TrieNode.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.core.services.openai.categorization;
    -
    -import java.util.HashMap;
    -import java.util.Map;
    -import io.sentrius.sso.core.model.categorization.CommandCategory;
    -
    -<span class="nc" id="L7">public class TrieNode {</span>
    -<span class="nc" id="L8">    Map&lt;String, TrieNode&gt; children = new HashMap&lt;&gt;();</span>
    -    CommandCategory commandCategory; // Store the CommandCategory at the end node
    -<span class="nc" id="L10">    boolean isEndOfCommand = false;</span>
    -<span class="nc" id="L11">    boolean isWildcard = false; // Marks this node as a wildcard</span>
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/index.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/index.html
    deleted file mode 100644
    index 79686475..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.core.services.openai.categorization</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.core.services.openai.categorization</span></div><h1>io.sentrius.sso.core.services.openai.categorization</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">365 of 365</td><td class="ctr2">0%</td><td class="bar">24 of 24</td><td class="ctr2">0%</td><td class="ctr1">28</td><td class="ctr2">28</td><td class="ctr1">85</td><td class="ctr2">85</td><td class="ctr1">16</td><td class="ctr2">16</td><td class="ctr1">3</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a1"><a href="CommandTrie.html" class="el_class">CommandTrie</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="179" alt="179"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="18" alt="18"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">16</td><td class="ctr2" id="g0">16</td><td class="ctr1" id="h1">36</td><td class="ctr2" id="i1">36</td><td class="ctr1" id="j1">7</td><td class="ctr2" id="k1">7</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="CommandCategorizer.html" class="el_class">CommandCategorizer</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="115" height="10" title="172" alt="172"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="40" height="10" title="6" alt="6"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">11</td><td class="ctr2" id="g1">11</td><td class="ctr1" id="h0">45</td><td class="ctr2" id="i0">45</td><td class="ctr1" id="j0">8</td><td class="ctr2" id="k0">8</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr><tr><td id="a2"><a href="TrieNode.html" class="el_class">TrieNode</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="14" alt="14"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">4</td><td class="ctr2" id="i2">4</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td><td class="ctr1" id="l2">1</td><td class="ctr2" id="m2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/index.source.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/index.source.html
    deleted file mode 100644
    index 870e484c..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai.categorization/index.source.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.core.services.openai.categorization</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.core.services.openai.categorization</span></div><h1>io.sentrius.sso.core.services.openai.categorization</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">365 of 365</td><td class="ctr2">0%</td><td class="bar">24 of 24</td><td class="ctr2">0%</td><td class="ctr1">28</td><td class="ctr2">28</td><td class="ctr1">85</td><td class="ctr2">85</td><td class="ctr1">16</td><td class="ctr2">16</td><td class="ctr1">3</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a1"><a href="CommandTrie.java.html" class="el_source">CommandTrie.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="179" alt="179"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="18" alt="18"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">16</td><td class="ctr2" id="g0">16</td><td class="ctr1" id="h1">36</td><td class="ctr2" id="i1">36</td><td class="ctr1" id="j1">7</td><td class="ctr2" id="k1">7</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="CommandCategorizer.java.html" class="el_source">CommandCategorizer.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="115" height="10" title="172" alt="172"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="40" height="10" title="6" alt="6"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">11</td><td class="ctr2" id="g1">11</td><td class="ctr1" id="h0">45</td><td class="ctr2" id="i0">45</td><td class="ctr1" id="j0">8</td><td class="ctr2" id="k0">8</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr><tr><td id="a2"><a href="TrieNode.java.html" class="el_source">TrieNode.java</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="14" alt="14"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">4</td><td class="ctr2" id="i2">4</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td><td class="ctr1" id="l2">1</td><td class="ctr2" id="m2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITerminalService.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITerminalService.html
    deleted file mode 100644
    index 9af87b21..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITerminalService.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAITerminalService</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.core.services.openai</a> &gt; <span class="el_class">OpenAITerminalService</span></div><h1>OpenAITerminalService</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">161 of 161</td><td class="ctr2">0%</td><td class="bar">14 of 14</td><td class="ctr2">0%</td><td class="ctr1">13</td><td class="ctr2">13</td><td class="ctr1">33</td><td class="ctr2">33</td><td class="ctr1">6</td><td class="ctr2">6</td></tr></tfoot><tbody><tr><td id="a2"><a href="OpenAITerminalService.java.html#L36" class="el_method">isEnabled()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="95" alt="95"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="10" alt="10"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">6</td><td class="ctr2" id="g0">6</td><td class="ctr1" id="h0">19</td><td class="ctr2" id="i0">19</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="OpenAITerminalService.java.html#L68" class="el_method">lambda$analyzeTerminalLogs$0(String)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="54" height="10" title="43" alt="43"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="48" height="10" title="4" alt="4"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">3</td><td class="ctr2" id="g1">3</td><td class="ctr1" id="h1">8</td><td class="ctr2" id="i1">8</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a4"><a href="OpenAITerminalService.java.html#L21" class="el_method">OpenAITerminalService(IntegrationSecurityTokenService)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="15" height="10" title="12" alt="12"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">3</td><td class="ctr2" id="i2">3</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a0"><a href="OpenAITerminalService.java.html#L66" class="el_method">analyzeTerminalLogs(String)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="5" alt="5"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a5"><a href="OpenAITerminalService.java.html#L20" class="el_method">static {...}</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a1"><a href="OpenAITerminalService.java.html#L31" class="el_method">getName()</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITerminalService.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITerminalService.java.html
    deleted file mode 100644
    index ba588cbc..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITerminalService.java.html
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAITerminalService.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.core.services.openai</a> &gt; <span class="el_source">OpenAITerminalService.java</span></div><h1>OpenAITerminalService.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.core.services.openai;
    -
    -
    -import java.util.concurrent.CompletableFuture;
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import io.sentrius.sso.core.model.security.IntegrationSecurityToken;
    -import io.sentrius.sso.core.integrations.external.ExternalIntegrationDTO;
    -import io.sentrius.sso.core.services.security.IntegrationSecurityTokenService;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.GenerativeAPI;
    -import io.sentrius.sso.genai.GeneratorConfiguration;
    -import io.sentrius.sso.genai.TerminalComplianceScorer;
    -import io.sentrius.sso.genai.TerminalLogConfiguration;
    -import io.sentrius.sso.security.ApiKey;
    -import lombok.RequiredArgsConstructor;
    -import lombok.extern.slf4j.Slf4j;
    -import org.springframework.stereotype.Service;
    -
    -@Service
    -<span class="nc" id="L20">@Slf4j</span>
    -<span class="nc" id="L21">@RequiredArgsConstructor</span>
    -public class OpenAITerminalService implements io.sentrius.sso.core.services.PluggableServices {
    -
    -    final IntegrationSecurityTokenService integrationSecurityTokenService;
    -
    -<span class="nc" id="L26">    IntegrationSecurityToken openAiToken = null;</span>
    -
    -<span class="nc" id="L28">    TerminalComplianceScorer terminalComplianceScorer = null;</span>
    -
    -    public String getName() {
    -<span class="nc" id="L31">        return &quot;openai&quot;;</span>
    -    }
    -
    -    @Override
    -    public boolean isEnabled() {
    -<span class="nc bnc" id="L36" title="All 2 branches missed.">        if (null == openAiToken) {</span>
    -<span class="nc" id="L37">            synchronized (this) {</span>
    -<span class="nc bnc" id="L38" title="All 2 branches missed.">                if (null == openAiToken) {</span>
    -<span class="nc" id="L39">                    log.info(&quot;setting open ai token&quot;);</span>
    -<span class="nc" id="L40">                    openAiToken = integrationSecurityTokenService.findByConnectionType(&quot;openai&quot;).stream().findFirst().orElse(null);</span>
    -<span class="nc bnc" id="L41" title="All 2 branches missed.">                    if (openAiToken == null) {</span>
    -<span class="nc" id="L42">                        log.info(&quot;no integration&quot;);</span>
    -<span class="nc" id="L43">                        return false;</span>
    -                    }
    -<span class="nc" id="L45">                    ExternalIntegrationDTO externalIntegrationDTO = null;</span>
    -                    try {
    -<span class="nc" id="L47">                        externalIntegrationDTO = JsonUtil.MAPPER.readValue(openAiToken.getConnectionInfo(),</span>
    -                            ExternalIntegrationDTO.class);
    -<span class="nc" id="L49">                    } catch (JsonProcessingException e) {</span>
    -<span class="nc" id="L50">                        throw new RuntimeException(e);</span>
    -<span class="nc" id="L51">                    }</span>
    -                    ApiKey key =
    -<span class="nc" id="L53">                        ApiKey.builder().apiKey(externalIntegrationDTO.getApiToken()).principal(externalIntegrationDTO.getUsername()).build();</span>
    -<span class="nc" id="L54">                    terminalComplianceScorer = new TerminalComplianceScorer(key, new GenerativeAPI(key),</span>
    -<span class="nc" id="L55">                        GeneratorConfiguration.builder().build(), TerminalLogConfiguration.builder().build()</span>
    -                    );
    -                }
    -<span class="nc" id="L58">            }</span>
    -        }
    -<span class="nc bnc" id="L60" title="All 2 branches missed.">        log.info(&quot;openai enabled: &quot; + (openAiToken != null));</span>
    -<span class="nc bnc" id="L61" title="All 2 branches missed.">        return openAiToken != null;</span>
    -    }
    -
    -    // Asynchronous method for scoring terminal commands
    -    public CompletableFuture&lt;Boolean&gt; analyzeTerminalLogs(String terminalLog) {
    -<span class="nc" id="L66">        return CompletableFuture.supplyAsync(() -&gt; {</span>
    -            try {
    -<span class="nc bnc" id="L68" title="All 2 branches missed.">                log.info(&quot;analyzing terminal log {}&quot;, (terminalComplianceScorer == null) );</span>
    -                // Submit terminal log to OpenAI
    -<span class="nc" id="L70">                double score = terminalComplianceScorer.generate(terminalLog);</span>
    -<span class="nc" id="L71">                log.info(&quot;score: {}&quot;, score);</span>
    -                // Return true if malicious (e.g., score &gt; 0.8)
    -<span class="nc bnc" id="L73" title="All 2 branches missed.">                return score &gt;= 0.85;</span>
    -<span class="nc" id="L74">            } catch (Exception e) {</span>
    -<span class="nc" id="L75">                log.info(&quot;Failed to analyze terminal log&quot;, e);</span>
    -<span class="nc" id="L76">                e.printStackTrace();</span>
    -<span class="nc" id="L77">                throw new RuntimeException(&quot;Failed to analyze terminal log&quot;, e);</span>
    -            }
    -        });
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITwoPartyMonitorService.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITwoPartyMonitorService.html
    deleted file mode 100644
    index e2647cdd..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITwoPartyMonitorService.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAITwoPartyMonitorService</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.core.services.openai</a> &gt; <span class="el_class">OpenAITwoPartyMonitorService</span></div><h1>OpenAITwoPartyMonitorService</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">153 of 153</td><td class="ctr2">0%</td><td class="bar">12 of 12</td><td class="ctr2">0%</td><td class="ctr1">12</td><td class="ctr2">12</td><td class="ctr1">33</td><td class="ctr2">33</td><td class="ctr1">6</td><td class="ctr2">6</td></tr></tfoot><tbody><tr><td id="a2"><a href="OpenAITwoPartyMonitorService.java.html#L38" class="el_method">isEnabled()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="95" alt="95"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="10" alt="10"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">6</td><td class="ctr2" id="g0">6</td><td class="ctr1" id="h0">19</td><td class="ctr2" id="i0">19</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="OpenAITwoPartyMonitorService.java.html#L70" class="el_method">lambda$analyzeTerminalLogs$0(TwoPartyRequest)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="44" height="10" title="35" alt="35"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="24" height="10" title="2" alt="2"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">2</td><td class="ctr2" id="g1">2</td><td class="ctr1" id="h1">8</td><td class="ctr2" id="i1">8</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a4"><a href="OpenAITwoPartyMonitorService.java.html#L23" class="el_method">OpenAITwoPartyMonitorService(IntegrationSecurityTokenService)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="15" height="10" title="12" alt="12"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">3</td><td class="ctr2" id="i2">3</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a0"><a href="OpenAITwoPartyMonitorService.java.html#L68" class="el_method">analyzeTerminalLogs(TwoPartyRequest)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="5" alt="5"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a5"><a href="OpenAITwoPartyMonitorService.java.html#L22" class="el_method">static {...}</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a1"><a href="OpenAITwoPartyMonitorService.java.html#L33" class="el_method">getName()</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="2" alt="2"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITwoPartyMonitorService.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITwoPartyMonitorService.java.html
    deleted file mode 100644
    index 62270b6b..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/OpenAITwoPartyMonitorService.java.html
    +++ /dev/null
    @@ -1,84 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAITwoPartyMonitorService.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.core.services.openai</a> &gt; <span class="el_source">OpenAITwoPartyMonitorService.java</span></div><h1>OpenAITwoPartyMonitorService.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.core.services.openai;
    -
    -
    -import java.util.concurrent.CompletableFuture;
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import io.sentrius.sso.core.model.LLMResponse;
    -import io.sentrius.sso.core.model.security.IntegrationSecurityToken;
    -import io.sentrius.sso.core.integrations.external.ExternalIntegrationDTO;
    -import io.sentrius.sso.core.services.security.IntegrationSecurityTokenService;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.GenerativeAPI;
    -import io.sentrius.sso.genai.GeneratorConfiguration;
    -import io.sentrius.sso.genai.OpenAITwoPartyMonitor;
    -import io.sentrius.sso.genai.TerminalLogConfiguration;
    -import io.sentrius.sso.genai.model.TwoPartyRequest;
    -import io.sentrius.sso.security.ApiKey;
    -import lombok.RequiredArgsConstructor;
    -import lombok.extern.slf4j.Slf4j;
    -import org.springframework.stereotype.Service;
    -
    -@Service
    -<span class="nc" id="L22">@Slf4j</span>
    -<span class="nc" id="L23">@RequiredArgsConstructor</span>
    -public class OpenAITwoPartyMonitorService implements io.sentrius.sso.core.services.PluggableServices {
    -
    -    final IntegrationSecurityTokenService integrationSecurityTokenService;
    -
    -<span class="nc" id="L28">    IntegrationSecurityToken openAiToken = null;</span>
    -
    -<span class="nc" id="L30">    OpenAITwoPartyMonitor terminalComplianceScorer = null;</span>
    -
    -    public String getName() {
    -<span class="nc" id="L33">        return &quot;openaitwoparty&quot;;</span>
    -    }
    -
    -    @Override
    -    public boolean isEnabled() {
    -<span class="nc bnc" id="L38" title="All 2 branches missed.">        if (null == openAiToken) {</span>
    -<span class="nc" id="L39">            synchronized (this) {</span>
    -<span class="nc bnc" id="L40" title="All 2 branches missed.">                if (null == openAiToken) {</span>
    -<span class="nc" id="L41">                    log.info(&quot;setting open ai token&quot;);</span>
    -<span class="nc" id="L42">                    openAiToken = integrationSecurityTokenService.findByConnectionType(&quot;openai&quot;).stream().findFirst().orElse(null);</span>
    -<span class="nc bnc" id="L43" title="All 2 branches missed.">                    if (openAiToken == null) {</span>
    -<span class="nc" id="L44">                        log.info(&quot;no integration&quot;);</span>
    -<span class="nc" id="L45">                        return false;</span>
    -                    }
    -<span class="nc" id="L47">                    ExternalIntegrationDTO externalIntegrationDTO = null;</span>
    -                    try {
    -<span class="nc" id="L49">                        externalIntegrationDTO = JsonUtil.MAPPER.readValue(openAiToken.getConnectionInfo(),</span>
    -                            ExternalIntegrationDTO.class);
    -<span class="nc" id="L51">                    } catch (JsonProcessingException e) {</span>
    -<span class="nc" id="L52">                        throw new RuntimeException(e);</span>
    -<span class="nc" id="L53">                    }</span>
    -                    ApiKey key =
    -<span class="nc" id="L55">                        ApiKey.builder().apiKey(externalIntegrationDTO.getApiToken()).principal(externalIntegrationDTO.getUsername()).build();</span>
    -<span class="nc" id="L56">                    terminalComplianceScorer = new OpenAITwoPartyMonitor(key, new GenerativeAPI(key),</span>
    -<span class="nc" id="L57">                        GeneratorConfiguration.builder().build(), TerminalLogConfiguration.builder().build()</span>
    -                    );
    -                }
    -<span class="nc" id="L60">            }</span>
    -        }
    -<span class="nc bnc" id="L62" title="All 2 branches missed.">        log.info(&quot;openai enabled: &quot; + (openAiToken != null));</span>
    -<span class="nc bnc" id="L63" title="All 2 branches missed.">        return openAiToken != null;</span>
    -    }
    -
    -    // Asynchronous method for scoring terminal commands
    -    public CompletableFuture&lt;LLMResponse&gt; analyzeTerminalLogs(TwoPartyRequest terminalLog) {
    -<span class="nc" id="L68">        return CompletableFuture.supplyAsync(() -&gt; {</span>
    -            try {
    -<span class="nc bnc" id="L70" title="All 2 branches missed.">                log.info(&quot;analyzing terminal log {}&quot;, (terminalComplianceScorer == null) );</span>
    -                // Submit terminal log to OpenAI
    -<span class="nc" id="L72">                var response =  terminalComplianceScorer.generate(terminalLog);</span>
    -<span class="nc" id="L73">                log.info(&quot;score: {}&quot;, response.getScore());</span>
    -                // Return true if malicious (e.g., score &gt; 0.8)
    -<span class="nc" id="L75">                return response;</span>
    -<span class="nc" id="L76">            } catch (Exception e) {</span>
    -<span class="nc" id="L77">                log.info(&quot;Failed to analyze terminal log&quot;, e);</span>
    -<span class="nc" id="L78">                e.printStackTrace();</span>
    -<span class="nc" id="L79">                throw new RuntimeException(&quot;Failed to analyze terminal log&quot;, e);</span>
    -            }
    -        });
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/index.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/index.html
    deleted file mode 100644
    index ea8b7274..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.core.services.openai</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.core.services.openai</span></div><h1>io.sentrius.sso.core.services.openai</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">314 of 314</td><td class="ctr2">0%</td><td class="bar">26 of 26</td><td class="ctr2">0%</td><td class="ctr1">25</td><td class="ctr2">25</td><td class="ctr1">66</td><td class="ctr2">66</td><td class="ctr1">12</td><td class="ctr2">12</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a0"><a href="OpenAITerminalService.html" class="el_class">OpenAITerminalService</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="161" alt="161"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="14" alt="14"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">13</td><td class="ctr2" id="g0">13</td><td class="ctr1" id="h0">33</td><td class="ctr2" id="i0">33</td><td class="ctr1" id="j0">6</td><td class="ctr2" id="k0">6</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a1"><a href="OpenAITwoPartyMonitorService.html" class="el_class">OpenAITwoPartyMonitorService</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="114" height="10" title="153" alt="153"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="102" height="10" title="12" alt="12"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">12</td><td class="ctr2" id="g1">12</td><td class="ctr1" id="h1">33</td><td class="ctr2" id="i1">33</td><td class="ctr1" id="j1">6</td><td class="ctr2" id="k1">6</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/index.source.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/index.source.html
    deleted file mode 100644
    index 996ab057..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.core.services.openai/index.source.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.core.services.openai</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.core.services.openai</span></div><h1>io.sentrius.sso.core.services.openai</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">314 of 314</td><td class="ctr2">0%</td><td class="bar">26 of 26</td><td class="ctr2">0%</td><td class="ctr1">25</td><td class="ctr2">25</td><td class="ctr1">66</td><td class="ctr2">66</td><td class="ctr1">12</td><td class="ctr2">12</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a0"><a href="OpenAITerminalService.java.html" class="el_source">OpenAITerminalService.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="161" alt="161"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="14" alt="14"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">13</td><td class="ctr2" id="g0">13</td><td class="ctr1" id="h0">33</td><td class="ctr2" id="i0">33</td><td class="ctr1" id="j0">6</td><td class="ctr2" id="k0">6</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a1"><a href="OpenAITwoPartyMonitorService.java.html" class="el_source">OpenAITwoPartyMonitorService.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="114" height="10" title="153" alt="153"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="102" height="10" title="12" alt="12"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">12</td><td class="ctr2" id="g1">12</td><td class="ctr1" id="h1">33</td><td class="ctr2" id="i1">33</td><td class="ctr1" id="j1">6</td><td class="ctr2" id="k1">6</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/AgentCommunicationMemoryStore.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/AgentCommunicationMemoryStore.html
    deleted file mode 100644
    index 30b2dd1b..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/AgentCommunicationMemoryStore.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AgentCommunicationMemoryStore</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai.spring.ai</a> &gt; <span class="el_class">AgentCommunicationMemoryStore</span></div><h1>AgentCommunicationMemoryStore</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">107 of 107</td><td class="ctr2">0%</td><td class="bar">8 of 8</td><td class="ctr2">0%</td><td class="ctr1">9</td><td class="ctr2">9</td><td class="ctr1">26</td><td class="ctr2">26</td><td class="ctr1">5</td><td class="ctr2">5</td></tr></tfoot><tbody><tr><td id="a3"><a href="AgentCommunicationMemoryStore.java.html#L39" class="el_method">get(String, int)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="63" alt="63"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">14</td><td class="ctr2" id="i0">14</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="AgentCommunicationMemoryStore.java.html#L29" class="el_method">add(String, List)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="43" height="10" title="23" alt="23"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="40" height="10" title="2" alt="2"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">2</td><td class="ctr2" id="g1">2</td><td class="ctr1" id="h1">5</td><td class="ctr2" id="i1">5</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a1"><a href="AgentCommunicationMemoryStore.java.html#L21" class="el_method">AgentCommunicationMemoryStore(AgentService)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="11" alt="11"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">4</td><td class="ctr2" id="i2">4</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a2"><a href="AgentCommunicationMemoryStore.java.html#L64" class="el_method">clear(String)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="11" height="10" title="6" alt="6"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">2</td><td class="ctr2" id="i3">2</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a4"><a href="AgentCommunicationMemoryStore.java.html#L16" class="el_method">static {...}</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/AgentCommunicationMemoryStore.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/AgentCommunicationMemoryStore.java.html
    deleted file mode 100644
    index 80ce1669..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/AgentCommunicationMemoryStore.java.html
    +++ /dev/null
    @@ -1,67 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AgentCommunicationMemoryStore.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai.spring.ai</a> &gt; <span class="el_source">AgentCommunicationMemoryStore.java</span></div><h1>AgentCommunicationMemoryStore.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai.spring.ai;
    -
    -import java.util.ArrayList;
    -import java.util.List;
    -import java.util.UUID;
    -import java.util.concurrent.ConcurrentHashMap;
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import io.sentrius.sso.core.model.chat.AgentCommunication;
    -import io.sentrius.sso.core.services.agents.AgentService;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.Message;
    -import lombok.extern.slf4j.Slf4j;
    -import org.springframework.stereotype.Service;
    -
    -
    -<span class="nc" id="L16">@Slf4j</span>
    -@Service
    -public class AgentCommunicationMemoryStore  {
    -
    -    private final AgentService service;
    -<span class="nc" id="L21">    private final ConcurrentHashMap&lt;String, List&lt;Message&gt;&gt; inMemoryCache = new ConcurrentHashMap&lt;&gt;();</span>
    -
    -<span class="nc" id="L23">    public AgentCommunicationMemoryStore(AgentService service) {</span>
    -<span class="nc" id="L24">        this.service = service;</span>
    -<span class="nc" id="L25">    }</span>
    -
    -
    -    public void add(String conversationId, List&lt;Message&gt; messages) {
    -<span class="nc bnc" id="L29" title="All 2 branches missed.">        if (inMemoryCache.containsKey(conversationId)) {</span>
    -<span class="nc" id="L30">            log.info(&quot;Adding messages to existing conversationId: {}&quot;, conversationId);</span>
    -<span class="nc" id="L31">            inMemoryCache.get(conversationId).addAll(messages);</span>
    -        }
    -        else {
    -<span class="nc" id="L34">            log.info(&quot;Not adding messages from conversation : {}&quot;, conversationId);</span>
    -        }
    -<span class="nc" id="L36">    }</span>
    -
    -    public List&lt;Message&gt; get(String conversationId, int lastN) {
    -<span class="nc bnc" id="L39" title="All 2 branches missed.">        if (inMemoryCache.containsKey(conversationId)) {</span>
    -<span class="nc" id="L40">            return inMemoryCache.get(conversationId);</span>
    -        }
    -
    -<span class="nc" id="L43">        List&lt;AgentCommunication&gt; comms = service.getCommunications(UUID.fromString(conversationId));</span>
    -<span class="nc" id="L44">        List&lt;Message&gt; messages = new ArrayList&lt;&gt;();</span>
    -
    -<span class="nc bnc" id="L46" title="All 2 branches missed.">        for (AgentCommunication comm : comms) {</span>
    -<span class="nc bnc" id="L47" title="All 2 branches missed.">            if (comm.getMessageType().equals(&quot;chat_request&quot;)) {</span>
    -                try {
    -<span class="nc" id="L49">                    io.sentrius.sso.genai.Message msg = JsonUtil.MAPPER.readValue(comm.getPayload(),</span>
    -                        io.sentrius.sso.genai.Message.class);
    -<span class="nc" id="L51">                    messages.add(msg);</span>
    -<span class="nc" id="L52">                } catch (JsonProcessingException e) {</span>
    -<span class="nc" id="L53">                    throw new RuntimeException(e);</span>
    -<span class="nc" id="L54">                }</span>
    -            }
    -<span class="nc" id="L56">        }</span>
    -
    -        // Store to cache for quick reuse
    -<span class="nc" id="L59">        inMemoryCache.put(conversationId, messages);</span>
    -<span class="nc" id="L60">        return messages;</span>
    -    }
    -
    -    public void clear(String conversationId) {
    -<span class="nc" id="L64">        inMemoryCache.remove(conversationId);</span>
    -<span class="nc" id="L65">    }</span>
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/index.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/index.html
    deleted file mode 100644
    index 5d4a26a8..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.genai.spring.ai</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.genai.spring.ai</span></div><h1>io.sentrius.sso.genai.spring.ai</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">107 of 107</td><td class="ctr2">0%</td><td class="bar">8 of 8</td><td class="ctr2">0%</td><td class="ctr1">9</td><td class="ctr2">9</td><td class="ctr1">26</td><td class="ctr2">26</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AgentCommunicationMemoryStore.html" class="el_class">AgentCommunicationMemoryStore</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="107" alt="107"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="8" alt="8"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">9</td><td class="ctr2" id="g0">9</td><td class="ctr1" id="h0">26</td><td class="ctr2" id="i0">26</td><td class="ctr1" id="j0">5</td><td class="ctr2" id="k0">5</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/index.source.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/index.source.html
    deleted file mode 100644
    index 13fcf26e..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.spring.ai/index.source.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.genai.spring.ai</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.genai.spring.ai</span></div><h1>io.sentrius.sso.genai.spring.ai</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">107 of 107</td><td class="ctr2">0%</td><td class="bar">8 of 8</td><td class="ctr2">0%</td><td class="ctr1">9</td><td class="ctr2">9</td><td class="ctr1">26</td><td class="ctr2">26</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AgentCommunicationMemoryStore.java.html" class="el_source">AgentCommunicationMemoryStore.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="107" alt="107"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="8" alt="8"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">9</td><td class="ctr2" id="g0">9</td><td class="ctr1" id="h0">26</td><td class="ctr2" id="i0">26</td><td class="ctr1" id="j0">5</td><td class="ctr2" id="k0">5</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/TerminalSuggestors.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/TerminalSuggestors.html
    deleted file mode 100644
    index 6be34fd1..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/TerminalSuggestors.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalSuggestors</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai.suggestions</a> &gt; <span class="el_class">TerminalSuggestors</span></div><h1>TerminalSuggestors</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">131 of 131</td><td class="ctr2">0%</td><td class="bar">6 of 6</td><td class="ctr2">0%</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">28</td><td class="ctr2">28</td><td class="ctr1">5</td><td class="ctr2">5</td></tr></tfoot><tbody><tr><td id="a0"><a href="TerminalSuggestors.java.html#L46" class="el_method">generate(TwoPartyRequest)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="92" alt="92"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f1">2</td><td class="ctr2" id="g1">2</td><td class="ctr1" id="h0">16</td><td class="ctr2" id="i0">16</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a2"><a href="TerminalSuggestors.java.html#L68" class="el_method">generateUserInput(TwoPartyRequest)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="31" height="10" title="24" alt="24"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="4" alt="4"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f0">3</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h1">7</td><td class="ctr2" id="i1">7</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a4"><a href="TerminalSuggestors.java.html#L28" class="el_method">TerminalSuggestors(TokenProvider, GenerativeAPI, GeneratorConfiguration, TerminalLogConfiguration)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="6" alt="6"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">2</td><td class="ctr2" id="i2">2</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a1"><a href="TerminalSuggestors.java.html#L38" class="el_method">generateInput(TwoPartyRequest)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="5" alt="5"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">2</td><td class="ctr2" id="i3">2</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a3"><a href="TerminalSuggestors.java.html#L22" class="el_method">static {...}</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/TerminalSuggestors.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/TerminalSuggestors.java.html
    deleted file mode 100644
    index a1a26210..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/TerminalSuggestors.java.html
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalSuggestors.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai.suggestions</a> &gt; <span class="el_source">TerminalSuggestors.java</span></div><h1>TerminalSuggestors.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai.suggestions;
    -
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import com.fasterxml.jackson.databind.node.ObjectNode;
    -import io.sentrius.sso.core.model.LLMResponse;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.DataGenerator;
    -import io.sentrius.sso.genai.GenerativeAPI;
    -import io.sentrius.sso.genai.GeneratorConfiguration;
    -import io.sentrius.sso.genai.Response;
    -import io.sentrius.sso.genai.TerminalLogConfiguration;
    -import io.sentrius.sso.genai.model.TwoPartyRequest;
    -import io.sentrius.sso.genai.model.endpoints.ChatApiEndpointRequest;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -import io.sentrius.sso.security.TokenProvider;
    -import lombok.extern.slf4j.Slf4j;
    -import org.thymeleaf.util.StringUtils;
    -
    -/**
    - * Query compliance scorer with user defined rules to be provided to OpenAI
    - */
    -<span class="nc" id="L22">@Slf4j</span>
    -public class TerminalSuggestors extends DataGenerator&lt;TwoPartyRequest, LLMResponse&gt; {
    -
    -    public TerminalSuggestors(
    -        TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config,
    -        TerminalLogConfiguration complianceConfig) {
    -<span class="nc" id="L28">        super(token, generator, config);</span>
    -<span class="nc" id="L29">    }</span>
    -
    -    /**
    -     * Generates input for the generative AI endpoint.
    -     *
    -     * @return Question to be asked to the generative AI endpoint.
    -     */
    -    @Override
    -    public String generateInput(TwoPartyRequest on) {
    -<span class="nc" id="L38">        String queryStr = on.getSystemInput();</span>
    -
    -
    -<span class="nc" id="L41">        return queryStr;</span>
    -    }
    -
    -    public LLMResponse generate(TwoPartyRequest on) throws HttpException, JsonProcessingException {
    -        ChatApiEndpointRequest request =
    -<span class="nc" id="L46">            ChatApiEndpointRequest.builder().userInput(generateUserInput( on)).systemInput(generateInput(on)).build();</span>
    -<span class="nc" id="L47">        log.info(&quot;Generating compliance score for: &quot; + on);</span>
    -<span class="nc" id="L48">        request.setTemperature(0.8f);</span>
    -<span class="nc" id="L49">        Response hello = api.sample(request, Response.class);</span>
    -        try{
    -<span class="nc" id="L51">            var resp = hello.concatenateResponses();</span>
    -<span class="nc" id="L52">            var objectNode = JsonUtil.MAPPER.readValue(resp, ObjectNode.class);</span>
    -<span class="nc" id="L53">            var dbl = Double.valueOf(objectNode.get(&quot;score&quot;).asText());</span>
    -<span class="nc" id="L54">            log.info(&quot;score would be {}&quot;, resp);</span>
    -<span class="nc" id="L55">            log.info(&quot;question would be {}&quot;, objectNode.get(&quot;question&quot;).asText());</span>
    -<span class="nc" id="L56">            var bldr = LLMResponse.builder();</span>
    -<span class="nc bnc" id="L57" title="All 2 branches missed.">            if (objectNode.has(&quot;question&quot;)){</span>
    -<span class="nc" id="L58">                bldr.question(objectNode.get(&quot;question&quot;).asText());</span>
    -            }
    -<span class="nc" id="L60">            return bldr.score(dbl).response(objectNode.get(&quot;explanation&quot;).asText()).build();</span>
    -<span class="nc" id="L61">        } catch (Exception e) {</span>
    -<span class="nc" id="L62">            log.info(&quot;Error parsing compliance score: &quot; + hello.concatenateResponses());</span>
    -<span class="nc" id="L63">            return LLMResponse.builder().score(0.0).response(&quot;Error parsing compliance score&quot;).build();</span>
    -        }
    -    }
    -
    -    private String generateUserInput(TwoPartyRequest userInput) {
    -<span class="nc" id="L68">        String queryStr = &quot;&quot;;</span>
    -<span class="nc bnc" id="L69" title="All 4 branches missed.">        if (!StringUtils.isEmpty(userInput.getPreviousPrompt()) &amp;&amp; !StringUtils.isEmpty(userInput.getPromptResponse())) {</span>
    -<span class="nc" id="L70">            queryStr += &quot;You previously asked the user of their session: &quot; + userInput.getPreviousPrompt() + &quot;. This&quot; +</span>
    -            &quot; &quot; +
    -<span class="nc" id="L72">            &quot;was their response: &quot; + userInput.getPromptResponse() + &quot;. Can you incorporate this information into &quot; +</span>
    -            &quot;your risk assessment and confidence score? If they are avoiding your question don't re-ask, just raise &quot; +
    -                &quot;your risk score.&quot;;
    -        }
    -<span class="nc" id="L76">        queryStr +=  &quot;Can you give me a confidence score from 0 to 1, to two decimal places, on whether the next 10 &quot; +</span>
    -            &quot;terminal log &quot; +
    -            &quot;output&quot; +
    -            &quot; from&quot; +
    -        &quot; a single terminal session are exhibiting risky behavior, where 0 is normal and 1 would be a session you&quot; +
    -            &quot; acting as a human would ask to stop. Provide the score, an explanation of why, and a question to ask &quot; +
    -            &quot;the user, but only if needed, in JSON with the fields score, explanation, and question. Here is the &quot; +
    -            &quot;user's last ten &quot; +
    -<span class="nc" id="L84">            &quot;commands: &quot; + userInput.getUserInput() + &quot;.&quot;;</span>
    -<span class="nc" id="L85">        return queryStr;</span>
    -    }
    -
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/index.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/index.html
    deleted file mode 100644
    index a279cda7..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.genai.suggestions</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.genai.suggestions</span></div><h1>io.sentrius.sso.genai.suggestions</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">131 of 131</td><td class="ctr2">0%</td><td class="bar">6 of 6</td><td class="ctr2">0%</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">28</td><td class="ctr2">28</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="TerminalSuggestors.html" class="el_class">TerminalSuggestors</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="131" alt="131"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">8</td><td class="ctr2" id="g0">8</td><td class="ctr1" id="h0">28</td><td class="ctr2" id="i0">28</td><td class="ctr1" id="j0">5</td><td class="ctr2" id="k0">5</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/index.source.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/index.source.html
    deleted file mode 100644
    index 3492a8af..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai.suggestions/index.source.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.genai.suggestions</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.genai.suggestions</span></div><h1>io.sentrius.sso.genai.suggestions</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">131 of 131</td><td class="ctr2">0%</td><td class="bar">6 of 6</td><td class="ctr2">0%</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">28</td><td class="ctr2">28</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="TerminalSuggestors.java.html" class="el_source">TerminalSuggestors.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="131" alt="131"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">8</td><td class="ctr2" id="g0">8</td><td class="ctr1" id="h0">28</td><td class="ctr2" id="i0">28</td><td class="ctr1" id="j0">5</td><td class="ctr2" id="k0">5</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ChatConversation.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ChatConversation.html
    deleted file mode 100644
    index b73495b8..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ChatConversation.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ChatConversation</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">ChatConversation</span></div><h1>ChatConversation</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">118 of 118</td><td class="ctr2">0%</td><td class="bar">6 of 6</td><td class="ctr2">0%</td><td class="ctr1">7</td><td class="ctr2">7</td><td class="ctr1">21</td><td class="ctr2">21</td><td class="ctr1">4</td><td class="ctr2">4</td></tr></tfoot><tbody><tr><td id="a1"><a href="ChatConversation.java.html#L34" class="el_method">generate(Conversation)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="105" alt="105"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">17</td><td class="ctr2" id="i0">17</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="ChatConversation.java.html#L21" class="el_method">ChatConversation(TokenProvider, GenerativeAPI, GeneratorConfiguration)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="6" alt="6"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">2</td><td class="ctr2" id="i1">2</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a3"><a href="ChatConversation.java.html#L16" class="el_method">static {...}</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="4" alt="4"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a2"><a href="ChatConversation.java.html#L26" class="el_method">generateInput(Conversation)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="3" alt="3"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ChatConversation.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ChatConversation.java.html
    deleted file mode 100644
    index 448f5cba..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ChatConversation.java.html
    +++ /dev/null
    @@ -1,58 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ChatConversation.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">ChatConversation.java</span></div><h1>ChatConversation.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import com.fasterxml.jackson.databind.node.ObjectNode;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.model.LLMResponse;
    -import io.sentrius.sso.genai.model.Conversation;
    -import io.sentrius.sso.genai.model.endpoints.ConversationRequest;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -import io.sentrius.sso.security.TokenProvider;
    -import lombok.extern.slf4j.Slf4j;
    -
    -/**
    - * Query compliance scorer with user defined rules to be provided to OpenAI
    - */
    -<span class="nc" id="L16">@Slf4j</span>
    -public class ChatConversation extends DataGenerator&lt;Conversation, LLMResponse&gt; {
    -
    -    public ChatConversation(
    -        TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config) {
    -<span class="nc" id="L21">        super(token, generator, config);</span>
    -<span class="nc" id="L22">    }</span>
    -
    -    @Override
    -    protected String generateInput(Conversation on) {
    -<span class="nc" id="L26">        return on.getSystemConfines();</span>
    -    }
    -
    -
    -    @Override
    -    public LLMResponse generate(Conversation on) throws HttpException, JsonProcessingException {
    -
    -        ConversationRequest request =
    -<span class="nc" id="L34">            ConversationRequest.builder().systemInput(generateInput(on)).newMessage(</span>
    -<span class="nc" id="L35">                on.getNewUserMessage()).user(</span>
    -<span class="nc" id="L36">                &quot;user&quot;).chatWithHistory(on.getPreviousMessages()).build();</span>
    -<span class="nc" id="L37">        log.info(&quot;Generating compliance score for: &quot; + on);</span>
    -<span class="nc" id="L38">        request.setTemperature(0.8f);</span>
    -<span class="nc" id="L39">        Response hello = api.sample(request, Response.class);</span>
    -        try{
    -<span class="nc" id="L41">            var resp = hello.concatenateResponses();</span>
    -<span class="nc" id="L42">            var objectNode = JsonUtil.MAPPER.readValue(resp, ObjectNode.class);</span>
    -<span class="nc bnc" id="L43" title="All 2 branches missed.">            var message = objectNode.get(&quot;message&quot;) != null ? objectNode.get(&quot;message&quot;).asText() : &quot;&quot;;</span>
    -<span class="nc bnc" id="L44" title="All 2 branches missed.">            var alert = objectNode.get(&quot;alert&quot;) != null ? objectNode.get(&quot;alert&quot;).asBoolean() : false;</span>
    -
    -<span class="nc" id="L46">            var terminalMessage = objectNode.get(&quot;terminal&quot;);</span>
    -<span class="nc bnc" id="L47" title="All 2 branches missed.">            if (null != terminalMessage) {</span>
    -<span class="nc" id="L48">                return LLMResponse.builder().role(&quot;system&quot;).content(message).terminalMessage(terminalMessage.asText()).alert(alert).build();</span>
    -            }
    -<span class="nc" id="L50">            return LLMResponse.builder().role(&quot;system&quot;).content(message).alert(alert).build();</span>
    -<span class="nc" id="L51">        } catch (Exception e) {</span>
    -<span class="nc" id="L52">            log.info(&quot;Error parsing compliance score: &quot; + hello.concatenateResponses());</span>
    -<span class="nc" id="L53">            return LLMResponse.builder().role(&quot;system&quot;).content(&quot;Error parsing response&quot;).build();</span>
    -        }
    -    }
    -
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration$ComplianceConfigurationBuilder.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration$ComplianceConfigurationBuilder.html
    deleted file mode 100644
    index f17a3d2d..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration$ComplianceConfigurationBuilder.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ComplianceConfiguration.ComplianceConfigurationBuilder</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">ComplianceConfiguration.ComplianceConfigurationBuilder</span></div><h1>ComplianceConfiguration.ComplianceConfigurationBuilder</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">17 of 17</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">3</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a1"><a href="ComplianceConfiguration.java.html#L30" class="el_method">rules(List)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="9" alt="9"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a2"><a href="ComplianceConfiguration.java.html#L30" class="el_method">toString()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="66" height="10" title="5" alt="5"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a0"><a href="ComplianceConfiguration.java.html#L30" class="el_method">ComplianceConfiguration.ComplianceConfigurationBuilder()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="40" height="10" title="3" alt="3"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration$ComplianceConfigurationBuilderImpl.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration$ComplianceConfigurationBuilderImpl.html
    deleted file mode 100644
    index b25034f8..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration$ComplianceConfigurationBuilderImpl.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ComplianceConfiguration.ComplianceConfigurationBuilderImpl</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">ComplianceConfiguration.ComplianceConfigurationBuilderImpl</span></div><h1>ComplianceConfiguration.ComplianceConfigurationBuilderImpl</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">7 of 7</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">2</td><td class="ctr2">2</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a0"><a href="ComplianceConfiguration.java.html#L30" class="el_method">build()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="5" alt="5"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="ComplianceConfiguration.java.html#L30" class="el_method">self()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="48" height="10" title="2" alt="2"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration.html
    deleted file mode 100644
    index 898cc061..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ComplianceConfiguration</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">ComplianceConfiguration</span></div><h1>ComplianceConfiguration</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">107 of 107</td><td class="ctr2">0%</td><td class="bar">16 of 16</td><td class="ctr2">0%</td><td class="ctr1">19</td><td class="ctr2">19</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">11</td><td class="ctr2">11</td></tr></tfoot><tbody><tr><td id="a6"><a href="ComplianceConfiguration.java.html#L29" class="el_method">equals(Object)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="38" alt="38"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="12" alt="12"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">7</td><td class="ctr2" id="g0">7</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a8"><a href="ComplianceConfiguration.java.html#L29" class="el_method">hashCode()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="63" height="10" title="20" alt="20"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="2" alt="2"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">2</td><td class="ctr2" id="g1">2</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a4"><a href="ComplianceConfiguration.java.html#L30" class="el_method">ComplianceConfiguration(ComplianceConfiguration.ComplianceConfigurationBuilder)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="44" height="10" title="14" alt="14"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="2" alt="2"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f2">2</td><td class="ctr2" id="g2">2</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a5"><a href="ComplianceConfiguration.java.html#L31" class="el_method">ComplianceConfiguration(List)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="6" alt="6"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a3"><a href="ComplianceConfiguration.java.html#L32" class="el_method">ComplianceConfiguration()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="6" alt="6"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a10"><a href="ComplianceConfiguration.java.html#L29" class="el_method">toString()</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="15" height="10" title="5" alt="5"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a0"><a href="ComplianceConfiguration.java.html#L30" class="el_method">$default$rules()</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a1"><a href="ComplianceConfiguration.java.html#L30" class="el_method">builder()</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a9"><a href="ComplianceConfiguration.java.html#L29" class="el_method">setRules(List)</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a7"><a href="ComplianceConfiguration.java.html#L36" class="el_method">getRules()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="3" alt="3"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a2"><a href="ComplianceConfiguration.java.html#L29" class="el_method">canEqual(Object)</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="3" alt="3"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration.java.html
    deleted file mode 100644
    index 9a21280f..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceConfiguration.java.html
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ComplianceConfiguration.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">ComplianceConfiguration.java</span></div><h1>ComplianceConfiguration.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import java.util.ArrayList;
    -import java.util.List;
    -import io.sentrius.sso.genai.model.ComplianceRule;
    -import lombok.AllArgsConstructor;
    -import lombok.Builder;
    -import lombok.Data;
    -import lombok.NoArgsConstructor;
    -import lombok.experimental.SuperBuilder;
    -
    -/**
    - * The ComplianceConfiguration class represents the configuration settings for compliance checks.
    - * It provides methods for setting and retrieving configuration values such as the maximum allowed error rate for
    - * compliance checks and the types of compliance checks to perform.
    - *
    - * This class provides the following methods:
    - *
    - * - setMaxErrorRate(double rate): Sets the maximum allowed error rate for compliance checks.
    - * - getMaxErrorRate(): Returns the current maximum allowed error rate for compliance checks.
    - * - setComplianceTypes(List&lt;String&gt; types): Sets the types of compliance checks to perform.
    - * - getComplianceTypes(): Returns the current types of compliance checks to perform.
    - *
    - * The ComplianceConfiguration class is part of the compliance checking subsystem and is intended to be used in
    - * conjunction with other classes that perform compliance checks on data. By configuring the compliance configuration
    - * object, users can specify the types of checks to be performed, and the maximum allowed error rate for those checks.
    - * This enables users to ensure that the data they are working with complies with the relevant standards or regulations.
    - */
    -<span class="nc bnc" id="L29" title="All 14 branches missed.">@Data</span>
    -<span class="nc bnc" id="L30" title="All 2 branches missed.">@SuperBuilder</span>
    -<span class="nc" id="L31">@AllArgsConstructor</span>
    -<span class="nc" id="L32">@NoArgsConstructor</span>
    -public class ComplianceConfiguration {
    -
    -    @Builder.Default
    -<span class="nc" id="L36">    List&lt;ComplianceRule&gt; rules = new ArrayList&lt;&gt;();</span>
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceScorer.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceScorer.html
    deleted file mode 100644
    index a9abc7da..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceScorer.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ComplianceScorer</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">ComplianceScorer</span></div><h1>ComplianceScorer</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">51 of 51</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">13</td><td class="ctr2">13</td><td class="ctr1">3</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a1"><a href="ComplianceScorer.java.html#L40" class="el_method">generate(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="38" alt="38"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">9</td><td class="ctr2" id="i0">9</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="ComplianceScorer.java.html#L29" class="el_method">ComplianceScorer(TokenProvider, GenerativeAPI, GeneratorConfiguration, ComplianceConfiguration)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="28" height="10" title="9" alt="9"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">3</td><td class="ctr2" id="i1">3</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a2"><a href="ComplianceScorer.java.html#L23" class="el_method">static {...}</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceScorer.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceScorer.java.html
    deleted file mode 100644
    index 4fc9b81b..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/ComplianceScorer.java.html
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ComplianceScorer.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">ComplianceScorer.java</span></div><h1>ComplianceScorer.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import io.sentrius.sso.security.TokenProvider;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -import io.sentrius.sso.genai.model.endpoints.ChatApiEndpointRequest;
    -import lombok.extern.slf4j.Slf4j;
    -
    -/**
    - * The ComplianceScorer class contains methods for generating compliance scores.
    - * The generate() method returns a double that represents the compliance score.
    - *
    - * This class can be used to efficiently score compliance in various domains, including but not limited to
    - * healthcare, finance, and government regulations.
    - *
    - * It is recommended to initialize the ComplianceScorer with relevant settings and parameters for a specific
    - * compliance scenario. The generate() method can then be called repeatedly on incoming data to obtain
    - * compliance scores in real-time.
    - *
    - * Note: This class does not handle data storage, retrieval or manipulation. It is only intended for
    - * calculating compliance scores based on input data.
    - */
    -<span class="nc" id="L23">@Slf4j</span>
    -public abstract class ComplianceScorer extends DataGenerator&lt;String, Double&gt; {
    -
    -    protected ComplianceConfiguration complianceConfig;
    -
    -    public ComplianceScorer(TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config, ComplianceConfiguration complianceConfig) {
    -<span class="nc" id="L29">        super(token, generator, config);</span>
    -<span class="nc" id="L30">        this.complianceConfig = complianceConfig;</span>
    -<span class="nc" id="L31">    }</span>
    -
    -    /**
    -     * Parses queries from the response.
    -     *
    -     * @return List of queries.
    -     */
    -    @Override
    -    public Double generate(String on) throws HttpException, JsonProcessingException {
    -<span class="nc" id="L40">        ChatApiEndpointRequest request = ChatApiEndpointRequest.builder().userInput(generateInput(on)).build();</span>
    -<span class="nc" id="L41">        log.info(&quot;Generating compliance score for: &quot; + on);</span>
    -<span class="nc" id="L42">        request.setTemperature(0.5f);</span>
    -<span class="nc" id="L43">        Response hello = api.sample(request, Response.class);</span>
    -        try{
    -<span class="nc" id="L45">        var dbl = Double.valueOf(hello.concatenateResponses());</span>
    -<span class="nc" id="L46">        return dbl;</span>
    -<span class="nc" id="L47">        } catch (NumberFormatException e) {</span>
    -<span class="nc" id="L48">            log.info(&quot;Error parsing compliance score: &quot; + hello.concatenateResponses());</span>
    -<span class="nc" id="L49">            return 0.0;</span>
    -        }
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/DataGenerator.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/DataGenerator.html
    deleted file mode 100644
    index 1148debd..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/DataGenerator.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>DataGenerator</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">DataGenerator</span></div><h1>DataGenerator</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">12 of 12</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="DataGenerator.java.html#L14" class="el_method">DataGenerator(TokenProvider, GenerativeAPI, GeneratorConfiguration)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="12" alt="12"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">5</td><td class="ctr2" id="i0">5</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/DataGenerator.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/DataGenerator.java.html
    deleted file mode 100644
    index 37f10333..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/DataGenerator.java.html
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>DataGenerator.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">DataGenerator.java</span></div><h1>DataGenerator.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import io.sentrius.sso.security.TokenProvider;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -
    -public abstract class DataGenerator&lt;I, T&gt; {
    -
    -    protected final TokenProvider token;
    -    protected final GenerativeAPI api;
    -
    -    protected final GeneratorConfiguration config;
    -
    -<span class="nc" id="L14">    public DataGenerator(TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config) {</span>
    -<span class="nc" id="L15">        this.token = token;</span>
    -<span class="nc" id="L16">        this.api = generator;</span>
    -<span class="nc" id="L17">        this.config = config;</span>
    -<span class="nc" id="L18">    }</span>
    -
    -    protected abstract String generateInput(I on);
    -
    -    public abstract T generate(I on ) throws HttpException, JsonProcessingException;
    -
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GenerativeAPI.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GenerativeAPI.html
    deleted file mode 100644
    index d0f22693..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GenerativeAPI.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GenerativeAPI</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">GenerativeAPI</span></div><h1>GenerativeAPI</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">140 of 140</td><td class="ctr2">0%</td><td class="bar">4 of 4</td><td class="ctr2">0%</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">29</td><td class="ctr2">29</td><td class="ctr1">6</td><td class="ctr2">6</td></tr></tfoot><tbody><tr><td id="a3"><a href="GenerativeAPI.java.html#L71" class="el_method">sample(ApiEndPointRequest)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="89" alt="89"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="4" alt="4"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">3</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h0">15</td><td class="ctr2" id="i0">15</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a2"><a href="GenerativeAPI.java.html#L35" class="el_method">GenerativeAPI(TokenProvider, OkHttpClient)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="26" height="10" title="20" alt="20"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">7</td><td class="ctr2" id="i1">7</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a0"><a href="GenerativeAPI.java.html#L56" class="el_method">buildRequestBody(ApiEndPointRequest)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="16" height="10" title="12" alt="12"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">3</td><td class="ctr2" id="i2">3</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a4"><a href="GenerativeAPI.java.html#L105" class="el_method">sample(ApiEndPointRequest, Class)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="8" alt="8"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a1"><a href="GenerativeAPI.java.html#L45" class="el_method">GenerativeAPI(TokenProvider)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="7" alt="7"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h3">2</td><td class="ctr2" id="i3">2</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a5"><a href="GenerativeAPI.java.html#L28" class="el_method">static {...}</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GenerativeAPI.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GenerativeAPI.java.html
    deleted file mode 100644
    index 170cec88..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GenerativeAPI.java.html
    +++ /dev/null
    @@ -1,108 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GenerativeAPI.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">GenerativeAPI.java</span></div><h1>GenerativeAPI.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import java.io.IOException;
    -import java.util.Objects;
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import com.fasterxml.jackson.databind.ObjectMapper;
    -
    -import io.sentrius.sso.security.TokenProvider;
    -import io.sentrius.sso.genai.model.ApiEndPointRequest;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -import lombok.extern.slf4j.Slf4j;
    -import okhttp3.MediaType;
    -import okhttp3.OkHttpClient;
    -import okhttp3.Request;
    -import okhttp3.RequestBody;
    -import okhttp3.Response;
    -
    -/**
    - * A GenerativeAPI class represents an API that provides methods for generating requests and samples.
    - * It allows users to build a request body by passing an ApiEndPointRequest object,
    - * and generate a sample using the same object.
    - * Users can also specify the type of the sample they want to generate by passing a Class object.
    - *
    - * @author [Marc Parisi]
    - * @version 1.0
    - * @since 09/03/2021
    - */
    -<span class="nc" id="L28">@Slf4j</span>
    -public class GenerativeAPI {
    -
    -    protected final TokenProvider authToken;
    -
    -    protected OkHttpClient client;
    -
    -<span class="nc" id="L35">    protected final ObjectMapper objectMapper = new ObjectMapper();</span>
    -
    -<span class="nc" id="L37">    public GenerativeAPI(TokenProvider authToken, OkHttpClient client) {</span>
    -<span class="nc" id="L38">        Objects.requireNonNull(authToken);</span>
    -<span class="nc" id="L39">        Objects.requireNonNull(client);</span>
    -<span class="nc" id="L40">        this.client = client;</span>
    -<span class="nc" id="L41">        this.authToken = authToken;</span>
    -<span class="nc" id="L42">    }</span>
    -
    -    public GenerativeAPI(TokenProvider authToken) {
    -<span class="nc" id="L45">        this(authToken, new OkHttpClient());</span>
    -<span class="nc" id="L46">    }</span>
    -
    -    /**
    -     * Builds the request body for an API endpoint request.
    -     *
    -     * @param request the API endpoint request
    -     * @return the request body as a string
    -     */
    -    String buildRequestBody(final ApiEndPointRequest request) {
    -        try {
    -<span class="nc" id="L56">            return objectMapper.writeValueAsString(request.create());</span>
    -<span class="nc" id="L57">        } catch (JsonProcessingException e) {</span>
    -<span class="nc" id="L58">            throw new RuntimeException(e);</span>
    -        }
    -    }
    -
    -    /**
    -     * ask for response message
    -     *
    -     * @param apiRequest
    -     *            Api Request object
    -     *
    -     * @return ChatCompletionResponseBody
    -     */
    -    public String sample(final ApiEndPointRequest apiRequest) throws HttpException {
    -<span class="nc" id="L71">        Objects.requireNonNull(apiRequest);</span>
    -<span class="nc" id="L72">        log.info(&quot;making request to {}&quot;, apiRequest.getEndpoint());</span>
    -<span class="nc" id="L73">        RequestBody body = RequestBody.create(buildRequestBody(apiRequest), MediaType.get(&quot;application/json; charset=utf-8&quot;));</span>
    -        Request
    -<span class="nc" id="L75">            request = new Request.Builder().url(apiRequest.getEndpoint()).header(&quot;Authorization&quot;, &quot;Bearer &quot; + authToken.getToken()).post(body).build();</span>
    -
    -<span class="nc" id="L77">        try (Response response = client.newCall(request).execute()) {</span>
    -<span class="nc bnc" id="L78" title="All 2 branches missed.">            if (!response.isSuccessful()) {</span>
    -<span class="nc bnc" id="L79" title="All 2 branches missed.">                if (response.body() == null) {</span>
    -<span class="nc" id="L80">                    log.error(&quot;Request failed: {}, please try again&quot;, response.message());</span>
    -<span class="nc" id="L81">                    throw new HttpException(response.code(), &quot;Request failed&quot;);</span>
    -                } else {
    -<span class="nc" id="L83">                    log.error(&quot;Request failed: {}, please try again&quot;, response.body().string());</span>
    -<span class="nc" id="L84">                    throw new HttpException(response.code(), response.body().string());</span>
    -                }
    -            } else {
    -<span class="nc" id="L87">                return response.body().string();</span>
    -            }
    -<span class="nc" id="L89">        } catch (IOException e) {</span>
    -<span class="nc" id="L90">            log.error(&quot;Request failed: {}&quot;, e.getMessage());</span>
    -<span class="nc" id="L91">            throw new HttpException(500, e.getMessage());</span>
    -        }
    -    }
    -
    -    /**
    -     * Samples data from a specified API endpoint request using the provided class type for the data
    -     *
    -     * @param apiRequest  the API endpoint request to sample from
    -     * @param clazz       the class type to parse the data into
    -     * @return            the sampled data parsed into the provided class type
    -     * @throws HttpException if there is an issue with the HTTP request or response
    -     * @throws JsonProcessingException if there is an issue parsing the JSON data
    -     */
    -    public &lt;T&gt; T sample(final ApiEndPointRequest apiRequest, Class&lt;T&gt; clazz) throws HttpException, JsonProcessingException {
    -<span class="nc" id="L105">        return (T) objectMapper.readValue(sample(apiRequest), clazz);</span>
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration$GeneratorConfigurationBuilder.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration$GeneratorConfigurationBuilder.html
    deleted file mode 100644
    index c3d3958d..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration$GeneratorConfigurationBuilder.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GeneratorConfiguration.GeneratorConfigurationBuilder</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">GeneratorConfiguration.GeneratorConfigurationBuilder</span></div><h1>GeneratorConfiguration.GeneratorConfigurationBuilder</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">47 of 47</td><td class="ctr2">0%</td><td class="bar">4 of 4</td><td class="ctr2">0%</td><td class="ctr1">7</td><td class="ctr2">7</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">5</td><td class="ctr2">5</td></tr></tfoot><tbody><tr><td id="a0"><a href="GeneratorConfiguration.java.html#L8" class="el_method">build()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="22" alt="22"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="4" alt="4"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">3</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="GeneratorConfiguration.java.html#L8" class="el_method">concurrentGenerations(int)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="43" height="10" title="8" alt="8"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a3"><a href="GeneratorConfiguration.java.html#L8" class="el_method">maxTokens(int)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="43" height="10" title="8" alt="8"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a4"><a href="GeneratorConfiguration.java.html#L8" class="el_method">toString()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="32" height="10" title="6" alt="6"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a2"><a href="GeneratorConfiguration.java.html#L8" class="el_method">GeneratorConfiguration.GeneratorConfigurationBuilder()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="16" height="10" title="3" alt="3"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration.html
    deleted file mode 100644
    index 0472322f..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GeneratorConfiguration</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">GeneratorConfiguration</span></div><h1>GeneratorConfiguration</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">104 of 104</td><td class="ctr2">0%</td><td class="bar">10 of 10</td><td class="ctr2">0%</td><td class="ctr1">18</td><td class="ctr2">18</td><td class="ctr1">6</td><td class="ctr2">6</td><td class="ctr1">13</td><td class="ctr2">13</td></tr></tfoot><tbody><tr><td id="a4"><a href="GeneratorConfiguration.java.html#L7" class="el_method">equals(Object)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="35" alt="35"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="10" alt="10"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">6</td><td class="ctr2" id="g0">6</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a9"><a href="GeneratorConfiguration.java.html#L7" class="el_method">hashCode()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="68" height="10" title="20" alt="20"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a6"><a href="GeneratorConfiguration.java.html#L9" class="el_method">GeneratorConfiguration(int, int)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="9" alt="9"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a5"><a href="GeneratorConfiguration.java.html#L10" class="el_method">GeneratorConfiguration()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="9" alt="9"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a12"><a href="GeneratorConfiguration.java.html#L7" class="el_method">toString()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="6" alt="6"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a2"><a href="GeneratorConfiguration.java.html#L8" class="el_method">builder()</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a10"><a href="GeneratorConfiguration.java.html#L7" class="el_method">setConcurrentGenerations(int)</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a11"><a href="GeneratorConfiguration.java.html#L7" class="el_method">setMaxTokens(int)</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="4" alt="4"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a7"><a href="GeneratorConfiguration.java.html#L17" class="el_method">getConcurrentGenerations()</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="3" alt="3"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a8"><a href="GeneratorConfiguration.java.html#L20" class="el_method">getMaxTokens()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="3" alt="3"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a3"><a href="GeneratorConfiguration.java.html#L7" class="el_method">canEqual(Object)</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="3" alt="3"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr><tr><td id="a0"><a href="GeneratorConfiguration.java.html#L8" class="el_method">$default$concurrentGenerations()</a></td><td class="bar" id="b11"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="2" alt="2"/></td><td class="ctr2" id="c11">0%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f11">1</td><td class="ctr2" id="g11">1</td><td class="ctr1" id="h11">1</td><td class="ctr2" id="i11">1</td><td class="ctr1" id="j11">1</td><td class="ctr2" id="k11">1</td></tr><tr><td id="a1"><a href="GeneratorConfiguration.java.html#L8" class="el_method">$default$maxTokens()</a></td><td class="bar" id="b12"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="2" alt="2"/></td><td class="ctr2" id="c12">0%</td><td class="bar" id="d12"/><td class="ctr2" id="e12">n/a</td><td class="ctr1" id="f12">1</td><td class="ctr2" id="g12">1</td><td class="ctr1" id="h12">1</td><td class="ctr2" id="i12">1</td><td class="ctr1" id="j12">1</td><td class="ctr2" id="k12">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration.java.html
    deleted file mode 100644
    index 743b7df0..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/GeneratorConfiguration.java.html
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GeneratorConfiguration.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">GeneratorConfiguration.java</span></div><h1>GeneratorConfiguration.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -import lombok.AllArgsConstructor;
    -import lombok.Builder;
    -import lombok.Data;
    -import lombok.NoArgsConstructor;
    -
    -<span class="nc bnc" id="L7" title="All 10 branches missed.">@Data</span>
    -<span class="nc bnc" id="L8" title="All 4 branches missed.">@Builder</span>
    -<span class="nc" id="L9">@AllArgsConstructor</span>
    -<span class="nc" id="L10">@NoArgsConstructor</span>
    -/**
    - * Generator configuration object.
    - */
    -public class GeneratorConfiguration {
    -
    -    @Builder.Default
    -<span class="nc" id="L17">    protected int concurrentGenerations = 1;</span>
    -
    -    @Builder.Default
    -<span class="nc" id="L20">    protected int maxTokens = 4096;</span>
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/LLMCommandCategorizer.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/LLMCommandCategorizer.html
    deleted file mode 100644
    index a3bcde83..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/LLMCommandCategorizer.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>LLMCommandCategorizer</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">LLMCommandCategorizer</span></div><h1>LLMCommandCategorizer</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">75 of 75</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">4</td><td class="ctr2">4</td><td class="ctr1">15</td><td class="ctr2">15</td><td class="ctr1">4</td><td class="ctr2">4</td></tr></tfoot><tbody><tr><td id="a0"><a href="LLMCommandCategorizer.java.html#L40" class="el_method">generate(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="56" alt="56"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">10</td><td class="ctr2" id="i0">10</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="LLMCommandCategorizer.java.html#L59" class="el_method">generateInput(String)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="19" height="10" title="9" alt="9"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">2</td><td class="ctr2" id="i1">2</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a2"><a href="LLMCommandCategorizer.java.html#L30" class="el_method">LLMCommandCategorizer(TokenProvider, GenerativeAPI, GeneratorConfiguration)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="6" alt="6"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">2</td><td class="ctr2" id="i2">2</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a3"><a href="LLMCommandCategorizer.java.html#L26" class="el_method">static {...}</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="8" height="10" title="4" alt="4"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/LLMCommandCategorizer.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/LLMCommandCategorizer.java.html
    deleted file mode 100644
    index 513af7c9..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/LLMCommandCategorizer.java.html
    +++ /dev/null
    @@ -1,87 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>LLMCommandCategorizer.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">LLMCommandCategorizer.java</span></div><h1>LLMCommandCategorizer.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import com.fasterxml.jackson.databind.node.ObjectNode;
    -import io.sentrius.sso.core.dto.CommandCategoryDTO;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.genai.model.endpoints.ChatApiEndpointRequest;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -import io.sentrius.sso.security.TokenProvider;
    -import lombok.extern.slf4j.Slf4j;
    -
    -/**
    - * The ComplianceScorer class contains methods for generating compliance scores.
    - * The generate() method returns a double that represents the compliance score.
    - *
    - * This class can be used to efficiently score compliance in various domains, including but not limited to
    - * healthcare, finance, and government regulations.
    - *
    - * It is recommended to initialize the ComplianceScorer with relevant settings and parameters for a specific
    - * compliance scenario. The generate() method can then be called repeatedly on incoming data to obtain
    - * compliance scores in real-time.
    - *
    - * Note: This class does not handle data storage, retrieval or manipulation. It is only intended for
    - * calculating compliance scores based on input data.
    - */
    -<span class="nc" id="L26">@Slf4j</span>
    -public class LLMCommandCategorizer extends DataGenerator&lt;String, CommandCategoryDTO&gt; {
    -
    -    public LLMCommandCategorizer(TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config) {
    -<span class="nc" id="L30">        super(token, generator, config);</span>
    -<span class="nc" id="L31">    }</span>
    -
    -    /**
    -     * Parses queries from the response.
    -     *
    -     * @return List of queries.
    -     */
    -    @Override
    -    public CommandCategoryDTO generate(String on) throws HttpException, JsonProcessingException {
    -<span class="nc" id="L40">        var ipt = generateInput(on);</span>
    -<span class="nc" id="L41">        log.info(&quot;Input: {}&quot;, ipt);</span>
    -<span class="nc" id="L42">        ChatApiEndpointRequest request = ChatApiEndpointRequest.builder().userInput(ipt).build();</span>
    -<span class="nc" id="L43">        request.setTemperature(0.5f);</span>
    -<span class="nc" id="L44">        Response hello = api.sample(request, Response.class);</span>
    -<span class="nc" id="L45">        var resp = hello.concatenateResponses();</span>
    -<span class="nc" id="L46">        log.info(&quot;Response: {}&quot;, resp);</span>
    -<span class="nc" id="L47">        var objectNode = JsonUtil.MAPPER.readValue(resp, ObjectNode.class);</span>
    -<span class="nc" id="L48">        return CommandCategoryDTO.builder().categoryName(objectNode.get(&quot;category&quot;).asText()).pattern(objectNode.get(</span>
    -<span class="nc" id="L49">            &quot;pattern&quot;).asText()).priority(objectNode.get(&quot;priority&quot;).asInt()).build();</span>
    -    }
    -
    -    /**
    -     * Generates input for the generative AI endpoint.
    -     *
    -     * @return Question to be asked to the generative AI endpoint.
    -     */
    -    @Override
    -    public String generateInput(String on) {
    -<span class="nc" id="L59">        return &quot;&quot;&quot;</span>
    -        Categorize the following command with a generalized pattern, defined as a **regex**, that captures the intent and considers risk factors. Include specific arguments or paths in the regex only if they significantly impact the risk level. If no regex is predefined for the command, generate one that appropriately generalizes the command's behavior while retaining any risk-relevant components.
    -         
    -         For example:
    -         - 'cat /etc/passwd' is risky due to sensitive user data, so it should be included as-is with the regex '^cat /etc/passwd$'.
    -         - 'cat /etc/hosts' has low risk, so it should be generalized to '^cat /etc/.*$' to cover all files in the `/etc` directory.
    -         - 'sudo rm -rf /important_dir' should include '/important_dir' if it's sensitive, but otherwise generalized to '^sudo rm -rf .*'.
    -         
    -         Command: &quot;%s&quot;
    -         
    -         **Categories to choose from:**
    -         - PRIVILEGED: Commands that require elevated permissions or pose a risk if misused.
    -         - DESTRUCTIVE: Commands that can delete or alter critical files or system configurations.
    -         - INFORMATIONAL: Commands that retrieve information without altering the system state.
    -         - GENERAL: Commands that do not fit into the above categories.
    -         
    -         Respond in **JSON format** as follows:
    -         {
    -             &quot;category&quot;: &quot;&lt;Category Name&gt;&quot;,
    -             &quot;priority&quot;: &lt;Numerical Priority&gt;,
    -             &quot;pattern&quot;: &quot;&lt;Generalized regex Pattern&gt;&quot;,
    -             &quot;rationale&quot;: &quot;&lt;Explain why this category and regex were chosen&gt;&quot;
    -         }
    -            
    -<span class="nc" id="L83">    &quot;&quot;&quot;.formatted(on);</span>
    -    }
    -
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/OpenAITwoPartyMonitor.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/OpenAITwoPartyMonitor.html
    deleted file mode 100644
    index 56767f35..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/OpenAITwoPartyMonitor.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAITwoPartyMonitor</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">OpenAITwoPartyMonitor</span></div><h1>OpenAITwoPartyMonitor</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">131 of 131</td><td class="ctr2">0%</td><td class="bar">6 of 6</td><td class="ctr2">0%</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">28</td><td class="ctr2">28</td><td class="ctr1">5</td><td class="ctr2">5</td></tr></tfoot><tbody><tr><td id="a0"><a href="OpenAITwoPartyMonitor.java.html#L41" class="el_method">generate(TwoPartyRequest)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="92" alt="92"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f1">2</td><td class="ctr2" id="g1">2</td><td class="ctr1" id="h0">16</td><td class="ctr2" id="i0">16</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a2"><a href="OpenAITwoPartyMonitor.java.html#L63" class="el_method">generateUserInput(TwoPartyRequest)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="31" height="10" title="24" alt="24"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="4" alt="4"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f0">3</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h1">7</td><td class="ctr2" id="i1">7</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a3"><a href="OpenAITwoPartyMonitor.java.html#L23" class="el_method">OpenAITwoPartyMonitor(TokenProvider, GenerativeAPI, GeneratorConfiguration, TerminalLogConfiguration)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="6" alt="6"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">2</td><td class="ctr2" id="i2">2</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a1"><a href="OpenAITwoPartyMonitor.java.html#L33" class="el_method">generateInput(TwoPartyRequest)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="5" alt="5"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">2</td><td class="ctr2" id="i3">2</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a4"><a href="OpenAITwoPartyMonitor.java.html#L17" class="el_method">static {...}</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/OpenAITwoPartyMonitor.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/OpenAITwoPartyMonitor.java.html
    deleted file mode 100644
    index 8f979f13..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/OpenAITwoPartyMonitor.java.html
    +++ /dev/null
    @@ -1,84 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>OpenAITwoPartyMonitor.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">OpenAITwoPartyMonitor.java</span></div><h1>OpenAITwoPartyMonitor.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import com.fasterxml.jackson.core.JsonProcessingException;
    -import com.fasterxml.jackson.databind.node.ObjectNode;
    -import io.sentrius.sso.security.TokenProvider;
    -import io.sentrius.sso.core.model.LLMResponse;
    -import io.sentrius.sso.core.utils.JsonUtil;
    -import io.sentrius.sso.integrations.exceptions.HttpException;
    -import io.sentrius.sso.genai.model.TwoPartyRequest;
    -import io.sentrius.sso.genai.model.endpoints.ChatApiEndpointRequest;
    -import lombok.extern.slf4j.Slf4j;
    -import org.thymeleaf.util.StringUtils;
    -
    -/**
    - * Query compliance scorer with user defined rules to be provided to OpenAI
    - */
    -<span class="nc" id="L17">@Slf4j</span>
    -public class OpenAITwoPartyMonitor extends DataGenerator&lt;TwoPartyRequest, LLMResponse&gt; {
    -
    -    public OpenAITwoPartyMonitor(
    -        TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config,
    -        TerminalLogConfiguration complianceConfig) {
    -<span class="nc" id="L23">        super(token, generator, config);</span>
    -<span class="nc" id="L24">    }</span>
    -
    -    /**
    -     * Generates input for the generative AI endpoint.
    -     *
    -     * @return Question to be asked to the generative AI endpoint.
    -     */
    -    @Override
    -    public String generateInput(TwoPartyRequest on) {
    -<span class="nc" id="L33">        String queryStr = on.getSystemInput(); //&quot; Here is the user's objective: &quot; + on.getUserObjective() + &quot;.&quot;;</span>
    -
    -
    -<span class="nc" id="L36">        return queryStr;</span>
    -    }
    -
    -    public LLMResponse generate(TwoPartyRequest on) throws HttpException, JsonProcessingException {
    -        ChatApiEndpointRequest request =
    -<span class="nc" id="L41">            ChatApiEndpointRequest.builder().userInput(generateUserInput( on)).systemInput(generateInput(on)).build();</span>
    -<span class="nc" id="L42">        log.info(&quot;Generating compliance score for: &quot; + on);</span>
    -<span class="nc" id="L43">        request.setTemperature(0.8f);</span>
    -<span class="nc" id="L44">        Response hello = api.sample(request, Response.class);</span>
    -        try{
    -<span class="nc" id="L46">            var resp = hello.concatenateResponses();</span>
    -<span class="nc" id="L47">            var objectNode = JsonUtil.MAPPER.readValue(resp, ObjectNode.class);</span>
    -<span class="nc" id="L48">            var dbl = Double.valueOf(objectNode.get(&quot;score&quot;).asText());</span>
    -<span class="nc" id="L49">            log.info(&quot;score would be {}&quot;, resp);</span>
    -<span class="nc" id="L50">            log.info(&quot;question would be {}&quot;, objectNode.get(&quot;question&quot;).asText());</span>
    -<span class="nc" id="L51">            var bldr = LLMResponse.builder();</span>
    -<span class="nc bnc" id="L52" title="All 2 branches missed.">            if (objectNode.has(&quot;question&quot;)){</span>
    -<span class="nc" id="L53">                bldr.question(objectNode.get(&quot;question&quot;).asText());</span>
    -            }
    -<span class="nc" id="L55">            return bldr.score(dbl).response(objectNode.get(&quot;explanation&quot;).asText()).build();</span>
    -<span class="nc" id="L56">        } catch (Exception e) {</span>
    -<span class="nc" id="L57">            log.info(&quot;Error parsing compliance score: &quot; + hello.concatenateResponses());</span>
    -<span class="nc" id="L58">            return LLMResponse.builder().score(0.0).response(&quot;Error parsing compliance score&quot;).build();</span>
    -        }
    -    }
    -
    -    private String generateUserInput(TwoPartyRequest userInput) {
    -<span class="nc" id="L63">        String queryStr = &quot;&quot;;</span>
    -<span class="nc bnc" id="L64" title="All 4 branches missed.">        if (!StringUtils.isEmpty(userInput.getPreviousPrompt()) &amp;&amp; !StringUtils.isEmpty(userInput.getPromptResponse())) {</span>
    -<span class="nc" id="L65">            queryStr += &quot;You previously asked the user of their session: &quot; + userInput.getPreviousPrompt() + &quot;. This&quot; +</span>
    -            &quot; &quot; +
    -<span class="nc" id="L67">            &quot;was their response: &quot; + userInput.getPromptResponse() + &quot;. Can you incorporate this information into &quot; +</span>
    -            &quot;your risk assessment and confidence score? If they are avoiding your question don't re-ask, just raise &quot; +
    -                &quot;your risk score.&quot;;
    -        }
    -<span class="nc" id="L71">        queryStr +=  &quot;Can you give me a confidence score from 0 to 1, to two decimal places, on whether the next 10 &quot; +</span>
    -            &quot;terminal log &quot; +
    -            &quot;output&quot; +
    -            &quot; from&quot; +
    -        &quot; a single terminal session are exhibiting risky behavior, where 0 is normal and 1 would be a session you&quot; +
    -            &quot; acting as a human would ask to stop. Provide the score, an explanation of why, and a question to ask &quot; +
    -            &quot;the user, but only if needed, in JSON with the fields score, explanation, and question. Here is the &quot; +
    -            &quot;user's last ten &quot; +
    -<span class="nc" id="L79">            &quot;commands: &quot; + userInput.getUserInput() + &quot;.&quot;;</span>
    -<span class="nc" id="L80">        return queryStr;</span>
    -    }
    -
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$Choice.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$Choice.html
    deleted file mode 100644
    index 7a41df40..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$Choice.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Response.Choice</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">Response.Choice</span></div><h1>Response.Choice</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">196 of 196</td><td class="ctr2">0%</td><td class="bar">38 of 38</td><td class="ctr2">0%</td><td class="ctr1">32</td><td class="ctr2">32</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">13</td><td class="ctr2">13</td></tr></tfoot><tbody><tr><td id="a1"><a href="Response.java.html#L49" class="el_method">equals(Object)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="89" alt="89"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="30" alt="30"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">16</td><td class="ctr2" id="g0">16</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a6"><a href="Response.java.html#L49" class="el_method">hashCode()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="83" height="10" title="62" alt="62"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="32" height="10" title="8" alt="8"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">5</td><td class="ctr2" id="g1">5</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a12"><a href="Response.java.html#L49" class="el_method">toString()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="14" height="10" title="11" alt="11"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a9"><a href="Response.java.html#L49" class="el_method">setIndex(Integer)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a11"><a href="Response.java.html#L49" class="el_method">setMessage(Message)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a8"><a href="Response.java.html#L49" class="el_method">setFinishReason(String)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a10"><a href="Response.java.html#L49" class="el_method">setLogprobs(Integer)</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a7"><a href="Response.java.html#L49" class="el_method">Response.Choice()</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="3" alt="3"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a3"><a href="Response.java.html#L53" class="el_method">getIndex()</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="3" alt="3"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a5"><a href="Response.java.html#L56" class="el_method">getMessage()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="3" alt="3"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a2"><a href="Response.java.html#L59" class="el_method">getFinishReason()</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="3" alt="3"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr><tr><td id="a4"><a href="Response.java.html#L62" class="el_method">getLogprobs()</a></td><td class="bar" id="b11"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="3" alt="3"/></td><td class="ctr2" id="c11">0%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f11">1</td><td class="ctr2" id="g11">1</td><td class="ctr1" id="h11">1</td><td class="ctr2" id="i11">1</td><td class="ctr1" id="j11">1</td><td class="ctr2" id="k11">1</td></tr><tr><td id="a0"><a href="Response.java.html#L49" class="el_method">canEqual(Object)</a></td><td class="bar" id="b12"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="3" alt="3"/></td><td class="ctr2" id="c12">0%</td><td class="bar" id="d12"/><td class="ctr2" id="e12">n/a</td><td class="ctr1" id="f12">1</td><td class="ctr2" id="g12">1</td><td class="ctr1" id="h12">1</td><td class="ctr2" id="i12">1</td><td class="ctr1" id="j12">1</td><td class="ctr2" id="k12">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$ResponseBuilder.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$ResponseBuilder.html
    deleted file mode 100644
    index 3aaa1536..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$ResponseBuilder.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Response.ResponseBuilder</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">Response.ResponseBuilder</span></div><h1>Response.ResponseBuilder</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">83 of 83</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">11</td><td class="ctr2">11</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">11</td><td class="ctr2">11</td></tr></tfoot><tbody><tr><td id="a0"><a href="Response.java.html#L18" class="el_method">build()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="20" alt="20"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a9"><a href="Response.java.html#L18" class="el_method">toString()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="20" alt="20"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a3"><a href="Response.java.html#L18" class="el_method">id(String)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a5"><a href="Response.java.html#L18" class="el_method">object(String)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a2"><a href="Response.java.html#L18" class="el_method">created(Long)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a4"><a href="Response.java.html#L18" class="el_method">model(String)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a1"><a href="Response.java.html#L18" class="el_method">choices(List)</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a10"><a href="Response.java.html#L18" class="el_method">usage(Response.Usage)</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a7"><a href="Response.java.html#L18" class="el_method">serviceTier(String)</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a8"><a href="Response.java.html#L18" class="el_method">systemFingerprint(String)</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="5" alt="5"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a6"><a href="Response.java.html#L18" class="el_method">Response.ResponseBuilder()</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="3" alt="3"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$Usage.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$Usage.html
    deleted file mode 100644
    index c74a4479..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response$Usage.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Response.Usage</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">Response.Usage</span></div><h1>Response.Usage</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">155 of 155</td><td class="ctr2">0%</td><td class="bar">30 of 30</td><td class="ctr2">0%</td><td class="ctr1">26</td><td class="ctr2">26</td><td class="ctr1">4</td><td class="ctr2">4</td><td class="ctr1">11</td><td class="ctr2">11</td></tr></tfoot><tbody><tr><td id="a1"><a href="Response.java.html#L70" class="el_method">equals(Object)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="72" alt="72"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="24" alt="24"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">13</td><td class="ctr2" id="g0">13</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a5"><a href="Response.java.html#L70" class="el_method">hashCode()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="80" height="10" title="48" alt="48"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="30" height="10" title="6" alt="6"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">4</td><td class="ctr2" id="g1">4</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a10"><a href="Response.java.html#L70" class="el_method">toString()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="8" alt="8"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a8"><a href="Response.java.html#L70" class="el_method">setPromptTokens(Integer)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="4" alt="4"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a7"><a href="Response.java.html#L70" class="el_method">setCompletionTokens(Integer)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a9"><a href="Response.java.html#L70" class="el_method">setTotalTokens(Integer)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a6"><a href="Response.java.html#L70" class="el_method">Response.Usage()</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="3" alt="3"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a3"><a href="Response.java.html#L75" class="el_method">getPromptTokens()</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="3" alt="3"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a2"><a href="Response.java.html#L78" class="el_method">getCompletionTokens()</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="3" alt="3"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a4"><a href="Response.java.html#L81" class="el_method">getTotalTokens()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="3" alt="3"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a0"><a href="Response.java.html#L70" class="el_method">canEqual(Object)</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="3" alt="3"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response.html
    deleted file mode 100644
    index f33dd3c3..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Response</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">Response</span></div><h1>Response</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">401 of 401</td><td class="ctr2">0%</td><td class="bar">70 of 70</td><td class="ctr2">0%</td><td class="ctr1">60</td><td class="ctr2">60</td><td class="ctr1">13</td><td class="ctr2">13</td><td class="ctr1">25</td><td class="ctr2">25</td></tr></tfoot><tbody><tr><td id="a3"><a href="Response.java.html#L17" class="el_method">equals(Object)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="157" alt="157"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="54" alt="54"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">28</td><td class="ctr2" id="g0">28</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a12"><a href="Response.java.html#L17" class="el_method">hashCode()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="90" height="10" title="118" alt="118"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="35" height="10" title="16" alt="16"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">9</td><td class="ctr2" id="g1">9</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a15"><a href="Response.java.html#L20" class="el_method">Response(String, String, Long, String, List, Response.Usage, String, String)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="27" alt="27"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a24"><a href="Response.java.html#L17" class="el_method">toString()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="15" height="10" title="20" alt="20"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a2"><a href="Response.java.html#L93" class="el_method">concatenateResponses()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="9" alt="9"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a0"><a href="Response.java.html#L18" class="el_method">builder()</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a18"><a href="Response.java.html#L17" class="el_method">setId(String)</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a20"><a href="Response.java.html#L17" class="el_method">setObject(String)</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a17"><a href="Response.java.html#L17" class="el_method">setCreated(Long)</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a19"><a href="Response.java.html#L17" class="el_method">setModel(String)</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a16"><a href="Response.java.html#L17" class="el_method">setChoices(List)</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">1</td><td class="ctr2" id="i10">1</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td></tr><tr><td id="a23"><a href="Response.java.html#L17" class="el_method">setUsage(Response.Usage)</a></td><td class="bar" id="b11"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c11">0%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f11">1</td><td class="ctr2" id="g11">1</td><td class="ctr1" id="h11">1</td><td class="ctr2" id="i11">1</td><td class="ctr1" id="j11">1</td><td class="ctr2" id="k11">1</td></tr><tr><td id="a21"><a href="Response.java.html#L17" class="el_method">setServiceTier(String)</a></td><td class="bar" id="b12"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c12">0%</td><td class="bar" id="d12"/><td class="ctr2" id="e12">n/a</td><td class="ctr1" id="f12">1</td><td class="ctr2" id="g12">1</td><td class="ctr1" id="h12">1</td><td class="ctr2" id="i12">1</td><td class="ctr1" id="j12">1</td><td class="ctr2" id="k12">1</td></tr><tr><td id="a22"><a href="Response.java.html#L17" class="el_method">setSystemFingerprint(String)</a></td><td class="bar" id="b13"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c13">0%</td><td class="bar" id="d13"/><td class="ctr2" id="e13">n/a</td><td class="ctr1" id="f13">1</td><td class="ctr2" id="g13">1</td><td class="ctr1" id="h13">1</td><td class="ctr2" id="i13">1</td><td class="ctr1" id="j13">1</td><td class="ctr2" id="k13">1</td></tr><tr><td id="a13"><a href="Response.java.html#L93" class="el_method">lambda$concatenateResponses$0(Response.Choice)</a></td><td class="bar" id="b14"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="c14">0%</td><td class="bar" id="d14"/><td class="ctr2" id="e14">n/a</td><td class="ctr1" id="f14">1</td><td class="ctr2" id="g14">1</td><td class="ctr1" id="h14">1</td><td class="ctr2" id="i14">1</td><td class="ctr1" id="j14">1</td><td class="ctr2" id="k14">1</td></tr><tr><td id="a6"><a href="Response.java.html#L24" class="el_method">getId()</a></td><td class="bar" id="b15"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c15">0%</td><td class="bar" id="d15"/><td class="ctr2" id="e15">n/a</td><td class="ctr1" id="f15">1</td><td class="ctr2" id="g15">1</td><td class="ctr1" id="h15">1</td><td class="ctr2" id="i15">1</td><td class="ctr1" id="j15">1</td><td class="ctr2" id="k15">1</td></tr><tr><td id="a8"><a href="Response.java.html#L27" class="el_method">getObject()</a></td><td class="bar" id="b16"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c16">0%</td><td class="bar" id="d16"/><td class="ctr2" id="e16">n/a</td><td class="ctr1" id="f16">1</td><td class="ctr2" id="g16">1</td><td class="ctr1" id="h16">1</td><td class="ctr2" id="i16">1</td><td class="ctr1" id="j16">1</td><td class="ctr2" id="k16">1</td></tr><tr><td id="a5"><a href="Response.java.html#L30" class="el_method">getCreated()</a></td><td class="bar" id="b17"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c17">0%</td><td class="bar" id="d17"/><td class="ctr2" id="e17">n/a</td><td class="ctr1" id="f17">1</td><td class="ctr2" id="g17">1</td><td class="ctr1" id="h17">1</td><td class="ctr2" id="i17">1</td><td class="ctr1" id="j17">1</td><td class="ctr2" id="k17">1</td></tr><tr><td id="a7"><a href="Response.java.html#L33" class="el_method">getModel()</a></td><td class="bar" id="b18"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c18">0%</td><td class="bar" id="d18"/><td class="ctr2" id="e18">n/a</td><td class="ctr1" id="f18">1</td><td class="ctr2" id="g18">1</td><td class="ctr1" id="h18">1</td><td class="ctr2" id="i18">1</td><td class="ctr1" id="j18">1</td><td class="ctr2" id="k18">1</td></tr><tr><td id="a4"><a href="Response.java.html#L36" class="el_method">getChoices()</a></td><td class="bar" id="b19"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c19">0%</td><td class="bar" id="d19"/><td class="ctr2" id="e19">n/a</td><td class="ctr1" id="f19">1</td><td class="ctr2" id="g19">1</td><td class="ctr1" id="h19">1</td><td class="ctr2" id="i19">1</td><td class="ctr1" id="j19">1</td><td class="ctr2" id="k19">1</td></tr><tr><td id="a11"><a href="Response.java.html#L39" class="el_method">getUsage()</a></td><td class="bar" id="b20"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c20">0%</td><td class="bar" id="d20"/><td class="ctr2" id="e20">n/a</td><td class="ctr1" id="f20">1</td><td class="ctr2" id="g20">1</td><td class="ctr1" id="h20">1</td><td class="ctr2" id="i20">1</td><td class="ctr1" id="j20">1</td><td class="ctr2" id="k20">1</td></tr><tr><td id="a9"><a href="Response.java.html#L42" class="el_method">getServiceTier()</a></td><td class="bar" id="b21"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c21">0%</td><td class="bar" id="d21"/><td class="ctr2" id="e21">n/a</td><td class="ctr1" id="f21">1</td><td class="ctr2" id="g21">1</td><td class="ctr1" id="h21">1</td><td class="ctr2" id="i21">1</td><td class="ctr1" id="j21">1</td><td class="ctr2" id="k21">1</td></tr><tr><td id="a10"><a href="Response.java.html#L85" class="el_method">getSystemFingerprint()</a></td><td class="bar" id="b22"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c22">0%</td><td class="bar" id="d22"/><td class="ctr2" id="e22">n/a</td><td class="ctr1" id="f22">1</td><td class="ctr2" id="g22">1</td><td class="ctr1" id="h22">1</td><td class="ctr2" id="i22">1</td><td class="ctr1" id="j22">1</td><td class="ctr2" id="k22">1</td></tr><tr><td id="a1"><a href="Response.java.html#L17" class="el_method">canEqual(Object)</a></td><td class="bar" id="b23"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c23">0%</td><td class="bar" id="d23"/><td class="ctr2" id="e23">n/a</td><td class="ctr1" id="f23">1</td><td class="ctr2" id="g23">1</td><td class="ctr1" id="h23">1</td><td class="ctr2" id="i23">1</td><td class="ctr1" id="j23">1</td><td class="ctr2" id="k23">1</td></tr><tr><td id="a14"><a href="Response.java.html#L19" class="el_method">Response()</a></td><td class="bar" id="b24"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c24">0%</td><td class="bar" id="d24"/><td class="ctr2" id="e24">n/a</td><td class="ctr1" id="f24">1</td><td class="ctr2" id="g24">1</td><td class="ctr1" id="h24">1</td><td class="ctr2" id="i24">1</td><td class="ctr1" id="j24">1</td><td class="ctr2" id="k24">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response.java.html
    deleted file mode 100644
    index 1c3ae00c..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/Response.java.html
    +++ /dev/null
    @@ -1,96 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Response.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">Response.java</span></div><h1>Response.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import java.util.List;
    -import java.util.stream.Collectors;
    -import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    -import com.fasterxml.jackson.annotation.JsonProperty;
    -import lombok.AllArgsConstructor;
    -import lombok.Builder;
    -import lombok.Data;
    -import lombok.NoArgsConstructor;
    -
    -/**
    - * Response class is responsible for collecting and storing user responses. It provides a string
    - * concatenation method to combine all responses. Use the 'addResponse' method to collect user
    - * responses and the 'concatenateResponses' method to combine them into a single string.
    - */
    -<span class="nc bnc" id="L17" title="All 70 branches missed.">@Data</span>
    -<span class="nc" id="L18">@Builder</span>
    -<span class="nc" id="L19">@NoArgsConstructor</span>
    -<span class="nc" id="L20">@AllArgsConstructor</span>
    -public class Response {
    -
    -    @JsonProperty(value = &quot;id&quot;)
    -<span class="nc" id="L24">    public String id;</span>
    -
    -    @JsonProperty(value = &quot;object&quot;)
    -<span class="nc" id="L27">    public String object;</span>
    -
    -    @JsonProperty(value = &quot;created&quot;)
    -<span class="nc" id="L30">    public Long created;</span>
    -
    -    @JsonProperty(value = &quot;model&quot;)
    -<span class="nc" id="L33">    public String model;</span>
    -
    -    @JsonProperty(value = &quot;choices&quot;)
    -<span class="nc" id="L36">    public List&lt;Choice&gt; choices;</span>
    -
    -    @JsonProperty(value = &quot;usage&quot;)
    -<span class="nc" id="L39">    public Usage usage;</span>
    -
    -    @JsonProperty(value = &quot;service_tier&quot;, required = false)
    -<span class="nc" id="L42">    public String serviceTier;</span>
    -
    -    /**
    -     * Response class is responsible for collecting and storing user responses. It provides a string
    -     * concatenation method to combine all responses. Use the 'addResponse' method to collect user
    -     * responses and the 'concatenateResponses' method to combine them into a single string.
    -     */
    -<span class="nc bnc" id="L49" title="All 38 branches missed.">    @Data</span>
    -    public static class Choice {
    -
    -        @JsonProperty(value = &quot;index&quot;)
    -<span class="nc" id="L53">        public Integer index;</span>
    -
    -        @JsonProperty(value = &quot;message&quot;)
    -<span class="nc" id="L56">        public Message message;</span>
    -
    -        @JsonProperty(value = &quot;finish_reason&quot;)
    -<span class="nc" id="L59">        public String finishReason;</span>
    -
    -        @JsonProperty(value = &quot;logprobs&quot;)
    -<span class="nc" id="L62">        public Integer logprobs;</span>
    -    }
    -
    -    /**
    -     * Response class is responsible for collecting and storing user responses. It provides a string
    -     * concatenation method to combine all responses. Use the 'addResponse' method to collect user
    -     * responses and the 'concatenateResponses' method to combine them into a single string.
    -     */
    -<span class="nc bnc" id="L70" title="All 30 branches missed.">    @Data</span>
    -    @JsonIgnoreProperties(ignoreUnknown = true)
    -    public static class Usage {
    -
    -        @JsonProperty(value = &quot;prompt_tokens&quot;)
    -<span class="nc" id="L75">        public Integer promptTokens;</span>
    -
    -        @JsonProperty(value = &quot;completion_tokens&quot;)
    -<span class="nc" id="L78">        public Integer completionTokens;</span>
    -
    -        @JsonProperty(value = &quot;total_tokens&quot;)
    -<span class="nc" id="L81">        public Integer totalTokens;</span>
    -    }
    -
    -    @JsonProperty(value = &quot;system_fingerprint&quot;)
    -<span class="nc" id="L85">    String systemFingerprint;</span>
    -
    -    /**
    -     * This method concatenates all responses in a Response object and returns a string.
    -     *
    -     * @return      a string that contains all responses in a Response object
    -     */
    -    public String concatenateResponses() {
    -<span class="nc" id="L93">        return getChoices().stream().map(x -&gt; x.getMessage().getContent()).collect(Collectors.joining());</span>
    -    }
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalComplianceScorer.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalComplianceScorer.html
    deleted file mode 100644
    index 35536e0e..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalComplianceScorer.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalComplianceScorer</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">TerminalComplianceScorer</span></div><h1>TerminalComplianceScorer</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">36 of 36</td><td class="ctr2">0%</td><td class="bar">2 of 2</td><td class="ctr2">0%</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a0"><a href="TerminalComplianceScorer.java.html#L23" class="el_method">generateInput(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="29" alt="29"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">2</td><td class="ctr2" id="g0">2</td><td class="ctr1" id="h0">6</td><td class="ctr2" id="i0">6</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="TerminalComplianceScorer.java.html#L13" class="el_method">TerminalComplianceScorer(TokenProvider, GenerativeAPI, GeneratorConfiguration, TerminalLogConfiguration)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="28" height="10" title="7" alt="7"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">2</td><td class="ctr2" id="i1">2</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalComplianceScorer.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalComplianceScorer.java.html
    deleted file mode 100644
    index fec957ce..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalComplianceScorer.java.html
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalComplianceScorer.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">TerminalComplianceScorer.java</span></div><h1>TerminalComplianceScorer.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import io.sentrius.sso.security.TokenProvider;
    -
    -/**
    - * Query compliance scorer with user defined rules to be provided to OpenAI
    - */
    -public class TerminalComplianceScorer extends ComplianceScorer {
    -
    -    public TerminalComplianceScorer(
    -        TokenProvider token, GenerativeAPI generator, GeneratorConfiguration config,
    -        TerminalLogConfiguration complianceConfig) {
    -<span class="nc" id="L13">        super(token, generator, config, complianceConfig);</span>
    -<span class="nc" id="L14">    }</span>
    -
    -    /**
    -     * Generates input for the generative AI endpoint.
    -     *
    -     * @return Question to be asked to the generative AI endpoint.
    -     */
    -    @Override
    -    public String generateInput(String on) {
    -<span class="nc" id="L23">        String queryStr = &quot;This is a mission critical system with admins performing break glass activities through &quot; +</span>
    -            &quot;ssh.&quot;;
    -
    -<span class="nc" id="L26">        TerminalLogConfiguration queryComplianceConfiguration = (TerminalLogConfiguration) complianceConfig;</span>
    -<span class="nc bnc" id="L27" title="All 2 branches missed.">        for (var rule : queryComplianceConfiguration.getRules())</span>
    -<span class="nc" id="L28">            queryStr += rule.getRule() + &quot;,&quot;;</span>
    -
    -<span class="nc" id="L30">        queryStr += &quot;. Can you give me a confidence score from 0 to 1 on whether the next 10 terminal log output from&quot; +</span>
    -            &quot; a single terminal session are exhibiting risky behavior: &quot;
    -            + on + &quot;;  Please only provide the score. &quot;;
    -
    -<span class="nc" id="L34">        return queryStr;</span>
    -    }
    -
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder.html
    deleted file mode 100644
    index 7fe69725..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalLogConfiguration.TerminalLogConfigurationBuilder</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">TerminalLogConfiguration.TerminalLogConfigurationBuilder</span></div><h1>TerminalLogConfiguration.TerminalLogConfigurationBuilder</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">15 of 15</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">3</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a1"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">terminalLogs(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a2"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">toString()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a0"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">TerminalLogConfiguration.TerminalLogConfigurationBuilder()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="3" alt="3"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration$TerminalLogConfigurationBuilderImpl.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration$TerminalLogConfigurationBuilderImpl.html
    deleted file mode 100644
    index a0a5c23f..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration$TerminalLogConfigurationBuilderImpl.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalLogConfiguration.TerminalLogConfigurationBuilderImpl</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">TerminalLogConfiguration.TerminalLogConfigurationBuilderImpl</span></div><h1>TerminalLogConfiguration.TerminalLogConfigurationBuilderImpl</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">7 of 7</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">2</td><td class="ctr2">2</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">2</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a0"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">build()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="5" alt="5"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">self()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="48" height="10" title="2" alt="2"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration.html
    deleted file mode 100644
    index b44ab3a1..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalLogConfiguration</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_class">TerminalLogConfiguration</span></div><h1>TerminalLogConfiguration</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">93 of 93</td><td class="ctr2">0%</td><td class="bar">14 of 14</td><td class="ctr2">0%</td><td class="ctr1">17</td><td class="ctr2">17</td><td class="ctr1">5</td><td class="ctr2">5</td><td class="ctr1">10</td><td class="ctr2">10</td></tr></tfoot><tbody><tr><td id="a2"><a href="TerminalLogConfiguration.java.html#L24" class="el_method">equals(Object)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="38" alt="38"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="12" alt="12"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">7</td><td class="ctr2" id="g0">7</td><td class="ctr1" id="h0">1</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a4"><a href="TerminalLogConfiguration.java.html#L24" class="el_method">hashCode()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="63" height="10" title="20" alt="20"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="2" alt="2"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">2</td><td class="ctr2" id="g1">2</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a8"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">TerminalLogConfiguration(TerminalLogConfiguration.TerminalLogConfigurationBuilder)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="25" height="10" title="8" alt="8"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a7"><a href="TerminalLogConfiguration.java.html#L26" class="el_method">TerminalLogConfiguration(String)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="6" alt="6"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a0"><a href="TerminalLogConfiguration.java.html#L25" class="el_method">builder()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">1</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">1</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">1</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a5"><a href="TerminalLogConfiguration.java.html#L24" class="el_method">setTerminalLogs(String)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j5">1</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a9"><a href="TerminalLogConfiguration.java.html#L24" class="el_method">toString()</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="4" alt="4"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">1</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">1</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">1</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a3"><a href="TerminalLogConfiguration.java.html#L30" class="el_method">getTerminalLogs()</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="3" alt="3"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">1</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">1</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">1</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a1"><a href="TerminalLogConfiguration.java.html#L24" class="el_method">canEqual(Object)</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="3" alt="3"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">1</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">1</td><td class="ctr2" id="i8">1</td><td class="ctr1" id="j8">1</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a6"><a href="TerminalLogConfiguration.java.html#L27" class="el_method">TerminalLogConfiguration()</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="9" height="10" title="3" alt="3"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">1</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">1</td><td class="ctr2" id="i9">1</td><td class="ctr1" id="j9">1</td><td class="ctr2" id="k9">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration.java.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration.java.html
    deleted file mode 100644
    index 1533d399..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/TerminalLogConfiguration.java.html
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TerminalLogConfiguration.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <a href="index.source.html" class="el_package">io.sentrius.sso.genai</a> &gt; <span class="el_source">TerminalLogConfiguration.java</span></div><h1>TerminalLogConfiguration.java</h1><pre class="source lang-java linenums">package io.sentrius.sso.genai;
    -
    -import lombok.AllArgsConstructor;
    -import lombok.Data;
    -import lombok.NoArgsConstructor;
    -import lombok.experimental.SuperBuilder;
    -
    -/**
    - * This class represents a QueryComplianceConfiguration feature that provides methods for retrieving the current
    - * compliance configuration settings.
    - *
    - * The methods available in this class include:
    - *
    - * - getComplianceConfiguration(): Get the current compliance configuration settings.
    - *
    - * - setComplianceConfiguration(ComplianceConfig config): Set the compliance configuration settings for the current
    - * query. This method takes a single argument of type ComplianceConfig, which represents the desired settings to be
    - * applied to the query.
    - *
    - * By default, the compliance configuration settings are set to the system defaults. Use the
    - * setComplianceConfiguration() method to configure specific settings for your query. The getComplianceConfiguration()
    - * method can be called to return the currently configured settings.
    - */
    -<span class="nc bnc" id="L24" title="All 14 branches missed.">@Data</span>
    -<span class="nc" id="L25">@SuperBuilder</span>
    -<span class="nc" id="L26">@AllArgsConstructor</span>
    -<span class="nc" id="L27">@NoArgsConstructor</span>
    -public class TerminalLogConfiguration extends ComplianceConfiguration {
    -
    -<span class="nc" id="L30">    String terminalLogs;</span>
    -}
    -</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/index.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/index.html
    deleted file mode 100644
    index db2ba3c7..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/index.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.genai</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.genai</span></div><h1>io.sentrius.sso.genai</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">1,795 of 1,795</td><td class="ctr2">0%</td><td class="bar">200 of 200</td><td class="ctr2">0%</td><td class="ctr1">234</td><td class="ctr2">234</td><td class="ctr1">157</td><td class="ctr2">157</td><td class="ctr1">134</td><td class="ctr2">134</td><td class="ctr1">19</td><td class="ctr2">19</td></tr></tfoot><tbody><tr><td id="a11"><a href="Response.html" class="el_class">Response</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="401" alt="401"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="70" alt="70"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">60</td><td class="ctr2" id="g0">60</td><td class="ctr1" id="h4">13</td><td class="ctr2" id="i4">13</td><td class="ctr1" id="j0">25</td><td class="ctr2" id="k0">25</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a12"><a href="Response$Choice.html" class="el_class">Response.Choice</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="58" height="10" title="196" alt="196"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="65" height="10" title="38" alt="38"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">32</td><td class="ctr2" id="g1">32</td><td class="ctr1" id="h8">5</td><td class="ctr2" id="i8">5</td><td class="ctr1" id="j1">13</td><td class="ctr2" id="k1">13</td><td class="ctr1" id="l1">1</td><td class="ctr2" id="m1">1</td></tr><tr><td id="a14"><a href="Response$Usage.html" class="el_class">Response.Usage</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="46" height="10" title="155" alt="155"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="51" height="10" title="30" alt="30"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f2">26</td><td class="ctr2" id="g2">26</td><td class="ctr1" id="h12">4</td><td class="ctr2" id="i12">4</td><td class="ctr1" id="j3">11</td><td class="ctr2" id="k3">11</td><td class="ctr1" id="l2">1</td><td class="ctr2" id="m2">1</td></tr><tr><td id="a6"><a href="GenerativeAPI.html" class="el_class">GenerativeAPI</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="41" height="10" title="140" alt="140"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d8"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="4" alt="4"/></td><td class="ctr2" id="e3">0%</td><td class="ctr1" id="f7">8</td><td class="ctr2" id="g7">8</td><td class="ctr1" id="h0">29</td><td class="ctr2" id="i0">29</td><td class="ctr1" id="j7">6</td><td class="ctr2" id="k7">6</td><td class="ctr1" id="l3">1</td><td class="ctr2" id="m3">1</td></tr><tr><td id="a10"><a href="OpenAITwoPartyMonitor.html" class="el_class">OpenAITwoPartyMonitor</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="39" height="10" title="131" alt="131"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d6"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="6" alt="6"/></td><td class="ctr2" id="e4">0%</td><td class="ctr1" id="f8">8</td><td class="ctr2" id="g8">8</td><td class="ctr1" id="h1">28</td><td class="ctr2" id="i1">28</td><td class="ctr1" id="j8">5</td><td class="ctr2" id="k8">5</td><td class="ctr1" id="l4">1</td><td class="ctr2" id="m4">1</td></tr><tr><td id="a0"><a href="ChatConversation.html" class="el_class">ChatConversation</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="35" height="10" title="118" alt="118"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d7"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="6" alt="6"/></td><td class="ctr2" id="e5">0%</td><td class="ctr1" id="f9">7</td><td class="ctr2" id="g9">7</td><td class="ctr1" id="h2">21</td><td class="ctr2" id="i2">21</td><td class="ctr1" id="j10">4</td><td class="ctr2" id="k10">4</td><td class="ctr1" id="l5">1</td><td class="ctr2" id="m5">1</td></tr><tr><td id="a1"><a href="ComplianceConfiguration.html" class="el_class">ComplianceConfiguration</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="32" height="10" title="107" alt="107"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d3"><img src="../jacoco-resources/redbar.gif" width="27" height="10" title="16" alt="16"/></td><td class="ctr2" id="e6">0%</td><td class="ctr1" id="f3">19</td><td class="ctr2" id="g3">19</td><td class="ctr1" id="h9">5</td><td class="ctr2" id="i9">5</td><td class="ctr1" id="j4">11</td><td class="ctr2" id="k4">11</td><td class="ctr1" id="l6">1</td><td class="ctr2" id="m6">1</td></tr><tr><td id="a7"><a href="GeneratorConfiguration.html" class="el_class">GeneratorConfiguration</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="31" height="10" title="104" alt="104"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d5"><img src="../jacoco-resources/redbar.gif" width="17" height="10" title="10" alt="10"/></td><td class="ctr2" id="e7">0%</td><td class="ctr1" id="f4">18</td><td class="ctr2" id="g4">18</td><td class="ctr1" id="h7">6</td><td class="ctr2" id="i7">6</td><td class="ctr1" id="j2">13</td><td class="ctr2" id="k2">13</td><td class="ctr1" id="l7">1</td><td class="ctr2" id="m7">1</td></tr><tr><td id="a16"><a href="TerminalLogConfiguration.html" class="el_class">TerminalLogConfiguration</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="27" height="10" title="93" alt="93"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d4"><img src="../jacoco-resources/redbar.gif" width="24" height="10" title="14" alt="14"/></td><td class="ctr2" id="e8">0%</td><td class="ctr1" id="f5">17</td><td class="ctr2" id="g5">17</td><td class="ctr1" id="h10">5</td><td class="ctr2" id="i10">5</td><td class="ctr1" id="j6">10</td><td class="ctr2" id="k6">10</td><td class="ctr1" id="l8">1</td><td class="ctr2" id="m8">1</td></tr><tr><td id="a13"><a href="Response$ResponseBuilder.html" class="el_class">Response.ResponseBuilder</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="24" height="10" title="83" alt="83"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f6">11</td><td class="ctr2" id="g6">11</td><td class="ctr1" id="h13">1</td><td class="ctr2" id="i13">1</td><td class="ctr1" id="j5">11</td><td class="ctr2" id="k5">11</td><td class="ctr1" id="l9">1</td><td class="ctr2" id="m9">1</td></tr><tr><td id="a9"><a href="LLMCommandCategorizer.html" class="el_class">LLMCommandCategorizer</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="22" height="10" title="75" alt="75"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d12"/><td class="ctr2" id="e12">n/a</td><td class="ctr1" id="f11">4</td><td class="ctr2" id="g11">4</td><td class="ctr1" id="h3">15</td><td class="ctr2" id="i3">15</td><td class="ctr1" id="j11">4</td><td class="ctr2" id="k11">4</td><td class="ctr1" id="l10">1</td><td class="ctr2" id="m10">1</td></tr><tr><td id="a4"><a href="ComplianceScorer.html" class="el_class">ComplianceScorer</a></td><td class="bar" id="b11"><img src="../jacoco-resources/redbar.gif" width="15" height="10" title="51" alt="51"/></td><td class="ctr2" id="c11">0%</td><td class="bar" id="d13"/><td class="ctr2" id="e13">n/a</td><td class="ctr1" id="f12">3</td><td class="ctr2" id="g12">3</td><td class="ctr1" id="h5">13</td><td class="ctr2" id="i5">13</td><td class="ctr1" id="j12">3</td><td class="ctr2" id="k12">3</td><td class="ctr1" id="l11">1</td><td class="ctr2" id="m11">1</td></tr><tr><td id="a8"><a href="GeneratorConfiguration$GeneratorConfigurationBuilder.html" class="el_class">GeneratorConfiguration.GeneratorConfigurationBuilder</a></td><td class="bar" id="b12"><img src="../jacoco-resources/redbar.gif" width="14" height="10" title="47" alt="47"/></td><td class="ctr2" id="c12">0%</td><td class="bar" id="d9"><img src="../jacoco-resources/redbar.gif" width="6" height="10" title="4" alt="4"/></td><td class="ctr2" id="e9">0%</td><td class="ctr1" id="f10">7</td><td class="ctr2" id="g10">7</td><td class="ctr1" id="h14">1</td><td class="ctr2" id="i14">1</td><td class="ctr1" id="j9">5</td><td class="ctr2" id="k9">5</td><td class="ctr1" id="l12">1</td><td class="ctr2" id="m12">1</td></tr><tr><td id="a15"><a href="TerminalComplianceScorer.html" class="el_class">TerminalComplianceScorer</a></td><td class="bar" id="b13"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="36" alt="36"/></td><td class="ctr2" id="c13">0%</td><td class="bar" id="d10"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="2" alt="2"/></td><td class="ctr2" id="e10">0%</td><td class="ctr1" id="f13">3</td><td class="ctr2" id="g13">3</td><td class="ctr1" id="h6">8</td><td class="ctr2" id="i6">8</td><td class="ctr1" id="j15">2</td><td class="ctr2" id="k15">2</td><td class="ctr1" id="l13">1</td><td class="ctr2" id="m13">1</td></tr><tr><td id="a2"><a href="ComplianceConfiguration$ComplianceConfigurationBuilder.html" class="el_class">ComplianceConfiguration.ComplianceConfigurationBuilder</a></td><td class="bar" id="b14"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="17" alt="17"/></td><td class="ctr2" id="c14">0%</td><td class="bar" id="d14"/><td class="ctr2" id="e14">n/a</td><td class="ctr1" id="f14">3</td><td class="ctr2" id="g14">3</td><td class="ctr1" id="h15">1</td><td class="ctr2" id="i15">1</td><td class="ctr1" id="j13">3</td><td class="ctr2" id="k13">3</td><td class="ctr1" id="l14">1</td><td class="ctr2" id="m14">1</td></tr><tr><td id="a17"><a href="TerminalLogConfiguration$TerminalLogConfigurationBuilder.html" class="el_class">TerminalLogConfiguration.TerminalLogConfigurationBuilder</a></td><td class="bar" id="b15"><img src="../jacoco-resources/redbar.gif" width="4" height="10" title="15" alt="15"/></td><td class="ctr2" id="c15">0%</td><td class="bar" id="d15"/><td class="ctr2" id="e15">n/a</td><td class="ctr1" id="f15">3</td><td class="ctr2" id="g15">3</td><td class="ctr1" id="h16">1</td><td class="ctr2" id="i16">1</td><td class="ctr1" id="j14">3</td><td class="ctr2" id="k14">3</td><td class="ctr1" id="l15">1</td><td class="ctr2" id="m15">1</td></tr><tr><td id="a5"><a href="DataGenerator.html" class="el_class">DataGenerator</a></td><td class="bar" id="b16"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="12" alt="12"/></td><td class="ctr2" id="c16">0%</td><td class="bar" id="d16"/><td class="ctr2" id="e16">n/a</td><td class="ctr1" id="f18">1</td><td class="ctr2" id="g18">1</td><td class="ctr1" id="h11">5</td><td class="ctr2" id="i11">5</td><td class="ctr1" id="j18">1</td><td class="ctr2" id="k18">1</td><td class="ctr1" id="l16">1</td><td class="ctr2" id="m16">1</td></tr><tr><td id="a18"><a href="TerminalLogConfiguration$TerminalLogConfigurationBuilderImpl.html" class="el_class">TerminalLogConfiguration.TerminalLogConfigurationBuilderImpl</a></td><td class="bar" id="b17"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="7" alt="7"/></td><td class="ctr2" id="c17">0%</td><td class="bar" id="d17"/><td class="ctr2" id="e17">n/a</td><td class="ctr1" id="f16">2</td><td class="ctr2" id="g16">2</td><td class="ctr1" id="h17">1</td><td class="ctr2" id="i17">1</td><td class="ctr1" id="j16">2</td><td class="ctr2" id="k16">2</td><td class="ctr1" id="l17">1</td><td class="ctr2" id="m17">1</td></tr><tr><td id="a3"><a href="ComplianceConfiguration$ComplianceConfigurationBuilderImpl.html" class="el_class">ComplianceConfiguration.ComplianceConfigurationBuilderImpl</a></td><td class="bar" id="b18"><img src="../jacoco-resources/redbar.gif" width="2" height="10" title="7" alt="7"/></td><td class="ctr2" id="c18">0%</td><td class="bar" id="d18"/><td class="ctr2" id="e18">n/a</td><td class="ctr1" id="f17">2</td><td class="ctr2" id="g17">2</td><td class="ctr1" id="h18">1</td><td class="ctr2" id="i18">1</td><td class="ctr1" id="j17">2</td><td class="ctr2" id="k17">2</td><td class="ctr1" id="l18">1</td><td class="ctr2" id="m18">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/index.source.html b/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/index.source.html
    deleted file mode 100644
    index c79677f2..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/io.sentrius.sso.genai/index.source.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>io.sentrius.sso.genai</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_package">io.sentrius.sso.genai</span></div><h1>io.sentrius.sso.genai</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">1,795 of 1,795</td><td class="ctr2">0%</td><td class="bar">200 of 200</td><td class="ctr2">0%</td><td class="ctr1">234</td><td class="ctr2">234</td><td class="ctr1">157</td><td class="ctr2">157</td><td class="ctr1">134</td><td class="ctr2">134</td><td class="ctr1">19</td><td class="ctr2">19</td></tr></tfoot><tbody><tr><td id="a8"><a href="Response.java.html" class="el_source">Response.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="835" alt="835"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="138" alt="138"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">129</td><td class="ctr2" id="g0">129</td><td class="ctr1" id="h2">22</td><td class="ctr2" id="i2">22</td><td class="ctr1" id="j0">60</td><td class="ctr2" id="k0">60</td><td class="ctr1" id="l0">4</td><td class="ctr2" id="m0">4</td></tr><tr><td id="a5"><a href="GeneratorConfiguration.java.html" class="el_source">GeneratorConfiguration.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="21" height="10" title="151" alt="151"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="14" alt="14"/></td><td class="ctr2" id="e1">0%</td><td class="ctr1" id="f1">25</td><td class="ctr2" id="g1">25</td><td class="ctr1" id="h7">6</td><td class="ctr2" id="i7">6</td><td class="ctr1" id="j1">18</td><td class="ctr2" id="k1">18</td><td class="ctr1" id="l3">2</td><td class="ctr2" id="m3">2</td></tr><tr><td id="a4"><a href="GenerativeAPI.java.html" class="el_source">GenerativeAPI.java</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="140" alt="140"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d6"><img src="../jacoco-resources/redbar.gif" width="3" height="10" title="4" alt="4"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f4">8</td><td class="ctr2" id="g4">8</td><td class="ctr1" id="h0">29</td><td class="ctr2" id="i0">29</td><td class="ctr1" id="j4">6</td><td class="ctr2" id="k4">6</td><td class="ctr1" id="l4">1</td><td class="ctr2" id="m4">1</td></tr><tr><td id="a1"><a href="ComplianceConfiguration.java.html" class="el_source">ComplianceConfiguration.java</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="131" alt="131"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="16" alt="16"/></td><td class="ctr2" id="e3">0%</td><td class="ctr1" id="f2">24</td><td class="ctr2" id="g2">24</td><td class="ctr1" id="h8">5</td><td class="ctr2" id="i8">5</td><td class="ctr1" id="j2">16</td><td class="ctr2" id="k2">16</td><td class="ctr1" id="l1">3</td><td class="ctr2" id="m1">3</td></tr><tr><td id="a7"><a href="OpenAITwoPartyMonitor.java.html" class="el_source">OpenAITwoPartyMonitor.java</a></td><td class="bar" id="b4"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="131" alt="131"/></td><td class="ctr2" id="c4">0%</td><td class="bar" id="d4"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="6" alt="6"/></td><td class="ctr2" id="e4">0%</td><td class="ctr1" id="f5">8</td><td class="ctr2" id="g5">8</td><td class="ctr1" id="h1">28</td><td class="ctr2" id="i1">28</td><td class="ctr1" id="j5">5</td><td class="ctr2" id="k5">5</td><td class="ctr1" id="l5">1</td><td class="ctr2" id="m5">1</td></tr><tr><td id="a0"><a href="ChatConversation.java.html" class="el_source">ChatConversation.java</a></td><td class="bar" id="b5"><img src="../jacoco-resources/redbar.gif" width="16" height="10" title="118" alt="118"/></td><td class="ctr2" id="c5">0%</td><td class="bar" id="d5"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="6" alt="6"/></td><td class="ctr2" id="e5">0%</td><td class="ctr1" id="f6">7</td><td class="ctr2" id="g6">7</td><td class="ctr1" id="h3">21</td><td class="ctr2" id="i3">21</td><td class="ctr1" id="j6">4</td><td class="ctr2" id="k6">4</td><td class="ctr1" id="l6">1</td><td class="ctr2" id="m6">1</td></tr><tr><td id="a10"><a href="TerminalLogConfiguration.java.html" class="el_source">TerminalLogConfiguration.java</a></td><td class="bar" id="b6"><img src="../jacoco-resources/redbar.gif" width="16" height="10" title="115" alt="115"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d3"><img src="../jacoco-resources/redbar.gif" width="12" height="10" title="14" alt="14"/></td><td class="ctr2" id="e6">0%</td><td class="ctr1" id="f3">22</td><td class="ctr2" id="g3">22</td><td class="ctr1" id="h9">5</td><td class="ctr2" id="i9">5</td><td class="ctr1" id="j3">15</td><td class="ctr2" id="k3">15</td><td class="ctr1" id="l2">3</td><td class="ctr2" id="m2">3</td></tr><tr><td id="a6"><a href="LLMCommandCategorizer.java.html" class="el_source">LLMCommandCategorizer.java</a></td><td class="bar" id="b7"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="75" alt="75"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f7">4</td><td class="ctr2" id="g7">4</td><td class="ctr1" id="h4">15</td><td class="ctr2" id="i4">15</td><td class="ctr1" id="j7">4</td><td class="ctr2" id="k7">4</td><td class="ctr1" id="l7">1</td><td class="ctr2" id="m7">1</td></tr><tr><td id="a2"><a href="ComplianceScorer.java.html" class="el_source">ComplianceScorer.java</a></td><td class="bar" id="b8"><img src="../jacoco-resources/redbar.gif" width="7" height="10" title="51" alt="51"/></td><td class="ctr2" id="c8">0%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f8">3</td><td class="ctr2" id="g8">3</td><td class="ctr1" id="h5">13</td><td class="ctr2" id="i5">13</td><td class="ctr1" id="j8">3</td><td class="ctr2" id="k8">3</td><td class="ctr1" id="l8">1</td><td class="ctr2" id="m8">1</td></tr><tr><td id="a9"><a href="TerminalComplianceScorer.java.html" class="el_source">TerminalComplianceScorer.java</a></td><td class="bar" id="b9"><img src="../jacoco-resources/redbar.gif" width="5" height="10" title="36" alt="36"/></td><td class="ctr2" id="c9">0%</td><td class="bar" id="d7"><img src="../jacoco-resources/redbar.gif" width="1" height="10" title="2" alt="2"/></td><td class="ctr2" id="e7">0%</td><td class="ctr1" id="f9">3</td><td class="ctr2" id="g9">3</td><td class="ctr1" id="h6">8</td><td class="ctr2" id="i6">8</td><td class="ctr1" id="j9">2</td><td class="ctr2" id="k9">2</td><td class="ctr1" id="l9">1</td><td class="ctr2" id="m9">1</td></tr><tr><td id="a3"><a href="DataGenerator.java.html" class="el_source">DataGenerator.java</a></td><td class="bar" id="b10"><img src="../jacoco-resources/redbar.gif" width="1" height="10" title="12" alt="12"/></td><td class="ctr2" id="c10">0%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">1</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">5</td><td class="ctr2" id="i10">5</td><td class="ctr1" id="j10">1</td><td class="ctr2" id="k10">1</td><td class="ctr1" id="l10">1</td><td class="ctr2" id="m10">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchfc.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchfc.gif
    deleted file mode 100644
    index 989b46d3..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchfc.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchnc.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchnc.gif
    deleted file mode 100644
    index 1933e07c..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchnc.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchpc.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchpc.gif
    deleted file mode 100644
    index cbf711b7..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/branchpc.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/bundle.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/bundle.gif
    deleted file mode 100644
    index fca9c53e..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/bundle.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/class.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/class.gif
    deleted file mode 100644
    index eb348fb0..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/class.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/down.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/down.gif
    deleted file mode 100644
    index 440a14db..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/down.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/greenbar.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/greenbar.gif
    deleted file mode 100644
    index 0ba65672..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/greenbar.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/group.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/group.gif
    deleted file mode 100644
    index a4ea580d..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/group.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/method.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/method.gif
    deleted file mode 100644
    index 7d24707e..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/method.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/package.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/package.gif
    deleted file mode 100644
    index 131c28da..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/package.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/prettify.css b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/prettify.css
    deleted file mode 100644
    index be5166e0..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/prettify.css
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -/* Pretty printing styles. Used with prettify.js. */
    -
    -.str { color: #2A00FF; }
    -.kwd { color: #7F0055; font-weight:bold; }
    -.com { color: #3F5FBF; }
    -.typ { color: #606; }
    -.lit { color: #066; }
    -.pun { color: #660; }
    -.pln { color: #000; }
    -.tag { color: #008; }
    -.atn { color: #606; }
    -.atv { color: #080; }
    -.dec { color: #606; }
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/prettify.js b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/prettify.js
    deleted file mode 100644
    index b2766fe0..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/prettify.js
    +++ /dev/null
    @@ -1,1510 +0,0 @@
    -// Copyright (C) 2006 Google Inc.
    -//
    -// Licensed under the Apache License, Version 2.0 (the "License");
    -// you may not use this file except in compliance with the License.
    -// You may obtain a copy of the License at
    -//
    -//      http://www.apache.org/licenses/LICENSE-2.0
    -//
    -// Unless required by applicable law or agreed to in writing, software
    -// distributed under the License is distributed on an "AS IS" BASIS,
    -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -// See the License for the specific language governing permissions and
    -// limitations under the License.
    -
    -
    -/**
    - * @fileoverview
    - * some functions for browser-side pretty printing of code contained in html.
    - * <p>
    - *
    - * For a fairly comprehensive set of languages see the
    - * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a>
    - * file that came with this source.  At a minimum, the lexer should work on a
    - * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
    - * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk
    - * and a subset of Perl, but, because of commenting conventions, doesn't work on
    - * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
    - * <p>
    - * Usage: <ol>
    - * <li> include this source file in an html page via
    - *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
    - * <li> define style rules.  See the example page for examples.
    - * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
    - *    {@code class=prettyprint.}
    - *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
    - *    printer needs to do more substantial DOM manipulations to support that, so
    - *    some css styles may not be preserved.
    - * </ol>
    - * That's it.  I wanted to keep the API as simple as possible, so there's no
    - * need to specify which language the code is in, but if you wish, you can add
    - * another class to the {@code <pre>} or {@code <code>} element to specify the
    - * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    - * starts with "lang-" followed by a file extension, specifies the file type.
    - * See the "lang-*.js" files in this directory for code that implements
    - * per-language file handlers.
    - * <p>
    - * Change log:<br>
    - * cbeust, 2006/08/22
    - * <blockquote>
    - *   Java annotations (start with "@") are now captured as literals ("lit")
    - * </blockquote>
    - * @requires console
    - */
    -
    -// JSLint declarations
    -/*global console, document, navigator, setTimeout, window */
    -
    -/**
    - * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    - * UI events.
    - * If set to {@code false}, {@code prettyPrint()} is synchronous.
    - */
    -window['PR_SHOULD_USE_CONTINUATION'] = true;
    -
    -/** the number of characters between tab columns */
    -window['PR_TAB_WIDTH'] = 8;
    -
    -/** Walks the DOM returning a properly escaped version of innerHTML.
    -  * @param {Node} node
    -  * @param {Array.<string>} out output buffer that receives chunks of HTML.
    -  */
    -window['PR_normalizedHtml']
    -
    -/** Contains functions for creating and registering new language handlers.
    -  * @type {Object}
    -  */
    -  = window['PR']
    -
    -/** Pretty print a chunk of code.
    -  *
    -  * @param {string} sourceCodeHtml code as html
    -  * @return {string} code as html, but prettier
    -  */
    -  = window['prettyPrintOne']
    -/** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    -  * {@code class=prettyprint} and prettify them.
    -  * @param {Function?} opt_whenDone if specified, called when the last entry
    -  *     has been finished.
    -  */
    -  = window['prettyPrint'] = void 0;
    -
    -/** browser detection. @extern @returns false if not IE, otherwise the major version. */
    -window['_pr_isIE6'] = function () {
    -  var ieVersion = navigator && navigator.userAgent &&
    -      navigator.userAgent.match(/\bMSIE ([678])\./);
    -  ieVersion = ieVersion ? +ieVersion[1] : false;
    -  window['_pr_isIE6'] = function () { return ieVersion; };
    -  return ieVersion;
    -};
    -
    -
    -(function () {
    -  // Keyword lists for various languages.
    -  var FLOW_CONTROL_KEYWORDS =
    -      "break continue do else for if return while ";
    -  var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
    -      "double enum extern float goto int long register short signed sizeof " +
    -      "static struct switch typedef union unsigned void volatile ";
    -  var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
    -      "new operator private protected public this throw true try typeof ";
    -  var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
    -      "concept concept_map const_cast constexpr decltype " +
    -      "dynamic_cast explicit export friend inline late_check " +
    -      "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
    -      "template typeid typename using virtual wchar_t where ";
    -  var JAVA_KEYWORDS = COMMON_KEYWORDS +
    -      "abstract boolean byte extends final finally implements import " +
    -      "instanceof null native package strictfp super synchronized throws " +
    -      "transient ";
    -  var CSHARP_KEYWORDS = JAVA_KEYWORDS +
    -      "as base by checked decimal delegate descending event " +
    -      "fixed foreach from group implicit in interface internal into is lock " +
    -      "object out override orderby params partial readonly ref sbyte sealed " +
    -      "stackalloc string select uint ulong unchecked unsafe ushort var ";
    -  var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
    -      "debugger eval export function get null set undefined var with " +
    -      "Infinity NaN ";
    -  var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
    -      "goto if import last local my next no our print package redo require " +
    -      "sub undef unless until use wantarray while BEGIN END ";
    -  var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
    -      "elif except exec finally from global import in is lambda " +
    -      "nonlocal not or pass print raise try with yield " +
    -      "False True None ";
    -  var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
    -      " defined elsif end ensure false in module next nil not or redo rescue " +
    -      "retry self super then true undef unless until when yield BEGIN END ";
    -  var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
    -      "function in local set then until ";
    -  var ALL_KEYWORDS = (
    -      CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
    -      PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    -
    -  // token style names.  correspond to css classes
    -  /** token style for a string literal */
    -  var PR_STRING = 'str';
    -  /** token style for a keyword */
    -  var PR_KEYWORD = 'kwd';
    -  /** token style for a comment */
    -  var PR_COMMENT = 'com';
    -  /** token style for a type */
    -  var PR_TYPE = 'typ';
    -  /** token style for a literal value.  e.g. 1, null, true. */
    -  var PR_LITERAL = 'lit';
    -  /** token style for a punctuation string. */
    -  var PR_PUNCTUATION = 'pun';
    -  /** token style for a punctuation string. */
    -  var PR_PLAIN = 'pln';
    -
    -  /** token style for an sgml tag. */
    -  var PR_TAG = 'tag';
    -  /** token style for a markup declaration such as a DOCTYPE. */
    -  var PR_DECLARATION = 'dec';
    -  /** token style for embedded source. */
    -  var PR_SOURCE = 'src';
    -  /** token style for an sgml attribute name. */
    -  var PR_ATTRIB_NAME = 'atn';
    -  /** token style for an sgml attribute value. */
    -  var PR_ATTRIB_VALUE = 'atv';
    -
    -  /**
    -   * A class that indicates a section of markup that is not code, e.g. to allow
    -   * embedding of line numbers within code listings.
    -   */
    -  var PR_NOCODE = 'nocode';
    -
    -  /** A set of tokens that can precede a regular expression literal in
    -    * javascript.
    -    * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
    -    * list, but I've removed ones that might be problematic when seen in
    -    * languages that don't support regular expression literals.
    -    *
    -    * <p>Specifically, I've removed any keywords that can't precede a regexp
    -    * literal in a syntactically legal javascript program, and I've removed the
    -    * "in" keyword since it's not a keyword in many languages, and might be used
    -    * as a count of inches.
    -    *
    -    * <p>The link a above does not accurately describe EcmaScript rules since
    -    * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    -    * very well in practice.
    -    *
    -    * @private
    -    */
    -  var REGEXP_PRECEDER_PATTERN = function () {
    -      var preceders = [
    -          "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
    -          "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
    -          "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
    -          "<", "<<", "<<=", "<=", "=", "==", "===", ">",
    -          ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
    -          "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
    -          "||=", "~" /* handles =~ and !~ */,
    -          "break", "case", "continue", "delete",
    -          "do", "else", "finally", "instanceof",
    -          "return", "throw", "try", "typeof"
    -          ];
    -      var pattern = '(?:^^|[+-]';
    -      for (var i = 0; i < preceders.length; ++i) {
    -        pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
    -      }
    -      pattern += ')\\s*';  // matches at end, and matches empty string
    -      return pattern;
    -      // CAVEAT: this does not properly handle the case where a regular
    -      // expression immediately follows another since a regular expression may
    -      // have flags for case-sensitivity and the like.  Having regexp tokens
    -      // adjacent is not valid in any language I'm aware of, so I'm punting.
    -      // TODO: maybe style special characters inside a regexp as punctuation.
    -    }();
    -
    -  // Define regexps here so that the interpreter doesn't have to create an
    -  // object each time the function containing them is called.
    -  // The language spec requires a new object created even if you don't access
    -  // the $1 members.
    -  var pr_amp = /&/g;
    -  var pr_lt = /</g;
    -  var pr_gt = />/g;
    -  var pr_quot = /\"/g;
    -  /** like textToHtml but escapes double quotes to be attribute safe. */
    -  function attribToHtml(str) {
    -    return str.replace(pr_amp, '&amp;')
    -        .replace(pr_lt, '&lt;')
    -        .replace(pr_gt, '&gt;')
    -        .replace(pr_quot, '&quot;');
    -  }
    -
    -  /** escapest html special characters to html. */
    -  function textToHtml(str) {
    -    return str.replace(pr_amp, '&amp;')
    -        .replace(pr_lt, '&lt;')
    -        .replace(pr_gt, '&gt;');
    -  }
    -
    -
    -  var pr_ltEnt = /&lt;/g;
    -  var pr_gtEnt = /&gt;/g;
    -  var pr_aposEnt = /&apos;/g;
    -  var pr_quotEnt = /&quot;/g;
    -  var pr_ampEnt = /&amp;/g;
    -  var pr_nbspEnt = /&nbsp;/g;
    -  /** unescapes html to plain text. */
    -  function htmlToText(html) {
    -    var pos = html.indexOf('&');
    -    if (pos < 0) { return html; }
    -    // Handle numeric entities specially.  We can't use functional substitution
    -    // since that doesn't work in older versions of Safari.
    -    // These should be rare since most browsers convert them to normal chars.
    -    for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
    -      var end = html.indexOf(';', pos);
    -      if (end >= 0) {
    -        var num = html.substring(pos + 3, end);
    -        var radix = 10;
    -        if (num && num.charAt(0) === 'x') {
    -          num = num.substring(1);
    -          radix = 16;
    -        }
    -        var codePoint = parseInt(num, radix);
    -        if (!isNaN(codePoint)) {
    -          html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
    -                  html.substring(end + 1));
    -        }
    -      }
    -    }
    -
    -    return html.replace(pr_ltEnt, '<')
    -        .replace(pr_gtEnt, '>')
    -        .replace(pr_aposEnt, "'")
    -        .replace(pr_quotEnt, '"')
    -        .replace(pr_nbspEnt, ' ')
    -        .replace(pr_ampEnt, '&');
    -  }
    -
    -  /** is the given node's innerHTML normally unescaped? */
    -  function isRawContent(node) {
    -    return 'XMP' === node.tagName;
    -  }
    -
    -  var newlineRe = /[\r\n]/g;
    -  /**
    -   * Are newlines and adjacent spaces significant in the given node's innerHTML?
    -   */
    -  function isPreformatted(node, content) {
    -    // PRE means preformatted, and is a very common case, so don't create
    -    // unnecessary computed style objects.
    -    if ('PRE' === node.tagName) { return true; }
    -    if (!newlineRe.test(content)) { return true; }  // Don't care
    -    var whitespace = '';
    -    // For disconnected nodes, IE has no currentStyle.
    -    if (node.currentStyle) {
    -      whitespace = node.currentStyle.whiteSpace;
    -    } else if (window.getComputedStyle) {
    -      // Firefox makes a best guess if node is disconnected whereas Safari
    -      // returns the empty string.
    -      whitespace = window.getComputedStyle(node, null).whiteSpace;
    -    }
    -    return !whitespace || whitespace === 'pre';
    -  }
    -
    -  function normalizedHtml(node, out, opt_sortAttrs) {
    -    switch (node.nodeType) {
    -      case 1:  // an element
    -        var name = node.tagName.toLowerCase();
    -
    -        out.push('<', name);
    -        var attrs = node.attributes;
    -        var n = attrs.length;
    -        if (n) {
    -          if (opt_sortAttrs) {
    -            var sortedAttrs = [];
    -            for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }
    -            sortedAttrs.sort(function (a, b) {
    -                return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;
    -              });
    -            attrs = sortedAttrs;
    -          }
    -          for (var i = 0; i < n; ++i) {
    -            var attr = attrs[i];
    -            if (!attr.specified) { continue; }
    -            out.push(' ', attr.name.toLowerCase(),
    -                     '="', attribToHtml(attr.value), '"');
    -          }
    -        }
    -        out.push('>');
    -        for (var child = node.firstChild; child; child = child.nextSibling) {
    -          normalizedHtml(child, out, opt_sortAttrs);
    -        }
    -        if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
    -          out.push('<\/', name, '>');
    -        }
    -        break;
    -      case 3: case 4: // text
    -        out.push(textToHtml(node.nodeValue));
    -        break;
    -    }
    -  }
    -
    -  /**
    -   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    -   * matches the union o the sets o strings matched d by the input RegExp.
    -   * Since it matches globally, if the input strings have a start-of-input
    -   * anchor (/^.../), it is ignored for the purposes of unioning.
    -   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    -   * @return {RegExp} a global regex.
    -   */
    -  function combinePrefixPatterns(regexs) {
    -    var capturedGroupIndex = 0;
    -
    -    var needToFoldCase = false;
    -    var ignoreCase = false;
    -    for (var i = 0, n = regexs.length; i < n; ++i) {
    -      var regex = regexs[i];
    -      if (regex.ignoreCase) {
    -        ignoreCase = true;
    -      } else if (/[a-z]/i.test(regex.source.replace(
    -                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    -        needToFoldCase = true;
    -        ignoreCase = false;
    -        break;
    -      }
    -    }
    -
    -    function decodeEscape(charsetPart) {
    -      if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
    -      switch (charsetPart.charAt(1)) {
    -        case 'b': return 8;
    -        case 't': return 9;
    -        case 'n': return 0xa;
    -        case 'v': return 0xb;
    -        case 'f': return 0xc;
    -        case 'r': return 0xd;
    -        case 'u': case 'x':
    -          return parseInt(charsetPart.substring(2), 16)
    -              || charsetPart.charCodeAt(1);
    -        case '0': case '1': case '2': case '3': case '4':
    -        case '5': case '6': case '7':
    -          return parseInt(charsetPart.substring(1), 8);
    -        default: return charsetPart.charCodeAt(1);
    -      }
    -    }
    -
    -    function encodeEscape(charCode) {
    -      if (charCode < 0x20) {
    -        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    -      }
    -      var ch = String.fromCharCode(charCode);
    -      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
    -        ch = '\\' + ch;
    -      }
    -      return ch;
    -    }
    -
    -    function caseFoldCharset(charSet) {
    -      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    -          new RegExp(
    -              '\\\\u[0-9A-Fa-f]{4}'
    -              + '|\\\\x[0-9A-Fa-f]{2}'
    -              + '|\\\\[0-3][0-7]{0,2}'
    -              + '|\\\\[0-7]{1,2}'
    -              + '|\\\\[\\s\\S]'
    -              + '|-'
    -              + '|[^-\\\\]',
    -              'g'));
    -      var groups = [];
    -      var ranges = [];
    -      var inverse = charsetParts[0] === '^';
    -      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    -        var p = charsetParts[i];
    -        switch (p) {
    -          case '\\B': case '\\b':
    -          case '\\D': case '\\d':
    -          case '\\S': case '\\s':
    -          case '\\W': case '\\w':
    -            groups.push(p);
    -            continue;
    -        }
    -        var start = decodeEscape(p);
    -        var end;
    -        if (i + 2 < n && '-' === charsetParts[i + 1]) {
    -          end = decodeEscape(charsetParts[i + 2]);
    -          i += 2;
    -        } else {
    -          end = start;
    -        }
    -        ranges.push([start, end]);
    -        // If the range might intersect letters, then expand it.
    -        if (!(end < 65 || start > 122)) {
    -          if (!(end < 65 || start > 90)) {
    -            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    -          }
    -          if (!(end < 97 || start > 122)) {
    -            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    -          }
    -        }
    -      }
    -
    -      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    -      // -> [[1, 12], [14, 14], [16, 17]]
    -      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    -      var consolidatedRanges = [];
    -      var lastRange = [NaN, NaN];
    -      for (var i = 0; i < ranges.length; ++i) {
    -        var range = ranges[i];
    -        if (range[0] <= lastRange[1] + 1) {
    -          lastRange[1] = Math.max(lastRange[1], range[1]);
    -        } else {
    -          consolidatedRanges.push(lastRange = range);
    -        }
    -      }
    -
    -      var out = ['['];
    -      if (inverse) { out.push('^'); }
    -      out.push.apply(out, groups);
    -      for (var i = 0; i < consolidatedRanges.length; ++i) {
    -        var range = consolidatedRanges[i];
    -        out.push(encodeEscape(range[0]));
    -        if (range[1] > range[0]) {
    -          if (range[1] + 1 > range[0]) { out.push('-'); }
    -          out.push(encodeEscape(range[1]));
    -        }
    -      }
    -      out.push(']');
    -      return out.join('');
    -    }
    -
    -    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    -      // Split into character sets, escape sequences, punctuation strings
    -      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    -      // include any of the above.
    -      var parts = regex.source.match(
    -          new RegExp(
    -              '(?:'
    -              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    -              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    -              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    -              + '|\\\\[0-9]+'  // a back-reference or octal escape
    -              + '|\\\\[^ux0-9]'  // other escape sequence
    -              + '|\\(\\?[:!=]'  // start of a non-capturing group
    -              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
    -              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    -              + ')',
    -              'g'));
    -      var n = parts.length;
    -
    -      // Maps captured group numbers to the number they will occupy in
    -      // the output or to -1 if that has not been determined, or to
    -      // undefined if they need not be capturing in the output.
    -      var capturedGroups = [];
    -
    -      // Walk over and identify back references to build the capturedGroups
    -      // mapping.
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        var p = parts[i];
    -        if (p === '(') {
    -          // groups are 1-indexed, so max group index is count of '('
    -          ++groupIndex;
    -        } else if ('\\' === p.charAt(0)) {
    -          var decimalValue = +p.substring(1);
    -          if (decimalValue && decimalValue <= groupIndex) {
    -            capturedGroups[decimalValue] = -1;
    -          }
    -        }
    -      }
    -
    -      // Renumber groups and reduce capturing groups to non-capturing groups
    -      // where possible.
    -      for (var i = 1; i < capturedGroups.length; ++i) {
    -        if (-1 === capturedGroups[i]) {
    -          capturedGroups[i] = ++capturedGroupIndex;
    -        }
    -      }
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        var p = parts[i];
    -        if (p === '(') {
    -          ++groupIndex;
    -          if (capturedGroups[groupIndex] === undefined) {
    -            parts[i] = '(?:';
    -          }
    -        } else if ('\\' === p.charAt(0)) {
    -          var decimalValue = +p.substring(1);
    -          if (decimalValue && decimalValue <= groupIndex) {
    -            parts[i] = '\\' + capturedGroups[groupIndex];
    -          }
    -        }
    -      }
    -
    -      // Remove any prefix anchors so that the output will match anywhere.
    -      // ^^ really does mean an anchored match though.
    -      for (var i = 0, groupIndex = 0; i < n; ++i) {
    -        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    -      }
    -
    -      // Expand letters to groupts to handle mixing of case-sensitive and
    -      // case-insensitive patterns if necessary.
    -      if (regex.ignoreCase && needToFoldCase) {
    -        for (var i = 0; i < n; ++i) {
    -          var p = parts[i];
    -          var ch0 = p.charAt(0);
    -          if (p.length >= 2 && ch0 === '[') {
    -            parts[i] = caseFoldCharset(p);
    -          } else if (ch0 !== '\\') {
    -            // TODO: handle letters in numeric escapes.
    -            parts[i] = p.replace(
    -                /[a-zA-Z]/g,
    -                function (ch) {
    -                  var cc = ch.charCodeAt(0);
    -                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    -                });
    -          }
    -        }
    -      }
    -
    -      return parts.join('');
    -    }
    -
    -    var rewritten = [];
    -    for (var i = 0, n = regexs.length; i < n; ++i) {
    -      var regex = regexs[i];
    -      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    -      rewritten.push(
    -          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    -    }
    -
    -    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    -  }
    -
    -  var PR_innerHtmlWorks = null;
    -  function getInnerHtml(node) {
    -    // inner html is hopelessly broken in Safari 2.0.4 when the content is
    -    // an html description of well formed XML and the containing tag is a PRE
    -    // tag, so we detect that case and emulate innerHTML.
    -    if (null === PR_innerHtmlWorks) {
    -      var testNode = document.createElement('PRE');
    -      testNode.appendChild(
    -          document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
    -      PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
    -    }
    -
    -    if (PR_innerHtmlWorks) {
    -      var content = node.innerHTML;
    -      // XMP tags contain unescaped entities so require special handling.
    -      if (isRawContent(node)) {
    -        content = textToHtml(content);
    -      } else if (!isPreformatted(node, content)) {
    -        content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
    -            .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
    -      }
    -      return content;
    -    }
    -
    -    var out = [];
    -    for (var child = node.firstChild; child; child = child.nextSibling) {
    -      normalizedHtml(child, out);
    -    }
    -    return out.join('');
    -  }
    -
    -  /** returns a function that expand tabs to spaces.  This function can be fed
    -    * successive chunks of text, and will maintain its own internal state to
    -    * keep track of how tabs are expanded.
    -    * @return {function (string) : string} a function that takes
    -    *   plain text and return the text with tabs expanded.
    -    * @private
    -    */
    -  function makeTabExpander(tabWidth) {
    -    var SPACES = '                ';
    -    var charInLine = 0;
    -
    -    return function (plainText) {
    -      // walk over each character looking for tabs and newlines.
    -      // On tabs, expand them.  On newlines, reset charInLine.
    -      // Otherwise increment charInLine
    -      var out = null;
    -      var pos = 0;
    -      for (var i = 0, n = plainText.length; i < n; ++i) {
    -        var ch = plainText.charAt(i);
    -
    -        switch (ch) {
    -          case '\t':
    -            if (!out) { out = []; }
    -            out.push(plainText.substring(pos, i));
    -            // calculate how much space we need in front of this part
    -            // nSpaces is the amount of padding -- the number of spaces needed
    -            // to move us to the next column, where columns occur at factors of
    -            // tabWidth.
    -            var nSpaces = tabWidth - (charInLine % tabWidth);
    -            charInLine += nSpaces;
    -            for (; nSpaces >= 0; nSpaces -= SPACES.length) {
    -              out.push(SPACES.substring(0, nSpaces));
    -            }
    -            pos = i + 1;
    -            break;
    -          case '\n':
    -            charInLine = 0;
    -            break;
    -          default:
    -            ++charInLine;
    -        }
    -      }
    -      if (!out) { return plainText; }
    -      out.push(plainText.substring(pos));
    -      return out.join('');
    -    };
    -  }
    -
    -  var pr_chunkPattern = new RegExp(
    -      '[^<]+'  // A run of characters other than '<'
    -      + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
    -      + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
    -      // a probable tag that should not be highlighted
    -      + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
    -      + '|<',  // A '<' that does not begin a larger chunk
    -      'g');
    -  var pr_commentPrefix = /^<\!--/;
    -  var pr_cdataPrefix = /^<!\[CDATA\[/;
    -  var pr_brPrefix = /^<br\b/i;
    -  var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    -
    -  /** split markup into chunks of html tags (style null) and
    -    * plain text (style {@link #PR_PLAIN}), converting tags which are
    -    * significant for tokenization (<br>) into their textual equivalent.
    -    *
    -    * @param {string} s html where whitespace is considered significant.
    -    * @return {Object} source code and extracted tags.
    -    * @private
    -    */
    -  function extractTags(s) {
    -    // since the pattern has the 'g' modifier and defines no capturing groups,
    -    // this will return a list of all chunks which we then classify and wrap as
    -    // PR_Tokens
    -    var matches = s.match(pr_chunkPattern);
    -    var sourceBuf = [];
    -    var sourceBufLen = 0;
    -    var extractedTags = [];
    -    if (matches) {
    -      for (var i = 0, n = matches.length; i < n; ++i) {
    -        var match = matches[i];
    -        if (match.length > 1 && match.charAt(0) === '<') {
    -          if (pr_commentPrefix.test(match)) { continue; }
    -          if (pr_cdataPrefix.test(match)) {
    -            // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
    -            sourceBuf.push(match.substring(9, match.length - 3));
    -            sourceBufLen += match.length - 12;
    -          } else if (pr_brPrefix.test(match)) {
    -            // <br> tags are lexically significant so convert them to text.
    -            // This is undone later.
    -            sourceBuf.push('\n');
    -            ++sourceBufLen;
    -          } else {
    -            if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
    -              // A <span class="nocode"> will start a section that should be
    -              // ignored.  Continue walking the list until we see a matching end
    -              // tag.
    -              var name = match.match(pr_tagNameRe)[2];
    -              var depth = 1;
    -              var j;
    -              end_tag_loop:
    -              for (j = i + 1; j < n; ++j) {
    -                var name2 = matches[j].match(pr_tagNameRe);
    -                if (name2 && name2[2] === name) {
    -                  if (name2[1] === '/') {
    -                    if (--depth === 0) { break end_tag_loop; }
    -                  } else {
    -                    ++depth;
    -                  }
    -                }
    -              }
    -              if (j < n) {
    -                extractedTags.push(
    -                    sourceBufLen, matches.slice(i, j + 1).join(''));
    -                i = j;
    -              } else {  // Ignore unclosed sections.
    -                extractedTags.push(sourceBufLen, match);
    -              }
    -            } else {
    -              extractedTags.push(sourceBufLen, match);
    -            }
    -          }
    -        } else {
    -          var literalText = htmlToText(match);
    -          sourceBuf.push(literalText);
    -          sourceBufLen += literalText.length;
    -        }
    -      }
    -    }
    -    return { source: sourceBuf.join(''), tags: extractedTags };
    -  }
    -
    -  /** True if the given tag contains a class attribute with the nocode class. */
    -  function isNoCodeTag(tag) {
    -    return !!tag
    -        // First canonicalize the representation of attributes
    -        .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
    -                 ' $1="$2$3$4"')
    -        // Then look for the attribute we want.
    -        .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
    -  }
    -
    -  /**
    -   * Apply the given language handler to sourceCode and add the resulting
    -   * decorations to out.
    -   * @param {number} basePos the index of sourceCode within the chunk of source
    -   *    whose decorations are already present on out.
    -   */
    -  function appendDecorations(basePos, sourceCode, langHandler, out) {
    -    if (!sourceCode) { return; }
    -    var job = {
    -      source: sourceCode,
    -      basePos: basePos
    -    };
    -    langHandler(job);
    -    out.push.apply(out, job.decorations);
    -  }
    -
    -  /** Given triples of [style, pattern, context] returns a lexing function,
    -    * The lexing function interprets the patterns to find token boundaries and
    -    * returns a decoration list of the form
    -    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    -    * where index_n is an index into the sourceCode, and style_n is a style
    -    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    -    * all characters in sourceCode[index_n-1:index_n].
    -    *
    -    * The stylePatterns is a list whose elements have the form
    -    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    -    *
    -    * Style is a style constant like PR_PLAIN, or can be a string of the
    -    * form 'lang-FOO', where FOO is a language extension describing the
    -    * language of the portion of the token in $1 after pattern executes.
    -    * E.g., if style is 'lang-lisp', and group 1 contains the text
    -    * '(hello (world))', then that portion of the token will be passed to the
    -    * registered lisp handler for formatting.
    -    * The text before and after group 1 will be restyled using this decorator
    -    * so decorators should take care that this doesn't result in infinite
    -    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    -    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    -    * '<script>foo()<\/script>', which would cause the current decorator to
    -    * be called with '<script>' which would not match the same rule since
    -    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    -    * the generic tag rule.  The handler registered for the 'js' extension would
    -    * then be called with 'foo()', and finally, the current decorator would
    -    * be called with '<\/script>' which would not match the original rule and
    -    * so the generic tag rule would identify it as a tag.
    -    *
    -    * Pattern must only match prefixes, and if it matches a prefix, then that
    -    * match is considered a token with the same style.
    -    *
    -    * Context is applied to the last non-whitespace, non-comment token
    -    * recognized.
    -    *
    -    * Shortcut is an optional string of characters, any of which, if the first
    -    * character, gurantee that this pattern and only this pattern matches.
    -    *
    -    * @param {Array} shortcutStylePatterns patterns that always start with
    -    *   a known character.  Must have a shortcut string.
    -    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    -    *   order if the shortcut ones fail.  May have shortcuts.
    -    *
    -    * @return {function (Object)} a
    -    *   function that takes source code and returns a list of decorations.
    -    */
    -  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    -    var shortcuts = {};
    -    var tokenizer;
    -    (function () {
    -      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    -      var allRegexs = [];
    -      var regexKeys = {};
    -      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    -        var patternParts = allPatterns[i];
    -        var shortcutChars = patternParts[3];
    -        if (shortcutChars) {
    -          for (var c = shortcutChars.length; --c >= 0;) {
    -            shortcuts[shortcutChars.charAt(c)] = patternParts;
    -          }
    -        }
    -        var regex = patternParts[1];
    -        var k = '' + regex;
    -        if (!regexKeys.hasOwnProperty(k)) {
    -          allRegexs.push(regex);
    -          regexKeys[k] = null;
    -        }
    -      }
    -      allRegexs.push(/[\0-\uffff]/);
    -      tokenizer = combinePrefixPatterns(allRegexs);
    -    })();
    -
    -    var nPatterns = fallthroughStylePatterns.length;
    -    var notWs = /\S/;
    -
    -    /**
    -     * Lexes job.source and produces an output array job.decorations of style
    -     * classes preceded by the position at which they start in job.source in
    -     * order.
    -     *
    -     * @param {Object} job an object like {@code
    -     *    source: {string} sourceText plain text,
    -     *    basePos: {int} position of job.source in the larger chunk of
    -     *        sourceCode.
    -     * }
    -     */
    -    var decorate = function (job) {
    -      var sourceCode = job.source, basePos = job.basePos;
    -      /** Even entries are positions in source in ascending order.  Odd enties
    -        * are style markers (e.g., PR_COMMENT) that run from that position until
    -        * the end.
    -        * @type {Array.<number|string>}
    -        */
    -      var decorations = [basePos, PR_PLAIN];
    -      var pos = 0;  // index into sourceCode
    -      var tokens = sourceCode.match(tokenizer) || [];
    -      var styleCache = {};
    -
    -      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    -        var token = tokens[ti];
    -        var style = styleCache[token];
    -        var match = void 0;
    -
    -        var isEmbedded;
    -        if (typeof style === 'string') {
    -          isEmbedded = false;
    -        } else {
    -          var patternParts = shortcuts[token.charAt(0)];
    -          if (patternParts) {
    -            match = token.match(patternParts[1]);
    -            style = patternParts[0];
    -          } else {
    -            for (var i = 0; i < nPatterns; ++i) {
    -              patternParts = fallthroughStylePatterns[i];
    -              match = token.match(patternParts[1]);
    -              if (match) {
    -                style = patternParts[0];
    -                break;
    -              }
    -            }
    -
    -            if (!match) {  // make sure that we make progress
    -              style = PR_PLAIN;
    -            }
    -          }
    -
    -          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    -          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    -            isEmbedded = false;
    -            style = PR_SOURCE;
    -          }
    -
    -          if (!isEmbedded) { styleCache[token] = style; }
    -        }
    -
    -        var tokenStart = pos;
    -        pos += token.length;
    -
    -        if (!isEmbedded) {
    -          decorations.push(basePos + tokenStart, style);
    -        } else {  // Treat group 1 as an embedded block of source code.
    -          var embeddedSource = match[1];
    -          var embeddedSourceStart = token.indexOf(embeddedSource);
    -          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    -          if (match[2]) {
    -            // If embeddedSource can be blank, then it would match at the
    -            // beginning which would cause us to infinitely recurse on the
    -            // entire token, so we catch the right context in match[2].
    -            embeddedSourceEnd = token.length - match[2].length;
    -            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    -          }
    -          var lang = style.substring(5);
    -          // Decorate the left of the embedded source
    -          appendDecorations(
    -              basePos + tokenStart,
    -              token.substring(0, embeddedSourceStart),
    -              decorate, decorations);
    -          // Decorate the embedded source
    -          appendDecorations(
    -              basePos + tokenStart + embeddedSourceStart,
    -              embeddedSource,
    -              langHandlerForExtension(lang, embeddedSource),
    -              decorations);
    -          // Decorate the right of the embedded section
    -          appendDecorations(
    -              basePos + tokenStart + embeddedSourceEnd,
    -              token.substring(embeddedSourceEnd),
    -              decorate, decorations);
    -        }
    -      }
    -      job.decorations = decorations;
    -    };
    -    return decorate;
    -  }
    -
    -  /** returns a function that produces a list of decorations from source text.
    -    *
    -    * This code treats ", ', and ` as string delimiters, and \ as a string
    -    * escape.  It does not recognize perl's qq() style strings.
    -    * It has no special handling for double delimiter escapes as in basic, or
    -    * the tripled delimiters used in python, but should work on those regardless
    -    * although in those cases a single string literal may be broken up into
    -    * multiple adjacent string literals.
    -    *
    -    * It recognizes C, C++, and shell style comments.
    -    *
    -    * @param {Object} options a set of optional parameters.
    -    * @return {function (Object)} a function that examines the source code
    -    *     in the input job and builds the decoration list.
    -    */
    -  function sourceDecorator(options) {
    -    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    -    if (options['tripleQuotedStrings']) {
    -      // '''multi-line-string''', 'single-line-string', and double-quoted
    -      shortcutStylePatterns.push(
    -          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    -           null, '\'"']);
    -    } else if (options['multiLineStrings']) {
    -      // 'multi-line-string', "multi-line-string"
    -      shortcutStylePatterns.push(
    -          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    -           null, '\'"`']);
    -    } else {
    -      // 'single-line-string', "single-line-string"
    -      shortcutStylePatterns.push(
    -          [PR_STRING,
    -           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    -           null, '"\'']);
    -    }
    -    if (options['verbatimStrings']) {
    -      // verbatim-string-literal production from the C# grammar.  See issue 93.
    -      fallthroughStylePatterns.push(
    -          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    -    }
    -    if (options['hashComments']) {
    -      if (options['cStyleComments']) {
    -        // Stop C preprocessor declarations at an unclosed open comment
    -        shortcutStylePatterns.push(
    -            [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
    -             null, '#']);
    -        fallthroughStylePatterns.push(
    -            [PR_STRING,
    -             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
    -             null]);
    -      } else {
    -        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    -      }
    -    }
    -    if (options['cStyleComments']) {
    -      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    -      fallthroughStylePatterns.push(
    -          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    -    }
    -    if (options['regexLiterals']) {
    -      var REGEX_LITERAL = (
    -          // A regular expression literal starts with a slash that is
    -          // not followed by * or / so that it is not confused with
    -          // comments.
    -          '/(?=[^/*])'
    -          // and then contains any number of raw characters,
    -          + '(?:[^/\\x5B\\x5C]'
    -          // escape sequences (\x5C),
    -          +    '|\\x5C[\\s\\S]'
    -          // or non-nesting character sets (\x5B\x5D);
    -          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
    -          // finally closed by a /.
    -          + '/');
    -      fallthroughStylePatterns.push(
    -          ['lang-regex',
    -           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    -           ]);
    -    }
    -
    -    var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
    -    if (keywords.length) {
    -      fallthroughStylePatterns.push(
    -          [PR_KEYWORD,
    -           new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
    -    }
    -
    -    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    -    fallthroughStylePatterns.push(
    -        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    -        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    -        [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
    -        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    -        [PR_LITERAL,
    -         new RegExp(
    -             '^(?:'
    -             // A hex number
    -             + '0x[a-f0-9]+'
    -             // or an octal or decimal number,
    -             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    -             // possibly in scientific notation
    -             + '(?:e[+\\-]?\\d+)?'
    -             + ')'
    -             // with an optional modifier like UL for unsigned long
    -             + '[a-z]*', 'i'),
    -         null, '0123456789'],
    -        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    -
    -    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    -  }
    -
    -  var decorateSource = sourceDecorator({
    -        'keywords': ALL_KEYWORDS,
    -        'hashComments': true,
    -        'cStyleComments': true,
    -        'multiLineStrings': true,
    -        'regexLiterals': true
    -      });
    -
    -  /** Breaks {@code job.source} around style boundaries in
    -    * {@code job.decorations} while re-interleaving {@code job.extractedTags},
    -    * and leaves the result in {@code job.prettyPrintedHtml}.
    -    * @param {Object} job like {
    -    *    source: {string} source as plain text,
    -    *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
    -    *                   html preceded by their position in {@code job.source}
    -    *                   in order
    -    *    decorations: {Array.<number|string} an array of style classes preceded
    -    *                 by the position at which they start in job.source in order
    -    * }
    -    * @private
    -    */
    -  function recombineTagsAndDecorations(job) {
    -    var sourceText = job.source;
    -    var extractedTags = job.extractedTags;
    -    var decorations = job.decorations;
    -
    -    var html = [];
    -    // index past the last char in sourceText written to html
    -    var outputIdx = 0;
    -
    -    var openDecoration = null;
    -    var currentDecoration = null;
    -    var tagPos = 0;  // index into extractedTags
    -    var decPos = 0;  // index into decorations
    -    var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    -
    -    var adjacentSpaceRe = /([\r\n ]) /g;
    -    var startOrSpaceRe = /(^| ) /gm;
    -    var newlineRe = /\r\n?|\n/g;
    -    var trailingSpaceRe = /[ \r\n]$/;
    -    var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    -
    -    // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
    -    var isIE678 = window['_pr_isIE6']();
    -    var lineBreakHtml = (
    -        isIE678
    -        ? (job.sourceNode.tagName === 'PRE'
    -           // Use line feeds instead of <br>s so that copying and pasting works
    -           // on IE.
    -           // Doing this on other browsers breaks lots of stuff since \r\n is
    -           // treated as two newlines on Firefox.
    -           ? (isIE678 === 6 ? '&#160;\r\n' :
    -              isIE678 === 7 ? '&#160;<br>\r' : '&#160;\r')
    -           // IE collapses multiple adjacent <br>s into 1 line break.
    -           // Prefix every newline with '&#160;' to prevent such behavior.
    -           // &nbsp; is the same as &#160; but works in XML as well as HTML.
    -           : '&#160;<br />')
    -        : '<br />');
    -
    -    // Look for a class like linenums or linenums:<n> where <n> is the 1-indexed
    -    // number of the first line.
    -    var numberLines = job.sourceNode.className.match(/\blinenums\b(?::(\d+))?/);
    -    var lineBreaker;
    -    if (numberLines) {
    -      var lineBreaks = [];
    -      for (var i = 0; i < 10; ++i) {
    -        lineBreaks[i] = lineBreakHtml + '</li><li class="L' + i + '">';
    -      }
    -      var lineNum = numberLines[1] && numberLines[1].length
    -          ? numberLines[1] - 1 : 0;  // Lines are 1-indexed
    -      html.push('<ol class="linenums"><li class="L', (lineNum) % 10, '"');
    -      if (lineNum) {
    -        html.push(' value="', lineNum + 1, '"');
    -      }
    -      html.push('>');
    -      lineBreaker = function () {
    -        var lb = lineBreaks[++lineNum % 10];
    -        // If a decoration is open, we need to close it before closing a list-item
    -        // and reopen it on the other side of the list item.
    -        return openDecoration
    -            ? ('</span>' + lb + '<span class="' + openDecoration + '">') : lb;
    -      };
    -    } else {
    -      lineBreaker = lineBreakHtml;
    -    }
    -
    -    // A helper function that is responsible for opening sections of decoration
    -    // and outputing properly escaped chunks of source
    -    function emitTextUpTo(sourceIdx) {
    -      if (sourceIdx > outputIdx) {
    -        if (openDecoration && openDecoration !== currentDecoration) {
    -          // Close the current decoration
    -          html.push('</span>');
    -          openDecoration = null;
    -        }
    -        if (!openDecoration && currentDecoration) {
    -          openDecoration = currentDecoration;
    -          html.push('<span class="', openDecoration, '">');
    -        }
    -        // This interacts badly with some wikis which introduces paragraph tags
    -        // into pre blocks for some strange reason.
    -        // It's necessary for IE though which seems to lose the preformattedness
    -        // of <pre> tags when their innerHTML is assigned.
    -        // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
    -        // and it serves to undo the conversion of <br>s to newlines done in
    -        // chunkify.
    -        var htmlChunk = textToHtml(
    -            tabExpander(sourceText.substring(outputIdx, sourceIdx)))
    -            .replace(lastWasSpace
    -                     ? startOrSpaceRe
    -                     : adjacentSpaceRe, '$1&#160;');
    -        // Keep track of whether we need to escape space at the beginning of the
    -        // next chunk.
    -        lastWasSpace = trailingSpaceRe.test(htmlChunk);
    -        html.push(htmlChunk.replace(newlineRe, lineBreaker));
    -        outputIdx = sourceIdx;
    -      }
    -    }
    -
    -    while (true) {
    -      // Determine if we're going to consume a tag this time around.  Otherwise
    -      // we consume a decoration or exit.
    -      var outputTag;
    -      if (tagPos < extractedTags.length) {
    -        if (decPos < decorations.length) {
    -          // Pick one giving preference to extractedTags since we shouldn't open
    -          // a new style that we're going to have to immediately close in order
    -          // to output a tag.
    -          outputTag = extractedTags[tagPos] <= decorations[decPos];
    -        } else {
    -          outputTag = true;
    -        }
    -      } else {
    -        outputTag = false;
    -      }
    -      // Consume either a decoration or a tag or exit.
    -      if (outputTag) {
    -        emitTextUpTo(extractedTags[tagPos]);
    -        if (openDecoration) {
    -          // Close the current decoration
    -          html.push('</span>');
    -          openDecoration = null;
    -        }
    -        html.push(extractedTags[tagPos + 1]);
    -        tagPos += 2;
    -      } else if (decPos < decorations.length) {
    -        emitTextUpTo(decorations[decPos]);
    -        currentDecoration = decorations[decPos + 1];
    -        decPos += 2;
    -      } else {
    -        break;
    -      }
    -    }
    -    emitTextUpTo(sourceText.length);
    -    if (openDecoration) {
    -      html.push('</span>');
    -    }
    -    if (numberLines) { html.push('</li></ol>'); }
    -    job.prettyPrintedHtml = html.join('');
    -  }
    -
    -  /** Maps language-specific file extensions to handlers. */
    -  var langHandlerRegistry = {};
    -  /** Register a language handler for the given file extensions.
    -    * @param {function (Object)} handler a function from source code to a list
    -    *      of decorations.  Takes a single argument job which describes the
    -    *      state of the computation.   The single parameter has the form
    -    *      {@code {
    -    *        source: {string} as plain text.
    -    *        decorations: {Array.<number|string>} an array of style classes
    -    *                     preceded by the position at which they start in
    -    *                     job.source in order.
    -    *                     The language handler should assigned this field.
    -    *        basePos: {int} the position of source in the larger source chunk.
    -    *                 All positions in the output decorations array are relative
    -    *                 to the larger source chunk.
    -    *      } }
    -    * @param {Array.<string>} fileExtensions
    -    */
    -  function registerLangHandler(handler, fileExtensions) {
    -    for (var i = fileExtensions.length; --i >= 0;) {
    -      var ext = fileExtensions[i];
    -      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    -        langHandlerRegistry[ext] = handler;
    -      } else if ('console' in window) {
    -        console['warn']('cannot override language handler %s', ext);
    -      }
    -    }
    -  }
    -  function langHandlerForExtension(extension, source) {
    -    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    -      // Treat it as markup if the first non whitespace character is a < and
    -      // the last non-whitespace character is a >.
    -      extension = /^\s*</.test(source)
    -          ? 'default-markup'
    -          : 'default-code';
    -    }
    -    return langHandlerRegistry[extension];
    -  }
    -  registerLangHandler(decorateSource, ['default-code']);
    -  registerLangHandler(
    -      createSimpleLexer(
    -          [],
    -          [
    -           [PR_PLAIN,       /^[^<?]+/],
    -           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    -           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    -           // Unescaped content in an unknown language
    -           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    -           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    -           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    -           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    -           // Unescaped content in javascript.  (Or possibly vbscript).
    -           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    -           // Contains unescaped stylesheet content
    -           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    -           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    -          ]),
    -      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    -  registerLangHandler(
    -      createSimpleLexer(
    -          [
    -           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    -           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    -           ],
    -          [
    -           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    -           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    -           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    -           [PR_PUNCTUATION,  /^[=<>\/]+/],
    -           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    -           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    -           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    -           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    -           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    -           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    -           ]),
    -      ['in.tag']);
    -  registerLangHandler(
    -      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': CPP_KEYWORDS,
    -          'hashComments': true,
    -          'cStyleComments': true
    -        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': 'null true false'
    -        }), ['json']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': CSHARP_KEYWORDS,
    -          'hashComments': true,
    -          'cStyleComments': true,
    -          'verbatimStrings': true
    -        }), ['cs']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': JAVA_KEYWORDS,
    -          'cStyleComments': true
    -        }), ['java']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': SH_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true
    -        }), ['bsh', 'csh', 'sh']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': PYTHON_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'tripleQuotedStrings': true
    -        }), ['cv', 'py']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': PERL_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'regexLiterals': true
    -        }), ['perl', 'pl', 'pm']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': RUBY_KEYWORDS,
    -          'hashComments': true,
    -          'multiLineStrings': true,
    -          'regexLiterals': true
    -        }), ['rb']);
    -  registerLangHandler(sourceDecorator({
    -          'keywords': JSCRIPT_KEYWORDS,
    -          'cStyleComments': true,
    -          'regexLiterals': true
    -        }), ['js']);
    -  registerLangHandler(
    -      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    -
    -  function applyDecorator(job) {
    -    var sourceCodeHtml = job.sourceCodeHtml;
    -    var opt_langExtension = job.langExtension;
    -
    -    // Prepopulate output in case processing fails with an exception.
    -    job.prettyPrintedHtml = sourceCodeHtml;
    -
    -    try {
    -      // Extract tags, and convert the source code to plain text.
    -      var sourceAndExtractedTags = extractTags(sourceCodeHtml);
    -      /** Plain text. @type {string} */
    -      var source = sourceAndExtractedTags.source;
    -      job.source = source;
    -      job.basePos = 0;
    -
    -      /** Even entries are positions in source in ascending order.  Odd entries
    -        * are tags that were extracted at that position.
    -        * @type {Array.<number|string>}
    -        */
    -      job.extractedTags = sourceAndExtractedTags.tags;
    -
    -      // Apply the appropriate language handler
    -      langHandlerForExtension(opt_langExtension, source)(job);
    -      // Integrate the decorations and tags back into the source code to produce
    -      // a decorated html string which is left in job.prettyPrintedHtml.
    -      recombineTagsAndDecorations(job);
    -    } catch (e) {
    -      if ('console' in window) {
    -        console['log'](e && e['stack'] ? e['stack'] : e);
    -      }
    -    }
    -  }
    -
    -  function prettyPrintOne(sourceCodeHtml, opt_langExtension) {
    -    var job = {
    -      sourceCodeHtml: sourceCodeHtml,
    -      langExtension: opt_langExtension
    -    };
    -    applyDecorator(job);
    -    return job.prettyPrintedHtml;
    -  }
    -
    -  function prettyPrint(opt_whenDone) {
    -    function byTagName(tn) { return document.getElementsByTagName(tn); }
    -    // fetch a list of nodes to rewrite
    -    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    -    var elements = [];
    -    for (var i = 0; i < codeSegments.length; ++i) {
    -      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    -        elements.push(codeSegments[i][j]);
    -      }
    -    }
    -    codeSegments = null;
    -
    -    var clock = Date;
    -    if (!clock['now']) {
    -      clock = { 'now': function () { return (new Date).getTime(); } };
    -    }
    -
    -    // The loop is broken into a series of continuations to make sure that we
    -    // don't make the browser unresponsive when rewriting a large page.
    -    var k = 0;
    -    var prettyPrintingJob;
    -
    -    function doWork() {
    -      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
    -                     clock.now() + 250 /* ms */ :
    -                     Infinity);
    -      for (; k < elements.length && clock.now() < endTime; k++) {
    -        var cs = elements[k];
    -        // [JACOCO] 'prettyprint' -> 'source'
    -        if (cs.className && cs.className.indexOf('source') >= 0) {
    -          // If the classes includes a language extensions, use it.
    -          // Language extensions can be specified like
    -          //     <pre class="prettyprint lang-cpp">
    -          // the language extension "cpp" is used to find a language handler as
    -          // passed to PR_registerLangHandler.
    -          var langExtension = cs.className.match(/\blang-(\w+)\b/);
    -          if (langExtension) { langExtension = langExtension[1]; }
    -
    -          // make sure this is not nested in an already prettified element
    -          var nested = false;
    -          for (var p = cs.parentNode; p; p = p.parentNode) {
    -            if ((p.tagName === 'pre' || p.tagName === 'code' ||
    -                 p.tagName === 'xmp') &&
    -                // [JACOCO] 'prettyprint' -> 'source'
    -                p.className && p.className.indexOf('source') >= 0) {
    -              nested = true;
    -              break;
    -            }
    -          }
    -          if (!nested) {
    -            // fetch the content as a snippet of properly escaped HTML.
    -            // Firefox adds newlines at the end.
    -            var content = getInnerHtml(cs);
    -            content = content.replace(/(?:\r\n?|\n)$/, '');
    -
    -            // do the pretty printing
    -            prettyPrintingJob = {
    -              sourceCodeHtml: content,
    -              langExtension: langExtension,
    -              sourceNode: cs
    -            };
    -            applyDecorator(prettyPrintingJob);
    -            replaceWithPrettyPrintedHtml();
    -          }
    -        }
    -      }
    -      if (k < elements.length) {
    -        // finish up in a continuation
    -        setTimeout(doWork, 250);
    -      } else if (opt_whenDone) {
    -        opt_whenDone();
    -      }
    -    }
    -
    -    function replaceWithPrettyPrintedHtml() {
    -      var newContent = prettyPrintingJob.prettyPrintedHtml;
    -      if (!newContent) { return; }
    -      var cs = prettyPrintingJob.sourceNode;
    -
    -      // push the prettified html back into the tag.
    -      if (!isRawContent(cs)) {
    -        // just replace the old html with the new
    -        cs.innerHTML = newContent;
    -      } else {
    -        // we need to change the tag to a <pre> since <xmp>s do not allow
    -        // embedded tags such as the span tags used to attach styles to
    -        // sections of source code.
    -        var pre = document.createElement('PRE');
    -        for (var i = 0; i < cs.attributes.length; ++i) {
    -          var a = cs.attributes[i];
    -          if (a.specified) {
    -            var aname = a.name.toLowerCase();
    -            if (aname === 'class') {
    -              pre.className = a.value;  // For IE 6
    -            } else {
    -              pre.setAttribute(a.name, a.value);
    -            }
    -          }
    -        }
    -        pre.innerHTML = newContent;
    -
    -        // remove the old
    -        cs.parentNode.replaceChild(pre, cs);
    -        cs = pre;
    -      }
    -    }
    -
    -    doWork();
    -  }
    -
    -  window['PR_normalizedHtml'] = normalizedHtml;
    -  window['prettyPrintOne'] = prettyPrintOne;
    -  window['prettyPrint'] = prettyPrint;
    -  window['PR'] = {
    -        'combinePrefixPatterns': combinePrefixPatterns,
    -        'createSimpleLexer': createSimpleLexer,
    -        'registerLangHandler': registerLangHandler,
    -        'sourceDecorator': sourceDecorator,
    -        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    -        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    -        'PR_COMMENT': PR_COMMENT,
    -        'PR_DECLARATION': PR_DECLARATION,
    -        'PR_KEYWORD': PR_KEYWORD,
    -        'PR_LITERAL': PR_LITERAL,
    -        'PR_NOCODE': PR_NOCODE,
    -        'PR_PLAIN': PR_PLAIN,
    -        'PR_PUNCTUATION': PR_PUNCTUATION,
    -        'PR_SOURCE': PR_SOURCE,
    -        'PR_STRING': PR_STRING,
    -        'PR_TAG': PR_TAG,
    -        'PR_TYPE': PR_TYPE
    -      };
    -})();
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/redbar.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/redbar.gif
    deleted file mode 100644
    index c2f71469..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/redbar.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/report.css b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/report.css
    deleted file mode 100644
    index dd936bca..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/report.css
    +++ /dev/null
    @@ -1,243 +0,0 @@
    -body, td {
    -  font-family:sans-serif;
    -  font-size:10pt;
    -}
    -
    -h1 {
    -  font-weight:bold;
    -  font-size:18pt;
    -}
    -
    -.breadcrumb {
    -  border:#d6d3ce 1px solid;
    -  padding:2px 4px 2px 4px;
    -}
    -
    -.breadcrumb .info {
    -  float:right;
    -}
    -
    -.breadcrumb .info a {
    -  margin-left:8px;
    -}
    -
    -.el_report {
    -  padding-left:18px;
    -  background-image:url(report.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_group {
    -  padding-left:18px;
    -  background-image:url(group.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_bundle {
    -  padding-left:18px;
    -  background-image:url(bundle.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_package {
    -  padding-left:18px;
    -  background-image:url(package.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_class {
    -  padding-left:18px;
    -  background-image:url(class.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_source {
    -  padding-left:18px;
    -  background-image:url(source.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_method {
    -  padding-left:18px;
    -  background-image:url(method.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -.el_session {
    -  padding-left:18px;
    -  background-image:url(session.gif);
    -  background-position:left center;
    -  background-repeat:no-repeat;
    -}
    -
    -pre.source {
    -  border:#d6d3ce 1px solid;
    -  font-family:monospace;
    -}
    -
    -pre.source ol {
    -  margin-bottom: 0px;
    -  margin-top: 0px;
    -}
    -
    -pre.source li {
    -  border-left: 1px solid #D6D3CE;
    -  color: #A0A0A0;
    -  padding-left: 0px;
    -}
    -
    -pre.source span.fc {
    -  background-color:#ccffcc;
    -}
    -
    -pre.source span.nc {
    -  background-color:#ffaaaa;
    -}
    -
    -pre.source span.pc {
    -  background-color:#ffffcc;
    -}
    -
    -pre.source span.bfc {
    -  background-image: url(branchfc.gif);
    -  background-repeat: no-repeat;
    -  background-position: 2px center;
    -}
    -
    -pre.source span.bfc:hover {
    -  background-color:#80ff80;
    -}
    -
    -pre.source span.bnc {
    -  background-image: url(branchnc.gif);
    -  background-repeat: no-repeat;
    -  background-position: 2px center;
    -}
    -
    -pre.source span.bnc:hover {
    -  background-color:#ff8080;
    -}
    -
    -pre.source span.bpc {
    -  background-image: url(branchpc.gif);
    -  background-repeat: no-repeat;
    -  background-position: 2px center;
    -}
    -
    -pre.source span.bpc:hover {
    -  background-color:#ffff80;
    -}
    -
    -table.coverage {
    -  empty-cells:show;
    -  border-collapse:collapse;
    -}
    -
    -table.coverage thead {
    -  background-color:#e0e0e0;
    -}
    -
    -table.coverage thead td {
    -  white-space:nowrap;
    -  padding:2px 14px 0px 6px;
    -  border-bottom:#b0b0b0 1px solid;
    -}
    -
    -table.coverage thead td.bar {
    -  border-left:#cccccc 1px solid;
    -}
    -
    -table.coverage thead td.ctr1 {
    -  text-align:right;
    -  border-left:#cccccc 1px solid;
    -}
    -
    -table.coverage thead td.ctr2 {
    -  text-align:right;
    -  padding-left:2px;
    -}
    -
    -table.coverage thead td.sortable {
    -  cursor:pointer;
    -  background-image:url(sort.gif);
    -  background-position:right center;
    -  background-repeat:no-repeat;
    -}
    -
    -table.coverage thead td.up {
    -  background-image:url(up.gif);
    -}
    -
    -table.coverage thead td.down {
    -  background-image:url(down.gif);
    -}
    -
    -table.coverage tbody td {
    -  white-space:nowrap;
    -  padding:2px 6px 2px 6px;
    -  border-bottom:#d6d3ce 1px solid;
    -}
    -
    -table.coverage tbody tr:hover {
    -  background: #f0f0d0 !important;
    -}
    -
    -table.coverage tbody td.bar {
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tbody td.ctr1 {
    -  text-align:right;
    -  padding-right:14px;
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tbody td.ctr2 {
    -  text-align:right;
    -  padding-right:14px;
    -  padding-left:2px;
    -}
    -
    -table.coverage tfoot td {
    -  white-space:nowrap;
    -  padding:2px 6px 2px 6px;
    -}
    -
    -table.coverage tfoot td.bar {
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tfoot td.ctr1 {
    -  text-align:right;
    -  padding-right:14px;
    -  border-left:#e8e8e8 1px solid;
    -}
    -
    -table.coverage tfoot td.ctr2 {
    -  text-align:right;
    -  padding-right:14px;
    -  padding-left:2px;
    -}
    -
    -.footer {
    -  margin-top:20px;
    -  border-top:#d6d3ce 1px solid;
    -  padding-top:2px;
    -  font-size:8pt;
    -  color:#a0a0a0;
    -}
    -
    -.footer a {
    -  color:#a0a0a0;
    -}
    -
    -.right {
    -  float:right;
    -}
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/report.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/report.gif
    deleted file mode 100644
    index 8547be50..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/report.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/session.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/session.gif
    deleted file mode 100644
    index 0151bad8..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/session.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/sort.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/sort.gif
    deleted file mode 100644
    index 6757c2c3..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/sort.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/sort.js b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/sort.js
    deleted file mode 100644
    index 9dcb0e8b..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/sort.js
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -/*******************************************************************************
    - * Copyright (c) 2009, 2024 Mountainminds GmbH & Co. KG and Contributors
    - * This program and the accompanying materials are made available under
    - * the terms of the Eclipse Public License 2.0 which is available at
    - * http://www.eclipse.org/legal/epl-2.0
    - *
    - * SPDX-License-Identifier: EPL-2.0
    - *
    - * Contributors:
    - *    Marc R. Hoffmann - initial API and implementation
    - *
    - *******************************************************************************/
    -
    -(function () {
    -
    -  /**
    -   * Sets the initial sorting derived from the hash.
    -   *
    -   * @param linkelementids
    -   *          list of element ids to search for links to add sort inidcator
    -   *          hash links
    -   */
    -  function initialSort(linkelementids) {
    -    window.linkelementids = linkelementids;
    -    var hash = window.location.hash;
    -    if (hash) {
    -      var m = hash.match(/up-./);
    -      if (m) {
    -        var header = window.document.getElementById(m[0].charAt(3));
    -        if (header) {
    -          sortColumn(header, true);
    -        }
    -        return;
    -      }
    -      var m = hash.match(/dn-./);
    -      if (m) {
    -        var header = window.document.getElementById(m[0].charAt(3));
    -        if (header) {
    -          sortColumn(header, false);
    -        }
    -        return
    -      }
    -    }
    -  }
    -
    -  /**
    -   * Sorts the columns with the given header dependening on the current sort state.
    -   */
    -  function toggleSort(header) {
    -    var sortup = header.className.indexOf('down ') == 0;
    -    sortColumn(header, sortup);
    -  }
    -
    -  /**
    -   * Sorts the columns with the given header in the given direction.
    -   */
    -  function sortColumn(header, sortup) {
    -    var table = header.parentNode.parentNode.parentNode;
    -    var body = table.tBodies[0];
    -    var colidx = getNodePosition(header);
    -
    -    resetSortedStyle(table);
    -
    -    var rows = body.rows;
    -    var sortedrows = [];
    -    for (var i = 0; i < rows.length; i++) {
    -      r = rows[i];
    -      sortedrows[parseInt(r.childNodes[colidx].id.slice(1))] = r;
    -    }
    -
    -    var hash;
    -
    -    if (sortup) {
    -      for (var i = sortedrows.length - 1; i >= 0; i--) {
    -        body.appendChild(sortedrows[i]);
    -      }
    -      header.className = 'up ' + header.className;
    -      hash = 'up-' + header.id;
    -    } else {
    -      for (var i = 0; i < sortedrows.length; i++) {
    -        body.appendChild(sortedrows[i]);
    -      }
    -      header.className = 'down ' + header.className;
    -      hash = 'dn-' + header.id;
    -    }
    -
    -    setHash(hash);
    -  }
    -
    -  /**
    -   * Adds the sort indicator as a hash to the document URL and all links.
    -   */
    -  function setHash(hash) {
    -    window.document.location.hash = hash;
    -    ids = window.linkelementids;
    -    for (var i = 0; i < ids.length; i++) {
    -        setHashOnAllLinks(document.getElementById(ids[i]), hash);
    -    }
    -  }
    -
    -  /**
    -   * Extend all links within the given tag with the given hash.
    -   */
    -  function setHashOnAllLinks(tag, hash) {
    -    links = tag.getElementsByTagName("a");
    -    for (var i = 0; i < links.length; i++) {
    -        var a = links[i];
    -        var href = a.href;
    -        var hashpos = href.indexOf("#");
    -        if (hashpos != -1) {
    -            href = href.substring(0, hashpos);
    -        }
    -        a.href = href + "#" + hash;
    -    }
    -  }
    -
    -  /**
    -   * Calculates the position of a element within its parent.
    -   */
    -  function getNodePosition(element) {
    -    var pos = -1;
    -    while (element) {
    -      element = element.previousSibling;
    -      pos++;
    -    }
    -    return pos;
    -  }
    -
    -  /**
    -   * Remove the sorting indicator style from all headers.
    -   */
    -  function resetSortedStyle(table) {
    -    for (var c = table.tHead.firstChild.firstChild; c; c = c.nextSibling) {
    -      if (c.className) {
    -        if (c.className.indexOf('down ') == 0) {
    -          c.className = c.className.slice(5);
    -        }
    -        if (c.className.indexOf('up ') == 0) {
    -          c.className = c.className.slice(3);
    -        }
    -      }
    -    }
    -  }
    -
    -  window['initialSort'] = initialSort;
    -  window['toggleSort'] = toggleSort;
    -
    -})();
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/source.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/source.gif
    deleted file mode 100644
    index b226e41c..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/source.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/up.gif b/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/up.gif
    deleted file mode 100644
    index 58ed2166..00000000
    Binary files a/sentrius-llm-dataplane/target/site/jacoco/jacoco-resources/up.gif and /dev/null differ
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco-sessions.html b/sentrius-llm-dataplane/target/site/jacoco/jacoco-sessions.html
    deleted file mode 100644
    index 452548b5..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco-sessions.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="jacoco-resources/report.gif" type="image/gif"/><title>Sessions</title></head><body><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="jacoco-sessions.html" class="el_session">Sessions</a></span><a href="index.html" class="el_report">sentrius-llm-dataplane</a> &gt; <span class="el_session">Sessions</span></div><h1>Sessions</h1><p>This coverage report is based on execution data from the following sessions:</p><table class="coverage" cellspacing="0"><thead><tr><td>Session</td><td>Start Time</td><td>Dump Time</td></tr></thead><tbody><tr><td><span class="el_session">pop-os-200c1a11</span></td><td>May 2, 2025, 1:59:01 PM</td><td>May 2, 2025, 1:59:02 PM</td></tr></tbody></table><p>Execution data for the following classes is considered in this report:</p><table class="coverage" cellspacing="0"><thead><tr><td>Class</td><td>Id</td></tr></thead><tbody><tr><td><span class="el_class">org.apache.maven.plugin.surefire.log.api.NullConsoleLogger</span></td><td><code>50e0945fec76b333</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.BaseProviderFactory</span></td><td><code>da939a0152866a4b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.BiProperty</span></td><td><code>ed0281592f3976b4</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.Command</span></td><td><code>52d7b732759793ff</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.Constants</span></td><td><code>8f58b0da27218c74</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.DumpErrorSingleton</span></td><td><code>ea25742803c9e73f</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.ForkedProcessEventType</span></td><td><code>4f32ae2d4e670365</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.ForkingReporterFactory</span></td><td><code>be06f83accc5a8aa</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.ForkingRunListener</span></td><td><code>c34d0a9f28f66585</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.MasterProcessCommand</span></td><td><code>fc8c116a509256d1</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.booter.Shutdown</span></td><td><code>47a37ed2a684ef1d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.cli.CommandLineOption</span></td><td><code>5825f848ee2abcd7</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.provider.AbstractProvider</span></td><td><code>0fea65ed91d7c12a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ConsoleOutputCapture</span></td><td><code>7ee3451cf95e2f70</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ConsoleOutputCapture.ForwardingPrintStream</span></td><td><code>804935f758ebaea3</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ConsoleOutputCapture.NullOutputStream</span></td><td><code>a81300d2d50decb6</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.ReporterConfiguration</span></td><td><code>bf4075c0385296c2</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.report.RunMode</span></td><td><code>70edc0a9dea60143</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder</span></td><td><code>c6f3b2781f9ac881</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.BufferedStream</span></td><td><code>11f69a75bc1c7211</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.Memento</span></td><td><code>e504a9e8cfc028af</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.Segment</span></td><td><code>773004ac6cd115ef</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamDecoder.StreamReadStatus</span></td><td><code>8d5ee1d510b5c935</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.AbstractStreamEncoder</span></td><td><code>9547668418a858ad</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.stream.SegmentType</span></td><td><code>77b0d78ed3ddd126</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.suite.RunResult</span></td><td><code>0eef4ae883b6fcaa</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.DirectoryScannerParameters</span></td><td><code>529e83b831c47f72</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.IncludedExcludedPatterns</span></td><td><code>e12220ce508068df</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest</span></td><td><code>119a5faa0ae08a91</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest.ClassMatcher</span></td><td><code>cb9dd1b6069a872b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest.MethodMatcher</span></td><td><code>1d5196f3dfcebd52</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.ResolvedTest.Type</span></td><td><code>6f46eedd1917ca66</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.RunOrderParameters</span></td><td><code>f74f6b3eb9f1a132</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.TestArtifactInfo</span></td><td><code>6d162cddde2db959</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.TestListResolver</span></td><td><code>0f4645f0d7fd02c8</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.testset.TestRequest</span></td><td><code>1cb2946d8f0dc9e4</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.CloseableIterator</span></td><td><code>01846c357efacb7b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.DefaultRunOrderCalculator</span></td><td><code>21a42ec0f6d63b8e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.DefaultScanResult</span></td><td><code>01695a339c66ab8d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.ReflectionUtils</span></td><td><code>7f9a430ae144c985</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.RunOrder</span></td><td><code>93376844e6d709d3</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.TestsToRun</span></td><td><code>db4e8195893ece6d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.TestsToRun.ClassesIterator</span></td><td><code>543f26bfbdd04ce0</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.AbstractNoninterruptibleReadableChannel</span></td><td><code>6826ce793980b64e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.AbstractNoninterruptibleWritableChannel</span></td><td><code>484afcc5593fbc9a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.Channels</span></td><td><code>eb60281181a1dc33</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.Channels.3</span></td><td><code>605144c3f67338aa</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.Channels.4</span></td><td><code>4834cf9402eabd28</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.DaemonThreadFactory</span></td><td><code>b2161e778265b95d</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.DaemonThreadFactory.NamedThreadFactory</span></td><td><code>e3fb668fa8792230</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.api.util.internal.DumpFileUtils</span></td><td><code>9cc0f89ffb46ba32</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.AbstractPathConfiguration</span></td><td><code>f8b4034fe9c934d2</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.BooterDeserializer</span></td><td><code>d2b4a565d2c195cc</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ClassLoaderConfiguration</span></td><td><code>c511fbfeb1f35c23</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.Classpath</span></td><td><code>d05af49602124353</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ClasspathConfiguration</span></td><td><code>d14c58928ac6aa7b</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.CommandReader</span></td><td><code>8bc1181d0c5af474</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.CommandReader.1</span></td><td><code>72a8e2906ddc1c93</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.CommandReader.CommandRunnable</span></td><td><code>f6a6b02be2fb0964</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter</span></td><td><code>c8ce6ed3be8ec9bc</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.1</span></td><td><code>68f2dae15ae26cc2</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.3</span></td><td><code>fc217f2c1d87c099</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.4</span></td><td><code>2afb302f7c81f991</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.6</span></td><td><code>850ef2748b5ef5e6</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.7</span></td><td><code>9577114e02a5bdef</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.8</span></td><td><code>3c8febd047cd2b0c</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedBooter.PingScheduler</span></td><td><code>c83e3af27d5d3c47</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ForkedNodeArg</span></td><td><code>9dbb0ff22dfc1303</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.PpidChecker</span></td><td><code>f83a9169197e13b1</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ProcessCheckerType</span></td><td><code>e554be35191ff5a7</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.PropertiesWrapper</span></td><td><code>1e4e30276db2e62e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.ProviderConfiguration</span></td><td><code>ec2cd1e39ec4278e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.StartupConfiguration</span></td><td><code>70176a3dd903d57a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.SystemPropertyManager</span></td><td><code>a843c08e9b5c79ad</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.TypeEncodedValue</span></td><td><code>355d20d53741b604</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.AbstractMasterProcessChannelProcessorFactory</span></td><td><code>67a1c051e3809086</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.AbstractMasterProcessChannelProcessorFactory.1</span></td><td><code>cc936f6c85f9235a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.AbstractMasterProcessChannelProcessorFactory.2</span></td><td><code>a1fa70e4af42c555</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.CommandChannelDecoder</span></td><td><code>6684e6bad0b7c71e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.EventChannelEncoder</span></td><td><code>b69d9287bf010b1a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelProcessorFactory</span></td><td><code>3b29862697f79d34</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.spi.SurefireMasterProcessChannelProcessorFactory</span></td><td><code>8c14c673718fba9e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.stream.CommandDecoder</span></td><td><code>a23a4082e2bbd1ed</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.stream.CommandDecoder.1</span></td><td><code>950700970edca54a</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.booter.stream.EventEncoder</span></td><td><code>7c894cb22c8c16ca</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.JUnitPlatformProvider</span></td><td><code>958f7eb4311b3c2f</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.LazyLauncher</span></td><td><code>a3841276826f155c</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.RunListenerAdapter</span></td><td><code>0d7041faa0298e70</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.junitplatform.TestPlanScannerFilter</span></td><td><code>db2b13639af3176e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.report.ClassMethodIndexer</span></td><td><code>0e8f3008aec84fcb</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.JavaVersion</span></td><td><code>a902b52c460c0348</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.StringUtils</span></td><td><code>4628d7808116e372</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.SystemProperties</span></td><td><code>6b2fea785d2a2915</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.SystemUtils</span></td><td><code>2518da556699ab1e</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.function.Suppliers</span></td><td><code>6cb739fdbd96d7c1</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.lang3.math.NumberUtils</span></td><td><code>99f301ade68669b7</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.utils.StringUtils</span></td><td><code>abd8480c7152bf46</code></td></tr><tr><td><span class="el_class">org.apache.maven.surefire.shared.utils.cli.ShutdownHookUtils</span></td><td><code>011b23cd829ec86c</code></td></tr><tr><td><span class="el_class">org.apiguardian.api.API.Status</span></td><td><code>95d0ffea805fc01a</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.api.extension.ConditionEvaluationResult</span></td><td><code>35e14124a607c6e0</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.api.extension.ExtensionContext.Namespace</span></td><td><code>f54a3d73ed88c765</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.JupiterTestEngine</span></td><td><code>e2ae6d11698760d5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.CachingJupiterConfiguration</span></td><td><code>7e7fdcd1b43926e2</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.DefaultJupiterConfiguration</span></td><td><code>3264494f5452162d</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.EnumConfigurationParameterConverter</span></td><td><code>bab380425dca8d4f</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter</span></td><td><code>518e1c643c30f164</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.descriptor.AbstractExtensionContext</span></td><td><code>92d1cbb782871d54</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor</span></td><td><code>4b5e361d03d8e2d8</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext</span></td><td><code>95abf612d36312bc</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.AbstractOrderingVisitor</span></td><td><code>2747cc3e148c57d9</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.AbstractOrderingVisitor.DescriptorWrapperOrderer</span></td><td><code>01a66e5fdf0989e5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.ClassOrderingVisitor</span></td><td><code>dbd6c4e35e0c9807</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.ClassSelectorResolver</span></td><td><code>8192a76b48a09183</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.DiscoverySelectorResolver</span></td><td><code>0493a46e2481b698</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.MethodFinder</span></td><td><code>943e016148cf5f16</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.MethodOrderingVisitor</span></td><td><code>1c057f4243f10c0e</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.MethodSelectorResolver</span></td><td><code>340dbe384622c6a6</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsInnerClass</span></td><td><code>373ab803cd4c3f71</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsNestedTestClass</span></td><td><code>5b959cc55c1f4f91</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsPotentialTestContainer</span></td><td><code>4134835721917de5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests</span></td><td><code>cb8d6d2ffc57432f</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestFactoryMethod</span></td><td><code>671448bb3682a8b7</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestMethod</span></td><td><code>53d31c5fa4778cc3</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestTemplateMethod</span></td><td><code>db07bccfb8a7df73</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.discovery.predicates.IsTestableMethod</span></td><td><code>8a0a6571eef022fb</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.DefaultExecutableInvoker</span></td><td><code>8974ffb77e1cf465</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.JupiterEngineExecutionContext</span></td><td><code>50163587b45842fe</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.JupiterEngineExecutionContext.Builder</span></td><td><code>b39a5e63227384a5</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.execution.JupiterEngineExecutionContext.State</span></td><td><code>0766343b70481496</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.AutoCloseExtension</span></td><td><code>b0c206c116575b65</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.DisabledCondition</span></td><td><code>ae3c30ff8f7ce050</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.MutableExtensionRegistry</span></td><td><code>2445286ad5728ba3</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.MutableExtensionRegistry.Entry</span></td><td><code>2c27256a5e9eeb22</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.RepeatedTestExtension</span></td><td><code>134b5213d4cb80ac</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TempDirectory</span></td><td><code>797b378613d1c2c3</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TestInfoParameterResolver</span></td><td><code>1977e7bd25ea66b8</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TestReporterParameterResolver</span></td><td><code>24002b8886de1936</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.extension.TimeoutExtension</span></td><td><code>62b73ea4d52632c9</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.support.JupiterThrowableCollectorFactory</span></td><td><code>46546a446de4c9c0</code></td></tr><tr><td><span class="el_class">org.junit.jupiter.engine.support.OpenTest4JAndJUnit4AwareThrowableCollector</span></td><td><code>de05466420699f92</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.function.Try</span></td><td><code>d1970dd64ce22fa4</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.function.Try.Failure</span></td><td><code>2135634bf7e7ad88</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.function.Try.Success</span></td><td><code>88f304668c6ff14e</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.logging.LoggerFactory</span></td><td><code>7b57f78fc724ac54</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.logging.LoggerFactory.DelegatingLogger</span></td><td><code>835c9a026ac4df32</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.AnnotationUtils</span></td><td><code>1da637c10cbda39c</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ClassLoaderUtils</span></td><td><code>41a8b61339cf4862</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ClassNamePatternFilterUtils</span></td><td><code>484cfeb1dc3b6e93</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ClasspathScanner</span></td><td><code>23726102aeb1c0ca</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.CollectionUtils</span></td><td><code>6cb29bed5c13bb1d</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.LruCache</span></td><td><code>fd8ff40dff05b112</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.Preconditions</span></td><td><code>99362b29a037afdc</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ReflectionUtils</span></td><td><code>f1c34b50fa11302d</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.ReflectionUtils.HierarchyTraversalMode</span></td><td><code>ecf76570811abc50</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.StringUtils</span></td><td><code>372dfca6fa74c1ea</code></td></tr><tr><td><span class="el_class">org.junit.platform.commons.util.UnrecoverableExceptions</span></td><td><code>2ffa834710d16849</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.CompositeFilter</span></td><td><code>cecade1862d00032</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.CompositeFilter.1</span></td><td><code>ed62b01b8b763511</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineDiscoveryListener</span></td><td><code>22e0c8566a0701f5</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineDiscoveryListener.1</span></td><td><code>a4cdbe8dd38d8f57</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineExecutionListener</span></td><td><code>73f93afa543ca74a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.EngineExecutionListener.1</span></td><td><code>999902b68f81dd9a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.ExecutionRequest</span></td><td><code>83d3937d6c2e4880</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.Filter</span></td><td><code>c8d2fba4bb555492</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.FilterResult</span></td><td><code>1b4753bc794e8388</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.SelectorResolutionResult</span></td><td><code>02b8934961bdea6f</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.SelectorResolutionResult.Status</span></td><td><code>22866b13273482bd</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestDescriptor</span></td><td><code>a5f736d88185f693</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestDescriptor.Type</span></td><td><code>8530bdf90ae8fa6b</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestExecutionResult</span></td><td><code>29479a0ae9db2840</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.TestExecutionResult.Status</span></td><td><code>9e54a6b249ea167a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.UniqueId</span></td><td><code>a5ee26b408b26ea1</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.UniqueId.Segment</span></td><td><code>03b0ccd7b69c9fc2</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.UniqueIdFormat</span></td><td><code>455c5b5eb27d1f81</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.discovery.ClassSelector</span></td><td><code>a6b2f6753eef3ff0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.discovery.DiscoverySelectors</span></td><td><code>8b2cda0d30b056d5</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.descriptor.AbstractTestDescriptor</span></td><td><code>17948dfe4c8d10c0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.descriptor.EngineDescriptor</span></td><td><code>4ba3237c7e6b18d6</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.ClassContainerSelectorResolver</span></td><td><code>fde8e703faa64574</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution</span></td><td><code>4937cdb1a041a120</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.DefaultContext</span></td><td><code>151f6fae99911199</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver</span></td><td><code>0ad8786b2f016b1a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.Builder</span></td><td><code>29666059b7fb2614</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.DefaultInitializationContext</span></td><td><code>1b0484c56b030686</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver</span></td><td><code>458b4a4e46b6b868</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver.Match</span></td><td><code>3c16d4dff276f57a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver.Match.Type</span></td><td><code>bd8402e1232e1a40</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.discovery.SelectorResolver.Resolution</span></td><td><code>ba500d6ba9a79953</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.ExclusiveResource</span></td><td><code>fa0dc5b65de1b0a0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.ExclusiveResource.LockMode</span></td><td><code>705f9e9f579aeab0</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine</span></td><td><code>599b10c51fe35ea3</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor</span></td><td><code>a78f13d5e60b7d08</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.LockManager</span></td><td><code>99cdeecddb4ca68b</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.Node</span></td><td><code>3f2ca9c1749a3d5a</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.Node.SkipResult</span></td><td><code>42796aad70055913</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeExecutionAdvisor</span></td><td><code>c8bf7d7bb2e19471</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTestTask</span></td><td><code>c4c004e32fc81aac</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTestTask.DefaultDynamicTestExecutor</span></td><td><code>9048d6cd4a8e05d3</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTestTaskContext</span></td><td><code>f68790b28827581e</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeTreeWalker</span></td><td><code>c9f34e2fe83d5caa</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeUtils</span></td><td><code>732ad1771b71d292</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.NodeUtils.1</span></td><td><code>5a44a7e2cbf864b4</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService</span></td><td><code>512f5438a4d56505</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.SingleLock</span></td><td><code>f0bfd18cc662d7fc</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.hierarchical.ThrowableCollector</span></td><td><code>a891c129fd2a01df</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.store.NamespacedHierarchicalStore</span></td><td><code>fb95e61bdaf5378c</code></td></tr><tr><td><span class="el_class">org.junit.platform.engine.support.store.NamespacedHierarchicalStore.EvaluatedValue</span></td><td><code>158ca2dfb82179f2</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.EngineDiscoveryResult</span></td><td><code>c9df2add13bcb88f</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.EngineDiscoveryResult.Status</span></td><td><code>f767a377012b98ff</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherDiscoveryListener</span></td><td><code>088911f06a0807a1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherDiscoveryListener.1</span></td><td><code>d946f222ae757dc1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherSessionListener</span></td><td><code>694596eba9b0c85e</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.LauncherSessionListener.1</span></td><td><code>44b3640faa83f474</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.TestExecutionListener</span></td><td><code>f2d1545415335fda</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.TestIdentifier</span></td><td><code>fef478667b042ad5</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.TestPlan</span></td><td><code>f4faaefa1c9341ff</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.CompositeEngineExecutionListener</span></td><td><code>8321b18dbabfecb3</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.CompositeTestExecutionListener</span></td><td><code>04623991ddcc58da</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultDiscoveryRequest</span></td><td><code>e6360c7333fc842d</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncher</span></td><td><code>95dfc056bdb1d2d2</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherConfig</span></td><td><code>b4cd1fb6724efdef</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherSession</span></td><td><code>e040225d1f67e564</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherSession.1</span></td><td><code>bcc6e4bee671ccad</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DefaultLauncherSession.ClosedLauncher</span></td><td><code>aa7b08954aea78f5</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DelegatingEngineExecutionListener</span></td><td><code>61bd4de41739236f</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.DelegatingLauncher</span></td><td><code>cdc9b7e4e1a576e0</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineDiscoveryOrchestrator</span></td><td><code>e4e806767310de9f</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.Phase</span></td><td><code>67a547a561eee0f4</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineDiscoveryResultValidator</span></td><td><code>552f6c5833b8f8bd</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineExecutionOrchestrator</span></td><td><code>6e65b7c784b87efc</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineFilterer</span></td><td><code>53cf37d963f8b58c</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.EngineIdValidator</span></td><td><code>b0288378227ce052</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ExecutionListenerAdapter</span></td><td><code>d91ab455a4c89f9b</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.InternalTestPlan</span></td><td><code>ce2dcedb783e6f56</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.IterationOrder</span></td><td><code>452edacea5001e83</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.IterationOrder.1</span></td><td><code>0736e6add61b3334</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.IterationOrder.2</span></td><td><code>0d0d72b6e503c372</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfig</span></td><td><code>58100dc14c875cb9</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfig.Builder</span></td><td><code>64729ce9bd729578</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters</span></td><td><code>4b25c1714dc335ec</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.Builder</span></td><td><code>ba76828012d853d8</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider</span></td><td><code>52b5b9d7814ff3b1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider.1</span></td><td><code>f83ebdedced2e399</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider.2</span></td><td><code>886f3c723ddb9556</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherConfigurationParameters.ParameterProvider.3</span></td><td><code>0d89b6f56eb4db06</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder</span></td><td><code>fb76ce235ae5247b</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherDiscoveryResult</span></td><td><code>9833a129382c2ccc</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherFactory</span></td><td><code>79c2095302f261bb</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.LauncherListenerRegistry</span></td><td><code>64d5f2a8ac991f94</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ListenerRegistry</span></td><td><code>7fe9373f303770d1</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener</span></td><td><code>3840931f19c9d795</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener.Outcome</span></td><td><code>730ad6d2d5641536</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ServiceLoaderRegistry</span></td><td><code>08e28076c727f8e6</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry</span></td><td><code>771f386239bb3682</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener</span></td><td><code>f6f65efcfd071c8e</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.core.StreamInterceptingTestExecutionListener</span></td><td><code>0f855b867dc3eac4</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.UniqueIdTrackingListener</span></td><td><code>aaf56096b3079d53</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.discovery.AbortOnFailureLauncherDiscoveryListener</span></td><td><code>0a9a375bd99ca30a</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.discovery.LauncherDiscoveryListeners</span></td><td><code>408046ed24478736</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.discovery.LauncherDiscoveryListeners.LauncherDiscoveryListenerType</span></td><td><code>bf2a372dcc5e43f7</code></td></tr><tr><td><span class="el_class">org.junit.platform.launcher.listeners.session.LauncherSessionListeners</span></td><td><code>46b8848a888d4d59</code></td></tr><tr><td><span class="el_class">org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryEventPublisherBeansApplicationListener</span></td><td><code>e038b74293c709e4</code></td></tr><tr><td><span class="el_class">org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryEventPublisherBeansTestExecutionListener</span></td><td><code>89df4f04e39e1522</code></td></tr><tr><td><span class="el_class">org.springframework.util.Assert</span></td><td><code>2e1248d2d1526e84</code></td></tr><tr><td><span class="el_class">org.springframework.util.ClassUtils</span></td><td><code>ca4ab8b63048e08b</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap</span></td><td><code>722cd58749bce5da</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap.ReferenceManager</span></td><td><code>35eb6b9c1f2eedb5</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap.ReferenceType</span></td><td><code>5b823be241865c2f</code></td></tr><tr><td><span class="el_class">org.springframework.util.ConcurrentReferenceHashMap.Segment</span></td><td><code>5daee5d71f2a6fe2</code></td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
    \ No newline at end of file
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco.csv b/sentrius-llm-dataplane/target/site/jacoco/jacoco.csv
    deleted file mode 100644
    index e89dd7bf..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco.csv
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -GROUP,PACKAGE,CLASS,INSTRUCTION_MISSED,INSTRUCTION_COVERED,BRANCH_MISSED,BRANCH_COVERED,LINE_MISSED,LINE_COVERED,COMPLEXITY_MISSED,COMPLEXITY_COVERED,METHOD_MISSED,METHOD_COVERED
    -sentrius-llm-dataplane,io.sentrius.sso.core.services.openai.categorization,CommandTrie,179,0,18,0,36,0,16,0,7,0
    -sentrius-llm-dataplane,io.sentrius.sso.core.services.openai.categorization,CommandCategorizer,172,0,6,0,45,0,11,0,8,0
    -sentrius-llm-dataplane,io.sentrius.sso.core.services.openai.categorization,TrieNode,14,0,0,0,4,0,1,0,1,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,OpenAITwoPartyMonitor,131,0,6,0,28,0,8,0,5,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,Response,401,0,70,0,13,0,60,0,25,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,LLMCommandCategorizer,75,0,0,0,15,0,4,0,4,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,TerminalLogConfiguration,93,0,14,0,5,0,17,0,10,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,TerminalLogConfiguration.TerminalLogConfigurationBuilder,15,0,0,0,1,0,3,0,3,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,ChatConversation,118,0,6,0,21,0,7,0,4,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,ComplianceScorer,51,0,0,0,13,0,3,0,3,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,ComplianceConfiguration.ComplianceConfigurationBuilder,17,0,0,0,1,0,3,0,3,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,Response.Choice,196,0,38,0,5,0,32,0,13,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,GeneratorConfiguration.GeneratorConfigurationBuilder,47,0,4,0,1,0,7,0,5,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,DataGenerator,12,0,0,0,5,0,1,0,1,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,ComplianceConfiguration,107,0,16,0,5,0,19,0,11,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,TerminalLogConfiguration.TerminalLogConfigurationBuilderImpl,7,0,0,0,1,0,2,0,2,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,Response.Usage,155,0,30,0,4,0,26,0,11,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,Response.ResponseBuilder,83,0,0,0,1,0,11,0,11,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,GenerativeAPI,140,0,4,0,29,0,8,0,6,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,ComplianceConfiguration.ComplianceConfigurationBuilderImpl,7,0,0,0,1,0,2,0,2,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,GeneratorConfiguration,104,0,10,0,6,0,18,0,13,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai,TerminalComplianceScorer,36,0,2,0,8,0,3,0,2,0
    -sentrius-llm-dataplane,io.sentrius.sso.core.services.openai,OpenAITerminalService,161,0,14,0,33,0,13,0,6,0
    -sentrius-llm-dataplane,io.sentrius.sso.core.services.openai,OpenAITwoPartyMonitorService,153,0,12,0,33,0,12,0,6,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai.spring.ai,AgentCommunicationMemoryStore,107,0,8,0,26,0,9,0,5,0
    -sentrius-llm-dataplane,io.sentrius.sso.automation.auditing.rules,OpenAISessionRule,196,0,14,0,53,0,19,0,12,0
    -sentrius-llm-dataplane,io.sentrius.sso.automation.auditing.rules,TwoPartyAIMonitor,541,0,62,0,114,0,44,0,13,0
    -sentrius-llm-dataplane,io.sentrius.sso.genai.suggestions,TerminalSuggestors,131,0,6,0,28,0,8,0,5,0
    diff --git a/sentrius-llm-dataplane/target/site/jacoco/jacoco.xml b/sentrius-llm-dataplane/target/site/jacoco/jacoco.xml
    deleted file mode 100644
    index 4d833c62..00000000
    --- a/sentrius-llm-dataplane/target/site/jacoco/jacoco.xml
    +++ /dev/null
    @@ -1 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE report PUBLIC "-//JACOCO//DTD Report 1.1//EN" "report.dtd"><report name="sentrius-llm-dataplane"><sessioninfo id="pop-os-200c1a11" start="1746208741612" dump="1746208742092"/><package name="io/sentrius/sso/core/services/openai/categorization"><class name="io/sentrius/sso/core/services/openai/categorization/CommandTrie" sourcefilename="CommandTrie.java"><method name="&lt;init&gt;" desc="()V" line="7"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="normalizePath" desc="(Ljava/lang/String;)Ljava/lang/String;" line="11"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="insert" desc="(Ljava/lang/String;Lio/sentrius/sso/core/model/categorization/CommandCategory;)V" line="15"><counter type="INSTRUCTION" missed="53" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="11" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="search" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/model/categorization/CommandCategory;" line="32"><counter type="INSTRUCTION" missed="41" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="searchByPrefix" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/model/categorization/CommandCategory;" line="44"><counter type="INSTRUCTION" missed="64" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="14" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$insert$0" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/services/openai/categorization/TrieNode;" line="19"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="6"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="179" covered="0"/><counter type="BRANCH" missed="18" covered="0"/><counter type="LINE" missed="36" covered="0"/><counter type="COMPLEXITY" missed="16" covered="0"/><counter type="METHOD" missed="7" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/core/services/openai/categorization/CommandCategorizer" sourcefilename="CommandCategorizer.java"><method name="fetchFromDatabase" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/model/categorization/CommandCategory;" line="44"><counter type="INSTRUCTION" missed="14" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="categorizeCommand" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/dto/CommandCategoryDTO;" line="53"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getDBCommandCategory" desc="(Ljava/lang/String;)Ljava/util/List;" line="57"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="isValidRegex" desc="(Ljava/lang/String;)Z" line="63"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="categorizeWithRulesOrML" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/dto/CommandCategoryDTO;" line="73"><counter type="INSTRUCTION" missed="103" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="26" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="addCommandCategory" desc="(Ljava/lang/String;Lio/sentrius/sso/core/dto/CommandCategoryDTO;)V" line="118"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="3" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/core/services/security/IntegrationSecurityTokenService;Lio/sentrius/sso/core/repository/CommandCategoryRepository;)V" line="28"><counter type="INSTRUCTION" missed="18" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="26"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="172" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="45" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="8" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/core/services/openai/categorization/TrieNode" sourcefilename="TrieNode.java"><method name="&lt;init&gt;" desc="()V" line="7"><counter type="INSTRUCTION" missed="14" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="14" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="CommandCategorizer.java"><line nr="26" mi="4" ci="0" mb="0" cb="0"/><line nr="28" mi="9" ci="0" mb="0" cb="0"/><line nr="36" mi="3" ci="0" mb="0" cb="0"/><line nr="37" mi="3" ci="0" mb="0" cb="0"/><line nr="38" mi="1" ci="0" mb="0" cb="0"/><line nr="39" mi="2" ci="0" mb="0" cb="0"/><line nr="44" mi="5" ci="0" mb="0" cb="0"/><line nr="45" mi="4" ci="0" mb="0" cb="0"/><line nr="46" mi="3" ci="0" mb="0" cb="0"/><line nr="47" mi="2" ci="0" mb="0" cb="0"/><line nr="53" mi="8" ci="0" mb="0" cb="0"/><line nr="57" mi="5" ci="0" mb="0" cb="0"/><line nr="63" mi="3" ci="0" mb="0" cb="0"/><line nr="64" mi="2" ci="0" mb="0" cb="0"/><line nr="65" mi="1" ci="0" mb="0" cb="0"/><line nr="66" mi="2" ci="0" mb="0" cb="0"/><line nr="73" mi="5" ci="0" mb="0" cb="0"/><line nr="74" mi="2" ci="0" mb="2" cb="0"/><line nr="75" mi="5" ci="0" mb="0" cb="0"/><line nr="76" mi="2" ci="0" mb="0" cb="0"/><line nr="79" mi="10" ci="0" mb="0" cb="0"/><line nr="81" mi="3" ci="0" mb="2" cb="0"/><line nr="82" mi="3" ci="0" mb="0" cb="0"/><line nr="83" mi="2" ci="0" mb="0" cb="0"/><line nr="85" mi="7" ci="0" mb="0" cb="0"/><line nr="87" mi="1" ci="0" mb="0" cb="0"/><line nr="88" mi="5" ci="0" mb="0" cb="0"/><line nr="89" mi="1" ci="0" mb="0" cb="0"/><line nr="91" mi="9" ci="0" mb="0" cb="0"/><line nr="93" mi="11" ci="0" mb="0" cb="0"/><line nr="96" mi="4" ci="0" mb="0" cb="0"/><line nr="98" mi="5" ci="0" mb="2" cb="0"/><line nr="99" mi="5" ci="0" mb="0" cb="0"/><line nr="101" mi="4" ci="0" mb="0" cb="0"/><line nr="102" mi="2" ci="0" mb="0" cb="0"/><line nr="103" mi="1" ci="0" mb="0" cb="0"/><line nr="104" mi="2" ci="0" mb="0" cb="0"/><line nr="105" mi="4" ci="0" mb="0" cb="0"/><line nr="108" mi="1" ci="0" mb="0" cb="0"/><line nr="109" mi="3" ci="0" mb="0" cb="0"/><line nr="112" mi="3" ci="0" mb="0" cb="0"/><line nr="114" mi="3" ci="0" mb="0" cb="0"/><line nr="118" mi="6" ci="0" mb="0" cb="0"/><line nr="119" mi="5" ci="0" mb="0" cb="0"/><line nr="120" mi="1" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="172" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="45" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="8" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="CommandTrie.java"><line nr="6" mi="4" ci="0" mb="0" cb="0"/><line nr="7" mi="2" ci="0" mb="0" cb="0"/><line nr="8" mi="6" ci="0" mb="0" cb="0"/><line nr="11" mi="5" ci="0" mb="0" cb="0"/><line nr="15" mi="4" ci="0" mb="0" cb="0"/><line nr="16" mi="3" ci="0" mb="0" cb="0"/><line nr="17" mi="16" ci="0" mb="2" cb="0"/><line nr="18" mi="4" ci="0" mb="0" cb="0"/><line nr="19" mi="11" ci="0" mb="0" cb="0"/><line nr="21" mi="3" ci="0" mb="0" cb="0"/><line nr="22" mi="5" ci="0" mb="2" cb="0"/><line nr="23" mi="4" ci="0" mb="0" cb="0"/><line nr="26" mi="3" ci="0" mb="0" cb="0"/><line nr="28" mi="3" ci="0" mb="0" cb="0"/><line nr="29" mi="1" ci="0" mb="0" cb="0"/><line nr="32" mi="4" ci="0" mb="0" cb="0"/><line nr="33" mi="3" ci="0" mb="0" cb="0"/><line nr="34" mi="16" ci="0" mb="2" cb="0"/><line nr="35" mi="6" ci="0" mb="0" cb="0"/><line nr="36" mi="2" ci="0" mb="2" cb="0"/><line nr="37" mi="2" ci="0" mb="0" cb="0"/><line nr="40" mi="8" ci="0" mb="2" cb="0"/><line nr="44" mi="4" ci="0" mb="0" cb="0"/><line nr="45" mi="3" ci="0" mb="0" cb="0"/><line nr="46" mi="2" ci="0" mb="0" cb="0"/><line nr="48" mi="16" ci="0" mb="2" cb="0"/><line nr="49" mi="4" ci="0" mb="0" cb="0"/><line nr="50" mi="4" ci="0" mb="0" cb="0"/><line nr="53" mi="5" ci="0" mb="2" cb="0"/><line nr="54" mi="6" ci="0" mb="0" cb="0"/><line nr="55" mi="3" ci="0" mb="2" cb="0"/><line nr="56" mi="4" ci="0" mb="0" cb="0"/><line nr="60" mi="3" ci="0" mb="2" cb="0"/><line nr="61" mi="4" ci="0" mb="0" cb="0"/><line nr="62" mi="4" ci="0" mb="0" cb="0"/><line nr="68" mi="2" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="179" covered="0"/><counter type="BRANCH" missed="18" covered="0"/><counter type="LINE" missed="36" covered="0"/><counter type="COMPLEXITY" missed="16" covered="0"/><counter type="METHOD" missed="7" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="TrieNode.java"><line nr="7" mi="2" ci="0" mb="0" cb="0"/><line nr="8" mi="5" ci="0" mb="0" cb="0"/><line nr="10" mi="3" ci="0" mb="0" cb="0"/><line nr="11" mi="4" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="14" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="365" covered="0"/><counter type="BRANCH" missed="24" covered="0"/><counter type="LINE" missed="85" covered="0"/><counter type="COMPLEXITY" missed="28" covered="0"/><counter type="METHOD" missed="16" covered="0"/><counter type="CLASS" missed="3" covered="0"/></package><package name="io/sentrius/sso/genai"><class name="io/sentrius/sso/genai/OpenAITwoPartyMonitor" sourcefilename="OpenAITwoPartyMonitor.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;Lio/sentrius/sso/genai/TerminalLogConfiguration;)V" line="23"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateInput" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Ljava/lang/String;" line="33"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generate" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Lio/sentrius/sso/core/model/LLMResponse;" line="41"><counter type="INSTRUCTION" missed="92" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="16" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateUserInput" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Ljava/lang/String;" line="63"><counter type="INSTRUCTION" missed="24" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="131" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="28" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response" sourcefilename="Response.java"><method name="concatenateResponses" desc="()Ljava/lang/String;" line="93"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getId" desc="()Ljava/lang/String;" line="24"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getObject" desc="()Ljava/lang/String;" line="27"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getCreated" desc="()Ljava/lang/Long;" line="30"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getModel" desc="()Ljava/lang/String;" line="33"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getChoices" desc="()Ljava/util/List;" line="36"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getUsage" desc="()Lio/sentrius/sso/genai/Response$Usage;" line="39"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getServiceTier" desc="()Ljava/lang/String;" line="42"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getSystemFingerprint" desc="()Ljava/lang/String;" line="85"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setId" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setObject" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setCreated" desc="(Ljava/lang/Long;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setModel" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setChoices" desc="(Ljava/util/List;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setUsage" desc="(Lio/sentrius/sso/genai/Response$Usage;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setServiceTier" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setSystemFingerprint" desc="(Ljava/lang/String;)V" line="17"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="17"><counter type="INSTRUCTION" missed="157" covered="0"/><counter type="BRANCH" missed="54" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="28" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="17"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="17"><counter type="INSTRUCTION" missed="118" covered="0"/><counter type="BRANCH" missed="16" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="9" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="17"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="19"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Lio/sentrius/sso/genai/Response$Usage;Ljava/lang/String;Ljava/lang/String;)V" line="20"><counter type="INSTRUCTION" missed="27" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$concatenateResponses$0" desc="(Lio/sentrius/sso/genai/Response$Choice;)Ljava/lang/String;" line="93"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="401" covered="0"/><counter type="BRANCH" missed="70" covered="0"/><counter type="LINE" missed="13" covered="0"/><counter type="COMPLEXITY" missed="60" covered="0"/><counter type="METHOD" missed="25" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/LLMCommandCategorizer" sourcefilename="LLMCommandCategorizer.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;)V" line="30"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generate" desc="(Ljava/lang/String;)Lio/sentrius/sso/core/dto/CommandCategoryDTO;" line="40"><counter type="INSTRUCTION" missed="56" covered="0"/><counter type="LINE" missed="10" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateInput" desc="(Ljava/lang/String;)Ljava/lang/String;" line="59"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="26"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="75" covered="0"/><counter type="LINE" missed="15" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="4" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/TerminalLogConfiguration" sourcefilename="TerminalLogConfiguration.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder;)V" line="25"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder;" line="25"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTerminalLogs" desc="()Ljava/lang/String;" line="30"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTerminalLogs" desc="(Ljava/lang/String;)V" line="24"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="24"><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="24"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="24"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="24"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/lang/String;)V" line="26"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="27"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="93" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="17" covered="0"/><counter type="METHOD" missed="10" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder" sourcefilename="TerminalLogConfiguration.java"><method name="&lt;init&gt;" desc="()V" line="25"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="terminalLogs" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/TerminalLogConfiguration$TerminalLogConfigurationBuilder;" line="25"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="25"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="15" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="3" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/ChatConversation" sourcefilename="ChatConversation.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;)V" line="21"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateInput" desc="(Lio/sentrius/sso/genai/model/Conversation;)Ljava/lang/String;" line="26"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generate" desc="(Lio/sentrius/sso/genai/model/Conversation;)Lio/sentrius/sso/genai/model/LLMResponse;" line="34"><counter type="INSTRUCTION" missed="105" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="17" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="16"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="118" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="21" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="4" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/ComplianceScorer" sourcefilename="ComplianceScorer.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;Lio/sentrius/sso/genai/ComplianceConfiguration;)V" line="29"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="3" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generate" desc="(Ljava/lang/String;)Ljava/lang/Double;" line="40"><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="LINE" missed="9" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="23"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="51" covered="0"/><counter type="LINE" missed="13" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="3" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/ComplianceConfiguration$ComplianceConfigurationBuilder" sourcefilename="ComplianceConfiguration.java"><method name="&lt;init&gt;" desc="()V" line="30"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="rules" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/ComplianceConfiguration$ComplianceConfigurationBuilder;" line="30"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="30"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="17" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="3" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response$Choice" sourcefilename="Response.java"><method name="&lt;init&gt;" desc="()V" line="49"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getIndex" desc="()Ljava/lang/Integer;" line="53"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getMessage" desc="()Lio/sentrius/sso/genai/Message;" line="56"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getFinishReason" desc="()Ljava/lang/String;" line="59"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getLogprobs" desc="()Ljava/lang/Integer;" line="62"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setIndex" desc="(Ljava/lang/Integer;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setMessage" desc="(Lio/sentrius/sso/genai/Message;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setFinishReason" desc="(Ljava/lang/String;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setLogprobs" desc="(Ljava/lang/Integer;)V" line="49"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="49"><counter type="INSTRUCTION" missed="89" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="16" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="49"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="49"><counter type="INSTRUCTION" missed="62" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="5" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="49"><counter type="INSTRUCTION" missed="11" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="196" covered="0"/><counter type="BRANCH" missed="38" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="32" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/GeneratorConfiguration$GeneratorConfigurationBuilder" sourcefilename="GeneratorConfiguration.java"><method name="&lt;init&gt;" desc="()V" line="8"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="concurrentGenerations" desc="(I)Lio/sentrius/sso/genai/GeneratorConfiguration$GeneratorConfigurationBuilder;" line="8"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="maxTokens" desc="(I)Lio/sentrius/sso/genai/GeneratorConfiguration$GeneratorConfigurationBuilder;" line="8"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/GeneratorConfiguration;" line="8"><counter type="INSTRUCTION" missed="22" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="8"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="47" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/DataGenerator" sourcefilename="DataGenerator.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;)V" line="14"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/ComplianceConfiguration" sourcefilename="ComplianceConfiguration.java"><method name="$default$rules" desc="()Ljava/util/List;" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/genai/ComplianceConfiguration$ComplianceConfigurationBuilder;)V" line="30"><counter type="INSTRUCTION" missed="14" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/ComplianceConfiguration$ComplianceConfigurationBuilder;" line="30"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getRules" desc="()Ljava/util/List;" line="36"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setRules" desc="(Ljava/util/List;)V" line="29"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="29"><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="29"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="29"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="29"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Ljava/util/List;)V" line="31"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="32"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="107" covered="0"/><counter type="BRANCH" missed="16" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="19" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/TerminalLogConfiguration$TerminalLogConfigurationBuilderImpl" sourcefilename="TerminalLogConfiguration.java"><method name="self" desc="()Lio/sentrius/sso/genai/TerminalLogConfiguration$TerminalLogConfigurationBuilderImpl;" line="25"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/TerminalLogConfiguration;" line="25"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response$Usage" sourcefilename="Response.java"><method name="&lt;init&gt;" desc="()V" line="70"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getPromptTokens" desc="()Ljava/lang/Integer;" line="75"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getCompletionTokens" desc="()Ljava/lang/Integer;" line="78"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getTotalTokens" desc="()Ljava/lang/Integer;" line="81"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setPromptTokens" desc="(Ljava/lang/Integer;)V" line="70"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setCompletionTokens" desc="(Ljava/lang/Integer;)V" line="70"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTotalTokens" desc="(Ljava/lang/Integer;)V" line="70"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="70"><counter type="INSTRUCTION" missed="72" covered="0"/><counter type="BRANCH" missed="24" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="70"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="70"><counter type="INSTRUCTION" missed="48" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="70"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="155" covered="0"/><counter type="BRANCH" missed="30" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="26" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/Response$ResponseBuilder" sourcefilename="Response.java"><method name="&lt;init&gt;" desc="()V" line="18"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="id" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="object" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="created" desc="(Ljava/lang/Long;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="model" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="choices" desc="(Ljava/util/List;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="usage" desc="(Lio/sentrius/sso/genai/Response$Usage;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="serviceTier" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="systemFingerprint" desc="(Ljava/lang/String;)Lio/sentrius/sso/genai/Response$ResponseBuilder;" line="18"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/Response;" line="18"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="18"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="83" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="11" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/GenerativeAPI" sourcefilename="GenerativeAPI.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lokhttp3/OkHttpClient;)V" line="35"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;)V" line="45"><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="buildRequestBody" desc="(Lio/sentrius/sso/genai/model/ApiEndPointRequest;)Ljava/lang/String;" line="56"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="3" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="sample" desc="(Lio/sentrius/sso/genai/model/ApiEndPointRequest;)Ljava/lang/String;" line="71"><counter type="INSTRUCTION" missed="89" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="15" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="sample" desc="(Lio/sentrius/sso/genai/model/ApiEndPointRequest;Ljava/lang/Class;)Ljava/lang/Object;" line="105"><counter type="INSTRUCTION" missed="8" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="28"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="140" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="29" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/ComplianceConfiguration$ComplianceConfigurationBuilderImpl" sourcefilename="ComplianceConfiguration.java"><method name="self" desc="()Lio/sentrius/sso/genai/ComplianceConfiguration$ComplianceConfigurationBuilderImpl;" line="30"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="build" desc="()Lio/sentrius/sso/genai/ComplianceConfiguration;" line="30"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/GeneratorConfiguration" sourcefilename="GeneratorConfiguration.java"><method name="$default$concurrentGenerations" desc="()I" line="8"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="$default$maxTokens" desc="()I" line="8"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="builder" desc="()Lio/sentrius/sso/genai/GeneratorConfiguration$GeneratorConfigurationBuilder;" line="8"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getConcurrentGenerations" desc="()I" line="17"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="getMaxTokens" desc="()I" line="20"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setConcurrentGenerations" desc="(I)V" line="7"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setMaxTokens" desc="(I)V" line="7"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="equals" desc="(Ljava/lang/Object;)Z" line="7"><counter type="INSTRUCTION" missed="35" covered="0"/><counter type="BRANCH" missed="10" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="canEqual" desc="(Ljava/lang/Object;)Z" line="7"><counter type="INSTRUCTION" missed="3" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="hashCode" desc="()I" line="7"><counter type="INSTRUCTION" missed="20" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="toString" desc="()Ljava/lang/String;" line="7"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(II)V" line="9"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="()V" line="10"><counter type="INSTRUCTION" missed="9" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="104" covered="0"/><counter type="BRANCH" missed="10" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="18" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/genai/TerminalComplianceScorer" sourcefilename="TerminalComplianceScorer.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;Lio/sentrius/sso/genai/TerminalLogConfiguration;)V" line="13"><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateInput" desc="(Ljava/lang/String;)Ljava/lang/String;" line="23"><counter type="INSTRUCTION" missed="29" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="36" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="8" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="ComplianceConfiguration.java"><line nr="29" mi="70" ci="0" mb="14" cb="0"/><line nr="30" mi="46" ci="0" mb="2" cb="0"/><line nr="31" mi="6" ci="0" mb="0" cb="0"/><line nr="32" mi="6" ci="0" mb="0" cb="0"/><line nr="36" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="131" covered="0"/><counter type="BRANCH" missed="16" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="24" covered="0"/><counter type="METHOD" missed="16" covered="0"/><counter type="CLASS" missed="3" covered="0"/></sourcefile><sourcefile name="TerminalLogConfiguration.java"><line nr="24" mi="69" ci="0" mb="14" cb="0"/><line nr="25" mi="34" ci="0" mb="0" cb="0"/><line nr="26" mi="6" ci="0" mb="0" cb="0"/><line nr="27" mi="3" ci="0" mb="0" cb="0"/><line nr="30" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="115" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="22" covered="0"/><counter type="METHOD" missed="15" covered="0"/><counter type="CLASS" missed="3" covered="0"/></sourcefile><sourcefile name="TerminalComplianceScorer.java"><line nr="13" mi="6" ci="0" mb="0" cb="0"/><line nr="14" mi="1" ci="0" mb="0" cb="0"/><line nr="23" mi="2" ci="0" mb="0" cb="0"/><line nr="26" mi="4" ci="0" mb="0" cb="0"/><line nr="27" mi="11" ci="0" mb="2" cb="0"/><line nr="28" mi="6" ci="0" mb="0" cb="0"/><line nr="30" mi="4" ci="0" mb="0" cb="0"/><line nr="34" mi="2" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="36" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="8" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="2" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="GeneratorConfiguration.java"><line nr="7" mi="72" ci="0" mb="10" cb="0"/><line nr="8" mi="55" ci="0" mb="4" cb="0"/><line nr="9" mi="9" ci="0" mb="0" cb="0"/><line nr="10" mi="9" ci="0" mb="0" cb="0"/><line nr="17" mi="3" ci="0" mb="0" cb="0"/><line nr="20" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="151" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="25" covered="0"/><counter type="METHOD" missed="18" covered="0"/><counter type="CLASS" missed="2" covered="0"/></sourcefile><sourcefile name="LLMCommandCategorizer.java"><line nr="26" mi="4" ci="0" mb="0" cb="0"/><line nr="30" mi="5" ci="0" mb="0" cb="0"/><line nr="31" mi="1" ci="0" mb="0" cb="0"/><line nr="40" mi="4" ci="0" mb="0" cb="0"/><line nr="41" mi="4" ci="0" mb="0" cb="0"/><line nr="42" mi="6" ci="0" mb="0" cb="0"/><line nr="43" mi="4" ci="0" mb="0" cb="0"/><line nr="44" mi="7" ci="0" mb="0" cb="0"/><line nr="45" mi="3" ci="0" mb="0" cb="0"/><line nr="46" mi="4" ci="0" mb="0" cb="0"/><line nr="47" mi="6" ci="0" mb="0" cb="0"/><line nr="48" mi="13" ci="0" mb="0" cb="0"/><line nr="49" mi="5" ci="0" mb="0" cb="0"/><line nr="59" mi="8" ci="0" mb="0" cb="0"/><line nr="83" mi="1" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="75" covered="0"/><counter type="LINE" missed="15" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="4" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="DataGenerator.java"><line nr="14" mi="2" ci="0" mb="0" cb="0"/><line nr="15" mi="3" ci="0" mb="0" cb="0"/><line nr="16" mi="3" ci="0" mb="0" cb="0"/><line nr="17" mi="3" ci="0" mb="0" cb="0"/><line nr="18" mi="1" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="ComplianceScorer.java"><line nr="23" mi="4" ci="0" mb="0" cb="0"/><line nr="29" mi="5" ci="0" mb="0" cb="0"/><line nr="30" mi="3" ci="0" mb="0" cb="0"/><line nr="31" mi="1" ci="0" mb="0" cb="0"/><line nr="40" mi="8" ci="0" mb="0" cb="0"/><line nr="41" mi="4" ci="0" mb="0" cb="0"/><line nr="42" mi="4" ci="0" mb="0" cb="0"/><line nr="43" mi="7" ci="0" mb="0" cb="0"/><line nr="45" mi="4" ci="0" mb="0" cb="0"/><line nr="46" mi="2" ci="0" mb="0" cb="0"/><line nr="47" mi="1" ci="0" mb="0" cb="0"/><line nr="48" mi="5" ci="0" mb="0" cb="0"/><line nr="49" mi="3" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="51" covered="0"/><counter type="LINE" missed="13" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="3" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="GenerativeAPI.java"><line nr="28" mi="4" ci="0" mb="0" cb="0"/><line nr="35" mi="5" ci="0" mb="0" cb="0"/><line nr="37" mi="2" ci="0" mb="0" cb="0"/><line nr="38" mi="3" ci="0" mb="0" cb="0"/><line nr="39" mi="3" ci="0" mb="0" cb="0"/><line nr="40" mi="3" ci="0" mb="0" cb="0"/><line nr="41" mi="3" ci="0" mb="0" cb="0"/><line nr="42" mi="1" ci="0" mb="0" cb="0"/><line nr="45" mi="6" ci="0" mb="0" cb="0"/><line nr="46" mi="1" ci="0" mb="0" cb="0"/><line nr="56" mi="6" ci="0" mb="0" cb="0"/><line nr="57" mi="1" ci="0" mb="0" cb="0"/><line nr="58" mi="5" ci="0" mb="0" cb="0"/><line nr="71" mi="3" ci="0" mb="0" cb="0"/><line nr="72" mi="5" ci="0" mb="0" cb="0"/><line nr="73" mi="7" ci="0" mb="0" cb="0"/><line nr="75" mi="16" ci="0" mb="0" cb="0"/><line nr="77" mi="6" ci="0" mb="0" cb="0"/><line nr="78" mi="3" ci="0" mb="2" cb="0"/><line nr="79" mi="3" ci="0" mb="2" cb="0"/><line nr="80" mi="5" ci="0" mb="0" cb="0"/><line nr="81" mi="7" ci="0" mb="0" cb="0"/><line nr="83" mi="6" ci="0" mb="0" cb="0"/><line nr="84" mi="9" ci="0" mb="0" cb="0"/><line nr="87" mi="6" ci="0" mb="0" cb="0"/><line nr="89" mi="1" ci="0" mb="0" cb="0"/><line nr="90" mi="5" ci="0" mb="0" cb="0"/><line nr="91" mi="7" ci="0" mb="0" cb="0"/><line nr="105" mi="8" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="140" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="29" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="OpenAITwoPartyMonitor.java"><line nr="17" mi="4" ci="0" mb="0" cb="0"/><line nr="23" mi="5" ci="0" mb="0" cb="0"/><line nr="24" mi="1" ci="0" mb="0" cb="0"/><line nr="33" mi="3" ci="0" mb="0" cb="0"/><line nr="36" mi="2" ci="0" mb="0" cb="0"/><line nr="41" mi="13" ci="0" mb="0" cb="0"/><line nr="42" mi="5" ci="0" mb="0" cb="0"/><line nr="43" mi="4" ci="0" mb="0" cb="0"/><line nr="44" mi="7" ci="0" mb="0" cb="0"/><line nr="46" mi="3" ci="0" mb="0" cb="0"/><line nr="47" mi="6" ci="0" mb="0" cb="0"/><line nr="48" mi="6" ci="0" mb="0" cb="0"/><line nr="49" mi="4" ci="0" mb="0" cb="0"/><line nr="50" mi="7" ci="0" mb="0" cb="0"/><line nr="51" mi="2" ci="0" mb="0" cb="0"/><line nr="52" mi="4" ci="0" mb="2" cb="0"/><line nr="53" mi="7" ci="0" mb="0" cb="0"/><line nr="55" mi="10" ci="0" mb="0" cb="0"/><line nr="56" mi="1" ci="0" mb="0" cb="0"/><line nr="57" mi="5" ci="0" mb="0" cb="0"/><line nr="58" mi="8" ci="0" mb="0" cb="0"/><line nr="63" mi="2" ci="0" mb="0" cb="0"/><line nr="64" mi="8" ci="0" mb="4" cb="0"/><line nr="65" mi="4" ci="0" mb="0" cb="0"/><line nr="67" mi="3" ci="0" mb="0" cb="0"/><line nr="71" mi="2" ci="0" mb="0" cb="0"/><line nr="79" mi="3" ci="0" mb="0" cb="0"/><line nr="80" mi="2" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="131" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="28" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="ChatConversation.java"><line nr="16" mi="4" ci="0" mb="0" cb="0"/><line nr="21" mi="5" ci="0" mb="0" cb="0"/><line nr="22" mi="1" ci="0" mb="0" cb="0"/><line nr="26" mi="3" ci="0" mb="0" cb="0"/><line nr="34" mi="9" ci="0" mb="0" cb="0"/><line nr="35" mi="4" ci="0" mb="0" cb="0"/><line nr="36" mi="4" ci="0" mb="0" cb="0"/><line nr="37" mi="5" ci="0" mb="0" cb="0"/><line nr="38" mi="4" ci="0" mb="0" cb="0"/><line nr="39" mi="7" ci="0" mb="0" cb="0"/><line nr="41" mi="3" ci="0" mb="0" cb="0"/><line nr="42" mi="6" ci="0" mb="0" cb="0"/><line nr="43" mi="11" ci="0" mb="2" cb="0"/><line nr="44" mi="11" ci="0" mb="2" cb="0"/><line nr="46" mi="4" ci="0" mb="0" cb="0"/><line nr="47" mi="3" ci="0" mb="2" cb="0"/><line nr="48" mi="12" ci="0" mb="0" cb="0"/><line nr="50" mi="9" ci="0" mb="0" cb="0"/><line nr="51" mi="1" ci="0" mb="0" cb="0"/><line nr="52" mi="5" ci="0" mb="0" cb="0"/><line nr="53" mi="7" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="118" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="21" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="4" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="Response.java"><line nr="17" mi="330" ci="0" mb="70" cb="0"/><line nr="18" mi="87" ci="0" mb="0" cb="0"/><line nr="19" mi="3" ci="0" mb="0" cb="0"/><line nr="20" mi="27" ci="0" mb="0" cb="0"/><line nr="24" mi="3" ci="0" mb="0" cb="0"/><line nr="27" mi="3" ci="0" mb="0" cb="0"/><line nr="30" mi="3" ci="0" mb="0" cb="0"/><line nr="33" mi="3" ci="0" mb="0" cb="0"/><line nr="36" mi="3" ci="0" mb="0" cb="0"/><line nr="39" mi="3" ci="0" mb="0" cb="0"/><line nr="42" mi="3" ci="0" mb="0" cb="0"/><line nr="49" mi="184" ci="0" mb="38" cb="0"/><line nr="53" mi="3" ci="0" mb="0" cb="0"/><line nr="56" mi="3" ci="0" mb="0" cb="0"/><line nr="59" mi="3" ci="0" mb="0" cb="0"/><line nr="62" mi="3" ci="0" mb="0" cb="0"/><line nr="70" mi="146" ci="0" mb="30" cb="0"/><line nr="75" mi="3" ci="0" mb="0" cb="0"/><line nr="78" mi="3" ci="0" mb="0" cb="0"/><line nr="81" mi="3" ci="0" mb="0" cb="0"/><line nr="85" mi="3" ci="0" mb="0" cb="0"/><line nr="93" mi="13" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="835" covered="0"/><counter type="BRANCH" missed="138" covered="0"/><counter type="LINE" missed="22" covered="0"/><counter type="COMPLEXITY" missed="129" covered="0"/><counter type="METHOD" missed="60" covered="0"/><counter type="CLASS" missed="4" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="1795" covered="0"/><counter type="BRANCH" missed="200" covered="0"/><counter type="LINE" missed="157" covered="0"/><counter type="COMPLEXITY" missed="234" covered="0"/><counter type="METHOD" missed="134" covered="0"/><counter type="CLASS" missed="19" covered="0"/></package><package name="io/sentrius/sso/core/services/openai"><class name="io/sentrius/sso/core/services/openai/OpenAITerminalService" sourcefilename="OpenAITerminalService.java"><method name="getName" desc="()Ljava/lang/String;" line="31"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="isEnabled" desc="()Z" line="36"><counter type="INSTRUCTION" missed="95" covered="0"/><counter type="BRANCH" missed="10" covered="0"/><counter type="LINE" missed="19" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="analyzeTerminalLogs" desc="(Ljava/lang/String;)Ljava/util/concurrent/CompletableFuture;" line="66"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/core/services/security/IntegrationSecurityTokenService;)V" line="21"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="3" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$analyzeTerminalLogs$0" desc="(Ljava/lang/String;)Ljava/lang/Boolean;" line="68"><counter type="INSTRUCTION" missed="43" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="8" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="20"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="161" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="33" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/core/services/openai/OpenAITwoPartyMonitorService" sourcefilename="OpenAITwoPartyMonitorService.java"><method name="getName" desc="()Ljava/lang/String;" line="33"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="isEnabled" desc="()Z" line="38"><counter type="INSTRUCTION" missed="95" covered="0"/><counter type="BRANCH" missed="10" covered="0"/><counter type="LINE" missed="19" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="analyzeTerminalLogs" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Ljava/util/concurrent/CompletableFuture;" line="68"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/core/services/security/IntegrationSecurityTokenService;)V" line="23"><counter type="INSTRUCTION" missed="12" covered="0"/><counter type="LINE" missed="3" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$analyzeTerminalLogs$0" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Lio/sentrius/sso/core/model/LLMResponse;" line="70"><counter type="INSTRUCTION" missed="35" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="8" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="22"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="153" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="33" covered="0"/><counter type="COMPLEXITY" missed="12" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="OpenAITwoPartyMonitorService.java"><line nr="22" mi="4" ci="0" mb="0" cb="0"/><line nr="23" mi="6" ci="0" mb="0" cb="0"/><line nr="28" mi="3" ci="0" mb="0" cb="0"/><line nr="30" mi="3" ci="0" mb="0" cb="0"/><line nr="33" mi="2" ci="0" mb="0" cb="0"/><line nr="38" mi="4" ci="0" mb="2" cb="0"/><line nr="39" mi="4" ci="0" mb="0" cb="0"/><line nr="40" mi="4" ci="0" mb="2" cb="0"/><line nr="41" mi="3" ci="0" mb="0" cb="0"/><line nr="42" mi="11" ci="0" mb="0" cb="0"/><line nr="43" mi="3" ci="0" mb="2" cb="0"/><line nr="44" mi="3" ci="0" mb="0" cb="0"/><line nr="45" mi="4" ci="0" mb="0" cb="0"/><line nr="47" mi="2" ci="0" mb="0" cb="0"/><line nr="49" mi="8" ci="0" mb="0" cb="0"/><line nr="51" mi="1" ci="0" mb="0" cb="0"/><line nr="52" mi="5" ci="0" mb="0" cb="0"/><line nr="53" mi="1" ci="0" mb="0" cb="0"/><line nr="55" mi="9" ci="0" mb="0" cb="0"/><line nr="56" mi="8" ci="0" mb="0" cb="0"/><line nr="57" mi="6" ci="0" mb="0" cb="0"/><line nr="60" mi="3" ci="0" mb="0" cb="0"/><line nr="62" mi="9" ci="0" mb="2" cb="0"/><line nr="63" mi="7" ci="0" mb="2" cb="0"/><line nr="68" mi="5" ci="0" mb="0" cb="0"/><line nr="70" mi="10" ci="0" mb="2" cb="0"/><line nr="72" mi="5" ci="0" mb="0" cb="0"/><line nr="73" mi="5" ci="0" mb="0" cb="0"/><line nr="75" mi="2" ci="0" mb="0" cb="0"/><line nr="76" mi="1" ci="0" mb="0" cb="0"/><line nr="77" mi="4" ci="0" mb="0" cb="0"/><line nr="78" mi="2" ci="0" mb="0" cb="0"/><line nr="79" mi="6" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="153" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="33" covered="0"/><counter type="COMPLEXITY" missed="12" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="OpenAITerminalService.java"><line nr="20" mi="4" ci="0" mb="0" cb="0"/><line nr="21" mi="6" ci="0" mb="0" cb="0"/><line nr="26" mi="3" ci="0" mb="0" cb="0"/><line nr="28" mi="3" ci="0" mb="0" cb="0"/><line nr="31" mi="2" ci="0" mb="0" cb="0"/><line nr="36" mi="4" ci="0" mb="2" cb="0"/><line nr="37" mi="4" ci="0" mb="0" cb="0"/><line nr="38" mi="4" ci="0" mb="2" cb="0"/><line nr="39" mi="3" ci="0" mb="0" cb="0"/><line nr="40" mi="11" ci="0" mb="0" cb="0"/><line nr="41" mi="3" ci="0" mb="2" cb="0"/><line nr="42" mi="3" ci="0" mb="0" cb="0"/><line nr="43" mi="4" ci="0" mb="0" cb="0"/><line nr="45" mi="2" ci="0" mb="0" cb="0"/><line nr="47" mi="8" ci="0" mb="0" cb="0"/><line nr="49" mi="1" ci="0" mb="0" cb="0"/><line nr="50" mi="5" ci="0" mb="0" cb="0"/><line nr="51" mi="1" ci="0" mb="0" cb="0"/><line nr="53" mi="9" ci="0" mb="0" cb="0"/><line nr="54" mi="8" ci="0" mb="0" cb="0"/><line nr="55" mi="6" ci="0" mb="0" cb="0"/><line nr="58" mi="3" ci="0" mb="0" cb="0"/><line nr="60" mi="9" ci="0" mb="2" cb="0"/><line nr="61" mi="7" ci="0" mb="2" cb="0"/><line nr="66" mi="5" ci="0" mb="0" cb="0"/><line nr="68" mi="10" ci="0" mb="2" cb="0"/><line nr="70" mi="6" ci="0" mb="0" cb="0"/><line nr="71" mi="5" ci="0" mb="0" cb="0"/><line nr="73" mi="9" ci="0" mb="2" cb="0"/><line nr="74" mi="1" ci="0" mb="0" cb="0"/><line nr="75" mi="4" ci="0" mb="0" cb="0"/><line nr="76" mi="2" ci="0" mb="0" cb="0"/><line nr="77" mi="6" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="161" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="33" covered="0"/><counter type="COMPLEXITY" missed="13" covered="0"/><counter type="METHOD" missed="6" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="314" covered="0"/><counter type="BRANCH" missed="26" covered="0"/><counter type="LINE" missed="66" covered="0"/><counter type="COMPLEXITY" missed="25" covered="0"/><counter type="METHOD" missed="12" covered="0"/><counter type="CLASS" missed="2" covered="0"/></package><package name="io/sentrius/sso/genai/spring/ai"><class name="io/sentrius/sso/genai/spring/ai/AgentCommunicationMemoryStore" sourcefilename="AgentCommunicationMemoryStore.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/core/services/agents/AgentService;)V" line="21"><counter type="INSTRUCTION" missed="11" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="add" desc="(Ljava/lang/String;Ljava/util/List;)V" line="29"><counter type="INSTRUCTION" missed="23" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="get" desc="(Ljava/lang/String;I)Ljava/util/List;" line="39"><counter type="INSTRUCTION" missed="63" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="14" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="clear" desc="(Ljava/lang/String;)V" line="64"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="16"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="107" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="26" covered="0"/><counter type="COMPLEXITY" missed="9" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="AgentCommunicationMemoryStore.java"><line nr="16" mi="4" ci="0" mb="0" cb="0"/><line nr="21" mi="5" ci="0" mb="0" cb="0"/><line nr="23" mi="2" ci="0" mb="0" cb="0"/><line nr="24" mi="3" ci="0" mb="0" cb="0"/><line nr="25" mi="1" ci="0" mb="0" cb="0"/><line nr="29" mi="5" ci="0" mb="2" cb="0"/><line nr="30" mi="4" ci="0" mb="0" cb="0"/><line nr="31" mi="9" ci="0" mb="0" cb="0"/><line nr="34" mi="4" ci="0" mb="0" cb="0"/><line nr="36" mi="1" ci="0" mb="0" cb="0"/><line nr="39" mi="5" ci="0" mb="2" cb="0"/><line nr="40" mi="6" ci="0" mb="0" cb="0"/><line nr="43" mi="6" ci="0" mb="0" cb="0"/><line nr="44" mi="4" ci="0" mb="0" cb="0"/><line nr="46" mi="10" ci="0" mb="2" cb="0"/><line nr="47" mi="5" ci="0" mb="2" cb="0"/><line nr="49" mi="7" ci="0" mb="0" cb="0"/><line nr="51" mi="4" ci="0" mb="0" cb="0"/><line nr="52" mi="1" ci="0" mb="0" cb="0"/><line nr="53" mi="5" ci="0" mb="0" cb="0"/><line nr="54" mi="1" ci="0" mb="0" cb="0"/><line nr="56" mi="1" ci="0" mb="0" cb="0"/><line nr="59" mi="6" ci="0" mb="0" cb="0"/><line nr="60" mi="2" ci="0" mb="0" cb="0"/><line nr="64" mi="5" ci="0" mb="0" cb="0"/><line nr="65" mi="1" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="107" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="26" covered="0"/><counter type="COMPLEXITY" missed="9" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="107" covered="0"/><counter type="BRANCH" missed="8" covered="0"/><counter type="LINE" missed="26" covered="0"/><counter type="COMPLEXITY" missed="9" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></package><package name="io/sentrius/sso/automation/auditing/rules"><class name="io/sentrius/sso/automation/auditing/rules/OpenAISessionRule" sourcefilename="OpenAISessionRule.java"><method name="&lt;init&gt;" desc="()V" line="19"><counter type="INSTRUCTION" missed="17" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setConnectedSystem" desc="(Lio/sentrius/sso/core/model/ConnectedSystem;)V" line="39"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTrackingService" desc="(Lio/sentrius/sso/core/services/terminal/SessionTrackingService;)V" line="44"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="trigger" desc="(Ljava/lang/String;)Ljava/util/Optional;" line="49"><counter type="INSTRUCTION" missed="107" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="27" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="configure" desc="(Lio/sentrius/sso/core/config/SystemOptions;Ljava/lang/String;)Z" line="97"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="describeAction" desc="()Lio/sentrius/sso/automation/auditing/TriggerAction;" line="102"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="requiresSanitized" desc="()Z" line="107"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="onMessage" desc="(Lio/sentrius/sso/protobuf/Session$TerminalMessage;)Ljava/util/Optional;" line="113"><counter type="INSTRUCTION" missed="36" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="6" covered="0"/><counter type="COMPLEXITY" missed="4" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="isOnlySessionRule" desc="()Z" line="124"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="onFullCommand" desc="()Z" line="129"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$trigger$0" desc="(Ljava/lang/Boolean;)V" line="74"><counter type="INSTRUCTION" missed="11" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="4" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="18"><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="196" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="53" covered="0"/><counter type="COMPLEXITY" missed="19" covered="0"/><counter type="METHOD" missed="12" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><class name="io/sentrius/sso/automation/auditing/rules/TwoPartyAIMonitor" sourcefilename="TwoPartyAIMonitor.java"><method name="&lt;init&gt;" desc="()V" line="21"><counter type="INSTRUCTION" missed="38" covered="0"/><counter type="LINE" missed="10" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setConnectedSystem" desc="(Lio/sentrius/sso/core/model/ConnectedSystem;)V" line="45"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="setTrackingService" desc="(Lio/sentrius/sso/core/services/terminal/SessionTrackingService;)V" line="50"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="trigger" desc="(Ljava/lang/String;)Ljava/util/Optional;" line="55"><counter type="INSTRUCTION" missed="213" covered="0"/><counter type="BRANCH" missed="20" covered="0"/><counter type="LINE" missed="43" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="configure" desc="(Lio/sentrius/sso/core/config/SystemOptions;Ljava/lang/String;)Z" line="135"><counter type="INSTRUCTION" missed="24" covered="0"/><counter type="LINE" missed="5" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="describeAction" desc="()Lio/sentrius/sso/automation/auditing/TriggerAction;" line="145"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="requiresSanitized" desc="()Z" line="150"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="onMessage" desc="(Lio/sentrius/sso/protobuf/Session$TerminalMessage;)Ljava/util/Optional;" line="156"><counter type="INSTRUCTION" missed="149" covered="0"/><counter type="BRANCH" missed="20" covered="0"/><counter type="LINE" missed="30" covered="0"/><counter type="COMPLEXITY" missed="11" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="isOnlySessionRule" desc="()Z" line="222"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="onFullCommand" desc="()Z" line="227"><counter type="INSTRUCTION" missed="2" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$onMessage$1" desc="(Lio/sentrius/sso/core/model/LLMResponse;)V" line="169"><counter type="INSTRUCTION" missed="48" covered="0"/><counter type="BRANCH" missed="12" covered="0"/><counter type="LINE" missed="8" covered="0"/><counter type="COMPLEXITY" missed="7" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="lambda$trigger$0" desc="(Lio/sentrius/sso/core/model/LLMResponse;)V" line="98"><counter type="INSTRUCTION" missed="46" covered="0"/><counter type="BRANCH" missed="10" covered="0"/><counter type="LINE" missed="8" covered="0"/><counter type="COMPLEXITY" missed="6" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="20"><counter type="INSTRUCTION" missed="7" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="541" covered="0"/><counter type="BRANCH" missed="62" covered="0"/><counter type="LINE" missed="114" covered="0"/><counter type="COMPLEXITY" missed="44" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="TwoPartyAIMonitor.java"><line nr="20" mi="3" ci="0" mb="0" cb="0"/><line nr="21" mi="2" ci="0" mb="0" cb="0"/><line nr="25" mi="4" ci="0" mb="0" cb="0"/><line nr="29" mi="3" ci="0" mb="0" cb="0"/><line nr="30" mi="3" ci="0" mb="0" cb="0"/><line nr="31" mi="3" ci="0" mb="0" cb="0"/><line nr="32" mi="3" ci="0" mb="0" cb="0"/><line nr="35" mi="5" ci="0" mb="0" cb="0"/><line nr="38" mi="6" ci="0" mb="0" cb="0"/><line nr="39" mi="6" ci="0" mb="0" cb="0"/><line nr="40" mi="3" ci="0" mb="0" cb="0"/><line nr="41" mi="4" ci="0" mb="0" cb="0"/><line nr="45" mi="3" ci="0" mb="0" cb="0"/><line nr="46" mi="1" ci="0" mb="0" cb="0"/><line nr="50" mi="3" ci="0" mb="0" cb="0"/><line nr="51" mi="1" ci="0" mb="0" cb="0"/><line nr="55" mi="3" ci="0" mb="0" cb="0"/><line nr="56" mi="3" ci="0" mb="2" cb="0"/><line nr="57" mi="3" ci="0" mb="0" cb="0"/><line nr="59" mi="15" ci="0" mb="2" cb="0"/><line nr="60" mi="3" ci="0" mb="0" cb="0"/><line nr="62" mi="6" ci="0" mb="0" cb="0"/><line nr="63" mi="3" ci="0" mb="2" cb="0"/><line nr="64" mi="3" ci="0" mb="0" cb="0"/><line nr="65" mi="6" ci="0" mb="0" cb="0"/><line nr="66" mi="3" ci="0" mb="0" cb="0"/><line nr="69" mi="8" ci="0" mb="2" cb="0"/><line nr="70" mi="4" ci="0" mb="0" cb="0"/><line nr="72" mi="5" ci="0" mb="0" cb="0"/><line nr="75" mi="8" ci="0" mb="2" cb="0"/><line nr="76" mi="3" ci="0" mb="0" cb="0"/><line nr="77" mi="15" ci="0" mb="2" cb="0"/><line nr="78" mi="3" ci="0" mb="0" cb="0"/><line nr="81" mi="7" ci="0" mb="2" cb="0"/><line nr="82" mi="3" ci="0" mb="0" cb="0"/><line nr="84" mi="15" ci="0" mb="2" cb="0"/><line nr="85" mi="3" ci="0" mb="0" cb="0"/><line nr="86" mi="3" ci="0" mb="0" cb="0"/><line nr="89" mi="3" ci="0" mb="0" cb="0"/><line nr="93" mi="5" ci="0" mb="0" cb="0"/><line nr="94" mi="4" ci="0" mb="0" cb="0"/><line nr="96" mi="2" ci="0" mb="0" cb="0"/><line nr="97" mi="9" ci="0" mb="0" cb="0"/><line nr="98" mi="4" ci="0" mb="0" cb="0"/><line nr="99" mi="2" ci="0" mb="2" cb="0"/><line nr="100" mi="12" ci="0" mb="2" cb="0"/><line nr="101" mi="5" ci="0" mb="0" cb="0"/><line nr="102" mi="12" ci="0" mb="6" cb="0"/><line nr="103" mi="6" ci="0" mb="0" cb="0"/><line nr="106" mi="4" ci="0" mb="0" cb="0"/><line nr="109" mi="1" ci="0" mb="0" cb="0"/><line nr="112" mi="3" ci="0" mb="0" cb="0"/><line nr="113" mi="1" ci="0" mb="0" cb="0"/><line nr="114" mi="3" ci="0" mb="0" cb="0"/><line nr="115" mi="2" ci="0" mb="0" cb="0"/><line nr="116" mi="5" ci="0" mb="0" cb="0"/><line nr="117" mi="1" ci="0" mb="0" cb="0"/><line nr="118" mi="2" ci="0" mb="0" cb="0"/><line nr="119" mi="5" ci="0" mb="0" cb="0"/><line nr="120" mi="1" ci="0" mb="0" cb="0"/><line nr="122" mi="4" ci="0" mb="2" cb="0"/><line nr="123" mi="13" ci="0" mb="2" cb="0"/><line nr="124" mi="4" ci="0" mb="0" cb="0"/><line nr="125" mi="9" ci="0" mb="0" cb="0"/><line nr="126" mi="3" ci="0" mb="0" cb="0"/><line nr="129" mi="6" ci="0" mb="0" cb="0"/><line nr="130" mi="3" ci="0" mb="0" cb="0"/><line nr="135" mi="6" ci="0" mb="0" cb="0"/><line nr="136" mi="6" ci="0" mb="0" cb="0"/><line nr="137" mi="5" ci="0" mb="0" cb="0"/><line nr="138" mi="5" ci="0" mb="0" cb="0"/><line nr="139" mi="2" ci="0" mb="0" cb="0"/><line nr="145" mi="2" ci="0" mb="0" cb="0"/><line nr="150" mi="2" ci="0" mb="0" cb="0"/><line nr="156" mi="4" ci="0" mb="2" cb="0"/><line nr="157" mi="3" ci="0" mb="0" cb="0"/><line nr="158" mi="6" ci="0" mb="0" cb="0"/><line nr="159" mi="3" ci="0" mb="2" cb="0"/><line nr="160" mi="3" ci="0" mb="0" cb="0"/><line nr="161" mi="6" ci="0" mb="0" cb="0"/><line nr="162" mi="3" ci="0" mb="0" cb="0"/><line nr="165" mi="5" ci="0" mb="0" cb="0"/><line nr="167" mi="2" ci="0" mb="0" cb="0"/><line nr="168" mi="15" ci="0" mb="0" cb="0"/><line nr="169" mi="4" ci="0" mb="0" cb="0"/><line nr="170" mi="2" ci="0" mb="2" cb="0"/><line nr="171" mi="11" ci="0" mb="2" cb="0"/><line nr="172" mi="5" ci="0" mb="0" cb="0"/><line nr="173" mi="15" ci="0" mb="8" cb="0"/><line nr="174" mi="6" ci="0" mb="0" cb="0"/><line nr="177" mi="4" ci="0" mb="0" cb="0"/><line nr="180" mi="1" ci="0" mb="0" cb="0"/><line nr="183" mi="3" ci="0" mb="0" cb="0"/><line nr="185" mi="8" ci="0" mb="4" cb="0"/><line nr="186" mi="12" ci="0" mb="4" cb="0"/><line nr="187" mi="4" ci="0" mb="0" cb="0"/><line nr="188" mi="4" ci="0" mb="0" cb="0"/><line nr="189" mi="9" ci="0" mb="0" cb="0"/><line nr="190" mi="3" ci="0" mb="0" cb="0"/><line nr="193" mi="1" ci="0" mb="0" cb="0"/><line nr="194" mi="5" ci="0" mb="0" cb="0"/><line nr="195" mi="1" ci="0" mb="0" cb="0"/><line nr="196" mi="5" ci="0" mb="0" cb="0"/><line nr="197" mi="1" ci="0" mb="0" cb="0"/><line nr="199" mi="12" ci="0" mb="6" cb="0"/><line nr="200" mi="4" ci="0" mb="2" cb="0"/><line nr="201" mi="6" ci="0" mb="0" cb="0"/><line nr="202" mi="3" ci="0" mb="0" cb="0"/><line nr="205" mi="6" ci="0" mb="0" cb="0"/><line nr="206" mi="3" ci="0" mb="0" cb="0"/><line nr="215" mi="6" ci="0" mb="0" cb="0"/><line nr="216" mi="3" ci="0" mb="0" cb="0"/><line nr="222" mi="2" ci="0" mb="0" cb="0"/><line nr="227" mi="2" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="541" covered="0"/><counter type="BRANCH" missed="62" covered="0"/><counter type="LINE" missed="114" covered="0"/><counter type="COMPLEXITY" missed="44" covered="0"/><counter type="METHOD" missed="13" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><sourcefile name="OpenAISessionRule.java"><line nr="18" mi="3" ci="0" mb="0" cb="0"/><line nr="19" mi="2" ci="0" mb="0" cb="0"/><line nr="23" mi="4" ci="0" mb="0" cb="0"/><line nr="27" mi="3" ci="0" mb="0" cb="0"/><line nr="28" mi="3" ci="0" mb="0" cb="0"/><line nr="32" mi="5" ci="0" mb="0" cb="0"/><line nr="35" mi="4" ci="0" mb="0" cb="0"/><line nr="39" mi="3" ci="0" mb="0" cb="0"/><line nr="40" mi="1" ci="0" mb="0" cb="0"/><line nr="44" mi="3" ci="0" mb="0" cb="0"/><line nr="45" mi="1" ci="0" mb="0" cb="0"/><line nr="49" mi="6" ci="0" mb="0" cb="0"/><line nr="50" mi="3" ci="0" mb="2" cb="0"/><line nr="51" mi="3" ci="0" mb="0" cb="0"/><line nr="52" mi="6" ci="0" mb="0" cb="0"/><line nr="53" mi="3" ci="0" mb="0" cb="0"/><line nr="56" mi="8" ci="0" mb="2" cb="0"/><line nr="57" mi="4" ci="0" mb="0" cb="0"/><line nr="59" mi="5" ci="0" mb="0" cb="0"/><line nr="62" mi="8" ci="0" mb="2" cb="0"/><line nr="63" mi="3" ci="0" mb="0" cb="0"/><line nr="64" mi="6" ci="0" mb="0" cb="0"/><line nr="65" mi="3" ci="0" mb="0" cb="0"/><line nr="69" mi="5" ci="0" mb="0" cb="0"/><line nr="70" mi="4" ci="0" mb="0" cb="0"/><line nr="72" mi="3" ci="0" mb="0" cb="0"/><line nr="73" mi="5" ci="0" mb="0" cb="0"/><line nr="74" mi="4" ci="0" mb="0" cb="0"/><line nr="75" mi="3" ci="0" mb="2" cb="0"/><line nr="76" mi="3" ci="0" mb="0" cb="0"/><line nr="78" mi="1" ci="0" mb="0" cb="0"/><line nr="81" mi="3" ci="0" mb="0" cb="0"/><line nr="82" mi="1" ci="0" mb="0" cb="0"/><line nr="83" mi="3" ci="0" mb="0" cb="0"/><line nr="84" mi="2" ci="0" mb="0" cb="0"/><line nr="85" mi="5" ci="0" mb="0" cb="0"/><line nr="86" mi="1" ci="0" mb="0" cb="0"/><line nr="87" mi="2" ci="0" mb="0" cb="0"/><line nr="88" mi="5" ci="0" mb="0" cb="0"/><line nr="89" mi="1" ci="0" mb="0" cb="0"/><line nr="91" mi="6" ci="0" mb="0" cb="0"/><line nr="92" mi="3" ci="0" mb="0" cb="0"/><line nr="97" mi="2" ci="0" mb="0" cb="0"/><line nr="102" mi="2" ci="0" mb="0" cb="0"/><line nr="107" mi="2" ci="0" mb="0" cb="0"/><line nr="113" mi="6" ci="0" mb="0" cb="0"/><line nr="114" mi="12" ci="0" mb="6" cb="0"/><line nr="115" mi="6" ci="0" mb="0" cb="0"/><line nr="116" mi="3" ci="0" mb="0" cb="0"/><line nr="118" mi="6" ci="0" mb="0" cb="0"/><line nr="119" mi="3" ci="0" mb="0" cb="0"/><line nr="124" mi="2" ci="0" mb="0" cb="0"/><line nr="129" mi="2" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="196" covered="0"/><counter type="BRANCH" missed="14" covered="0"/><counter type="LINE" missed="53" covered="0"/><counter type="COMPLEXITY" missed="19" covered="0"/><counter type="METHOD" missed="12" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="737" covered="0"/><counter type="BRANCH" missed="76" covered="0"/><counter type="LINE" missed="167" covered="0"/><counter type="COMPLEXITY" missed="63" covered="0"/><counter type="METHOD" missed="25" covered="0"/><counter type="CLASS" missed="2" covered="0"/></package><package name="io/sentrius/sso/genai/suggestions"><class name="io/sentrius/sso/genai/suggestions/TerminalSuggestors" sourcefilename="TerminalSuggestors.java"><method name="&lt;init&gt;" desc="(Lio/sentrius/sso/security/TokenProvider;Lio/sentrius/sso/genai/GenerativeAPI;Lio/sentrius/sso/genai/GeneratorConfiguration;Lio/sentrius/sso/genai/TerminalLogConfiguration;)V" line="28"><counter type="INSTRUCTION" missed="6" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateInput" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Ljava/lang/String;" line="38"><counter type="INSTRUCTION" missed="5" covered="0"/><counter type="LINE" missed="2" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generate" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Lio/sentrius/sso/core/model/LLMResponse;" line="46"><counter type="INSTRUCTION" missed="92" covered="0"/><counter type="BRANCH" missed="2" covered="0"/><counter type="LINE" missed="16" covered="0"/><counter type="COMPLEXITY" missed="2" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="generateUserInput" desc="(Lio/sentrius/sso/genai/model/TwoPartyRequest;)Ljava/lang/String;" line="68"><counter type="INSTRUCTION" missed="24" covered="0"/><counter type="BRANCH" missed="4" covered="0"/><counter type="LINE" missed="7" covered="0"/><counter type="COMPLEXITY" missed="3" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><method name="&lt;clinit&gt;" desc="()V" line="22"><counter type="INSTRUCTION" missed="4" covered="0"/><counter type="LINE" missed="1" covered="0"/><counter type="COMPLEXITY" missed="1" covered="0"/><counter type="METHOD" missed="1" covered="0"/></method><counter type="INSTRUCTION" missed="131" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="28" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></class><sourcefile name="TerminalSuggestors.java"><line nr="22" mi="4" ci="0" mb="0" cb="0"/><line nr="28" mi="5" ci="0" mb="0" cb="0"/><line nr="29" mi="1" ci="0" mb="0" cb="0"/><line nr="38" mi="3" ci="0" mb="0" cb="0"/><line nr="41" mi="2" ci="0" mb="0" cb="0"/><line nr="46" mi="13" ci="0" mb="0" cb="0"/><line nr="47" mi="5" ci="0" mb="0" cb="0"/><line nr="48" mi="4" ci="0" mb="0" cb="0"/><line nr="49" mi="7" ci="0" mb="0" cb="0"/><line nr="51" mi="3" ci="0" mb="0" cb="0"/><line nr="52" mi="6" ci="0" mb="0" cb="0"/><line nr="53" mi="6" ci="0" mb="0" cb="0"/><line nr="54" mi="4" ci="0" mb="0" cb="0"/><line nr="55" mi="7" ci="0" mb="0" cb="0"/><line nr="56" mi="2" ci="0" mb="0" cb="0"/><line nr="57" mi="4" ci="0" mb="2" cb="0"/><line nr="58" mi="7" ci="0" mb="0" cb="0"/><line nr="60" mi="10" ci="0" mb="0" cb="0"/><line nr="61" mi="1" ci="0" mb="0" cb="0"/><line nr="62" mi="5" ci="0" mb="0" cb="0"/><line nr="63" mi="8" ci="0" mb="0" cb="0"/><line nr="68" mi="2" ci="0" mb="0" cb="0"/><line nr="69" mi="8" ci="0" mb="4" cb="0"/><line nr="70" mi="4" ci="0" mb="0" cb="0"/><line nr="72" mi="3" ci="0" mb="0" cb="0"/><line nr="76" mi="2" ci="0" mb="0" cb="0"/><line nr="84" mi="3" ci="0" mb="0" cb="0"/><line nr="85" mi="2" ci="0" mb="0" cb="0"/><counter type="INSTRUCTION" missed="131" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="28" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></sourcefile><counter type="INSTRUCTION" missed="131" covered="0"/><counter type="BRANCH" missed="6" covered="0"/><counter type="LINE" missed="28" covered="0"/><counter type="COMPLEXITY" missed="8" covered="0"/><counter type="METHOD" missed="5" covered="0"/><counter type="CLASS" missed="1" covered="0"/></package><counter type="INSTRUCTION" missed="3449" covered="0"/><counter type="BRANCH" missed="340" covered="0"/><counter type="LINE" missed="529" covered="0"/><counter type="COMPLEXITY" missed="367" covered="0"/><counter type="METHOD" missed="197" covered="0"/><counter type="CLASS" missed="28" covered="0"/></report>
    \ No newline at end of file