@claude-flow/cli 3.12.4 → 3.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,15 +2,30 @@
2
2
  * Graph Edge Writer — ADR-130 Phase 1
3
3
  *
4
4
  * Provides a minimal interface for inserting rows into the graph_edges
5
- * sql.js table defined by MEMORY_SCHEMA_V3.
5
+ * SQLite table defined by MEMORY_SCHEMA_V3.
6
6
  *
7
- * This module is intentionally thin: it opens the shared sql.js SQLite db
8
- * (the same file used by memory-initializer storeEntry), ensures the
9
- * graph_edges table exists, and returns a better-sqlite3-compatible
10
- * prepared-statement interface.
7
+ * #2431 fix (2026-06-22) replaces the prior sql.js implementation. The
8
+ * prior version opened sql.js, performed in-memory updates, then called
9
+ * `fs.writeFileSync(dbPath, db.export())` after every edge insert. This
10
+ * whole-file flush overwrote the main `memory.db` while the better-sqlite3
11
+ * bridge was actively writing through its WAL — exactly the dual-write
12
+ * race that ADR-068 (#1257) removed. Symptom: PRAGMA integrity_check
13
+ * reports `database disk image is malformed (11)` after a single
14
+ * memory_store + causal-edge sequence.
11
15
  *
12
- * The module is designed for fire-and-forget callers every public function
13
- * suppresses errors internally so callers never need try/catch.
16
+ * Fix posture: use better-sqlite3 directly (the same native engine the
17
+ * memory bridge uses). WAL-native, no whole-file fsync, no race. Keeps
18
+ * the public API surface identical so callers don't have to change.
19
+ *
20
+ * Note: this is the minimum-safe fix. The architecturally cleaner fix
21
+ * (route writes through the bridge's controller layer) is scoped to a
22
+ * future ADR — see #2431 for the discussion. Until that ADR lands, this
23
+ * module owns its own better-sqlite3 handle but on the same file, with
24
+ * WAL mode enabled (which makes concurrent writers safe by SQLite's own
25
+ * design — no overlapping fsync).
26
+ *
27
+ * The module is designed for fire-and-forget callers — every public
28
+ * function suppresses errors internally so callers never need try/catch.
14
29
  *
15
30
  * @module v3/cli/memory/graph-edge-writer
16
31
  */
@@ -20,19 +35,23 @@ import * as crypto from 'crypto';
20
35
  import { getMemoryRoot } from './memory-initializer.js';
21
36
  import { encodeEmbedding } from './embedding-quantization.js';
22
37
  // ============================================================================
23
- // Lazy-cached sql.js db handle
38
+ // Lazy-cached better-sqlite3 db handle
24
39
  // ============================================================================
25
40
  let _db = null;
26
41
  let _dbPath = '';
27
42
  let _dbInitializing = false;
28
43
  /**
29
- * Return the sql.js Database instance for graph_edges writes.
44
+ * Return the better-sqlite3 Database instance for graph_edges writes.
30
45
  * Creates the graph_edges table if it is absent (idempotent).
31
- * Returns null if sql.js is not available or db cannot be opened.
46
+ * Returns null if better-sqlite3 is not available or db cannot be opened.
32
47
  *
33
48
  * #2246 fix: `createIfMissing` (default false for back-compat) — when true,
34
49
  * lazily creates an empty memory.db with the graph_edges schema so
35
50
  * graph-pathfinder works on fresh environments before any memory writes.
51
+ *
52
+ * #2431 fix: better-sqlite3 + WAL mode replaces sql.js + whole-file
53
+ * writeFileSync. Eliminates the dual-write race that corrupted memory.db
54
+ * when called alongside the memory bridge's better-sqlite3 writer.
36
55
  */
37
56
  export async function getBridgeDb(customDbPath, opts) {
38
57
  const dbPath = customDbPath ?? path.join(getMemoryRoot(), 'memory.db');
@@ -46,23 +65,34 @@ export async function getBridgeDb(customDbPath, opts) {
46
65
  const dbExists = fs.existsSync(dbPath);
47
66
  if (!dbExists && !createIfMissing)
48
67
  return null;
49
- const initSqlJs = (await import('sql.js')).default;
50
- const SQL = await initSqlJs();
51
- let db;
52
- if (dbExists) {
53
- const fileBuffer = fs.readFileSync(dbPath);
54
- db = new SQL.Database(fileBuffer);
55
- }
56
- else {
57
- // Lazy-create empty DB + ensure parent dir exists.
68
+ // Ensure parent dir exists for createIfMissing case.
69
+ if (!dbExists && createIfMissing) {
58
70
  const dir = path.dirname(dbPath);
59
71
  if (!fs.existsSync(dir))
60
72
  fs.mkdirSync(dir, { recursive: true });
61
- db = new SQL.Database();
62
73
  }
74
+ // better-sqlite3 may not be available on all platforms (it's a native
75
+ // module, so platform-specific binaries are required). If unavailable,
76
+ // return null and let callers degrade gracefully — same posture as the
77
+ // prior sql.js version when sql.js failed to load.
78
+ let BetterSqlite3;
79
+ try {
80
+ BetterSqlite3 = (await import('better-sqlite3')).default;
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ const db = new BetterSqlite3(dbPath);
86
+ // WAL mode is the load-bearing piece of the #2431 fix: it lets multiple
87
+ // connections (this module + the memory bridge) write to the same file
88
+ // without overlapping fsyncs corrupting each other. SQLite's WAL is
89
+ // designed for exactly this case.
90
+ db.pragma('journal_mode = WAL');
91
+ db.pragma('synchronous = NORMAL'); // WAL-safe + faster than FULL
92
+ db.pragma('busy_timeout = 5000'); // wait up to 5s on lock contention
63
93
  // Ensure graph_edges table exists (in case this is an older DB that
64
94
  // predates ADR-130 Phase 1 schema migration).
65
- db.run(`
95
+ db.exec(`
66
96
  CREATE TABLE IF NOT EXISTS graph_edges (
67
97
  id TEXT PRIMARY KEY,
68
98
  source_id TEXT NOT NULL,
@@ -76,23 +106,14 @@ export async function getBridgeDb(customDbPath, opts) {
76
106
  embedding_ref TEXT,
77
107
  metadata TEXT,
78
108
  created_at TEXT NOT NULL
79
- )
109
+ );
110
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id);
111
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id);
112
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_relation ON graph_edges (relation);
113
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_reinforced ON graph_edges (last_reinforced);
80
114
  `);
81
- db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id)`);
82
- db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id)`);
83
- db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_relation ON graph_edges (relation)`);
84
- db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_reinforced ON graph_edges (last_reinforced)`);
85
115
  _db = db;
86
116
  _dbPath = dbPath;
87
- // #2246 — if we just lazy-created the DB, persist the empty file so
88
- // subsequent calls can read it back without re-creating.
89
- if (!dbExists && createIfMissing) {
90
- try {
91
- const data = db.export();
92
- fs.writeFileSync(dbPath, Buffer.from(data));
93
- }
94
- catch { /* non-fatal — caller will re-flush on first write */ }
95
- }
96
117
  return db;
97
118
  }
98
119
  catch {
@@ -102,23 +123,15 @@ export async function getBridgeDb(customDbPath, opts) {
102
123
  _dbInitializing = false;
103
124
  }
104
125
  }
105
- /**
106
- * Persist the in-memory sql.js database back to disk.
107
- * Called after each write to keep the file consistent.
108
- */
109
- async function flushDb(db) {
110
- try {
111
- if (!_dbPath)
112
- return;
113
- const data = db.export();
114
- fs.writeFileSync(_dbPath, Buffer.from(data));
115
- }
116
- catch { /* non-fatal */ }
117
- }
118
126
  /**
119
127
  * Insert a single edge into graph_edges.
120
128
  * Fire-and-forget — errors are suppressed.
121
129
  * Returns true if the write succeeded, false otherwise.
130
+ *
131
+ * #2431 fix: uses better-sqlite3 prepared statements + implicit WAL
132
+ * journal. No `fs.writeFileSync` whole-file flush — the WAL handles
133
+ * durability without overwriting the main file out from under other
134
+ * writers.
122
135
  */
123
136
  export async function insertGraphEdge(input) {
124
137
  try {
@@ -132,24 +145,10 @@ export async function insertGraphEdge(input) {
132
145
  embeddingRef = encodeEmbedding(input.embedding);
133
146
  }
134
147
  const metaStr = input.metadata ? JSON.stringify(input.metadata) : null;
135
- db.run(`INSERT OR IGNORE INTO graph_edges
148
+ db.prepare(`INSERT OR IGNORE INTO graph_edges
136
149
  (id, source_id, target_id, relation, weight, confidence, decay_rate,
137
150
  last_reinforced, witness_id, embedding_ref, metadata, created_at)
138
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
139
- id,
140
- input.sourceId,
141
- input.targetId,
142
- input.relation,
143
- input.weight ?? 1.0,
144
- input.confidence ?? 1.0,
145
- input.decayRate ?? 0.0,
146
- input.lastReinforced ?? null,
147
- input.witnessId ?? null,
148
- embeddingRef,
149
- metaStr,
150
- createdAt,
151
- ]);
152
- await flushDb(db);
151
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.sourceId, input.targetId, input.relation, input.weight ?? 1.0, input.confidence ?? 1.0, input.decayRate ?? 0.0, input.lastReinforced ?? null, input.witnessId ?? null, embeddingRef, metaStr, createdAt);
153
152
  return true;
154
153
  }
155
154
  catch {
@@ -169,15 +168,7 @@ export async function queryEdgesBySource(sourceId, relation, dbPath) {
169
168
  ? `SELECT id, source_id, target_id, relation, weight FROM graph_edges WHERE source_id = ? AND relation = ? LIMIT 1000`
170
169
  : `SELECT id, source_id, target_id, relation, weight FROM graph_edges WHERE source_id = ? LIMIT 1000`;
171
170
  const args = relation ? [sourceId, relation] : [sourceId];
172
- const result = db.exec(sql, args);
173
- if (!result?.[0])
174
- return [];
175
- const cols = result[0].columns;
176
- return result[0].values.map((row) => {
177
- const obj = {};
178
- cols.forEach((c, i) => { obj[c] = row[i]; });
179
- return obj;
180
- });
171
+ return db.prepare(sql).all(...args);
181
172
  }
182
173
  catch {
183
174
  return [];
@@ -191,8 +182,8 @@ export async function countGraphEdges(dbPath) {
191
182
  const db = await getBridgeDb(dbPath);
192
183
  if (!db)
193
184
  return 0;
194
- const result = db.exec(`SELECT COUNT(*) FROM graph_edges`);
195
- return result?.[0]?.values?.[0]?.[0] ?? 0;
185
+ const row = db.prepare(`SELECT COUNT(*) AS n FROM graph_edges`).get();
186
+ return row?.n ?? 0;
196
187
  }
197
188
  catch {
198
189
  return 0;
@@ -200,8 +191,18 @@ export async function countGraphEdges(dbPath) {
200
191
  }
201
192
  /**
202
193
  * Reset the cached db handle (for tests that need a fresh DB).
194
+ *
195
+ * #2431 fix: also explicitly closes the prior handle so file locks
196
+ * release immediately — better-sqlite3 holds an OS-level file handle
197
+ * which the prior sql.js implementation did not.
203
198
  */
204
199
  export function _resetBridgeDb() {
200
+ if (_db) {
201
+ try {
202
+ _db.close();
203
+ }
204
+ catch { /* best-effort */ }
205
+ }
205
206
  _db = null;
206
207
  _dbPath = '';
207
208
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph-edge-writer.js","sourceRoot":"","sources":["../../../src/memory/graph-edge-writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-edge-writer.js","sourceRoot":"","sources":["../../../src/memory/graph-edge-writer.ts"],"names":[],"mappings":"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"}