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,261 @@
|
|
|
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 * as path from 'path';
|
|
28
|
+
import * as os from 'os';
|
|
29
|
+
import * as fs from 'fs/promises';
|
|
30
|
+
import { existsSync } from 'fs';
|
|
31
|
+
import { randomUUID } from 'crypto';
|
|
32
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
33
|
+
const MAX_CONTENT_BYTES = 64 * 1024;
|
|
34
|
+
const MAX_REASON_BYTES = 2 * 1024;
|
|
35
|
+
/**
|
|
36
|
+
* File-backed queue. Stateless other than the on-disk JSONs and an
|
|
37
|
+
* in-memory cache of the root directory. Singleton because all writes
|
|
38
|
+
* go to the same on-disk pool.
|
|
39
|
+
*/
|
|
40
|
+
export class WikiQueueService {
|
|
41
|
+
static instance = null;
|
|
42
|
+
logger;
|
|
43
|
+
rootDir;
|
|
44
|
+
initPromise = null;
|
|
45
|
+
constructor(rootDir) {
|
|
46
|
+
this.logger = LoggerService.getInstance().createComponentLogger('WikiQueue');
|
|
47
|
+
this.rootDir = rootDir ?? path.join(os.homedir(), '.crewly', 'wiki-queue');
|
|
48
|
+
}
|
|
49
|
+
static getInstance() {
|
|
50
|
+
if (!this.instance)
|
|
51
|
+
this.instance = new WikiQueueService();
|
|
52
|
+
return this.instance;
|
|
53
|
+
}
|
|
54
|
+
/** Test-only reset. */
|
|
55
|
+
static _resetForTesting() {
|
|
56
|
+
this.instance = null;
|
|
57
|
+
}
|
|
58
|
+
/** Expose for tests. */
|
|
59
|
+
getRootDir() {
|
|
60
|
+
return this.rootDir;
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// CRUD
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
/** Enqueue a new candidate. Returns the persisted item. */
|
|
66
|
+
async add(input) {
|
|
67
|
+
this.validateAddInput(input);
|
|
68
|
+
await this.ensureRoot();
|
|
69
|
+
const item = {
|
|
70
|
+
id: randomUUID(),
|
|
71
|
+
vaultPath: input.vaultPath,
|
|
72
|
+
queuedAt: new Date().toISOString(),
|
|
73
|
+
queuedBy: input.queuedBy,
|
|
74
|
+
sourceType: input.sourceType,
|
|
75
|
+
sourceRef: input.sourceRef,
|
|
76
|
+
content: input.content,
|
|
77
|
+
reason: input.reason,
|
|
78
|
+
status: 'pending',
|
|
79
|
+
};
|
|
80
|
+
await this.writeItem(item);
|
|
81
|
+
this.logger.info('WikiQueue add', {
|
|
82
|
+
id: item.id,
|
|
83
|
+
vaultPath: item.vaultPath,
|
|
84
|
+
sourceType: item.sourceType,
|
|
85
|
+
queuedBy: item.queuedBy,
|
|
86
|
+
bytes: Buffer.byteLength(item.content, 'utf8'),
|
|
87
|
+
});
|
|
88
|
+
return item;
|
|
89
|
+
}
|
|
90
|
+
/** List items, newest-first, optionally filtered. */
|
|
91
|
+
async list(filter = {}) {
|
|
92
|
+
await this.ensureRoot();
|
|
93
|
+
const limit = filter.limit ?? 50;
|
|
94
|
+
const entries = await fs.readdir(this.rootDir, { withFileTypes: true });
|
|
95
|
+
const items = [];
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
if (!entry.isFile() || !entry.name.endsWith('.json'))
|
|
98
|
+
continue;
|
|
99
|
+
const item = await this.readItemFile(path.join(this.rootDir, entry.name));
|
|
100
|
+
if (!item)
|
|
101
|
+
continue;
|
|
102
|
+
if (filter.vaultPath && item.vaultPath !== filter.vaultPath)
|
|
103
|
+
continue;
|
|
104
|
+
if (filter.status && item.status !== filter.status)
|
|
105
|
+
continue;
|
|
106
|
+
if (filter.queuedBy && item.queuedBy !== filter.queuedBy)
|
|
107
|
+
continue;
|
|
108
|
+
items.push(item);
|
|
109
|
+
}
|
|
110
|
+
items.sort((a, b) => (a.queuedAt < b.queuedAt ? 1 : -1));
|
|
111
|
+
return items.slice(0, limit);
|
|
112
|
+
}
|
|
113
|
+
/** Fetch one by id. Returns null when missing. */
|
|
114
|
+
async get(id) {
|
|
115
|
+
await this.ensureRoot();
|
|
116
|
+
const file = path.join(this.rootDir, `${id}.json`);
|
|
117
|
+
return this.readItemFile(file);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Claim an item — only allowed when `status: pending`. Stamps the
|
|
121
|
+
* claimant + timestamp atomically.
|
|
122
|
+
*/
|
|
123
|
+
async claim(id, claimedBy) {
|
|
124
|
+
const item = await this.requireItem(id);
|
|
125
|
+
if (item.status !== 'pending') {
|
|
126
|
+
throw new Error(`WikiQueue.claim(${id}): item is ${item.status}; only pending items can be claimed`);
|
|
127
|
+
}
|
|
128
|
+
const updated = {
|
|
129
|
+
...item,
|
|
130
|
+
status: 'claimed',
|
|
131
|
+
claimedBy,
|
|
132
|
+
claimedAt: new Date().toISOString(),
|
|
133
|
+
};
|
|
134
|
+
await this.writeItem(updated);
|
|
135
|
+
this.logger.info('WikiQueue claim', { id, claimedBy });
|
|
136
|
+
return updated;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Mark processed. Requires the item to be `claimed` AND requires a
|
|
140
|
+
* `result` with at least one of `pagesWritten` / `targetPath` / `summary`.
|
|
141
|
+
*/
|
|
142
|
+
async markProcessed(id, result) {
|
|
143
|
+
const item = await this.requireItem(id);
|
|
144
|
+
if (item.status !== 'claimed') {
|
|
145
|
+
throw new Error(`WikiQueue.markProcessed(${id}): item is ${item.status}; must be claimed first`);
|
|
146
|
+
}
|
|
147
|
+
const updated = {
|
|
148
|
+
...item,
|
|
149
|
+
status: 'processed',
|
|
150
|
+
processedAt: new Date().toISOString(),
|
|
151
|
+
result,
|
|
152
|
+
};
|
|
153
|
+
await this.writeItem(updated);
|
|
154
|
+
this.logger.info('WikiQueue processed', {
|
|
155
|
+
id,
|
|
156
|
+
pages: result.pagesWritten?.length ?? 0,
|
|
157
|
+
target: result.targetPath,
|
|
158
|
+
});
|
|
159
|
+
return updated;
|
|
160
|
+
}
|
|
161
|
+
/** Mark skipped — agent decided this isn't wiki-worthy after all. */
|
|
162
|
+
async markSkipped(id, skipReason) {
|
|
163
|
+
if (!skipReason || skipReason.trim().length === 0) {
|
|
164
|
+
throw new Error('WikiQueue.markSkipped requires a non-empty skipReason');
|
|
165
|
+
}
|
|
166
|
+
const item = await this.requireItem(id);
|
|
167
|
+
if (item.status !== 'claimed') {
|
|
168
|
+
throw new Error(`WikiQueue.markSkipped(${id}): item is ${item.status}; must be claimed first`);
|
|
169
|
+
}
|
|
170
|
+
const updated = {
|
|
171
|
+
...item,
|
|
172
|
+
status: 'skipped',
|
|
173
|
+
processedAt: new Date().toISOString(),
|
|
174
|
+
result: { ingested: false, skipReason },
|
|
175
|
+
};
|
|
176
|
+
await this.writeItem(updated);
|
|
177
|
+
this.logger.info('WikiQueue skipped', { id, reason: skipReason });
|
|
178
|
+
return updated;
|
|
179
|
+
}
|
|
180
|
+
/** Status counts, optionally scoped to a vault. */
|
|
181
|
+
async getStats(vaultPath) {
|
|
182
|
+
const items = await this.list({ vaultPath, limit: Number.MAX_SAFE_INTEGER });
|
|
183
|
+
const counts = {
|
|
184
|
+
pending: 0,
|
|
185
|
+
claimed: 0,
|
|
186
|
+
processed: 0,
|
|
187
|
+
skipped: 0,
|
|
188
|
+
total: items.length,
|
|
189
|
+
};
|
|
190
|
+
for (const it of items) {
|
|
191
|
+
counts[it.status]++;
|
|
192
|
+
}
|
|
193
|
+
return counts;
|
|
194
|
+
}
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Internals
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
validateAddInput(input) {
|
|
199
|
+
if (!input.vaultPath || !path.isAbsolute(input.vaultPath)) {
|
|
200
|
+
throw new Error('WikiQueue.add: vaultPath must be absolute');
|
|
201
|
+
}
|
|
202
|
+
if (!input.queuedBy)
|
|
203
|
+
throw new Error('WikiQueue.add: queuedBy is required');
|
|
204
|
+
if (!input.sourceType)
|
|
205
|
+
throw new Error('WikiQueue.add: sourceType is required');
|
|
206
|
+
if (!input.sourceRef)
|
|
207
|
+
throw new Error('WikiQueue.add: sourceRef is required');
|
|
208
|
+
const content = input.content ?? '';
|
|
209
|
+
if (content.trim().length === 0) {
|
|
210
|
+
throw new Error('WikiQueue.add: content is empty');
|
|
211
|
+
}
|
|
212
|
+
if (Buffer.byteLength(content, 'utf8') > MAX_CONTENT_BYTES) {
|
|
213
|
+
throw new Error(`WikiQueue.add: content exceeds ${MAX_CONTENT_BYTES} bytes`);
|
|
214
|
+
}
|
|
215
|
+
const reason = input.reason ?? '';
|
|
216
|
+
if (reason.trim().length === 0) {
|
|
217
|
+
throw new Error('WikiQueue.add: reason is required — agents MUST justify why this is wiki-worthy');
|
|
218
|
+
}
|
|
219
|
+
if (Buffer.byteLength(reason, 'utf8') > MAX_REASON_BYTES) {
|
|
220
|
+
throw new Error(`WikiQueue.add: reason exceeds ${MAX_REASON_BYTES} bytes`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async ensureRoot() {
|
|
224
|
+
if (this.initPromise) {
|
|
225
|
+
await this.initPromise;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
this.initPromise = (async () => {
|
|
229
|
+
if (!existsSync(this.rootDir)) {
|
|
230
|
+
await fs.mkdir(this.rootDir, { recursive: true });
|
|
231
|
+
}
|
|
232
|
+
})();
|
|
233
|
+
await this.initPromise;
|
|
234
|
+
}
|
|
235
|
+
async writeItem(item) {
|
|
236
|
+
const file = path.join(this.rootDir, `${item.id}.json`);
|
|
237
|
+
const tmp = `${file}.tmp`;
|
|
238
|
+
await fs.writeFile(tmp, JSON.stringify(item, null, 2), 'utf8');
|
|
239
|
+
await fs.rename(tmp, file); // atomic on the same filesystem
|
|
240
|
+
}
|
|
241
|
+
async readItemFile(file) {
|
|
242
|
+
try {
|
|
243
|
+
const raw = await fs.readFile(file, 'utf8');
|
|
244
|
+
const parsed = JSON.parse(raw);
|
|
245
|
+
// Soft validation — discard rows that don't match the shape we own.
|
|
246
|
+
if (!parsed.id || !parsed.status || !parsed.queuedAt)
|
|
247
|
+
return null;
|
|
248
|
+
return parsed;
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async requireItem(id) {
|
|
255
|
+
const item = await this.get(id);
|
|
256
|
+
if (!item)
|
|
257
|
+
throw new Error(`WikiQueue: item not found: ${id}`);
|
|
258
|
+
return item;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=wiki-queue.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-queue.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-queue.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-Wiki shared types.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the SCHEMA.md YAML shape defined in
|
|
5
|
+
* .crewly/specs/2026-05-22-atlas-crewly-llm-wiki-v2-three-scope.md §2.
|
|
6
|
+
*
|
|
7
|
+
* @module services/wiki/wiki.types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The three vault scopes per v2.1 §1.
|
|
11
|
+
*
|
|
12
|
+
* - `team`: ~/.crewly/teams/<team-id>/wiki/ (cross-project team norms)
|
|
13
|
+
* - `project`: <project-root>/.crewly/wiki/ (project-scoped knowledge)
|
|
14
|
+
* - `global`: ~/.crewly/global-wiki/ (ORC cross-project synthesis)
|
|
15
|
+
*/
|
|
16
|
+
export type VaultScope = 'team' | 'project' | 'global';
|
|
17
|
+
/**
|
|
18
|
+
* A symbolic `referenced_by:` entry in SCHEMA.md.
|
|
19
|
+
*
|
|
20
|
+
* Format: `<kind>:<name>` (e.g. `skill:get-sops`, `service:sop.service`).
|
|
21
|
+
* Resolves to an absolute filesystem path via
|
|
22
|
+
* {@link ReferencedByResolver.resolve} so SCHEMA.md stays portable across
|
|
23
|
+
* machines, users, and runtime targets.
|
|
24
|
+
*/
|
|
25
|
+
export type ReferencedBySymbol = `skill:${string}` | `service:${string}`;
|
|
26
|
+
/**
|
|
27
|
+
* A folder entry inside a vault's `hardcoded:` block.
|
|
28
|
+
*
|
|
29
|
+
* Hardcoded folders are referenced by string literal from OSS code. They
|
|
30
|
+
* MUST NOT be moved, renamed, or restructured by `wiki-lint`.
|
|
31
|
+
*/
|
|
32
|
+
export interface HardcodedFolder {
|
|
33
|
+
/** Folder name relative to vault root, e.g. `sop/`, `memory/`. */
|
|
34
|
+
path: string;
|
|
35
|
+
/** Always true for entries in `hardcoded:`. */
|
|
36
|
+
frozen: true;
|
|
37
|
+
/** Human description; appears in lint reports. */
|
|
38
|
+
description: string;
|
|
39
|
+
/** Symbolic refs to code that hard-codes this path. Use `skill:` / `service:`. */
|
|
40
|
+
referenced_by: ReferencedBySymbol[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The single `llm-curated:` folder entry — LLM owns sub-structure entirely.
|
|
44
|
+
*/
|
|
45
|
+
export interface LlmCuratedFolder {
|
|
46
|
+
/** Always `llm-curated/`. */
|
|
47
|
+
path: string;
|
|
48
|
+
/** Always false; lint MAY restructure. */
|
|
49
|
+
frozen: false;
|
|
50
|
+
/** Initial subdirs to seed; LLM may add more if `llm_can_create_subdirs`. */
|
|
51
|
+
seed_subdirs: string[];
|
|
52
|
+
llm_can_create_subdirs: boolean;
|
|
53
|
+
lint_may_restructure: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* `write_policy:` block — who may write canonical pages vs. propose-only.
|
|
57
|
+
*/
|
|
58
|
+
export interface WritePolicy {
|
|
59
|
+
/** Roles allowed to write canonical pages via `wiki-ingest`. */
|
|
60
|
+
canonical: string[];
|
|
61
|
+
/** Roles whose ingest writes are PR-style; TL/ORC must accept. */
|
|
62
|
+
proposed_only: string[];
|
|
63
|
+
/** Roles allowed to modify SCHEMA.md itself. */
|
|
64
|
+
schema_writer: string[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parsed SCHEMA.md content for one vault.
|
|
68
|
+
*/
|
|
69
|
+
export interface VaultSchema {
|
|
70
|
+
vault_scope: VaultScope;
|
|
71
|
+
vault_id: string;
|
|
72
|
+
hardcoded: HardcodedFolder[];
|
|
73
|
+
llm_curated: LlmCuratedFolder[];
|
|
74
|
+
write_policy: WritePolicy;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Result of resolving a symbolic `referenced_by:` entry.
|
|
78
|
+
*/
|
|
79
|
+
export interface ResolvedReference {
|
|
80
|
+
symbol: ReferencedBySymbol;
|
|
81
|
+
absolutePath: string;
|
|
82
|
+
exists: boolean;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=wiki.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,MAAM,EAAE,GAAG,WAAW,MAAM,EAAE,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,IAAI,CAAC;IACb,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,aAAa,EAAE,kBAAkB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,EAAE,KAAK,CAAC;IACd,6EAA6E;IAC7E,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kEAAkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gDAAgD;IAChD,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,UAAU,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,YAAY,EAAE,WAAW,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -483,6 +483,26 @@ export declare class TaskPoolService {
|
|
|
483
483
|
* @throws Error if work item not found or not in 'running' status
|
|
484
484
|
*/
|
|
485
485
|
failItem(workItemId: string, error: string): Promise<void>;
|
|
486
|
+
/**
|
|
487
|
+
* Requeue a failed WorkItem back to `queued` for another attempt.
|
|
488
|
+
*
|
|
489
|
+
* Path: `failed → queued` (legal in WORK_ITEM_TRANSITIONS but previously
|
|
490
|
+
* unused — the system never auto-retried, every failure was terminal).
|
|
491
|
+
* Increments `retryCount`, clears `startedAt`, preserves `target` so
|
|
492
|
+
* the same agent gets a second shot, and records the previous error
|
|
493
|
+
* on the WI's metadata for postmortem visibility.
|
|
494
|
+
*
|
|
495
|
+
* Caller must have ALREADY confirmed `retryCount < maxRetries` — this
|
|
496
|
+
* method does NOT enforce the cap, on the assumption that the caller
|
|
497
|
+
* (v3-data.onTaskFailed) handles the exhausted-retries branch with
|
|
498
|
+
* escalation to ORC.
|
|
499
|
+
*
|
|
500
|
+
* @param workItemId - The failed WI to retry
|
|
501
|
+
* @param reason - Why the previous attempt failed (recorded on
|
|
502
|
+
* metadata.lastFailureReason; surfaces in the activity timeline)
|
|
503
|
+
* @throws if the WI doesn't exist or isn't in `failed` status
|
|
504
|
+
*/
|
|
505
|
+
requeueAfterFailure(workItemId: string, reason: string): Promise<void>;
|
|
486
506
|
/**
|
|
487
507
|
* Processes a heartbeat from an agent for their active claim.
|
|
488
508
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-pool.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/task-pool.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"task-pool.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/task-pool.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1004,6 +1004,67 @@ export class TaskPoolService {
|
|
|
1004
1004
|
await this.storage.flush();
|
|
1005
1005
|
this.logger.info('WorkItem failed', { workItemId, error });
|
|
1006
1006
|
}
|
|
1007
|
+
/**
|
|
1008
|
+
* Requeue a failed WorkItem back to `queued` for another attempt.
|
|
1009
|
+
*
|
|
1010
|
+
* Path: `failed → queued` (legal in WORK_ITEM_TRANSITIONS but previously
|
|
1011
|
+
* unused — the system never auto-retried, every failure was terminal).
|
|
1012
|
+
* Increments `retryCount`, clears `startedAt`, preserves `target` so
|
|
1013
|
+
* the same agent gets a second shot, and records the previous error
|
|
1014
|
+
* on the WI's metadata for postmortem visibility.
|
|
1015
|
+
*
|
|
1016
|
+
* Caller must have ALREADY confirmed `retryCount < maxRetries` — this
|
|
1017
|
+
* method does NOT enforce the cap, on the assumption that the caller
|
|
1018
|
+
* (v3-data.onTaskFailed) handles the exhausted-retries branch with
|
|
1019
|
+
* escalation to ORC.
|
|
1020
|
+
*
|
|
1021
|
+
* @param workItemId - The failed WI to retry
|
|
1022
|
+
* @param reason - Why the previous attempt failed (recorded on
|
|
1023
|
+
* metadata.lastFailureReason; surfaces in the activity timeline)
|
|
1024
|
+
* @throws if the WI doesn't exist or isn't in `failed` status
|
|
1025
|
+
*/
|
|
1026
|
+
async requeueAfterFailure(workItemId, reason) {
|
|
1027
|
+
const workItem = await this.storage.findWorkItem(workItemId);
|
|
1028
|
+
if (!workItem) {
|
|
1029
|
+
throw new Error(`WorkItem not found: ${workItemId}`);
|
|
1030
|
+
}
|
|
1031
|
+
if (workItem.status !== 'failed') {
|
|
1032
|
+
throw new Error(`Cannot requeue WorkItem after failure: status must be 'failed', got '${workItem.status}'`);
|
|
1033
|
+
}
|
|
1034
|
+
await this.transitionStatus(workItemId, 'queued', 'system', (wi) => {
|
|
1035
|
+
wi.retryCount += 1;
|
|
1036
|
+
wi.startedAt = undefined;
|
|
1037
|
+
wi.completedAt = undefined;
|
|
1038
|
+
// Keep `target` — the original agent should get the retry.
|
|
1039
|
+
// APPEND to failureHistory so postmortems see all attempts, not
|
|
1040
|
+
// just the most recent. `lastFailureReason` / `lastFailureAt`
|
|
1041
|
+
// are retained for back-compat with dashboards that already
|
|
1042
|
+
// read those scalar fields. Cap history at 10 entries so a
|
|
1043
|
+
// pathological retry loop can't bloat the metadata indefinitely.
|
|
1044
|
+
const now = new Date().toISOString();
|
|
1045
|
+
const priorHistory = wi.metadata?.failureHistory ?? [];
|
|
1046
|
+
wi.metadata = {
|
|
1047
|
+
...(wi.metadata ?? {}),
|
|
1048
|
+
failureHistory: [
|
|
1049
|
+
...priorHistory,
|
|
1050
|
+
{ at: now, reason, retryAttempt: wi.retryCount },
|
|
1051
|
+
].slice(-10),
|
|
1052
|
+
lastFailureReason: reason,
|
|
1053
|
+
lastFailureAt: now,
|
|
1054
|
+
retryAttempt: wi.retryCount,
|
|
1055
|
+
};
|
|
1056
|
+
// Clear the error field so a successful retry doesn't surface a
|
|
1057
|
+
// stale error message; the metadata above keeps the history.
|
|
1058
|
+
wi.error = undefined;
|
|
1059
|
+
});
|
|
1060
|
+
await this.storage.flush();
|
|
1061
|
+
this.logger.info('WorkItem requeued after failure', {
|
|
1062
|
+
workItemId,
|
|
1063
|
+
retryCount: workItem.retryCount + 1,
|
|
1064
|
+
maxRetries: workItem.maxRetries,
|
|
1065
|
+
reason,
|
|
1066
|
+
});
|
|
1067
|
+
}
|
|
1007
1068
|
// -----------------------------------------------------------------------
|
|
1008
1069
|
// Claim Lifecycle (delegated to ClaimService)
|
|
1009
1070
|
// -----------------------------------------------------------------------
|