@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.

Files changed (94) hide show
  1. package/dist/config-schema.d.ts +134 -0
  2. package/dist/config-schema.d.ts.map +1 -0
  3. package/dist/config-schema.js +61 -0
  4. package/dist/config-schema.js.map +1 -0
  5. package/dist/consolidation/cluster.d.ts +17 -0
  6. package/dist/consolidation/cluster.d.ts.map +1 -0
  7. package/dist/consolidation/cluster.js +59 -0
  8. package/dist/consolidation/cluster.js.map +1 -0
  9. package/dist/consolidation-service.d.ts +75 -0
  10. package/dist/consolidation-service.d.ts.map +1 -0
  11. package/dist/consolidation-service.js +373 -0
  12. package/dist/consolidation-service.js.map +1 -0
  13. package/dist/constants.d.ts +30 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +30 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/decay.d.ts +51 -0
  18. package/dist/decay.d.ts.map +1 -0
  19. package/dist/decay.js +59 -0
  20. package/dist/decay.js.map +1 -0
  21. package/dist/embeddings/embedder.port.d.ts +9 -0
  22. package/dist/embeddings/embedder.port.d.ts.map +1 -0
  23. package/dist/embeddings/embedder.port.js +2 -0
  24. package/dist/embeddings/embedder.port.js.map +1 -0
  25. package/dist/embeddings/llm-provider-embedder.d.ts +26 -0
  26. package/dist/embeddings/llm-provider-embedder.d.ts.map +1 -0
  27. package/dist/embeddings/llm-provider-embedder.js +34 -0
  28. package/dist/embeddings/llm-provider-embedder.js.map +1 -0
  29. package/dist/embeddings/resolve-embedder.d.ts +27 -0
  30. package/dist/embeddings/resolve-embedder.d.ts.map +1 -0
  31. package/dist/embeddings/resolve-embedder.js +38 -0
  32. package/dist/embeddings/resolve-embedder.js.map +1 -0
  33. package/dist/embeddings/vector-store.d.ts +35 -0
  34. package/dist/embeddings/vector-store.d.ts.map +1 -0
  35. package/dist/embeddings/vector-store.js +174 -0
  36. package/dist/embeddings/vector-store.js.map +1 -0
  37. package/dist/extraction-service.d.ts +33 -0
  38. package/dist/extraction-service.d.ts.map +1 -0
  39. package/dist/extraction-service.js +168 -0
  40. package/dist/extraction-service.js.map +1 -0
  41. package/dist/index.d.ts +42 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +6498 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/manager.d.ts +62 -0
  46. package/dist/manager.d.ts.map +1 -0
  47. package/dist/manager.js +377 -0
  48. package/dist/manager.js.map +1 -0
  49. package/dist/migration/auto-migrate.d.ts +20 -0
  50. package/dist/migration/auto-migrate.d.ts.map +1 -0
  51. package/dist/migration/auto-migrate.js +49 -0
  52. package/dist/migration/auto-migrate.js.map +1 -0
  53. package/dist/migration/json-to-vault.d.ts +10 -0
  54. package/dist/migration/json-to-vault.d.ts.map +1 -0
  55. package/dist/migration/json-to-vault.js +88 -0
  56. package/dist/migration/json-to-vault.js.map +1 -0
  57. package/dist/migration/vault-version.d.ts +4 -0
  58. package/dist/migration/vault-version.d.ts.map +1 -0
  59. package/dist/migration/vault-version.js +19 -0
  60. package/dist/migration/vault-version.js.map +1 -0
  61. package/dist/retrieval/cosine-ann.d.ts +13 -0
  62. package/dist/retrieval/cosine-ann.d.ts.map +1 -0
  63. package/dist/retrieval/cosine-ann.js +26 -0
  64. package/dist/retrieval/cosine-ann.js.map +1 -0
  65. package/dist/retrieval/spreading-activation.d.ts +12 -0
  66. package/dist/retrieval/spreading-activation.d.ts.map +1 -0
  67. package/dist/retrieval/spreading-activation.js +70 -0
  68. package/dist/retrieval/spreading-activation.js.map +1 -0
  69. package/dist/store.d.ts +38 -0
  70. package/dist/store.d.ts.map +1 -0
  71. package/dist/store.js +192 -0
  72. package/dist/store.js.map +1 -0
  73. package/dist/vault/default-vault-dir.d.ts +17 -0
  74. package/dist/vault/default-vault-dir.d.ts.map +1 -0
  75. package/dist/vault/default-vault-dir.js +23 -0
  76. package/dist/vault/default-vault-dir.js.map +1 -0
  77. package/dist/vault/file-format.d.ts +44 -0
  78. package/dist/vault/file-format.d.ts.map +1 -0
  79. package/dist/vault/file-format.js +214 -0
  80. package/dist/vault/file-format.js.map +1 -0
  81. package/dist/vault/vault-index.d.ts +28 -0
  82. package/dist/vault/vault-index.d.ts.map +1 -0
  83. package/dist/vault/vault-index.js +98 -0
  84. package/dist/vault/vault-index.js.map +1 -0
  85. package/dist/vault/vault-store.d.ts +75 -0
  86. package/dist/vault/vault-store.d.ts.map +1 -0
  87. package/dist/vault/vault-store.js +369 -0
  88. package/dist/vault/vault-store.js.map +1 -0
  89. package/dist/vault-memory-provider.d.ts +53 -0
  90. package/dist/vault-memory-provider.d.ts.map +1 -0
  91. package/dist/vault-memory-provider.js +139 -0
  92. package/dist/vault-memory-provider.js.map +1 -0
  93. package/package.json +58 -0
  94. 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,4 @@
1
+ export declare const VAULT_SCHEMA_VERSION = 1;
2
+ export declare function readVaultVersion(vaultDir: string): null | number;
3
+ export declare function writeVaultVersion(vaultDir: string, version?: number): void;
4
+ //# sourceMappingURL=vault-version.d.ts.map
@@ -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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"}
@@ -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"}