crewly 1.8.3 → 1.8.5
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/config/roles/_common/wiki-instructions.md +33 -0
- package/config/roles/orchestrator/prompt.md +121 -0
- package/config/roles/team-leader/prompt.md +38 -0
- package/config/skills/agent/core/wiki-query/SKILL.md +66 -0
- package/config/skills/agent/core/wiki-query/execute.sh +107 -0
- package/config/skills/orchestrator/wiki-bookkeep/SKILL.md +71 -0
- package/config/skills/orchestrator/wiki-bookkeep/execute.sh +72 -0
- package/config/skills/orchestrator/wiki-ingest/SKILL.md +63 -0
- package/config/skills/orchestrator/wiki-ingest/execute.sh +113 -0
- package/config/skills/orchestrator/wiki-process-queue/SKILL.md +71 -0
- package/config/skills/orchestrator/wiki-process-queue/execute.sh +93 -0
- package/config/skills/orchestrator/wiki-queue-add/SKILL.md +89 -0
- package/config/skills/orchestrator/wiki-queue-add/execute.sh +115 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +134 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +718 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +43 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +39 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/core/system-health.util.d.ts +29 -4
- package/dist/backend/backend/src/services/core/system-health.util.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/system-health.util.js +105 -6
- package/dist/backend/backend/src/services/core/system-health.util.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +28 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +162 -4
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +20 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +61 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts +38 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.js +124 -0
- package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +19 -2
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +64 -7
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/referenced-by.resolver.d.ts +69 -0
- package/dist/backend/backend/src/services/wiki/referenced-by.resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/referenced-by.resolver.js +174 -0
- package/dist/backend/backend/src/services/wiki/referenced-by.resolver.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/schema-loader.service.d.ts +57 -0
- package/dist/backend/backend/src/services/wiki/schema-loader.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/schema-loader.service.js +183 -0
- package/dist/backend/backend/src/services/wiki/schema-loader.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +86 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +187 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +116 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +299 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +100 -0
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +212 -0
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts +84 -0
- package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-process.service.js +138 -0
- package/dist/backend/backend/src/services/wiki/wiki-process.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +115 -0
- package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-query.service.js +291 -0
- package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts +115 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue.service.js +261 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki.types.d.ts +84 -0
- package/dist/backend/backend/src/services/wiki/wiki.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki.types.js +10 -0
- package/dist/backend/backend/src/services/wiki/wiki.types.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +20 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +61 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/frontend/dist/assets/{index-b279da34.js → index-cc115bb4.js} +246 -246
- package/frontend/dist/assets/{index-c07e04c0.css → index-db3f5041.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiQueryService — read a vault and build the `system-context` payload
|
|
3
|
+
* that the caller's runtime feeds to its LLM for synthesis.
|
|
4
|
+
*
|
|
5
|
+
* Per v2.1 spec §3 the skill is split into two halves:
|
|
6
|
+
* - System-context (LLM-agnostic) → what this service produces
|
|
7
|
+
* - Task-instruction (per-LLM) → lives on disk under
|
|
8
|
+
* `config/skills/<role>/wiki-<verb>/prompts/<runtime>.md` and is
|
|
9
|
+
* concatenated by the caller's runtime, NOT by us.
|
|
10
|
+
*
|
|
11
|
+
* Phase 1 scope (this file): single-vault read. Cross-vault synthesis is
|
|
12
|
+
* Phase 2 work (`wiki-recall-cross-scope` reducer, §1 amended v2.1).
|
|
13
|
+
*
|
|
14
|
+
* @module services/wiki/wiki-query.service
|
|
15
|
+
*/
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
import * as fs from 'fs/promises';
|
|
18
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
19
|
+
import { SchemaLoaderService } from './schema-loader.service.js';
|
|
20
|
+
const DEFAULT_RECENT_LOG_ENTRIES = 20;
|
|
21
|
+
const DEFAULT_TOP_K_PAGES = 5;
|
|
22
|
+
const MAX_PAGE_BYTES = 8 * 1024; // truncate per-page excerpt
|
|
23
|
+
const MAX_TOTAL_PAGES_SCANNED = 200; // safety cap on filesystem walk
|
|
24
|
+
/**
|
|
25
|
+
* Reads a vault and builds the system-context payload the caller's LLM
|
|
26
|
+
* synthesizes against. Stateless. No LLM calls inside this service.
|
|
27
|
+
*/
|
|
28
|
+
export class WikiQueryService {
|
|
29
|
+
static instance = null;
|
|
30
|
+
logger;
|
|
31
|
+
schemaLoader;
|
|
32
|
+
constructor(schemaLoader) {
|
|
33
|
+
this.logger = LoggerService.getInstance().createComponentLogger('WikiQuery');
|
|
34
|
+
this.schemaLoader = schemaLoader ?? new SchemaLoaderService();
|
|
35
|
+
}
|
|
36
|
+
static getInstance() {
|
|
37
|
+
if (!this.instance) {
|
|
38
|
+
this.instance = new WikiQueryService();
|
|
39
|
+
}
|
|
40
|
+
return this.instance;
|
|
41
|
+
}
|
|
42
|
+
/** Test-only reset. */
|
|
43
|
+
static _resetForTesting() {
|
|
44
|
+
this.instance = null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build a system-context payload for `query` against the vault at
|
|
48
|
+
* `vaultPath`. Caller's LLM consumes this + its task-instruction prompt.
|
|
49
|
+
*/
|
|
50
|
+
async query(input) {
|
|
51
|
+
const validation = this.validate(input);
|
|
52
|
+
if (validation)
|
|
53
|
+
return validation;
|
|
54
|
+
let schema;
|
|
55
|
+
try {
|
|
56
|
+
schema = await this.schemaLoader.load(input.vaultPath);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
reason: 'schema_missing',
|
|
62
|
+
message: err.message,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const topK = input.topK ?? DEFAULT_TOP_K_PAGES;
|
|
66
|
+
const recentN = input.recentLogEntries ?? DEFAULT_RECENT_LOG_ENTRIES;
|
|
67
|
+
const recentLog = await this.readRecentLog(input.vaultPath, recentN);
|
|
68
|
+
const candidatePages = await this.findCandidatePages(input.vaultPath, schema, input.query, topK);
|
|
69
|
+
const context = {
|
|
70
|
+
vault: {
|
|
71
|
+
scope: schema.vault_scope,
|
|
72
|
+
id: schema.vault_id,
|
|
73
|
+
path: input.vaultPath,
|
|
74
|
+
},
|
|
75
|
+
schemaSummary: {
|
|
76
|
+
hardcoded: schema.hardcoded.map((h) => ({
|
|
77
|
+
path: h.path,
|
|
78
|
+
description: h.description,
|
|
79
|
+
})),
|
|
80
|
+
llmCurated: schema.llm_curated.map((l) => ({
|
|
81
|
+
path: l.path,
|
|
82
|
+
seedSubdirs: l.seed_subdirs,
|
|
83
|
+
})),
|
|
84
|
+
frozenPaths: this.schemaLoader.getFrozenPaths(schema),
|
|
85
|
+
writePolicy: schema.write_policy,
|
|
86
|
+
},
|
|
87
|
+
query: input.query,
|
|
88
|
+
recentLog,
|
|
89
|
+
candidatePages,
|
|
90
|
+
callerNotes: [
|
|
91
|
+
'Cite pages by their relative path inside the vault.',
|
|
92
|
+
'Do not propose writes into any frozenPaths — refuse or redirect to llm-curated/.',
|
|
93
|
+
'Treat candidatePages.excerpt as truncated; ask wiki-query again with a refined query if you need full content.',
|
|
94
|
+
'The recentLog is append-only audit; never propose rewrites to its content.',
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
this.logger.debug('WikiQuery built system-context', {
|
|
98
|
+
vault: input.vaultPath,
|
|
99
|
+
queryLen: input.query.length,
|
|
100
|
+
logEntries: recentLog.length,
|
|
101
|
+
candidatePages: candidatePages.length,
|
|
102
|
+
});
|
|
103
|
+
return { ok: true, context };
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Internals
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
validate(input) {
|
|
109
|
+
if (!input.vaultPath || !path.isAbsolute(input.vaultPath)) {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
reason: 'invalid_input',
|
|
113
|
+
message: `vaultPath must be an absolute path, got "${input.vaultPath ?? ''}"`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (typeof input.query !== 'string' || input.query.trim().length === 0) {
|
|
117
|
+
return {
|
|
118
|
+
ok: false,
|
|
119
|
+
reason: 'invalid_input',
|
|
120
|
+
message: 'query must be a non-empty string',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (input.topK !== undefined && (!Number.isInteger(input.topK) || input.topK <= 0)) {
|
|
124
|
+
return {
|
|
125
|
+
ok: false,
|
|
126
|
+
reason: 'invalid_input',
|
|
127
|
+
message: 'topK must be a positive integer when provided',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (input.recentLogEntries !== undefined &&
|
|
131
|
+
(!Number.isInteger(input.recentLogEntries) || input.recentLogEntries < 0)) {
|
|
132
|
+
return {
|
|
133
|
+
ok: false,
|
|
134
|
+
reason: 'invalid_input',
|
|
135
|
+
message: 'recentLogEntries must be a non-negative integer when provided',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Parse the last N entries from `llm-curated/log.md`. Entries follow the
|
|
142
|
+
* format written by `WikiIngestService.formatLogEntry`:
|
|
143
|
+
*
|
|
144
|
+
* ## [<ISO>] <sourceType> | <caller>
|
|
145
|
+
*
|
|
146
|
+
* ref: <ref>
|
|
147
|
+
*
|
|
148
|
+
* <body lines>
|
|
149
|
+
*/
|
|
150
|
+
async readRecentLog(vaultPath, limit) {
|
|
151
|
+
const logPath = path.join(vaultPath, 'llm-curated', 'log.md');
|
|
152
|
+
let raw;
|
|
153
|
+
try {
|
|
154
|
+
raw = await fs.readFile(logPath, 'utf8');
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
const headerRe = /^## \[([^\]]+)\]\s+(\S+)\s+\|\s+(.+)$/gm;
|
|
160
|
+
const entries = [];
|
|
161
|
+
const matches = [];
|
|
162
|
+
let m;
|
|
163
|
+
while ((m = headerRe.exec(raw))) {
|
|
164
|
+
matches.push({
|
|
165
|
+
idx: m.index,
|
|
166
|
+
ts: m[1],
|
|
167
|
+
sourceType: m[2],
|
|
168
|
+
caller: m[3].trim(),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
for (let i = 0; i < matches.length; i++) {
|
|
172
|
+
const start = matches[i].idx;
|
|
173
|
+
const end = i + 1 < matches.length ? matches[i + 1].idx : raw.length;
|
|
174
|
+
const block = raw.slice(start, end);
|
|
175
|
+
const refMatch = block.match(/^ref:\s*(.+)$/m);
|
|
176
|
+
// Body is everything after the `ref:` line (skipping the blank line).
|
|
177
|
+
let body = '';
|
|
178
|
+
if (refMatch) {
|
|
179
|
+
const refLineEnd = block.indexOf(refMatch[0]) + refMatch[0].length;
|
|
180
|
+
body = block.slice(refLineEnd).replace(/^\n+/, '').trim();
|
|
181
|
+
}
|
|
182
|
+
entries.push({
|
|
183
|
+
timestamp: matches[i].ts,
|
|
184
|
+
sourceType: matches[i].sourceType,
|
|
185
|
+
caller: matches[i].caller,
|
|
186
|
+
ref: refMatch ? refMatch[1].trim() : '',
|
|
187
|
+
body,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Most-recent-first; cap to requested limit.
|
|
191
|
+
return entries.slice(-limit).reverse();
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Walk the vault's NON-frozen subtrees and rank pages by keyword overlap
|
|
195
|
+
* with the query. Phase 1 is intentionally simple — Phase 2 will swap in
|
|
196
|
+
* embedding-based scoring.
|
|
197
|
+
*/
|
|
198
|
+
async findCandidatePages(vaultPath, schema, query, topK) {
|
|
199
|
+
const queryTerms = this.tokenize(query);
|
|
200
|
+
if (queryTerms.length === 0)
|
|
201
|
+
return [];
|
|
202
|
+
const llmCuratedRoots = schema.llm_curated.map((l) => path.join(vaultPath, l.path.replace(/[/\\]+$/, '')));
|
|
203
|
+
const candidates = [];
|
|
204
|
+
let scanned = 0;
|
|
205
|
+
for (const root of llmCuratedRoots) {
|
|
206
|
+
const stack = [root];
|
|
207
|
+
while (stack.length > 0 && scanned < MAX_TOTAL_PAGES_SCANNED) {
|
|
208
|
+
const current = stack.pop();
|
|
209
|
+
let entries;
|
|
210
|
+
try {
|
|
211
|
+
entries = await fs.readdir(current, { withFileTypes: true });
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
for (const entry of entries) {
|
|
217
|
+
const full = path.join(current, entry.name);
|
|
218
|
+
if (entry.isDirectory()) {
|
|
219
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
220
|
+
continue;
|
|
221
|
+
stack.push(full);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (!entry.isFile())
|
|
225
|
+
continue;
|
|
226
|
+
if (!entry.name.endsWith('.md'))
|
|
227
|
+
continue;
|
|
228
|
+
// Skip log.md — it's surfaced separately as recentLog.
|
|
229
|
+
if (path.relative(vaultPath, full).replace(/\\/g, '/') ===
|
|
230
|
+
'llm-curated/log.md') {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
scanned++;
|
|
234
|
+
const score = await this.scorePage(full, queryTerms);
|
|
235
|
+
if (score > 0) {
|
|
236
|
+
const excerpt = await this.readExcerpt(full);
|
|
237
|
+
candidates.push({
|
|
238
|
+
path: path.relative(vaultPath, full).replace(/\\/g, '/'),
|
|
239
|
+
excerpt,
|
|
240
|
+
score,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
candidates.sort((a, b) => b.score - a.score);
|
|
247
|
+
return candidates.slice(0, topK);
|
|
248
|
+
}
|
|
249
|
+
tokenize(text) {
|
|
250
|
+
return text
|
|
251
|
+
.toLowerCase()
|
|
252
|
+
.split(/[\s\p{P}]+/u)
|
|
253
|
+
.filter((t) => t.length >= 2);
|
|
254
|
+
}
|
|
255
|
+
async scorePage(absolutePath, queryTerms) {
|
|
256
|
+
let content;
|
|
257
|
+
try {
|
|
258
|
+
content = (await fs.readFile(absolutePath, 'utf8')).toLowerCase();
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return 0;
|
|
262
|
+
}
|
|
263
|
+
let score = 0;
|
|
264
|
+
for (const term of queryTerms) {
|
|
265
|
+
// Bounded count: don't reward spammy repetition above 10.
|
|
266
|
+
let count = 0;
|
|
267
|
+
let idx = 0;
|
|
268
|
+
while (count < 10) {
|
|
269
|
+
const found = content.indexOf(term, idx);
|
|
270
|
+
if (found < 0)
|
|
271
|
+
break;
|
|
272
|
+
count++;
|
|
273
|
+
idx = found + term.length;
|
|
274
|
+
}
|
|
275
|
+
score += count;
|
|
276
|
+
}
|
|
277
|
+
return score;
|
|
278
|
+
}
|
|
279
|
+
async readExcerpt(absolutePath) {
|
|
280
|
+
try {
|
|
281
|
+
const raw = await fs.readFile(absolutePath, 'utf8');
|
|
282
|
+
if (Buffer.byteLength(raw, 'utf8') <= MAX_PAGE_BYTES)
|
|
283
|
+
return raw;
|
|
284
|
+
return raw.slice(0, MAX_PAGE_BYTES) + '\n\n…[truncated]';
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return '';
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=wiki-query.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-query.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiQueueService — file-backed queue of "wiki-worthy" content
|
|
3
|
+
* that agents enqueue from inside their conversations.
|
|
4
|
+
*
|
|
5
|
+
* Design (Steve, 2026-05-22 redesign — replacing the keyword heuristic):
|
|
6
|
+
*
|
|
7
|
+
* 1. The orchestrator-system-prompt rule teaches agents to call the
|
|
8
|
+
* `wiki-queue-add` skill when a turn produces content with lasting
|
|
9
|
+
* value (decision, person fact, customer info, pattern, learning).
|
|
10
|
+
* Agents — not regex — decide.
|
|
11
|
+
*
|
|
12
|
+
* 2. Items sit in the queue with `status: pending` until an agent
|
|
13
|
+
* claims one via `wiki-process-queue` and chooses (a) where in the
|
|
14
|
+
* vault to put it OR (b) skip it because it's not actually worth
|
|
15
|
+
* saving. The agent's LLM is the classifier; we never pre-pick a
|
|
16
|
+
* taxonomy beyond the frozen folders.
|
|
17
|
+
*
|
|
18
|
+
* 3. Bookkeeping cron / threshold reads the same queue + vault stats
|
|
19
|
+
* so it can decide when to ask an agent for a consolidation pass.
|
|
20
|
+
*
|
|
21
|
+
* Storage: `~/.crewly/wiki-queue/<id>.json`. Single flat directory;
|
|
22
|
+
* cross-vault filtering happens at list time via the `vaultPath` field
|
|
23
|
+
* inside each record.
|
|
24
|
+
*
|
|
25
|
+
* @module services/wiki/wiki-queue.service
|
|
26
|
+
*/
|
|
27
|
+
import { WikiSourceType } from './wiki-ingest.service.js';
|
|
28
|
+
export type WikiQueueStatus = 'pending' | 'claimed' | 'processed' | 'skipped';
|
|
29
|
+
export interface WikiQueueItem {
|
|
30
|
+
id: string;
|
|
31
|
+
vaultPath: string;
|
|
32
|
+
queuedAt: string;
|
|
33
|
+
queuedBy: string;
|
|
34
|
+
sourceType: WikiSourceType;
|
|
35
|
+
sourceRef: string;
|
|
36
|
+
content: string;
|
|
37
|
+
/** Agent's note: WHY this is worth ingesting. Audit + helps the processor. */
|
|
38
|
+
reason: string;
|
|
39
|
+
status: WikiQueueStatus;
|
|
40
|
+
claimedBy?: string;
|
|
41
|
+
claimedAt?: string;
|
|
42
|
+
processedAt?: string;
|
|
43
|
+
result?: {
|
|
44
|
+
ingested: boolean;
|
|
45
|
+
pagesWritten?: string[];
|
|
46
|
+
targetPath?: string;
|
|
47
|
+
summary?: string;
|
|
48
|
+
skipReason?: string;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface WikiQueueAddInput {
|
|
52
|
+
vaultPath: string;
|
|
53
|
+
queuedBy: string;
|
|
54
|
+
sourceType: WikiSourceType;
|
|
55
|
+
sourceRef: string;
|
|
56
|
+
content: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
}
|
|
59
|
+
export interface WikiQueueListFilter {
|
|
60
|
+
vaultPath?: string;
|
|
61
|
+
status?: WikiQueueStatus;
|
|
62
|
+
queuedBy?: string;
|
|
63
|
+
/** Cap on returned items. Default 50. */
|
|
64
|
+
limit?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface WikiQueueStats {
|
|
67
|
+
pending: number;
|
|
68
|
+
claimed: number;
|
|
69
|
+
processed: number;
|
|
70
|
+
skipped: number;
|
|
71
|
+
total: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* File-backed queue. Stateless other than the on-disk JSONs and an
|
|
75
|
+
* in-memory cache of the root directory. Singleton because all writes
|
|
76
|
+
* go to the same on-disk pool.
|
|
77
|
+
*/
|
|
78
|
+
export declare class WikiQueueService {
|
|
79
|
+
private static instance;
|
|
80
|
+
private readonly logger;
|
|
81
|
+
private readonly rootDir;
|
|
82
|
+
private initPromise;
|
|
83
|
+
constructor(rootDir?: string);
|
|
84
|
+
static getInstance(): WikiQueueService;
|
|
85
|
+
/** Test-only reset. */
|
|
86
|
+
static _resetForTesting(): void;
|
|
87
|
+
/** Expose for tests. */
|
|
88
|
+
getRootDir(): string;
|
|
89
|
+
/** Enqueue a new candidate. Returns the persisted item. */
|
|
90
|
+
add(input: WikiQueueAddInput): Promise<WikiQueueItem>;
|
|
91
|
+
/** List items, newest-first, optionally filtered. */
|
|
92
|
+
list(filter?: WikiQueueListFilter): Promise<WikiQueueItem[]>;
|
|
93
|
+
/** Fetch one by id. Returns null when missing. */
|
|
94
|
+
get(id: string): Promise<WikiQueueItem | null>;
|
|
95
|
+
/**
|
|
96
|
+
* Claim an item — only allowed when `status: pending`. Stamps the
|
|
97
|
+
* claimant + timestamp atomically.
|
|
98
|
+
*/
|
|
99
|
+
claim(id: string, claimedBy: string): Promise<WikiQueueItem>;
|
|
100
|
+
/**
|
|
101
|
+
* Mark processed. Requires the item to be `claimed` AND requires a
|
|
102
|
+
* `result` with at least one of `pagesWritten` / `targetPath` / `summary`.
|
|
103
|
+
*/
|
|
104
|
+
markProcessed(id: string, result: NonNullable<WikiQueueItem['result']>): Promise<WikiQueueItem>;
|
|
105
|
+
/** Mark skipped — agent decided this isn't wiki-worthy after all. */
|
|
106
|
+
markSkipped(id: string, skipReason: string): Promise<WikiQueueItem>;
|
|
107
|
+
/** Status counts, optionally scoped to a vault. */
|
|
108
|
+
getStats(vaultPath?: string): Promise<WikiQueueStats>;
|
|
109
|
+
private validateAddInput;
|
|
110
|
+
private ensureRoot;
|
|
111
|
+
private writeItem;
|
|
112
|
+
private readItemFile;
|
|
113
|
+
private requireItem;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=wiki-queue.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-queue.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-queue.service.ts"],"names":[],"mappings":"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"}
|