@indigoai-us/hq-cloud 6.14.18 → 6.14.20
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.
- package/.github/workflows/ci.yml +35 -0
- package/dist/bin/sync-runner-company.d.ts +7 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +21 -1
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-planning.d.ts.map +1 -1
- package/dist/bin/sync-runner-planning.js +8 -16
- package/dist/bin/sync-runner-planning.js.map +1 -1
- package/dist/bin/sync-runner-planning.test.js +138 -0
- package/dist/bin/sync-runner-planning.test.js.map +1 -1
- package/dist/bin/sync-runner-watch-loop.d.ts +10 -2
- package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-loop.js +201 -25
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner-watch-routes.d.ts +1 -1
- package/dist/bin/sync-runner-watch-routes.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-routes.js +14 -2
- package/dist/bin/sync-runner-watch-routes.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +17 -2
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +36 -6
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +550 -3
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/rescue-core.js +27 -1
- package/dist/cli/rescue-core.js.map +1 -1
- package/dist/cli/rescue-drop-dir-symlink.test.d.ts +2 -0
- package/dist/cli/rescue-drop-dir-symlink.test.d.ts.map +1 -0
- package/dist/cli/rescue-drop-dir-symlink.test.js +206 -0
- package/dist/cli/rescue-drop-dir-symlink.test.js.map +1 -0
- package/dist/cli/share.d.ts +15 -0
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +100 -55
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +119 -6
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +19 -25
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +121 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/journal.d.ts +3 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +13 -2
- package/dist/journal.js.map +1 -1
- package/dist/journal.test.js +26 -1
- package/dist/journal.test.js.map +1 -1
- package/dist/personal-vault.d.ts +12 -0
- package/dist/personal-vault.d.ts.map +1 -1
- package/dist/personal-vault.js +20 -0
- package/dist/personal-vault.js.map +1 -1
- package/dist/qmd-reindex.d.ts +88 -11
- package/dist/qmd-reindex.d.ts.map +1 -1
- package/dist/qmd-reindex.js +354 -65
- package/dist/qmd-reindex.js.map +1 -1
- package/dist/qmd-reindex.test.d.ts +4 -0
- package/dist/qmd-reindex.test.d.ts.map +1 -1
- package/dist/qmd-reindex.test.js +285 -3
- package/dist/qmd-reindex.test.js.map +1 -1
- package/dist/s3.d.ts +13 -0
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +34 -1
- package/dist/s3.js.map +1 -1
- package/dist/s3.test.js +60 -1
- package/dist/s3.test.js.map +1 -1
- package/dist/telemetry.d.ts +22 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +79 -0
- package/dist/telemetry.js.map +1 -1
- package/dist/telemetry.test.js +117 -1
- package/dist/telemetry.test.js.map +1 -1
- package/dist/watcher.d.ts +26 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +75 -12
- package/dist/watcher.js.map +1 -1
- package/package.json +1 -1
- package/src/bin/sync-runner-company.ts +29 -1
- package/src/bin/sync-runner-planning.test.ts +153 -0
- package/src/bin/sync-runner-planning.ts +10 -17
- package/src/bin/sync-runner-watch-loop.ts +322 -32
- package/src/bin/sync-runner-watch-routes.ts +14 -1
- package/src/bin/sync-runner.test.ts +662 -6
- package/src/bin/sync-runner.ts +65 -7
- package/src/cli/rescue-core.ts +26 -1
- package/src/cli/rescue-drop-dir-symlink.test.ts +224 -0
- package/src/cli/share.test.ts +150 -6
- package/src/cli/share.ts +143 -48
- package/src/cli/sync.test.ts +150 -1
- package/src/cli/sync.ts +25 -29
- package/src/journal.test.ts +45 -0
- package/src/journal.ts +18 -1
- package/src/personal-vault.ts +23 -0
- package/src/qmd-reindex.test.ts +324 -4
- package/src/qmd-reindex.ts +414 -76
- package/src/s3.test.ts +79 -0
- package/src/s3.ts +48 -1
- package/src/telemetry.test.ts +128 -0
- package/src/telemetry.ts +80 -0
- package/src/watcher.ts +111 -14
- package/test/e2e/watcher-real-chokidar.test.ts +62 -2
- package/test/e2e/watcher-recursive-backend.test.ts +67 -1
package/dist/qmd-reindex.js
CHANGED
|
@@ -24,19 +24,258 @@
|
|
|
24
24
|
*
|
|
25
25
|
* The index itself is never synced — it is large, binary, and embeds absolute
|
|
26
26
|
* local paths. Only its *freshness* is automated here.
|
|
27
|
+
*
|
|
28
|
+
* ## Corruption safety (feedback_b9a369ff)
|
|
29
|
+
*
|
|
30
|
+
* The qmd store (`.qmd/index.sqlite`, backed by a sqlite-vec virtual table) was
|
|
31
|
+
* being corrupted on the vector side (`content_vectors` / `vectors_vec_rowids`)
|
|
32
|
+
* because TWO uncoordinated writers raced on it: this post-sync reindex and an
|
|
33
|
+
* interactive session's own qmd maintenance (e.g. a skill's `qmd embed`). Two
|
|
34
|
+
* defects compounded:
|
|
35
|
+
* 1. A hard 120s `spawnSync` timeout that KILLED a long `qmd update`/`embed`
|
|
36
|
+
* mid-write, tearing down the process between vector-table writes.
|
|
37
|
+
* 2. No cross-process serialization, so an interactive `qmd embed` and a
|
|
38
|
+
* runner-spawned `qmd update` overlapped with near certainty.
|
|
39
|
+
*
|
|
40
|
+
* The mitigations here, all inside the runner so every teammate gets them on
|
|
41
|
+
* their next sync:
|
|
42
|
+
* - The exec timeout is raised substantially so a legitimate long pass is no
|
|
43
|
+
* longer killed mid-write in the first place. A timed-out pass is treated as
|
|
44
|
+
* "not done" (left dirty, retried next cycle) and NEVER advances to embed.
|
|
45
|
+
* That not-done handling — together with the writer serialization below — is
|
|
46
|
+
* the real protection; the signal used for the (now rare) kill is secondary.
|
|
47
|
+
* When the bound does fire the child is sent SIGINT rather than the default
|
|
48
|
+
* SIGTERM, but qmd 2.5.3 traps both identically (each just restores the
|
|
49
|
+
* cursor and exits), so this is only the same clean exit path qmd takes on
|
|
50
|
+
* Ctrl-C — not a guarantee the in-flight SQLite write unwinds.
|
|
51
|
+
* - A shared advisory lock at `<hqRoot>/.qmd/.reindex.lock` serializes qmd
|
|
52
|
+
* writers. The runner takes it before touching qmd and SKIPS the cycle (and
|
|
53
|
+
* marks the tree dirty so the next sync retries) when another writer holds
|
|
54
|
+
* it. The lock path sits next to the DB so interactive HQ qmd maintenance
|
|
55
|
+
* can honor the same rendezvous.
|
|
56
|
+
* - Corruption is detected cheaply from qmd's own output (the SQLITE_CORRUPT
|
|
57
|
+
* signature). On detection the corrupt DB files are quarantined aside (moved
|
|
58
|
+
* to `index.sqlite.corrupt-<ts>`, never deleted) and the cycle stops writing
|
|
59
|
+
* so a clean rebuild happens on the next pass — instead of writing further
|
|
60
|
+
* onto an already-damaged store.
|
|
27
61
|
*/
|
|
28
62
|
import * as fs from "fs";
|
|
29
63
|
import * as path from "path";
|
|
30
64
|
import { spawnSync } from "child_process";
|
|
65
|
+
/**
|
|
66
|
+
* Default exec timeout for a single `qmd` invocation. The historical 120s bound
|
|
67
|
+
* routinely killed `qmd update`/`qmd embed` mid-write on a large index (the HQ
|
|
68
|
+
* root's `hq` collection alone spans the whole tree), which corrupted the vector
|
|
69
|
+
* store. 15 minutes comfortably covers a cold or embed-heavy pass, so the bound
|
|
70
|
+
* effectively stops firing on legitimate work; a genuinely wedged process is
|
|
71
|
+
* still bounded, and a timed-out pass is treated as not-done (never written
|
|
72
|
+
* further onto) — see {@link defaultExec} and {@link reindexAfterSync}.
|
|
73
|
+
*/
|
|
74
|
+
export const DEFAULT_QMD_EXEC_TIMEOUT_MS = 900_000;
|
|
75
|
+
/** Resolve the exec timeout, honoring `HQ_QMD_EXEC_TIMEOUT_MS` (ms) if valid. */
|
|
76
|
+
export function resolveExecTimeoutMs(env = process.env) {
|
|
77
|
+
const raw = env.HQ_QMD_EXEC_TIMEOUT_MS;
|
|
78
|
+
if (raw !== undefined && raw !== "") {
|
|
79
|
+
const n = Number(raw);
|
|
80
|
+
if (Number.isFinite(n) && n > 0)
|
|
81
|
+
return Math.round(n);
|
|
82
|
+
}
|
|
83
|
+
return DEFAULT_QMD_EXEC_TIMEOUT_MS;
|
|
84
|
+
}
|
|
31
85
|
const defaultExec = (args) => {
|
|
32
86
|
const res = spawnSync("qmd", args, {
|
|
33
87
|
encoding: "utf8",
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
timeout:
|
|
88
|
+
// Bound so a wedged index never hangs the runner forever, but generously —
|
|
89
|
+
// see DEFAULT_QMD_EXEC_TIMEOUT_MS.
|
|
90
|
+
timeout: resolveExecTimeoutMs(),
|
|
91
|
+
// On timeout send SIGINT instead of the default SIGTERM. NOTE: qmd 2.5.3
|
|
92
|
+
// traps BOTH identically — each handler only restores the cursor and calls
|
|
93
|
+
// process.exit() — so SIGINT is NOT inherently a graceful transaction
|
|
94
|
+
// unwind; it is simply the same exit path qmd takes on Ctrl-C. The real
|
|
95
|
+
// write-safety guarantee is the raised bound above (a kill is now rare) plus
|
|
96
|
+
// treating a timed-out pass as not-done and never embedding after it (see
|
|
97
|
+
// reindexAfterSync). SIGINT is kept only so a killed pass exits qmd's normal
|
|
98
|
+
// way rather than via an unhandled default signal.
|
|
99
|
+
killSignal: "SIGINT",
|
|
100
|
+
});
|
|
101
|
+
const timedOut = res.error != null &&
|
|
102
|
+
res.error.code === "ETIMEDOUT";
|
|
103
|
+
return {
|
|
104
|
+
status: res.status,
|
|
105
|
+
stdout: res.stdout ?? "",
|
|
106
|
+
stderr: res.stderr ?? "",
|
|
107
|
+
timedOut,
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
/** SQLite corruption signature qmd surfaces when the vector store is damaged. */
|
|
111
|
+
const CORRUPTION_SIGNATURE = /SQLITE_CORRUPT|database disk image is malformed/i;
|
|
112
|
+
/** True if a qmd result reports SQLite corruption on stdout or stderr. */
|
|
113
|
+
export function looksCorrupt(r) {
|
|
114
|
+
return CORRUPTION_SIGNATURE.test(`${r.stdout ?? ""}\n${r.stderr ?? ""}`);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* How long a lock file may sit before a new acquirer treats it as abandoned and
|
|
118
|
+
* reclaims it, even if its recorded PID can't be probed (e.g. a different user,
|
|
119
|
+
* or a torn/empty file). Backstops the PID-liveness check for the crash case.
|
|
120
|
+
*/
|
|
121
|
+
const DEFAULT_LOCK_STALE_MS = 30 * 60_000;
|
|
122
|
+
function reindexLockStaleMs(env = process.env) {
|
|
123
|
+
const raw = env.HQ_QMD_LOCK_STALE_MS;
|
|
124
|
+
if (raw !== undefined && raw !== "") {
|
|
125
|
+
const n = Number(raw);
|
|
126
|
+
if (Number.isFinite(n) && n >= 0)
|
|
127
|
+
return Math.round(n);
|
|
128
|
+
}
|
|
129
|
+
return DEFAULT_LOCK_STALE_MS;
|
|
130
|
+
}
|
|
131
|
+
const NOOP_LOCK = { release() { } };
|
|
132
|
+
// Track locks this process holds so a clean exit/signal removes them; a crash is
|
|
133
|
+
// covered by the stale/PID reclaim path in the acquirer.
|
|
134
|
+
const heldReindexLocks = new Set();
|
|
135
|
+
let reindexExitHookInstalled = false;
|
|
136
|
+
function installReindexExitHookOnce() {
|
|
137
|
+
if (reindexExitHookInstalled)
|
|
138
|
+
return;
|
|
139
|
+
reindexExitHookInstalled = true;
|
|
140
|
+
process.on("exit", () => {
|
|
141
|
+
for (const p of heldReindexLocks)
|
|
142
|
+
unlinkIfOwned(p);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/** Is `pid` a live process? ESRCH → dead; EPERM/other → conservatively alive. */
|
|
146
|
+
function pidAlive(pid) {
|
|
147
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
148
|
+
return false;
|
|
149
|
+
try {
|
|
150
|
+
process.kill(pid, 0);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return err?.code !== "ESRCH";
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Unlink `lockPath` only if it still records THIS process as the holder. */
|
|
158
|
+
function unlinkIfOwned(lockPath) {
|
|
159
|
+
try {
|
|
160
|
+
const info = JSON.parse(fs.readFileSync(lockPath, "utf8"));
|
|
161
|
+
if (info?.pid !== process.pid)
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Unreadable/torn/already-gone — don't risk clobbering another holder.
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
fs.unlinkSync(lockPath);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
/* already gone — fine */
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* If the lock at `lockPath` is held by a dead PID or is older than the stale
|
|
177
|
+
* bound, unlink it so the caller can retry. Returns true when it reclaimed (or
|
|
178
|
+
* the lock vanished mid-check), false when a live, fresh holder still owns it.
|
|
179
|
+
*/
|
|
180
|
+
function reclaimReindexLockIfStale(lockPath) {
|
|
181
|
+
let st;
|
|
182
|
+
try {
|
|
183
|
+
st = fs.statSync(lockPath);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Vanished between EEXIST and stat → the holder released; let caller retry.
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
let holderPid = 0;
|
|
190
|
+
try {
|
|
191
|
+
const info = JSON.parse(fs.readFileSync(lockPath, "utf8"));
|
|
192
|
+
if (typeof info?.pid === "number")
|
|
193
|
+
holderPid = info.pid;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
/* torn/empty lock — fall through to the staleness check */
|
|
197
|
+
}
|
|
198
|
+
const dead = holderPid > 0 && !pidAlive(holderPid);
|
|
199
|
+
const stale = Date.now() - st.mtimeMs > reindexLockStaleMs();
|
|
200
|
+
if (dead || stale) {
|
|
201
|
+
try {
|
|
202
|
+
fs.unlinkSync(lockPath);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Someone else reclaimed it first; the next create attempt re-evaluates.
|
|
206
|
+
}
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
const defaultAcquireReindexLock = (lockPath) => {
|
|
212
|
+
// Escape hatch: a caller that manages exclusion itself can disable the lock.
|
|
213
|
+
if (process.env.HQ_QMD_REINDEX_LOCK === "0")
|
|
214
|
+
return NOOP_LOCK;
|
|
215
|
+
const payload = JSON.stringify({
|
|
216
|
+
pid: process.pid,
|
|
217
|
+
startedAt: new Date().toISOString(),
|
|
218
|
+
command: "hq-cloud qmd-reindex",
|
|
37
219
|
});
|
|
38
|
-
|
|
220
|
+
// At most one reclaim + one retry: acquire, or (if stale) reclaim then retry.
|
|
221
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
222
|
+
try {
|
|
223
|
+
fs.mkdirSync(path.dirname(lockPath), { recursive: true });
|
|
224
|
+
const fd = fs.openSync(lockPath, "wx", 0o600);
|
|
225
|
+
try {
|
|
226
|
+
fs.writeSync(fd, payload);
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
fs.closeSync(fd);
|
|
230
|
+
}
|
|
231
|
+
heldReindexLocks.add(lockPath);
|
|
232
|
+
installReindexExitHookOnce();
|
|
233
|
+
return {
|
|
234
|
+
release() {
|
|
235
|
+
heldReindexLocks.delete(lockPath);
|
|
236
|
+
unlinkIfOwned(lockPath);
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
if (err?.code !== "EEXIST") {
|
|
242
|
+
// The `.qmd` dir isn't writable (unusual — it holds the DB). Fail OPEN
|
|
243
|
+
// rather than block the reindex on an infra problem: proceed without the
|
|
244
|
+
// advisory lock. The corruption guard below is the remaining backstop.
|
|
245
|
+
return NOOP_LOCK;
|
|
246
|
+
}
|
|
247
|
+
// Held. Reclaim iff the holder is dead/stale, then retry once.
|
|
248
|
+
if (reclaimReindexLockIfStale(lockPath))
|
|
249
|
+
continue;
|
|
250
|
+
return null; // live, fresh holder → skip this cycle
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
39
254
|
};
|
|
255
|
+
const CORRUPTIBLE_DB_FILES = ["index.sqlite", "index.sqlite-wal", "index.sqlite-shm"];
|
|
256
|
+
const defaultQuarantineCorruptIndex = (qmdDir, tsSuffix) => {
|
|
257
|
+
let movedBase = null;
|
|
258
|
+
for (const name of CORRUPTIBLE_DB_FILES) {
|
|
259
|
+
const src = path.join(qmdDir, name);
|
|
260
|
+
try {
|
|
261
|
+
if (!fs.existsSync(src))
|
|
262
|
+
continue;
|
|
263
|
+
const dest = `${src}.corrupt-${tsSuffix}`;
|
|
264
|
+
fs.renameSync(src, dest);
|
|
265
|
+
if (name === "index.sqlite")
|
|
266
|
+
movedBase = dest;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Best-effort: move what we can. A file we can't move is left in place;
|
|
270
|
+
// the corruption guard still prevents further writes this cycle.
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return movedBase;
|
|
274
|
+
};
|
|
275
|
+
/** Filesystem-safe timestamp suffix for a quarantined DB file. */
|
|
276
|
+
function quarantineSuffix(nowMs) {
|
|
277
|
+
return new Date(nowMs).toISOString().replace(/[:.]/g, "-");
|
|
278
|
+
}
|
|
40
279
|
const DEFAULT_CHANGED_PATH_DEBOUNCE_MS = 60_000;
|
|
41
280
|
/**
|
|
42
281
|
* Reindex qmd for an HQ tree after a sync. Never throws — all failures are
|
|
@@ -47,12 +286,17 @@ const DEFAULT_CHANGED_PATH_DEBOUNCE_MS = 60_000;
|
|
|
47
286
|
export function reindexAfterSync(hqRoot, opts = {}) {
|
|
48
287
|
const exec = opts.exec ?? defaultExec;
|
|
49
288
|
const existsSync = opts.existsSync ?? fs.existsSync;
|
|
289
|
+
const acquireLock = opts.acquireReindexLock ?? defaultAcquireReindexLock;
|
|
290
|
+
const quarantine = opts.quarantineCorruptIndex ?? defaultQuarantineCorruptIndex;
|
|
50
291
|
const result = {
|
|
51
292
|
qmdAvailable: false,
|
|
52
293
|
collectionsAdded: [],
|
|
53
294
|
updated: false,
|
|
54
295
|
embedded: false,
|
|
55
296
|
pendingDirty: false,
|
|
297
|
+
lockBusy: false,
|
|
298
|
+
timedOut: false,
|
|
299
|
+
corruptionQuarantined: false,
|
|
56
300
|
};
|
|
57
301
|
try {
|
|
58
302
|
// Guard: only operate on a real HQ tree.
|
|
@@ -70,73 +314,106 @@ export function reindexAfterSync(hqRoot, opts = {}) {
|
|
|
70
314
|
if (!dirtyFromChanges && !registrationMayBeStale && !pendingDirty) {
|
|
71
315
|
return result;
|
|
72
316
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const hasMd = (opts.hasIndexableMarkdown ?? defaultHasIndexableMarkdown)(knowledgeDir);
|
|
89
|
-
if (!hasMd)
|
|
90
|
-
continue;
|
|
91
|
-
// Already registered? qmd collection URIs look like `qmd://<slug>/`.
|
|
92
|
-
if (existingCollections.includes(`qmd://${slug}/`))
|
|
93
|
-
continue;
|
|
94
|
-
const add = exec(["collection", "add", knowledgeDir, "--name", slug, "--mask", "**/*.md"]);
|
|
95
|
-
if (add.status === 0) {
|
|
96
|
-
exec(["context", "add", `qmd://${slug}`, `Knowledge base for ${slug}.`]);
|
|
97
|
-
result.collectionsAdded.push(slug);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
317
|
+
const nowMs = opts.nowMs ?? Date.now();
|
|
318
|
+
const pendingSinceMs = pendingDirty && typeof state.pendingSinceMs === "number"
|
|
319
|
+
? state.pendingSinceMs
|
|
320
|
+
: nowMs;
|
|
321
|
+
// Serialize qmd writers. If another writer (this runner from a prior cycle,
|
|
322
|
+
// or an interactive session's qmd maintenance) holds the lock, SKIP this
|
|
323
|
+
// cycle and mark the tree dirty so the next sync retries — never write onto
|
|
324
|
+
// the vector store concurrently (feedback_b9a369ff).
|
|
325
|
+
const lockPath = path.join(hqRoot, ".qmd", ".reindex.lock");
|
|
326
|
+
const lock = acquireLock(lockPath);
|
|
327
|
+
if (!lock) {
|
|
328
|
+
writeState(statePath, { ...state, pendingDirty: true, pendingSinceMs });
|
|
329
|
+
result.lockBusy = true;
|
|
330
|
+
result.pendingDirty = true;
|
|
331
|
+
return result;
|
|
100
332
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (debounceMs > 0 && nowMs - pendingSinceMs < debounceMs) {
|
|
111
|
-
writeState(statePath, {
|
|
112
|
-
...state,
|
|
113
|
-
pendingDirty: true,
|
|
114
|
-
pendingSinceMs,
|
|
115
|
-
});
|
|
116
|
-
result.pendingDirty = true;
|
|
333
|
+
try {
|
|
334
|
+
// Guard: qmd must be installed. `qmd collection list` doubles as the
|
|
335
|
+
// availability probe AND the source for which collections already exist.
|
|
336
|
+
const list = exec(["collection", "list"]);
|
|
337
|
+
if (list.status !== 0)
|
|
338
|
+
return result; // qmd absent or errored — no-op
|
|
339
|
+
// An already-corrupt store can surface here even on the lexical side.
|
|
340
|
+
if (looksCorrupt(list)) {
|
|
341
|
+
handleCorruption(hqRoot, statePath, state, pendingSinceMs, nowMs, quarantine, result);
|
|
117
342
|
return result;
|
|
118
343
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
344
|
+
result.qmdAvailable = true;
|
|
345
|
+
const existingCollections = list.stdout;
|
|
346
|
+
// 1. Auto-register missing company knowledge collections.
|
|
347
|
+
if (registrationMayBeStale) {
|
|
348
|
+
const companiesDir = path.join(hqRoot, "companies");
|
|
349
|
+
const slugs = (opts.readCompanies ?? defaultReadCompanies)(companiesDir);
|
|
350
|
+
for (const slug of slugs) {
|
|
351
|
+
const knowledgeDir = path.join(companiesDir, slug, "knowledge");
|
|
352
|
+
if (!existsSync(knowledgeDir))
|
|
353
|
+
continue;
|
|
354
|
+
const hasMd = (opts.hasIndexableMarkdown ?? defaultHasIndexableMarkdown)(knowledgeDir);
|
|
355
|
+
if (!hasMd)
|
|
356
|
+
continue;
|
|
357
|
+
// Already registered? qmd collection URIs look like `qmd://<slug>/`.
|
|
358
|
+
if (existingCollections.includes(`qmd://${slug}/`))
|
|
359
|
+
continue;
|
|
360
|
+
const add = exec(["collection", "add", knowledgeDir, "--name", slug, "--mask", "**/*.md"]);
|
|
361
|
+
if (add.status === 0) {
|
|
362
|
+
exec(["context", "add", `qmd://${slug}`, `Knowledge base for ${slug}.`]);
|
|
363
|
+
result.collectionsAdded.push(slug);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
126
366
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
367
|
+
// 2. Incremental lexical reindex.
|
|
368
|
+
const shouldUpdate = dirtyFromChanges || pendingDirty;
|
|
369
|
+
if (shouldUpdate) {
|
|
370
|
+
const debounceMs = opts.debounceMs ??
|
|
371
|
+
(changedPaths === undefined ? 0 : DEFAULT_CHANGED_PATH_DEBOUNCE_MS);
|
|
372
|
+
if (debounceMs > 0 && nowMs - pendingSinceMs < debounceMs) {
|
|
373
|
+
writeState(statePath, { ...state, pendingDirty: true, pendingSinceMs });
|
|
374
|
+
result.pendingDirty = true;
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
const update = exec(["update"]);
|
|
378
|
+
if (looksCorrupt(update)) {
|
|
379
|
+
handleCorruption(hqRoot, statePath, state, pendingSinceMs, nowMs, quarantine, result);
|
|
380
|
+
return result;
|
|
381
|
+
}
|
|
382
|
+
if (update.timedOut) {
|
|
383
|
+
// Aborted mid-pass by the timeout. Do NOT treat as done and do NOT
|
|
384
|
+
// proceed to embed — mark dirty and retry cleanly next cycle.
|
|
385
|
+
writeState(statePath, { ...state, pendingDirty: true, pendingSinceMs });
|
|
386
|
+
result.timedOut = true;
|
|
387
|
+
result.pendingDirty = true;
|
|
388
|
+
return result;
|
|
389
|
+
}
|
|
390
|
+
result.updated = update.status === 0;
|
|
391
|
+
if (result.updated) {
|
|
392
|
+
writeState(statePath, { pendingDirty: false, lastSuccessMs: nowMs });
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
writeState(statePath, { ...state, pendingDirty: true, pendingSinceMs });
|
|
396
|
+
result.pendingDirty = true;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// 3. Embeddings only on explicit request.
|
|
400
|
+
if (opts.embed) {
|
|
401
|
+
const embed = exec(["embed"]);
|
|
402
|
+
if (looksCorrupt(embed)) {
|
|
403
|
+
handleCorruption(hqRoot, statePath, state, pendingSinceMs, nowMs, quarantine, result);
|
|
404
|
+
return result;
|
|
405
|
+
}
|
|
406
|
+
if (embed.timedOut) {
|
|
407
|
+
writeState(statePath, { ...state, pendingDirty: true, pendingSinceMs });
|
|
408
|
+
result.timedOut = true;
|
|
409
|
+
result.pendingDirty = true;
|
|
410
|
+
return result;
|
|
411
|
+
}
|
|
412
|
+
result.embedded = embed.status === 0;
|
|
134
413
|
}
|
|
135
414
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const embed = exec(["embed"]);
|
|
139
|
-
result.embedded = embed.status === 0;
|
|
415
|
+
finally {
|
|
416
|
+
lock.release();
|
|
140
417
|
}
|
|
141
418
|
}
|
|
142
419
|
catch (err) {
|
|
@@ -155,6 +432,18 @@ export function reindexAfterSync(hqRoot, opts = {}) {
|
|
|
155
432
|
}
|
|
156
433
|
return result;
|
|
157
434
|
}
|
|
435
|
+
/**
|
|
436
|
+
* Quarantine the corrupt DB aside and mark the tree dirty so the NEXT cycle
|
|
437
|
+
* rebuilds from scratch under the lock, instead of writing further onto an
|
|
438
|
+
* already-damaged vector store. Mutates `result` in place.
|
|
439
|
+
*/
|
|
440
|
+
function handleCorruption(hqRoot, statePath, state, pendingSinceMs, nowMs, quarantine, result) {
|
|
441
|
+
const qmdDir = path.join(hqRoot, ".qmd");
|
|
442
|
+
quarantine(qmdDir, quarantineSuffix(nowMs));
|
|
443
|
+
writeState(statePath, { ...state, pendingDirty: true, pendingSinceMs });
|
|
444
|
+
result.corruptionQuarantined = true;
|
|
445
|
+
result.pendingDirty = true;
|
|
446
|
+
}
|
|
158
447
|
function readState(statePath) {
|
|
159
448
|
try {
|
|
160
449
|
return JSON.parse(fs.readFileSync(statePath, "utf8"));
|
package/dist/qmd-reindex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qmd-reindex.js","sourceRoot":"","sources":["../src/qmd-reindex.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qmd-reindex.js","sourceRoot":"","sources":["../src/qmd-reindex.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
* fake `exec` that records the calls and returns canned results — no real qmd
|
|
6
6
|
* is invoked. We assert on the *sequence of qmd commands* the function would
|
|
7
7
|
* run, which is the contract that keeps a teammate's index fresh after sync.
|
|
8
|
+
*
|
|
9
|
+
* The corruption-safety tests (lock serialization, timeout-kill handling, and
|
|
10
|
+
* SQLITE_CORRUPT quarantine) pin the fix for feedback_b9a369ff — the post-sync
|
|
11
|
+
* reindex racing an interactive qmd writer and corrupting the vector store.
|
|
8
12
|
*/
|
|
9
13
|
export {};
|
|
10
14
|
//# sourceMappingURL=qmd-reindex.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qmd-reindex.test.d.ts","sourceRoot":"","sources":["../src/qmd-reindex.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"qmd-reindex.test.d.ts","sourceRoot":"","sources":["../src/qmd-reindex.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|