11import type { LongTermMemoryEntry } from "./types.ts" ;
22import { memoryKey } from "./pending-journal.ts" ;
3+ import type { MemoryConsolidationEvent } from "./workspace-memory.ts" ;
34import { workspaceMemoryIdentityKey } from "./workspace-memory.ts" ;
45
56export type PendingPromotionAccounting = {
67 promotedKeys : Set < string > ;
78 absorbedKeys : Set < string > ;
9+ supersededKeys : Set < string > ;
810 rejectedKeys : Set < string > ;
911 clearableKeys : Set < string > ;
1012} ;
@@ -13,13 +15,18 @@ export function accountPendingPromotions(input: {
1315 pending : LongTermMemoryEntry [ ] ;
1416 before : LongTermMemoryEntry [ ] ;
1517 after : LongTermMemoryEntry [ ] ;
18+ events ?: MemoryConsolidationEvent [ ] ;
1619} ) : PendingPromotionAccounting {
17- const beforeExactKeys = new Set ( input . before . map ( entry => memoryKey ( entry ) ) ) ;
18- const afterExactKeys = new Set ( input . after . map ( entry => memoryKey ( entry ) ) ) ;
19- const afterIdentityKeys = new Set ( input . after . map ( entry => workspaceMemoryIdentityKey ( entry ) ) ) ;
20+ const beforeActive = input . before . filter ( entry => entry . status !== "superseded" ) ;
21+ const afterActive = input . after . filter ( entry => entry . status !== "superseded" ) ;
22+ const beforeExactKeys = new Set ( beforeActive . map ( entry => memoryKey ( entry ) ) ) ;
23+ const afterExactKeys = new Set ( afterActive . map ( entry => memoryKey ( entry ) ) ) ;
24+ const afterIdentityKeys = new Set ( afterActive . map ( entry => workspaceMemoryIdentityKey ( entry ) ) ) ;
25+ const terminalEventByKey = new Map ( ( input . events ?? [ ] ) . map ( event => [ event . memoryKey , event ] ) ) ;
2026
2127 const promotedKeys = new Set < string > ( ) ;
2228 const absorbedKeys = new Set < string > ( ) ;
29+ const supersededKeys = new Set < string > ( ) ;
2330 const rejectedKeys = new Set < string > ( ) ;
2431
2532 for ( const memory of input . pending ) {
@@ -36,6 +43,27 @@ export function accountPendingPromotions(input: {
3643 continue ;
3744 }
3845
46+ const terminal = terminalEventByKey . get ( key ) ;
47+ if ( terminal ) {
48+ if (
49+ terminal . reason === "absorbed_exact" ||
50+ terminal . reason === "absorbed_identity"
51+ ) {
52+ absorbedKeys . add ( key ) ;
53+ continue ;
54+ }
55+
56+ if ( terminal . reason === "superseded_existing" ) {
57+ supersededKeys . add ( key ) ;
58+ continue ;
59+ }
60+
61+ if ( terminal . reason === "rejected_capacity" || terminal . reason === "rejected_stale" ) {
62+ rejectedKeys . add ( key ) ;
63+ continue ;
64+ }
65+ }
66+
3967 if ( afterIdentityKeys . has ( identityKey ) ) {
4068 absorbedKeys . add ( key ) ;
4169 continue ;
@@ -47,7 +75,21 @@ export function accountPendingPromotions(input: {
4775 return {
4876 promotedKeys,
4977 absorbedKeys,
78+ supersededKeys,
5079 rejectedKeys,
51- clearableKeys : new Set ( [ ...promotedKeys , ...absorbedKeys ] ) ,
80+ clearableKeys : new Set ( [
81+ ...promotedKeys ,
82+ ...absorbedKeys ,
83+ ...supersededKeys ,
84+ ...input . pending
85+ . filter ( memory => {
86+ const terminal = terminalEventByKey . get ( memoryKey ( memory ) ) ;
87+ return memory . source === "compaction" && (
88+ terminal ?. reason === "rejected_capacity" ||
89+ terminal ?. reason === "rejected_stale"
90+ ) ;
91+ } )
92+ . map ( memory => memoryKey ( memory ) ) ,
93+ ] ) ,
5294 } ;
5395}
0 commit comments