* 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 }>)
| 2230 | * More precise than deleteResolvedReferences — only removes refs that were actually resolved. |
| 2231 | */ |
| 2232 | deleteSpecificResolvedReferences(refs: Array<{ fromNodeId: string; referenceName: string; referenceKind: string }>): number { |
| 2233 | if (refs.length === 0) return 0; |
| 2234 | const stmt = this.db.prepare( |
| 2235 | 'DELETE FROM unresolved_refs WHERE from_node_id = ? AND reference_name = ? AND reference_kind = ?' |
| 2236 | ); |
| 2237 | // Returns rows actually removed (SQLite `changes`, summed): the batched |
| 2238 | // resolution loop's non-progress guard keys on this — zero removals from |
| 2239 | // a batch that claimed work is the direct runaway signal (§7a.2). |
| 2240 | let changed = 0; |
| 2241 | const deleteMany = this.db.transaction((items: typeof refs) => { |
| 2242 | for (const ref of items) { |
| 2243 | changed += stmt.run(ref.fromNodeId, ref.referenceName, ref.referenceKind).changes; |
| 2244 | } |
| 2245 | }); |
| 2246 | deleteMany(refs); |
| 2247 | return changed; |
| 2248 | } |
| 2249 | |
| 2250 | /** |
| 2251 | * Delete unresolved-ref rows by row id — the precise cleanup for refs a |
no test coverage detected