diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/CognitionCapability.java b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/CognitionCapability.java index 4f01ffc4..1f8eca5c 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/CognitionCapability.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/CognitionCapability.java @@ -57,6 +57,16 @@ public interface CognitionCapability { */ boolean bindActiveEntity(String runtimeId, String entityUuid); + /** + * Rename the canonical subject of a known entity and refresh entity/active-entity indexes. + */ + boolean renameEntitySubject(String entityUuid, String newSubject); + + /** + * Add an alias or mention form for a known entity and refresh entity indexes. + */ + boolean addEntityAlias(String entityUuid, String alias, boolean deprecated); + /** * Add or replace an impression on a known entity and refresh all entity indexes. */ diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/impression/ImpressionCore.java b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/impression/ImpressionCore.java index fcd6c946..3392d4f4 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/impression/ImpressionCore.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/impression/ImpressionCore.java @@ -153,6 +153,45 @@ public class ImpressionCore implements StateSerializable { return true; } + /** + * Rename the canonical subject of a known entity and keep its previous subject as a historical alias. + */ + @CapabilityMethod + public boolean renameEntitySubject(String entityUuid, String newSubject) { + Entity entity = knownEntitiesByUuid.get(entityUuid); + if (entity == null || newSubject == null || newSubject.isBlank()) { + return false; + } + + boolean renamed = entity.renameSubject(newSubject.trim()); + if (!renamed) { + return false; + } + + refreshKnownEntityIndexes(entity); + syncBoundActiveEntitySubjects(entity); + return true; + } + + /** + * Add an alias or mention form for a known entity and refresh search indexes. + */ + @CapabilityMethod + public boolean addEntityAlias(String entityUuid, String alias, boolean deprecated) { + Entity entity = knownEntitiesByUuid.get(entityUuid); + if (entity == null || alias == null || alias.isBlank()) { + return false; + } + + boolean added = entity.addAlias(alias.trim(), deprecated); + if (!added) { + return false; + } + + refreshKnownEntityIndexes(entity); + return true; + } + /** * Update a known entity impression through the core so text/vector indexes stay consistent. * newImpression can be null or blank to update the existing impression in place. @@ -355,6 +394,20 @@ public class ImpressionCore implements StateSerializable { refreshKnownEntityTextSearch(entity); } + private void syncBoundActiveEntitySubjects(Entity entity) { + List boundEntities; + synchronized (activeEntities) { + boundEntities = activeEntities.stream() + .filter(activeEntity -> entity.getUuid().equals(activeEntity.getBoundEntityUuid())) + .toList(); + } + + boundEntities.forEach(activeEntity -> { + activeEntity.updateSubject(entity.getSubject()); + refreshActiveEntityTextSearch(activeEntity); + }); + } + /** * Replace text-search documents for one known entity. */ diff --git a/Partner-Core/src/test/java/work/slhaf/partner/module/communication/CommunicationProducerTest.java b/Partner-Core/src/test/java/work/slhaf/partner/module/communication/CommunicationProducerTest.java index 0ec5307b..cb9045cd 100644 --- a/Partner-Core/src/test/java/work/slhaf/partner/module/communication/CommunicationProducerTest.java +++ b/Partner-Core/src/test/java/work/slhaf/partner/module/communication/CommunicationProducerTest.java @@ -174,6 +174,16 @@ class CommunicationProducerTest { return false; } + @Override + public boolean renameEntitySubject(String entityUuid, String newSubject) { + return false; + } + + @Override + public boolean addEntityAlias(String entityUuid, String alias, boolean deprecated) { + return false; + } + @Override public boolean updateEntityImpression(String entityUuid, String impression, String newImpression, double confidence) { return false; diff --git a/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java b/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java index 778740d2..d1eb94ef 100644 --- a/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java +++ b/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java @@ -127,6 +127,16 @@ class MemoryRuntimeTest { return false; } + @Override + public boolean renameEntitySubject(String entityUuid, String newSubject) { + return false; + } + + @Override + public boolean addEntityAlias(String entityUuid, String alias, boolean deprecated) { + return false; + } + @Override public boolean updateEntityImpression(String entityUuid, String impression, String newImpression, double confidence) { return false;