diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt
index fe7aa393..c65fd026 100644
--- a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt
+++ b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt
@@ -299,11 +299,14 @@ private class AggregatedBlockContent(
val tagName = if (index == snapshotIndex) "snapshot" else "history_snapshot"
val wrapper = document.createElement(tagName)
val renderedBlock = groupedBlock.renderedBlock
- wrapper.setAttribute("source", renderedBlock.source)
- wrapper.setAttribute("urgency", renderedBlock.urgency.name.lowercase(Locale.ROOT))
+ val encoded = renderedBlock.encodeToXml()
+ val attributes = encoded.attributes
+ for (attributeIndex in 0 until attributes.length) {
+ val attribute = attributes.item(attributeIndex)
+ wrapper.setAttribute(attribute.nodeName, attribute.nodeValue)
+ }
root.appendChild(wrapper)
- val encoded = renderedBlock.encodeToXml()
val childNodes = encoded.childNodes
for (childIndex in 0 until childNodes.length) {
wrapper.appendChild(document.importNode(childNodes.item(childIndex), true))
diff --git a/Partner-Core/src/test/java/work/slhaf/partner/core/cognition/ContextWorkspaceTest.kt b/Partner-Core/src/test/java/work/slhaf/partner/core/cognition/ContextWorkspaceTest.kt
index ace14a99..561d4208 100644
--- a/Partner-Core/src/test/java/work/slhaf/partner/core/cognition/ContextWorkspaceTest.kt
+++ b/Partner-Core/src/test/java/work/slhaf/partner/core/cognition/ContextWorkspaceTest.kt
@@ -109,6 +109,41 @@ class ContextWorkspaceTest {
assertTrue(aggregatedXml.contains("older"))
}
+ @Test
+ fun `aggregated snapshots preserve rendered block root attributes`() {
+ val manager = ContextWorkspace()
+ manager.register(
+ ContextBlock(
+ blockContent = AttributedTestBlockContent("memory", "main", "older", "historic"),
+ compactBlock = AttributedTestBlockContent("memory", "main", "older-compact", "historic"),
+ abstractBlock = AttributedTestBlockContent("memory", "main", "older-abstract", "historic"),
+ visibleTo = setOf(ContextBlock.VisibleDomain.MEMORY),
+ replaceFadeFactor = 20.0,
+ timeFadeFactor = 0.0,
+ activateFactor = 0.0
+ )
+ )
+ manager.register(
+ ContextBlock(
+ blockContent = AttributedTestBlockContent("memory", "main", "newer", "latest"),
+ compactBlock = AttributedTestBlockContent("memory", "main", "newer-compact", "latest"),
+ abstractBlock = AttributedTestBlockContent("memory", "main", "newer-abstract", "latest"),
+ visibleTo = setOf(ContextBlock.VisibleDomain.MEMORY),
+ replaceFadeFactor = 20.0,
+ timeFadeFactor = 0.0,
+ activateFactor = 0.0
+ )
+ )
+
+ val resolved = manager.resolve(listOf(ContextBlock.VisibleDomain.MEMORY))
+
+ val aggregatedXml = resolved.blocks.single().encodeToXmlString()
+ assertTrue(aggregatedXml.contains(""))
+ assertTrue(aggregatedXml.contains(""))
+ assertTrue(aggregatedXml.contains("newer"))
+ assertTrue(aggregatedXml.contains("older"))
+ }
+
@Test
fun `register fades matching source blocks and removes zero score ones`() {
val manager = ContextWorkspace()
@@ -420,7 +455,7 @@ class ContextWorkspaceTest {
)
}
- private class TestBlockContent(
+ private open class TestBlockContent(
blockName: String,
source: String,
val content: String,
@@ -430,4 +465,16 @@ class ContextWorkspaceTest {
appendTextElement(document, root, "content", content)
}
}
+
+ private class AttributedTestBlockContent(
+ blockName: String,
+ source: String,
+ content: String,
+ private val category: String,
+ urgency: Urgency = Urgency.NORMAL
+ ) : TestBlockContent(blockName, source, content, urgency) {
+ override fun appendRootAttributes(): Map {
+ return super.appendRootAttributes() + ("category" to category)
+ }
+ }
}