openwolf-enhanced 1.26.0 → 1.28.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 +306 -0
- package/dist/dashboard/assets/{AISuggestions-DZmzksSA.js → AISuggestions-C7WFvzLO.js} +1 -1
- package/dist/dashboard/assets/{ActivityLog-BJ0omuzu.js → ActivityLog-SsRbpBFt.js} +1 -1
- package/dist/dashboard/assets/{ActivityTimeline-BWhxretI.js → ActivityTimeline-BoV30nDY.js} +1 -1
- package/dist/dashboard/assets/{AnatomyBrowser-DNVp6-_r.js → AnatomyBrowser-DwzsHn4z.js} +1 -1
- package/dist/dashboard/assets/{BugLog-DMJTuU9p.js → BugLog-CPl4Q-JG.js} +1 -1
- package/dist/dashboard/assets/{CerebrumViewer-BwcGr6pu.js → CerebrumViewer-_f6fBsNF.js} +1 -1
- package/dist/dashboard/assets/{CronStatus-Dwf_M4-S.js → CronStatus-1iBEPJK5.js} +1 -1
- package/dist/dashboard/assets/{DesignQC-DzHkh94I.js → DesignQC-D4UU7lca.js} +1 -1
- package/dist/dashboard/assets/{LinkGraph-kqQD--Yj.js → LinkGraph-BWtI8Gh3.js} +1 -1
- package/dist/dashboard/assets/{MemoryViewer-BCn9Fr-w.js → MemoryViewer-BYRVG34g.js} +1 -1
- package/dist/dashboard/assets/{NativeMemory-DPMZaP5E.js → NativeMemory-Dphtrqjt.js} +1 -1
- package/dist/dashboard/assets/{ProjectOverview-PWENJiC4.js → ProjectOverview-CTYohvjD.js} +1 -1
- package/dist/dashboard/assets/{ProjectsAggregate-Baj44DVk.js → ProjectsAggregate-CMxNs35H.js} +1 -1
- package/dist/dashboard/assets/{StatusBadge-Db61D51H.js → StatusBadge-CjrFCDOI.js} +1 -1
- package/dist/dashboard/assets/{TokenUsage-UefDh9w4.js → TokenUsage-C5wJpMl8.js} +1 -1
- package/dist/dashboard/assets/index-BNi8lsJE.css +2 -0
- package/dist/dashboard/assets/{index-e2PfOI0b.js → index-C74qneS9.js} +5 -5
- package/dist/dashboard/index.html +2 -2
- package/dist/hooks/post-bash.js +10 -5
- package/dist/hooks/post-read.js +24 -26
- package/dist/hooks/post-write.js +135 -118
- package/dist/hooks/pre-read.js +42 -36
- package/dist/hooks/pre-write.js +3 -3
- package/dist/hooks/precompact.js +2 -2
- package/dist/hooks/session-start.js +15 -6
- package/dist/hooks/shared.js +221 -14
- package/dist/hooks/stop.js +33 -7
- package/dist/src/cli/cron-cmd.js +2 -2
- package/dist/src/cli/cron-cmd.js.map +1 -1
- package/dist/src/cli/daemon-cmd.js +49 -21
- package/dist/src/cli/daemon-cmd.js.map +1 -1
- package/dist/src/cli/doctor-cmd.js +2 -1
- package/dist/src/cli/doctor-cmd.js.map +1 -1
- package/dist/src/cli/export-cmd.js +8 -0
- package/dist/src/cli/export-cmd.js.map +1 -1
- package/dist/src/cli/init.js +34 -8
- package/dist/src/cli/init.js.map +1 -1
- package/dist/src/cli/registry.js +68 -33
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/update.js +37 -6
- package/dist/src/cli/update.js.map +1 -1
- package/dist/src/daemon/cron-engine.js +70 -8
- package/dist/src/daemon/cron-engine.js.map +1 -1
- package/dist/src/daemon/file-watcher.js +4 -1
- package/dist/src/daemon/file-watcher.js.map +1 -1
- package/dist/src/daemon/llm-provider.js +9 -6
- package/dist/src/daemon/llm-provider.js.map +1 -1
- package/dist/src/daemon/wolf-daemon.js +69 -15
- package/dist/src/daemon/wolf-daemon.js.map +1 -1
- package/dist/src/designqc/designqc-capture.js +116 -6
- package/dist/src/designqc/designqc-capture.js.map +1 -1
- package/dist/src/designqc/designqc-engine.js +9 -3
- package/dist/src/designqc/designqc-engine.js.map +1 -1
- package/dist/src/hooks/post-bash.js +10 -5
- package/dist/src/hooks/post-bash.js.map +1 -1
- package/dist/src/hooks/post-read.js +24 -26
- package/dist/src/hooks/post-read.js.map +1 -1
- package/dist/src/hooks/post-write.js +135 -118
- package/dist/src/hooks/post-write.js.map +1 -1
- package/dist/src/hooks/pre-read.js +42 -36
- package/dist/src/hooks/pre-read.js.map +1 -1
- package/dist/src/hooks/pre-write.js +3 -3
- package/dist/src/hooks/pre-write.js.map +1 -1
- package/dist/src/hooks/precompact.js +2 -2
- package/dist/src/hooks/precompact.js.map +1 -1
- package/dist/src/hooks/session-start.js +15 -6
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/shared.js +221 -14
- package/dist/src/hooks/shared.js.map +1 -1
- package/dist/src/hooks/stop.js +33 -7
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/scanner/anatomy-scanner.js +7 -3
- package/dist/src/scanner/anatomy-scanner.js.map +1 -1
- package/dist/src/utils/agent-hooks.js +50 -4
- package/dist/src/utils/agent-hooks.js.map +1 -1
- package/dist/src/utils/daemon-pid.js +56 -0
- package/dist/src/utils/daemon-pid.js.map +1 -0
- package/dist/src/utils/dashboard-auth.js +13 -1
- package/dist/src/utils/dashboard-auth.js.map +1 -1
- package/dist/src/utils/embeddings.js +9 -1
- package/dist/src/utils/embeddings.js.map +1 -1
- package/dist/src/utils/fs-safe.js +69 -11
- package/dist/src/utils/fs-safe.js.map +1 -1
- package/dist/src/utils/logger.js +21 -6
- package/dist/src/utils/logger.js.map +1 -1
- package/dist/src/utils/maintenance.js +100 -6
- package/dist/src/utils/maintenance.js.map +1 -1
- package/dist/src/utils/platform.js +39 -0
- package/dist/src/utils/platform.js.map +1 -1
- package/dist/src/utils/remote.js +2 -2
- package/dist/src/utils/remote.js.map +1 -1
- package/package.json +1 -1
- package/src/templates/config.json +34 -9
- package/dist/dashboard/assets/index-CVfvTpSA.css +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { writeJSON, writeText } from "./fs-safe.js";
|
|
4
4
|
import { ensureDir } from "./paths.js";
|
|
5
5
|
import { upsertMarkerBlock, AGENTS_SNIPPET } from "./marker-block.js";
|
|
6
6
|
import { isWindows } from "./platform.js";
|
|
@@ -216,18 +216,64 @@ export function detectAgents(projectRoot) {
|
|
|
216
216
|
}
|
|
217
217
|
return found;
|
|
218
218
|
}
|
|
219
|
+
/**
|
|
220
|
+
* Merge OpenWolf's hook entries into an agent's config file — or refuse, loudly.
|
|
221
|
+
*
|
|
222
|
+
* This used to call readJSON, whose contract on an unparseable file is "warn and hand back the
|
|
223
|
+
* fallback". The fallback here is `{}`, so a settings.json or hooks.json with one stray comma was
|
|
224
|
+
* treated as an empty config: OpenWolf's entries were written over the user's file, every hook the
|
|
225
|
+
* user had configured themselves was gone, and deployment reported success. A merge that cannot
|
|
226
|
+
* read the existing side is not a merge.
|
|
227
|
+
*
|
|
228
|
+
* The file is now left byte-identical and the caller is told what to do about it. Losing the hooks
|
|
229
|
+
* for one agent until a typo is fixed beats silently replacing someone's configuration.
|
|
230
|
+
*/
|
|
231
|
+
class MalformedAgentConfigError extends Error {
|
|
232
|
+
file;
|
|
233
|
+
constructor(file, cause) {
|
|
234
|
+
super(`${file} is not valid JSON (${cause}) — left untouched. Fix or remove it, then run \`openwolf update\` to register the hooks.`);
|
|
235
|
+
this.file = file;
|
|
236
|
+
this.name = "MalformedAgentConfigError";
|
|
237
|
+
}
|
|
238
|
+
}
|
|
219
239
|
function deployJsonAgent(dir, file, settings) {
|
|
220
240
|
ensureDir(dir);
|
|
221
241
|
const p = path.join(dir, file);
|
|
222
|
-
|
|
242
|
+
let existing = {};
|
|
243
|
+
if (fs.existsSync(p)) {
|
|
244
|
+
let raw = "";
|
|
245
|
+
try {
|
|
246
|
+
raw = fs.readFileSync(p, "utf-8");
|
|
247
|
+
}
|
|
248
|
+
catch { /* unreadable — treat as absent below */ }
|
|
249
|
+
if (raw.trim()) {
|
|
250
|
+
try {
|
|
251
|
+
const parsed = JSON.parse(raw);
|
|
252
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
253
|
+
throw new Error("top level is not an object");
|
|
254
|
+
}
|
|
255
|
+
existing = parsed;
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
throw new MalformedAgentConfigError(path.join(path.basename(dir), file), e.message);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
223
262
|
writeJSON(p, mergeManagedHooks(existing, settings));
|
|
224
263
|
}
|
|
225
264
|
// Deploy OpenWolf hooks to Claude (always) plus every detected agent. Returns a per-agent result.
|
|
226
265
|
export function deployAgentHooks(projectRoot) {
|
|
227
266
|
const results = [];
|
|
228
267
|
// Claude — always.
|
|
229
|
-
|
|
230
|
-
|
|
268
|
+
try {
|
|
269
|
+
deployJsonAgent(path.join(projectRoot, ".claude"), "settings.json", claudeSettings());
|
|
270
|
+
results.push({ agent: "claude", deployed: true, detail: ".claude/settings.json" });
|
|
271
|
+
}
|
|
272
|
+
catch (e) {
|
|
273
|
+
// Reported, not thrown: a malformed .claude/settings.json must not abort `openwolf init` for
|
|
274
|
+
// everything else it does — but it must not be silently overwritten either.
|
|
275
|
+
results.push({ agent: "claude", deployed: false, detail: e.message });
|
|
276
|
+
}
|
|
231
277
|
for (const agent of detectAgents(projectRoot)) {
|
|
232
278
|
try {
|
|
233
279
|
if (agent === "codex") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-hooks.js","sourceRoot":"","sources":["../../../src/utils/agent-hooks.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-hooks.js","sourceRoot":"","sources":["../../../src/utils/agent-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { readJSON, writeJSON } from "./fs-safe.js";
|
|
5
|
+
export function daemonPidPath(wolfDir) {
|
|
6
|
+
return path.join(wolfDir, "daemon.pid");
|
|
7
|
+
}
|
|
8
|
+
export function writeDaemonRecord(wolfDir, projectRoot, port) {
|
|
9
|
+
try {
|
|
10
|
+
writeJSON(daemonPidPath(wolfDir), {
|
|
11
|
+
pid: process.pid,
|
|
12
|
+
project_root: projectRoot,
|
|
13
|
+
hostname: os.hostname(),
|
|
14
|
+
port,
|
|
15
|
+
started_at: new Date().toISOString(),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch { /* the daemon still works without the record; stop just falls back to reporting */ }
|
|
19
|
+
}
|
|
20
|
+
export function clearDaemonRecord(wolfDir) {
|
|
21
|
+
try {
|
|
22
|
+
fs.unlinkSync(daemonPidPath(wolfDir));
|
|
23
|
+
}
|
|
24
|
+
catch { /* already gone */ }
|
|
25
|
+
}
|
|
26
|
+
/** Is the PID currently alive? Signal 0 tests existence without delivering anything. */
|
|
27
|
+
export function pidIsAlive(pid) {
|
|
28
|
+
try {
|
|
29
|
+
process.kill(pid, 0);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
// EPERM means it exists but belongs to another user — alive, and emphatically not ours to kill.
|
|
34
|
+
return e.code === "EPERM";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The PID this project's daemon claims, or null.
|
|
39
|
+
*
|
|
40
|
+
* Every condition has to hold: a record written on THIS host, for THIS project root, naming a live
|
|
41
|
+
* process. A stale record (daemon crashed, machine rebooted and the PID was reused) fails the
|
|
42
|
+
* liveness test or the host test, and a record copied along with the project fails the root test.
|
|
43
|
+
*/
|
|
44
|
+
export function readOwnDaemonPid(wolfDir, projectRoot) {
|
|
45
|
+
const rec = readJSON(daemonPidPath(wolfDir), {});
|
|
46
|
+
if (typeof rec.pid !== "number" || rec.pid <= 0)
|
|
47
|
+
return null;
|
|
48
|
+
if (rec.hostname !== os.hostname())
|
|
49
|
+
return null;
|
|
50
|
+
if (path.resolve(rec.project_root ?? "") !== path.resolve(projectRoot))
|
|
51
|
+
return null;
|
|
52
|
+
if (!pidIsAlive(rec.pid))
|
|
53
|
+
return null;
|
|
54
|
+
return rec.pid;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=daemon-pid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-pid.js","sourceRoot":"","sources":["../../../src/utils/daemon-pid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBnD,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,WAAmB,EAAE,IAAY;IAClF,IAAI,CAAC;QACH,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;YAChC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,YAAY,EAAE,WAAW;YACzB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,IAAI;YACJ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACd,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC,CAAC,kFAAkF,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC7E,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gGAAgG;QAChG,OAAQ,CAA2B,CAAC,IAAI,KAAK,OAAO,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,WAAmB;IACnE,MAAM,GAAG,GAAG,QAAQ,CAAwB,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ,EAAE;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,GAAG,CAAC,GAAG,CAAC;AACjB,CAAC"}
|
|
@@ -13,8 +13,20 @@ export function ensureDashboardToken(wolfDir) {
|
|
|
13
13
|
const p = dashboardTokenPath(wolfDir);
|
|
14
14
|
try {
|
|
15
15
|
const existing = fs.readFileSync(p, "utf-8").trim();
|
|
16
|
-
if (existing)
|
|
16
|
+
if (existing) {
|
|
17
|
+
// A token created before this check — or restored from a backup, or copied with a umask that
|
|
18
|
+
// let the group bits through — kept whatever mode it had, and 0600 was only ever applied to
|
|
19
|
+
// files this function CREATED. A token readable by other local users is a token they can use.
|
|
20
|
+
//
|
|
21
|
+
// Repaired in place, never rotated: this is the token a live dashboard tab is already
|
|
22
|
+
// holding, and rotating it would log the user out to fix a permission bit.
|
|
23
|
+
try {
|
|
24
|
+
if ((fs.statSync(p).mode & 0o077) !== 0)
|
|
25
|
+
fs.chmodSync(p, 0o600);
|
|
26
|
+
}
|
|
27
|
+
catch { /* no chmod on this platform, or a race — the token is still valid */ }
|
|
17
28
|
return existing;
|
|
29
|
+
}
|
|
18
30
|
}
|
|
19
31
|
catch { /* fall through to create */ }
|
|
20
32
|
const token = crypto.randomBytes(24).toString("hex");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-auth.js","sourceRoot":"","sources":["../../../src/utils/dashboard-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,uFAAuF;AACvF,qFAAqF;AACrF,kFAAkF;AAClF,wBAAwB;AAExB,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,QAAQ;
|
|
1
|
+
{"version":3,"file":"dashboard-auth.js","sourceRoot":"","sources":["../../../src/utils/dashboard-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,uFAAuF;AACvF,qFAAqF;AACrF,kFAAkF;AAClF,wBAAwB;AAExB,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACb,6FAA6F;YAC7F,4FAA4F;YAC5F,8FAA8F;YAC9F,EAAE;YACF,sFAAsF;YACtF,2EAA2E;YAC3E,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;oBAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC,CAAC,qEAAqE,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,QAAgB;IAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as path from "node:path";
|
|
2
2
|
import { readJSON } from "./fs-safe.js";
|
|
3
|
-
import { isLocalEndpoint } from "../daemon/llm-provider.js";
|
|
3
|
+
import { isLocalEndpoint, assertSafeBaseUrl } from "../daemon/llm-provider.js";
|
|
4
4
|
const DEFAULTS = {
|
|
5
5
|
baseUrl: "http://localhost:1234/v1",
|
|
6
6
|
model: "text-embedding-nomic-embed-text-v1.5",
|
|
@@ -20,6 +20,13 @@ export function resolveEmbedConfig(wolfDir) {
|
|
|
20
20
|
export async function embedTexts(cfg, texts) {
|
|
21
21
|
if (texts.length === 0)
|
|
22
22
|
return [];
|
|
23
|
+
// Same gate the chat path has carried since 1.15.1 (bug-130), and for the same reason: base_url
|
|
24
|
+
// comes out of .wolf/config.json, a committed file, so a cloned repo picks the host. What goes out
|
|
25
|
+
// here is the knowledge base itself — cerebrum, memory, anatomy — plus the bearer token, which is
|
|
26
|
+
// strictly more than a chat prompt. It had no guard at all: no https requirement, no private/
|
|
27
|
+
// metadata-address check, and default redirect handling, so a 307 replayed the whole POST body
|
|
28
|
+
// (and the Authorization header) at whatever host the first one named.
|
|
29
|
+
assertSafeBaseUrl(cfg.baseUrl, "recall.embeddings.base_url");
|
|
23
30
|
const key = process.env[cfg.apiKeyEnv] ?? "";
|
|
24
31
|
if (!key && !isLocalEndpoint(cfg.baseUrl)) {
|
|
25
32
|
throw new Error(`${cfg.apiKeyEnv} is not set — a remote embeddings endpoint needs a key. Point openwolf.recall.embeddings.base_url at a local server (LM Studio http://localhost:1234/v1) to run keyless.`);
|
|
@@ -29,6 +36,7 @@ export async function embedTexts(cfg, texts) {
|
|
|
29
36
|
headers: { "content-type": "application/json", ...(key ? { authorization: `Bearer ${key}` } : {}) },
|
|
30
37
|
body: JSON.stringify({ model: cfg.model, input: texts }),
|
|
31
38
|
signal: AbortSignal.timeout(120_000),
|
|
39
|
+
redirect: "error",
|
|
32
40
|
});
|
|
33
41
|
if (!res.ok) {
|
|
34
42
|
const t = await res.text().catch(() => "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/utils/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/utils/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,24 @@ export function readJSON(filePath, fallback) {
|
|
|
16
16
|
return JSON.parse(raw);
|
|
17
17
|
}
|
|
18
18
|
catch (e) {
|
|
19
|
-
|
|
19
|
+
// The caller is about to treat this file as empty and, in a read-modify-write, overwrite it
|
|
20
|
+
// with defaults — so a corrupt token-ledger.json meant months of usage history vanished on the
|
|
21
|
+
// next Stop hook, with one line on stderr as the only trace. Move it aside first. Recovery is
|
|
22
|
+
// then a possibility rather than a hope, and because the path no longer exists, the next read
|
|
23
|
+
// takes the ordinary "missing file" branch instead of warning forever.
|
|
24
|
+
quarantineCorrupt(filePath);
|
|
25
|
+
process.stderr.write(`[openwolf] ${path.basename(filePath)} was not valid JSON — moved aside, using defaults (${e.message})\n`);
|
|
20
26
|
return fallback;
|
|
21
27
|
}
|
|
22
28
|
}
|
|
29
|
+
/** Rename a corrupt file to <name>.corrupt-<stamp>. Best-effort: never throws, never blocks a read. */
|
|
30
|
+
function quarantineCorrupt(filePath) {
|
|
31
|
+
try {
|
|
32
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
33
|
+
fs.renameSync(filePath, `${filePath}.corrupt-${stamp}`);
|
|
34
|
+
}
|
|
35
|
+
catch { /* unwritable directory, race with another process — defaults still apply */ }
|
|
36
|
+
}
|
|
23
37
|
// Shared tmp+rename write. Never throws (hooks must not kill a session over a failed journal
|
|
24
38
|
// write), but a total failure is REPORTED on stderr instead of vanishing — a silently dropped
|
|
25
39
|
// write once hid that the semantic-recall index never persisted at all (bug-183).
|
|
@@ -84,9 +98,20 @@ export function readText(filePath, fallback = "") {
|
|
|
84
98
|
export function writeText(filePath, content) {
|
|
85
99
|
return writeAtomic(filePath, () => content);
|
|
86
100
|
}
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
101
|
+
// Advisory lock around a read-modify-write cycle (M1). Duplicated from hooks/shared.ts (separate
|
|
102
|
+
// build roots) — keep the two in step. Waits with a fast backoff, steals a lock left behind by a
|
|
103
|
+
// dead process (>5s), and FAILS rather than proceeding unlocked; see the long note in
|
|
104
|
+
// hooks/shared.ts for why running the callback anyway made the lock meaningless for everyone.
|
|
105
|
+
export class LockTimeoutError extends Error {
|
|
106
|
+
targetPath;
|
|
107
|
+
waitedMs;
|
|
108
|
+
constructor(targetPath, waitedMs) {
|
|
109
|
+
super(`could not acquire the lock on ${path.basename(targetPath)} within ${waitedMs}ms — update skipped`);
|
|
110
|
+
this.targetPath = targetPath;
|
|
111
|
+
this.waitedMs = waitedMs;
|
|
112
|
+
this.name = "LockTimeoutError";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
90
115
|
function sleepSync(ms) {
|
|
91
116
|
try {
|
|
92
117
|
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
@@ -95,10 +120,11 @@ function sleepSync(ms) {
|
|
|
95
120
|
}
|
|
96
121
|
export function withLock(targetPath, fn) {
|
|
97
122
|
const lockPath = targetPath + ".lock";
|
|
98
|
-
const MAX_WAIT_MS =
|
|
123
|
+
const MAX_WAIT_MS = 1500;
|
|
99
124
|
const STALE_MS = 5000;
|
|
100
125
|
const start = Date.now();
|
|
101
126
|
let held = false;
|
|
127
|
+
let backoff = 2;
|
|
102
128
|
while (Date.now() - start < MAX_WAIT_MS) {
|
|
103
129
|
try {
|
|
104
130
|
const fd = fs.openSync(lockPath, "wx");
|
|
@@ -120,19 +146,51 @@ export function withLock(targetPath, fn) {
|
|
|
120
146
|
catch {
|
|
121
147
|
continue;
|
|
122
148
|
}
|
|
123
|
-
sleepSync(
|
|
149
|
+
sleepSync(backoff);
|
|
150
|
+
backoff = Math.min(backoff * 2, 50);
|
|
124
151
|
}
|
|
125
152
|
}
|
|
153
|
+
if (!held)
|
|
154
|
+
throw new LockTimeoutError(targetPath, Date.now() - start);
|
|
126
155
|
try {
|
|
127
156
|
return fn();
|
|
128
157
|
}
|
|
129
158
|
finally {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
159
|
+
try {
|
|
160
|
+
fs.unlinkSync(lockPath);
|
|
161
|
+
}
|
|
162
|
+
catch { /* ignore */ }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* withLock for a caller that returns a value and has a sensible "did not run" answer.
|
|
167
|
+
* The skip is reported, never silent — a maintenance pass that quietly did nothing reads exactly
|
|
168
|
+
* like a maintenance pass that found nothing to do.
|
|
169
|
+
*/
|
|
170
|
+
export function withLockOr(targetPath, onSkip, fn) {
|
|
171
|
+
try {
|
|
172
|
+
return withLock(targetPath, fn);
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
if (e instanceof LockTimeoutError) {
|
|
176
|
+
process.stderr.write(`[openwolf] ${e.message}\n`);
|
|
177
|
+
return onSkip();
|
|
178
|
+
}
|
|
179
|
+
throw e;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** withLock for callers that must not throw. Reports a lost update instead of hiding it. */
|
|
183
|
+
export function tryWithLock(targetPath, fn) {
|
|
184
|
+
try {
|
|
185
|
+
withLock(targetPath, fn);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
if (e instanceof LockTimeoutError) {
|
|
190
|
+
process.stderr.write(`[openwolf] ${e.message}\n`);
|
|
191
|
+
return false;
|
|
135
192
|
}
|
|
193
|
+
throw e;
|
|
136
194
|
}
|
|
137
195
|
}
|
|
138
196
|
// Copy a file via read+write instead of fs.copyFileSync. copyFileSync uses the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-safe.js","sourceRoot":"","sources":["../../../src/utils/fs-safe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,+FAA+F;AAC/F,iGAAiG;AACjG,mGAAmG;AACnG,MAAM,UAAU,QAAQ,CAAc,QAAgB,EAAE,QAAW;IACjE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"fs-safe.js","sourceRoot":"","sources":["../../../src/utils/fs-safe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,+FAA+F;AAC/F,iGAAiG;AACjG,mGAAmG;AACnG,MAAM,UAAU,QAAQ,CAAc,QAAgB,EAAE,QAAW;IACjE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,4FAA4F;QAC5F,+FAA+F;QAC/F,8FAA8F;QAC9F,8FAA8F;QAC9F,uEAAuE;QACvE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,sDAAuD,CAAW,CAAC,OAAO,KAAK,CAAC,CAAC;QAC3I,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,uGAAuG;AACvG,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,QAAQ,YAAY,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC,CAAC,4EAA4E,CAAC,CAAC;AAC1F,CAAC;AAED,6FAA6F;AAC7F,8FAA8F;AAC9F,kFAAkF;AAClF,SAAS,WAAW,CAAC,QAAgB,EAAE,SAAuB;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,4FAA4F;QAC5F,4DAA4D;QAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAa,CAAW,CAAC,OAAO,IAAI,CAAC,CAAC;QACzG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IAC5E,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,+FAA+F;QAC/F,iCAAiC;QACjC,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,OAAO,IAAI,CAAC;oBAAE,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+FAA+F;QAC/F,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACpC,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAa,CAAW,CAAC,OAAO,IAAI,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAa;IACvD,OAAO,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,QAAQ,GAAW,EAAE;IAC9D,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IACzD,OAAO,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,iGAAiG;AACjG,iGAAiG;AACjG,sFAAsF;AACtF,8FAA8F;AAC9F,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACb,UAAU;IAA0B,QAAQ;IAAxE,YAA4B,UAAkB,EAAkB,QAAgB;QAC9E,KAAK,CAAC,iCAAiC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,QAAQ,qBAAqB,CAAC,CAAC;0BADhF,UAAU;wBAA0B,QAAQ;QAEtE,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,UAAkB,EAAE,EAAW;IACzD,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,WAAW,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;oBAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;YACnG,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YACrB,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAI,UAAkB,EAAE,MAAe,EAAE,EAAW;IAC5E,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YAClD,OAAO,MAAM,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,EAAc;IAC5D,IAAI,CAAC;QACH,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mFAAmF;AACnF,wFAAwF;AACxF,yCAAyC;AACzC,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAe;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
|
package/dist/src/utils/logger.js
CHANGED
|
@@ -12,12 +12,27 @@ export class Logger {
|
|
|
12
12
|
constructor(logFile, level = "info") {
|
|
13
13
|
this.logFile = logFile;
|
|
14
14
|
this.level = level;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
this.ensureDir();
|
|
16
|
+
}
|
|
17
|
+
ensureDir() {
|
|
18
|
+
if (!this.logFile)
|
|
19
|
+
return;
|
|
20
|
+
const dir = path.dirname(this.logFile);
|
|
21
|
+
if (!fs.existsSync(dir))
|
|
22
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Point the logger at another project's .wolf/daemon.log.
|
|
26
|
+
*
|
|
27
|
+
* The daemon can hot-switch projects without restarting, and the logger was the one binding that
|
|
28
|
+
* never moved: after a switch, project B's cron runs, task failures and LLM errors kept appending
|
|
29
|
+
* to project A's daemon.log, under A's log level. `openwolf daemon logs` in B then showed nothing
|
|
30
|
+
* at all, which reads like a daemon that stopped working.
|
|
31
|
+
*/
|
|
32
|
+
retarget(logFile, level = this.level) {
|
|
33
|
+
this.logFile = logFile;
|
|
34
|
+
this.level = level;
|
|
35
|
+
this.ensureDir();
|
|
21
36
|
}
|
|
22
37
|
shouldLog(level) {
|
|
23
38
|
return LEVEL_ORDER[level] >= LEVEL_ORDER[this.level];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,OAAO,CAAgB;IACvB,KAAK,CAAW;IAExB,YAAY,OAAsB,EAAE,KAAK,GAAa,MAAM;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,OAAO,CAAgB;IACvB,KAAK,CAAW;IAExB,YAAY,OAAsB,EAAE,KAAK,GAAa,MAAM;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAsB,EAAE,KAAK,GAAa,IAAI,CAAC,KAAK;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS,CAAC,KAAe;QAC/B,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,KAAe,EAAE,OAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACvD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import { readJSON, writeJSON, readText, writeText,
|
|
3
|
+
import { readJSON, writeJSON, readText, writeText, withLockOr } from "./fs-safe.js";
|
|
4
4
|
import { nativeMemoryDir } from "../hooks/shared.js";
|
|
5
5
|
import { blocksFor } from "./recall.js";
|
|
6
6
|
export const DEFAULT_RETENTION = {
|
|
@@ -11,6 +11,7 @@ export const DEFAULT_RETENTION = {
|
|
|
11
11
|
memory_consolidate_after_days: 7,
|
|
12
12
|
memory_max_bytes: 262144, // 256 KB
|
|
13
13
|
daemon_log_max_bytes: 524288, // 512 KB
|
|
14
|
+
proposals_keep: 20,
|
|
14
15
|
};
|
|
15
16
|
export function getRetention(wolfDir) {
|
|
16
17
|
const cfg = readJSON(path.join(wolfDir, "config.json"), {});
|
|
@@ -48,12 +49,17 @@ export function makeIgnoreMatcher(patterns) {
|
|
|
48
49
|
if (pat.startsWith("*.") && norm.endsWith(pat.slice(1)))
|
|
49
50
|
return true;
|
|
50
51
|
}
|
|
51
|
-
|
|
52
|
+
// `?` is a gitignore wildcard for exactly one character, and it also has to be handled BEFORE
|
|
53
|
+
// this becomes a regex — it used to be neither escaped nor translated, so it survived into the
|
|
54
|
+
// pattern as a regex quantifier and made the preceding character OPTIONAL. `build?/*.js` then
|
|
55
|
+
// matched `buil/x.js` and missed `build2/x.js`: the rule silently covered the wrong files.
|
|
56
|
+
if (pat.includes("*") || pat.includes("?")) {
|
|
52
57
|
const re = new RegExp("^" +
|
|
53
58
|
pat
|
|
54
59
|
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
55
60
|
.replace(/\*\*/g, "\u0000")
|
|
56
61
|
.replace(/\*/g, "[^/]*")
|
|
62
|
+
.replace(/\?/g, "[^/]")
|
|
57
63
|
.replace(/\u0000/g, ".*") +
|
|
58
64
|
"$");
|
|
59
65
|
if (re.test(norm) || (!anchored && re.test(base)))
|
|
@@ -93,6 +99,54 @@ export function loadIgnore(projectRoot) {
|
|
|
93
99
|
}
|
|
94
100
|
return makeIgnoreMatcher(lines);
|
|
95
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* The one list of directories and files the anatomy index never covers.
|
|
104
|
+
*
|
|
105
|
+
* There were four of these: the config template, `init`'s inline fallback, and two copies inside
|
|
106
|
+
* the scanner — and they disagreed. A project initialised from one path got a different index from
|
|
107
|
+
* a project that fell back to another, which is a difference nobody can see and nobody expects.
|
|
108
|
+
*
|
|
109
|
+
* Missing entries had a real cost. `.venv` and `site-packages` were absent, so on a mixed
|
|
110
|
+
* Python/JS project the index filled up with dependency source: the indexed file budget is spent,
|
|
111
|
+
* the descriptions are of somebody else's code, and every anatomy lookup for the project's OWN
|
|
112
|
+
* files misses. Agent-config directories (.claude, .codex, …) were indexed too, which points the
|
|
113
|
+
* model at its own harness configuration — noise that ranked HIGH because those files are small
|
|
114
|
+
* and densely worded.
|
|
115
|
+
*/
|
|
116
|
+
export const DEFAULT_ANATOMY_EXCLUDES = [
|
|
117
|
+
// VCS and tooling
|
|
118
|
+
".git", ".svn", ".hg", ".wolf",
|
|
119
|
+
// JS/TS
|
|
120
|
+
"node_modules", "dist", "build", ".next", ".nuxt", ".turbo", ".vercel", ".netlify", ".output",
|
|
121
|
+
"coverage", ".parcel-cache", ".svelte-kit",
|
|
122
|
+
// Python — see also isPythonVenv() for virtualenvs under a non-standard name
|
|
123
|
+
"__pycache__", ".venv", "venv", "site-packages", ".tox", ".mypy_cache", ".pytest_cache", ".ruff_cache",
|
|
124
|
+
// JVM / Rust / Go
|
|
125
|
+
"target", ".gradle", "gradle", ".m2",
|
|
126
|
+
// Editors and OS
|
|
127
|
+
".vscode", ".idea", ".cache", ".DS_Store", "Thumbs.db",
|
|
128
|
+
// Agent config: steering the model toward its own harness config is noise, and these files
|
|
129
|
+
// topped the importance ranking in real projects because they are short and keyword-dense.
|
|
130
|
+
".claude", ".codex", ".opencode", ".gemini", ".cursor", ".aider",
|
|
131
|
+
// Generated artefacts
|
|
132
|
+
"*.min.js", "*.min.css", "*.map", "*.lock",
|
|
133
|
+
];
|
|
134
|
+
/**
|
|
135
|
+
* A Python virtualenv, whatever it is called.
|
|
136
|
+
*
|
|
137
|
+
* Excluding the NAMES `.venv` and `venv` catches the convention and misses the reality: envs get
|
|
138
|
+
* called `env`, `.env310`, `pyenv`, or the project's own name. `pyvenv.cfg` at the root of the
|
|
139
|
+
* directory is what actually defines one, and it is present in every venv created by the stdlib
|
|
140
|
+
* module since 3.3.
|
|
141
|
+
*/
|
|
142
|
+
export function isPythonVenv(dirPath) {
|
|
143
|
+
try {
|
|
144
|
+
return fs.existsSync(path.join(dirPath, "pyvenv.cfg"));
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
96
150
|
const SUGGEST_DEFAULT_EXCLUDES = new Set([
|
|
97
151
|
"node_modules", ".git", "dist", "build", ".wolf", ".next", ".nuxt", "coverage",
|
|
98
152
|
"__pycache__", ".cache", "target", ".vscode", ".idea", ".turbo", ".vercel",
|
|
@@ -479,13 +533,16 @@ function safeReaddir(dir) {
|
|
|
479
533
|
}
|
|
480
534
|
}
|
|
481
535
|
const noop = (name) => ({ changed: false, before: 0, after: 0, detail: `${name}: nothing to do` });
|
|
536
|
+
// Distinct from noop on purpose: "in use by another process, try again" is a different answer
|
|
537
|
+
// from "there was nothing to do", and conflating them hides a contended maintenance run.
|
|
538
|
+
const skipped = (name) => ({ changed: false, before: 0, after: 0, detail: `${name}: skipped, file is locked by another process` });
|
|
482
539
|
export function compactLedger(wolfDir, ret) {
|
|
483
540
|
const p = path.join(wolfDir, "token-ledger.json");
|
|
484
541
|
if (!fs.existsSync(p))
|
|
485
542
|
return noop("token-ledger");
|
|
486
543
|
// Hold the same file lock as the daemon/stop-hook ledger writers (withLock on the ledger path)
|
|
487
544
|
// so a doctor-compaction and a live write can't clobber each other → no lost updates.
|
|
488
|
-
return
|
|
545
|
+
return withLockOr(p, () => skipped("token-ledger"), () => {
|
|
489
546
|
const before = fileSize(p);
|
|
490
547
|
const ledger = readJSON(p, {});
|
|
491
548
|
if (!Array.isArray(ledger.sessions))
|
|
@@ -516,7 +573,7 @@ export function compactLedger(wolfDir, ret) {
|
|
|
516
573
|
// Mirrors the daemon's consolidateMemory so it also runs without the daemon.
|
|
517
574
|
export function consolidateMemory(wolfDir, olderThanDays) {
|
|
518
575
|
const p = path.join(wolfDir, "memory.md");
|
|
519
|
-
return
|
|
576
|
+
return withLockOr(p, () => skipped("memory"), () => {
|
|
520
577
|
const content = readText(p);
|
|
521
578
|
if (!content)
|
|
522
579
|
return noop("memory");
|
|
@@ -571,7 +628,7 @@ export function dedupeAndCapBuglog(wolfDir, max) {
|
|
|
571
628
|
const p = path.join(wolfDir, "buglog.json");
|
|
572
629
|
if (!fs.existsSync(p))
|
|
573
630
|
return noop("buglog");
|
|
574
|
-
return
|
|
631
|
+
return withLockOr(p, () => skipped("buglog"), () => {
|
|
575
632
|
const before = fileSize(p);
|
|
576
633
|
// Tolerate legacy bare-array buglogs ([...]) as well as {version, bugs:[]}.
|
|
577
634
|
const raw = readJSON(p, { version: 1, bugs: [] });
|
|
@@ -709,6 +766,43 @@ export function rotateDaemonLog(wolfDir, maxBytes) {
|
|
|
709
766
|
const after = fileSize(p);
|
|
710
767
|
return { changed: true, before, after, detail: `daemon.log: rotated ${humanBytes(before)} → ${humanBytes(after)}` };
|
|
711
768
|
}
|
|
769
|
+
/**
|
|
770
|
+
* Keep .wolf/proposals/ bounded.
|
|
771
|
+
*
|
|
772
|
+
* Every AI cron task writes one proposal per run and nothing ever removed them: two enabled tasks
|
|
773
|
+
* on a weekly schedule leave ~100 files a year, each holding a model's full answer over cerebrum.md
|
|
774
|
+
* and memory.md. Backups and the daemon log had a retention rule; this directory was simply missed.
|
|
775
|
+
* Newest are kept — a proposal is a review item, and an unreviewed one from last spring is not.
|
|
776
|
+
*/
|
|
777
|
+
export function pruneProposals(wolfDir, keep) {
|
|
778
|
+
const dir = path.join(wolfDir, "proposals");
|
|
779
|
+
if (!fs.existsSync(dir))
|
|
780
|
+
return noop("proposals");
|
|
781
|
+
const before = dirSize(dir);
|
|
782
|
+
const files = safeReaddir(dir)
|
|
783
|
+
.map((n) => ({ name: n, full: path.join(dir, n) }))
|
|
784
|
+
.filter((e) => {
|
|
785
|
+
try {
|
|
786
|
+
return fs.statSync(e.full).isFile();
|
|
787
|
+
}
|
|
788
|
+
catch {
|
|
789
|
+
return false;
|
|
790
|
+
}
|
|
791
|
+
})
|
|
792
|
+
.sort((a, b) => a.name.localeCompare(b.name)); // "<task>-<ISO stamp>.md" sorts chronologically
|
|
793
|
+
if (files.length <= keep) {
|
|
794
|
+
return { changed: false, before, after: before, detail: `proposals: ${files.length} kept, within limit (${keep})` };
|
|
795
|
+
}
|
|
796
|
+
const toRemove = files.slice(0, files.length - keep);
|
|
797
|
+
for (const f of toRemove) {
|
|
798
|
+
try {
|
|
799
|
+
fs.rmSync(f.full, { force: true });
|
|
800
|
+
}
|
|
801
|
+
catch { }
|
|
802
|
+
}
|
|
803
|
+
const after = dirSize(dir);
|
|
804
|
+
return { changed: true, before, after, detail: `proposals: removed ${toRemove.length}, kept ${keep} (${humanBytes(before)} → ${humanBytes(after)})` };
|
|
805
|
+
}
|
|
712
806
|
// Content words for similarity: lowercase alphanumerics (incl. German umlauts) of length ≥ 4,
|
|
713
807
|
// which drops most stopwords/articles ("the", "und", "der") without a stopword list.
|
|
714
808
|
function contentWords(text) {
|
|
@@ -860,7 +954,7 @@ export function repairNativeMemoryIndex(dir, opts = {}) {
|
|
|
860
954
|
const next = base.includes(heading)
|
|
861
955
|
? `${base}\n${added.map((a) => a.line).join("\n")}\n`
|
|
862
956
|
: `${base}\n\n${heading}\n${added.map((a) => a.line).join("\n")}\n`;
|
|
863
|
-
const wrote =
|
|
957
|
+
const wrote = withLockOr(indexPath, () => false, () => writeText(indexPath, next));
|
|
864
958
|
return { added, skippedStale, skippedBudget, deadLinks, wrote };
|
|
865
959
|
}
|
|
866
960
|
//# sourceMappingURL=maintenance.js.map
|