@@ -232,6 +232,93 @@ function assertStoreKey(value: unknown): string {
232232 return value ;
233233}
234234
235+ function assertCogneeMemoryLedger ( value : unknown ) : storeLib . StoredCogneeMemoryLedger {
236+ if ( ! value || typeof value !== "object" || Array . isArray ( value ) ) {
237+ throw new Error ( "Cognee memory ledger must be an object." ) ;
238+ }
239+ const events = ( value as { events ?: unknown } ) . events ;
240+ if ( ! Array . isArray ( events ) ) throw new Error ( "Cognee memory ledger events must be an array." ) ;
241+ if ( events . length > 500 ) throw new Error ( "Cognee memory ledger is too large." ) ;
242+ return { events : events . map ( assertCogneeMemoryLedgerEvent ) } ;
243+ }
244+
245+ function assertCogneeMemoryLedgerEvent ( value : unknown ) : storeLib . StoredCogneeMemoryLedgerEvent {
246+ if ( ! value || typeof value !== "object" || Array . isArray ( value ) ) {
247+ throw new Error ( "Cognee memory ledger event must be an object." ) ;
248+ }
249+ const event = value as Record < string , unknown > ;
250+ return {
251+ id : boundedLedgerString ( event . id , "id" , 120 ) ,
252+ operation : assertCogneeMemoryOperation ( event . operation ) ,
253+ status : assertCogneeMemoryEventStatus ( event . status ) ,
254+ source : boundedLedgerString ( event . source , "source" , 120 ) ,
255+ startedAt : boundedLedgerString ( event . startedAt , "startedAt" , 80 ) ,
256+ durationMs : boundedLedgerNumber ( event . durationMs , "durationMs" ) ,
257+ datasetName : optionalLedgerString ( event . datasetName , "datasetName" , 120 ) ,
258+ repo : optionalLedgerString ( event . repo , "repo" , 300 ) ,
259+ branch : optionalLedgerString ( event . branch , "branch" , 160 ) ,
260+ query : optionalLedgerString ( event . query , "query" , 2_000 ) ,
261+ documentCount : boundedLedgerNumber ( event . documentCount , "documentCount" ) ,
262+ storedCount : boundedLedgerNumber ( event . storedCount , "storedCount" ) ,
263+ recallItemCount : boundedLedgerNumber ( event . recallItemCount , "recallItemCount" ) ,
264+ payloadBytes : boundedLedgerNumber ( event . payloadBytes , "payloadBytes" ) ,
265+ estimatedTokens : boundedLedgerNumber ( event . estimatedTokens , "estimatedTokens" ) ,
266+ accepted : optionalLedgerBoolean ( event . accepted , "accepted" ) ,
267+ forgotten : optionalLedgerBoolean ( event . forgotten , "forgotten" ) ,
268+ reason : optionalLedgerString ( event . reason , "reason" , 500 ) ,
269+ error : optionalLedgerString ( event . error , "error" , 500 ) ,
270+ titles : assertLedgerTitles ( event . titles ) ,
271+ } ;
272+ }
273+
274+ function assertCogneeMemoryOperation ( value : unknown ) : storeLib . StoredCogneeMemoryLedgerEvent [ "operation" ] {
275+ if ( value === "remember" || value === "recall" || value === "improve" || value === "forget" ) {
276+ return value ;
277+ }
278+ throw new Error ( "Unsupported Cognee memory operation." ) ;
279+ }
280+
281+ function assertCogneeMemoryEventStatus ( value : unknown ) : storeLib . StoredCogneeMemoryLedgerEvent [ "status" ] {
282+ if ( value === "succeeded" || value === "skipped" || value === "failed" ) return value ;
283+ throw new Error ( "Unsupported Cognee memory event status." ) ;
284+ }
285+
286+ function boundedLedgerString ( value : unknown , name : string , max : number ) : string {
287+ if ( typeof value !== "string" || ! value . trim ( ) ) {
288+ throw new Error ( `Cognee memory ledger ${ name } must be a non-empty string.` ) ;
289+ }
290+ if ( value . length > max || / [ \0 ] / . test ( value ) ) {
291+ throw new Error ( `Cognee memory ledger ${ name } is invalid.` ) ;
292+ }
293+ return value ;
294+ }
295+
296+ function optionalLedgerString ( value : unknown , name : string , max : number ) : string | undefined {
297+ if ( value === undefined ) return undefined ;
298+ return boundedLedgerString ( value , name , max ) ;
299+ }
300+
301+ function boundedLedgerNumber ( value : unknown , name : string ) : number {
302+ if ( typeof value !== "number" || ! Number . isFinite ( value ) || value < 0 ) {
303+ throw new Error ( `Cognee memory ledger ${ name } must be a finite non-negative number.` ) ;
304+ }
305+ return Math . round ( value ) ;
306+ }
307+
308+ function optionalLedgerBoolean ( value : unknown , name : string ) : boolean | undefined {
309+ if ( value === undefined ) return undefined ;
310+ if ( typeof value !== "boolean" ) {
311+ throw new Error ( `Cognee memory ledger ${ name } must be a boolean.` ) ;
312+ }
313+ return value ;
314+ }
315+
316+ function assertLedgerTitles ( value : unknown ) : string [ ] {
317+ if ( ! Array . isArray ( value ) ) throw new Error ( "Cognee memory ledger titles must be an array." ) ;
318+ if ( value . length > 10 ) throw new Error ( "Cognee memory ledger titles are too large." ) ;
319+ return value . map ( ( title , index ) => boundedLedgerString ( title , `titles[${ index } ]` , 240 ) ) ;
320+ }
321+
235322function assertGitLabProjectId ( value : unknown ) : string {
236323 if ( typeof value !== "string" || ! value . trim ( ) || value . length > 300 ) {
237324 throw new Error ( "GitLab project id must be a non-empty string." ) ;
@@ -928,6 +1015,11 @@ export function registerIPCHandlers(gitWorker: UtilityProcess) {
9281015 ) ;
9291016 ipcMain . handle ( "memory:status" , ( ) => verifiedCogneeStatus ( ) ) ;
9301017 ipcMain . handle ( "memory:usage" , ( ) => cogneeUsage ( ) ) ;
1018+ ipcMain . handle ( "memory:ledger:get" , ( ) => storeLib . getCogneeMemoryLedger ( ) ) ;
1019+ ipcMain . handle ( "memory:ledger:set" , async ( _ , payload : unknown ) => {
1020+ storeLib . setCogneeMemoryLedger ( assertCogneeMemoryLedger ( payload ) ) ;
1021+ } ) ;
1022+ ipcMain . handle ( "memory:ledger:clear" , ( ) => storeLib . clearCogneeMemoryLedger ( ) ) ;
9311023
9321024 // ============================================================
9331025 // STORE CHANNELS (3)
0 commit comments