@windagency/valora-plugin-memory-vault 1.0.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.
Potentially problematic release.
This version of @windagency/valora-plugin-memory-vault might be problematic. Click here for more details.
- package/dist/config-schema.d.ts +134 -0
- package/dist/config-schema.d.ts.map +1 -0
- package/dist/config-schema.js +61 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/consolidation/cluster.d.ts +17 -0
- package/dist/consolidation/cluster.d.ts.map +1 -0
- package/dist/consolidation/cluster.js +59 -0
- package/dist/consolidation/cluster.js.map +1 -0
- package/dist/consolidation-service.d.ts +75 -0
- package/dist/consolidation-service.d.ts.map +1 -0
- package/dist/consolidation-service.js +373 -0
- package/dist/consolidation-service.js.map +1 -0
- package/dist/constants.d.ts +30 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +30 -0
- package/dist/constants.js.map +1 -0
- package/dist/decay.d.ts +51 -0
- package/dist/decay.d.ts.map +1 -0
- package/dist/decay.js +59 -0
- package/dist/decay.js.map +1 -0
- package/dist/embeddings/embedder.port.d.ts +9 -0
- package/dist/embeddings/embedder.port.d.ts.map +1 -0
- package/dist/embeddings/embedder.port.js +2 -0
- package/dist/embeddings/embedder.port.js.map +1 -0
- package/dist/embeddings/llm-provider-embedder.d.ts +26 -0
- package/dist/embeddings/llm-provider-embedder.d.ts.map +1 -0
- package/dist/embeddings/llm-provider-embedder.js +34 -0
- package/dist/embeddings/llm-provider-embedder.js.map +1 -0
- package/dist/embeddings/resolve-embedder.d.ts +27 -0
- package/dist/embeddings/resolve-embedder.d.ts.map +1 -0
- package/dist/embeddings/resolve-embedder.js +38 -0
- package/dist/embeddings/resolve-embedder.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +35 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +174 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/extraction-service.d.ts +33 -0
- package/dist/extraction-service.d.ts.map +1 -0
- package/dist/extraction-service.js +168 -0
- package/dist/extraction-service.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6498 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +62 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +377 -0
- package/dist/manager.js.map +1 -0
- package/dist/migration/auto-migrate.d.ts +20 -0
- package/dist/migration/auto-migrate.d.ts.map +1 -0
- package/dist/migration/auto-migrate.js +49 -0
- package/dist/migration/auto-migrate.js.map +1 -0
- package/dist/migration/json-to-vault.d.ts +10 -0
- package/dist/migration/json-to-vault.d.ts.map +1 -0
- package/dist/migration/json-to-vault.js +88 -0
- package/dist/migration/json-to-vault.js.map +1 -0
- package/dist/migration/vault-version.d.ts +4 -0
- package/dist/migration/vault-version.d.ts.map +1 -0
- package/dist/migration/vault-version.js +19 -0
- package/dist/migration/vault-version.js.map +1 -0
- package/dist/retrieval/cosine-ann.d.ts +13 -0
- package/dist/retrieval/cosine-ann.d.ts.map +1 -0
- package/dist/retrieval/cosine-ann.js +26 -0
- package/dist/retrieval/cosine-ann.js.map +1 -0
- package/dist/retrieval/spreading-activation.d.ts +12 -0
- package/dist/retrieval/spreading-activation.d.ts.map +1 -0
- package/dist/retrieval/spreading-activation.js +70 -0
- package/dist/retrieval/spreading-activation.js.map +1 -0
- package/dist/store.d.ts +38 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +192 -0
- package/dist/store.js.map +1 -0
- package/dist/vault/default-vault-dir.d.ts +17 -0
- package/dist/vault/default-vault-dir.d.ts.map +1 -0
- package/dist/vault/default-vault-dir.js +23 -0
- package/dist/vault/default-vault-dir.js.map +1 -0
- package/dist/vault/file-format.d.ts +44 -0
- package/dist/vault/file-format.d.ts.map +1 -0
- package/dist/vault/file-format.js +214 -0
- package/dist/vault/file-format.js.map +1 -0
- package/dist/vault/vault-index.d.ts +28 -0
- package/dist/vault/vault-index.d.ts.map +1 -0
- package/dist/vault/vault-index.js +98 -0
- package/dist/vault/vault-index.js.map +1 -0
- package/dist/vault/vault-store.d.ts +75 -0
- package/dist/vault/vault-store.d.ts.map +1 -0
- package/dist/vault/vault-store.js +369 -0
- package/dist/vault/vault-store.js.map +1 -0
- package/dist/vault-memory-provider.d.ts +53 -0
- package/dist/vault-memory-provider.d.ts.map +1 -0
- package/dist/vault-memory-provider.js +139 -0
- package/dist/vault-memory-provider.js.map +1 -0
- package/package.json +58 -0
- package/valora-plugin.json +10 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdirSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
export function computeContentHash(content) {
|
|
5
|
+
return createHash('sha256').update(content).digest('hex');
|
|
6
|
+
}
|
|
7
|
+
// Matches [[targetId]] and [[targetId|kind]] — used with String.matchAll. The /g
|
|
8
|
+
// flag makes this regex stateful across direct .test() calls, so callers that
|
|
9
|
+
// need a per-call boolean check must use LINK_LINE_RE below instead. The alias
|
|
10
|
+
// group permits zero-or-more chars so a malformed `[[id|]]` (empty alias) still
|
|
11
|
+
// matches and falls through to the default `related` kind, rather than producing
|
|
12
|
+
// no link at all.
|
|
13
|
+
const LINK_RE = /\[\[([^\]|]+?)(?:\|([^\]]*))?\]\]/g;
|
|
14
|
+
const KNOWN_EDGE_KINDS = new Set(['co_accessed', 'decays_from', 'related', 'supersedes']);
|
|
15
|
+
// Stateless line-level matcher for `extractContent`: matches a line that
|
|
16
|
+
// consists solely of one [[id|kind]] wikilink (with optional surrounding
|
|
17
|
+
// whitespace). No /g flag — safe to call repeatedly.
|
|
18
|
+
const LINK_LINE_RE = /^\s*\[\[[^\]|]+?(?:\|[^\]]+?)?\]\]\s*$/;
|
|
19
|
+
const FRONTMATTER_CLOSE_MARKER = '\n---\n';
|
|
20
|
+
/**
|
|
21
|
+
* Parse `[[id|kind]]` and `[[id]]` wikilinks from a Markdown body.
|
|
22
|
+
*
|
|
23
|
+
* The alias position serves a dual purpose: Obsidian renders it as the link's
|
|
24
|
+
* display text, and Valora parses it as a typed `EdgeKind`. Because users can
|
|
25
|
+
* edit the alias in Obsidian — e.g. changing `[[abc|related]]` to a more
|
|
26
|
+
* readable `[[abc|see also]]` — the parser cannot trust unknown values. Aliases
|
|
27
|
+
* outside the {@link EdgeKind} enum default to `related` rather than being cast
|
|
28
|
+
* blindly into the type system, where they would silently corrupt the in-memory
|
|
29
|
+
* adjacency index.
|
|
30
|
+
*/
|
|
31
|
+
export function parseVaultLinks(fromId, body) {
|
|
32
|
+
const edges = [];
|
|
33
|
+
for (const match of body.matchAll(LINK_RE)) {
|
|
34
|
+
const toId = match[1]?.trim();
|
|
35
|
+
const kindRaw = match[2]?.trim();
|
|
36
|
+
if (!toId) continue;
|
|
37
|
+
const kind = kindRaw && KNOWN_EDGE_KINDS.has(kindRaw) ? kindRaw : 'related';
|
|
38
|
+
edges.push({ fromId, kind, toId });
|
|
39
|
+
}
|
|
40
|
+
return edges;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse a memory vault Markdown file into an entry and its outgoing edges.
|
|
44
|
+
* The `id` parameter is the file's ID (used to populate edge `fromId`).
|
|
45
|
+
*/
|
|
46
|
+
export function parseMemoryFile(content, id) {
|
|
47
|
+
if (!content.startsWith('---\n')) return { entry: emptyEntry(id), links: [] };
|
|
48
|
+
const closeIdx = content.indexOf(FRONTMATTER_CLOSE_MARKER, 4);
|
|
49
|
+
if (closeIdx === -1) return { entry: emptyEntry(id), links: [] };
|
|
50
|
+
const fm = parseFrontmatter(content.slice(4, closeIdx));
|
|
51
|
+
const bodyRaw = content.slice(closeIdx + FRONTMATTER_CLOSE_MARKER.length);
|
|
52
|
+
return { entry: buildEntry(fm, id, bodyRaw), links: parseVaultLinks(id, bodyRaw) };
|
|
53
|
+
}
|
|
54
|
+
function buildEntry(fm, id, bodyRaw) {
|
|
55
|
+
const now = new Date().toISOString();
|
|
56
|
+
const content = extractContent(bodyRaw);
|
|
57
|
+
const persistedHash = fm['content_hash'];
|
|
58
|
+
const actualHash = computeContentHash(content);
|
|
59
|
+
// Drift is only meaningful when the file actually carried a hash. Legacy
|
|
60
|
+
// pre-hash files leave the entry unflagged (we cannot verify what we never
|
|
61
|
+
// stamped). Round-trips through serialiseMemoryFile always re-stamp.
|
|
62
|
+
const embeddingStale = persistedHash !== undefined && persistedHash !== actualHash ? true : undefined;
|
|
63
|
+
return {
|
|
64
|
+
accessCount: fmNum(fm, 'access_count', 0),
|
|
65
|
+
agentRole: fmStr(fm, 'agent_role', ''),
|
|
66
|
+
category: fmStr(fm, 'category', 'episodic'),
|
|
67
|
+
coAccess: fm['co_access'],
|
|
68
|
+
confidence: fmStr(fm, 'confidence', 'observed'),
|
|
69
|
+
content,
|
|
70
|
+
contentHash: persistedHash,
|
|
71
|
+
createdAt: fmStr(fm, 'created_at', now),
|
|
72
|
+
embeddingDim: fm['embedding_dim'],
|
|
73
|
+
embeddingModel: fm['embedding_model'],
|
|
74
|
+
embeddingStale,
|
|
75
|
+
halfLifeDays: fmNum(fm, 'half_life_days', 7),
|
|
76
|
+
id: fmStr(fm, 'id', id),
|
|
77
|
+
isError: fmBool(fm, 'is_error', false),
|
|
78
|
+
lastAccessedAt: fmStr(fm, 'last_accessed_at', now),
|
|
79
|
+
relatedPaths: fm['related_paths'] ?? [],
|
|
80
|
+
sessionId: fmStr(fm, 'session_id', ''),
|
|
81
|
+
source: fm['source'] ?? { command: '' },
|
|
82
|
+
supersededBy: fm['superseded_by'],
|
|
83
|
+
supersedes: fm['supersedes'],
|
|
84
|
+
tags: fm['tags'] ?? [],
|
|
85
|
+
updatedAt: fmStr(fm, 'updated_at', now)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function fmBool(fm, key, fallback) {
|
|
89
|
+
return fm[key] ?? fallback;
|
|
90
|
+
}
|
|
91
|
+
function fmNum(fm, key, fallback) {
|
|
92
|
+
return fm[key] ?? fallback;
|
|
93
|
+
}
|
|
94
|
+
function fmStr(fm, key, fallback) {
|
|
95
|
+
return fm[key] ?? fallback;
|
|
96
|
+
}
|
|
97
|
+
/** Serialise a memory entry + outgoing edges into vault Markdown format. */
|
|
98
|
+
export function serialiseMemoryFile(entry, links) {
|
|
99
|
+
// Always stamp a fresh content_hash matching the body being written. Any
|
|
100
|
+
// `entry.contentHash` provided by the caller is intentionally ignored — the
|
|
101
|
+
// on-disk hash is the truth of "what content was stored", and downstream
|
|
102
|
+
// drift detection compares that hash to the actual body on the next read.
|
|
103
|
+
const fm = {
|
|
104
|
+
access_count: entry.accessCount,
|
|
105
|
+
agent_role: entry.agentRole,
|
|
106
|
+
category: entry.category,
|
|
107
|
+
co_access: entry.coAccess,
|
|
108
|
+
confidence: entry.confidence,
|
|
109
|
+
content_hash: computeContentHash(entry.content),
|
|
110
|
+
created_at: entry.createdAt,
|
|
111
|
+
embedding_dim: entry.embeddingDim,
|
|
112
|
+
embedding_model: entry.embeddingModel,
|
|
113
|
+
half_life_days: entry.halfLifeDays,
|
|
114
|
+
id: entry.id,
|
|
115
|
+
is_error: entry.isError,
|
|
116
|
+
last_accessed_at: entry.lastAccessedAt,
|
|
117
|
+
related_paths: entry.relatedPaths,
|
|
118
|
+
session_id: entry.sessionId,
|
|
119
|
+
source: entry.source,
|
|
120
|
+
tags: entry.tags,
|
|
121
|
+
updated_at: entry.updatedAt
|
|
122
|
+
};
|
|
123
|
+
if (entry.supersedes !== undefined) fm['supersedes'] = entry.supersedes;
|
|
124
|
+
if (entry.supersededBy !== undefined) fm['superseded_by'] = entry.supersededBy;
|
|
125
|
+
const frontmatter = serialiseFrontmatter(fm);
|
|
126
|
+
const linkLines = links.map((e) => `[[${e.toId}|${e.kind}]]`).join('\n');
|
|
127
|
+
const body = linkLines ? `${entry.content}\n\n${linkLines}` : entry.content;
|
|
128
|
+
return `---\n${frontmatter}\n---\n\n${body}\n`;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build a `.tmp` sibling path that is unique per writer. Combining the process
|
|
132
|
+
* PID with a monotonic counter prevents two writers (e.g. CLI + pipeline) from
|
|
133
|
+
* trampling each other's tmp file before either has run `renameSync`.
|
|
134
|
+
*/
|
|
135
|
+
let tmpCounter = 0;
|
|
136
|
+
function buildTmpPath(filePath) {
|
|
137
|
+
tmpCounter += 1;
|
|
138
|
+
return `${filePath}.${process.pid}.${tmpCounter}.tmp`;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Write content to a file atomically: write to a unique `.tmp` sibling first,
|
|
142
|
+
* then rename. Creates parent directories as needed. The tmp filename includes
|
|
143
|
+
* the writing process PID and a counter so concurrent writers never collide
|
|
144
|
+
* on the staging file.
|
|
145
|
+
*/
|
|
146
|
+
export function atomicWriteFile(filePath, content) {
|
|
147
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
148
|
+
const tmpPath = buildTmpPath(filePath);
|
|
149
|
+
writeFileSync(tmpPath, content, 'utf-8');
|
|
150
|
+
renameSync(tmpPath, filePath);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Write a Buffer (binary payload) atomically via tmp+rename. Counterpart to
|
|
154
|
+
* `atomicWriteFile` for non-text data such as packed embedding vectors.
|
|
155
|
+
*/
|
|
156
|
+
export function atomicWriteBuffer(filePath, data) {
|
|
157
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
158
|
+
const tmpPath = buildTmpPath(filePath);
|
|
159
|
+
writeFileSync(tmpPath, data);
|
|
160
|
+
renameSync(tmpPath, filePath);
|
|
161
|
+
}
|
|
162
|
+
// — internal helpers —
|
|
163
|
+
function parseFrontmatter(block) {
|
|
164
|
+
const result = {};
|
|
165
|
+
for (const line of block.split('\n')) {
|
|
166
|
+
const trimmed = line.trim();
|
|
167
|
+
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
168
|
+
const colonIdx = trimmed.indexOf(': ');
|
|
169
|
+
if (colonIdx === -1) continue;
|
|
170
|
+
const key = trimmed.slice(0, colonIdx).trim();
|
|
171
|
+
const valueStr = trimmed.slice(colonIdx + 2);
|
|
172
|
+
try {
|
|
173
|
+
result[key] = JSON.parse(valueStr);
|
|
174
|
+
} catch {
|
|
175
|
+
// skip malformed lines silently — treat as absent
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
function serialiseFrontmatter(fields) {
|
|
181
|
+
return Object.entries(fields)
|
|
182
|
+
.filter(([, v]) => v !== undefined)
|
|
183
|
+
.map(([k, v]) => `${k}: ${JSON.stringify(v)}`)
|
|
184
|
+
.join('\n');
|
|
185
|
+
}
|
|
186
|
+
/** Build a fully-defaulted MemoryEntry for files that fail to parse. */
|
|
187
|
+
function emptyEntry(id) {
|
|
188
|
+
const now = new Date().toISOString();
|
|
189
|
+
return {
|
|
190
|
+
accessCount: 0,
|
|
191
|
+
agentRole: '',
|
|
192
|
+
category: 'episodic',
|
|
193
|
+
confidence: 'observed',
|
|
194
|
+
content: '',
|
|
195
|
+
createdAt: now,
|
|
196
|
+
halfLifeDays: 7,
|
|
197
|
+
id,
|
|
198
|
+
isError: false,
|
|
199
|
+
lastAccessedAt: now,
|
|
200
|
+
relatedPaths: [],
|
|
201
|
+
sessionId: '',
|
|
202
|
+
source: { command: '' },
|
|
203
|
+
tags: [],
|
|
204
|
+
updatedAt: now
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function extractContent(rawBody) {
|
|
208
|
+
return rawBody
|
|
209
|
+
.split('\n')
|
|
210
|
+
.filter((line) => !LINK_LINE_RE.test(line))
|
|
211
|
+
.join('\n')
|
|
212
|
+
.trim();
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=file-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-format.js","sourceRoot":"","sources":["../../src/vault/file-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Edge, MemoryCategory, MemoryEntry } from '@windagency/valora-plugin-api';
|
|
2
|
+
export interface VaultIndex {
|
|
3
|
+
byAgent: Map<string, Set<string>>;
|
|
4
|
+
byCategory: Map<MemoryCategory, Set<string>>;
|
|
5
|
+
byId: Map<string, VaultRecord>;
|
|
6
|
+
byPath: Map<string, Set<string>>;
|
|
7
|
+
byTag: Map<string, Set<string>>;
|
|
8
|
+
inEdges: Map<string, Set<string>>;
|
|
9
|
+
outEdges: Map<string, Edge[]>;
|
|
10
|
+
}
|
|
11
|
+
export interface VaultRecord {
|
|
12
|
+
entry: MemoryEntry;
|
|
13
|
+
links: Edge[];
|
|
14
|
+
mdPath: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function createEmptyIndex(): VaultIndex;
|
|
17
|
+
/** Scan all `.md` files in a vault directory and build the in-memory index. */
|
|
18
|
+
export declare function addRecord(index: VaultIndex, record: VaultRecord): void;
|
|
19
|
+
export declare function buildVaultIndex(vaultDir: string): VaultIndex;
|
|
20
|
+
export declare function removeRecord(index: VaultIndex, id: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Convert persisted Hebbian co-retrieval counts into traversable `co_accessed` edges.
|
|
23
|
+
* Without this step the counts are dead-on-reload — the edges that ADR-013 §5
|
|
24
|
+
* requires spreading activation to walk would not exist after a process restart.
|
|
25
|
+
* Edge weight uses log1p to dampen the influence of runaway pair counts.
|
|
26
|
+
*/
|
|
27
|
+
export declare function synthesiseCoAccessedEdges(entry: { coAccess?: Record<string, number>; id: string }): Edge[];
|
|
28
|
+
//# sourceMappingURL=vault-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-index.d.ts","sourceRoot":"","sources":["../../src/vault/vault-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAQvF,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAU7C;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CActE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CA6B5D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAgBhE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAAE,CAQ1G"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getLogger } from '@windagency/valora-runtime';
|
|
2
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { parseMemoryFile } from './file-format.js';
|
|
5
|
+
export function createEmptyIndex() {
|
|
6
|
+
return {
|
|
7
|
+
byAgent: new Map(),
|
|
8
|
+
byCategory: new Map(),
|
|
9
|
+
byId: new Map(),
|
|
10
|
+
byPath: new Map(),
|
|
11
|
+
byTag: new Map(),
|
|
12
|
+
inEdges: new Map(),
|
|
13
|
+
outEdges: new Map()
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Scan all `.md` files in a vault directory and build the in-memory index. */
|
|
17
|
+
export function addRecord(index, record) {
|
|
18
|
+
const { entry, links, mdPath } = record;
|
|
19
|
+
index.byId.set(entry.id, { entry, links, mdPath });
|
|
20
|
+
addToSet(index.byCategory, entry.category, entry.id);
|
|
21
|
+
addToSet(index.byAgent, entry.agentRole, entry.id);
|
|
22
|
+
for (const tag of entry.tags) addToSet(index.byTag, tag, entry.id);
|
|
23
|
+
for (const p of entry.relatedPaths) addToSet(index.byPath, p, entry.id);
|
|
24
|
+
const allOut = [...links, ...synthesiseCoAccessedEdges(entry)];
|
|
25
|
+
index.outEdges.set(entry.id, allOut);
|
|
26
|
+
for (const edge of allOut) {
|
|
27
|
+
addToSet(index.inEdges, edge.toId, entry.id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function buildVaultIndex(vaultDir) {
|
|
31
|
+
const index = createEmptyIndex();
|
|
32
|
+
const categories = ['episodic', 'semantic', 'decisions'];
|
|
33
|
+
for (const category of categories) {
|
|
34
|
+
const categoryDir = path.join(vaultDir, category);
|
|
35
|
+
let files;
|
|
36
|
+
try {
|
|
37
|
+
files = readdirSync(categoryDir).filter((f) => f.endsWith('.md'));
|
|
38
|
+
} catch {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
const mdPath = path.join(categoryDir, file);
|
|
43
|
+
try {
|
|
44
|
+
const content = readFileSync(mdPath, 'utf-8');
|
|
45
|
+
const id = path.basename(file, '.md');
|
|
46
|
+
const { entry, links } = parseMemoryFile(content, id);
|
|
47
|
+
addRecord(index, { entry, links, mdPath });
|
|
48
|
+
} catch (err) {
|
|
49
|
+
// Silent skipping turns vault corruption into invisible data
|
|
50
|
+
// loss. Surface a structured warning so operators can act —
|
|
51
|
+
// the index is still built from whatever else parses cleanly.
|
|
52
|
+
getLogger().warn(`Vault: failed to parse ${mdPath}: ${err.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return index;
|
|
57
|
+
}
|
|
58
|
+
export function removeRecord(index, id) {
|
|
59
|
+
const record = index.byId.get(id);
|
|
60
|
+
if (!record) return;
|
|
61
|
+
const { entry, links } = record;
|
|
62
|
+
index.byId.delete(id);
|
|
63
|
+
removeFromSet(index.byCategory, entry.category, id);
|
|
64
|
+
removeFromSet(index.byAgent, entry.agentRole, id);
|
|
65
|
+
for (const tag of entry.tags) removeFromSet(index.byTag, tag, id);
|
|
66
|
+
for (const p of entry.relatedPaths) removeFromSet(index.byPath, p, id);
|
|
67
|
+
index.outEdges.delete(id);
|
|
68
|
+
for (const edge of links) {
|
|
69
|
+
removeFromSet(index.inEdges, edge.toId, id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Convert persisted Hebbian co-retrieval counts into traversable `co_accessed` edges.
|
|
74
|
+
* Without this step the counts are dead-on-reload — the edges that ADR-013 §5
|
|
75
|
+
* requires spreading activation to walk would not exist after a process restart.
|
|
76
|
+
* Edge weight uses log1p to dampen the influence of runaway pair counts.
|
|
77
|
+
*/
|
|
78
|
+
export function synthesiseCoAccessedEdges(entry) {
|
|
79
|
+
if (!entry.coAccess) return [];
|
|
80
|
+
const edges = [];
|
|
81
|
+
for (const [peerId, count] of Object.entries(entry.coAccess)) {
|
|
82
|
+
if (count <= 0) continue;
|
|
83
|
+
edges.push({ fromId: entry.id, kind: 'co_accessed', toId: peerId, weight: Math.log1p(count) });
|
|
84
|
+
}
|
|
85
|
+
return edges;
|
|
86
|
+
}
|
|
87
|
+
function addToSet(map, key, value) {
|
|
88
|
+
let set = map.get(key);
|
|
89
|
+
if (!set) {
|
|
90
|
+
set = new Set();
|
|
91
|
+
map.set(key, set);
|
|
92
|
+
}
|
|
93
|
+
set.add(value);
|
|
94
|
+
}
|
|
95
|
+
function removeFromSet(map, key, value) {
|
|
96
|
+
map.get(key)?.delete(value);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=vault-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-index.js","sourceRoot":"","sources":["../../src/vault/vault-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Edge,
|
|
3
|
+
MemoryCategory,
|
|
4
|
+
MemoryEmbedder,
|
|
5
|
+
MemoryEntry,
|
|
6
|
+
MemoryQueryOptions,
|
|
7
|
+
MemoryQueryResult,
|
|
8
|
+
MemoryRecallConfig,
|
|
9
|
+
MemoryStorePort
|
|
10
|
+
} from '@windagency/valora-plugin-api';
|
|
11
|
+
import { type VaultIndex } from './vault-index.js';
|
|
12
|
+
export interface VaultStats {
|
|
13
|
+
edgeCount: number;
|
|
14
|
+
embeddingCoverage: number;
|
|
15
|
+
entryCount: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class VaultStore implements MemoryStorePort {
|
|
18
|
+
private index;
|
|
19
|
+
private indexLoaded;
|
|
20
|
+
private readonly meta;
|
|
21
|
+
private readonly vaultDir;
|
|
22
|
+
constructor(vaultDir: string);
|
|
23
|
+
appendEntry(category: MemoryCategory, entry: MemoryEntry, links?: Edge[]): Promise<void>;
|
|
24
|
+
appendEntryWithLinks(category: MemoryCategory, entry: MemoryEntry, links: Edge[]): Promise<void>;
|
|
25
|
+
flush(): Promise<void>;
|
|
26
|
+
getEntries(category: MemoryCategory): Promise<MemoryEntry[]>;
|
|
27
|
+
getMetadata(category: MemoryCategory): Promise<{
|
|
28
|
+
lastConsolidatedAt?: string;
|
|
29
|
+
lastWrittenAt: string;
|
|
30
|
+
version: number;
|
|
31
|
+
}>;
|
|
32
|
+
getVaultDir(): string;
|
|
33
|
+
getVaultIndex(): Promise<VaultIndex>;
|
|
34
|
+
/** Additional stat surface for the `valora memory info` command. */
|
|
35
|
+
getVaultStats(): VaultStats;
|
|
36
|
+
removeEntries(category: MemoryCategory, ids: Set<string>): Promise<number>;
|
|
37
|
+
removeEntry(category: MemoryCategory, id: string): Promise<boolean>;
|
|
38
|
+
save(_category: MemoryCategory, _immediate?: boolean): void;
|
|
39
|
+
semanticRecall(
|
|
40
|
+
options: MemoryQueryOptions,
|
|
41
|
+
limit: number,
|
|
42
|
+
embedder: MemoryEmbedder,
|
|
43
|
+
recallConfig?: MemoryRecallConfig
|
|
44
|
+
): Promise<MemoryQueryResult[] | null>;
|
|
45
|
+
setEntries(category: MemoryCategory, entries: MemoryEntry[]): Promise<void>;
|
|
46
|
+
setLastConsolidatedAt(timestamp: string): Promise<void>;
|
|
47
|
+
updateEntry(category: MemoryCategory, id: string, patch: Partial<MemoryEntry>): Promise<boolean>;
|
|
48
|
+
private ensureIndex;
|
|
49
|
+
private loadMeta;
|
|
50
|
+
private mdPath;
|
|
51
|
+
private persistMeta;
|
|
52
|
+
private readPersistedMeta;
|
|
53
|
+
private rollbackSetEntries;
|
|
54
|
+
private snapshotCategory;
|
|
55
|
+
private touchMeta;
|
|
56
|
+
/**
|
|
57
|
+
* Diff-update the secondary indexes (byTag/byPath/byAgent/byCategory) so
|
|
58
|
+
* lookups by those keys stay consistent with the current entry state. Without
|
|
59
|
+
* this, an updateEntry that changes tags/paths/agentRole/category leaves
|
|
60
|
+
* stale references under the old keys and never registers under the new ones.
|
|
61
|
+
*/
|
|
62
|
+
private refreshSecondaryIndexes;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Rebuild an in-memory VaultStore from disk, re-parsing all `.md` files.
|
|
66
|
+
* Used by the migration and info CLI commands.
|
|
67
|
+
*/
|
|
68
|
+
export declare function openVaultStore(vaultDir: string): VaultStore;
|
|
69
|
+
/** Parse a single `.md` file from an already-known path and update the index. */
|
|
70
|
+
export declare function importFileIntoStore(
|
|
71
|
+
store: VaultStore,
|
|
72
|
+
category: MemoryCategory,
|
|
73
|
+
entry: MemoryEntry
|
|
74
|
+
): Promise<void>;
|
|
75
|
+
//# sourceMappingURL=vault-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-store.d.ts","sourceRoot":"","sources":["../../src/vault/vault-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,IAAI,EACJ,cAAc,EACd,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,MAAM,+BAA+B,CAAC;AAmBvC,OAAO,EAMN,KAAK,UAAU,EAEf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,UAAU;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACnB;AAUD,qBAAa,UAAW,YAAW,eAAe;IACjD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAKtB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GAAE,IAAI,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlG,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAS5D,WAAW,CACV,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAUnF,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAKpC,oEAAoE;IACpE,aAAa,IAAI,UAAU;IAerB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAShF,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcnE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIrD,cAAc,CACnB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,YAAY,GAAE,kBAAuB,GACnC,OAAO,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC;IAyBhC,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BjF,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAoChG,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;YAaX,kBAAkB;IAehC,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,SAAS;IAKjB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CAuB/B;AAmBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAE3D;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAElH"}
|