* Delete specific resolved references by (fromNodeId, referenceName, referenceKind) tuples. * More precise than deleteResolvedReferences — only removes refs that were actually resolved.
(refs: Array<{ fromNodeId: string; referenceName: string; referenceKind: string }>)
| 3544 | * More precise than deleteResolvedReferences — only removes refs that were actually resolved. |
| 3545 | */ |
| 3546 | deleteSpecificResolvedReferences(refs: Array<{ fromNodeId: string; referenceName: string; referenceKind: string }>): number { |
| 3547 | if (refs.length === 0) return 0; |
| 3548 | const stmt = this.db.prepare( |
| 3549 | 'DELETE FROM unresolved_refs WHERE from_node_id = ? AND reference_name = ? AND reference_kind = ?' |
| 3550 | ); |
| 3551 | // Returns rows actually removed (SQLite `changes`, summed): the batched |
| 3552 | // resolution loop's non-progress guard keys on this — zero removals from |
| 3553 | // a batch that claimed work is the direct runaway signal (§7a.2). |
| 3554 | let changed = 0; |
| 3555 | const deleteMany = this.db.transaction((items: typeof refs) => { |
| 3556 | for (const ref of items) { |
| 3557 | changed += stmt.run(ref.fromNodeId, ref.referenceName, ref.referenceKind).changes; |
| 3558 | } |
| 3559 | }); |
| 3560 | deleteMany(refs); |
| 3561 | return changed; |
| 3562 | } |
| 3563 | |
| 3564 | /** |
| 3565 | * Delete unresolved-ref rows by row id — the precise cleanup for refs a |
no test coverage detected