openwolf-enhanced 1.16.4 → 1.17.0
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/CHANGELOG.md +89 -0
- package/dist/dashboard/assets/{AISuggestions-Bk2F6IMl.js → AISuggestions-1R0pnlm9.js} +1 -1
- package/dist/dashboard/assets/{ActivityLog-D7u5Uwi1.js → ActivityLog-Cet80S6D.js} +1 -1
- package/dist/dashboard/assets/{ActivityTimeline-CLPCD9dE.js → ActivityTimeline-CoCPhZRg.js} +1 -1
- package/dist/dashboard/assets/{AnatomyBrowser-BVsQpjKI.js → AnatomyBrowser-BK7WiuNN.js} +1 -1
- package/dist/dashboard/assets/{BugLog-n1EpyWfO.js → BugLog-DlOfPz4q.js} +1 -1
- package/dist/dashboard/assets/{CerebrumViewer-W7MFBI7b.js → CerebrumViewer-C0gSBIxg.js} +1 -1
- package/dist/dashboard/assets/{CronStatus-C9FslgLc.js → CronStatus-DMGKkek9.js} +1 -1
- package/dist/dashboard/assets/{DesignQC-DvTlN82L.js → DesignQC-BUjKJ4wE.js} +1 -1
- package/dist/dashboard/assets/{MemoryViewer-CFJ7Bol5.js → MemoryViewer-CbFNeqWm.js} +1 -1
- package/dist/dashboard/assets/{NativeMemory-DXCXjoAZ.js → NativeMemory-DEAyhwK9.js} +1 -1
- package/dist/dashboard/assets/{ProjectOverview-BMbticJw.js → ProjectOverview-CnxeetBi.js} +1 -1
- package/dist/dashboard/assets/{ProjectsAggregate-BZWOl8-e.js → ProjectsAggregate-DG5Vxc2k.js} +1 -1
- package/dist/dashboard/assets/{StatusBadge-D7dxnKHj.js → StatusBadge-DelYV9XQ.js} +1 -1
- package/dist/dashboard/assets/{TokenUsage-B0slEA8g.js → TokenUsage-Bvk7bQ1V.js} +1 -1
- package/dist/dashboard/assets/{index-mmPsxyms.js → index-QzB3QJTS.js} +3 -3
- package/dist/dashboard/index.html +1 -1
- package/dist/src/cli/consolidate-cmd.js +14 -7
- package/dist/src/cli/consolidate-cmd.js.map +1 -1
- package/dist/src/cli/index.js +10 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/llm-cmd.js +82 -0
- package/dist/src/cli/llm-cmd.js.map +1 -0
- package/dist/src/cli/recall-cmd.js +10 -1
- package/dist/src/cli/recall-cmd.js.map +1 -1
- package/dist/src/daemon/cron-engine.js +191 -57
- package/dist/src/daemon/cron-engine.js.map +1 -1
- package/dist/src/daemon/llm-provider.js +64 -8
- package/dist/src/daemon/llm-provider.js.map +1 -1
- package/dist/src/daemon/wolf-daemon.js +4 -2
- package/dist/src/daemon/wolf-daemon.js.map +1 -1
- package/dist/src/utils/recall.js +4 -0
- package/dist/src/utils/recall.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,13 +4,50 @@ import cron from "node-cron";
|
|
|
4
4
|
import { readJSON, writeJSON, readText, writeText, withLock } from "../utils/fs-safe.js";
|
|
5
5
|
import { scanProject } from "../scanner/anatomy-scanner.js";
|
|
6
6
|
import { detectWaste } from "../tracker/waste-detector.js";
|
|
7
|
-
import { resolveLlmConfig,
|
|
7
|
+
import { resolveLlmConfig, callLlmDetailed, requiresApiKey } from "./llm-provider.js";
|
|
8
|
+
/**
|
|
9
|
+
* Split text into chunks that fit a context window — at paragraph boundaries, never mid-sentence.
|
|
10
|
+
*
|
|
11
|
+
* The old code did `content.slice(-MAX)`: it kept the tail and threw the rest away. For a knowledge
|
|
12
|
+
* base that is not a size limit, it is data loss with extra steps — the model then "cleans" a quarter
|
|
13
|
+
* of the file and the other three quarters cease to exist. Splitting keeps every byte; the model just
|
|
14
|
+
* reads it in several passes.
|
|
15
|
+
*/
|
|
16
|
+
export function splitForContext(text, maxBytes) {
|
|
17
|
+
if (Buffer.byteLength(text, "utf-8") <= maxBytes)
|
|
18
|
+
return [text];
|
|
19
|
+
const chunks = [];
|
|
20
|
+
let current = "";
|
|
21
|
+
for (const para of text.split(/\n\n+/)) {
|
|
22
|
+
const candidate = current ? `${current}\n\n${para}` : para;
|
|
23
|
+
if (current && Buffer.byteLength(candidate, "utf-8") > maxBytes) {
|
|
24
|
+
chunks.push(current);
|
|
25
|
+
current = para;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
current = candidate;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (current)
|
|
32
|
+
chunks.push(current);
|
|
33
|
+
// A single paragraph bigger than the window still has to be cut somewhere — but it is the only
|
|
34
|
+
// case where anything is cut, and it is cut into pieces rather than thrown away.
|
|
35
|
+
return chunks.flatMap((c) => {
|
|
36
|
+
if (Buffer.byteLength(c, "utf-8") <= maxBytes)
|
|
37
|
+
return [c];
|
|
38
|
+
const out = [];
|
|
39
|
+
for (let i = 0; i < c.length; i += maxBytes)
|
|
40
|
+
out.push(c.slice(i, i + maxBytes));
|
|
41
|
+
return out;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
8
44
|
export class CronEngine {
|
|
9
45
|
wolfDir;
|
|
10
46
|
projectRoot;
|
|
11
47
|
logger;
|
|
12
48
|
broadcast;
|
|
13
49
|
scheduledTasks = [];
|
|
50
|
+
retryTimers = new Set();
|
|
14
51
|
failureCounts = new Map();
|
|
15
52
|
constructor(wolfDir, projectRoot, logger, broadcast) {
|
|
16
53
|
this.wolfDir = wolfDir;
|
|
@@ -41,6 +78,11 @@ export class CronEngine {
|
|
|
41
78
|
task.stop();
|
|
42
79
|
}
|
|
43
80
|
this.scheduledTasks = [];
|
|
81
|
+
// Retries are scheduled with setTimeout, not node-cron, so task.stop() above doesn't touch them.
|
|
82
|
+
// Left alone, a pending retry fires after shutdown and runs against a daemon that thinks it stopped.
|
|
83
|
+
for (const timer of this.retryTimers)
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
this.retryTimers.clear();
|
|
44
86
|
}
|
|
45
87
|
async runTask(taskId) {
|
|
46
88
|
const manifest = this.readManifest();
|
|
@@ -68,21 +110,24 @@ export class CronEngine {
|
|
|
68
110
|
const startTime = Date.now();
|
|
69
111
|
this.logger.info(`Executing task: ${task.name}`);
|
|
70
112
|
try {
|
|
71
|
-
await this.runAction(task.action);
|
|
113
|
+
await this.runAction(task.action, task.id);
|
|
72
114
|
const duration = Date.now() - startTime;
|
|
73
|
-
// Log success
|
|
74
|
-
|
|
75
|
-
state.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
115
|
+
// Log success. Re-read under a lock and write immediately: a concurrent task (or its long LLM
|
|
116
|
+
// await) could otherwise read the same snapshot and clobber this entry on write — lost logs.
|
|
117
|
+
withLock(path.join(this.wolfDir, "cron-state.json"), () => {
|
|
118
|
+
const state = this.readState();
|
|
119
|
+
state.execution_log.push({
|
|
120
|
+
task_id: task.id,
|
|
121
|
+
status: "success",
|
|
122
|
+
timestamp: new Date().toISOString(),
|
|
123
|
+
duration_ms: duration,
|
|
124
|
+
});
|
|
125
|
+
// Keep last 100 entries
|
|
126
|
+
if (state.execution_log.length > 100) {
|
|
127
|
+
state.execution_log = state.execution_log.slice(-100);
|
|
128
|
+
}
|
|
129
|
+
this.writeState(state);
|
|
80
130
|
});
|
|
81
|
-
// Keep last 100 entries
|
|
82
|
-
if (state.execution_log.length > 100) {
|
|
83
|
-
state.execution_log = state.execution_log.slice(-100);
|
|
84
|
-
}
|
|
85
|
-
this.writeState(state);
|
|
86
131
|
this.failureCounts.set(task.id, 0);
|
|
87
132
|
this.broadcast({
|
|
88
133
|
type: "cron_executed",
|
|
@@ -102,33 +147,38 @@ export class CronEngine {
|
|
|
102
147
|
// Retry with backoff
|
|
103
148
|
const delay = this.calculateDelay(task.retry.backoff, task.retry.base_delay_seconds, failures);
|
|
104
149
|
this.logger.info(`Retrying ${task.name} in ${delay}ms`);
|
|
105
|
-
setTimeout(() => {
|
|
150
|
+
const timer = setTimeout(() => {
|
|
151
|
+
this.retryTimers.delete(timer);
|
|
106
152
|
this.executeTask(task).catch(() => { });
|
|
107
153
|
}, delay);
|
|
154
|
+
this.retryTimers.add(timer);
|
|
108
155
|
}
|
|
109
156
|
else {
|
|
110
|
-
// Dead letter or skip
|
|
111
|
-
|
|
112
|
-
state.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
timestamp: new Date().toISOString(),
|
|
116
|
-
duration_ms: duration,
|
|
117
|
-
error: errorMsg,
|
|
118
|
-
});
|
|
119
|
-
if (task.failsafe.dead_letter) {
|
|
120
|
-
state.dead_letter_queue.push({
|
|
157
|
+
// Dead letter or skip. Same lock as the success path — read-modify-write under it so a
|
|
158
|
+
// concurrent task cannot overwrite this failure record with its own stale snapshot.
|
|
159
|
+
withLock(path.join(this.wolfDir, "cron-state.json"), () => {
|
|
160
|
+
const state = this.readState();
|
|
161
|
+
state.execution_log.push({
|
|
121
162
|
task_id: task.id,
|
|
122
|
-
|
|
163
|
+
status: "failed",
|
|
123
164
|
timestamp: new Date().toISOString(),
|
|
124
|
-
|
|
165
|
+
duration_ms: duration,
|
|
166
|
+
error: errorMsg,
|
|
125
167
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
168
|
+
if (task.failsafe.dead_letter) {
|
|
169
|
+
state.dead_letter_queue.push({
|
|
170
|
+
task_id: task.id,
|
|
171
|
+
error: errorMsg,
|
|
172
|
+
timestamp: new Date().toISOString(),
|
|
173
|
+
attempts: failures,
|
|
174
|
+
});
|
|
175
|
+
// Keep the dead-letter queue bounded (execution_log is already capped elsewhere).
|
|
176
|
+
if (state.dead_letter_queue.length > 100) {
|
|
177
|
+
state.dead_letter_queue = state.dead_letter_queue.slice(-100);
|
|
178
|
+
}
|
|
129
179
|
}
|
|
130
|
-
|
|
131
|
-
|
|
180
|
+
this.writeState(state);
|
|
181
|
+
});
|
|
132
182
|
this.failureCounts.set(task.id, 0);
|
|
133
183
|
// Notify the dashboard that this task permanently failed (upstream #4, bug 1).
|
|
134
184
|
this.broadcast({ type: "task_error", task_id: task.id, error: errorMsg });
|
|
@@ -152,7 +202,7 @@ export class CronEngine {
|
|
|
152
202
|
return 0;
|
|
153
203
|
}
|
|
154
204
|
}
|
|
155
|
-
async runAction(action) {
|
|
205
|
+
async runAction(action, taskId = "ai_task") {
|
|
156
206
|
switch (action.type) {
|
|
157
207
|
case "scan_project":
|
|
158
208
|
scanProject(this.wolfDir, this.projectRoot);
|
|
@@ -164,7 +214,7 @@ export class CronEngine {
|
|
|
164
214
|
this.generateTokenReport();
|
|
165
215
|
break;
|
|
166
216
|
case "ai_task":
|
|
167
|
-
await this.runAiTask(action.params);
|
|
217
|
+
await this.runAiTask(action.params, taskId);
|
|
168
218
|
break;
|
|
169
219
|
default:
|
|
170
220
|
throw new Error(`Unknown action type: ${action.type}`);
|
|
@@ -234,55 +284,139 @@ export class CronEngine {
|
|
|
234
284
|
writeJSON(ledgerPath, ledger);
|
|
235
285
|
});
|
|
236
286
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
287
|
+
/**
|
|
288
|
+
* Run a model over the project's own knowledge files.
|
|
289
|
+
*
|
|
290
|
+
* Default output is `mode: "proposal"`: the model NEVER writes a canonical file. It reads, and it
|
|
291
|
+
* writes its answer to `.wolf/proposals/<task>-<stamp>.md`, which a human — or a stronger model in a
|
|
292
|
+
* session — reviews before anything is adopted. The local model does the legwork; authority over what
|
|
293
|
+
* is true stays with the reader.
|
|
294
|
+
*
|
|
295
|
+
* This is not caution for its own sake. With `mode: "overwrite"` (opt-in, still supported), this exact
|
|
296
|
+
* path was one Sunday away from replacing a 78 KB cerebrum.md with a 3.9 KB "cleaned" version — see
|
|
297
|
+
* writeCerebrumFromAi.
|
|
298
|
+
*
|
|
299
|
+
* Files larger than the model's context are SPLIT, not truncated. Cutting a knowledge base to its tail
|
|
300
|
+
* and asking for "the cleaned file" is how the 95%-loss bug happened; reading it in pieces means the
|
|
301
|
+
* model actually sees all of it, just not at once.
|
|
302
|
+
*/
|
|
303
|
+
async runAiTask(params, taskId) {
|
|
304
|
+
const mode = params.mode ?? "proposal";
|
|
305
|
+
const chunkBytes = params.chunk_bytes ?? 20 * 1024;
|
|
241
306
|
const rootPrefix = path.resolve(this.projectRoot) + path.sep;
|
|
307
|
+
const files = [];
|
|
242
308
|
for (const file of params.context_files) {
|
|
243
309
|
const filePath = path.resolve(this.projectRoot, file);
|
|
244
310
|
// Reject paths that escape the project root (e.g. "../../etc/passwd") — the file
|
|
245
311
|
// contents are fed to the model, so traversal would exfiltrate arbitrary files (#34).
|
|
246
312
|
if (filePath !== path.resolve(this.projectRoot) && !filePath.startsWith(rootPrefix)) {
|
|
247
|
-
|
|
313
|
+
files.push({ name: file, chunks: ["(rejected: outside project root)"] });
|
|
248
314
|
continue;
|
|
249
315
|
}
|
|
250
316
|
try {
|
|
251
|
-
|
|
252
|
-
if (Buffer.byteLength(content, "utf-8") > MAX_CONTEXT_BYTES) {
|
|
253
|
-
content = "...[truncated — showing most recent]\n" + content.slice(-MAX_CONTEXT_BYTES);
|
|
254
|
-
}
|
|
255
|
-
contextParts.push(`--- ${file} ---\n${content}`);
|
|
317
|
+
files.push({ name: file, chunks: splitForContext(fs.readFileSync(filePath, "utf-8"), chunkBytes) });
|
|
256
318
|
}
|
|
257
319
|
catch {
|
|
258
|
-
|
|
320
|
+
files.push({ name: file, chunks: ["(not found)"] });
|
|
259
321
|
}
|
|
260
322
|
}
|
|
261
|
-
const fullPrompt = `${params.prompt}\n\n---\nContext:\n${contextParts.join("\n\n")}`;
|
|
262
323
|
// A background daemon can't drive the interactive `claude` CLI (it delegates auth to the
|
|
263
324
|
// desktop app and fails headless). Use a direct API key instead, with a clear error if it's
|
|
264
325
|
// missing — the dashboard then shows a copy-able prompt to run inside a session (upstream #4, bug 2).
|
|
265
326
|
// The provider/model/endpoint are config-driven (openwolf.cron.llm_*), defaulting to Anthropic.
|
|
266
327
|
const llm = resolveLlmConfig(this.wolfDir);
|
|
267
|
-
const apiKey = process.env[llm.apiKeyEnv];
|
|
268
|
-
if (!apiKey) {
|
|
328
|
+
const apiKey = process.env[llm.apiKeyEnv] ?? "";
|
|
329
|
+
if (!apiKey && requiresApiKey(llm)) {
|
|
269
330
|
throw new Error(`${llm.apiKeyEnv} is not set. AI tasks require a direct API key when running as a background daemon. ` +
|
|
270
|
-
`Set it in your shell profile: export ${llm.apiKeyEnv}
|
|
331
|
+
`Set it in your shell profile: export ${llm.apiKeyEnv}=… — or point openwolf.cron.llm_base_url at a ` +
|
|
332
|
+
`local model server (LM Studio on http://localhost:1234/v1, Ollama on http://localhost:11434/v1), which needs no key.`);
|
|
271
333
|
}
|
|
272
|
-
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
334
|
+
const totalChunks = files.reduce((n, f) => n + f.chunks.length, 0);
|
|
335
|
+
const sections = [];
|
|
336
|
+
for (const f of files) {
|
|
337
|
+
for (const [i, chunk] of f.chunks.entries()) {
|
|
338
|
+
const part = f.chunks.length > 1 ? ` (part ${i + 1}/${f.chunks.length})` : "";
|
|
339
|
+
const fullPrompt = `${params.prompt}\n\n---\nContext — ${f.name}${part}:\n${chunk}`;
|
|
340
|
+
// 16k, not the 4k default: a reasoning model spends thousands of tokens thinking before the
|
|
341
|
+
// first character of its answer. Too small a budget does not fail loudly — it returns HALF a
|
|
342
|
+
// file, which still looks like a valid result to any writer downstream.
|
|
343
|
+
const { text, truncated } = await callLlmDetailed(llm, apiKey, fullPrompt, { maxTokens: 16000, timeoutMs: 600_000 });
|
|
344
|
+
if (truncated)
|
|
345
|
+
throw new Error(`The model hit max_tokens mid-answer on ${f.name}${part} — the result is an incomplete fragment, so it is discarded rather than used.`);
|
|
346
|
+
const fence = text.match(/```[\w]*\n([\s\S]*?)\n```/);
|
|
347
|
+
sections.push(`## ${f.name}${part}\n\n${(fence ? fence[1] : text).trim()}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const result = sections.map((s) => s.replace(/^## .*\n\n/, "")).join("\n\n").trim();
|
|
351
|
+
// JSON answers keep going to suggestions.json — that file is a proposal by definition, nothing
|
|
352
|
+
// canonical is at risk.
|
|
277
353
|
try {
|
|
278
354
|
const parsed = JSON.parse(result);
|
|
279
355
|
writeJSON(path.join(this.wolfDir, "suggestions.json"), { generated_at: new Date().toISOString(), ...parsed });
|
|
356
|
+
return;
|
|
280
357
|
}
|
|
281
|
-
catch {
|
|
358
|
+
catch { /* not JSON — prose, handled below */ }
|
|
359
|
+
if (mode === "overwrite") {
|
|
282
360
|
if (result.includes("## User Preferences") || result.includes("## Key Learnings") || result.includes("# Cerebrum")) {
|
|
283
|
-
|
|
361
|
+
this.writeCerebrumFromAi(result, totalChunks > files.length ? new Set(["cerebrum.md"]) : new Set());
|
|
284
362
|
}
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
this.writeProposal(taskId, llm.model, files, totalChunks, sections);
|
|
366
|
+
}
|
|
367
|
+
/** Park the model's output where it can be reviewed — never where it can overwrite something. */
|
|
368
|
+
writeProposal(taskId, model, files, totalChunks, sections) {
|
|
369
|
+
const dir = path.join(this.wolfDir, "proposals");
|
|
370
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
371
|
+
const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, "-");
|
|
372
|
+
const file = path.join(dir, `${taskId}-${stamp}.md`);
|
|
373
|
+
const header = [
|
|
374
|
+
`# Proposal — ${taskId}`,
|
|
375
|
+
``,
|
|
376
|
+
`> Written by \`${model}\` on ${new Date().toISOString()}. **Nothing was changed.**`,
|
|
377
|
+
`> Read this, keep what is right, and apply it by hand — or ask a session to.`,
|
|
378
|
+
`> Sources: ${files.map((f) => `\`${f.name}\`${f.chunks.length > 1 ? ` (${f.chunks.length} parts, read in full)` : ""}`).join(", ")}`,
|
|
379
|
+
totalChunks > files.length
|
|
380
|
+
? `> The file did not fit the model's context, so it was **split and read in pieces** — not truncated. Each section below covers one piece.`
|
|
381
|
+
: ``,
|
|
382
|
+
``,
|
|
383
|
+
`---`,
|
|
384
|
+
``,
|
|
385
|
+
].filter((l) => l !== undefined).join("\n");
|
|
386
|
+
fs.writeFileSync(file, header + sections.join("\n\n---\n\n") + "\n", "utf-8");
|
|
387
|
+
this.logger.info(`Proposal written: .wolf/proposals/${path.basename(file)} — review it; nothing was overwritten.`);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Overwrite cerebrum.md with a model's rewrite — but only when that is actually safe.
|
|
391
|
+
*
|
|
392
|
+
* This path destroyed a real project's knowledge base in a dry run: cerebrum.md was 78 KB, the
|
|
393
|
+
* context cap fed the model only the LAST 20 KB (74% missing), the prompt said "return the cleaned
|
|
394
|
+
* file content only", and the model dutifully returned a tidy 3.9 KB file. Writing it would have
|
|
395
|
+
* erased 95% of everything the project had learned — silently, at 03:00 on a Sunday, with no backup.
|
|
396
|
+
* It never fired only because ANTHROPIC_API_KEY was unset; pointing the task at a keyless local
|
|
397
|
+
* model removed that accidental safety net.
|
|
398
|
+
*
|
|
399
|
+
* Two hard rules now:
|
|
400
|
+
* 1. A file the model saw only a SLICE of is never rewritten from that slice.
|
|
401
|
+
* 2. Nothing overwrites cerebrum.md without a timestamped backup sitting next to it.
|
|
402
|
+
*/
|
|
403
|
+
writeCerebrumFromAi(result, truncatedFiles) {
|
|
404
|
+
const cerebrumPath = path.join(this.wolfDir, "cerebrum.md");
|
|
405
|
+
if (truncatedFiles.has("cerebrum.md")) {
|
|
406
|
+
throw new Error(`Refusing to overwrite cerebrum.md: it is larger than the ${20}KB context cap, so the model only saw ` +
|
|
407
|
+
`its tail. Rewriting the whole file from a fragment would delete everything above the cut. ` +
|
|
408
|
+
`Either shrink cerebrum.md (\`openwolf consolidate\`) or change this task to emit JSON suggestions ` +
|
|
409
|
+
`instead of a full-file rewrite.`);
|
|
410
|
+
}
|
|
411
|
+
try {
|
|
412
|
+
const before = fs.readFileSync(cerebrumPath, "utf-8");
|
|
413
|
+
const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, "-");
|
|
414
|
+
const backupDir = path.join(this.wolfDir, "backups");
|
|
415
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
416
|
+
fs.writeFileSync(path.join(backupDir, `cerebrum-${stamp}.md`), before, "utf-8");
|
|
285
417
|
}
|
|
418
|
+
catch { /* no existing file to back up — first write is harmless */ }
|
|
419
|
+
writeText(cerebrumPath, result);
|
|
286
420
|
}
|
|
287
421
|
}
|
|
288
422
|
//# sourceMappingURL=cron-engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cron-engine.js","sourceRoot":"","sources":["../../../src/daemon/cron-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cron-engine.js","sourceRoot":"","sources":["../../../src/daemon/cron-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,24 @@ function isPrivateHost(host) {
|
|
|
31
31
|
const a = Number(m[1]), b = Number(m[2]);
|
|
32
32
|
return a === 0 || a === 10 || a === 127 || (a === 169 && b === 254) || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168);
|
|
33
33
|
}
|
|
34
|
+
// A loopback endpoint is a local model server (Ollama, llama.cpp, LM Studio). Two consequences:
|
|
35
|
+
// it may be reached over cleartext http, and it needs no API key — so there is no secret to leak.
|
|
36
|
+
export function isLocalEndpoint(baseUrl) {
|
|
37
|
+
let u;
|
|
38
|
+
try {
|
|
39
|
+
u = new URL(baseUrl);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const host = u.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
45
|
+
return host === "localhost" || host === "127.0.0.1" || host === "::1" || host.endsWith(".localhost");
|
|
46
|
+
}
|
|
47
|
+
// Local model servers accept (and ignore) any bearer token, so an unset key must not block the task.
|
|
48
|
+
// Remote providers still require one — a keyless request there is a guaranteed 401.
|
|
49
|
+
export function requiresApiKey(cfg) {
|
|
50
|
+
return !isLocalEndpoint(cfg.baseUrl);
|
|
51
|
+
}
|
|
34
52
|
// Refuse an llm_base_url that would exfiltrate the API key or reach internal services. Since the URL
|
|
35
53
|
// comes from a project's config.json (which a cloned/untrusted repo can carry), require https except
|
|
36
54
|
// for explicit loopback (local models), and block private/link-local/metadata addresses.
|
|
@@ -43,7 +61,7 @@ export function assertSafeBaseUrl(baseUrl) {
|
|
|
43
61
|
throw new Error(`invalid llm_base_url: ${baseUrl}`);
|
|
44
62
|
}
|
|
45
63
|
const host = u.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
46
|
-
const isLoopback =
|
|
64
|
+
const isLoopback = isLocalEndpoint(baseUrl);
|
|
47
65
|
if (u.protocol === "http:") {
|
|
48
66
|
if (!isLoopback)
|
|
49
67
|
throw new Error(`llm_base_url must use https:// for non-loopback hosts (got http://${host})`);
|
|
@@ -56,19 +74,23 @@ export function assertSafeBaseUrl(baseUrl) {
|
|
|
56
74
|
}
|
|
57
75
|
}
|
|
58
76
|
// Build the HTTP request for a single-prompt completion — pure, so it's unit-testable offline.
|
|
59
|
-
|
|
77
|
+
// An empty apiKey emits no auth header at all (local servers reject nothing; sending "Bearer "
|
|
78
|
+
// with an empty value trips stricter ones).
|
|
79
|
+
// maxTokens defaults high because reasoning models charge their hidden reasoning against the same
|
|
80
|
+
// budget — 2048 was enough for a plain model's answer but can be spent entirely before Qwen3 says a word.
|
|
81
|
+
export function buildLlmRequest(cfg, apiKey, prompt, maxTokens = 4096) {
|
|
60
82
|
assertSafeBaseUrl(cfg.baseUrl);
|
|
61
83
|
const messages = [{ role: "user", content: prompt }];
|
|
62
84
|
if (cfg.provider === "openai") {
|
|
63
85
|
return {
|
|
64
86
|
url: `${cfg.baseUrl}/chat/completions`,
|
|
65
|
-
headers: { authorization: `Bearer ${apiKey}
|
|
87
|
+
headers: { ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}), "content-type": "application/json" },
|
|
66
88
|
body: JSON.stringify({ model: cfg.model, max_tokens: maxTokens, messages, stream: false }),
|
|
67
89
|
};
|
|
68
90
|
}
|
|
69
91
|
return {
|
|
70
92
|
url: `${cfg.baseUrl}/messages`,
|
|
71
|
-
headers: { "x-api-key": apiKey, "anthropic-version": "2023-06-01", "content-type": "application/json" },
|
|
93
|
+
headers: { ...(apiKey ? { "x-api-key": apiKey } : {}), "anthropic-version": "2023-06-01", "content-type": "application/json" },
|
|
72
94
|
body: JSON.stringify({ model: cfg.model, max_tokens: maxTokens, messages }),
|
|
73
95
|
};
|
|
74
96
|
}
|
|
@@ -76,7 +98,18 @@ export function buildLlmRequest(cfg, apiKey, prompt, maxTokens = 2048) {
|
|
|
76
98
|
// base-url validation (via buildLlmRequest), a hard timeout, and redirect:"error" so the API key
|
|
77
99
|
// never follows a 3xx to another host. Used by the cron engine and `openwolf consolidate`.
|
|
78
100
|
export async function callLlm(cfg, apiKey, prompt, opts = {}) {
|
|
79
|
-
|
|
101
|
+
return (await callLlmDetailed(cfg, apiKey, prompt, opts)).text;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Same call, but it also reports whether the model ran out of budget MID-ANSWER.
|
|
105
|
+
*
|
|
106
|
+
* `callLlm` cannot express that: it throws when a reasoning model produced nothing at all, but a
|
|
107
|
+
* response cut off *after* some text is returned as a normal string. That is fine for a summary and
|
|
108
|
+
* catastrophic for anything that overwrites a file — half a cerebrum.md still contains "# Cerebrum"
|
|
109
|
+
* and would be persisted over the whole one. Callers that write files must check `truncated`.
|
|
110
|
+
*/
|
|
111
|
+
export async function callLlmDetailed(cfg, apiKey, prompt, opts = {}) {
|
|
112
|
+
const req = buildLlmRequest(cfg, apiKey, prompt, opts.maxTokens ?? 4096);
|
|
80
113
|
const controller = new AbortController();
|
|
81
114
|
const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? 120_000);
|
|
82
115
|
let response;
|
|
@@ -95,15 +128,38 @@ export async function callLlm(cfg, apiKey, prompt, opts = {}) {
|
|
|
95
128
|
const body = await response.text();
|
|
96
129
|
throw new Error(`${cfg.provider} API error (${cfg.model}) ${response.status}: ${body.slice(0, 200)}`);
|
|
97
130
|
}
|
|
98
|
-
|
|
131
|
+
const data = await response.json();
|
|
132
|
+
return { text: parseLlmResponse(cfg.provider, data), truncated: wasTruncated(cfg.provider, data) };
|
|
133
|
+
}
|
|
134
|
+
/** Did the model stop because it hit max_tokens (rather than finishing its thought)? — pure. */
|
|
135
|
+
export function wasTruncated(provider, data) {
|
|
136
|
+
if (provider === "openai") {
|
|
137
|
+
return data.choices?.[0]?.finish_reason === "length";
|
|
138
|
+
}
|
|
139
|
+
return data.stop_reason === "max_tokens";
|
|
99
140
|
}
|
|
141
|
+
export const TRUNCATED_BEFORE_ANSWER = "the model hit max_tokens before emitting any answer. Reasoning models (Qwen3, o-series, …) spend the " +
|
|
142
|
+
"budget on hidden reasoning tokens first, so a small max_tokens yields an empty reply. Raise maxTokens.";
|
|
100
143
|
// Extract the assistant text from either API's response shape — pure.
|
|
144
|
+
//
|
|
145
|
+
// A reasoning model can burn the entire max_tokens budget on reasoning tokens and return HTTP 200 with
|
|
146
|
+
// EMPTY content (finish_reason "length"). Returning "" for that looked like a successful empty answer:
|
|
147
|
+
// `consolidate` skipped every merge as "implausible output" and `llm --test` printed a green ✓ on nothing.
|
|
148
|
+
// A response truncated before it said anything is an error, not an empty string. A merely malformed body
|
|
149
|
+
// still yields "" — only an explicit length/max_tokens stop is treated as failure.
|
|
101
150
|
export function parseLlmResponse(provider, data) {
|
|
102
151
|
if (provider === "openai") {
|
|
103
152
|
const d = data;
|
|
104
|
-
|
|
153
|
+
const choice = d.choices?.[0];
|
|
154
|
+
const text = choice?.message?.content?.trim() ?? "";
|
|
155
|
+
if (!text && choice?.finish_reason === "length")
|
|
156
|
+
throw new Error(TRUNCATED_BEFORE_ANSWER);
|
|
157
|
+
return text;
|
|
105
158
|
}
|
|
106
159
|
const d = data;
|
|
107
|
-
|
|
160
|
+
const text = d.content?.find((b) => b.type === "text")?.text?.trim() ?? "";
|
|
161
|
+
if (!text && d.stop_reason === "max_tokens")
|
|
162
|
+
throw new Error(TRUNCATED_BEFORE_ANSWER);
|
|
163
|
+
return text;
|
|
108
164
|
}
|
|
109
165
|
//# sourceMappingURL=llm-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../../../src/daemon/llm-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAuB/C,MAAM,QAAQ,GAA+E;IAC3F,SAAS,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAE,KAAK,EAAE,2BAA2B,EAAE,SAAS,EAAE,mBAAmB,EAAE;IAC1H,MAAM,EAAE,EAAE,OAAO,EAAE,2BAA2B,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE;CACpG,CAAC;AASF,4FAA4F;AAC5F,MAAM,UAAU,aAAa,CAAC,IAAyB;IACrD,MAAM,QAAQ,GAAgB,IAAI,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IACvF,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO;QACL,QAAQ;QACR,OAAO;QACP,KAAK,EAAE,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,KAAK;QACjC,SAAS,EAAE,IAAI,EAAE,WAAW,IAAI,CAAC,CAAC,SAAS;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAoC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/F,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,qGAAqG;AACrG,kGAAkG;AAClG,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9G,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACvI,CAAC;AAED,qGAAqG;AACrG,qGAAqG;AACrG,yFAAyF;AACzF,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../../../src/daemon/llm-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ import { DesignQCEngine } from "../designqc/designqc-engine.js";
|
|
|
13
13
|
import { DEFAULT_VIEWPORTS } from "../designqc/designqc-types.js";
|
|
14
14
|
import { getRegisteredProjects } from "../cli/registry.js";
|
|
15
15
|
import { aggregateProjects, aggregateNativeMemory, nativeMemoryHealth, nativeMemoryFiles } from "../utils/maintenance.js";
|
|
16
|
-
import { resolveLlmConfig } from "./llm-provider.js";
|
|
16
|
+
import { resolveLlmConfig, requiresApiKey } from "./llm-provider.js";
|
|
17
17
|
import { nativeMemoryDir } from "../hooks/shared.js";
|
|
18
18
|
const __filename = fileURLToPath(import.meta.url);
|
|
19
19
|
const __dirname = path.dirname(__filename);
|
|
@@ -146,7 +146,9 @@ let projectMeta = detectProjectMeta();
|
|
|
146
146
|
// API routes
|
|
147
147
|
app.get("/api/config", (_req, res) => {
|
|
148
148
|
const llm = resolveLlmConfig(path.join(projectRoot, ".wolf"));
|
|
149
|
-
|
|
149
|
+
// A local model server needs no key — the dashboard must not report AI tasks as unavailable there.
|
|
150
|
+
const usable = !!process.env[llm.apiKeyEnv] || !requiresApiKey(llm);
|
|
151
|
+
res.json({ hasApiKey: usable, llmProvider: llm.provider, llmModel: llm.model });
|
|
150
152
|
});
|
|
151
153
|
app.get("/api/projects", (_req, res) => {
|
|
152
154
|
res.json(getRegisteredProjects(true));
|