From a355bf31839f53e37e7d1dc5e69534684f01ef2e Mon Sep 17 00:00:00 2001 From: Mahesh Kommareddi Date: Wed, 17 Jul 2024 02:21:03 -0400 Subject: [PATCH] Major cleanup and organization..... --- src/main/java/com/ioa/IoASystem.java | 89 ++++++++----- src/main/java/com/ioa/agent/AgentInfo.java | 81 ++++++++++- .../com/ioa/model/BedrockLanguageModel.java | 2 +- src/main/java/com/ioa/task/TaskManager.java | 71 ++++++---- src/main/java/com/ioa/team/TeamFormation.java | 82 ++++++++---- src/main/java/com/ioa/tool/CommonTools.java | 126 ------------------ src/main/java/com/ioa/tool/Tool.java | 11 +- src/main/java/com/ioa/tool/ToolRegistry.java | 19 ++- .../tool/common/AppointmentSchedulerTool.java | 10 ++ .../tool/common/DistanceCalculatorTool.java | 10 ++ .../ioa/tool/common/FinancialAdviceTool.java | 10 ++ .../tool/common/FitnessClassFinderTool.java | 10 ++ .../tool/common/MovieRecommendationTool.java | 10 ++ .../com/ioa/tool/common/NewsUpdateTool.java | 10 ++ .../ioa/tool/common/PriceComparisonTool.java | 10 ++ .../java/com/ioa/tool/common/RecipeTool.java | 10 ++ .../com/ioa/tool/common/ReminderTool.java | 10 ++ .../ioa/tool/common/RestaurantFinderTool.java | 10 ++ .../com/ioa/tool/common/TranslationTool.java | 10 ++ .../ioa/tool/common/TravelBookingTool.java | 10 ++ .../java/com/ioa/tool/common/WeatherTool.java | 10 ++ .../com/ioa/tool/common/WebSearchTool.java | 10 ++ src/main/java/com/ioa/util/TreeOfThought.java | 25 ++-- target/classes/com/ioa/IoASystem.class | Bin 10146 -> 11149 bytes target/classes/com/ioa/agent/AgentInfo.class | Bin 3486 -> 5279 bytes .../classes/com/ioa/agent/AgentRegistry.class | Bin 5472 -> 5473 bytes .../com/ioa/model/BedrockLanguageModel.class | Bin 5823 -> 5823 bytes .../ioa/task/TaskManager$TaskProgress.class | Bin 696 -> 0 bytes target/classes/com/ioa/task/TaskManager.class | Bin 4624 -> 6458 bytes .../classes/com/ioa/team/TeamFormation.class | Bin 6527 -> 8555 bytes target/classes/com/ioa/tool/CommonTools.class | Bin 5011 -> 0 bytes target/classes/com/ioa/tool/Tool.class | Bin 405 -> 162 bytes .../classes/com/ioa/tool/ToolRegistry.class | Bin 1219 -> 1542 bytes .../common/AppointmentSchedulerTool.class | Bin 0 -> 1113 bytes .../tool/common/DistanceCalculatorTool.class | Bin 0 -> 1113 bytes .../ioa/tool/common/FinancialAdviceTool.class | Bin 0 -> 1093 bytes .../tool/common/FitnessClassFinderTool.class | Bin 0 -> 1107 bytes .../tool/common/MovieRecommendationTool.class | Bin 0 -> 1110 bytes .../com/ioa/tool/common/NewsUpdateTool.class | Bin 0 -> 1074 bytes .../ioa/tool/common/PriceComparisonTool.class | Bin 0 -> 1093 bytes .../com/ioa/tool/common/RecipeTool.class | Bin 0 -> 1062 bytes .../com/ioa/tool/common/ReminderTool.class | Bin 0 -> 1068 bytes .../tool/common/RestaurantFinderTool.class | Bin 0 -> 1098 bytes .../com/ioa/tool/common/TranslationTool.class | Bin 0 -> 1072 bytes .../ioa/tool/common/TravelBookingTool.class | Bin 0 -> 1084 bytes .../com/ioa/tool/common/WeatherTool.class | Bin 0 -> 1072 bytes .../com/ioa/tool/common/WebSearchTool.class | Bin 0 -> 1077 bytes .../classes/com/ioa/util/TreeOfThought.class | Bin 3727 -> 4404 bytes target/classes/static/asset-manifest.json | 6 +- target/classes/static/index.html | 2 +- .../classes/static/static/js/main.720bb114.js | 3 + .../static/js/main.720bb114.js.LICENSE.txt | 39 ++++++ .../static/static/js/main.720bb114.js.map | 1 + .../compile/default-compile/createdFiles.lst | 22 ++- 54 files changed, 469 insertions(+), 250 deletions(-) delete mode 100644 src/main/java/com/ioa/tool/CommonTools.java create mode 100644 src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java create mode 100644 src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java create mode 100644 src/main/java/com/ioa/tool/common/FinancialAdviceTool.java create mode 100644 src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java create mode 100644 src/main/java/com/ioa/tool/common/MovieRecommendationTool.java create mode 100644 src/main/java/com/ioa/tool/common/NewsUpdateTool.java create mode 100644 src/main/java/com/ioa/tool/common/PriceComparisonTool.java create mode 100644 src/main/java/com/ioa/tool/common/RecipeTool.java create mode 100644 src/main/java/com/ioa/tool/common/ReminderTool.java create mode 100644 src/main/java/com/ioa/tool/common/RestaurantFinderTool.java create mode 100644 src/main/java/com/ioa/tool/common/TranslationTool.java create mode 100644 src/main/java/com/ioa/tool/common/TravelBookingTool.java create mode 100644 src/main/java/com/ioa/tool/common/WeatherTool.java create mode 100644 src/main/java/com/ioa/tool/common/WebSearchTool.java delete mode 100644 target/classes/com/ioa/task/TaskManager$TaskProgress.class delete mode 100644 target/classes/com/ioa/tool/CommonTools.class create mode 100644 target/classes/com/ioa/tool/common/AppointmentSchedulerTool.class create mode 100644 target/classes/com/ioa/tool/common/DistanceCalculatorTool.class create mode 100644 target/classes/com/ioa/tool/common/FinancialAdviceTool.class create mode 100644 target/classes/com/ioa/tool/common/FitnessClassFinderTool.class create mode 100644 target/classes/com/ioa/tool/common/MovieRecommendationTool.class create mode 100644 target/classes/com/ioa/tool/common/NewsUpdateTool.class create mode 100644 target/classes/com/ioa/tool/common/PriceComparisonTool.class create mode 100644 target/classes/com/ioa/tool/common/RecipeTool.class create mode 100644 target/classes/com/ioa/tool/common/ReminderTool.class create mode 100644 target/classes/com/ioa/tool/common/RestaurantFinderTool.class create mode 100644 target/classes/com/ioa/tool/common/TranslationTool.class create mode 100644 target/classes/com/ioa/tool/common/TravelBookingTool.class create mode 100644 target/classes/com/ioa/tool/common/WeatherTool.class create mode 100644 target/classes/com/ioa/tool/common/WebSearchTool.class create mode 100644 target/classes/static/static/js/main.720bb114.js create mode 100644 target/classes/static/static/js/main.720bb114.js.LICENSE.txt create mode 100644 target/classes/static/static/js/main.720bb114.js.map diff --git a/src/main/java/com/ioa/IoASystem.java b/src/main/java/com/ioa/IoASystem.java index 1468a21..74ec3b3 100644 --- a/src/main/java/com/ioa/IoASystem.java +++ b/src/main/java/com/ioa/IoASystem.java @@ -5,20 +5,19 @@ import com.ioa.agent.AgentRegistry; import com.ioa.task.Task; import com.ioa.task.TaskManager; import com.ioa.team.TeamFormation; -import com.ioa.tool.CommonTools; import com.ioa.tool.ToolRegistry; +import com.ioa.tool.Tool; +import com.ioa.tool.common.*; import com.ioa.model.BedrockLanguageModel; import com.ioa.service.WebSocketService; -import com.ioa.tool.Tool; import com.ioa.util.TreeOfThought; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.messaging.simp.SimpMessagingTemplate; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -26,26 +25,13 @@ import java.util.List; public class IoASystem { @Bean - public ToolRegistry toolRegistry() { - ToolRegistry toolRegistry = new ToolRegistry(); - CommonTools commonTools = new CommonTools(); - - for (Method method : CommonTools.class.getMethods()) { - if (method.isAnnotationPresent(Tool.class)) { - toolRegistry.registerTool(method.getName(), method); - } - } - return toolRegistry; - } - - @Bean - public AgentRegistry agentRegistry(ToolRegistry toolRegistry) { - return new AgentRegistry(toolRegistry); + public WebSocketService webSocketService(SimpMessagingTemplate messagingTemplate) { + return new WebSocketService(messagingTemplate); } @Bean public BedrockLanguageModel bedrockLanguageModel() { - return new BedrockLanguageModel("anthropic.claude-3-5-sonnet-20240620-v1:0"); + return new BedrockLanguageModel("anthropic.claude-3-sonnet-20240229-v1:0"); } @Bean @@ -54,18 +40,22 @@ public class IoASystem { } @Bean - public TeamFormation teamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { - return new TeamFormation(agentRegistry, treeOfThought, webSocketService); + public AgentRegistry agentRegistry(ToolRegistry toolRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { + AgentRegistry registry = new AgentRegistry(toolRegistry); + + // Other agent creation code + + return registry; } @Bean - public TaskManager taskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry) { - return new TaskManager(agentRegistry, model, toolRegistry); + public TaskManager taskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought) { + return new TaskManager(agentRegistry, model, toolRegistry, treeOfThought); } @Bean - public WebSocketService webSocketService(SimpMessagingTemplate messagingTemplate) { - return new WebSocketService(messagingTemplate); + public TeamFormation teamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService, BedrockLanguageModel model) { + return new TeamFormation(agentRegistry, treeOfThought, webSocketService, model); } public static void main(String[] args) { @@ -74,33 +64,66 @@ public class IoASystem { system.processTasksAndAgents(context); } + @Bean + public ToolRegistry toolRegistry() { + ToolRegistry toolRegistry = new ToolRegistry(); + + // Register all tools + toolRegistry.registerTool("webSearch", new WebSearchTool()); + toolRegistry.registerTool("getWeather", new WeatherTool()); + toolRegistry.registerTool("setReminder", new ReminderTool()); + toolRegistry.registerTool("bookTravel", new TravelBookingTool()); + toolRegistry.registerTool("calculateDistance", new DistanceCalculatorTool()); + toolRegistry.registerTool("findRestaurants", new RestaurantFinderTool()); + toolRegistry.registerTool("scheduleAppointment", new AppointmentSchedulerTool()); + toolRegistry.registerTool("findFitnessClasses", new FitnessClassFinderTool()); + toolRegistry.registerTool("getRecipe", new RecipeTool()); + toolRegistry.registerTool("getNewsUpdates", new NewsUpdateTool()); + toolRegistry.registerTool("translate", new TranslationTool()); + toolRegistry.registerTool("compareProductPrices", new PriceComparisonTool()); + toolRegistry.registerTool("getMovieRecommendations", new MovieRecommendationTool()); + toolRegistry.registerTool("getFinancialAdvice", new FinancialAdviceTool()); + + return toolRegistry; + } + public void processTasksAndAgents(ConfigurableApplicationContext context) { AgentRegistry agentRegistry = context.getBean(AgentRegistry.class); TeamFormation teamFormation = context.getBean(TeamFormation.class); TaskManager taskManager = context.getBean(TaskManager.class); + TreeOfThought treeOfThought = context.getBean(TreeOfThought.class); + WebSocketService webSocketService = context.getBean(WebSocketService.class); + ToolRegistry toolRegistry = context.getBean(ToolRegistry.class); // Register all agents agentRegistry.registerAgent("agent1", new AgentInfo("agent1", "General Assistant", Arrays.asList("general", "search"), - Arrays.asList("webSearch", "getWeather", "setReminder"))); + Arrays.asList("webSearch", "getWeather", "setReminder"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent2", new AgentInfo("agent2", "Travel Expert", Arrays.asList("travel", "booking"), - Arrays.asList("bookTravel", "calculateDistance", "findRestaurants"))); + Arrays.asList("bookTravel", "calculateDistance", "findRestaurants"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent3", new AgentInfo("agent3", "Event Planner Extraordinaire", Arrays.asList("event planning", "team management", "booking"), - Arrays.asList("findRestaurants", "bookTravel", "scheduleAppointment", "getWeather"))); + Arrays.asList("findRestaurants", "bookTravel", "scheduleAppointment", "getWeather"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent4", new AgentInfo("agent4", "Fitness Guru", Arrays.asList("health", "nutrition", "motivation"), - Arrays.asList("findFitnessClasses", "getRecipe", "setReminder", "getWeather"))); + Arrays.asList("findFitnessClasses", "getRecipe", "setReminder", "getWeather"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent5", new AgentInfo("agent5", "Research Specialist", Arrays.asList("research", "writing", "analysis"), - Arrays.asList("webSearch", "getNewsUpdates", "translate", "compareProductPrices"))); + Arrays.asList("webSearch", "getNewsUpdates", "translate", "compareProductPrices"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent6", new AgentInfo("agent6", "Digital Marketing Expert", Arrays.asList("marketing", "social media", "content creation"), - Arrays.asList("webSearch", "getNewsUpdates", "scheduleAppointment", "getMovieRecommendations"))); + Arrays.asList("webSearch", "getNewsUpdates", "scheduleAppointment", "getMovieRecommendations"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent7", new AgentInfo("agent7", "Family Travel Coordinator", Arrays.asList("travel", "family planning", "budgeting"), - Arrays.asList("bookTravel", "calculateDistance", "getWeather", "findRestaurants", "getFinancialAdvice"))); + Arrays.asList("bookTravel", "calculateDistance", "getWeather", "findRestaurants", "getFinancialAdvice"), + treeOfThought, webSocketService, toolRegistry)); // Create all tasks List tasks = Arrays.asList( diff --git a/src/main/java/com/ioa/agent/AgentInfo.java b/src/main/java/com/ioa/agent/AgentInfo.java index f33d372..b4e2321 100644 --- a/src/main/java/com/ioa/agent/AgentInfo.java +++ b/src/main/java/com/ioa/agent/AgentInfo.java @@ -1,28 +1,101 @@ package com.ioa.agent; -import lombok.Data; -import java.util.List; +import com.ioa.util.TreeOfThought; +import com.ioa.service.WebSocketService; +import com.ioa.tool.ToolRegistry; + +import java.util.*; -@Data public class AgentInfo { private String id; private String name; private List capabilities; private List tools; + private TreeOfThought treeOfThought; + private WebSocketService webSocketService; + private ToolRegistry toolRegistry; - public AgentInfo(String id, String name, List capabilities, List tools) { +public AgentInfo(String id, String name, List capabilities, List tools, + TreeOfThought treeOfThought, WebSocketService webSocketService, ToolRegistry toolRegistry) { this.id = id; this.name = name; this.capabilities = capabilities; this.tools = tools; + this.treeOfThought = treeOfThought; + this.webSocketService = webSocketService; + this.toolRegistry = toolRegistry; } public List getCapabilities() { return this.capabilities; } + public String getId() { + return this.id; + } + + public List getTools() { + return this.tools; + } + @Override public String toString() { return "AgentInfo{id='" + id + "', name='" + name + "'}"; } + + public String executeTask(String taskDescription) { + System.out.println("DEBUG: Agent " + id + " executing task: " + taskDescription); + webSocketService.sendUpdate("agent_task", Map.of("agentId", id, "task", taskDescription)); + + // Use Tree of Thought to decide on tools and actions + Map reasoning = treeOfThought.reason("Select tools and actions for task: " + taskDescription + + "\nAvailable tools: " + tools, 2, 2); + String reasoningString = formatReasoning(reasoning); + System.out.println("DEBUG: Agent " + id + " reasoning:\n" + reasoningString); + webSocketService.sendUpdate("agent_reasoning", Map.of("agentId", id, "reasoning", reasoningString)); + + // Extract tool selection from reasoning + List selectedTools = extractToolSelection(reasoningString); + System.out.println("DEBUG: Agent " + id + " selected tools: " + selectedTools); + webSocketService.sendUpdate("agent_tools_selected", Map.of("agentId", id, "tools", selectedTools)); + + // Execute actions using selected tools + StringBuilder result = new StringBuilder(); + for (String tool : selectedTools) { + String actionResult = executeTool(tool, taskDescription); + result.append(actionResult).append("\n"); + } + + String finalResult = result.toString().trim(); + System.out.println("DEBUG: Agent " + id + " task result: " + finalResult); + webSocketService.sendUpdate("agent_task_result", Map.of("agentId", id, "result", finalResult)); + + return finalResult; + } + + private String formatReasoning(Map reasoning) { + // Implement a method to format the reasoning tree into a string + // This is a placeholder implementation + return reasoning.toString(); + } + + private List extractToolSelection(String reasoning) { + // Implement a method to extract tool selection from reasoning + // This is a placeholder implementation + return new ArrayList<>(tools); + } + + private String executeTool(String tool, String context) { + System.out.println("DEBUG: Agent " + id + " executing tool: " + tool); + webSocketService.sendUpdate("agent_tool_execution", Map.of("agentId", id, "tool", tool)); + + // Placeholder for tool execution + // In a real implementation, you would call the actual tool method from the ToolRegistry + String result = "Simulated result of using " + tool + " for context: " + context; + + System.out.println("DEBUG: Agent " + id + " tool result: " + result); + webSocketService.sendUpdate("agent_tool_result", Map.of("agentId", id, "tool", tool, "result", result)); + + return result; + } } \ No newline at end of file diff --git a/src/main/java/com/ioa/model/BedrockLanguageModel.java b/src/main/java/com/ioa/model/BedrockLanguageModel.java index 5d68a26..3126ddb 100644 --- a/src/main/java/com/ioa/model/BedrockLanguageModel.java +++ b/src/main/java/com/ioa/model/BedrockLanguageModel.java @@ -38,7 +38,7 @@ public class BedrockLanguageModel { ArrayNode messages = requestBody.putArray("messages"); ObjectNode message = messages.addObject(); message.put("role", "user"); - requestBody.put("max_tokens", 500); + requestBody.put("max_tokens", 2000); requestBody.put("temperature", 0.7); requestBody.put("top_p", 0.9); diff --git a/src/main/java/com/ioa/task/TaskManager.java b/src/main/java/com/ioa/task/TaskManager.java index f590271..e068495 100644 --- a/src/main/java/com/ioa/task/TaskManager.java +++ b/src/main/java/com/ioa/task/TaskManager.java @@ -5,11 +5,14 @@ import com.ioa.agent.AgentRegistry; import com.ioa.model.BedrockLanguageModel; import com.ioa.service.WebSocketService; import com.ioa.tool.ToolRegistry; +import com.ioa.util.TreeOfThought; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; +import java.util.List; +import java.util.ArrayList; @Component public class TaskManager { @@ -17,18 +20,22 @@ public class TaskManager { private AgentRegistry agentRegistry; private BedrockLanguageModel model; private ToolRegistry toolRegistry; + private TreeOfThought treeOfThought; @Autowired private WebSocketService webSocketService; - public TaskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry) { + public TaskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought) { this.agentRegistry = agentRegistry; this.model = model; this.toolRegistry = toolRegistry; + this.treeOfThought = treeOfThought; } public void addTask(Task task) { tasks.put(task.getId(), task); + System.out.println("DEBUG: Task added: " + task.getId()); + webSocketService.sendUpdate("task_added", Map.of("taskId", task.getId(), "description", task.getDescription())); } public void executeTask(String taskId) { @@ -41,18 +48,27 @@ public class TaskManager { "\nAssigned agent capabilities: " + agent.getCapabilities() + "\nAvailable tools: " + agent.getTools(); - String reasoning = model.generate(executionPlanningTask, null); + Map reasoningTree = treeOfThought.reason(executionPlanningTask, 3, 2); + String reasoning = formatReasoning(reasoningTree); + + System.out.println("DEBUG: Task execution reasoning:\n" + reasoning); + webSocketService.sendUpdate("task_reasoning", Map.of("taskId", taskId, "reasoning", reasoning)); + + updateTaskProgress(taskId, "IN_PROGRESS", 25); + + List selectedTools = extractToolSelection(reasoning); + System.out.println("DEBUG: Selected tools: " + selectedTools); + webSocketService.sendUpdate("tools_selected", Map.of("taskId", taskId, "tools", selectedTools)); updateTaskProgress(taskId, "IN_PROGRESS", 50); - String executionPrompt = "Based on this execution plan:\n" + reasoning + - "\nExecute the task using the available tools and provide the result."; - String response = model.generate(executionPrompt, null); - - String result = executeToolsFromResponse(response, agent); + String result = executeTools(selectedTools, task.getDescription(), agent); task.setResult(result); updateTaskProgress(taskId, "COMPLETED", 100); + + System.out.println("DEBUG: Task completed: " + taskId + ", Result: " + result); + webSocketService.sendUpdate("task_completed", Map.of("taskId", taskId, "result", result)); } private void updateTaskProgress(String taskId, String status, int progressPercentage) { @@ -63,27 +79,32 @@ public class TaskManager { webSocketService.sendUpdate("task_progress", progressUpdate); } - private String executeToolsFromResponse(String response, AgentInfo agent) { - StringBuilder result = new StringBuilder(); - for (String tool : agent.getTools()) { - if (response.contains(tool)) { - Object toolInstance = toolRegistry.getTool(tool); - // Execute the tool (this is a simplified representation) - result.append(tool).append(" result: ").append(toolInstance.toString()).append("\n"); - } - } - return result.toString(); + private String formatReasoning(Map reasoningTree) { + // Implement a method to format the reasoning tree into a string + // This is a placeholder implementation + return reasoningTree.toString(); } - private class TaskProgress { - public String taskId; - public String status; - public int progressPercentage; + private List extractToolSelection(String reasoning) { + // Implement a method to extract tool selection from reasoning + // This is a placeholder implementation that selects all available tools + return new ArrayList<>(toolRegistry.getAllTools().keySet()); + } - TaskProgress(String taskId, String status, int progressPercentage) { - this.taskId = taskId; - this.status = status; - this.progressPercentage = progressPercentage; + private String executeTools(List tools, String taskDescription, AgentInfo agent) { + StringBuilder result = new StringBuilder(); + for (String tool : tools) { + System.out.println("DEBUG: Executing tool: " + tool); + webSocketService.sendUpdate("tool_execution", Map.of("taskId", taskDescription, "tool", tool)); + + Object toolInstance = toolRegistry.getTool(tool); + // Execute the tool (this is a simplified representation) + String toolResult = tool + " result: " + toolInstance.toString(); + result.append(toolResult).append("\n"); + + System.out.println("DEBUG: Tool result: " + toolResult); + webSocketService.sendUpdate("tool_result", Map.of("taskId", taskDescription, "tool", tool, "result", toolResult)); } + return result.toString().trim(); } } \ No newline at end of file diff --git a/src/main/java/com/ioa/team/TeamFormation.java b/src/main/java/com/ioa/team/TeamFormation.java index 8456b90..3485348 100644 --- a/src/main/java/com/ioa/team/TeamFormation.java +++ b/src/main/java/com/ioa/team/TeamFormation.java @@ -5,6 +5,7 @@ import com.ioa.agent.AgentRegistry; import com.ioa.task.Task; import com.ioa.util.TreeOfThought; import com.ioa.service.WebSocketService; +import com.ioa.model.BedrockLanguageModel; import org.springframework.stereotype.Component; import java.util.*; @@ -15,11 +16,13 @@ public class TeamFormation { private final AgentRegistry agentRegistry; private final TreeOfThought treeOfThought; private final WebSocketService webSocketService; + private final BedrockLanguageModel model; - public TeamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { + public TeamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService, BedrockLanguageModel model) { this.agentRegistry = agentRegistry; this.treeOfThought = treeOfThought; this.webSocketService = webSocketService; + this.model = model; } public List formTeam(Task task) { @@ -30,28 +33,52 @@ public class TeamFormation { String teamFormationTask = "Form the best team for this task: " + task.getDescription() + "\nRequired capabilities: " + requiredCapabilities + "\nRequired tools: " + requiredTools + - "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents) + - "\nAnalyze the task, evaluate agents, and propose a team composition. " + - "Conclude with a final team selection in the format: 'Final Team Selection: agent1, agent2, ...'"; + "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents); - String reasoning = treeOfThought.reason(teamFormationTask, 3, 2); + Map reasoningTree = treeOfThought.reason(teamFormationTask, 3, 2); + String reasoning = formatReasoning(reasoningTree); // Send update about the reasoning process - if (reasoning != null && !reasoning.isEmpty()) { - webSocketService.sendUpdate("team_formation_reasoning", reasoning); - } + webSocketService.sendUpdate("team_formation_reasoning", reasoning); - List team = parseTeamComposition(reasoning, potentialAgents); + String finalSelection = makeFinalSelection(teamFormationTask, reasoning); + List team = parseTeamComposition(finalSelection, potentialAgents); // Send update about the formed team - if (team != null && !team.isEmpty()) { - webSocketService.sendUpdate("team_formed", team); - } + webSocketService.sendUpdate("team_formed", team); return team; } + private String formatReasoning(Map treeData) { + StringBuilder sb = new StringBuilder(); + formatNode(treeData, sb, 0); + return sb.toString(); + } + private void formatNode(Map node, StringBuilder sb, int depth) { + String indent = " ".repeat(depth); + sb.append(indent).append(node.get("name")).append("\n"); + if (node.containsKey("evaluation")) { + sb.append(indent).append("Evaluation: ").append(node.get("evaluation")).append("\n"); + } + if (node.containsKey("conclusion")) { + sb.append(indent).append("Conclusion: ").append(node.get("conclusion")).append("\n"); + } + if (node.containsKey("children")) { + List> children = (List>) node.get("children"); + for (Map child : children) { + formatNode(child, sb, depth + 1); + } + } + } + + private String makeFinalSelection(String task, String reasoning) { + String prompt = "Based on the following reasoning about the task:\n" + task + "\n\nReasoning:\n" + reasoning + + "\n\nProvide a final team selection in the format: 'Final Team Selection: agent1, agent2, ...'\n" + + "Ensure you select at least one agent if any are suitable for the task."; + return model.generate(prompt, null); + } private String formatAgentTools(List agents) { return agents.stream() @@ -59,8 +86,10 @@ public class TeamFormation { .collect(Collectors.joining(", ")); } - private List parseTeamComposition(String reasoning, List potentialAgents) { - String[] lines = reasoning.split("\n"); + private List parseTeamComposition(String finalSelection, List potentialAgents) { + System.out.println("DEBUG: Final selection: " + finalSelection); + + String[] lines = finalSelection.split("\n"); String selectedTeamLine = ""; for (String line : lines) { if (line.toLowerCase().contains("final team selection")) { @@ -68,29 +97,28 @@ public class TeamFormation { break; } } - + System.out.println("DEBUG: Selected team line: " + selectedTeamLine); - + if (selectedTeamLine.isEmpty()) { - System.out.println("DEBUG: No team selection found in the response."); - return List.of(); + System.out.println("DEBUG: No explicit team selection found. Using all potential agents."); + return potentialAgents; } - + List selectedIds = Arrays.asList(selectedTeamLine.split("[,\\s]+")); System.out.println("DEBUG: Parsed agent IDs: " + selectedIds); - + List team = potentialAgents.stream() .filter(agent -> selectedIds.contains(agent.getId().trim())) .collect(Collectors.toList()); - + System.out.println("DEBUG: Final team: " + team); - - if (team.isEmpty() && !selectedIds.isEmpty()) { - // If no agents were matched but we did find IDs, add the first potential agent as a fallback - team = potentialAgents.stream().limit(1).collect(Collectors.toList()); - System.out.println("DEBUG: No agents matched IDs. Using fallback: " + team); + + if (team.isEmpty() && !potentialAgents.isEmpty()) { + System.out.println("DEBUG: No agents matched IDs. Using all potential agents as fallback."); + return potentialAgents; } - + return team; } } \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/CommonTools.java b/src/main/java/com/ioa/tool/CommonTools.java deleted file mode 100644 index 0608c70..0000000 --- a/src/main/java/com/ioa/tool/CommonTools.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.ioa.tool; - -import com.ioa.tool.Tool; - -public class CommonTools { - - @Tool("Search the web for information") - public String webSearch(String query) { - // Implement web search functionality - return "Web search results for: " + query; - } - - @Tool("Get current weather information") - public String getWeather(String location) { - // Implement weather API call - return "Weather information for " + location; - } - - @Tool("Set a reminder") - public String setReminder(String task, String time) { - // Implement reminder functionality - return "Reminder set for " + task + " at " + time; - } - - @Tool("Calculate distances between locations") - public String calculateDistance(String from, String to) { - // Implement distance calculation - return "Distance from " + from + " to " + to; - } - - @Tool("Translate text between languages") - public String translate(String text, String fromLang, String toLang) { - // Implement translation API call - return "Translated text from " + fromLang + " to " + toLang; - } - - @Tool("Get recipe suggestions") - public String getRecipe(String ingredients) { - // Implement recipe suggestion logic - return "Recipe suggestions for: " + ingredients; - } - - @Tool("Check product prices and compare") - public String compareProductPrices(String product) { - // Implement price comparison logic - return "Price comparison for: " + product; - } - - @Tool("Book travel arrangements") - public String bookTravel(String destination, String dates) { - // Implement travel booking logic - return "Travel arrangements for " + destination + " on " + dates; - } - - @Tool("Find nearby restaurants") - public String findRestaurants(String location, String cuisine) { - // Implement restaurant search - return "Restaurants near " + location + " serving " + cuisine; - } - - @Tool("Schedule appointments") - public String scheduleAppointment(String service, String date) { - // Implement appointment scheduling - return "Appointment scheduled for " + service + " on " + date; - } - - @Tool("Get movie recommendations") - public String getMovieRecommendations(String genres, String mood) { - // Implement movie recommendation logic - return "Movie recommendations for " + genres + " matching " + mood + " mood"; - } - - @Tool("Find and book fitness classes") - public String findFitnessClasses(String type, String location) { - // Implement fitness class search and booking - return "Fitness classes for " + type + " near " + location; - } - - @Tool("Get public transport information") - public String getPublicTransport(String from, String to) { - // Implement public transport routing - return "Public transport options from " + from + " to " + to; - } - - @Tool("Track package deliveries") - public String trackPackage(String trackingNumber) { - // Implement package tracking - return "Tracking information for package: " + trackingNumber; - } - - @Tool("Get news updates") - public String getNewsUpdates(String topics) { - // Implement news aggregation - return "Latest news updates on: " + topics; - } - - @Tool("Find and apply for jobs") - public String jobSearch(String field, String location) { - // Implement job search functionality - return "Job openings in " + field + " near " + location; - } - - @Tool("Get health and medical advice") - public String getMedicalAdvice(String symptoms) { - // Implement medical advice lookup (with disclaimer) - return "General health information for symptoms: " + symptoms; - } - - @Tool("Find and book event tickets") - public String findEventTickets(String event, String location) { - // Implement event ticket search and booking - return "Ticket options for " + event + " in " + location; - } - - @Tool("Get financial advice and budgeting tips") - public String getFinancialAdvice(String income, String expenses) { - // Implement financial advice generation - return "Financial advice based on income: " + income + " and expenses: " + expenses; - } - - @Tool("Find and book home services") - public String findHomeServices(String service, String location) { - // Implement home service search and booking - return "Home service options for " + service + " in " + location; - } -} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/Tool.java b/src/main/java/com/ioa/tool/Tool.java index 3db8918..c06fa4c 100644 --- a/src/main/java/com/ioa/tool/Tool.java +++ b/src/main/java/com/ioa/tool/Tool.java @@ -1,12 +1,5 @@ package com.ioa.tool; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface Tool { - String value(); +public interface Tool { + String execute(String... args); } \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/ToolRegistry.java b/src/main/java/com/ioa/tool/ToolRegistry.java index 03f6c90..e724a53 100644 --- a/src/main/java/com/ioa/tool/ToolRegistry.java +++ b/src/main/java/com/ioa/tool/ToolRegistry.java @@ -4,20 +4,29 @@ import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; +import java.util.Set; @Component public class ToolRegistry { - private Map tools = new HashMap<>(); + private Map tools = new HashMap<>(); - public void registerTool(String name, Object tool) { + public void registerTool(String name, Tool tool) { tools.put(name, tool); } - public Object getTool(String name) { + public Tool getTool(String name) { return tools.get(name); } - public Map getAllTools() { - return new HashMap<>(tools); + public boolean hasTool(String name) { + return tools.containsKey(name); + } + + public Set getAllToolNames() { + return tools.keySet(); + } + + public Map getAllTools() { + return tools; } } \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java b/src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java new file mode 100644 index 0000000..0644e30 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class AppointmentSchedulerTool implements Tool { + @Override + public String execute(String... args) { + return "Appointment scheduled for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java b/src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java new file mode 100644 index 0000000..e243dff --- /dev/null +++ b/src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class DistanceCalculatorTool implements Tool { + @Override + public String execute(String... args) { + return "Distance calculated between: " + String.join(" and ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/FinancialAdviceTool.java b/src/main/java/com/ioa/tool/common/FinancialAdviceTool.java new file mode 100644 index 0000000..1e3009f --- /dev/null +++ b/src/main/java/com/ioa/tool/common/FinancialAdviceTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class FinancialAdviceTool implements Tool { + @Override + public String execute(String... args) { + return "Financial advice for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java b/src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java new file mode 100644 index 0000000..416b1db --- /dev/null +++ b/src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class FitnessClassFinderTool implements Tool { + @Override + public String execute(String... args) { + return "Fitness classes found for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/MovieRecommendationTool.java b/src/main/java/com/ioa/tool/common/MovieRecommendationTool.java new file mode 100644 index 0000000..fe2d9e9 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/MovieRecommendationTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class MovieRecommendationTool implements Tool { + @Override + public String execute(String... args) { + return "Movie recommendations for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/NewsUpdateTool.java b/src/main/java/com/ioa/tool/common/NewsUpdateTool.java new file mode 100644 index 0000000..e5a4c61 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/NewsUpdateTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class NewsUpdateTool implements Tool { + @Override + public String execute(String... args) { + return "News updates for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/PriceComparisonTool.java b/src/main/java/com/ioa/tool/common/PriceComparisonTool.java new file mode 100644 index 0000000..0854964 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/PriceComparisonTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class PriceComparisonTool implements Tool { + @Override + public String execute(String... args) { + return "Price comparison for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/RecipeTool.java b/src/main/java/com/ioa/tool/common/RecipeTool.java new file mode 100644 index 0000000..47f24fe --- /dev/null +++ b/src/main/java/com/ioa/tool/common/RecipeTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class RecipeTool implements Tool { + @Override + public String execute(String... args) { + return "Recipe found for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/ReminderTool.java b/src/main/java/com/ioa/tool/common/ReminderTool.java new file mode 100644 index 0000000..0448fcd --- /dev/null +++ b/src/main/java/com/ioa/tool/common/ReminderTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class ReminderTool implements Tool { + @Override + public String execute(String... args) { + return "Reminder set for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/RestaurantFinderTool.java b/src/main/java/com/ioa/tool/common/RestaurantFinderTool.java new file mode 100644 index 0000000..b9f595f --- /dev/null +++ b/src/main/java/com/ioa/tool/common/RestaurantFinderTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class RestaurantFinderTool implements Tool { + @Override + public String execute(String... args) { + return "Restaurants found near: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/TranslationTool.java b/src/main/java/com/ioa/tool/common/TranslationTool.java new file mode 100644 index 0000000..adbef2f --- /dev/null +++ b/src/main/java/com/ioa/tool/common/TranslationTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class TranslationTool implements Tool { + @Override + public String execute(String... args) { + return "Translation: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/TravelBookingTool.java b/src/main/java/com/ioa/tool/common/TravelBookingTool.java new file mode 100644 index 0000000..2b73a2c --- /dev/null +++ b/src/main/java/com/ioa/tool/common/TravelBookingTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class TravelBookingTool implements Tool { + @Override + public String execute(String... args) { + return "Travel booked for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/WeatherTool.java b/src/main/java/com/ioa/tool/common/WeatherTool.java new file mode 100644 index 0000000..a8bbe9d --- /dev/null +++ b/src/main/java/com/ioa/tool/common/WeatherTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class WeatherTool implements Tool { + @Override + public String execute(String... args) { + return "Weather information for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/WebSearchTool.java b/src/main/java/com/ioa/tool/common/WebSearchTool.java new file mode 100644 index 0000000..f0d8810 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/WebSearchTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class WebSearchTool implements Tool { + @Override + public String execute(String... args) { + return "Web search results for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/util/TreeOfThought.java b/src/main/java/com/ioa/util/TreeOfThought.java index def7618..bc137e4 100644 --- a/src/main/java/com/ioa/util/TreeOfThought.java +++ b/src/main/java/com/ioa/util/TreeOfThought.java @@ -16,10 +16,10 @@ public class TreeOfThought { this.webSocketService = webSocketService; } - public String reason(String task, int depth, int branches) { + public Map reason(String task, int depth, int branches) { Map treeData = exploreThought(task, depth, branches, "Root"); webSocketService.sendUpdate("tree_of_thought", treeData); - return (String) treeData.getOrDefault("selection", "No selection made"); + return treeData; } private Map exploreThought(String task, int depth, int branches, String nodeName) { @@ -45,23 +45,26 @@ public class TreeOfThought { node.put("children", children); if (depth == 1) { - String selection = selectBestBranch(children); - node.put("selection", selection); + String conclusion = concludeThought(task, nodeName, children); + node.put("conclusion", conclusion); } return node; } private String evaluateLeaf(String task, String path) { - String prompt = "Evaluate the effectiveness of this approach for the task: " + task + "\nPath: " + path; + String prompt = "Evaluate this approach for the task: " + task + "\nPath: " + path; return model.generate(prompt, null); } - private String selectBestBranch(List> children) { - // Logic to select the best branch based on evaluations - // For simplicity, let's just select the first child - Map selectedChild = children.get(0); - selectedChild.put("selected", true); - return (String) selectedChild.get("name"); + private String concludeThought(String task, String path, List> children) { + StringBuilder childEvaluations = new StringBuilder(); + for (Map child : children) { + childEvaluations.append(child.get("name")).append(": ").append(child.get("evaluation")).append("\n"); + } + + String prompt = "Conclude on these approaches for the task: " + task + + "\nPath: " + path + "\nEvaluations:\n" + childEvaluations; + return model.generate(prompt, null); } } \ No newline at end of file diff --git a/target/classes/com/ioa/IoASystem.class b/target/classes/com/ioa/IoASystem.class index 25e6b9fe7d6660c751b709bd967e238c13c36c13..200ee20f9a3d753cbd39431e7782aaabba64b473 100644 GIT binary patch literal 11149 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 W&sWs*H9mm%xbN`0e2Cwp=Klf4=EA`M literal 10146 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 e&!Lz3>OQ! z2$pDw>R1Y0U`58BNm;g$GA7Nuo9dI}V1B|DXt1&Zv7rjwuv@V5lW7UiqN7!6hw{dZ zDHpEN5yRC2dd8SF#;u&?TBbu|JoTb$pI?2YHX2= zLP+RXgS9kV8gtN`q>+VF0;|f}ay>N?_%R)0+&grv!+M5q#+Wt-?0m*>$1Hb>GsiXZ zE?wWcu{LzIE1k7VORy208j?D?&|Q_!;Zu%l&M=L3k-=H+sakgGcIL%pc1&Z2#tC#p zk;07{-lF5JxJlq@mBVU50c}>QWHd#QBoGiJ#mdqUuFa08E(>44*JV8xGD2|pcW1@vne(6I}<1rjB` zTrTJI$T9QTL$g`KB}p~}4fFY3Ygp%K6nk;2hCv;-;T_dEQANSPoG@}la#vt|5Yu<9 zPMTvZTPA8h4rsVt$2)OQU}eetTDr4}nP10dy4D3Z@QofEtc^?rBRURYRG@XjF3cG2 zK?T4X7P!I3C7mhiiE+=*iXZRSb0U}RibF~eq# z{l}6vchs>tXt8PzF@)rX<3#akM-bMvTktXYU6i^ipxf~DcO zj%nlsS}JsuTL?rf*DM&WT@YyB7_?x}Ur#SZ9=3*A9q$39Vikmv2(vw9IQ!|TYNf zOT6!TI)V=fh^R!mSI38NA3b$#Pln;Fvc{*3*uT|OE+vR#< zMOy~E`mF0@_XrKxSvu4@WaZ8M#hG!lFk+17xDp$(Ge&OIC|L5_UktfZ7LUJpd0WM$ z%Ef{{w^!?(nl0%*|7L7NdL5oL z5pR%fA;SN%XE4O&7Q$0_(Xrzb$;S@#3r1gOcV>wlRCUd?%0qmY>0}DltkU~@Hkoy-KF{2G>p(md=MnQ7YN^K3BK zTey6MKy^b>@2+-*dC@X<-c>C>I&2pU8FP;%OQWT)bdla9&ktT1`fb~Fcr?!LGuqPJ~UNg&L_gLBO8^nh0guGG9+35&=&I`@1-TjC5_9m2ELL~eSnV(F^wDl%L1iuv6 z;+?b!S-(!g$Y&E?j-3P#{*q+0?}TCHWTkp?O8M8cVbK=lT=zza{@Yp`N~sUPToSl$ z5sb7i;T;}orx$C10?yEICG~rOvP4KK?(`(N3aEB6O0f5M(NQy#0mYy2LD&X!MrGr?x$3wpV`l@ZRFPREdK zPZwu{H(9^#0t~KF9AT@gBYrd>U+2Q;Lkt+X+%Ru1vV;fod9yH(GaScsG`zw)VU17q zOx5sDfz_`s%46R13u}1lHt?;ZapYT(vj+LW^Esz}B;_0N4UX%H2JRX{8)wVWqHI{fhvYT5p5r=N(1lg_CZ!H~``}ynHov%|@<*td z^hkQyEg!JNmNV&1NX?`lO=>1R39Fg(MZT0DzvPZh z$!DGp4YhJ(&z+$wn09uRhkH8P{BM+sag`s5nMDtVFAc49T&;!h46F*kP z-WI!AF2=TYok#CHcJgCI7l*d<*t38k#;|D~`}QTf=P|tBN9b9=SOwu-KEjb6AE9R+ zcl3sQ*?33+-Bpn{eEE$0Np5)&*~8~B(c2UcT>#%pz2SKH0{HfR7#rn`$M194+pCe4 zUGuoRHxh4(N9OU~*!ww*J@(qmahmwSd3?AxT-r3efR9yn{J6j4{qeB3V>~Q_7*eFT zja-z;UWOaVS}UL@%EkY2NX-;S6peEq2nBK3t;2-!OoGU^iaH9{dM; zMHGW75qB`ym(YwKlj{*mx8otsG?{=>O>p)E*91{t!cjcQH2330JjJy}?spbXtD1Ne zIXr-8SQD=zi8=lnE?0u5IZsVbURJ_6`mqKLuisy{RN*_7 zqvZHL8X*f(>$-qX3Pmli;=NKipgi&_Pb*nZU!=`K+2WOvT$$&JN8=b+=cBh7{iP*I_a5FHhN5@ zTUPBD7HED0HIhuDOl>1Ba=igR!B6>rD~a+ay7R0WpHt&6)c7kk{zi?@tMLUj{!Wd5 QAoYMKHUCZm{tNN{1Nu2)X8-^I literal 3486 zcmbVO+jA3D82_DQZ%H?88fYN}6`}N!w!{lXOiKkSmugy&)*|4AZMw8e(`-$)%rNS! zz_xz0XT!T zBw~o`P)w-M1k$&yJ667IRaWwsmTuc6Pe7Y=DvmcL5FZ*|Ou#@wN76(GOo4qRcRla8 zR^D2%D_;JLe9lyExdJg~Ss+tv(9L^Qr?N632|7)5NpGcMt=m%3Z6bp`0%pnDu$G*% z<2iPX!36G`o>R^joto!6_n7FFSk-ggaxKFw_M6C}kHM^4YxcBTDOuiC$6KXT^Q?+T zqLV{A1KFt=-lZ?2HCs~Fr0<}KA?d5rcaD{jx}1p-j0$v7H{Dd6Or5z=9_et*L|!@=bXbrT zk_~>@#4C7}%2lhzx-8p%GiL-6^Ug}e@;0l~^tV)da%VZFCIl`-a}S%k6WPKw(YhX9 zWc!0ix{6N4p4(hsva1W$Qkjutif+j&FIrVcu0y5btvYOFwz$j4F|^)hzq=cCU-$pS z+&2G~JlbMpZUZ~I(-z8>cy3Tc&P*+snWpIqD=ay6+T~nu8YneS!=5n1#xO{a!B%bC zASBWtqdzVJf~PlnaKrg#e6F`@R~d)wM87=WhOhC(gs+qbS|AyygGIM*Xg=7P0MM*V z`au6w3v>jCaFv?(tkT-7wGqyOdil!C>^X+Y5!R}9ZL`dKD(=Uj_6OUh`kUFc{*Ws< z?`~F0_IXE6TIcqSbxht=ymHREu2=J_*2b*ut-8xK10M<;*oJ-LET0+_gQJJ!E>ile zOT*11EG+3L$%}|(>2KV6PUVifX6J)026xkWtK_-Wy8_=tr!oWvyI!;^%VoRPUv%BI z&5iKz_?L1x4v_=b=h$^I*w#wys$Fq5o%$Z8Xu1=S&TFtKMSP?k7 zBd2zu>Tm>}e>RjY3-aPkY4CCa6h8Snp%jxZ2LG4u0|*@V<#FnH=SS8l$|_D!{~8hB z@mJ+_mdQbs|mXZZfF)Bxlx4E{B#M5P#~G?iRSlR_BmQg&1VTZ zqiy$83wtVXwmnbkzw*e5ke!^yn_*JLXgul0+y$-OEuLW7N*EnJ0>Yyh6WyV=We0waa32nq_>?(xFqQ`+xgVe^_ecJK@h#N&{gK~c%#P+B;())T z@WR|E9|dLXPjqCJ$LPKXb1bVo#F08;pr8^mP|&if#AuI^xrbC%&1wrx z!U!+3&T9WnkH;tBQ#VqzDOJM(ih=me*iU()1KWea3-yA5~!a1zRtWO71& z@&z>FbNcD@-bhbODyRIm9ZXNGvS~(oHrm=$No3w2cdrPl_?b{*C$5_I4#IcTfEHF})1%H=Pj0L=fMP?Dl5f=U`B?VK= z=RHa)uJM|?MoII_{3DE~R46(OAy`@n@sy5@bxbOHpwhU(j~n0Vm> z_)x|(n6gV8_(L- zLD%Xu8#f)~YKS$5S29-GnQ^K05OuuZi@OC%N9m!;EYSr-OW^Fdy^Ov2l;vrrb|2KA%a$YKXosT+F%c-(T z^Kq@4&p61J)Uia5B>Ui$5vW`#V=r=J%XlNOwQNLzu$5&>pHHMQin!rp#j#HXJ#N^C zaGRpXAs3di7BRT;m+WdVn$oV&HsYTU@#!4p`28Hu<3=z?bkBl^4c;3?Qx^exsNx$| z(I>=rY_b+JO8{(Po7Q=b*nOf=Q2T}F$OG)qUuSz1(RnyNb{Tkhh1Z4M;~YSZf3IK< H2k`y@ucw#d diff --git a/target/classes/com/ioa/task/TaskManager.class b/target/classes/com/ioa/task/TaskManager.class index a210467f365084be7fb6c74ad7ce8ef37843e3e0..8a3ba1a8498dc2a41697b380592b35160950e802 100644 GIT binary patch literal 6458 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 diff --git a/target/classes/com/ioa/team/TeamFormation.class b/target/classes/com/ioa/team/TeamFormation.class index 193eabe2a79e2884ab404a5861d6ac2c642e404f..4ea8bfc49c935ea692c9556ae4dd3287ad74a8bd 100644 GIT binary patch literal 8555 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 delta 2643 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 diff --git a/target/classes/com/ioa/tool/common/AppointmentSchedulerTool.class b/target/classes/com/ioa/tool/common/AppointmentSchedulerTool.class new file mode 100644 index 0000000000000000000000000000000000000000..a7d4e5f2e8b27669bd11be8542a5407bdce8b3be GIT binary patch literal 1113 zcmah|&2kb!5dH>87S~l0qKVNY5+w;Fk=3hMmXR{0RYVV@;=$9fjIglG;O=b79DNHP zLr+>c_y9hXWiPu`EEUkh{B-x%Uw2RU{Qh(K3&0Vcn8+Y&AZK9#iwsMBe$H)=%dY*d z-4~8#SbXM6S3hUSR;p)t*#y!#qPZWr*48Map%_!ZL~sYePN|4J93}-@Cd;w?K2L1BTsnti*E$nSomjhmIQB zuHv><%CkurDrp~$MwGN33aML8Pjo_0_@`tyu*$GJLv6W=n;> zBaYoD)y;WT*P_NzZ(k~<1MTzCiO@aO3Gyg2Y^1zOLGoCg(nsY#EwREPc1`S|VxSsz zZJ(h$nF3dytAViN?Bhlrb4M%xg5hhrg$XbY`jx?sJLQuqyz2Z0C-JYv|nQq!zd4cH7@|Ax{hi|fKRR_H@A z+@^_-PWqIzuaRWa$>?0z{{i-WY`#N#WF{rnX}6O5UECw-3pTJxn#lPDk!2!8(Kz^t yYnLbh-$>42!jT_ytj0LR91-Uh?h{KEr7?aR59rL3W{1{89FSzv?GQCQ#`<5lfGrvT literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/DistanceCalculatorTool.class b/target/classes/com/ioa/tool/common/DistanceCalculatorTool.class new file mode 100644 index 0000000000000000000000000000000000000000..066e3d99410748fbdba09ad25cf468698228a1dc GIT binary patch literal 1113 zcmaJ=%W@Jy6g|yr5JyRfCdOzaN)jM3qg$~o6-{Xs(FIgoxN3$jXc)S2rio_hU-%ii z(#paQ@S`m6Fjx!~l12CJ`#Sg8fBv5R2Jixpb4Va*A!Q?t48u~NpK!Tsh7n%aAT|)hXtX!&M8mjcd3*=h-yAR9%KtUrWXCy4;wd)_dGjkRxURmr0LNsFkG2{VJ9AI>bU^S!VQM1tA~!% z+%Z~v4lzTmoL4f0az&kc?%3l-`z_L1SY=qAvk%2oVqJFxL%t!EcsCxlh2P?Bk0gbL zcDZ-VeHrpoVaoI*CAr_2L%K9_jlmLMggZ6_x?7HS?Ben$FYb3K(#isRhFnvReODaH zFwu?06(58nqp7~s+62buqa$H@x)WqkV%YreQ=}RvZ4#YgTbR#6s3%31&tNBqU6d_U z!iiNGO0x}+>O>EO6J;L_@sPXJ=u?Jo@$pR!qrh)yQAsA6ZI{+Lp2GpPPaXM-^K=UUvUR_NfJ6gC$L0lQLy%Y z;mR5Ez<1&km|e53-^g;NwQ7n0rrT?(Q6+Ec!c$TEz>L_ literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/FinancialAdviceTool.class b/target/classes/com/ioa/tool/common/FinancialAdviceTool.class new file mode 100644 index 0000000000000000000000000000000000000000..e7f7b39b7410d31ed368821921c7ab2189900820 GIT binary patch literal 1093 zcmaJ=%W@Jy6g>?jgE&e;G!Gw;FMoLPnh%TVw!c{Z0&@go4OhcKaf8l57 zN-GOLz>l)L!%#9*z(x1%`#Sg8zyDnP0&s#S86=Rjkg~CYRfe@5A9Kg!s^h$C^@M8} zR-Z{F&2xriseG13nt|mr$l$64+r~9qpYv)MU#bp6s;8x5cvY&;5UXA8H^irrP_C$a zSf(h)6cJh_N4c)qSVxXwYry-Ws+G&lduh7#3Jg~!U^s}!ntCn(vv7l<=<0zZHFu2G zo)7?sq86#sYhWOhb=+SJY&f<@SPF zkHbmPFkfnI0^{@HsW4sL4$>%4+y6P_`J_AfkJ^8lXW3O8WKcxOLOGn!Awyv{ajC|- zFPtdnXlOO=8ttDme2tH5Y8XX)%~jhIL7}d7e>ALI-iMfE&artu6bsDb?TEIz65op{ zM3sA9LmEN7x8Eow{Hn);Km-;ZG3;NeX;G>c9ERQho6?7h>cSp2=<_k$r0otVeL%Xm zh;xWCqAQ0#z`jq^+jNI&5@LsLd-}eG+r)jr9o!{J==_4f5}`%TI{Jw#7svwNh)-aK qk)B{|Ms|oWLd;#Y7KAi_RA}&L(hd9P#?ED1+Xd|Ei literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/FitnessClassFinderTool.class b/target/classes/com/ioa/tool/common/FitnessClassFinderTool.class new file mode 100644 index 0000000000000000000000000000000000000000..f6a7aa1aedfa059ad0d6599828d20a9dd7eddc7e GIT binary patch literal 1107 zcmaJ=!EzEo5PbuLMMO!6CdR}_lq5i6R7MTS`|tb@fR}iZM+#{RnF5xOWmq2aQ*OIl_3aPc zp>PaC_L)@DJZDH(YbQD67+5)vJg!?P6mSDK=b}2sld8{<8EUB*URT>Q#^!)~9q}a) z$`OrEmpN()N5s}BQLf7ctf0iOKIS9Q)XL%Jqcj6L`GzawGwdbriX#`0S-8becl6kn zn%hQe*Cu7GmEDp?3EywJ-1l2j^@Mj!UJGjsD|7hJOeHpTPcRhQQi=D$xJz)}b;(j{ zYlpih+>@am8#87gDaph39MhFIHyAAORXBkm(*0`k#V#+8^5R~fZdzS{XUKPS;5nit z!$db1S9}zYL&^R0!X~BZl1zH7!cjg3YjfHI%+rR2O!zN?(!T zHqCmt(|07fPMS?SqkXCV3+(6AeTQV|CL=aT7UJ_=Y?Ag3TewG-F!%+Lr9wo>I{1xi y=O_X{NKawLk(+X?ML0wpA?G&k6H6N9DSihJXwQ*lm)1iZkd~*@A&&4E8~*_S87IBq?Xks)*q9lP}vU(NEQYlkfMYKw&cGIGO21|Sq?$8kGelh-MiwmU0xZkEwYjf-wGIc%lU2!bK zOt%))d=z$#8v9af6BwTlPK4>`R***Fzf<0y`KciPN&8RoEW3=o4E9m9Pzqaiz)+Zu zfK(&h6Hb(T)Wu`&8ttDke2e#QVi<*e%~i`2L7}E~Z#bx29FUk~#<6iW5Od7q{}PRP zB|az;s}qh`44OtE3^Or literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/NewsUpdateTool.class b/target/classes/com/ioa/tool/common/NewsUpdateTool.class new file mode 100644 index 0000000000000000000000000000000000000000..bd166102467ae0e51cecbc6d4e132a6ea9abf7b4 GIT binary patch literal 1074 zcmaJ=%W@Jy6g>@u!EuxXG%-FRi6ntUGrASaQYlkfg>eDKg{x+0VPNRSnVx8t{)L~R zE3GX206)s|4l`8@72={F_ug~QeRco&d-fZ^b38JULDoRd!V>Zf%R_#`ZI8>o{kA(4 zj%LU|aiy!DGGuG@;{pl{tYX5%WdoLlE4Vu6)z-c%`wY3EawWsdT5HDG9B{uaK7~R$ zqVeG(Lp^1P*%~Fvb=krSN(^gbJ`znO9j@QIdO){8bEyM{oph|ka{-xwYYbbC8r!bo zwpPlsNf;|>ABoSwyGf60(IKsYRfd&0T%@MbnyM!liY-@)qj206eusBG(v(`t;odR# z-AGQ9IX!SGxoT^UX<@_$gCV{MC)7l?TT6H7;&Lb-?)ND|c>$imY^%_B#GxA{Se~!& zAQ}x#?}bu2&_18M5qh9{K>^hSTM4J_2r3_y|G2`6dF+_jMa@7x8pj^hH5;!hPt-`* zajNlz4!NV1f6DMJJ(~m=M|;I(&l5qlrPL^#G|mq{rI~Z=oKD07c)APm6Kn3`|U9+^prb=s}ueiOGy`ik4QLz>9>8IffoM9J9yg-d5B0^do_V8&6H na;(NU#2gXl2JR9|7L_S}6I*l^NV84r9`;Ex>2@Cnc!>3X^U55& literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/PriceComparisonTool.class b/target/classes/com/ioa/tool/common/PriceComparisonTool.class new file mode 100644 index 0000000000000000000000000000000000000000..17b3757038a53393462562511801c48f3241fdaf GIT binary patch literal 1093 zcmaJ=+ins;82$z*i?~WlwFeKCDlO1zS8v4_mDp&4hXhhDyc(7f29_Dz9U6P-Tlg4y zrRjwa;6oYzWjA3-!Hb!H{?qp#=g;5s-vFNDQ64FzEo5x0Aj_~i;HTX2xav9YIs@Sv zhU^omqxO)G_-QL`5;Z7UV-7t1PuGhSh42> z?K#AZv~u42(k1B8nENu&s!b{j8w_i6#-W(%Yv`_EC^V%KZzrRU@Y}rOk)+tvF859d zBIILX#`Gm+SZmH9Ee~5~u*4VPP7EPds>xn0FN~7neviVeFR*9GxAeq!#jy;t+*(lU zQ8+0Y<_oP&V0=D)BTQd+gB;4#_NhaOQjWV*`lS8GC058{KaUEk7HZ*y4j9U_iA!~= zhr)?+j)r#3U8DUohHuGn#fDMDS6p>H5tN%+4=3aL#eGOf<{aB+W3j+I*^X$d>&d-{ zAsXECTG9yWz5QA#;Ws=U1R}8TfMM@KO^Z^s;4tj`-;_R7R2O!!PM?qAI&F7I=>yWe zNt{EJ5nVa>3HD>E-l98HlMvf<+wuDbZW8wuw{V*zq4P5WONACi>+lyYoudGJCq9K4 qMsA9+5!oTa2r+kXhfvZeP3?DamuQY8dvxyMkhna(?&Am#vHcHc<0O;- literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/RecipeTool.class b/target/classes/com/ioa/tool/common/RecipeTool.class new file mode 100644 index 0000000000000000000000000000000000000000..02acd2ba2ee2cddcf8c81c1dcb9de94baaa85623 GIT binary patch literal 1062 zcmaJ=&2kb!5dH>87S~l0qKWY*5+w;Fn$@dVmP(n@Dxy_F#e=6|8DU_V!QI)EIr90yl$btbE60;#$TxxSW);Z>zEWvusj&=j8| zp*&Ihcu}C53M6c`BGtO$U=>A%jUgY1x>g=HAEfEgE;L-3kYP7{)+BQQnT2Z%Tb>@e zQghd6?Ym?QwQ}DJPmV;3JQmg&R%bA=o7$@Dj$kM>q!MqVVOs<(-uB5;Y-o@BCp?g` zJ#pqtPf}r}#thTkX*C8*d=Xw`h-j~pzL|^Lpjvp)CHA!icm}(vqrekKGA^z#?d&if z2Tkmy)+RIo9~}$R)15GnGEpVC(kC6M4$0t2i4~TyYhw=;3)Of8`wZpjNToW}1K}oR zCQ~`$p3%V>!?*N2Ccxyh*Iadc5tbWT528_Re&8w3Ok(S7Bo@HaH;_ErT6*vkiaPiG zrZj@C+j*mu2xb$}Z52YWI^o4D#(eGloPR}>i^utJQkmZtQ zq?h)8g8dkWZ;*_`-bzWZATPfI~dO=06&P7nuM6 literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/ReminderTool.class b/target/classes/com/ioa/tool/common/ReminderTool.class new file mode 100644 index 0000000000000000000000000000000000000000..658477f6a8e73e28c1276c56e030cace23052fb1 GIT binary patch literal 1068 zcmaJ=O>fgc5Ph4ZbuflBDYTT2;+C{cTBzYl5CS49kW!FHRSujs&XR26>;`*N(IfwY zp8+RO5Bvar6k;3)#ZglZ-r1RX^LA#R_xGQ(UjUxtk&O(p7IF?2u*k5~<0sq;xaxRs zTRq_$hQ%jRN%NE;Td5xBk!N784I7s&I1aAh>P%JBgi>`Fay=~-!^=uz%2@C6uqi%` zgz`o0!$pZ|Dv_|&O4RF;gCa@{s{`H_b*+4E-b>S^U1Yd25yN)+tV!h@G7HxjTwf17 zskvvg4m@%OT6yopK&rL~k0@qgg`qfuio-NmUAF~8p&^xcGa9rA&RYRRN)7Gv;FyOp z_9wxd=}KyCvoXUo=e!z&B|Zy(WQb~~lD?gbN1<+b*dhMqId}%UsYjtN4rJV3F+JUW zEDGuNLTeM5kPi=q>FRcrN14d}A>BwA_oEIUyR5K?Z5unNSg6KA>@t+6!b)|b`@%~a zO|&`SzR}?+!`HMb6JT=ME3Vpsh{_GE`=ep)yzHsSOySY#P|Sg+?;!bkYiao>6m=d1 zO=$#Oxbs>m5!M49MIy5BfMM(0O!Hc`;4!TKA4=~gnF||OrZ>iLoqpoj(mSJdl{}9u zBfGHs1MK@aeS_9GO+l>D>P+@Gaf`e!xQ#m$iHn~RStdr5ti7MObcO=(jrkR7y&#P^%;r51xi)gn?xScV|=P=v(+0 zdeX|l2k@aRds(VjDkO*b>F%$;?w;=X`|tD*fERe2M+#{R85=9eGOP~yF?T$!`p*0A zP`HL6`&24vo-w4WwWAzz46K|-9+xfHHm>06f>+1*QuP@!LoF4YiXIw51a7!f}`2yz7ys*w!xh zj<_!)d8W*mfut1c?FFU_;x-s8@m08?A`9!87DLI`m!9l2Mwa zWz`-;&7yw3)Y=5b=aaX>40JEZp|ao+lt1fG^~y?c|4Eq@ve?aI4^<1bs7-Z-%DnAT z9qW;B;_Z$k9H$D z95ae0_q>iYf}Y=gqm=NQ9uEQ$Sa`^=bEc+csakLtwl0R!uZru!HrD9}GF+z-k52l9 zv~QB+(8=grss94|IW^y)Ju;ILCED%T{U&aa^bNOhhcuD%b0SMch@!Rs8<$Q|0Dh31 s!ki;F<=BXEh&dw8E!-uRG|E%_Htx}xBh3!2``9NbPqzm+z$29Y1HBO@+W-In literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/TranslationTool.class b/target/classes/com/ioa/tool/common/TranslationTool.class new file mode 100644 index 0000000000000000000000000000000000000000..b58e9a1f5ead2b5e69da66bb76e81f7c44854797 GIT binary patch literal 1072 zcmaJ=&2kb!5dH=Ti<>nhBqqk6NDN6J(X3v@vQ)~HRuMfw#e=6|nSz0326u;)IrFMsTzwVx%`Ez;k8^9|(wUI*FLdL-YvJA^Te#Tv&tB(7j z)f1j!$Uc`!nimY|a^*CK90M!bu(4>tac~n$Gf@o_NY!D;^t4nAZ_4#4W39`BhWI=Z z$`jR3*EuQ)N6c0&P_4@jR#0Hr81TNRY2|VAQJOBDLc^5_8TOL7CXsWR)$P`2nC7RfGFak^@J5E%_RGmTy1pSQhzA`?u{sCOU^nzA@Wio2Rew(|zH_WybS4 z=AO~PIm5T)WG28k(Oa(Cz6eWot^1>4_3G#omYKlj`B2P(CvPBrz}4gvm{8QX?>D3o zbluK7r9@Ekc^Hb&!ebiLm7eC6YQbgL`ahKZPTUu^u}c4p;TApQNYY=UeSr$;!#6KwtkSCSmu literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/TravelBookingTool.class b/target/classes/com/ioa/tool/common/TravelBookingTool.class new file mode 100644 index 0000000000000000000000000000000000000000..3382aa3bd75452426f004fbe47f9cd4f245ebc89 GIT binary patch literal 1084 zcmaJ=&2kb!5dH=Ti?~WcA~F6%q9j0~S-py7sgx2_!9~Y^)*8u-@lm?s!~vo%ij& za1BHHnN-p|XGm76XBlJ|STTz%u3E5dT*LJ_ucq;(>N2GIS}KOumBx&*-s65#d>#qq zirU9jhHA_ZvDNaF>$;5%s8};ghyGHvL4Bz5ingXM6Z@B7sA}BQ|&}dj&9D|r<&arhd6ieXomxzYB79WQx zMV)(IQyM|fZogGZ_;rs5fe0)-qA^*hX<4ck9ERQhL+Kwybzu*i^ye6E&`^gb{X5#X zNpk39bgmu#1p6^D-=sY>lM*|$+td3k+$QNO?%*zILgyDmmIx7f>*yD*Tp|a2Cpm!` qM`prNh;WEFLe5>>BbFqJ6Z{_T)0rX7KCK5hA}LF^hd9P#?EC{I4IsJz literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/WeatherTool.class b/target/classes/com/ioa/tool/common/WeatherTool.class new file mode 100644 index 0000000000000000000000000000000000000000..9e419d298e296edefb8aeff00de7ca119fb3c03a GIT binary patch literal 1072 zcmaJ=!EzEo5PbtAi|Z*=&=kMij0I%@WMha;Q83#*PX2|#WId^@oI_`&7 zPk4r5`MFfmykJOIs;60G8CcPVjq4U12RCqYW>?b$Qgs+IJuMZ(n@VG3JMJC1Kt;Ptvqhdr0LQsG+ddGVK;f!Wak1g3%3}yJw0%x z=C0A&cgY!O<(>&{x*|9s$if=K$_y!jsjj+i3x-@nD)D|aXc3*ad_oEh?Q#E<2Qu;} zV8(PMWmam;D9s;NW3a>*;f)L_?NyR@b9Et<3=cXazq)|WU^n$B@WhdfvdbrGJB&I) z&}*$tXaYVw7N)D)VHRbE%?Yt6)h8VcxRF{FY4xnga?9AYv4@IZ7Nu&zW!U;ZmHtj#7fM*Af5vc|9&%*quhG0t zo=cXIUE2Q%_G28rLvs`+5F0c*ll3Od5AS4%`I$`N*cv6zk~;5vxMx>c!&e?Y+60SA)a94AJX<54FCWD literal 0 HcmV?d00001 diff --git a/target/classes/com/ioa/tool/common/WebSearchTool.class b/target/classes/com/ioa/tool/common/WebSearchTool.class new file mode 100644 index 0000000000000000000000000000000000000000..36d1c65508319a41f605b667900a16cd29917d45 GIT binary patch literal 1077 zcmaJ=%W@Jy6g>@u!Euy?Xd*u1U`PUqW^^l-rBbG}3UvXMEL=513j;$p&h(_r(!cOC zbfuMrAK*t>-eIU>s1O(Zxc8oW?yLLH-}B!9UgC*~46+7t7FLjFSRL|H?)Y5xoe$li za5Y2znI}E{oFQAQ9~V$yV73VpR}EMeuHpKES6c_3>@(zs%99MQYppqBbHIbP_#6r8 zipIyw4E2;DVQZ8q*HsH^C^2k~`A9UCbh$q9^nh-m=2C|YyXjan&n09AZZK3_HFiA3 z9j%n_kT6!#IT78q;DI~nkkY^g!`cEYR#Rn7)e{WGmM6vgXxtS+hj)F_lv>K={xJ`{ zSe_|!df-uR+pPtrWdR!uhWH}fNE6pyE#05Xi=lLQ(5C?FOYjV4TSb8@j=X7p3-ukw zbD`0_Qc8z9;FEVk4^%HKpvq7ts2xswVFx0Nd>z`KRPfYh#XNRR?4f3$9#3SSp*o+i zCr{N#I7zK_ sIfFSzValTP8HEA8RgNR_hh8hD4 zuu!1nE}mEcWhi^Xvs~BVN3DT6)H^3U?d6REx_!tR%vza&R8m9C`Q0<4WD%4Q^Dj2= z0G2pYmG07IXwncj(2RP4>f@?=rBl;BO9MJ9cPz z*gzK^5eT`E9WJYr7y&I|4R_c_Sf;XI;ZAvFr-4WDm?YYDPn`_z*3`LozulW*=m>Th z*o{5B*KcQ>@6?6UWQltX^rBC|XAKS6NgDOe59%DJQT0_78fo@ppMWPGmhgmx4@gu@ zsc=?ln)9d~14DRRV9I|PViQtTyK^7QsAjG}(1T$~DZAQKAV27I zDq10f;oMfg5D_=$WpBXmQo_M;Zh6m_1hx(IC#_62ZBv&?h_gY9IeorMqQ~`=iMdXv z*0jv)4ggDX_jSeD8Wu3~iu_;5W`SIxCZBUg`&E4GWc^*n8G(jE0Nc6kpTEmuW`e1YiCu3%ExA) zBCbZSp(HfjRL5YN>J^?UIP8=MD{?aa;yk_>-^4R`){So>hvyiV(eOMig_%q70$yZ| zN9mPSiib0Y+mj` z*HKMe{QG+bS~D4FmU;#=WeU?bhP82xXKkidOv2JsQqf>+$elzC=SYU6!Ga zgb!OW7q8IrV;835RayZYfR5Klgw6+K1zsmP8cvdsjXc$4!$mqri*$|_=^QQ4DRFP` zhKfKAr|~8OdJ)GUTJaVWOOB=b`D7zZ7I0Bg<2>pZQEwAf0rgMBG(_$osG&vtftH$r zAjc^MA8bk`$72`6soX=gbraYGbVwHKNn&oPoQwP<>fC{4Y`Dp#BbvWbY$;T1DTEU& z-$SGhhn7N{k2Y5(6Cr*}G7>k@PAxm)YW+Am1>_WrW1GMSSSqb@oDy(NJ{kr=yDs*VdWpHyE5inuFkV2f-@`LAF3Wxy~dppf&-jQ-hU!8CRhb zYtVzWZcA+}tcGvyJEUA96S-n{iDGw&LU%lN6;T*&H{Qj2Owz--mK}RtmE^qV!;R#_ z5r2%`OKnQwxr1^I?HaaImx3%O8RLDPdPu@4?lB(~`jEy){7vQ6bNoK-uAjK;r}&H~ MI=!FcGQNWO4><^sTmS$7 delta 1579 zcmZ8h+fy556#sp@o9t$@39tyb3N(cPA%P-Vk%nTqw6rJ}TWl$>w39B=1KBsk8_etU9mzjJ=)gTsEHQ8n;&&j729qnLg~q>|BEX#txoR5oV|?dL``SV%JnQ9ZxQ*=%D1gvB&Jp z62-8Hzdp*`!AM4LpiN{A+2(KZqd}!v+qchoNaB)x?j_Zq0>)i1w5!E zsR|Bh0+8vfKn#og2gAxQAui%bw*ePDKub7M-(Xg4qB^RCZ^LKSS;{6XOELGDd$-Um z;~TW!B1ahl$X`r&54@;BEj`wQeMd>X$aTz`|5!=1gz8fddj0{N{ zW>JSMNgjH2u}~(lP$sbeL86#w0nbr{0#6<{@H{1S zAxfhi!vz8s#EQX}z|sWfDSD;LUhCxb0(n(K`2*c5f`7uRVubyU{vci?gM^pprMu$a zZJDKXV#CZx$2N`w6N17{VlY1-c0(%ehE88l^BUb5f{t)0q}-BOZpp;URGmbgI`SmR zB-7g;~nO-atAY|33QnIws1}u+VlTk%|o;`1GtwiW>G?E z|AXZcf<=nN&RMufv`Iy>YUxXGWLq!pqp+n(S7PE7YU5S1OSnW622scG8hx+O>u)6W WTco&JJl~+d6{shM_i3yj!ukhcdn0H7 diff --git a/target/classes/static/asset-manifest.json b/target/classes/static/asset-manifest.json index a351196..86f22a1 100644 --- a/target/classes/static/asset-manifest.json +++ b/target/classes/static/asset-manifest.json @@ -1,15 +1,15 @@ { "files": { "main.css": "/static/css/main.e6c13ad2.css", - "main.js": "/static/js/main.03144112.js", + "main.js": "/static/js/main.720bb114.js", "static/js/453.d855a71b.chunk.js": "/static/js/453.d855a71b.chunk.js", "index.html": "/index.html", "main.e6c13ad2.css.map": "/static/css/main.e6c13ad2.css.map", - "main.03144112.js.map": "/static/js/main.03144112.js.map", + "main.720bb114.js.map": "/static/js/main.720bb114.js.map", "453.d855a71b.chunk.js.map": "/static/js/453.d855a71b.chunk.js.map" }, "entrypoints": [ "static/css/main.e6c13ad2.css", - "static/js/main.03144112.js" + "static/js/main.720bb114.js" ] } \ No newline at end of file diff --git a/target/classes/static/index.html b/target/classes/static/index.html index 3530511..b93df9f 100644 --- a/target/classes/static/index.html +++ b/target/classes/static/index.html @@ -1 +1 @@ -React App
\ No newline at end of file +React App
\ No newline at end of file diff --git a/target/classes/static/static/js/main.720bb114.js b/target/classes/static/static/js/main.720bb114.js new file mode 100644 index 0000000..cc6506b --- /dev/null +++ b/target/classes/static/static/js/main.720bb114.js @@ -0,0 +1,3 @@ +/*! For license information please see main.720bb114.js.LICENSE.txt */ +(()=>{var e={446:e=>{var t=function(){if("object"===typeof self&&self)return self;if("object"===typeof window&&window)return window;throw new Error("Unable to resolve global `this`")};e.exports=function(){if(this)return this;if("object"===typeof globalThis&&globalThis)return globalThis;try{Object.defineProperty(Object.prototype,"__global__",{get:function(){return this},configurable:!0})}catch(e){return t()}try{return __global__||t()}finally{delete Object.prototype.__global__}}()},6329:e=>{"function"===typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},5663:(e,t,n)=>{var r=n(5663);for(k in r)n.g[k]=r[k]},7237:(e,t)=>{"use strict";var n=Object.prototype.hasOwnProperty;function r(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch(t){return null}}function o(e){try{return encodeURIComponent(e)}catch(t){return null}}t.stringify=function(e,t){t=t||"";var r,i,a=[];for(i in"string"!==typeof t&&(t="?"),e)if(n.call(e,i)){if((r=e[i])||null!==r&&undefined!==r&&!isNaN(r)||(r=""),i=o(i),r=o(r),null===i||null===r)continue;a.push(i+"="+r)}return a.length?t+a.join("&"):""},t.parse=function(e){for(var t,n=/([^=?#&]+)=?([^&]*)/g,o={};t=n.exec(e);){var i=r(t[1]),a=r(t[2]);null===i||null===a||i in o||(o[i]=a)}return o}},2730:(e,t,n)=>{"use strict";var r=n(5043),o=n(8853);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n