@@ -153,12 +153,20 @@ export class MetadataManager implements IMetadataService {
153153
154154 /**
155155 * Register/save a metadata item by type
156+ * Stores in-memory registry and persists to writable loaders (if configured)
156157 */
157158 async register ( type : string , name : string , data : unknown ) : Promise < void > {
158159 if ( ! this . registry . has ( type ) ) {
159160 this . registry . set ( type , new Map ( ) ) ;
160161 }
161162 this . registry . get ( type ) ! . set ( name , data ) ;
163+
164+ // Persist to writable loaders (e.g., DatabaseLoader for history tracking)
165+ for ( const loader of this . loaders . values ( ) ) {
166+ if ( loader . save ) {
167+ await loader . save ( type , name , data ) ;
168+ }
169+ }
162170 }
163171
164172 /**
@@ -213,13 +221,26 @@ export class MetadataManager implements IMetadataService {
213221 * Unregister/remove a metadata item by type and name
214222 */
215223 async unregister ( type : string , name : string ) : Promise < void > {
224+ // Remove from in-memory registry
216225 const typeStore = this . registry . get ( type ) ;
217226 if ( typeStore ) {
218227 typeStore . delete ( name ) ;
219228 if ( typeStore . size === 0 ) {
220229 this . registry . delete ( type ) ;
221230 }
222231 }
232+
233+ // Also delete from all loaders that support deletion
234+ for ( const loader of this . loaders . values ( ) ) {
235+ // Check if the loader has a delete method
236+ if ( typeof ( loader as any ) . delete === 'function' ) {
237+ try {
238+ await ( loader as any ) . delete ( type , name ) ;
239+ } catch ( error ) {
240+ this . logger . warn ( `Failed to delete ${ type } /${ name } from loader ${ loader . contract . name } ` , { error } ) ;
241+ }
242+ }
243+ }
223244 }
224245
225246 /**
@@ -321,20 +342,21 @@ export class MetadataManager implements IMetadataService {
321342 * Unregister all metadata items from a specific package
322343 */
323344 async unregisterPackage ( packageName : string ) : Promise < void > {
345+ // Collect all items to delete (type and name pairs)
346+ const itemsToDelete : Array < { type : string ; name : string } > = [ ] ;
347+
324348 for ( const [ type , typeStore ] of this . registry ) {
325- const toDelete : string [ ] = [ ] ;
326349 for ( const [ name , data ] of typeStore ) {
327350 const meta = data as any ;
328351 if ( meta ?. packageId === packageName || meta ?. package === packageName ) {
329- toDelete . push ( name ) ;
352+ itemsToDelete . push ( { type , name } ) ;
330353 }
331354 }
332- for ( const name of toDelete ) {
333- typeStore . delete ( name ) ;
334- }
335- if ( typeStore . size === 0 ) {
336- this . registry . delete ( type ) ;
337- }
355+ }
356+
357+ // Delete each item using unregister() to ensure deletion from both registry and loaders
358+ for ( const { type, name } of itemsToDelete ) {
359+ await this . unregister ( type , name ) ;
338360 }
339361 }
340362
@@ -1343,6 +1365,12 @@ export class MetadataManager implements IMetadataService {
13431365 options ?. recordedBy
13441366 ) ;
13451367
1368+ // Update in-memory registry with the restored metadata
1369+ if ( ! this . registry . has ( type ) ) {
1370+ this . registry . set ( type , new Map ( ) ) ;
1371+ }
1372+ this . registry . get ( type ) ! . set ( name , restoredMetadata ) ;
1373+
13461374 return restoredMetadata ;
13471375 }
13481376
0 commit comments