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.
Files changed (95) hide show
  1. package/config/roles/_common/wiki-instructions.md +33 -0
  2. package/config/roles/orchestrator/prompt.md +121 -0
  3. package/config/roles/team-leader/prompt.md +38 -0
  4. package/config/skills/agent/core/wiki-query/SKILL.md +66 -0
  5. package/config/skills/agent/core/wiki-query/execute.sh +107 -0
  6. package/config/skills/orchestrator/wiki-bookkeep/SKILL.md +71 -0
  7. package/config/skills/orchestrator/wiki-bookkeep/execute.sh +72 -0
  8. package/config/skills/orchestrator/wiki-ingest/SKILL.md +63 -0
  9. package/config/skills/orchestrator/wiki-ingest/execute.sh +113 -0
  10. package/config/skills/orchestrator/wiki-process-queue/SKILL.md +71 -0
  11. package/config/skills/orchestrator/wiki-process-queue/execute.sh +93 -0
  12. package/config/skills/orchestrator/wiki-queue-add/SKILL.md +89 -0
  13. package/config/skills/orchestrator/wiki-queue-add/execute.sh +115 -0
  14. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +134 -0
  15. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -0
  16. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +718 -0
  17. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -0
  18. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts +23 -0
  19. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -0
  20. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +43 -0
  21. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -0
  22. package/dist/backend/backend/src/index.d.ts.map +1 -1
  23. package/dist/backend/backend/src/index.js +39 -0
  24. package/dist/backend/backend/src/index.js.map +1 -1
  25. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  26. package/dist/backend/backend/src/routes/api.routes.js +4 -0
  27. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  28. package/dist/backend/backend/src/services/core/system-health.util.d.ts +29 -4
  29. package/dist/backend/backend/src/services/core/system-health.util.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/core/system-health.util.js +105 -6
  31. package/dist/backend/backend/src/services/core/system-health.util.js.map +1 -1
  32. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +28 -0
  33. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/session/pty/pty-session.js +162 -4
  35. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  36. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +20 -0
  37. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +61 -0
  39. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts +38 -1
  41. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/v3/escalation-router.service.js +124 -0
  43. package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
  44. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +19 -2
  45. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/v3/v3-data.service.js +64 -7
  47. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  48. package/dist/backend/backend/src/services/wiki/referenced-by.resolver.d.ts +69 -0
  49. package/dist/backend/backend/src/services/wiki/referenced-by.resolver.d.ts.map +1 -0
  50. package/dist/backend/backend/src/services/wiki/referenced-by.resolver.js +174 -0
  51. package/dist/backend/backend/src/services/wiki/referenced-by.resolver.js.map +1 -0
  52. package/dist/backend/backend/src/services/wiki/schema-loader.service.d.ts +57 -0
  53. package/dist/backend/backend/src/services/wiki/schema-loader.service.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/wiki/schema-loader.service.js +183 -0
  55. package/dist/backend/backend/src/services/wiki/schema-loader.service.js.map +1 -0
  56. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +86 -0
  57. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +187 -0
  59. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -0
  60. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +116 -0
  61. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +299 -0
  63. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -0
  64. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
  65. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
  67. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
  68. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +100 -0
  69. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +212 -0
  71. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -0
  72. package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts +84 -0
  73. package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/wiki/wiki-process.service.js +138 -0
  75. package/dist/backend/backend/src/services/wiki/wiki-process.service.js.map +1 -0
  76. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +115 -0
  77. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/wiki/wiki-query.service.js +291 -0
  79. package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts +115 -0
  81. package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/wiki/wiki-queue.service.js +261 -0
  83. package/dist/backend/backend/src/services/wiki/wiki-queue.service.js.map +1 -0
  84. package/dist/backend/backend/src/services/wiki/wiki.types.d.ts +84 -0
  85. package/dist/backend/backend/src/services/wiki/wiki.types.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/wiki/wiki.types.js +10 -0
  87. package/dist/backend/backend/src/services/wiki/wiki.types.js.map +1 -0
  88. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +20 -0
  89. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  90. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +61 -0
  91. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  92. package/frontend/dist/assets/{index-b279da34.js → index-cc115bb4.js} +246 -246
  93. package/frontend/dist/assets/{index-c07e04c0.css → index-db3f5041.css} +1 -1
  94. package/frontend/dist/index.html +2 -2
  95. 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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"}