crewly 1.20.395 → 1.20.397

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.
Files changed (29) hide show
  1. package/dist/backend/backend/src/constants.d.ts +27 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +27 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/index.d.ts.map +1 -1
  6. package/dist/backend/backend/src/index.js +31 -3
  7. package/dist/backend/backend/src/index.js.map +1 -1
  8. package/dist/backend/backend/src/services/memory/memory.service.d.ts +10 -0
  9. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  10. package/dist/backend/backend/src/services/memory/memory.service.js +33 -4
  11. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  12. package/dist/backend/backend/src/services/wiki/wiki-knowledge-gaps.service.d.ts +225 -0
  13. package/dist/backend/backend/src/services/wiki/wiki-knowledge-gaps.service.d.ts.map +1 -0
  14. package/dist/backend/backend/src/services/wiki/wiki-knowledge-gaps.service.js +417 -0
  15. package/dist/backend/backend/src/services/wiki/wiki-knowledge-gaps.service.js.map +1 -0
  16. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +6 -1
  17. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -1
  18. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +8 -2
  19. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -1
  20. package/dist/backend/build-info.json +2 -2
  21. package/dist/cli/backend/src/constants.d.ts +27 -0
  22. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  23. package/dist/cli/backend/src/constants.js +27 -0
  24. package/dist/cli/backend/src/constants.js.map +1 -1
  25. package/dist/cli/backend/src/services/memory/memory.service.d.ts +10 -0
  26. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  27. package/dist/cli/backend/src/services/memory/memory.service.js +33 -4
  28. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  29. package/package.json +1 -1
@@ -0,0 +1,417 @@
1
+ /**
2
+ * WikiKnowledgeGapsService — turns the week's zero-hit queries into a page
3
+ * and one piece of work for the team lead (#914 P1).
4
+ *
5
+ * `wiki-query` and `recall` append every query to `llm-curated/usage.jsonl`,
6
+ * including the ones that found nothing. The bookkeep report listed five of
7
+ * them, and nobody read the bookkeep report. Once per ISO week, from the
8
+ * maintenance daily pass, this service:
9
+ *
10
+ * 1. reads the window's ledger events and keeps the misses (`miss` or an
11
+ * empty hit list);
12
+ * 2. folds them by normalised query text into distinct gaps — how often,
13
+ * who asked, first and last time — and drops a gap the vault answered
14
+ * later in the window (the same question later returned hits);
15
+ * 3. writes `llm-curated/gaps/<week>.md` through the normal ingest path
16
+ * (frontmatter, index line, history) — replaced, not appended, when the
17
+ * same week is compiled again;
18
+ * 4. hands the vault's team lead (the orchestrator for the global vault)
19
+ * one WorkItem to decide, per gap, whether it deserves a page. Never
20
+ * when the lead is dormant: a chore is not worth a wake.
21
+ *
22
+ * No LLM. A short query (`QUERY_MIN_CHARS`) is a stray token and ignored; a
23
+ * long one (`QUERY_MAX_CHARS`) is pasted text, counted but not listed.
24
+ *
25
+ * Recall searches every vault at once, so a team vault's ledger holds
26
+ * recall rows only as echoes of a cross-vault search (and, before the
27
+ * 1.20.397 ledger fix, a miss in every team vault for one unanswered
28
+ * global recall — 33 phantom gaps per dormant team on 2026-10-24). A team
29
+ * vault is only ever asked directly through `wiki-query`, so its page is
30
+ * built from `wiki-query` rows alone; recall misses belong to the global or
31
+ * project vault that owns the question.
32
+ *
33
+ * @module services/wiki/wiki-knowledge-gaps.service
34
+ */
35
+ import * as path from 'path';
36
+ import { LoggerService } from '../core/logger.service.js';
37
+ import { ORCHESTRATOR_SESSION_NAME, WIKI_GAPS_CONSTANTS } from '../../constants.js';
38
+ import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
39
+ import { createWorkItem } from '../../types/v2/work-item.types.js';
40
+ import { WikiIngestService } from './wiki-ingest.service.js';
41
+ import { WikiUsageService } from './wiki-usage.service.js';
42
+ import { isoWeekLabel } from './wiki-log-compile.service.js';
43
+ /**
44
+ * Normalise a query for grouping: case, whitespace, trailing punctuation.
45
+ *
46
+ * @param query - Raw query text
47
+ * @returns Grouping key
48
+ */
49
+ export function gapKey(query) {
50
+ return query
51
+ .toLowerCase()
52
+ .replace(/\s+/g, ' ')
53
+ .replace(/[\s.,;:!?。,;:!?]+$/u, '')
54
+ .trim();
55
+ }
56
+ /**
57
+ * Fold a window's ledger events into distinct gaps. Pure.
58
+ *
59
+ * @param events - Ledger events, any order
60
+ * @returns Counts and the distinct gaps, most-asked first then most recent
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const r = rollupGaps(events);
65
+ * // r.gaps[0] === { query: 'refund policy', count: 3, agents: ['kai'], … }
66
+ * ```
67
+ */
68
+ export function rollupGaps(events) {
69
+ const sorted = [...events].sort((a, b) => Date.parse(a.at) - Date.parse(b.at));
70
+ const answered = new Map(); // key → last time it returned hits (ms)
71
+ for (const e of sorted) {
72
+ if (!e.miss && Array.isArray(e.hits) && e.hits.length > 0)
73
+ answered.set(gapKey(e.query ?? ''), Date.parse(e.at));
74
+ }
75
+ const byKey = new Map();
76
+ let misses = 0;
77
+ let pastedText = 0;
78
+ for (const e of sorted) {
79
+ // Only an explicit miss counts: a row with no hits and `miss: false` says
80
+ // the vault was searched and another vault answered.
81
+ if (e.miss !== true)
82
+ continue;
83
+ misses++;
84
+ const text = (e.query ?? '').replace(/\s+/g, ' ').trim();
85
+ const key = gapKey(text);
86
+ if (key.length < WIKI_GAPS_CONSTANTS.QUERY_MIN_CHARS)
87
+ continue;
88
+ if (text.length > WIKI_GAPS_CONSTANTS.QUERY_MAX_CHARS) {
89
+ pastedText++;
90
+ continue;
91
+ }
92
+ const agent = e.agent || 'unknown';
93
+ const slot = byKey.get(key);
94
+ if (slot) {
95
+ slot.gap.count++;
96
+ slot.gap.lastAt = e.at;
97
+ slot.agents.set(agent, (slot.agents.get(agent) ?? 0) + 1);
98
+ slot.via.add(e.via);
99
+ }
100
+ else {
101
+ byKey.set(key, {
102
+ gap: { query: text, count: 1, agents: [], via: [], firstAt: e.at, lastAt: e.at },
103
+ agents: new Map([[agent, 1]]),
104
+ via: new Set([e.via]),
105
+ });
106
+ }
107
+ }
108
+ let answeredLater = 0;
109
+ const gaps = [];
110
+ for (const [key, slot] of byKey) {
111
+ const hitAt = answered.get(key);
112
+ if (hitAt !== undefined && hitAt > Date.parse(slot.gap.lastAt)) {
113
+ answeredLater++;
114
+ continue;
115
+ }
116
+ slot.gap.agents = [...slot.agents.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).map(([a]) => a).slice(0, WIKI_GAPS_CONSTANTS.MAX_AGENTS_PER_GAP);
117
+ slot.gap.via = [...slot.via].sort();
118
+ gaps.push(slot.gap);
119
+ }
120
+ gaps.sort((a, b) => b.count - a.count || Date.parse(b.lastAt) - Date.parse(a.lastAt) || a.query.localeCompare(b.query));
121
+ return {
122
+ queries: events.length,
123
+ misses,
124
+ gaps: gaps.slice(0, WIKI_GAPS_CONSTANTS.MAX_GAPS_PER_PAGE),
125
+ distinct: gaps.length,
126
+ pastedText,
127
+ answeredLater,
128
+ };
129
+ }
130
+ /**
131
+ * Weekly knowledge-gap pages per vault. Singleton apart from the per-vault
132
+ * state file; tests construct their own.
133
+ */
134
+ export class WikiKnowledgeGapsService {
135
+ static instance = null;
136
+ logger;
137
+ ingest;
138
+ usage;
139
+ pool;
140
+ resolveTarget;
141
+ isTargetAwake;
142
+ fallbackTarget;
143
+ labelFor;
144
+ constructor(opts = {}) {
145
+ this.logger = LoggerService.getInstance().createComponentLogger('WikiKnowledgeGaps');
146
+ this.ingest = opts.ingest ?? WikiIngestService.getInstance();
147
+ this.usage = opts.usage ?? WikiUsageService.getInstance();
148
+ this.pool = opts.pool ?? null;
149
+ this.resolveTarget = opts.resolveTarget ?? null;
150
+ this.isTargetAwake = opts.isTargetAwake ?? null;
151
+ this.fallbackTarget = opts.fallbackTarget ?? ORCHESTRATOR_SESSION_NAME;
152
+ this.labelFor = opts.labelFor ?? null;
153
+ }
154
+ static getInstance() {
155
+ if (!this.instance)
156
+ this.instance = new WikiKnowledgeGapsService();
157
+ return this.instance;
158
+ }
159
+ /** Wire the production instance (built with a pool and a lead resolver). */
160
+ static setInstance(next) {
161
+ this.instance = next;
162
+ }
163
+ /** Test-only reset. */
164
+ static _resetForTesting() {
165
+ this.instance = null;
166
+ }
167
+ /**
168
+ * Compile one vault's gap page for the current ISO week, once per week.
169
+ *
170
+ * @param vaultPath - Vault root
171
+ * @param opts - Dry run, clock, window and force
172
+ * @returns What was (or would be) written
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * const r = await WikiKnowledgeGapsService.getInstance().compile(vault);
177
+ * // r.compiled && r.pagePath === 'llm-curated/gaps/2026-W43.md'
178
+ * ```
179
+ */
180
+ async compile(vaultPath, opts = {}) {
181
+ const dryRun = opts.dryRun === true;
182
+ const now = opts.now ?? Date.now();
183
+ const windowDays = opts.windowDays ?? WIKI_GAPS_CONSTANTS.WINDOW_DAYS;
184
+ const week = isoWeekLabel(now);
185
+ const empty = { queries: 0, misses: 0, gaps: [], distinct: 0, pastedText: 0, answeredLater: 0 };
186
+ const base = { vaultPath, week, compiled: false, rollup: empty, dryRun };
187
+ const state = await this.readState(vaultPath);
188
+ if (!opts.force && state.lastWeek === week)
189
+ return { ...base, reason: 'not_due' };
190
+ const usage = new WikiUsageService(() => new Date(now));
191
+ const kind = vaultKind(vaultPath);
192
+ // A team vault is only asked directly through wiki-query; its recall
193
+ // rows are echoes of cross-vault searches and never its own gaps.
194
+ const events = (await usage.events(vaultPath, windowDays)).filter((e) => kind !== 'team' || e.via !== 'recall');
195
+ if (events.length === 0)
196
+ return { ...base, reason: 'no_queries' };
197
+ const rollup = rollupGaps(events);
198
+ if (rollup.gaps.length === 0)
199
+ return { ...base, rollup, reason: 'no_gaps' };
200
+ const pagePath = `${WIKI_GAPS_CONSTANTS.DIR}/${week}.md`;
201
+ const body = this.renderBody(rollup, now, windowDays);
202
+ const result = { ...base, compiled: true, rollup, pagePath };
203
+ const target = await this.targetFor(vaultPath, kind);
204
+ if (target)
205
+ result.target = target;
206
+ if (dryRun) {
207
+ result.workItemSkipped = 'dry_run';
208
+ this.logger.info('WikiKnowledgeGaps dry run — would write gap page', { vaultPath, pagePath, gaps: rollup.gaps.length, target });
209
+ return result;
210
+ }
211
+ const n = rollup.gaps.length;
212
+ const outcome = await this.ingest.ingest({
213
+ vaultPath,
214
+ sourceType: 'record_learning',
215
+ sourceRef: `wiki-knowledge-gaps:${week}:${new Date(now).toISOString()}`,
216
+ sourceBody: body,
217
+ callerSession: WIKI_GAPS_CONSTANTS.CALLER_SESSION,
218
+ targetRelativePath: pagePath,
219
+ title: `Knowledge gaps ${week}`,
220
+ summary: `${n} question${n === 1 ? '' : 's'} agents asked in the last ${windowDays} days that this vault could not answer — the team lead decides which deserve a page.`,
221
+ keepBecause: 'changes_decision',
222
+ tags: ['knowledge-gaps', week],
223
+ replace: true,
224
+ });
225
+ if (!outcome.ok) {
226
+ this.logger.warn('WikiKnowledgeGaps: ingest refused the gap page (non-fatal)', { vaultPath, pagePath, reason: outcome.reason });
227
+ return { ...base, rollup, reason: 'ingest_refused' };
228
+ }
229
+ let workItemId = state.lastWeek === week ? state.workItemId : null;
230
+ if (workItemId) {
231
+ result.workItemSkipped = 'already_raised';
232
+ }
233
+ else if (!this.pool) {
234
+ result.workItemSkipped = 'no_pool';
235
+ }
236
+ else if (!target) {
237
+ result.workItemSkipped = 'no_lead';
238
+ }
239
+ else if (!(await this.targetAwake(target))) {
240
+ result.workItemSkipped = 'target_dormant';
241
+ }
242
+ else {
243
+ const wi = this.buildWorkItem(vaultPath, week, target, pagePath, rollup, body, await this.label(vaultPath));
244
+ await this.pool.addToPool(wi);
245
+ workItemId = wi.id;
246
+ result.workItemId = wi.id;
247
+ }
248
+ await this.writeState(vaultPath, { lastWeek: week, lastCompiledAt: new Date(now).toISOString(), workItemId });
249
+ this.logger.info('WikiKnowledgeGaps wrote gap page', { vaultPath, pagePath, gaps: n, misses: rollup.misses, target, workItemId: result.workItemId ?? null, skipped: result.workItemSkipped ?? null });
250
+ return result;
251
+ }
252
+ /**
253
+ * Compile every vault in a list; failures are logged per vault.
254
+ *
255
+ * @param vaults - Vault roots
256
+ * @param opts - Passed to {@link compile}
257
+ * @returns One result per vault that did not throw
258
+ */
259
+ async compileAll(vaults, opts = {}) {
260
+ const out = [];
261
+ for (const vaultPath of vaults) {
262
+ try {
263
+ out.push(await this.compile(vaultPath, opts));
264
+ }
265
+ catch (err) {
266
+ this.logger.warn('WikiKnowledgeGaps failed for vault (non-fatal)', { vaultPath, error: err instanceof Error ? err.message : String(err) });
267
+ }
268
+ }
269
+ return out;
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ /**
273
+ * Markdown body: a dated heading with the counts, one bullet per gap
274
+ * (query, times asked, who, last asked, path), then what the lead does
275
+ * with it.
276
+ *
277
+ * @param rollup - Folded gaps
278
+ * @param now - Epoch ms of the run
279
+ * @param windowDays - Window the counts cover
280
+ * @returns Markdown
281
+ */
282
+ renderBody(rollup, now, windowDays) {
283
+ const date = new Date(now).toISOString().slice(0, 10);
284
+ const lines = [
285
+ `## Compiled ${date} — ${rollup.queries} queries in ${windowDays} days, ${rollup.misses} found nothing, ${rollup.distinct} distinct gap${rollup.distinct === 1 ? '' : 's'}`,
286
+ '',
287
+ ];
288
+ const notes = [];
289
+ if (rollup.answeredLater > 0)
290
+ notes.push(`${rollup.answeredLater} question${rollup.answeredLater === 1 ? '' : 's'} missed first and found a page later in the week — not listed.`);
291
+ if (rollup.pastedText > 0)
292
+ notes.push(`${rollup.pastedText} miss${rollup.pastedText === 1 ? '' : 'es'} looked like pasted text (longer than ${WIKI_GAPS_CONSTANTS.QUERY_MAX_CHARS} characters) — counted, not listed.`);
293
+ if (rollup.distinct > rollup.gaps.length)
294
+ notes.push(`Only the ${rollup.gaps.length} most-asked of ${rollup.distinct} gaps are listed.`);
295
+ if (notes.length)
296
+ lines.push(...notes.map((t) => `_${t}_`), '');
297
+ lines.push(`### Unanswered questions (${rollup.gaps.length})`, '');
298
+ for (const g of rollup.gaps) {
299
+ const who = g.agents.join(', ');
300
+ const times = g.count === 1 ? 'asked once' : `asked ${g.count}×`;
301
+ lines.push(`- **${g.query}** — ${times} by ${who}; last ${g.lastAt.slice(0, 10)} via ${g.via.join('/')}`);
302
+ }
303
+ lines.push('', '### What to do', '', '- For each question that has an answer worth keeping: write the page (wiki-ingest with a one-line summary and a keep_because) so the next search finds it.', '- For a question that does not deserve a page (one-off, already covered under other words, or not this vault\'s business): say so in the WorkItem result, one line per question.', '- The owner is not involved: never post this list, or the fact that you worked it, in the owner\'s thread.');
304
+ return lines.join('\n').trim();
305
+ }
306
+ /**
307
+ * The lead's review WorkItem: title with the vault and the count, the
308
+ * rendered page as the brief.
309
+ */
310
+ buildWorkItem(vaultPath, week, target, pagePath, rollup, body, label) {
311
+ const n = rollup.gaps.length;
312
+ return createWorkItem({
313
+ type: 'delegate',
314
+ owner: target === ORCHESTRATOR_SESSION_NAME ? 'orchestrator' : 'team_lead',
315
+ target,
316
+ title: `Review knowledge gaps ${week} — ${label} (${n} unanswered question${n === 1 ? '' : 's'})`,
317
+ description: `Agents asked ${n} question${n === 1 ? '' : 's'} this week that the ${label} vault could not answer. Read ${pagePath} (vault ${vaultPath}) and decide, per question, whether it deserves a page: write it with wiki-ingest, or say in one line why not. Do not involve the owner.`,
318
+ briefMarkdown: `# Knowledge gaps ${week} — ${label}\n\nVault: \`${vaultPath}\`\nPage: \`${pagePath}\`\n\n${body}`,
319
+ maxRetries: 1,
320
+ metadata: {
321
+ kind: WIKI_GAPS_CONSTANTS.WORKITEM_KIND,
322
+ vaultPath,
323
+ week,
324
+ pagePath,
325
+ gaps: n,
326
+ autoCreated: true,
327
+ },
328
+ });
329
+ }
330
+ /**
331
+ * Who reviews a vault's gaps: its team lead. Only the global vault falls
332
+ * back to the orchestrator; a team or project vault without a lead gets
333
+ * the page and no WorkItem (one unanswered question is not worth an
334
+ * orchestrator turn per vault).
335
+ */
336
+ async targetFor(vaultPath, kind) {
337
+ const fallback = kind === 'global' ? this.fallbackTarget : null;
338
+ if (!this.resolveTarget)
339
+ return fallback;
340
+ try {
341
+ return (await this.resolveTarget(vaultPath)) ?? fallback;
342
+ }
343
+ catch {
344
+ return fallback;
345
+ }
346
+ }
347
+ /** Human label for the WorkItem title: the wired resolver (team name), else the folder. */
348
+ async label(vaultPath) {
349
+ if (this.labelFor) {
350
+ try {
351
+ const named = await this.labelFor(vaultPath);
352
+ if (named && named.trim())
353
+ return named.trim();
354
+ }
355
+ catch {
356
+ /* fall through to the folder name */
357
+ }
358
+ }
359
+ return vaultLabel(vaultPath);
360
+ }
361
+ /** Errors count as dormant: a chore is never worth risking a wake. */
362
+ async targetAwake(target) {
363
+ if (!this.isTargetAwake)
364
+ return true;
365
+ try {
366
+ return await this.isTargetAwake(target);
367
+ }
368
+ catch {
369
+ return false;
370
+ }
371
+ }
372
+ statePath(vaultPath) {
373
+ return path.join(vaultPath, WIKI_GAPS_CONSTANTS.STATE_FILE);
374
+ }
375
+ async readState(vaultPath) {
376
+ const data = await safeReadJson(this.statePath(vaultPath), null);
377
+ return {
378
+ lastWeek: typeof data?.lastWeek === 'string' ? data.lastWeek : null,
379
+ lastCompiledAt: typeof data?.lastCompiledAt === 'string' ? data.lastCompiledAt : null,
380
+ workItemId: typeof data?.workItemId === 'string' ? data.workItemId : null,
381
+ };
382
+ }
383
+ async writeState(vaultPath, state) {
384
+ await atomicWriteJson(this.statePath(vaultPath), state);
385
+ }
386
+ }
387
+ /**
388
+ * Classify a vault by its path.
389
+ *
390
+ * @param vaultPath - `~/.crewly/global-wiki`, `~/.crewly/teams/<id>/wiki` or `<project>/.crewly/wiki`
391
+ * @returns The vault kind (anything unrecognised counts as a project vault)
392
+ */
393
+ export function vaultKind(vaultPath) {
394
+ const normalized = vaultPath.replace(/\\/g, '/').replace(/\/+$/, '');
395
+ if (normalized.endsWith('/global-wiki'))
396
+ return 'global';
397
+ if (/\/teams\/[^/]+\/wiki$/.test(normalized))
398
+ return 'team';
399
+ return 'project';
400
+ }
401
+ /**
402
+ * Short human label for a vault: the project or team folder it belongs to.
403
+ *
404
+ * @param vaultPath - `<project>/.crewly/wiki`, `~/.crewly/teams/<id>/wiki` or `~/.crewly/global-wiki`
405
+ * @returns `crewly`, `<team-id>` or `global`
406
+ */
407
+ export function vaultLabel(vaultPath) {
408
+ const normalized = vaultPath.replace(/\\/g, '/').replace(/\/+$/, '');
409
+ if (normalized.endsWith('/global-wiki'))
410
+ return 'global';
411
+ if (normalized.endsWith('/.crewly/wiki'))
412
+ return path.basename(normalized.slice(0, -'/.crewly/wiki'.length)) || 'project';
413
+ if (normalized.endsWith('/wiki'))
414
+ return path.basename(normalized.slice(0, -'/wiki'.length)) || 'vault';
415
+ return path.basename(normalized) || 'vault';
416
+ }
417
+ //# sourceMappingURL=wiki-knowledge-gaps.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-knowledge-gaps.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-knowledge-gaps.service.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@
4
4
  * One hourly tick:
5
5
  * - every tick: a queue drain pass ({@link WikiQueueDrainService});
6
6
  * - once per day (and on the first tick after boot when the last daily
7
- * pass is older than a day): log rotation then digest compile for every
7
+ * pass is older than a day): log rotation, digest compile and the
8
+ * knowledge-gap roll-up (#914, itself once per ISO week) for every
8
9
  * discovered vault.
9
10
  *
10
11
  * The first tick runs `MAINTENANCE_BOOT_DELAY_MS` after `start()` so boot
@@ -17,6 +18,7 @@
17
18
  import { WikiLogRotationService, type WikiLogRotateResult } from './wiki-log-rotation.service.js';
18
19
  import { WikiLogCompileService, type WikiLogCompileResult } from './wiki-log-compile.service.js';
19
20
  import { WikiQueueDrainService, type WikiQueueDrainResult } from './wiki-queue-drain.service.js';
21
+ import { WikiKnowledgeGapsService, type WikiKnowledgeGapsResult } from './wiki-knowledge-gaps.service.js';
20
22
  /** Options for {@link WikiMaintenanceService}. */
21
23
  export interface WikiMaintenanceOptions {
22
24
  /** Tick interval (default hourly). */
@@ -33,6 +35,7 @@ export interface WikiMaintenanceOptions {
33
35
  rotation?: WikiLogRotationService;
34
36
  compile?: WikiLogCompileService;
35
37
  drain?: WikiQueueDrainService;
38
+ gaps?: WikiKnowledgeGapsService;
36
39
  /** Clock (tests). */
37
40
  now?: () => number;
38
41
  /** Dry run: every step reports and writes nothing. */
@@ -57,6 +60,7 @@ export interface WikiMaintenanceTickResult {
57
60
  vaults: string[];
58
61
  rotated: WikiLogRotateResult[];
59
62
  compiled: WikiLogCompileResult[];
63
+ gaps: WikiKnowledgeGapsResult[];
60
64
  };
61
65
  skippedDaily?: 'not_due';
62
66
  }
@@ -74,6 +78,7 @@ export declare class WikiMaintenanceService {
74
78
  private readonly rotation;
75
79
  private readonly compile;
76
80
  private readonly drain;
81
+ private readonly gaps;
77
82
  private readonly nowFn;
78
83
  private readonly dryRun;
79
84
  private readonly bootGate;
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-maintenance.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wiki-maintenance.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@
4
4
  * One hourly tick:
5
5
  * - every tick: a queue drain pass ({@link WikiQueueDrainService});
6
6
  * - once per day (and on the first tick after boot when the last daily
7
- * pass is older than a day): log rotation then digest compile for every
7
+ * pass is older than a day): log rotation, digest compile and the
8
+ * knowledge-gap roll-up (#914, itself once per ISO week) for every
8
9
  * discovered vault.
9
10
  *
10
11
  * The first tick runs `MAINTENANCE_BOOT_DELAY_MS` after `start()` so boot
@@ -23,6 +24,7 @@ import { discoverWikiVaults } from './wiki-bookkeep-trigger.service.js';
23
24
  import { WikiLogRotationService } from './wiki-log-rotation.service.js';
24
25
  import { WikiLogCompileService } from './wiki-log-compile.service.js';
25
26
  import { WikiQueueDrainService } from './wiki-queue-drain.service.js';
27
+ import { WikiKnowledgeGapsService } from './wiki-knowledge-gaps.service.js';
26
28
  /**
27
29
  * Hourly wiki maintenance scheduler. Start at boot, stop at shutdown.
28
30
  */
@@ -37,6 +39,7 @@ export class WikiMaintenanceService {
37
39
  rotation;
38
40
  compile;
39
41
  drain;
42
+ gaps;
40
43
  nowFn;
41
44
  dryRun;
42
45
  bootGate;
@@ -55,6 +58,7 @@ export class WikiMaintenanceService {
55
58
  this.rotation = opts.rotation ?? WikiLogRotationService.getInstance();
56
59
  this.compile = opts.compile ?? WikiLogCompileService.getInstance();
57
60
  this.drain = opts.drain ?? WikiQueueDrainService.getInstance();
61
+ this.gaps = opts.gaps ?? WikiKnowledgeGapsService.getInstance();
58
62
  this.nowFn = opts.now ?? (() => Date.now());
59
63
  this.dryRun = opts.dryRun === true;
60
64
  this.bootGate = opts.bootGate ?? null;
@@ -162,12 +166,14 @@ export class WikiMaintenanceService {
162
166
  const now = this.nowFn();
163
167
  const rotated = await this.rotation.rotateAll(vaults, { dryRun: this.dryRun, now });
164
168
  const compiled = await this.compile.compileAll(vaults, { dryRun: this.dryRun, now });
165
- result.daily = { vaults, rotated, compiled };
169
+ const gaps = await this.gaps.compileAll(vaults, { dryRun: this.dryRun, now });
170
+ result.daily = { vaults, rotated, compiled, gaps };
166
171
  this.logger.info('WikiMaintenance daily pass', {
167
172
  dryRun: this.dryRun,
168
173
  vaults: vaults.length,
169
174
  rotated: rotated.filter((r) => r.rotated).map((r) => ({ vault: r.vaultPath, bytes: r.bytes, entries: r.entries, carried: r.carried, archive: r.archivePath })),
170
175
  compiled: compiled.filter((c) => c.compiled).map((c) => ({ vault: c.vaultPath, page: c.pagePath, entries: c.entriesCompiled })),
176
+ gaps: gaps.filter((g) => g.compiled).map((g) => ({ vault: g.vaultPath, page: g.pagePath, gaps: g.rollup.gaps.length, target: g.target, workItemId: g.workItemId ?? null, skipped: g.workItemSkipped ?? null })),
171
177
  });
172
178
  if (!this.dryRun) {
173
179
  this.state = { lastDailyAt: new Date(now).toISOString() };
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-maintenance.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wiki-maintenance.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  {
2
- "commit": "3fb79da3c0cbff0731ae4d8af688e35a568f298b",
3
- "builtAt": "2026-10-23T06:19:45.558Z"
2
+ "commit": "d9b43a9a59adbd8a581f2b625b2e3f255840f540",
3
+ "builtAt": "2026-10-25T04:47:43.892Z"
4
4
  }
@@ -2131,6 +2131,33 @@ export declare const WIKI_LOG_CONSTANTS: {
2131
2131
  /** Kill switch env var; the value `false` disables all wiki maintenance. */
2132
2132
  readonly MAINTENANCE_ENV_KILL_SWITCH: "CREWLY_WIKI_MAINTENANCE";
2133
2133
  };
2134
+ /**
2135
+ * Knowledge gaps (#914 P1): the retrieval ledger records every query that
2136
+ * found nothing, and nothing turned those misses into work. Once per ISO
2137
+ * week the maintenance daily pass rolls the window's zero-hit queries into
2138
+ * one page per vault under `llm-curated/gaps/` and hands the team lead one
2139
+ * WorkItem to decide which gaps deserve a page. Deterministic, no LLM.
2140
+ */
2141
+ export declare const WIKI_GAPS_CONSTANTS: {
2142
+ /** Queries from this many days back are rolled up. */
2143
+ readonly WINDOW_DAYS: 7;
2144
+ /** Vault-relative folder of the weekly gap pages. */
2145
+ readonly DIR: "llm-curated/gaps";
2146
+ /** Vault-root file remembering the last week compiled and its WorkItem (dot-file: walkers skip it). */
2147
+ readonly STATE_FILE: ".wiki-gaps-state.json";
2148
+ /** A query shorter than this is noise (a stray token), not a question. */
2149
+ readonly QUERY_MIN_CHARS: 3;
2150
+ /** A query longer than this is pasted text, not a question; counted but not listed. */
2151
+ readonly QUERY_MAX_CHARS: 160;
2152
+ /** Cap on distinct gaps one page lists (the most-asked first). */
2153
+ readonly MAX_GAPS_PER_PAGE: 50;
2154
+ /** Cap on agent names listed per gap. */
2155
+ readonly MAX_AGENTS_PER_GAP: 5;
2156
+ /** WorkItem `metadata.kind` of the lead's review item. */
2157
+ readonly WORKITEM_KIND: "wiki-knowledge-gaps";
2158
+ /** Session that authors the page. */
2159
+ readonly CALLER_SESSION: "system:wiki-knowledge-gaps";
2160
+ };
2134
2161
  /**
2135
2162
  * Daily agent-memory refresh (#1345): what an agent recorded in the wiki
2136
2163
  * log is reflected into its `memory.json` and the project's memory.