@indigoai-us/hq-cloud 6.14.44 → 6.14.45
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/dist/watch-roots.d.ts +72 -0
- package/dist/watch-roots.d.ts.map +1 -0
- package/dist/watch-roots.js +115 -0
- package/dist/watch-roots.js.map +1 -0
- package/dist/watch-roots.test.d.ts +18 -0
- package/dist/watch-roots.test.d.ts.map +1 -0
- package/dist/watch-roots.test.js +236 -0
- package/dist/watch-roots.test.js.map +1 -0
- package/dist/watcher-event-gate.test.d.ts +16 -0
- package/dist/watcher-event-gate.test.d.ts.map +1 -0
- package/dist/watcher-event-gate.test.js +191 -0
- package/dist/watcher-event-gate.test.js.map +1 -0
- package/dist/watcher.d.ts +21 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +312 -54
- package/dist/watcher.js.map +1 -1
- package/package.json +1 -1
- package/src/watch-roots.test.ts +278 -0
- package/src/watch-roots.ts +162 -0
- package/src/watcher-event-gate.test.ts +212 -0
- package/src/watcher.ts +363 -65
- package/test/e2e/watcher-scoped-coverage.test.ts +381 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The emit filter must run BEFORE handleEvent pays for a stat.
|
|
3
|
+
*
|
|
4
|
+
* The recursive backend hands every OS event to handleEvent, and a `rename`
|
|
5
|
+
* used to be lstat'd before the exclusion filter was consulted. On a real HQ
|
|
6
|
+
* that is one synchronous syscall for every file touched anywhere under
|
|
7
|
+
* `repos/` or `workspace/worktrees/` — build, install, and checkout churn the
|
|
8
|
+
* watcher immediately throws away. Scoped watch roots (see watch-roots.ts) keep
|
|
9
|
+
* most of that traffic from being delivered at all; this gate makes whatever
|
|
10
|
+
* still arrives cost a string compare instead of a syscall.
|
|
11
|
+
*
|
|
12
|
+
* This lives in its own file because it mocks `fs` module-wide, which would
|
|
13
|
+
* otherwise perturb the 53 tests in watcher.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
import * as os from "os";
|
|
16
|
+
import * as path from "path";
|
|
17
|
+
import { describe, expect, it, vi } from "vitest";
|
|
18
|
+
const { lstatCalls } = vi.hoisted(() => ({ lstatCalls: vi.fn() }));
|
|
19
|
+
vi.mock("fs", async (importOriginal) => {
|
|
20
|
+
const actual = await importOriginal();
|
|
21
|
+
return {
|
|
22
|
+
...actual,
|
|
23
|
+
lstatSync: (...args) => {
|
|
24
|
+
lstatCalls(...args);
|
|
25
|
+
return actual.lstatSync(...args);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
const { FakeClock, TreeWatcher } = await import("./watcher.js");
|
|
30
|
+
const hqRoot = path.join(os.tmpdir(), "hqcloud-event-gate-root");
|
|
31
|
+
/** Everything under `repos/` is out of scope, as file AND as directory. */
|
|
32
|
+
const outOfScope = (abs) => !abs.split(path.sep).includes("repos");
|
|
33
|
+
function makeWatcher() {
|
|
34
|
+
return new TreeWatcher({
|
|
35
|
+
hqRoot,
|
|
36
|
+
clock: new FakeClock(),
|
|
37
|
+
debounceMs: 100,
|
|
38
|
+
pathFilter: outOfScope,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
describe("TreeWatcher.handleEvent — an excluded path costs no syscall", () => {
|
|
42
|
+
it("does NOT stat an out-of-scope rename before dropping it", () => {
|
|
43
|
+
const watcher = makeWatcher();
|
|
44
|
+
lstatCalls.mockClear();
|
|
45
|
+
try {
|
|
46
|
+
watcher.handleEvent(path.join(hqRoot, "repos", "hq-cloud", "src", "a.ts"), "rename");
|
|
47
|
+
expect(lstatCalls).not.toHaveBeenCalled();
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
watcher.dispose();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it("still stats an in-scope rename, so kind classification is unchanged", () => {
|
|
54
|
+
const watcher = makeWatcher();
|
|
55
|
+
lstatCalls.mockClear();
|
|
56
|
+
try {
|
|
57
|
+
watcher.handleEvent(path.join(hqRoot, "companies", "acme", "note.md"), "rename");
|
|
58
|
+
expect(lstatCalls).toHaveBeenCalled();
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
watcher.dispose();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
it("skips its own seed walk when the backend already indexed directories", async () => {
|
|
65
|
+
// The scoped backend indexes every in-scope directory while planning its
|
|
66
|
+
// watch roots. TreeWatcher must NOT then walk the same tree again — on a
|
|
67
|
+
// real HQ root that walk is ~3.6s, and doing it twice per runner start was
|
|
68
|
+
// a straight doubling of startup cost for an identical index.
|
|
69
|
+
const fsp = await import("node:fs/promises");
|
|
70
|
+
const realRoot = await fsp.mkdtemp(path.join(os.tmpdir(), "hqcloud-seed-fusion-"));
|
|
71
|
+
try {
|
|
72
|
+
await fsp.mkdir(path.join(realRoot, "companies", "acme", "knowledge"), {
|
|
73
|
+
recursive: true,
|
|
74
|
+
});
|
|
75
|
+
const watcher = new TreeWatcher({
|
|
76
|
+
hqRoot: realRoot,
|
|
77
|
+
clock: new FakeClock(),
|
|
78
|
+
pathFilter: () => true,
|
|
79
|
+
backendFactory: (opts) => {
|
|
80
|
+
opts.onDirectorySeen?.(path.join(realRoot, "companies"));
|
|
81
|
+
return {
|
|
82
|
+
close: () => { },
|
|
83
|
+
needsKnownKinds: true,
|
|
84
|
+
seededKnownKinds: true,
|
|
85
|
+
watchedPathCount: () => 1,
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
watcher.start();
|
|
90
|
+
// Exactly the one directory the backend reported — not the three that a
|
|
91
|
+
// second full walk of this tree would have found.
|
|
92
|
+
expect(watcher.knownDirectoryCount()).toBe(1);
|
|
93
|
+
watcher.dispose();
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
await fsp.rm(realRoot, { recursive: true, force: true });
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
it("still walks itself when the backend did NOT index directories", async () => {
|
|
100
|
+
const fsp = await import("node:fs/promises");
|
|
101
|
+
const realRoot = await fsp.mkdtemp(path.join(os.tmpdir(), "hqcloud-seed-legacy-"));
|
|
102
|
+
try {
|
|
103
|
+
await fsp.mkdir(path.join(realRoot, "companies", "acme", "knowledge"), {
|
|
104
|
+
recursive: true,
|
|
105
|
+
});
|
|
106
|
+
const watcher = new TreeWatcher({
|
|
107
|
+
hqRoot: realRoot,
|
|
108
|
+
clock: new FakeClock(),
|
|
109
|
+
pathFilter: () => true,
|
|
110
|
+
backendFactory: () => ({
|
|
111
|
+
close: () => { },
|
|
112
|
+
needsKnownKinds: true,
|
|
113
|
+
watchedPathCount: () => 1,
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
watcher.start();
|
|
117
|
+
expect(watcher.knownDirectoryCount()).toBe(3);
|
|
118
|
+
watcher.dispose();
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await fsp.rm(realRoot, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
it("does not let a duplicate delete downgrade unlinkDir to unlink", () => {
|
|
125
|
+
// One path can reach handleEvent twice when two watches overlap (the
|
|
126
|
+
// scoped backend briefly runs its bootstrap watch alongside the planned
|
|
127
|
+
// ones so in-flight events are not dropped). The first unlinkDir clears
|
|
128
|
+
// the path's known-kind hint, so without this guard the duplicate lands as
|
|
129
|
+
// a plain `unlink` — narrowing the deletion scope the vault applies and
|
|
130
|
+
// discarding the captured descendant snapshots.
|
|
131
|
+
const clock = new FakeClock();
|
|
132
|
+
const w = new TreeWatcher({
|
|
133
|
+
hqRoot,
|
|
134
|
+
clock,
|
|
135
|
+
debounceMs: 100,
|
|
136
|
+
pathFilter: () => true,
|
|
137
|
+
captureLocalDeleteSnapshots: (relativePath, kind) => kind === "unlinkDir"
|
|
138
|
+
? [
|
|
139
|
+
{
|
|
140
|
+
journalSlug: "acme",
|
|
141
|
+
journalPath: `${relativePath}/child.md`,
|
|
142
|
+
absolutePath: path.join(hqRoot, relativePath, "child.md"),
|
|
143
|
+
remoteEtag: "etag",
|
|
144
|
+
localHash: "hash",
|
|
145
|
+
localKind: "file",
|
|
146
|
+
},
|
|
147
|
+
]
|
|
148
|
+
: [],
|
|
149
|
+
});
|
|
150
|
+
const batches = [];
|
|
151
|
+
w.onChange((_first, batch) => batches.push(batch?.changes));
|
|
152
|
+
try {
|
|
153
|
+
const dir = path.join(hqRoot, "companies", "acme", "moved");
|
|
154
|
+
w.handleEvent(dir, "unlinkDir");
|
|
155
|
+
w.handleEvent(dir, "unlink"); // duplicate delivery of the same delete
|
|
156
|
+
clock.advance(200);
|
|
157
|
+
const change = batches[0]?.get(dir);
|
|
158
|
+
expect(change?.kind).toBe("unlinkDir");
|
|
159
|
+
expect(change?.deleteSnapshots).toHaveLength(1);
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
w.dispose();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
it("keeps emitting in-scope changes after the gate", () => {
|
|
166
|
+
const watcher = makeWatcher();
|
|
167
|
+
const clock = new FakeClock();
|
|
168
|
+
const w = new TreeWatcher({
|
|
169
|
+
hqRoot,
|
|
170
|
+
clock,
|
|
171
|
+
debounceMs: 100,
|
|
172
|
+
pathFilter: outOfScope,
|
|
173
|
+
});
|
|
174
|
+
watcher.dispose();
|
|
175
|
+
const rels = [];
|
|
176
|
+
w.onChange((_first, batch) => {
|
|
177
|
+
if (batch)
|
|
178
|
+
rels.push(...batch.paths.values());
|
|
179
|
+
});
|
|
180
|
+
try {
|
|
181
|
+
w.handleEvent(path.join(hqRoot, "companies", "acme", "note.md"), "change");
|
|
182
|
+
w.handleEvent(path.join(hqRoot, "repos", "x", "code.ts"), "change");
|
|
183
|
+
clock.advance(200);
|
|
184
|
+
expect(rels).toEqual(["companies/acme/note.md"]);
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
w.dispose();
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=watcher-event-gate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher-event-gate.test.js","sourceRoot":"","sources":["../src/watcher-event-gate.test.ts"],"names":[],"mappings":"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"}
|
package/dist/watcher.d.ts
CHANGED
|
@@ -143,6 +143,12 @@ export interface WatchBackend {
|
|
|
143
143
|
close(): void;
|
|
144
144
|
/** Native recursive watches need rename-kind state; chokidar does not. */
|
|
145
145
|
needsKnownKinds: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* True when the backend already populated those known kinds through
|
|
148
|
+
* `onDirectorySeen` while planning its watch roots, so {@link TreeWatcher}
|
|
149
|
+
* must NOT walk the tree a second time to seed them.
|
|
150
|
+
*/
|
|
151
|
+
seededKnownKinds?: boolean;
|
|
146
152
|
/** Directories/OS handles admitted by this backend so degradation is auditable. */
|
|
147
153
|
watchedPathCount(): number;
|
|
148
154
|
}
|
|
@@ -162,6 +168,11 @@ export interface TreeWatchBackendOptions {
|
|
|
162
168
|
onError: (err: unknown) => void;
|
|
163
169
|
maxWatchedPaths: number;
|
|
164
170
|
onWatchBudgetExceeded: (info: TreeWatcherWatchBudgetExceeded) => void;
|
|
171
|
+
/**
|
|
172
|
+
* Reports every in-scope directory a backend encounters while planning its
|
|
173
|
+
* watch roots, so the known-kinds index can be built in that same pass.
|
|
174
|
+
*/
|
|
175
|
+
onDirectorySeen?: (absolutePath: string) => void;
|
|
165
176
|
}
|
|
166
177
|
export type TreeWatchBackendFactory = (opts: TreeWatchBackendOptions) => WatchBackend;
|
|
167
178
|
export type TreeChangeKind = "add" | "change" | "unlink" | "addDir" | "unlinkDir";
|
|
@@ -181,6 +192,16 @@ export interface TreeChange {
|
|
|
181
192
|
deleteSnapshots?: LocalDeleteSnapshot[];
|
|
182
193
|
}
|
|
183
194
|
type BackendChangeKind = TreeChangeKind | "rename";
|
|
195
|
+
export interface ScopedWatchBackend extends WatchBackend {
|
|
196
|
+
/**
|
|
197
|
+
* Planned watches that could not be attached during the initial plan. Any
|
|
198
|
+
* failure here means the scoped plan has a permanent hole, so the caller
|
|
199
|
+
* discards it and falls back to chokidar rather than running with partial
|
|
200
|
+
* coverage.
|
|
201
|
+
*/
|
|
202
|
+
attachFailures: number;
|
|
203
|
+
}
|
|
204
|
+
export declare function startScopedRecursiveWatch(hqRoot: string, shouldEmit: WatchPathFilter, onEvent: (absolutePath: string, kind: BackendChangeKind) => void, onError: (err: unknown) => void, onDirectorySeen?: (absolutePath: string) => void): ScopedWatchBackend;
|
|
184
205
|
/**
|
|
185
206
|
* Build the composite emit-decision predicate. Returns true when a change to
|
|
186
207
|
* `absolutePath` SHOULD wake the watcher (i.e. it survives every exclusion
|
package/dist/watcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
|