@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 @@
|
|
|
1
|
+
{"version":3,"file":"json-to-vault.js","sourceRoot":"","sources":["../../src/migration/json-to-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-version.d.ts","sourceRoot":"","sources":["../../src/migration/vault-version.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAItC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQhE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAA6B,GAAG,IAAI,CAGhG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { atomicWriteFile } from '../vault/file-format.js';
|
|
4
|
+
export const VAULT_SCHEMA_VERSION = 1;
|
|
5
|
+
const VERSION_FILENAME = 'version';
|
|
6
|
+
export function readVaultVersion(vaultDir) {
|
|
7
|
+
try {
|
|
8
|
+
const raw = readFileSync(path.join(vaultDir, VERSION_FILENAME), 'utf-8').trim();
|
|
9
|
+
const n = parseInt(raw, 10);
|
|
10
|
+
return isNaN(n) ? null : n;
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function writeVaultVersion(vaultDir, version = VAULT_SCHEMA_VERSION) {
|
|
16
|
+
mkdirSync(vaultDir, { recursive: true });
|
|
17
|
+
atomicWriteFile(path.join(vaultDir, VERSION_FILENAME), String(version));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=vault-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-version.js","sourceRoot":"","sources":["../../src/migration/vault-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,UAAkB,oBAAoB;IACzF,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { VectorStore } from '../embeddings/vector-store.js';
|
|
2
|
+
export interface AnnCandidate {
|
|
3
|
+
id: string;
|
|
4
|
+
score: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
|
|
7
|
+
export declare function topKCosine(
|
|
8
|
+
queryVec: Float32Array,
|
|
9
|
+
vectorStore: VectorStore,
|
|
10
|
+
candidateIds: string[],
|
|
11
|
+
k: number
|
|
12
|
+
): AnnCandidate[];
|
|
13
|
+
//# sourceMappingURL=cosine-ann.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine-ann.d.ts","sourceRoot":"","sources":["../../src/retrieval/cosine-ann.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAgBzE;AAED,wBAAgB,UAAU,CACzB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EAAE,EACtB,CAAC,EAAE,MAAM,GACP,YAAY,EAAE,CAWhB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function cosineSimilarity(a, b) {
|
|
2
|
+
if (a.length !== b.length) return 0;
|
|
3
|
+
let dot = 0;
|
|
4
|
+
let normA = 0;
|
|
5
|
+
let normB = 0;
|
|
6
|
+
for (let i = 0; i < a.length; i++) {
|
|
7
|
+
dot += a[i] * b[i];
|
|
8
|
+
normA += a[i] * a[i];
|
|
9
|
+
normB += b[i] * b[i];
|
|
10
|
+
}
|
|
11
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
12
|
+
if (denom === 0) return 0;
|
|
13
|
+
const score = dot / denom;
|
|
14
|
+
return Number.isFinite(score) ? score : 0;
|
|
15
|
+
}
|
|
16
|
+
export function topKCosine(queryVec, vectorStore, candidateIds, k) {
|
|
17
|
+
const scored = [];
|
|
18
|
+
for (const id of candidateIds) {
|
|
19
|
+
const vec = vectorStore.read(id);
|
|
20
|
+
if (vec === null) continue;
|
|
21
|
+
scored.push({ id, score: cosineSimilarity(queryVec, vec) });
|
|
22
|
+
}
|
|
23
|
+
scored.sort((a, b) => b.score - a.score);
|
|
24
|
+
return scored.slice(0, k);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cosine-ann.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine-ann.js","sourceRoot":"","sources":["../../src/retrieval/cosine-ann.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAChE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE1B,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;IAC1B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU,CACzB,QAAsB,EACtB,WAAwB,EACxB,YAAsB,EACtB,CAAS;IAET,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Edge } from '@windagency/valora-plugin-api';
|
|
2
|
+
import type { VaultRecord } from '../vault/vault-index.js';
|
|
3
|
+
export declare function spreadActivation(
|
|
4
|
+
seeds: Map<string, number>,
|
|
5
|
+
byId: Map<string, VaultRecord>,
|
|
6
|
+
outEdges: Map<string, Edge[]>,
|
|
7
|
+
inEdges: Map<string, Set<string>>,
|
|
8
|
+
depth: number,
|
|
9
|
+
gamma: number,
|
|
10
|
+
now?: number
|
|
11
|
+
): Map<string, number>;
|
|
12
|
+
//# sourceMappingURL=spreading-activation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spreading-activation.d.ts","sourceRoot":"","sources":["../../src/retrieval/spreading-activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAsB3D,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,SAAa,GACd,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAerB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { computeStrength } from '../decay.js';
|
|
2
|
+
const CONFIDENCE_WEIGHT = {
|
|
3
|
+
inferred: 0.4,
|
|
4
|
+
observed: 0.7,
|
|
5
|
+
stale: 0.1,
|
|
6
|
+
verified: 1.0
|
|
7
|
+
};
|
|
8
|
+
const TRAVERSAL_KINDS = new Set(['co_accessed', 'related']);
|
|
9
|
+
/**
|
|
10
|
+
* Edges whose backward traversal carries semantic weight. `co_accessed` is
|
|
11
|
+
* symmetric (Hebbian co-retrieval), so reverse propagation is meaningful.
|
|
12
|
+
* `related` is directional in our schema; we choose not to propagate backwards
|
|
13
|
+
* to avoid amplifying activation through one-way authorial intent (e.g.,
|
|
14
|
+
* "promotion-from-X" should not flood X's neighbours).
|
|
15
|
+
*/
|
|
16
|
+
const REVERSE_TRAVERSAL_KINDS = new Set(['co_accessed']);
|
|
17
|
+
export function spreadActivation(seeds, byId, outEdges, inEdges, depth, gamma, now = Date.now()) {
|
|
18
|
+
if (gamma > 1) throw new Error(`spreadActivation: gamma must be <= 1 (got ${gamma})`);
|
|
19
|
+
const activation = new Map(seeds);
|
|
20
|
+
const queue = [...seeds.keys()].map((id) => [id, depth]);
|
|
21
|
+
let head = 0;
|
|
22
|
+
while (head < queue.length) {
|
|
23
|
+
const [currentId, remaining] = queue[head++];
|
|
24
|
+
if (remaining === 0) continue;
|
|
25
|
+
const act = activation.get(currentId) ?? 0;
|
|
26
|
+
propagateForward(currentId, act, remaining, gamma, outEdges, activation, queue);
|
|
27
|
+
propagateReverse(currentId, act, remaining, gamma, outEdges, inEdges, activation, queue);
|
|
28
|
+
}
|
|
29
|
+
return scoreActivation(activation, byId, now);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Apply a candidate activation to a node and re-enqueue it for further
|
|
33
|
+
* propagation if the new activation is strictly higher than what is already
|
|
34
|
+
* recorded. The activation guard alone terminates cycles because activation
|
|
35
|
+
* decays by `gamma < 1` at every hop, so a node revisited via a longer path
|
|
36
|
+
* always carries a smaller candidate.
|
|
37
|
+
*/
|
|
38
|
+
function propagate(id, activation, remaining, activationMap, queue) {
|
|
39
|
+
const current = activationMap.get(id) ?? 0;
|
|
40
|
+
if (activation <= current) return;
|
|
41
|
+
activationMap.set(id, activation);
|
|
42
|
+
if (remaining > 0) queue.push([id, remaining]);
|
|
43
|
+
}
|
|
44
|
+
function propagateForward(currentId, act, remaining, gamma, outEdges, activation, queue) {
|
|
45
|
+
for (const edge of outEdges.get(currentId) ?? []) {
|
|
46
|
+
if (!TRAVERSAL_KINDS.has(edge.kind)) continue;
|
|
47
|
+
propagate(edge.toId, act * (edge.weight ?? 1.0) * gamma, remaining - 1, activation, queue);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function propagateReverse(currentId, act, remaining, gamma, outEdges, inEdges, activation, queue) {
|
|
51
|
+
for (const neighborId of inEdges.get(currentId) ?? []) {
|
|
52
|
+
const edge = (outEdges.get(neighborId) ?? []).find(
|
|
53
|
+
(e) => e.toId === currentId && REVERSE_TRAVERSAL_KINDS.has(e.kind)
|
|
54
|
+
);
|
|
55
|
+
if (!edge) continue;
|
|
56
|
+
propagate(neighborId, act * (edge.weight ?? 1.0) * gamma, remaining - 1, activation, queue);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function scoreActivation(activation, byId, now) {
|
|
60
|
+
const scores = new Map();
|
|
61
|
+
for (const [id, act] of activation) {
|
|
62
|
+
const record = byId.get(id);
|
|
63
|
+
if (!record) continue;
|
|
64
|
+
const decay = computeStrength(record.entry.createdAt, record.entry.halfLifeDays, now);
|
|
65
|
+
const confidence = CONFIDENCE_WEIGHT[record.entry.confidence] ?? 0.7;
|
|
66
|
+
scores.set(id, act * decay * confidence);
|
|
67
|
+
}
|
|
68
|
+
return scores;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=spreading-activation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spreading-activation.js","sourceRoot":"","sources":["../../src/retrieval/spreading-activation.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Store — file-based JSON persistence for memory entries.
|
|
3
|
+
*
|
|
4
|
+
* Stores three JSON files in .valora/memory/:
|
|
5
|
+
* - episodic.json (timestamped memories, 7-day half-life)
|
|
6
|
+
* - semantic.json (consolidated patterns, 30-day half-life)
|
|
7
|
+
* - decisions.json (architectural decisions, 21-day half-life)
|
|
8
|
+
*
|
|
9
|
+
* Follows the SessionStore/SessionLifecycle persistence pattern:
|
|
10
|
+
* in-memory cache + dirty tracking + debounced writes.
|
|
11
|
+
*/
|
|
12
|
+
import type { MemoryCategory, MemoryEntry, MemoryStoreFile } from '@windagency/valora-plugin-api';
|
|
13
|
+
export declare class MemoryStore {
|
|
14
|
+
private readonly cache;
|
|
15
|
+
private readonly dirty;
|
|
16
|
+
private readonly memoryDir;
|
|
17
|
+
private readonly persistTimers;
|
|
18
|
+
constructor(memoryDir?: string);
|
|
19
|
+
appendEntry(category: MemoryCategory, entry: MemoryEntry, _links?: unknown): Promise<void>;
|
|
20
|
+
flush(): Promise<void>;
|
|
21
|
+
getEntries(category: MemoryCategory): Promise<MemoryEntry[]>;
|
|
22
|
+
getMetadata(category: MemoryCategory): Promise<{
|
|
23
|
+
lastConsolidatedAt?: string;
|
|
24
|
+
lastWrittenAt: string;
|
|
25
|
+
version: number;
|
|
26
|
+
}>;
|
|
27
|
+
load(category: MemoryCategory): MemoryStoreFile;
|
|
28
|
+
removeEntries(category: MemoryCategory, ids: Set<string>): Promise<number>;
|
|
29
|
+
removeEntry(category: MemoryCategory, id: string): Promise<boolean>;
|
|
30
|
+
save(category: MemoryCategory, immediate?: boolean): void;
|
|
31
|
+
setEntries(category: MemoryCategory, entries: MemoryEntry[]): Promise<void>;
|
|
32
|
+
setLastConsolidatedAt(timestamp: string): Promise<void>;
|
|
33
|
+
updateEntry(category: MemoryCategory, id: string, patch: Partial<MemoryEntry>): Promise<boolean>;
|
|
34
|
+
private createEmptyStoreFile;
|
|
35
|
+
private getStorePath;
|
|
36
|
+
private persistImmediate;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAQlG,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqD;gBAEvE,SAAS,CAAC,EAAE,MAAM;IAO9B,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBpF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK5D,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;IAQnF,IAAI,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe;IA2B/C,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1E,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYnE,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,UAAQ,GAAG,IAAI;IAoBvD,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3E,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;IAYhG,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,gBAAgB;CAqBxB"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Store — file-based JSON persistence for memory entries.
|
|
3
|
+
*
|
|
4
|
+
* Stores three JSON files in .valora/memory/:
|
|
5
|
+
* - episodic.json (timestamped memories, 7-day half-life)
|
|
6
|
+
* - semantic.json (consolidated patterns, 30-day half-life)
|
|
7
|
+
* - decisions.json (architectural decisions, 21-day half-life)
|
|
8
|
+
*
|
|
9
|
+
* Follows the SessionStore/SessionLifecycle persistence pattern:
|
|
10
|
+
* in-memory cache + dirty tracking + debounced writes.
|
|
11
|
+
*/
|
|
12
|
+
import { getLogger, getRuntimeDataDir } from '@windagency/valora-runtime';
|
|
13
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { MEMORY_PERSIST_DEBOUNCE_MS, MEMORY_STORE_VERSION } from './constants.js';
|
|
16
|
+
export class MemoryStore {
|
|
17
|
+
cache;
|
|
18
|
+
dirty;
|
|
19
|
+
memoryDir;
|
|
20
|
+
persistTimers;
|
|
21
|
+
constructor(memoryDir) {
|
|
22
|
+
this.memoryDir = memoryDir ?? path.join(getRuntimeDataDir(), 'memory');
|
|
23
|
+
this.cache = new Map();
|
|
24
|
+
this.dirty = new Set();
|
|
25
|
+
this.persistTimers = new Map();
|
|
26
|
+
}
|
|
27
|
+
appendEntry(category, entry, _links) {
|
|
28
|
+
// Idempotent on `entry.id` — replace if present, push otherwise. Matches
|
|
29
|
+
// the vault backend's overwrite semantics so the manager can safely
|
|
30
|
+
// re-append an entry when persisting late-arriving fields (e.g. the
|
|
31
|
+
// supersedes wikilink in `promote()`). The `_links` argument is part of
|
|
32
|
+
// the port contract for graph-aware backends; this legacy JSON store
|
|
33
|
+
// does not track edges, so it is intentionally ignored.
|
|
34
|
+
const storeFile = this.load(category);
|
|
35
|
+
const existingIdx = storeFile.entries.findIndex((e) => e.id === entry.id);
|
|
36
|
+
if (existingIdx >= 0) {
|
|
37
|
+
storeFile.entries[existingIdx] = entry;
|
|
38
|
+
} else {
|
|
39
|
+
storeFile.entries.push(entry);
|
|
40
|
+
}
|
|
41
|
+
this.dirty.add(category);
|
|
42
|
+
this.save(category);
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
}
|
|
45
|
+
async flush() {
|
|
46
|
+
for (const [, timer] of this.persistTimers) {
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
}
|
|
49
|
+
this.persistTimers.clear();
|
|
50
|
+
const categories = ['episodic', 'semantic', 'decisions'];
|
|
51
|
+
for (const category of categories) {
|
|
52
|
+
if (this.dirty.has(category)) {
|
|
53
|
+
this.persistImmediate(category);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Yield to event loop after synchronous file writes, preserving async contract
|
|
57
|
+
// for callers and ensuring written data is observable in subsequent microtasks.
|
|
58
|
+
await Promise.resolve();
|
|
59
|
+
}
|
|
60
|
+
getEntries(category) {
|
|
61
|
+
const storeFile = this.load(category);
|
|
62
|
+
return Promise.resolve(storeFile.entries);
|
|
63
|
+
}
|
|
64
|
+
getMetadata(category) {
|
|
65
|
+
const storeFile = this.load(category);
|
|
66
|
+
return Promise.resolve({
|
|
67
|
+
lastConsolidatedAt: storeFile.lastConsolidatedAt,
|
|
68
|
+
lastWrittenAt: storeFile.lastWrittenAt,
|
|
69
|
+
version: storeFile.version
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
load(category) {
|
|
73
|
+
const cached = this.cache.get(category);
|
|
74
|
+
if (cached !== undefined) {
|
|
75
|
+
return cached;
|
|
76
|
+
}
|
|
77
|
+
mkdirSync(this.memoryDir, { recursive: true });
|
|
78
|
+
const storePath = this.getStorePath(category);
|
|
79
|
+
try {
|
|
80
|
+
const raw = readFileSync(storePath, 'utf-8');
|
|
81
|
+
const storeFile = JSON.parse(raw);
|
|
82
|
+
this.cache.set(category, storeFile);
|
|
83
|
+
return storeFile;
|
|
84
|
+
} catch (error) {
|
|
85
|
+
const nodeError = error;
|
|
86
|
+
if (nodeError.code === 'ENOENT') {
|
|
87
|
+
const empty = this.createEmptyStoreFile();
|
|
88
|
+
this.cache.set(category, empty);
|
|
89
|
+
return empty;
|
|
90
|
+
}
|
|
91
|
+
getLogger().warn(`Failed to load memory store for category '${category}': ${nodeError.message}`);
|
|
92
|
+
const empty = this.createEmptyStoreFile();
|
|
93
|
+
this.cache.set(category, empty);
|
|
94
|
+
return empty;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
removeEntries(category, ids) {
|
|
98
|
+
const storeFile = this.load(category);
|
|
99
|
+
const originalLength = storeFile.entries.length;
|
|
100
|
+
storeFile.entries = storeFile.entries.filter((e) => !ids.has(e.id));
|
|
101
|
+
const removed = originalLength - storeFile.entries.length;
|
|
102
|
+
if (removed > 0) {
|
|
103
|
+
this.dirty.add(category);
|
|
104
|
+
this.save(category, true);
|
|
105
|
+
}
|
|
106
|
+
return Promise.resolve(removed);
|
|
107
|
+
}
|
|
108
|
+
removeEntry(category, id) {
|
|
109
|
+
const storeFile = this.load(category);
|
|
110
|
+
const originalLength = storeFile.entries.length;
|
|
111
|
+
storeFile.entries = storeFile.entries.filter((e) => e.id !== id);
|
|
112
|
+
if (storeFile.entries.length !== originalLength) {
|
|
113
|
+
this.dirty.add(category);
|
|
114
|
+
this.save(category);
|
|
115
|
+
return Promise.resolve(true);
|
|
116
|
+
}
|
|
117
|
+
return Promise.resolve(false);
|
|
118
|
+
}
|
|
119
|
+
save(category, immediate = false) {
|
|
120
|
+
this.dirty.add(category);
|
|
121
|
+
const existing = this.persistTimers.get(category);
|
|
122
|
+
if (existing !== undefined) {
|
|
123
|
+
clearTimeout(existing);
|
|
124
|
+
this.persistTimers.delete(category);
|
|
125
|
+
}
|
|
126
|
+
if (immediate) {
|
|
127
|
+
this.persistImmediate(category);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const timer = setTimeout(() => {
|
|
131
|
+
this.persistImmediate(category);
|
|
132
|
+
}, MEMORY_PERSIST_DEBOUNCE_MS);
|
|
133
|
+
this.persistTimers.set(category, timer);
|
|
134
|
+
}
|
|
135
|
+
setEntries(category, entries) {
|
|
136
|
+
const storeFile = this.load(category);
|
|
137
|
+
storeFile.entries = entries;
|
|
138
|
+
this.dirty.add(category);
|
|
139
|
+
this.save(category);
|
|
140
|
+
return Promise.resolve();
|
|
141
|
+
}
|
|
142
|
+
setLastConsolidatedAt(timestamp) {
|
|
143
|
+
const categories = ['episodic', 'semantic', 'decisions'];
|
|
144
|
+
for (const category of categories) {
|
|
145
|
+
const storeFile = this.load(category);
|
|
146
|
+
storeFile.lastConsolidatedAt = timestamp;
|
|
147
|
+
this.dirty.add(category);
|
|
148
|
+
this.save(category);
|
|
149
|
+
}
|
|
150
|
+
return Promise.resolve();
|
|
151
|
+
}
|
|
152
|
+
updateEntry(category, id, patch) {
|
|
153
|
+
const storeFile = this.load(category);
|
|
154
|
+
const entry = storeFile.entries.find((e) => e.id === id);
|
|
155
|
+
if (entry === undefined) {
|
|
156
|
+
return Promise.resolve(false);
|
|
157
|
+
}
|
|
158
|
+
Object.assign(entry, patch);
|
|
159
|
+
this.dirty.add(category);
|
|
160
|
+
this.save(category);
|
|
161
|
+
return Promise.resolve(true);
|
|
162
|
+
}
|
|
163
|
+
createEmptyStoreFile() {
|
|
164
|
+
return {
|
|
165
|
+
entries: [],
|
|
166
|
+
lastWrittenAt: new Date().toISOString(),
|
|
167
|
+
version: MEMORY_STORE_VERSION
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
getStorePath(category) {
|
|
171
|
+
return path.join(this.memoryDir, `${category}.json`);
|
|
172
|
+
}
|
|
173
|
+
persistImmediate(category) {
|
|
174
|
+
if (!this.dirty.has(category)) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const storeFile = this.cache.get(category) ?? this.createEmptyStoreFile();
|
|
178
|
+
storeFile.lastWrittenAt = new Date().toISOString();
|
|
179
|
+
const storePath = this.getStorePath(category);
|
|
180
|
+
mkdirSync(this.memoryDir, { recursive: true });
|
|
181
|
+
try {
|
|
182
|
+
writeFileSync(storePath, JSON.stringify(storeFile, null, 2));
|
|
183
|
+
this.dirty.delete(category);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
// ADR-011 graceful-degradation contract: persistence failures must
|
|
186
|
+
// be non-fatal so the pipeline can continue. The dirty flag is
|
|
187
|
+
// retained, so a subsequent `flush()` will retry the write.
|
|
188
|
+
getLogger().warn(`Failed to persist memory store for category '${category}': ${error.message}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the default per-project vault directory.
|
|
3
|
+
*
|
|
4
|
+
* The vault is the authoritative memory store (ADR-013). All production code
|
|
5
|
+
* paths — pipeline, CLI, services — must agree on this single location so the
|
|
6
|
+
* agent and the operator are reading and writing the same data.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getDefaultVaultDir(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the directory that historically held the legacy JSON memory stores
|
|
11
|
+
* (`episodic.json` etc.). Identical to {@link getDefaultVaultDir} because the
|
|
12
|
+
* vault was introduced under the same root: the auto-migration helper inspects
|
|
13
|
+
* this directory for legacy `*.json` files and, if found, migrates them in
|
|
14
|
+
* place into the per-memory Markdown vault.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getLegacyJsonDir(): string;
|
|
17
|
+
//# sourceMappingURL=default-vault-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-vault-dir.d.ts","sourceRoot":"","sources":["../../src/vault/default-vault-dir.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getRuntimeDataDir } from '@windagency/valora-runtime';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the default per-project vault directory.
|
|
5
|
+
*
|
|
6
|
+
* The vault is the authoritative memory store (ADR-013). All production code
|
|
7
|
+
* paths — pipeline, CLI, services — must agree on this single location so the
|
|
8
|
+
* agent and the operator are reading and writing the same data.
|
|
9
|
+
*/
|
|
10
|
+
export function getDefaultVaultDir() {
|
|
11
|
+
return path.join(getRuntimeDataDir(), 'memory');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the directory that historically held the legacy JSON memory stores
|
|
15
|
+
* (`episodic.json` etc.). Identical to {@link getDefaultVaultDir} because the
|
|
16
|
+
* vault was introduced under the same root: the auto-migration helper inspects
|
|
17
|
+
* this directory for legacy `*.json` files and, if found, migrates them in
|
|
18
|
+
* place into the per-memory Markdown vault.
|
|
19
|
+
*/
|
|
20
|
+
export function getLegacyJsonDir() {
|
|
21
|
+
return getDefaultVaultDir();
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=default-vault-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-vault-dir.js","sourceRoot":"","sources":["../../src/vault/default-vault-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,kBAAkB,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Edge, MemoryEntry } from '@windagency/valora-plugin-api';
|
|
2
|
+
/**
|
|
3
|
+
* Compute the canonical SHA-256 content hash for a memory entry's body.
|
|
4
|
+
* Used by both the serialiser (to stamp the file with a fresh hash on every
|
|
5
|
+
* write) and the parser (to detect drift between the on-disk hash and the
|
|
6
|
+
* actual body, which signals an external edit — typically through Obsidian).
|
|
7
|
+
*/
|
|
8
|
+
export interface ParsedMemoryFile {
|
|
9
|
+
entry: MemoryEntry;
|
|
10
|
+
links: Edge[];
|
|
11
|
+
}
|
|
12
|
+
export declare function computeContentHash(content: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Parse `[[id|kind]]` and `[[id]]` wikilinks from a Markdown body.
|
|
15
|
+
*
|
|
16
|
+
* The alias position serves a dual purpose: Obsidian renders it as the link's
|
|
17
|
+
* display text, and Valora parses it as a typed `EdgeKind`. Because users can
|
|
18
|
+
* edit the alias in Obsidian — e.g. changing `[[abc|related]]` to a more
|
|
19
|
+
* readable `[[abc|see also]]` — the parser cannot trust unknown values. Aliases
|
|
20
|
+
* outside the {@link EdgeKind} enum default to `related` rather than being cast
|
|
21
|
+
* blindly into the type system, where they would silently corrupt the in-memory
|
|
22
|
+
* adjacency index.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseVaultLinks(fromId: string, body: string): Edge[];
|
|
25
|
+
/**
|
|
26
|
+
* Parse a memory vault Markdown file into an entry and its outgoing edges.
|
|
27
|
+
* The `id` parameter is the file's ID (used to populate edge `fromId`).
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseMemoryFile(content: string, id: string): ParsedMemoryFile;
|
|
30
|
+
/** Serialise a memory entry + outgoing edges into vault Markdown format. */
|
|
31
|
+
export declare function serialiseMemoryFile(entry: MemoryEntry, links: Edge[]): string;
|
|
32
|
+
/**
|
|
33
|
+
* Write content to a file atomically: write to a unique `.tmp` sibling first,
|
|
34
|
+
* then rename. Creates parent directories as needed. The tmp filename includes
|
|
35
|
+
* the writing process PID and a counter so concurrent writers never collide
|
|
36
|
+
* on the staging file.
|
|
37
|
+
*/
|
|
38
|
+
export declare function atomicWriteFile(filePath: string, content: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Write a Buffer (binary payload) atomically via tmp+rename. Counterpart to
|
|
41
|
+
* `atomicWriteFile` for non-text data such as packed embedding vectors.
|
|
42
|
+
*/
|
|
43
|
+
export declare function atomicWriteBuffer(filePath: string, data: Buffer): void;
|
|
44
|
+
//# sourceMappingURL=file-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-format.d.ts","sourceRoot":"","sources":["../../src/vault/file-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAMjF;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;CACd;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAwBD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAUpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAQ7E;AAiDD,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAkC7E;AAaD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKtE"}
|