How we built a memory-first
multi‑agent shopping companion
Supervisor orchestration, A2A protocol, Mem0 long-term memory, and full observability — explained across eight pages.
Pulse HK exposes a single A2A endpoint. Inside, a supervisor orchestrates BrandFinder, OfferFinder, GeneralQA, while Mem0 stores cross‑session memories. Every request is monitored via AgentMonitor.
Topology & wiring
The Spring Boot application intercepts A2A calls, resolves identity, injects memory context, and delegates to the supervisor. Sub‑agents are pure Java interfaces — LangChain4j generates proxies.
@Bean public PulseSupervisorAgent supervisorAgent(...) {
return AgenticServices.supervisorBuilder(...)
.chatMemoryProvider(id -> MessageWindowChatMemory.withMaxMessages(20))
.listener(agentMonitor).build();
}Agent‑to‑Agent standard
A2A enables discoverability via AgentCard, task lifecycle, and identity in metadata. Pulse HK’s endpoint integrates with any A2A client.

Mem0 semantic loop
Memories are stored with topic metadata (brands, preferences, general). At retrieval, three parallel searches enrich the prompt. The chat history never sees system‑level memory messages → prevents hallucination.
@Override public List<ChatMessage> getMessages(...) {
return List.of(); // memories never injected as system messages
}Plan‑then‑delegate flow
@Agent(name = "BrandFinderAgent", description = "extracts brand name")
String findBrandName(@V("userRequest") String request);Three‑priority resolution
UserContext ctx = UserContextResolver.resolve(message);
populateScope(ctx.userId(), ctx);
UserContextHolder.set(ctx);
// finally: double clear() in interceptor + executorAgentMonitor: full visibility

inheritedBySubagents=true → automatically tracks every sub‑agent call.Six architectural invariants
mem0 serve --port 8000
ollama run qwen3
./mvnw spring-boot:run
curl -X POST /offer/ -H "X-User-Id: alice" -d '...'