crewly 1.8.11 → 1.8.12
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/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +5 -4
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +17 -6
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +23 -3
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +109 -9
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +18 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +15 -4
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +22 -2
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +76 -3
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -28,6 +28,9 @@ import * as fs from 'fs/promises';
|
|
|
28
28
|
import { existsSync } from 'fs';
|
|
29
29
|
import { LoggerService } from '../core/logger.service.js';
|
|
30
30
|
import { WikiBookkeepService } from './wiki-bookkeep.service.js';
|
|
31
|
+
import { atomicWriteJson, safeReadJson, ensureDir } from '../../utils/file-io.utils.js';
|
|
32
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
33
|
+
const STATE_FILE_NAME = 'wiki-bookkeep-trigger-state.json';
|
|
31
34
|
const DEFAULT_INTERVAL_MS = 30 * 60 * 1000;
|
|
32
35
|
const DEFAULT_DEBOUNCE_MS = 6 * 3600 * 1000;
|
|
33
36
|
/**
|
|
@@ -103,10 +106,12 @@ export class WikiBookkeepTriggerService {
|
|
|
103
106
|
discoverRoots;
|
|
104
107
|
bookkeepService;
|
|
105
108
|
timer = null;
|
|
106
|
-
/** vaultPath → last
|
|
107
|
-
|
|
109
|
+
/** vaultPath → persisted baseline + last-fired state. */
|
|
110
|
+
state = new Map();
|
|
108
111
|
/** Per-vault locks so two overlapping ticks don't double-fire. */
|
|
109
112
|
inflight = new Set();
|
|
113
|
+
statePath;
|
|
114
|
+
stateLoaded = false;
|
|
110
115
|
constructor(opts) {
|
|
111
116
|
this.logger = LoggerService.getInstance().createComponentLogger('WikiBookkeepTrigger');
|
|
112
117
|
this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
@@ -114,6 +119,69 @@ export class WikiBookkeepTriggerService {
|
|
|
114
119
|
this.fireFn = opts.fireFn;
|
|
115
120
|
this.discoverRoots = opts.discoverRoots ?? discoverWikiVaults;
|
|
116
121
|
this.bookkeepService = opts.bookkeepService ?? WikiBookkeepService.getInstance();
|
|
122
|
+
if (opts.statePath === null) {
|
|
123
|
+
this.statePath = null;
|
|
124
|
+
}
|
|
125
|
+
else if (typeof opts.statePath === 'string') {
|
|
126
|
+
this.statePath = opts.statePath;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.statePath = path.join(getCrewlyHomePath(), STATE_FILE_NAME);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Load per-vault baseline + debounce state from disk (once). Without this,
|
|
134
|
+
* the in-memory ledger resets on every backend restart, so the next tick
|
|
135
|
+
* re-fires for every eligible vault — the "noise burst after a restart".
|
|
136
|
+
*/
|
|
137
|
+
async loadStateFromDisk() {
|
|
138
|
+
if (this.stateLoaded)
|
|
139
|
+
return;
|
|
140
|
+
this.stateLoaded = true;
|
|
141
|
+
if (!this.statePath)
|
|
142
|
+
return;
|
|
143
|
+
try {
|
|
144
|
+
const data = await safeReadJson(this.statePath, null);
|
|
145
|
+
if (data && typeof data === 'object') {
|
|
146
|
+
for (const [vault, entry] of Object.entries(data)) {
|
|
147
|
+
if (entry &&
|
|
148
|
+
typeof entry.baselineMdCount === 'number' &&
|
|
149
|
+
typeof entry.lastFiredAt === 'number') {
|
|
150
|
+
this.state.set(vault, entry);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
this.logger.info('WikiBookkeepTrigger loaded persisted state', {
|
|
154
|
+
statePath: this.statePath,
|
|
155
|
+
vaults: this.state.size,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
// A transient read error (e.g. EACCES) must not abort the tick — start
|
|
161
|
+
// with an empty ledger this run; a later tick re-establishes baselines.
|
|
162
|
+
this.logger.warn('WikiBookkeepTrigger: failed to load state (non-fatal)', {
|
|
163
|
+
statePath: this.statePath,
|
|
164
|
+
error: err.message,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Persist the per-vault state map (best-effort; failures are logged, not thrown). */
|
|
169
|
+
async saveStateToDisk() {
|
|
170
|
+
if (!this.statePath)
|
|
171
|
+
return;
|
|
172
|
+
try {
|
|
173
|
+
const payload = {};
|
|
174
|
+
for (const [vault, entry] of this.state)
|
|
175
|
+
payload[vault] = entry;
|
|
176
|
+
await ensureDir(path.dirname(this.statePath));
|
|
177
|
+
await atomicWriteJson(this.statePath, payload);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
this.logger.warn('WikiBookkeepTrigger: failed to persist state (non-fatal)', {
|
|
181
|
+
statePath: this.statePath,
|
|
182
|
+
error: err.message,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
117
185
|
}
|
|
118
186
|
static getInstance() {
|
|
119
187
|
return this.instance;
|
|
@@ -149,6 +217,7 @@ export class WikiBookkeepTriggerService {
|
|
|
149
217
|
* `/api/wiki/bookkeep/trigger-now` endpoint.
|
|
150
218
|
*/
|
|
151
219
|
async tick() {
|
|
220
|
+
await this.loadStateFromDisk();
|
|
152
221
|
const vaults = await this.discoverRoots();
|
|
153
222
|
const result = {
|
|
154
223
|
scanned: [...vaults],
|
|
@@ -156,12 +225,17 @@ export class WikiBookkeepTriggerService {
|
|
|
156
225
|
skippedByDebounce: [],
|
|
157
226
|
quietVaults: [],
|
|
158
227
|
};
|
|
228
|
+
let stateDirty = false;
|
|
159
229
|
for (const v of vaults) {
|
|
160
230
|
if (this.inflight.has(v))
|
|
161
231
|
continue;
|
|
162
232
|
this.inflight.add(v);
|
|
163
233
|
try {
|
|
164
|
-
const
|
|
234
|
+
const prior = this.state.get(v);
|
|
235
|
+
const outcome = await this.bookkeepService.generate({
|
|
236
|
+
vaultPath: v,
|
|
237
|
+
baselineMdCount: prior?.baselineMdCount,
|
|
238
|
+
});
|
|
165
239
|
if (!outcome.ok) {
|
|
166
240
|
this.logger.warn('WikiBookkeepTrigger: bookkeep failed for vault', {
|
|
167
241
|
vault: v,
|
|
@@ -169,22 +243,42 @@ export class WikiBookkeepTriggerService {
|
|
|
169
243
|
});
|
|
170
244
|
continue;
|
|
171
245
|
}
|
|
246
|
+
const total = outcome.report.totalMdCount;
|
|
247
|
+
// First sight of a vault: establish the baseline at the current count
|
|
248
|
+
// and DON'T fire. This is what stops a freshly-migrated vault (every
|
|
249
|
+
// file mtime-recent) from firing on its entire backlog — only pages
|
|
250
|
+
// added AFTER this point count toward the next threshold.
|
|
251
|
+
if (!prior) {
|
|
252
|
+
this.state.set(v, { baselineMdCount: total, lastFiredAt: 0 });
|
|
253
|
+
stateDirty = true;
|
|
254
|
+
result.quietVaults.push(v);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
// A vault that shrank (cleanup deleted pages) lowers the baseline so
|
|
258
|
+
// future adds are measured from the new floor — keep it persisted.
|
|
259
|
+
if (total < prior.baselineMdCount) {
|
|
260
|
+
prior.baselineMdCount = total;
|
|
261
|
+
stateDirty = true;
|
|
262
|
+
}
|
|
172
263
|
if (!outcome.report.shouldFire) {
|
|
173
264
|
result.quietVaults.push(v);
|
|
174
265
|
continue;
|
|
175
266
|
}
|
|
176
|
-
|
|
177
|
-
if (Date.now() - last < this.debounceMs) {
|
|
267
|
+
if (Date.now() - prior.lastFiredAt < this.debounceMs) {
|
|
178
268
|
result.skippedByDebounce.push(v);
|
|
179
269
|
continue;
|
|
180
270
|
}
|
|
181
|
-
|
|
271
|
+
// Fire, then advance the baseline to the current count so we don't
|
|
272
|
+
// re-fire until another `threshold` net-new pages accumulate.
|
|
273
|
+
prior.lastFiredAt = Date.now();
|
|
274
|
+
prior.baselineMdCount = total;
|
|
275
|
+
stateDirty = true;
|
|
182
276
|
try {
|
|
183
277
|
await this.fireFn(v, outcome.report);
|
|
184
278
|
result.fired.push(v);
|
|
185
279
|
this.logger.info('WikiBookkeepTrigger fired', {
|
|
186
280
|
vault: v,
|
|
187
|
-
|
|
281
|
+
netNewMd: outcome.report.netNewMdCount,
|
|
188
282
|
threshold: outcome.report.threshold,
|
|
189
283
|
duplicates: outcome.report.duplicateCandidates.length,
|
|
190
284
|
});
|
|
@@ -200,11 +294,17 @@ export class WikiBookkeepTriggerService {
|
|
|
200
294
|
this.inflight.delete(v);
|
|
201
295
|
}
|
|
202
296
|
}
|
|
297
|
+
if (stateDirty)
|
|
298
|
+
await this.saveStateToDisk();
|
|
203
299
|
return result;
|
|
204
300
|
}
|
|
205
|
-
/**
|
|
301
|
+
/**
|
|
302
|
+
* Test affordance: clear the in-memory baseline + debounce ledger. Leaves
|
|
303
|
+
* `stateLoaded` set so a subsequent `tick()` does NOT reload persisted state
|
|
304
|
+
* (which would undo the clear).
|
|
305
|
+
*/
|
|
206
306
|
_resetDebounceForTesting() {
|
|
207
|
-
this.
|
|
307
|
+
this.state.clear();
|
|
208
308
|
}
|
|
209
309
|
}
|
|
210
310
|
//# sourceMappingURL=wiki-bookkeep-trigger.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-bookkeep-trigger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep-trigger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAsB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-bookkeep-trigger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep-trigger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,17 @@ export interface WikiBookkeepInput {
|
|
|
30
30
|
windowDays?: number;
|
|
31
31
|
/** Md-count threshold used by `shouldFire` (default 10). */
|
|
32
32
|
threshold?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Total md count the caller last acted on for this vault (its persisted
|
|
35
|
+
* baseline / high-water mark). When provided, `shouldFire` is driven by
|
|
36
|
+
* NET-NEW pages since the baseline (`totalMdCount - baselineMdCount`)
|
|
37
|
+
* rather than by mtime-recency. This is the robust signal: an mtime
|
|
38
|
+
* window counts every file a bulk operation (e.g. a vault migration that
|
|
39
|
+
* writes 500 pages at once) just touched as "recent", so it fires forever;
|
|
40
|
+
* net-new only counts genuinely-added pages. Omit for a stateless report
|
|
41
|
+
* (falls back to the mtime-window `recentMdCount`).
|
|
42
|
+
*/
|
|
43
|
+
baselineMdCount?: number;
|
|
33
44
|
}
|
|
34
45
|
export interface WikiPageRef {
|
|
35
46
|
path: string;
|
|
@@ -55,8 +66,14 @@ export interface WikiBookkeepReport {
|
|
|
55
66
|
shouldFire: boolean;
|
|
56
67
|
/** Total md files under the vault (recursive). */
|
|
57
68
|
totalMdCount: number;
|
|
58
|
-
/** Newly created/touched mds within `windowDays
|
|
69
|
+
/** Newly created/touched mds within `windowDays` (mtime-based; informational). */
|
|
59
70
|
recentMdCount: number;
|
|
71
|
+
/**
|
|
72
|
+
* Net-new pages since the caller's baseline (`max(0, total - baseline)`).
|
|
73
|
+
* Equals `recentMdCount` when no baseline was supplied. This is what
|
|
74
|
+
* `shouldFire` is computed from.
|
|
75
|
+
*/
|
|
76
|
+
netNewMdCount: number;
|
|
60
77
|
/** Per-folder counts under llm-curated/<x>/. */
|
|
61
78
|
countsByFolder: Record<string, number>;
|
|
62
79
|
/** Likely-duplicate clusters by filename Jaccard. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-bookkeep.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-bookkeep.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qDAAqD;IACrD,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;IAC5C,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,qDAAqD;IACrD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAGvC,YAAY,CAAC,EAAE,mBAAmB,EAClC,KAAK,CAAC,EAAE,gBAAgB;IAO1B,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAKzC,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAoHxD,YAAY;IA2C1B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;CA8C7B"}
|
|
@@ -116,10 +116,18 @@ export class WikiBookkeepService {
|
|
|
116
116
|
}
|
|
117
117
|
const duplicateCandidates = this.findDuplicateClusters(pages);
|
|
118
118
|
const queueStats = await this.queue.getStats(input.vaultPath);
|
|
119
|
-
|
|
119
|
+
// Net-new is the robust fire signal. When a baseline is supplied, count
|
|
120
|
+
// only pages added since it; otherwise fall back to the mtime window.
|
|
121
|
+
// NOTE: duplicate clusters are surfaced in `recommendations` but no longer
|
|
122
|
+
// force `shouldFire` — a standing set of filename clusters is not "new
|
|
123
|
+
// activity", so OR-ing it in made every non-trivial vault fire forever.
|
|
124
|
+
const netNewMdCount = input.baselineMdCount != null
|
|
125
|
+
? Math.max(0, totalMdCount - input.baselineMdCount)
|
|
126
|
+
: recentMdCount;
|
|
127
|
+
const shouldFire = netNewMdCount >= threshold;
|
|
120
128
|
const recommendations = this.buildRecommendations({
|
|
121
129
|
shouldFire,
|
|
122
|
-
|
|
130
|
+
netNewMdCount,
|
|
123
131
|
threshold,
|
|
124
132
|
duplicates: duplicateCandidates,
|
|
125
133
|
countsByFolder,
|
|
@@ -138,6 +146,7 @@ export class WikiBookkeepService {
|
|
|
138
146
|
shouldFire,
|
|
139
147
|
totalMdCount,
|
|
140
148
|
recentMdCount,
|
|
149
|
+
netNewMdCount,
|
|
141
150
|
countsByFolder,
|
|
142
151
|
duplicateCandidates,
|
|
143
152
|
staleCount,
|
|
@@ -148,6 +157,8 @@ export class WikiBookkeepService {
|
|
|
148
157
|
vault: input.vaultPath,
|
|
149
158
|
totalMd: totalMdCount,
|
|
150
159
|
recentMd: recentMdCount,
|
|
160
|
+
netNewMd: netNewMdCount,
|
|
161
|
+
baseline: input.baselineMdCount ?? null,
|
|
151
162
|
duplicates: duplicateCandidates.length,
|
|
152
163
|
shouldFire,
|
|
153
164
|
});
|
|
@@ -271,10 +282,10 @@ export class WikiBookkeepService {
|
|
|
271
282
|
buildRecommendations(args) {
|
|
272
283
|
const recs = [];
|
|
273
284
|
if (!args.shouldFire) {
|
|
274
|
-
recs.push(`Quiet vault — only ${args.
|
|
285
|
+
recs.push(`Quiet vault — only ${args.netNewMdCount} net-new md(s) since the last pass (threshold ${args.threshold}). No action required.`);
|
|
275
286
|
}
|
|
276
287
|
else {
|
|
277
|
-
recs.push(
|
|
288
|
+
recs.push(`${args.netNewMdCount} net-new md(s) since the last pass — at or above threshold (${args.threshold}). Consider a consolidation pass.`);
|
|
278
289
|
}
|
|
279
290
|
if (args.duplicates.length > 0) {
|
|
280
291
|
recs.push(`${args.duplicates.length} likely-duplicate cluster(s) detected. Review each with your LLM and call wiki-ingest with a consolidated body when you can merge.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-bookkeep.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,iBAAiB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-bookkeep.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,13 @@ export interface WikiReflectTriggerOptions {
|
|
|
45
45
|
queueService?: WikiQueueService;
|
|
46
46
|
/** Optional time override (tests). */
|
|
47
47
|
now?: () => number;
|
|
48
|
+
/**
|
|
49
|
+
* Where to persist the per-vault debounce ledger. Defaults to
|
|
50
|
+
* `~/.crewly/wiki-reflect-trigger-state.json`. Pass `null` to disable
|
|
51
|
+
* persistence (tests). Without persistence the ledger resets on every
|
|
52
|
+
* restart, so the next tick re-fires for every idle vault at once.
|
|
53
|
+
*/
|
|
54
|
+
statePath?: string | null;
|
|
48
55
|
}
|
|
49
56
|
/**
|
|
50
57
|
* Reflect-trigger service. Start at boot, stop at shutdown.
|
|
@@ -64,7 +71,13 @@ export declare class WikiReflectTriggerService {
|
|
|
64
71
|
private readonly lastFiredAt;
|
|
65
72
|
/** Per-vault locks so overlapping ticks don't double-fire. */
|
|
66
73
|
private readonly inflight;
|
|
74
|
+
private readonly statePath;
|
|
75
|
+
private stateLoaded;
|
|
67
76
|
constructor(opts: WikiReflectTriggerOptions);
|
|
77
|
+
/** Load the persisted debounce ledger (once) so restarts don't re-burst. */
|
|
78
|
+
private loadStateFromDisk;
|
|
79
|
+
/** Persist the debounce ledger (best-effort; failures logged, not thrown). */
|
|
80
|
+
private saveStateToDisk;
|
|
68
81
|
static getInstance(): WikiReflectTriggerService | null;
|
|
69
82
|
static setInstance(next: WikiReflectTriggerService | null): void;
|
|
70
83
|
start(): void;
|
|
@@ -72,13 +85,20 @@ export declare class WikiReflectTriggerService {
|
|
|
72
85
|
/**
|
|
73
86
|
* Run one scan. Returns the per-vault outcome for observability + tests.
|
|
74
87
|
*/
|
|
75
|
-
tick(
|
|
88
|
+
tick(opts?: {
|
|
89
|
+
ignoreDebounce?: boolean;
|
|
90
|
+
}): Promise<{
|
|
76
91
|
scanned: string[];
|
|
77
92
|
fired: string[];
|
|
78
93
|
skippedByActivity: string[];
|
|
79
94
|
skippedByDebounce: string[];
|
|
80
95
|
}>;
|
|
81
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Test affordance — clear the in-memory debounce ledger. Leaves `stateLoaded`
|
|
98
|
+
* set so a subsequent `tick()` does NOT reload the persisted ledger (which
|
|
99
|
+
* would undo the clear). To force a real fire past debounce in production,
|
|
100
|
+
* use `tick({ ignoreDebounce: true })` instead of this.
|
|
101
|
+
*/
|
|
82
102
|
_resetDebounceForTesting(): void;
|
|
83
103
|
}
|
|
84
104
|
//# sourceMappingURL=wiki-reflect-trigger.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-reflect-trigger.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-reflect-trigger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"wiki-reflect-trigger.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-reflect-trigger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EACL,gBAAgB,EAEjB,MAAM,yBAAyB,CAAC;AAOjC,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEpF,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,MAAM,EAAE,iBAAiB,CAAC;IAC1B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAMD;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,KAAK,CAA+B;IAC5C,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,EAAE,yBAAyB;IAkB3C,4EAA4E;YAC9D,iBAAiB;IAyB/B,8EAA8E;YAChE,eAAe;IAe7B,MAAM,CAAC,WAAW,IAAI,yBAAyB,GAAG,IAAI;IAItD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,GAAG,IAAI;IAKhE,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QACvD,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IA2EF;;;;;OAKG;IACH,wBAAwB,IAAI,IAAI;CAGjC"}
|
|
@@ -18,9 +18,13 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @module services/wiki/wiki-reflect-trigger.service
|
|
20
20
|
*/
|
|
21
|
+
import * as path from 'path';
|
|
21
22
|
import { LoggerService } from '../core/logger.service.js';
|
|
22
23
|
import { WikiQueueService, } from './wiki-queue.service.js';
|
|
23
24
|
import { discoverWikiVaults } from './wiki-bookkeep-trigger.service.js';
|
|
25
|
+
import { atomicWriteJson, safeReadJson, ensureDir } from '../../utils/file-io.utils.js';
|
|
26
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
27
|
+
const STATE_FILE_NAME = 'wiki-reflect-trigger-state.json';
|
|
24
28
|
const DEFAULT_INTERVAL_MS = 60 * 60 * 1000;
|
|
25
29
|
const DEFAULT_QUIET_WINDOW_MS = 4 * 60 * 60 * 1000;
|
|
26
30
|
const DEFAULT_DEBOUNCE_MS = 4 * 60 * 60 * 1000;
|
|
@@ -42,6 +46,8 @@ export class WikiReflectTriggerService {
|
|
|
42
46
|
lastFiredAt = new Map();
|
|
43
47
|
/** Per-vault locks so overlapping ticks don't double-fire. */
|
|
44
48
|
inflight = new Set();
|
|
49
|
+
statePath;
|
|
50
|
+
stateLoaded = false;
|
|
45
51
|
constructor(opts) {
|
|
46
52
|
this.logger = LoggerService.getInstance().createComponentLogger('WikiReflectTrigger');
|
|
47
53
|
this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
@@ -51,6 +57,62 @@ export class WikiReflectTriggerService {
|
|
|
51
57
|
this.discoverRoots = opts.discoverRoots ?? discoverWikiVaults;
|
|
52
58
|
this.queueService = opts.queueService ?? WikiQueueService.getInstance();
|
|
53
59
|
this.nowFn = opts.now ?? (() => Date.now());
|
|
60
|
+
if (opts.statePath === null) {
|
|
61
|
+
this.statePath = null;
|
|
62
|
+
}
|
|
63
|
+
else if (typeof opts.statePath === 'string') {
|
|
64
|
+
this.statePath = opts.statePath;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.statePath = path.join(getCrewlyHomePath(), STATE_FILE_NAME);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Load the persisted debounce ledger (once) so restarts don't re-burst. */
|
|
71
|
+
async loadStateFromDisk() {
|
|
72
|
+
if (this.stateLoaded)
|
|
73
|
+
return;
|
|
74
|
+
this.stateLoaded = true;
|
|
75
|
+
if (!this.statePath)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
const data = await safeReadJson(this.statePath, null);
|
|
79
|
+
if (data && typeof data === 'object') {
|
|
80
|
+
for (const [vault, ts] of Object.entries(data)) {
|
|
81
|
+
if (typeof ts === 'number')
|
|
82
|
+
this.lastFiredAt.set(vault, ts);
|
|
83
|
+
}
|
|
84
|
+
this.logger.info('WikiReflectTrigger loaded persisted state', {
|
|
85
|
+
statePath: this.statePath,
|
|
86
|
+
vaults: this.lastFiredAt.size,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// A transient read error must not abort the tick — proceed with an empty
|
|
92
|
+
// ledger this run (worst case: one extra fire, then it re-persists).
|
|
93
|
+
this.logger.warn('WikiReflectTrigger: failed to load state (non-fatal)', {
|
|
94
|
+
statePath: this.statePath,
|
|
95
|
+
error: err.message,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Persist the debounce ledger (best-effort; failures logged, not thrown). */
|
|
100
|
+
async saveStateToDisk() {
|
|
101
|
+
if (!this.statePath)
|
|
102
|
+
return;
|
|
103
|
+
try {
|
|
104
|
+
const payload = {};
|
|
105
|
+
for (const [vault, ts] of this.lastFiredAt)
|
|
106
|
+
payload[vault] = ts;
|
|
107
|
+
await ensureDir(path.dirname(this.statePath));
|
|
108
|
+
await atomicWriteJson(this.statePath, payload);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
this.logger.warn('WikiReflectTrigger: failed to persist state (non-fatal)', {
|
|
112
|
+
statePath: this.statePath,
|
|
113
|
+
error: err.message,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
54
116
|
}
|
|
55
117
|
static getInstance() {
|
|
56
118
|
return this.instance;
|
|
@@ -81,7 +143,9 @@ export class WikiReflectTriggerService {
|
|
|
81
143
|
/**
|
|
82
144
|
* Run one scan. Returns the per-vault outcome for observability + tests.
|
|
83
145
|
*/
|
|
84
|
-
async tick() {
|
|
146
|
+
async tick(opts) {
|
|
147
|
+
await this.loadStateFromDisk();
|
|
148
|
+
const ignoreDebounce = opts?.ignoreDebounce === true;
|
|
85
149
|
const vaults = await this.discoverRoots();
|
|
86
150
|
const result = {
|
|
87
151
|
scanned: [...vaults],
|
|
@@ -91,6 +155,7 @@ export class WikiReflectTriggerService {
|
|
|
91
155
|
};
|
|
92
156
|
const now = this.nowFn();
|
|
93
157
|
const cutoff = now - this.quietWindowMs;
|
|
158
|
+
let stateDirty = false;
|
|
94
159
|
for (const v of vaults) {
|
|
95
160
|
if (this.inflight.has(v))
|
|
96
161
|
continue;
|
|
@@ -113,11 +178,12 @@ export class WikiReflectTriggerService {
|
|
|
113
178
|
continue;
|
|
114
179
|
}
|
|
115
180
|
const last = this.lastFiredAt.get(v) ?? 0;
|
|
116
|
-
if (now - last < this.debounceMs) {
|
|
181
|
+
if (!ignoreDebounce && now - last < this.debounceMs) {
|
|
117
182
|
result.skippedByDebounce.push(v);
|
|
118
183
|
continue;
|
|
119
184
|
}
|
|
120
185
|
this.lastFiredAt.set(v, now);
|
|
186
|
+
stateDirty = true;
|
|
121
187
|
const msSinceLastQueueAdd = lastAddMs === -Infinity ? Number.POSITIVE_INFINITY : now - lastAddMs;
|
|
122
188
|
try {
|
|
123
189
|
await this.fireFn({
|
|
@@ -146,9 +212,16 @@ export class WikiReflectTriggerService {
|
|
|
146
212
|
this.inflight.delete(v);
|
|
147
213
|
}
|
|
148
214
|
}
|
|
215
|
+
if (stateDirty)
|
|
216
|
+
await this.saveStateToDisk();
|
|
149
217
|
return result;
|
|
150
218
|
}
|
|
151
|
-
/**
|
|
219
|
+
/**
|
|
220
|
+
* Test affordance — clear the in-memory debounce ledger. Leaves `stateLoaded`
|
|
221
|
+
* set so a subsequent `tick()` does NOT reload the persisted ledger (which
|
|
222
|
+
* would undo the clear). To force a real fire past debounce in production,
|
|
223
|
+
* use `tick({ ignoreDebounce: true })` instead of this.
|
|
224
|
+
*/
|
|
152
225
|
_resetDebounceForTesting() {
|
|
153
226
|
this.lastFiredAt.clear();
|
|
154
227
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-reflect-trigger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-reflect-trigger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EACL,gBAAgB,GAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-reflect-trigger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-reflect-trigger.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED