From 15c24154f81cf3de5f00b1f26cf90411c642f9fa Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Wed, 10 Jun 2026 14:50:13 +0800 Subject: [PATCH] feat(impression): expose entity identity updates Add core-owned APIs for renaming canonical subjects and adding aliases so updater logic can request identity changes without bypassing indexes. Synchronize bound active entity subjects after renames and keep capability test stubs aligned. --- .../core/cognition/CognitionCapability.java | 10 ++++ .../cognition/impression/ImpressionCore.java | 53 +++++++++++++++++++ .../CommunicationProducerTest.java | 10 ++++ .../memory/runtime/MemoryRuntimeTest.java | 10 ++++ 4 files changed, 83 insertions(+) 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;