refactor(trace): trace full snapshot of context workspace on changes

This commit is contained in:
2026-04-21 16:48:21 +08:00
parent 2927cb2b6f
commit 96101de227

View File

@@ -103,7 +103,7 @@ class ContextWorkspace {
* @param contextBlock 注册的新上下文块 * @param contextBlock 注册的新上下文块
*/ */
fun register(contextBlock: ContextBlock) = lock.write { fun register(contextBlock: ContextBlock) = lock.write {
val removedBlocks = mutableListOf<ContextBlock>() val changedSourceKeys = linkedSetOf<ContextBlock.SourceKey>()
val iterator = stateSet.iterator() val iterator = stateSet.iterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
val currentBlock = iterator.next() val currentBlock = iterator.next()
@@ -113,44 +113,44 @@ class ContextWorkspace {
if (currentBlock.applyReplaceFade() <= 0.0) { if (currentBlock.applyReplaceFade() <= 0.0) {
iterator.remove() iterator.remove()
removedBlocks.add(currentBlock) changedSourceKeys.add(currentBlock.sourceKey)
} }
} }
stateSet += contextBlock stateSet += contextBlock
recordRegister(contextBlock, removedBlocks) changedSourceKeys.add(contextBlock.sourceKey)
record("register", changedSourceKeys)
} }
fun expire(blockName: String, source: String) = lock.write { fun expire(blockName: String, source: String) = lock.write {
val sourceKey = ContextBlock.SourceKey(blockName, source) val sourceKey = ContextBlock.SourceKey(blockName, source)
val removedBlocks = mutableListOf<ContextBlock>() val changedSourceKeys = linkedSetOf<ContextBlock.SourceKey>()
val iterator = stateSet.iterator() val iterator = stateSet.iterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
val block = iterator.next() val block = iterator.next()
if (block.sourceKey == sourceKey) { if (block.sourceKey == sourceKey) {
iterator.remove() iterator.remove()
removedBlocks.add(block) changedSourceKeys.add(block.sourceKey)
} }
} }
if (removedBlocks.isNotEmpty()) { if (changedSourceKeys.isNotEmpty()) {
recordExpire(sourceKey) record("expire", changedSourceKeys)
} }
} }
private fun recordRegister(addedBlock: ContextBlock, removedBlocks: List<ContextBlock>) { private fun record(action: String, changedSourceKeys: Set<ContextBlock.SourceKey>) {
val payload = JSONObject() val payload = JSONObject()
payload["action"] = "register" payload["action"] = action
payload["added"] = blockSnapshot(addedBlock) payload["changedSourceKeys"] = changedSourceKeys
payload["removed"] = removedBlocks.map(::blockSnapshot) .sortedWith(
TraceRecorder.record(TraceEvent(tracePath, payload)) compareBy<ContextBlock.SourceKey> { it.blockName }
} .thenBy { it.source }
)
private fun recordExpire(sourceKey: ContextBlock.SourceKey) { .map { sourceKey ->
val payload = JSONObject() JSONObject.of(
payload["action"] = "expire" "blockName", sourceKey.blockName,
payload["changedSourceKey"] = JSONObject.of( "source", sourceKey.source
"blockName", sourceKey.blockName, )
"source", sourceKey.source }
)
payload["blocks"] = stateSet payload["blocks"] = stateSet
.sortedWith( .sortedWith(
compareBy<ContextBlock> { it.sourceKey.blockName } compareBy<ContextBlock> { it.sourceKey.blockName }