@hilbras/remembra 0.1.0 → 0.3.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 +31 -0
- package/README.md +29 -4
- package/dist/embeddings.d.ts +12 -0
- package/dist/embeddings.js +65 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/http.d.ts +19 -0
- package/dist/http.js +114 -0
- package/dist/http.js.map +1 -0
- package/dist/index.js +98 -75
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +21 -0
- package/dist/llm.js +142 -0
- package/dist/llm.js.map +1 -0
- package/dist/retrieval.d.ts +11 -6
- package/dist/retrieval.js +57 -25
- package/dist/retrieval.js.map +1 -1
- package/dist/service.d.ts +64 -0
- package/dist/service.js +121 -0
- package/dist/service.js.map +1 -0
- package/dist/store.d.ts +1 -1
- package/dist/store.js +10 -1
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.js.map +1 -1
- package/docs/chatgpt.md +200 -0
- package/docs/clients.md +13 -2
- package/docs/providers.md +107 -0
- package/docs/tools.md +16 -2
- package/package.json +1 -1
package/dist/llm.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable LLM provider for session-digest extraction (v2).
|
|
3
|
+
*
|
|
4
|
+
* Config: REMEMBRA_LLM=openai|anthropic|ollama (default: openai)
|
|
5
|
+
* Keys: OPENAI_API_KEY / ANTHROPIC_API_KEY / OLLAMA_HOST (default localhost:11434)
|
|
6
|
+
*
|
|
7
|
+
* No SDK dependencies — plain fetch against each provider's HTTP API.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveLlmProvider() {
|
|
10
|
+
const v = (process.env.REMEMBRA_LLM ?? "openai").toLowerCase();
|
|
11
|
+
if (v === "openai" || v === "anthropic" || v === "ollama")
|
|
12
|
+
return v;
|
|
13
|
+
throw new Error(`Invalid REMEMBRA_LLM "${v}" — expected openai|anthropic|ollama`);
|
|
14
|
+
}
|
|
15
|
+
const SYSTEM_PROMPT = `You extract long-term memories from a conversation transcript.
|
|
16
|
+
Return ONLY a JSON array (no prose, no markdown fence). Each element:
|
|
17
|
+
{"type":"fact"|"decision"|"role"|"history","content":"<standalone statement>","tags":["..."],"importance":1-5}
|
|
18
|
+
|
|
19
|
+
Rules:
|
|
20
|
+
- "fact": stable knowledge worth keeping. "decision": a choice already made.
|
|
21
|
+
- "role": standing instruction/preference about how to behave. "history": condensed chronology of past work.
|
|
22
|
+
- Write each content as a self-contained statement (no "we discussed" or "earlier").
|
|
23
|
+
- Skip small talk, pleasantries, and anything already obvious from the transcript's task.
|
|
24
|
+
- importance: 5 = critical, 1 = trivia. Default 3.
|
|
25
|
+
- If nothing is worth keeping, return [].
|
|
26
|
+
- Output must be valid JSON parseable directly.`;
|
|
27
|
+
export async function extractMemories(transcript, provider = resolveLlmProvider()) {
|
|
28
|
+
const text = await chat(provider, SYSTEM_PROMPT, transcript);
|
|
29
|
+
return parseExtraction(text);
|
|
30
|
+
}
|
|
31
|
+
async function chat(provider, system, user) {
|
|
32
|
+
switch (provider) {
|
|
33
|
+
case "openai": {
|
|
34
|
+
const key = process.env.OPENAI_API_KEY;
|
|
35
|
+
if (!key)
|
|
36
|
+
throw new Error("REMEMBRA_LLM=openai requires OPENAI_API_KEY");
|
|
37
|
+
return postJson("https://api.openai.com/v1/chat/completions", {
|
|
38
|
+
headers: { authorization: `Bearer ${key}` },
|
|
39
|
+
body: {
|
|
40
|
+
model: process.env.REMEMBRA_LLM_MODEL ?? "gpt-4o-mini",
|
|
41
|
+
temperature: 0,
|
|
42
|
+
response_format: { type: "json_object" },
|
|
43
|
+
messages: [
|
|
44
|
+
{ role: "system", content: system },
|
|
45
|
+
{ role: "user", content: user },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
}).then((r) => r.choices[0].message.content);
|
|
49
|
+
}
|
|
50
|
+
case "anthropic": {
|
|
51
|
+
const key = process.env.ANTHROPIC_API_KEY;
|
|
52
|
+
if (!key)
|
|
53
|
+
throw new Error("REMEMBRA_LLM=anthropic requires ANTHROPIC_API_KEY");
|
|
54
|
+
return postJson("https://api.anthropic.com/v1/messages", {
|
|
55
|
+
headers: {
|
|
56
|
+
"x-api-key": key,
|
|
57
|
+
"anthropic-version": "2023-06-01",
|
|
58
|
+
},
|
|
59
|
+
body: {
|
|
60
|
+
model: process.env.REMEMBRA_LLM_MODEL ?? "claude-haiku-4-5",
|
|
61
|
+
max_tokens: 4096,
|
|
62
|
+
system,
|
|
63
|
+
messages: [{ role: "user", content: user }],
|
|
64
|
+
},
|
|
65
|
+
}).then((r) => r.content[0].text);
|
|
66
|
+
}
|
|
67
|
+
case "ollama": {
|
|
68
|
+
const host = process.env.OLLAMA_HOST ?? "http://localhost:11434";
|
|
69
|
+
return postJson(`${host}/api/chat`, {
|
|
70
|
+
body: {
|
|
71
|
+
model: process.env.REMEMBRA_LLM_MODEL ?? "llama3.2",
|
|
72
|
+
format: "json",
|
|
73
|
+
stream: false,
|
|
74
|
+
messages: [
|
|
75
|
+
{ role: "system", content: system },
|
|
76
|
+
{ role: "user", content: user },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
}).then((r) => r.message.content);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function postJson(url, opts) {
|
|
84
|
+
const res = await fetch(url, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: { "content-type": "application/json", ...opts.headers },
|
|
87
|
+
body: JSON.stringify(opts.body),
|
|
88
|
+
});
|
|
89
|
+
if (!res.ok) {
|
|
90
|
+
const detail = await res.text().catch(() => "");
|
|
91
|
+
throw new Error(`LLM request failed (${res.status} ${url}): ${detail.slice(0, 300)}`);
|
|
92
|
+
}
|
|
93
|
+
return res.json();
|
|
94
|
+
}
|
|
95
|
+
/** Parse the model's reply into extracted memories, tolerating code fences. */
|
|
96
|
+
export function parseExtraction(raw) {
|
|
97
|
+
let text = raw.trim();
|
|
98
|
+
text = text.replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/i, "");
|
|
99
|
+
const start = text.indexOf("[");
|
|
100
|
+
const end = text.lastIndexOf("]");
|
|
101
|
+
if (start !== -1 && end > start)
|
|
102
|
+
text = text.slice(start, end + 1);
|
|
103
|
+
let parsed;
|
|
104
|
+
try {
|
|
105
|
+
parsed = JSON.parse(text);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Some models wrap it as {"memories":[...]} — try once more.
|
|
109
|
+
try {
|
|
110
|
+
const obj = JSON.parse(raw.trim());
|
|
111
|
+
parsed = Array.isArray(obj) ? obj : (obj.memories ?? obj.items ?? []);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error(`Could not parse extraction output: ${raw.slice(0, 200)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!Array.isArray(parsed))
|
|
118
|
+
return [];
|
|
119
|
+
const out = [];
|
|
120
|
+
for (const item of parsed) {
|
|
121
|
+
if (!item || typeof item !== "object")
|
|
122
|
+
continue;
|
|
123
|
+
const type = item.type;
|
|
124
|
+
const content = item.content;
|
|
125
|
+
if (typeof content !== "string" || !content.trim())
|
|
126
|
+
continue;
|
|
127
|
+
if (type !== "fact" && type !== "decision" && type !== "role" && type !== "history")
|
|
128
|
+
continue;
|
|
129
|
+
const tags = item.tags;
|
|
130
|
+
const importance = Number(item.importance);
|
|
131
|
+
const scope = item.scope;
|
|
132
|
+
out.push({
|
|
133
|
+
type,
|
|
134
|
+
content: content.trim(),
|
|
135
|
+
tags: Array.isArray(tags) ? tags.filter((t) => typeof t === "string") : [],
|
|
136
|
+
importance: Number.isFinite(importance) ? Math.min(5, Math.max(1, Math.round(importance))) : 3,
|
|
137
|
+
scope: typeof scope === "string" && scope.trim() ? scope.trim() : undefined,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=llm.js.map
|
package/dist/llm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
package/dist/retrieval.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { Memory, SearchQuery } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
* Layered retrieval (
|
|
4
|
-
* 1. Roles always pass (they are instructions).
|
|
5
|
-
* 2. Scope match (global + current scope beat other scopes).
|
|
6
|
-
* 3. Importance, recency, and keyword overlap contribute to the score.
|
|
3
|
+
* Layered retrieval (decisions Q4 + v2-Q3):
|
|
7
4
|
*
|
|
8
|
-
*
|
|
5
|
+
* Hard gates (never bypassed by scores):
|
|
6
|
+
* - roles always pass (+1000)
|
|
7
|
+
* - other scopes' memories are excluded entirely
|
|
8
|
+
*
|
|
9
|
+
* Ranking:
|
|
10
|
+
* - embeddings ON (queryVec provided): semantic similarity is the primary
|
|
11
|
+
* signal; importance + recency act as modifiers; keywords still help as
|
|
12
|
+
* a tie-breaker for memories missing vectors.
|
|
13
|
+
* - embeddings OFF: keyword overlap is the primary signal (v1 behavior).
|
|
9
14
|
*/
|
|
10
|
-
export declare function search(memories: Memory[], q: SearchQuery): Memory[];
|
|
15
|
+
export declare function search(memories: Memory[], q: SearchQuery, queryVec?: number[] | null): Memory[];
|
package/dist/retrieval.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import { cosine } from "./embeddings.js";
|
|
1
2
|
/**
|
|
2
|
-
* Layered retrieval (
|
|
3
|
-
* 1. Roles always pass (they are instructions).
|
|
4
|
-
* 2. Scope match (global + current scope beat other scopes).
|
|
5
|
-
* 3. Importance, recency, and keyword overlap contribute to the score.
|
|
3
|
+
* Layered retrieval (decisions Q4 + v2-Q3):
|
|
6
4
|
*
|
|
7
|
-
*
|
|
5
|
+
* Hard gates (never bypassed by scores):
|
|
6
|
+
* - roles always pass (+1000)
|
|
7
|
+
* - other scopes' memories are excluded entirely
|
|
8
|
+
*
|
|
9
|
+
* Ranking:
|
|
10
|
+
* - embeddings ON (queryVec provided): semantic similarity is the primary
|
|
11
|
+
* signal; importance + recency act as modifiers; keywords still help as
|
|
12
|
+
* a tie-breaker for memories missing vectors.
|
|
13
|
+
* - embeddings OFF: keyword overlap is the primary signal (v1 behavior).
|
|
8
14
|
*/
|
|
9
|
-
export function search(memories, q) {
|
|
15
|
+
export function search(memories, q, queryVec) {
|
|
10
16
|
const now = Date.now();
|
|
11
17
|
const terms = (q.query ?? "")
|
|
12
18
|
.toLowerCase()
|
|
@@ -14,38 +20,64 @@ export function search(memories, q) {
|
|
|
14
20
|
.filter((t) => t.length > 1);
|
|
15
21
|
const scored = memories
|
|
16
22
|
.filter((m) => (q.type ? m.type === q.type : true))
|
|
17
|
-
.map((m) => ({ m, score: score(m, terms, q.scope, now) }))
|
|
23
|
+
.map((m) => ({ m, score: score(m, terms, q.scope, now, queryVec) }))
|
|
18
24
|
.filter(({ m, score }) => m.type === "role" || score > 0)
|
|
19
25
|
.sort((a, b) => b.score - a.score || b.m.updatedAt.localeCompare(a.m.updatedAt));
|
|
20
26
|
return scored.slice(0, q.limit ?? 10).map(({ m }) => m);
|
|
21
27
|
}
|
|
22
|
-
function score(m, terms, scope, now) {
|
|
28
|
+
function score(m, terms, scope, now, queryVec) {
|
|
23
29
|
let s = 0;
|
|
30
|
+
// --- hard gates ---
|
|
24
31
|
if (m.type === "role")
|
|
25
32
|
s += 1000;
|
|
33
|
+
if (scope && m.scope !== scope && m.scope !== "global")
|
|
34
|
+
return 0; // no cross-project leaks
|
|
26
35
|
if (m.scope === "global")
|
|
27
36
|
s += 100;
|
|
28
37
|
if (scope && m.scope === scope)
|
|
29
38
|
s += 150;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
// --- semantic mode (embeddings on) ---
|
|
40
|
+
if (queryVec && queryVec.length > 0) {
|
|
41
|
+
if (m.embedding && m.embedding.length > 0) {
|
|
42
|
+
// Primary signal: cosine similarity (0..1 → up to +100).
|
|
43
|
+
const sim = Math.max(0, cosine(queryVec, m.embedding));
|
|
44
|
+
s += sim * 100;
|
|
45
|
+
// Similarity gate: near-zero matches only survive on role/scope strength.
|
|
46
|
+
if (sim < 0.05 && m.type !== "role" && m.scope !== "global" && scope !== m.scope)
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Memory without a vector: fall back to keyword scoring for it.
|
|
51
|
+
s += keywordScore(m, terms);
|
|
52
|
+
}
|
|
53
|
+
// Modifiers (smaller weight than keywords-only mode).
|
|
54
|
+
s += m.importance * 4;
|
|
55
|
+
s += recencyScore(m, now) * 0.5;
|
|
56
|
+
return s;
|
|
45
57
|
}
|
|
46
|
-
|
|
58
|
+
// --- keyword mode (embeddings off — v1 behavior) ---
|
|
59
|
+
s += m.importance * 10;
|
|
60
|
+
s += recencyScore(m, now);
|
|
61
|
+
if (terms.length > 0)
|
|
62
|
+
s += keywordScore(m, terms);
|
|
63
|
+
else
|
|
47
64
|
s += 10; // no query: everything eligible scores a little
|
|
48
|
-
}
|
|
49
65
|
return s;
|
|
50
66
|
}
|
|
67
|
+
function recencyScore(m, now) {
|
|
68
|
+
const ageDays = (now - Date.parse(m.updatedAt)) / 86_400_000;
|
|
69
|
+
if (Number.isNaN(ageDays))
|
|
70
|
+
return 0;
|
|
71
|
+
return Math.max(0, 20 - ageDays / 3);
|
|
72
|
+
}
|
|
73
|
+
function keywordScore(m, terms) {
|
|
74
|
+
if (terms.length === 0)
|
|
75
|
+
return 0;
|
|
76
|
+
const hay = (m.content + " " + m.tags.join(" ")).toLowerCase();
|
|
77
|
+
let hits = 0;
|
|
78
|
+
for (const t of terms)
|
|
79
|
+
if (hay.includes(t))
|
|
80
|
+
hits++;
|
|
81
|
+
return (hits / terms.length) * 60;
|
|
82
|
+
}
|
|
51
83
|
//# sourceMappingURL=retrieval.js.map
|
package/dist/retrieval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CAAC,QAAkB,EAAE,CAAc,EAAE,QAA0B;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;SAC1B,WAAW,EAAE;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,QAAQ;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SACnE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC;SACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,KAAK,CACZ,CAAS,EACT,KAAe,EACf,KAAyB,EACzB,GAAW,EACX,QAA0B;IAE1B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,qBAAqB;IACrB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,CAAC,IAAI,IAAI,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,CAAC,yBAAyB;IAE3F,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,CAAC,IAAI,GAAG,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;QAAE,CAAC,IAAI,GAAG,CAAC;IAEzC,wCAAwC;IACxC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,yDAAyD;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACvD,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC;YACf,0EAA0E;YAC1E,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,sDAAsD;QACtD,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;QACtB,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sDAAsD;IACtD,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;;QAC7C,CAAC,IAAI,EAAE,CAAC,CAAC,gDAAgD;IAC9D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,GAAW;IAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,UAAU,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,KAAe;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,IAAI,EAAE,CAAC;IACnD,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { MemoryStore } from "./store.js";
|
|
2
|
+
import { MemoryType, Memory } from "./types.js";
|
|
3
|
+
import { EmbeddingProvider } from "./embeddings.js";
|
|
4
|
+
import { LlmProvider, ExtractedMemory } from "./llm.js";
|
|
5
|
+
export interface DigestResult {
|
|
6
|
+
extracted: number;
|
|
7
|
+
stored: Memory[];
|
|
8
|
+
skippedDuplicates: number;
|
|
9
|
+
ids: string[];
|
|
10
|
+
}
|
|
11
|
+
interface ServiceDeps {
|
|
12
|
+
embeddingProvider?: EmbeddingProvider;
|
|
13
|
+
llmProvider?: LlmProvider;
|
|
14
|
+
/** Injection points for tests. */
|
|
15
|
+
embedFn?: (text: string) => Promise<number[]>;
|
|
16
|
+
extractFn?: (transcript: string) => Promise<ExtractedMemory[]>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Transport-agnostic handlers. Both the MCP tools and the HTTP API
|
|
20
|
+
* call into this module, so behavior is guaranteed to match.
|
|
21
|
+
*/
|
|
22
|
+
export declare class MemoryService {
|
|
23
|
+
readonly db: MemoryStore;
|
|
24
|
+
private readonly embedFn?;
|
|
25
|
+
private readonly extractFn?;
|
|
26
|
+
constructor(db: MemoryStore, deps?: ServiceDeps);
|
|
27
|
+
get embeddingsEnabled(): boolean;
|
|
28
|
+
private maybeEmbed;
|
|
29
|
+
store(input: unknown): Promise<{
|
|
30
|
+
id: string;
|
|
31
|
+
message: string;
|
|
32
|
+
memory: Memory;
|
|
33
|
+
}>;
|
|
34
|
+
search(q: {
|
|
35
|
+
query?: string;
|
|
36
|
+
scope?: string;
|
|
37
|
+
type?: MemoryType;
|
|
38
|
+
limit?: number;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
text: string;
|
|
41
|
+
results: Memory[];
|
|
42
|
+
}>;
|
|
43
|
+
list(q: {
|
|
44
|
+
scope?: string;
|
|
45
|
+
type?: MemoryType;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
text: string;
|
|
48
|
+
memories: Memory[];
|
|
49
|
+
}>;
|
|
50
|
+
forget(id: string): Promise<{
|
|
51
|
+
ok: boolean;
|
|
52
|
+
text: string;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Session digest (v2): extract worth-keeping memories from a transcript
|
|
56
|
+
* and store them, skipping exact duplicates already present.
|
|
57
|
+
*/
|
|
58
|
+
digest(opts: {
|
|
59
|
+
transcript: string;
|
|
60
|
+
scope?: string;
|
|
61
|
+
source?: string;
|
|
62
|
+
}): Promise<DigestResult>;
|
|
63
|
+
}
|
|
64
|
+
export {};
|
package/dist/service.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { search } from "./retrieval.js";
|
|
2
|
+
import { StoreInput } from "./types.js";
|
|
3
|
+
import { resolveEmbeddingProvider, embedText } from "./embeddings.js";
|
|
4
|
+
import { resolveLlmProvider, extractMemories } from "./llm.js";
|
|
5
|
+
/**
|
|
6
|
+
* Transport-agnostic handlers. Both the MCP tools and the HTTP API
|
|
7
|
+
* call into this module, so behavior is guaranteed to match.
|
|
8
|
+
*/
|
|
9
|
+
export class MemoryService {
|
|
10
|
+
db;
|
|
11
|
+
embedFn;
|
|
12
|
+
extractFn;
|
|
13
|
+
constructor(db, deps = {}) {
|
|
14
|
+
this.db = db;
|
|
15
|
+
const emb = deps.embeddingProvider ?? resolveEmbeddingProvider();
|
|
16
|
+
const llm = deps.llmProvider ?? resolveLlmProvider();
|
|
17
|
+
this.embedFn =
|
|
18
|
+
deps.embedFn ??
|
|
19
|
+
(emb === "none"
|
|
20
|
+
? undefined
|
|
21
|
+
: async (text) => embedText(text, emb));
|
|
22
|
+
// Extraction is resolved lazily inside the call so search/store work
|
|
23
|
+
// even when no LLM key is configured.
|
|
24
|
+
this.extractFn =
|
|
25
|
+
deps.extractFn ??
|
|
26
|
+
(async (transcript) => extractMemories(transcript, llm));
|
|
27
|
+
}
|
|
28
|
+
get embeddingsEnabled() {
|
|
29
|
+
return this.embedFn !== undefined;
|
|
30
|
+
}
|
|
31
|
+
async maybeEmbed(text) {
|
|
32
|
+
if (!this.embedFn)
|
|
33
|
+
return undefined;
|
|
34
|
+
try {
|
|
35
|
+
return await this.embedFn(text);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
// Degrade to keyword mode rather than failing the write.
|
|
39
|
+
console.error(`Remembra: embedding failed (${err instanceof Error ? err.message : err}); continuing without`);
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async store(input) {
|
|
44
|
+
const parsed = StoreInput.parse(input);
|
|
45
|
+
const embedding = await this.maybeEmbed(parsed.content);
|
|
46
|
+
const memory = await this.db.store(parsed, embedding);
|
|
47
|
+
return {
|
|
48
|
+
id: memory.id,
|
|
49
|
+
message: `Stored ${memory.type} memory ${memory.id} (scope: ${memory.scope})`,
|
|
50
|
+
memory,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async search(q) {
|
|
54
|
+
let queryVec = null;
|
|
55
|
+
if (q.query && this.embedFn)
|
|
56
|
+
queryVec = (await this.maybeEmbed(q.query)) ?? null;
|
|
57
|
+
const results = search(await this.db.all(), q, queryVec);
|
|
58
|
+
const text = results.length === 0
|
|
59
|
+
? "No matching memories."
|
|
60
|
+
: results
|
|
61
|
+
.map((m) => `[${m.id}] ${m.type.toUpperCase()} (scope: ${m.scope}, importance: ${m.importance}, ${m.updatedAt.slice(0, 10)})\n${m.content}`)
|
|
62
|
+
.join("\n\n");
|
|
63
|
+
return { text, results };
|
|
64
|
+
}
|
|
65
|
+
async list(q) {
|
|
66
|
+
let memories = await this.db.all();
|
|
67
|
+
if (q.scope)
|
|
68
|
+
memories = memories.filter((m) => m.scope === q.scope || m.scope === "global");
|
|
69
|
+
if (q.type)
|
|
70
|
+
memories = memories.filter((m) => m.type === q.type);
|
|
71
|
+
memories.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
72
|
+
const text = memories.length === 0
|
|
73
|
+
? "No memories stored yet."
|
|
74
|
+
: memories.map((m) => `[${m.id}] ${m.type} (${m.scope}): ${m.content.split("\n")[0]}`).join("\n");
|
|
75
|
+
return { text, memories };
|
|
76
|
+
}
|
|
77
|
+
async forget(id) {
|
|
78
|
+
const ok = await this.db.forget(id);
|
|
79
|
+
return { ok, text: ok ? `Deleted memory ${id}.` : `No memory with id ${id}.` };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Session digest (v2): extract worth-keeping memories from a transcript
|
|
83
|
+
* and store them, skipping exact duplicates already present.
|
|
84
|
+
*/
|
|
85
|
+
async digest(opts) {
|
|
86
|
+
const extracted = await this.extractFn(opts.transcript);
|
|
87
|
+
const existing = await this.db.all();
|
|
88
|
+
const seen = new Set(existing.map((m) => dedupKey(m.type, m.content, m.scope)));
|
|
89
|
+
const stored = [];
|
|
90
|
+
let skippedDuplicates = 0;
|
|
91
|
+
for (const item of extracted) {
|
|
92
|
+
const scope = item.scope ?? opts.scope ?? "global";
|
|
93
|
+
const key = dedupKey(item.type, item.content, scope);
|
|
94
|
+
if (seen.has(key)) {
|
|
95
|
+
skippedDuplicates++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
seen.add(key);
|
|
99
|
+
const { memory } = await this.store({
|
|
100
|
+
type: item.type,
|
|
101
|
+
content: item.content,
|
|
102
|
+
scope,
|
|
103
|
+
tags: item.tags,
|
|
104
|
+
importance: item.importance,
|
|
105
|
+
source: opts.source,
|
|
106
|
+
});
|
|
107
|
+
stored.push(memory);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
extracted: extracted.length,
|
|
111
|
+
stored,
|
|
112
|
+
skippedDuplicates,
|
|
113
|
+
ids: stored.map((m) => m.id),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Normalized identity for exact-match dedup (v2; LLM merge comes in v3). */
|
|
118
|
+
function dedupKey(type, content, scope) {
|
|
119
|
+
return `${type}|${scope}|${content.toLowerCase().replace(/\s+/g, " ").trim()}`;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export declare class MemoryStore {
|
|
|
14
14
|
constructor(root: string);
|
|
15
15
|
static defaultRoot(): string;
|
|
16
16
|
private fileFor;
|
|
17
|
-
store(input: StoreInput): Promise<Memory>;
|
|
17
|
+
store(input: StoreInput, embedding?: number[]): Promise<Memory>;
|
|
18
18
|
forget(id: string): Promise<boolean>;
|
|
19
19
|
/** Load every memory across all scopes (global + scoped). */
|
|
20
20
|
all(): Promise<Memory[]>;
|
package/dist/store.js
CHANGED
|
@@ -27,7 +27,7 @@ export class MemoryStore {
|
|
|
27
27
|
const safeScope = m.scope.replace(/[^a-zA-Z0-9._/-]/g, "_");
|
|
28
28
|
return path.join(this.root, "scopes", safeScope, `${m.id}.md`);
|
|
29
29
|
}
|
|
30
|
-
async store(input) {
|
|
30
|
+
async store(input, embedding) {
|
|
31
31
|
const now = new Date().toISOString();
|
|
32
32
|
const memory = {
|
|
33
33
|
id: randomUUID().slice(0, 8),
|
|
@@ -39,6 +39,7 @@ export class MemoryStore {
|
|
|
39
39
|
createdAt: now,
|
|
40
40
|
updatedAt: now,
|
|
41
41
|
source: input.source,
|
|
42
|
+
embedding,
|
|
42
43
|
};
|
|
43
44
|
const file = this.fileFor(memory);
|
|
44
45
|
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
@@ -103,6 +104,7 @@ function render(m) {
|
|
|
103
104
|
`created: ${m.createdAt}`,
|
|
104
105
|
`updated: ${m.updatedAt}`,
|
|
105
106
|
m.source ? `source: ${m.source}` : undefined,
|
|
107
|
+
m.embedding && m.embedding.length > 0 ? `embedding: [${m.embedding.join(",")}]` : undefined,
|
|
106
108
|
"---",
|
|
107
109
|
"",
|
|
108
110
|
m.content,
|
|
@@ -124,6 +126,12 @@ async function parse(file) {
|
|
|
124
126
|
meta[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
|
|
125
127
|
}
|
|
126
128
|
const tagsRaw = (meta.tags ?? "[]").replace(/^\[|\]$/g, "");
|
|
129
|
+
let embedding;
|
|
130
|
+
if (meta.embedding) {
|
|
131
|
+
const nums = meta.embedding.replace(/^\[|\]$/g, "").split(",").map(Number);
|
|
132
|
+
if (nums.length > 0 && nums.every((n) => Number.isFinite(n)))
|
|
133
|
+
embedding = nums;
|
|
134
|
+
}
|
|
127
135
|
return {
|
|
128
136
|
id: meta.id ?? path.basename(file, ".md"),
|
|
129
137
|
type: (meta.type ?? "fact"),
|
|
@@ -134,6 +142,7 @@ async function parse(file) {
|
|
|
134
142
|
createdAt: meta.created ?? new Date(0).toISOString(),
|
|
135
143
|
updatedAt: meta.updated ?? meta.created ?? new Date(0).toISOString(),
|
|
136
144
|
source: meta.source,
|
|
145
|
+
embedding,
|
|
137
146
|
};
|
|
138
147
|
}
|
|
139
148
|
catch {
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,MAAM,CAAC,WAAW;QAChB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC;IAEO,OAAO,CAAC,CAAS;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAiB;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface Memory {
|
|
|
18
18
|
createdAt: string;
|
|
19
19
|
updatedAt: string;
|
|
20
20
|
source?: string;
|
|
21
|
+
/** Cached embedding vector (REMEMBRA_EMBEDDINGS≠none); serialized in frontmatter. */
|
|
22
|
+
embedding?: number[];
|
|
21
23
|
}
|
|
22
24
|
export declare const StoreInput: z.ZodObject<{
|
|
23
25
|
type: z.ZodEnum<["fact", "decision", "role", "history"]>;
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6CAA6C;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6CAA6C;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAwB1E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC"}
|