Skip to content

Commit 37109a9

Browse files
Copilotphrocker
andcommitted
Add Agent Memory Search API and UI functionality
Co-authored-by: phrocker <[email protected]>
1 parent 44e3623 commit 37109a9

File tree

6 files changed

+545
-1
lines changed

6 files changed

+545
-1
lines changed

api/src/main/java/io/sentrius/sso/controllers/api/agents/AgentApiController.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import io.sentrius.sso.core.services.UserService;
3939
import io.sentrius.sso.core.services.agents.AgentClientService;
4040
import io.sentrius.sso.core.services.agents.AgentContextService;
41+
import io.sentrius.sso.core.services.agents.AgentMemorySearchService;
4142
import io.sentrius.sso.core.services.agents.AgentService;
4243
import io.sentrius.sso.core.services.auditing.AuditService;
4344
import io.sentrius.sso.core.services.security.CryptoService;
@@ -85,6 +86,7 @@ public class AgentApiController extends BaseController {
8586
final ZeroTrustRequestService ztatRequestService;
8687
final AgentContextService agentContextService;
8788
final AgentClientService agentClientService;
89+
final AgentMemorySearchService agentMemorySearchService;
8890
final AppConfig appConfig;
8991

9092
public AgentApiController(
@@ -96,7 +98,8 @@ public AgentApiController(
9698
ATPLPolicyService atplPolicyService,
9799
ZeroTrustAccessTokenService ztatService, ZeroTrustRequestService ztrService, AgentService agentService,
98100
ProvenanceKafkaProducer provenanceKafkaProducer, ZeroTrustRequestService ztatRequestService,
99-
AgentContextService agentContextService, AgentClientService agentClientService, AppConfig appConfig
101+
AgentContextService agentContextService, AgentClientService agentClientService,
102+
AgentMemorySearchService agentMemorySearchService, AppConfig appConfig
100103
) {
101104
super(userService, systemOptions, errorOutputService);
102105
this.auditService = auditService;
@@ -111,6 +114,7 @@ public AgentApiController(
111114
this.ztatRequestService = ztatRequestService;
112115
this.agentContextService = agentContextService;
113116
this.agentClientService = agentClientService;
117+
this.agentMemorySearchService = agentMemorySearchService;
114118
this.appConfig = appConfig;
115119
}
116120

@@ -826,4 +830,50 @@ public ResponseEntity<AgentContextDTO> createContext(
826830
return ResponseEntity.ok(dto);
827831
}
828832

833+
@GetMapping("/memory/search")
834+
@LimitAccess(applicationAccess = {ApplicationAccessEnum.CAN_MANAGE_APPLICATION})
835+
public ResponseEntity<?> searchAgentMemory(
836+
@RequestParam(required = false) String content,
837+
@RequestParam(required = false) String agent,
838+
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate,
839+
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate,
840+
@RequestParam(defaultValue = "0") int page,
841+
@RequestParam(defaultValue = "20") int size
842+
) {
843+
try {
844+
log.info("Searching agent memory with parameters - content: '{}', agent: '{}', startDate: {}, endDate: {}, page: {}, size: {}",
845+
content, agent, startDate, endDate, page, size);
846+
847+
// Determine search type and execute appropriate search
848+
if (content != null && !content.trim().isEmpty()) {
849+
if (startDate != null && endDate != null) {
850+
// Search by content and date range
851+
var results = agentMemorySearchService.searchByContentAndDateRange(
852+
content.trim(), startDate, endDate, page, size);
853+
return ResponseEntity.ok(results);
854+
} else if (agent != null && !agent.trim().isEmpty()) {
855+
// Search by specific agent and content
856+
var results = agentMemorySearchService.searchByAgentAndContent(
857+
agent.trim(), content.trim(), page, size);
858+
return ResponseEntity.ok(results);
859+
} else {
860+
// Search by content only
861+
var results = agentMemorySearchService.searchByContent(content.trim(), page, size);
862+
return ResponseEntity.ok(results);
863+
}
864+
} else if (agent != null && !agent.trim().isEmpty()) {
865+
// Search by agent only
866+
var results = agentMemorySearchService.searchByAgent(agent.trim(), page, size);
867+
return ResponseEntity.ok(results);
868+
} else {
869+
// Return all memories with pagination
870+
var results = agentMemorySearchService.getAllMemories(page, size);
871+
return ResponseEntity.ok(results);
872+
}
873+
} catch (Exception e) {
874+
log.error("Error searching agent memory", e);
875+
return ResponseEntity.status(500).body("Error searching agent memory: " + e.getMessage());
876+
}
877+
}
878+
829879
}

api/src/main/java/io/sentrius/sso/controllers/view/AgentController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,10 @@ public String listConnections(Model m, @RequestParam("agentId") String agentId)
6565
return "sso/agents/agent_comms";
6666
}
6767

68+
@GetMapping("/memory/search")
69+
@LimitAccess(applicationAccess = {ApplicationAccessEnum.CAN_MANAGE_APPLICATION})
70+
public String searchAgentMemory(Model m) {
71+
return "sso/agents/memory_search";
72+
}
6873

6974
}

api/src/main/resources/templates/fragments/sidebar.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@
5555
<i class="fa-solid fa-user"></i> <span class="ms-1 d-none d-sm-inline">Manage Agent/Users</span>
5656
</a>
5757
</li>
58+
<li th:if="${#sets.contains(operatingUser.authorizationType.accessSet, 'CAN_MANAGE_APPLICATION')}">
59+
<a href="/sso/v1/agent/list" class="nav-link px-0 align-middle">
60+
<i class="fas fa-robot"></i> <span class="ms-1 d-none d-sm-inline">Agents</span>
61+
</a>
62+
</li>
63+
<li th:if="${#sets.contains(operatingUser.authorizationType.accessSet, 'CAN_MANAGE_APPLICATION')}">
64+
<a href="/sso/v1/agent/memory/search" class="nav-link px-0 align-middle">
65+
<i class="fas fa-search"></i> <span class="ms-1 d-none d-sm-inline">Agent Memory</span>
66+
</a>
67+
</li>
5868
<li th:if="${#sets.contains(operatingUser.authorizationType.accessSet, 'CAN_MANAGE_APPLICATION')}">
5969
<a href="/sso/v1/atpl/" class="nav-link px-0 align-middle">
6070
<i class="fas fa-shield-alt"></i> <span class="ms-1 d-none d-sm-inline">Trust Policies</span>

0 commit comments

Comments
 (0)