@hilbras/remembra 3.7.0 → 3.8.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 +71 -0
- package/README.md +8 -1
- package/dist/backend.d.ts +12 -0
- package/dist/crypto.d.ts +10 -0
- package/dist/crypto.js +77 -0
- package/dist/crypto.js.map +1 -0
- package/dist/diff.d.ts +15 -0
- package/dist/diff.js +135 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/http.d.ts +3 -0
- package/dist/http.js +25 -0
- package/dist/http.js.map +1 -1
- package/dist/index.js +59 -1
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +2 -0
- package/dist/llm.js +3 -0
- package/dist/llm.js.map +1 -1
- package/dist/metrics.js +4 -0
- package/dist/metrics.js.map +1 -1
- package/dist/redact.d.ts +33 -0
- package/dist/redact.js +104 -0
- package/dist/redact.js.map +1 -0
- package/dist/service.d.ts +59 -0
- package/dist/service.js +169 -4
- package/dist/service.js.map +1 -1
- package/dist/store.d.ts +17 -1
- package/dist/store.js +126 -3
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +74 -0
- package/dist/types.js +30 -0
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/architecture.md +52 -3
- package/docs/chatgpt.md +25 -0
- package/docs/clients.md +3 -0
- package/docs/lifecycle.md +10 -3
- package/docs/memory-model.md +42 -3
- package/docs/observability.md +7 -2
- package/docs/security.md +62 -3
- package/docs/tools.md +48 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/llm.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export interface ExtractedMemory {
|
|
|
14
14
|
importance: number;
|
|
15
15
|
/** Optional scope override; falls back to the digest call's scope. */
|
|
16
16
|
scope?: string;
|
|
17
|
+
/** Optional 0..1 confidence from the extraction LLM (service default: 0.7). */
|
|
18
|
+
confidence?: number;
|
|
17
19
|
}
|
|
18
20
|
export declare function resolveLlmProvider(): LlmProvider;
|
|
19
21
|
export declare function extractMemories(transcript: string, provider?: LlmProvider): Promise<ExtractedMemory[]>;
|
package/dist/llm.js
CHANGED
|
@@ -22,6 +22,7 @@ Rules:
|
|
|
22
22
|
- Write each content as a self-contained statement (no "we discussed" or "earlier").
|
|
23
23
|
- Skip small talk, pleasantries, and anything already obvious from the transcript's task.
|
|
24
24
|
- importance: 5 = critical, 1 = trivia. Default 3.
|
|
25
|
+
- confidence (optional): 0..1 how sure you are the statement is accurate as written.
|
|
25
26
|
- If nothing is worth keeping, return [].
|
|
26
27
|
- Output must be valid JSON parseable directly.`;
|
|
27
28
|
export async function extractMemories(transcript, provider = resolveLlmProvider()) {
|
|
@@ -155,12 +156,14 @@ export function parseExtraction(raw) {
|
|
|
155
156
|
const tags = item.tags;
|
|
156
157
|
const importance = Number(item.importance);
|
|
157
158
|
const scope = item.scope;
|
|
159
|
+
const confidence = Number(item.confidence);
|
|
158
160
|
out.push({
|
|
159
161
|
type,
|
|
160
162
|
content: content.trim(),
|
|
161
163
|
tags: Array.isArray(tags) ? tags.filter((t) => typeof t === "string") : [],
|
|
162
164
|
importance: Number.isFinite(importance) ? Math.min(5, Math.max(1, Math.round(importance))) : 3,
|
|
163
165
|
scope: typeof scope === "string" && scope.trim() ? scope.trim() : undefined,
|
|
166
|
+
confidence: Number.isFinite(confidence) ? Math.min(1, Math.max(0, confidence)) : undefined,
|
|
164
167
|
});
|
|
165
168
|
}
|
|
166
169
|
return out;
|
package/dist/llm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics.js
CHANGED
|
@@ -113,5 +113,9 @@ metrics.counter("remembra_digests_total", "session digest runs");
|
|
|
113
113
|
metrics.counter("remembra_digest_items_total", "Digest items by outcome (stored|skipped|merged)");
|
|
114
114
|
metrics.histogram("remembra_digest_duration_seconds", "Session digest run latency (seconds)");
|
|
115
115
|
metrics.counter("remembra_cache_events_total", "Parse-cache probes by result (hit|miss)");
|
|
116
|
+
metrics.counter("remembra_redactions_total", "PII placeholders written at ingest by kind (3.8.0)");
|
|
117
|
+
metrics.counter("remembra_relate_total", "memory_relate link writes by action (3.8.0)");
|
|
118
|
+
metrics.counter("remembra_history_snapshots_total", "History pre-images written (3.8.0)");
|
|
119
|
+
metrics.counter("remembra_encryption_migrations_total", "Encryption migration files converted by mode (3.8.0)");
|
|
116
120
|
metrics.gauge("remembra_info", "Build info", () => [{ labels: { version: VERSION }, value: 1 }]);
|
|
117
121
|
//# sourceMappingURL=metrics.js.map
|
package/dist/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/redact.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content redaction filter for PII (audit Phase 8).
|
|
3
|
+
*
|
|
4
|
+
* Opt-in: REMEMBRA_REDACT=1|true|yes. Applied at the service ingest layer
|
|
5
|
+
* (memory_store + every digest item/merge) so raw PII never reaches disk,
|
|
6
|
+
* embeddings, or export snapshots.
|
|
7
|
+
*
|
|
8
|
+
* Design notes:
|
|
9
|
+
* - Patterns run most-specific first: cards before phones, prefixes before
|
|
10
|
+
* generic long tokens — each match is replaced by a typed placeholder so
|
|
11
|
+
* downstream text stays readable ("<EMAIL> confirmed the deploy").
|
|
12
|
+
* - Cards must pass the Luhn check — digit soup that is not a valid card
|
|
13
|
+
* number stays untouched (false positives here would be worse than misses).
|
|
14
|
+
* - Phone matching requires separators and 10–15 digits, so dates
|
|
15
|
+
* (2026-09-23 → 8 digits) and versions (3.6.0) never match.
|
|
16
|
+
* - Redaction is IRREVERSIBLE by design: the original bytes are not kept
|
|
17
|
+
* anywhere (including in the LLM-visible transcript only at extraction —
|
|
18
|
+
* see docs/security.md).
|
|
19
|
+
*/
|
|
20
|
+
export type RedactionKind = "email" | "ssn" | "card" | "phone" | "secret";
|
|
21
|
+
export interface RedactionResult {
|
|
22
|
+
text: string;
|
|
23
|
+
counts: Partial<Record<RedactionKind, number>>;
|
|
24
|
+
changed: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function redactionEnabled(): boolean;
|
|
27
|
+
/** Redact PII patterns out of text, returning what was found. */
|
|
28
|
+
export declare function redact(text: string): RedactionResult;
|
|
29
|
+
/** Redact a tag list (tags are short, but emails/secrets do sneak in). */
|
|
30
|
+
export declare function redactTags(tags: string[]): {
|
|
31
|
+
tags: string[];
|
|
32
|
+
counts: Partial<Record<RedactionKind, number>>;
|
|
33
|
+
};
|
package/dist/redact.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content redaction filter for PII (audit Phase 8).
|
|
3
|
+
*
|
|
4
|
+
* Opt-in: REMEMBRA_REDACT=1|true|yes. Applied at the service ingest layer
|
|
5
|
+
* (memory_store + every digest item/merge) so raw PII never reaches disk,
|
|
6
|
+
* embeddings, or export snapshots.
|
|
7
|
+
*
|
|
8
|
+
* Design notes:
|
|
9
|
+
* - Patterns run most-specific first: cards before phones, prefixes before
|
|
10
|
+
* generic long tokens — each match is replaced by a typed placeholder so
|
|
11
|
+
* downstream text stays readable ("<EMAIL> confirmed the deploy").
|
|
12
|
+
* - Cards must pass the Luhn check — digit soup that is not a valid card
|
|
13
|
+
* number stays untouched (false positives here would be worse than misses).
|
|
14
|
+
* - Phone matching requires separators and 10–15 digits, so dates
|
|
15
|
+
* (2026-09-23 → 8 digits) and versions (3.6.0) never match.
|
|
16
|
+
* - Redaction is IRREVERSIBLE by design: the original bytes are not kept
|
|
17
|
+
* anywhere (including in the LLM-visible transcript only at extraction —
|
|
18
|
+
* see docs/security.md).
|
|
19
|
+
*/
|
|
20
|
+
export function redactionEnabled() {
|
|
21
|
+
const v = (process.env.REMEMBRA_REDACT ?? "").toLowerCase();
|
|
22
|
+
return v === "1" || v === "true" || v === "yes";
|
|
23
|
+
}
|
|
24
|
+
/** Luhn mod-10 — rejects digit groups that merely look card-shaped. */
|
|
25
|
+
function luhnOk(digits) {
|
|
26
|
+
let sum = 0;
|
|
27
|
+
let alt = false;
|
|
28
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
29
|
+
let d = digits.charCodeAt(i) - 48;
|
|
30
|
+
if (alt) {
|
|
31
|
+
d *= 2;
|
|
32
|
+
if (d > 9)
|
|
33
|
+
d -= 9;
|
|
34
|
+
}
|
|
35
|
+
sum += d;
|
|
36
|
+
alt = !alt;
|
|
37
|
+
}
|
|
38
|
+
return sum % 10 === 0;
|
|
39
|
+
}
|
|
40
|
+
// Order matters: specific formats first.
|
|
41
|
+
const RULES = [
|
|
42
|
+
{ kind: "email", pattern: /\b[\w.+-]+@[\w-]+(?:\.[\w-]+)+\b/g },
|
|
43
|
+
{ kind: "ssn", pattern: /\b\d{3}-\d{2}-\d{4}\b/g },
|
|
44
|
+
{
|
|
45
|
+
// 13–19 digits, optionally grouped by spaces/dashes: `4111 1111 1111 1111`
|
|
46
|
+
kind: "card",
|
|
47
|
+
pattern: /\b(?:\d[ -]?){12,18}\d\b/g,
|
|
48
|
+
accept: (m) => luhnOk(m.replace(/[ -]/g, "")),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
// Requires separators AND 10–15 total digits (dates/versions excluded).
|
|
52
|
+
// Lookbehind keeps the match at the token start (a leading `+` is not a
|
|
53
|
+
// word boundary); the paren form consumes its own `)`.
|
|
54
|
+
kind: "phone",
|
|
55
|
+
pattern: /(?<=^|\s)(?:\+\d{1,3}[ .-]?)?(?:\(\d{2,4}\)[ .-]?|\d{2,4}[ .-])\d{3,4}[ .-]\d{3,4}\b/g,
|
|
56
|
+
accept: (m) => {
|
|
57
|
+
const digits = m.replace(/\D/g, "").length;
|
|
58
|
+
return digits >= 10 && digits <= 15;
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
// Provider token shapes: OpenAI sk-..., GitHub ghp_/gho_/github_pat-, AWS AKIA…,
|
|
62
|
+
// Slack xoxb-, GitLab glpat-, generic <prefix><32+ chars>.
|
|
63
|
+
{
|
|
64
|
+
kind: "secret",
|
|
65
|
+
pattern: /\b(?:sk|pk|rk|ghp|gho|ghs|xoxb|xoxp|glpat)[-_][A-Za-z0-9_-]{16,}\b|\bAKIA[0-9A-Z]{16}\b|\bghu_[A-Za-z0-9]{20,}\b|github_pat_[A-Za-z0-9_]{20,}\b/g,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
// High-entropy blob: 40+ unbroken base64/hex-ish chars (keys, hashes).
|
|
69
|
+
// UUIDs are 36 chars with dashes; English words never reach 40.
|
|
70
|
+
kind: "secret",
|
|
71
|
+
pattern: /\b[A-Za-z0-9+/_-]{40,}\b/g,
|
|
72
|
+
accept: (m) => !/^[\w-]+$/.test(m) || /[0-9]/.test(m), // require a digit: skips megawords
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
/** Redact PII patterns out of text, returning what was found. */
|
|
76
|
+
export function redact(text) {
|
|
77
|
+
const counts = {};
|
|
78
|
+
let out = text;
|
|
79
|
+
for (const rule of RULES) {
|
|
80
|
+
out = out.replace(rule.pattern, (match) => {
|
|
81
|
+
if (rule.accept && !rule.accept(match))
|
|
82
|
+
return match;
|
|
83
|
+
counts[rule.kind] = (counts[rule.kind] ?? 0) + 1;
|
|
84
|
+
return `<${rule.kind.toUpperCase()}>`;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return { text: out, counts, changed: Object.keys(counts).length > 0 };
|
|
88
|
+
}
|
|
89
|
+
/** Redact a tag list (tags are short, but emails/secrets do sneak in). */
|
|
90
|
+
export function redactTags(tags) {
|
|
91
|
+
const merged = {};
|
|
92
|
+
let changed = false;
|
|
93
|
+
const out = tags.map((t) => {
|
|
94
|
+
const r = redact(t);
|
|
95
|
+
for (const [k, v] of Object.entries(r.counts)) {
|
|
96
|
+
merged[k] = (merged[k] ?? 0) + v;
|
|
97
|
+
}
|
|
98
|
+
if (r.changed)
|
|
99
|
+
changed = true;
|
|
100
|
+
return r.text;
|
|
101
|
+
});
|
|
102
|
+
return { tags: out, counts: changed ? merged : {} };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}
|
package/dist/service.d.ts
CHANGED
|
@@ -38,6 +38,8 @@ interface ServiceDeps {
|
|
|
38
38
|
archiveAfterDays?: number;
|
|
39
39
|
/** Archived memory older than this gets auto-deleted. Default 365. */
|
|
40
40
|
archiveTtlDays?: number;
|
|
41
|
+
/** Force the PII redaction filter on/off (default: REMEMBRA_REDACT env). */
|
|
42
|
+
redact?: boolean;
|
|
41
43
|
}
|
|
42
44
|
/**
|
|
43
45
|
* Transport-agnostic handlers. Both the MCP tools and the HTTP API
|
|
@@ -51,6 +53,7 @@ export declare class MemoryService {
|
|
|
51
53
|
private readonly decayIntervalMs;
|
|
52
54
|
private readonly archiveAfterDays;
|
|
53
55
|
private readonly archiveTtlDays;
|
|
56
|
+
private readonly redactOn;
|
|
54
57
|
private lastDecayRun;
|
|
55
58
|
private decayRunning;
|
|
56
59
|
constructor(db: MemoryBackend, deps?: ServiceDeps);
|
|
@@ -89,6 +92,62 @@ export declare class MemoryService {
|
|
|
89
92
|
ok: boolean;
|
|
90
93
|
text: string;
|
|
91
94
|
}>;
|
|
95
|
+
/** Fetch one memory with its links resolved (audit Phase 8: graph view). */
|
|
96
|
+
get(id: string): Promise<{
|
|
97
|
+
memory: Memory;
|
|
98
|
+
related: ({
|
|
99
|
+
id: string;
|
|
100
|
+
type: "fact" | "decision" | "role" | "history";
|
|
101
|
+
scope: string;
|
|
102
|
+
content: string;
|
|
103
|
+
} | {
|
|
104
|
+
id: string;
|
|
105
|
+
missing: true;
|
|
106
|
+
})[];
|
|
107
|
+
backlinks: {
|
|
108
|
+
id: string;
|
|
109
|
+
type: "fact" | "decision" | "role" | "history";
|
|
110
|
+
scope: string;
|
|
111
|
+
content: string;
|
|
112
|
+
}[];
|
|
113
|
+
text: string;
|
|
114
|
+
}>;
|
|
115
|
+
/**
|
|
116
|
+
* Manage directed links between memories (audit Phase 8: relationship
|
|
117
|
+
* graph). Targets are validated on add; backlinks are derived at read
|
|
118
|
+
* time, so one write keeps the edge consistent.
|
|
119
|
+
*/
|
|
120
|
+
relate(input: unknown): Promise<{
|
|
121
|
+
id: string;
|
|
122
|
+
related: string[];
|
|
123
|
+
added: string[];
|
|
124
|
+
removed: string[];
|
|
125
|
+
text: string;
|
|
126
|
+
}>;
|
|
127
|
+
/**
|
|
128
|
+
* Version history with line diffs (audit Phase 8: diff/history view).
|
|
129
|
+
* Newest first; each past version carries a unified diff against its
|
|
130
|
+
* predecessor (the current version diffs against the newest snapshot).
|
|
131
|
+
*/
|
|
132
|
+
history(input: unknown): Promise<{
|
|
133
|
+
id: string;
|
|
134
|
+
versions: {
|
|
135
|
+
current?: true;
|
|
136
|
+
file?: string;
|
|
137
|
+
at?: string;
|
|
138
|
+
snapshotAt?: string;
|
|
139
|
+
content: string;
|
|
140
|
+
diff: string;
|
|
141
|
+
}[];
|
|
142
|
+
text: string;
|
|
143
|
+
}>;
|
|
144
|
+
/**
|
|
145
|
+
* Redact a content+tags pair, emitting metrics + a log event when anything
|
|
146
|
+
* was found. Returns null when disabled or clean (callers keep originals).
|
|
147
|
+
*/
|
|
148
|
+
private redactPair;
|
|
149
|
+
/** PII redaction of a store input (audit Phase 8). */
|
|
150
|
+
private applyRedaction;
|
|
92
151
|
/** Readiness probe (audit Phase 7): can the backend actually be read? */
|
|
93
152
|
health(): Promise<{
|
|
94
153
|
status: "ok" | "unready";
|
package/dist/service.js
CHANGED
|
@@ -6,6 +6,9 @@ import { logEvent } from "./log.js";
|
|
|
6
6
|
import { metrics } from "./metrics.js";
|
|
7
7
|
import { VERSION } from "./version.js";
|
|
8
8
|
import { performance } from "node:perf_hooks";
|
|
9
|
+
import { redact, redactTags, redactionEnabled } from "./redact.js";
|
|
10
|
+
import { unifiedDiff } from "./diff.js";
|
|
11
|
+
import { RelateInput, HistoryInput } from "./types.js";
|
|
9
12
|
import { resolveLlmProvider, extractMemories, resolveMerge, } from "./llm.js";
|
|
10
13
|
/**
|
|
11
14
|
* Transport-agnostic handlers. Both the MCP tools and the HTTP API
|
|
@@ -19,6 +22,7 @@ export class MemoryService {
|
|
|
19
22
|
decayIntervalMs;
|
|
20
23
|
archiveAfterDays;
|
|
21
24
|
archiveTtlDays;
|
|
25
|
+
redactOn;
|
|
22
26
|
lastDecayRun = 0;
|
|
23
27
|
decayRunning = false;
|
|
24
28
|
constructor(db, deps = {}) {
|
|
@@ -33,6 +37,7 @@ export class MemoryService {
|
|
|
33
37
|
this.decayIntervalMs = deps.decayIntervalMs ?? 3_600_000; // 1h
|
|
34
38
|
this.archiveAfterDays = deps.archiveAfterDays ?? Number(process.env.REMEMBRA_ARCHIVE_AFTER_DAYS ?? 90);
|
|
35
39
|
this.archiveTtlDays = deps.archiveTtlDays ?? Number(process.env.REMEMBRA_ARCHIVE_TTL_DAYS ?? 365);
|
|
40
|
+
this.redactOn = deps.redact ?? redactionEnabled();
|
|
36
41
|
}
|
|
37
42
|
get embeddingsEnabled() {
|
|
38
43
|
return this.embedFn !== undefined;
|
|
@@ -57,6 +62,10 @@ export class MemoryService {
|
|
|
57
62
|
catch (err) {
|
|
58
63
|
throw inputError(err, "INVALID_INPUT");
|
|
59
64
|
}
|
|
65
|
+
// PII redaction (audit Phase 8, opt-in REMEMBRA_REDACT): before embed,
|
|
66
|
+
// before disk, before export — raw patterns never leave this process.
|
|
67
|
+
if (this.redactOn)
|
|
68
|
+
parsed = this.applyRedaction(parsed);
|
|
60
69
|
const embedding = await this.maybeEmbed(parsed.content);
|
|
61
70
|
const memory = await this.db.store(parsed, embedding, {
|
|
62
71
|
provenance: opts?.provenance ?? "explicit",
|
|
@@ -136,6 +145,151 @@ export class MemoryService {
|
|
|
136
145
|
const ok = await this.db.forget(id);
|
|
137
146
|
return { ok, text: ok ? `Deleted memory ${id}.` : `No memory with id ${id}.` };
|
|
138
147
|
}
|
|
148
|
+
/** Fetch one memory with its links resolved (audit Phase 8: graph view). */
|
|
149
|
+
async get(id) {
|
|
150
|
+
const memory = await this.db.get(id);
|
|
151
|
+
if (!memory)
|
|
152
|
+
throw new RemembraError("NOT_FOUND", `No memory with id ${id}`);
|
|
153
|
+
const all = await this.db.all(true);
|
|
154
|
+
const brief = (m) => ({
|
|
155
|
+
id: m.id,
|
|
156
|
+
type: m.type,
|
|
157
|
+
scope: m.scope,
|
|
158
|
+
content: m.content.split("\n")[0],
|
|
159
|
+
});
|
|
160
|
+
const related = (memory.related ?? []).map((rid) => {
|
|
161
|
+
const target = all.find((m) => m.id === rid);
|
|
162
|
+
return target ? brief(target) : { id: rid, missing: true };
|
|
163
|
+
});
|
|
164
|
+
const backlinks = all.filter((m) => m.id !== id && (m.related ?? []).includes(id)).map(brief);
|
|
165
|
+
const meta = `${memory.type} (scope: ${memory.scope}, importance: ${memory.importance}` +
|
|
166
|
+
`${memory.confidence !== undefined ? `, confidence: ${memory.confidence}` : ""})`;
|
|
167
|
+
const text = `[${memory.id}] ${meta}\n${memory.content}` +
|
|
168
|
+
(related.length ? `\n\nRelated: ${related.map((r) => r.id).join(", ")}` : "") +
|
|
169
|
+
(backlinks.length ? `\nReferenced by: ${backlinks.map((b) => b.id).join(", ")}` : "");
|
|
170
|
+
return { memory, related, backlinks, text };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Manage directed links between memories (audit Phase 8: relationship
|
|
174
|
+
* graph). Targets are validated on add; backlinks are derived at read
|
|
175
|
+
* time, so one write keeps the edge consistent.
|
|
176
|
+
*/
|
|
177
|
+
async relate(input) {
|
|
178
|
+
let parsed;
|
|
179
|
+
try {
|
|
180
|
+
parsed = RelateInput.parse(input);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
throw inputError(err, "INVALID_INPUT");
|
|
184
|
+
}
|
|
185
|
+
const memory = await this.db.get(parsed.id);
|
|
186
|
+
if (!memory)
|
|
187
|
+
throw new RemembraError("NOT_FOUND", `No memory with id ${parsed.id}`);
|
|
188
|
+
if (parsed.related.includes(parsed.id)) {
|
|
189
|
+
throw new RemembraError("INVALID_INPUT", "a memory cannot be related to itself");
|
|
190
|
+
}
|
|
191
|
+
if (parsed.action === "add") {
|
|
192
|
+
const missing = [];
|
|
193
|
+
for (const rid of parsed.related) {
|
|
194
|
+
if (!(await this.db.get(rid)))
|
|
195
|
+
missing.push(rid);
|
|
196
|
+
}
|
|
197
|
+
if (missing.length > 0) {
|
|
198
|
+
throw new RemembraError("NOT_FOUND", `related target(s) not found: ${missing.join(", ")}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const current = memory.related ?? [];
|
|
202
|
+
const added = parsed.action === "add" ? parsed.related.filter((r) => !current.includes(r)) : [];
|
|
203
|
+
const removed = parsed.action === "remove" ? current.filter((r) => parsed.related.includes(r)) : [];
|
|
204
|
+
let next = parsed.action === "add" ? [...current, ...added] : current.filter((r) => !parsed.related.includes(r));
|
|
205
|
+
if (added.length === 0 && removed.length === 0) {
|
|
206
|
+
next = current; // no-op: don't churn updatedAt for an idempotent call
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
await this.db.update({ ...memory, related: next });
|
|
210
|
+
metrics.inc("remembra_relate_total", { action: parsed.action });
|
|
211
|
+
}
|
|
212
|
+
const verb = parsed.action === "add" ? "Linked" : "Unlinked";
|
|
213
|
+
const changed = parsed.action === "add" ? added : removed;
|
|
214
|
+
const text = changed.length > 0
|
|
215
|
+
? `${verb} ${parsed.id} ${parsed.action === "add" ? "→" : "⇁"} ${changed.join(", ")}`
|
|
216
|
+
: `No change: ${parsed.id} links unchanged (${next.length} total)`;
|
|
217
|
+
return { id: parsed.id, related: next, added, removed, text };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Version history with line diffs (audit Phase 8: diff/history view).
|
|
221
|
+
* Newest first; each past version carries a unified diff against its
|
|
222
|
+
* predecessor (the current version diffs against the newest snapshot).
|
|
223
|
+
*/
|
|
224
|
+
async history(input) {
|
|
225
|
+
let parsed;
|
|
226
|
+
try {
|
|
227
|
+
parsed = HistoryInput.parse(input);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
throw inputError(err, "INVALID_INPUT");
|
|
231
|
+
}
|
|
232
|
+
const memory = await this.db.get(parsed.id);
|
|
233
|
+
if (!memory)
|
|
234
|
+
throw new RemembraError("NOT_FOUND", `No memory with id ${parsed.id}`);
|
|
235
|
+
const entries = (await this.db.history?.(parsed.id)) ?? [];
|
|
236
|
+
const kept = entries.slice(0, parsed.limit ?? entries.length);
|
|
237
|
+
const chain = [
|
|
238
|
+
{ base: { current: true, at: memory.updatedAt }, content: memory.content },
|
|
239
|
+
...kept.map((e) => ({
|
|
240
|
+
base: { file: e.file, at: e.at, snapshotAt: e.snapshotAt },
|
|
241
|
+
content: e.content,
|
|
242
|
+
})),
|
|
243
|
+
];
|
|
244
|
+
const versions = chain.map((v, i) => {
|
|
245
|
+
const older = chain[i + 1];
|
|
246
|
+
const diff = older
|
|
247
|
+
? unifiedDiff(older.content, v.content, older.base.at ?? "older", v.base.at ?? "current")
|
|
248
|
+
: "";
|
|
249
|
+
return { ...v.base, content: v.content, diff };
|
|
250
|
+
});
|
|
251
|
+
const lines = [`History for ${parsed.id} — ${versions.length} version(s), newest first:`];
|
|
252
|
+
for (const v of versions) {
|
|
253
|
+
const label = v.current
|
|
254
|
+
? "current"
|
|
255
|
+
: `superseded ${v.snapshotAt?.slice(0, 19) ?? "?"} (was current: ${v.at?.slice(0, 19) ?? "?"})`;
|
|
256
|
+
lines.push("", `# ${label} — ${v.content.split("\n")[0]}`);
|
|
257
|
+
if (v.diff)
|
|
258
|
+
lines.push(v.diff.trimEnd());
|
|
259
|
+
}
|
|
260
|
+
return { id: parsed.id, versions, text: lines.join("\n") };
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Redact a content+tags pair, emitting metrics + a log event when anything
|
|
264
|
+
* was found. Returns null when disabled or clean (callers keep originals).
|
|
265
|
+
*/
|
|
266
|
+
redactPair(content, tags) {
|
|
267
|
+
if (!this.redactOn)
|
|
268
|
+
return null;
|
|
269
|
+
const c = redact(content);
|
|
270
|
+
const t = redactTags(tags);
|
|
271
|
+
const counts = {};
|
|
272
|
+
for (const [k, v] of Object.entries(c.counts))
|
|
273
|
+
counts[k] = v;
|
|
274
|
+
for (const [k, v] of Object.entries(t.counts)) {
|
|
275
|
+
counts[k] = (counts[k] ?? 0) + v;
|
|
276
|
+
}
|
|
277
|
+
if (Object.keys(counts).length === 0)
|
|
278
|
+
return null;
|
|
279
|
+
for (const [kind, n] of Object.entries(counts)) {
|
|
280
|
+
if (n)
|
|
281
|
+
metrics.inc("remembra_redactions_total", { kind }, n);
|
|
282
|
+
}
|
|
283
|
+
logEvent("info", "redacted", { ...counts }, `Remembra: redacted PII at ingest (${JSON.stringify(counts)})`);
|
|
284
|
+
return { content: c.text, tags: t.tags };
|
|
285
|
+
}
|
|
286
|
+
/** PII redaction of a store input (audit Phase 8). */
|
|
287
|
+
applyRedaction(parsed) {
|
|
288
|
+
const clean = this.redactPair(parsed.content, parsed.tags);
|
|
289
|
+
if (!clean)
|
|
290
|
+
return parsed;
|
|
291
|
+
return { ...parsed, content: clean.content, tags: clean.tags };
|
|
292
|
+
}
|
|
139
293
|
/** Readiness probe (audit Phase 7): can the backend actually be read? */
|
|
140
294
|
async health() {
|
|
141
295
|
let storage = "ok";
|
|
@@ -201,7 +355,13 @@ export class MemoryService {
|
|
|
201
355
|
const stored = [];
|
|
202
356
|
let skippedDuplicates = 0;
|
|
203
357
|
let merged = 0;
|
|
204
|
-
for (const
|
|
358
|
+
for (const extractedItem of extracted) {
|
|
359
|
+
// PII redaction at the digest boundary: extraction LLM sees the raw
|
|
360
|
+
// transcript (it must, to understand it) — storage never does.
|
|
361
|
+
const clean = this.redactPair(extractedItem.content, extractedItem.tags);
|
|
362
|
+
const item = clean
|
|
363
|
+
? { ...extractedItem, content: clean.content, tags: clean.tags }
|
|
364
|
+
: extractedItem;
|
|
205
365
|
const scope = item.scope ?? opts.scope ?? "global";
|
|
206
366
|
const key = dedupKey(item.type, item.content, scope);
|
|
207
367
|
// Exact duplicate → skip (or revive if it had decayed).
|
|
@@ -260,13 +420,17 @@ export class MemoryService {
|
|
|
260
420
|
if (decision.action === "merge") {
|
|
261
421
|
const now = new Date().toISOString().slice(0, 10);
|
|
262
422
|
const old = candidate.content.split("\n")[0];
|
|
263
|
-
const
|
|
264
|
-
|
|
423
|
+
const cleanMerged = this.redactPair(decision.content, []) ?? {
|
|
424
|
+
content: decision.content,
|
|
425
|
+
tags: [],
|
|
426
|
+
};
|
|
427
|
+
const content = `${cleanMerged.content}\n\n> superseded (${now}): ${old}`;
|
|
428
|
+
const embedding = await this.maybeEmbed(cleanMerged.content);
|
|
265
429
|
await this.db.update({ ...candidate, content, embedding, source: opts.source ?? candidate.source });
|
|
266
430
|
merged++;
|
|
267
431
|
// Re-index dedup set against the new content.
|
|
268
432
|
seen.delete(dedupKey(candidate.type, candidate.content, candidate.scope));
|
|
269
|
-
seen.add(dedupKey(candidate.type,
|
|
433
|
+
seen.add(dedupKey(candidate.type, cleanMerged.content, candidate.scope));
|
|
270
434
|
continue;
|
|
271
435
|
}
|
|
272
436
|
// action: "store" → fall through and store fresh
|
|
@@ -279,6 +443,7 @@ export class MemoryService {
|
|
|
279
443
|
tags: item.tags,
|
|
280
444
|
importance: item.importance,
|
|
281
445
|
source: opts.source,
|
|
446
|
+
confidence: item.confidence,
|
|
282
447
|
}, { provenance: "auto" });
|
|
283
448
|
stored.push(memory);
|
|
284
449
|
active.push(memory); // so later items in this batch dedup against it
|