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.
- package/CHANGELOG.md +60 -8
- package/README.md +2 -0
- package/dist/dashboard/assets/{AISuggestions-QGhs2DoV.js → AISuggestions-DFlouDIL.js} +1 -1
- package/dist/dashboard/assets/{ActivityLog-CR8T5YaG.js → ActivityLog-CJtR29gn.js} +1 -1
- package/dist/dashboard/assets/{ActivityTimeline-GU4piC1d.js → ActivityTimeline-DIlgZDJN.js} +1 -1
- package/dist/dashboard/assets/{AnatomyBrowser-Ckx41MwV.js → AnatomyBrowser-DvfcfJIh.js} +1 -1
- package/dist/dashboard/assets/{BugLog-CcbR445L.js → BugLog-DVjEVymk.js} +1 -1
- package/dist/dashboard/assets/{CerebrumViewer-CFnz9d3_.js → CerebrumViewer-CqVLcRBT.js} +1 -1
- package/dist/dashboard/assets/{CronStatus-yqN5xWjo.js → CronStatus-Doa5ulw6.js} +1 -1
- package/dist/dashboard/assets/{DesignQC-Bq70ELLx.js → DesignQC-ChcCjhRo.js} +1 -1
- package/dist/dashboard/assets/{MemoryViewer-Dr0RQD_S.js → MemoryViewer-4Y37qY10.js} +1 -1
- package/dist/dashboard/assets/{NativeMemory-DZMSayPb.js → NativeMemory-CghbPOYf.js} +1 -1
- package/dist/dashboard/assets/{ProjectOverview-4sX8rFWU.js → ProjectOverview-DUEz2BFt.js} +1 -1
- package/dist/dashboard/assets/{ProjectsAggregate-B_6xCeno.js → ProjectsAggregate-LfDkglb7.js} +1 -1
- package/dist/dashboard/assets/{StatusBadge-_6rvY-Fk.js → StatusBadge-DVN6YmJb.js} +1 -1
- package/dist/dashboard/assets/{TokenUsage-BzWJE7MG.js → TokenUsage-Blvjo66Y.js} +1 -1
- package/dist/dashboard/assets/{index-_nPKoynG.js → index--H9WVEV1.js} +3 -3
- package/dist/dashboard/index.html +1 -1
- package/dist/hooks/session-start.js +12 -1
- package/dist/hooks/shared.js +36 -20
- package/dist/src/cli/index.js +2 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/recall-cmd.js +24 -1
- package/dist/src/cli/recall-cmd.js.map +1 -1
- package/dist/src/daemon/cron-engine.js +5 -1
- package/dist/src/daemon/cron-engine.js.map +1 -1
- package/dist/src/daemon/wolf-daemon.js +21 -10
- package/dist/src/daemon/wolf-daemon.js.map +1 -1
- package/dist/src/hooks/session-start.js +12 -1
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/shared.js +36 -20
- package/dist/src/hooks/shared.js.map +1 -1
- package/dist/src/utils/embeddings.js.map +1 -1
- package/dist/src/utils/fs-safe.js +39 -29
- package/dist/src/utils/fs-safe.js.map +1 -1
- package/dist/src/utils/recall.js +18 -0
- package/dist/src/utils/recall.js.map +1 -1
- package/dist/src/utils/semantic-recall.js +172 -0
- package/dist/src/utils/semantic-recall.js.map +1 -0
- package/dist/src/utils/wolf-gitignore.js +2 -0
- package/dist/src/utils/wolf-gitignore.js.map +1 -1
- 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":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAkB,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAoB,MAAM,iBAAiB,CAAC;AAEvE,kGAAkG;AAClG,kGAAkG;AAClG,kGAAkG;AAClG,+FAA+F;AAC/F,4FAA4F;AAC5F,+FAA+F;AAE/F,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AACzC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAO/F,6EAA6E;AAC7E,MAAM,KAAK,GAAG,CAAC,GAAmB,EAAE,CAAS,EAAgB,EAAE,CAC7D,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AAEzD,SAAS,MAAM,CAAC,CAAe;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6FAA6F;AAC7F,gGAAgG;AAChG,SAAS,gBAAgB,CAAC,QAAgB,EAAE,KAAiB;IAC3D,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,KAAK,CAAC,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,KAAa;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAc,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,gBAAgB;QACzF,8EAA8E;QAC9E,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACpG,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,KAAa,EAAE,GAAmB;IACpE,iGAAiG;IACjG,iFAAiF;IACjF,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9G,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAiB,CAAC,CAAC;AACvH,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,GAAgB;IACxE,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,IAAI,IAAI;QAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;QAChE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC;KACxD,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpF,2EAA2E;IAC3E,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,IAAI,SAAS,GAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,SAAS,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,GAAG,GAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAChG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM;YAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;IAE5B,iGAAiG;IACjG,iGAAiG;IACjG,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3C,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC5D,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YACxB,IAAI,IAAI,GAAG,gBAAgB,GAAG,KAAK;gBAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACxE,IAAI,OAAO;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,GAAI,CAAW,CAAC,OAAO,0CAA0C,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,CAAY,EAAE,KAAa;IACxC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;AAChI,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,KAAa,EAAE,GAAgB,EAAE,KAAK,GAAG,EAAE;IAC/F,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC,OAAO;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACtD,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,6DAA6D;SAC5F,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;SAC7B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa,EAAE,GAAgB,EAAE,KAAK,GAAG,EAAE;IAC7F,MAAM,MAAM,GAAG,QAAQ,CAAiD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/G,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6C,CAAC;IACnE,MAAM,GAAG,GAAG,CAAC,IAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QAC5D,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;;YAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,OAAO,CAAC,CAAC;IACb,GAAG,CAAC,QAAQ,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;SACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC"}
|
|
@@ -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;
|
|
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.
|
|
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": {
|