openwolf-enhanced 1.19.3 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +60 -8
  2. package/README.md +2 -0
  3. package/dist/dashboard/assets/{AISuggestions-QGhs2DoV.js → AISuggestions-DFlouDIL.js} +1 -1
  4. package/dist/dashboard/assets/{ActivityLog-CR8T5YaG.js → ActivityLog-CJtR29gn.js} +1 -1
  5. package/dist/dashboard/assets/{ActivityTimeline-GU4piC1d.js → ActivityTimeline-DIlgZDJN.js} +1 -1
  6. package/dist/dashboard/assets/{AnatomyBrowser-Ckx41MwV.js → AnatomyBrowser-DvfcfJIh.js} +1 -1
  7. package/dist/dashboard/assets/{BugLog-CcbR445L.js → BugLog-DVjEVymk.js} +1 -1
  8. package/dist/dashboard/assets/{CerebrumViewer-CFnz9d3_.js → CerebrumViewer-CqVLcRBT.js} +1 -1
  9. package/dist/dashboard/assets/{CronStatus-yqN5xWjo.js → CronStatus-Doa5ulw6.js} +1 -1
  10. package/dist/dashboard/assets/{DesignQC-Bq70ELLx.js → DesignQC-ChcCjhRo.js} +1 -1
  11. package/dist/dashboard/assets/{MemoryViewer-Dr0RQD_S.js → MemoryViewer-4Y37qY10.js} +1 -1
  12. package/dist/dashboard/assets/{NativeMemory-DZMSayPb.js → NativeMemory-CghbPOYf.js} +1 -1
  13. package/dist/dashboard/assets/{ProjectOverview-4sX8rFWU.js → ProjectOverview-DUEz2BFt.js} +1 -1
  14. package/dist/dashboard/assets/{ProjectsAggregate-B_6xCeno.js → ProjectsAggregate-LfDkglb7.js} +1 -1
  15. package/dist/dashboard/assets/{StatusBadge-_6rvY-Fk.js → StatusBadge-DVN6YmJb.js} +1 -1
  16. package/dist/dashboard/assets/{TokenUsage-BzWJE7MG.js → TokenUsage-Blvjo66Y.js} +1 -1
  17. package/dist/dashboard/assets/{index-_nPKoynG.js → index--H9WVEV1.js} +3 -3
  18. package/dist/dashboard/index.html +1 -1
  19. package/dist/hooks/session-start.js +12 -1
  20. package/dist/hooks/shared.js +36 -20
  21. package/dist/src/cli/index.js +2 -0
  22. package/dist/src/cli/index.js.map +1 -1
  23. package/dist/src/cli/recall-cmd.js +24 -1
  24. package/dist/src/cli/recall-cmd.js.map +1 -1
  25. package/dist/src/daemon/cron-engine.js +5 -1
  26. package/dist/src/daemon/cron-engine.js.map +1 -1
  27. package/dist/src/daemon/wolf-daemon.js +21 -10
  28. package/dist/src/daemon/wolf-daemon.js.map +1 -1
  29. package/dist/src/hooks/session-start.js +12 -1
  30. package/dist/src/hooks/session-start.js.map +1 -1
  31. package/dist/src/hooks/shared.js +36 -20
  32. package/dist/src/hooks/shared.js.map +1 -1
  33. package/dist/src/utils/embeddings.js.map +1 -1
  34. package/dist/src/utils/fs-safe.js +39 -29
  35. package/dist/src/utils/fs-safe.js.map +1 -1
  36. package/dist/src/utils/recall.js +18 -0
  37. package/dist/src/utils/recall.js.map +1 -1
  38. package/dist/src/utils/semantic-recall.js +172 -0
  39. package/dist/src/utils/semantic-recall.js.map +1 -0
  40. package/dist/src/utils/wolf-gitignore.js +2 -0
  41. package/dist/src/utils/wolf-gitignore.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,172 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as crypto from "node:crypto";
4
+ import { collectUnits, entryId, recall } from "./recall.js";
5
+ import { readJSON, writeJSON } from "./fs-safe.js";
6
+ import { embedTexts, cosine } from "./embeddings.js";
7
+ // Semantic recall: embed each memory unit, search by cosine similarity, and fuse with the lexical
8
+ // (BM25) recall. The index is split across two files in .wolf/: recall-embeddings.json holds unit
9
+ // metadata, recall-embeddings.vec the raw Float32 vectors. Vectors must NOT live in the JSON — on
10
+ // a large knowledge base (20k+ units × 768 dims) the pretty-printed floats exceed V8's maximum
11
+ // string length, so JSON.stringify throws and the index silently never persists. The binary
12
+ // sidecar is ~7× smaller and needs no parsing. Only new/changed units are re-embedded per run.
13
+ const META_FILE = "recall-embeddings.json";
14
+ const VEC_FILE = "recall-embeddings.vec";
15
+ const hashText = (t) => crypto.createHash("sha1").update(t).digest("hex").slice(0, 16);
16
+ /** Vector of entry i, as a zero-copy view. All-zero = not (yet) embedded. */
17
+ const vecOf = (idx, i) => idx.vectors.subarray(i * idx.dims, (i + 1) * idx.dims);
18
+ function isZero(v) {
19
+ for (let i = 0; i < v.length; i++)
20
+ if (v[i] !== 0)
21
+ return false;
22
+ return true;
23
+ }
24
+ // tmp+rename like fs-safe.writeJSON, but for bytes — and failures propagate instead of being
25
+ // swallowed: a recall index that silently fails to persist re-embeds everything on every query.
26
+ function atomicWriteBytes(filePath, bytes) {
27
+ const tmp = filePath + "." + crypto.randomBytes(4).toString("hex") + ".tmp";
28
+ try {
29
+ fs.writeFileSync(tmp, bytes);
30
+ fs.renameSync(tmp, filePath);
31
+ }
32
+ catch (e) {
33
+ try {
34
+ fs.unlinkSync(tmp);
35
+ }
36
+ catch { /* never created */ }
37
+ throw e;
38
+ }
39
+ }
40
+ function loadIndex(wolfDir, model) {
41
+ const meta = readJSON(path.join(wolfDir, META_FILE), null);
42
+ if (!meta || meta.version !== 2 || meta.model !== model || !meta.dims || !Array.isArray(meta.entries))
43
+ return null;
44
+ try {
45
+ const buf = fs.readFileSync(path.join(wolfDir, VEC_FILE));
46
+ if (buf.byteLength !== meta.entries.length * meta.dims * 4)
47
+ return null; // stale sidecar
48
+ // Copy: a Buffer's byteOffset into its pool is not guaranteed 4-byte aligned.
49
+ const vectors = new Float32Array(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength));
50
+ return { entries: meta.entries, dims: meta.dims, vectors };
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function saveIndex(wolfDir, model, idx) {
57
+ // Vectors first: if we crash between the writes, the meta/sidecar length check fails on the next
58
+ // load and the index rebuilds, instead of pairing new metadata with old vectors.
59
+ atomicWriteBytes(path.join(wolfDir, VEC_FILE), new Uint8Array(idx.vectors.buffer, 0, idx.vectors.byteLength));
60
+ writeJSON(path.join(wolfDir, META_FILE), { version: 2, model, dims: idx.dims, entries: idx.entries });
61
+ }
62
+ /** Ensure an up-to-date embedding index: reuse cached vectors for unchanged text, embed the rest. */
63
+ export async function buildOrUpdateIndex(wolfDir, cfg) {
64
+ const units = collectUnits(wolfDir);
65
+ const prev = loadIndex(wolfDir, cfg.model);
66
+ const cache = new Map();
67
+ if (prev)
68
+ prev.entries.forEach((e, i) => {
69
+ const v = vecOf(prev, i);
70
+ if (!isZero(v))
71
+ cache.set(e.hash, v);
72
+ });
73
+ const entries = units.map((u) => ({
74
+ src: u.src, line: u.line, blockStart: u.blockStart, text: u.text,
75
+ hash: hashText(u.text), id: entryId(u.src, u.blockText),
76
+ }));
77
+ const pending = entries.map((e, i) => i).filter((i) => !cache.has(entries[i].hash));
78
+ // Vector width comes from the cache, or from the first embedding response.
79
+ let dims = prev?.dims ?? 0;
80
+ const BATCH = 64;
81
+ let firstVecs = [];
82
+ if (dims === 0) {
83
+ if (pending.length === 0)
84
+ return { entries, dims: 0, vectors: new Float32Array(0) };
85
+ firstVecs = await embedTexts(cfg, pending.slice(0, BATCH).map((i) => entries[i].text));
86
+ dims = firstVecs[0].length;
87
+ }
88
+ const idx = { entries, dims, vectors: new Float32Array(entries.length * dims) };
89
+ entries.forEach((e, i) => {
90
+ const cached = cache.get(e.hash);
91
+ if (cached)
92
+ idx.vectors.set(cached, i * dims);
93
+ });
94
+ firstVecs.forEach((v, j) => idx.vectors.set(v, pending[j] * dims));
95
+ let done = firstVecs.length;
96
+ // Embed the rest in batches. The index is checkpointed periodically and on failure — un-embedded
97
+ // entries stay all-zero, which the cache treats as absent, so an interrupted build resumes where
98
+ // it stopped instead of re-embedding everything.
99
+ const CHECKPOINT_EVERY = 20 * BATCH;
100
+ const verbose = pending.length > 2 * BATCH;
101
+ try {
102
+ for (let i = done; i < pending.length; i += BATCH) {
103
+ const chunk = pending.slice(i, i + BATCH);
104
+ const vecs = await embedTexts(cfg, chunk.map((k) => entries[k].text));
105
+ vecs.forEach((v, j) => idx.vectors.set(v, chunk[j] * dims));
106
+ done = i + chunk.length;
107
+ if (done % CHECKPOINT_EVERY < BATCH)
108
+ saveIndex(wolfDir, cfg.model, idx);
109
+ if (verbose)
110
+ process.stderr.write(`\rembedding memory index: ${done}/${pending.length}`);
111
+ }
112
+ }
113
+ catch (e) {
114
+ saveIndex(wolfDir, cfg.model, idx);
115
+ if (verbose)
116
+ process.stderr.write("\n");
117
+ throw new Error(`${e.message} (partial index saved — rerun to resume)`);
118
+ }
119
+ if (verbose)
120
+ process.stderr.write("\n");
121
+ saveIndex(wolfDir, cfg.model, idx);
122
+ return idx;
123
+ }
124
+ function toHit(e, score) {
125
+ return { file: e.src, line: e.line, text: e.text, score: Math.round(score * 1000) / 1000, id: e.id, blockLine: e.blockStart };
126
+ }
127
+ /** Pure semantic ranking by cosine similarity to the query embedding. */
128
+ export async function semanticRecall(wolfDir, query, cfg, limit = 12) {
129
+ const idx = await buildOrUpdateIndex(wolfDir, cfg);
130
+ if (idx.entries.length === 0 || idx.dims === 0)
131
+ return [];
132
+ const [qv] = await embedTexts(cfg, [query]);
133
+ return idx.entries
134
+ .map((e, i) => ({ e, sim: cosine(qv, vecOf(idx, i)) }))
135
+ .filter(({ sim }) => sim !== 0) // zero vector = not embedded (or degenerate) — never rank it
136
+ .sort((a, b) => b.sim - a.sim)
137
+ .slice(0, limit)
138
+ .map(({ e, sim }) => toHit(e, sim));
139
+ }
140
+ /**
141
+ * Hybrid recall: fuse lexical (BM25) and semantic rankings with Reciprocal Rank Fusion. RRF combines
142
+ * two rankings by summing 1/(K + rank) per list, so it needs no score-scale tuning — an item ranked
143
+ * high by either method rises, and one ranked high by both wins.
144
+ *
145
+ * K defaults to 2, not the textbook 60: with only two lists and a small candidate pool, K=60 lets an
146
+ * item that is mediocre in both lists (2/80) outscore the top hit of one list (1/61). Measured on a
147
+ * 14-query set over a 22k-unit knowledge base: K≤2 gives MRR 0.845 vs 0.627 at K=60, beating both
148
+ * BM25 (0.726) and pure semantic (0.714) alone. Override via openwolf.recall.rrf_k in config.json.
149
+ */
150
+ export async function hybridRecall(wolfDir, query, cfg, limit = 12) {
151
+ const tuning = readJSON(path.join(wolfDir, "config.json"), {});
152
+ const K = tuning.openwolf?.recall?.rrf_k ?? 2;
153
+ const lexical = recall(wolfDir, query, { limit: 50 });
154
+ const semantic = await semanticRecall(wolfDir, query, cfg, 50);
155
+ const fused = new Map();
156
+ const add = (list) => list.forEach((hit, rank) => {
157
+ const key = `${hit.file}:${hit.line}`;
158
+ const s = 1 / (K + rank);
159
+ const cur = fused.get(key);
160
+ if (cur)
161
+ cur.score += s;
162
+ else
163
+ fused.set(key, { hit, score: s });
164
+ });
165
+ add(lexical);
166
+ add(semantic);
167
+ return [...fused.values()]
168
+ .sort((a, b) => b.score - a.score)
169
+ .slice(0, limit)
170
+ .map(({ hit, score }) => ({ ...hit, score: Math.round(score * 1000) / 1000 }));
171
+ }
172
+ //# sourceMappingURL=semantic-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-recall.js","sourceRoot":"","sources":["../../../src/utils/semantic-recall.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ const ENTRIES = [
12
12
  { pattern: "dashboard-token", why: "bearer token for the local dashboard API" },
13
13
  { pattern: "remote-token", why: "workspace token — grants write access to the team's memory" },
14
14
  { pattern: "remote-pushed.json", why: "per-machine push bookkeeping, not shared state" },
15
+ { pattern: "recall-embeddings.json", why: "semantic recall index metadata — machine-local cache" },
16
+ { pattern: "recall-embeddings.vec", why: "semantic recall vectors (binary, tens of MB) — rebuildable cache" },
15
17
  ];
16
18
  const HEADER = "# Managed by OpenWolf — local secrets and machine-local state, never commit these.";
17
19
  /** Create or extend .wolf/.gitignore. Idempotent: only missing lines are appended. */
@@ -1 +1 @@
1
- {"version":3,"file":"wolf-gitignore.js","sourceRoot":"","sources":["../../../src/utils/wolf-gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,+DAA+D;AAC/D,EAAE;AACF,mGAAmG;AACnG,oGAAoG;AACpG,mGAAmG;AACnG,EAAE;AACF,iGAAiG;AACjG,4FAA4F;AAC5F,MAAM,OAAO,GAA4C;IACvD,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,0CAA0C,EAAE;IAC/E,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,4DAA4D,EAAE;IAC9F,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,gDAAgD,EAAE;CACzF,CAAC;AAEF,MAAM,MAAM,GAAG,oFAAoF,CAAC;AAEpG,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE3C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAE7E,8FAA8F;IAC9F,mFAAmF;IACnF,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACjF,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"wolf-gitignore.js","sourceRoot":"","sources":["../../../src/utils/wolf-gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,+DAA+D;AAC/D,EAAE;AACF,mGAAmG;AACnG,oGAAoG;AACpG,mGAAmG;AACnG,EAAE;AACF,iGAAiG;AACjG,4FAA4F;AAC5F,MAAM,OAAO,GAA4C;IACvD,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,0CAA0C,EAAE;IAC/E,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,4DAA4D,EAAE;IAC9F,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,gDAAgD,EAAE;IACxF,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,sDAAsD,EAAE;IAClG,EAAE,OAAO,EAAE,uBAAuB,EAAE,GAAG,EAAE,kEAAkE,EAAE;CAC9G,CAAC;AAEF,MAAM,MAAM,GAAG,oFAAoF,CAAC;AAEpG,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE3C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAE7E,8FAA8F;IAC9F,mFAAmF;IACnF,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACjF,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openwolf-enhanced",
3
- "version": "1.19.3",
3
+ "version": "1.20.1",
4
4
  "description": "A second brain for Claude Code, Codex & Gemini — persistent git-native project memory with searchable citations, an MCP server for Claude Desktop, and invisible hook-based context. No database.",
5
5
  "type": "module",
6
6
  "bin": {