@mono-agent/memory 0.4.1

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.
Files changed (150) hide show
  1. package/README.md +61 -0
  2. package/dist/bujo/capture.d.ts +20 -0
  3. package/dist/bujo/capture.d.ts.map +1 -0
  4. package/dist/bujo/capture.js +77 -0
  5. package/dist/bujo/capture.js.map +1 -0
  6. package/dist/bujo/cli-env.d.ts +11 -0
  7. package/dist/bujo/cli-env.d.ts.map +1 -0
  8. package/dist/bujo/cli-env.js +30 -0
  9. package/dist/bujo/cli-env.js.map +1 -0
  10. package/dist/bujo/cli.d.ts +3 -0
  11. package/dist/bujo/cli.d.ts.map +1 -0
  12. package/dist/bujo/cli.js +98 -0
  13. package/dist/bujo/cli.js.map +1 -0
  14. package/dist/bujo/consolidate.d.ts +15 -0
  15. package/dist/bujo/consolidate.d.ts.map +1 -0
  16. package/dist/bujo/consolidate.js +61 -0
  17. package/dist/bujo/consolidate.js.map +1 -0
  18. package/dist/bujo/daily.d.ts +17 -0
  19. package/dist/bujo/daily.d.ts.map +1 -0
  20. package/dist/bujo/daily.js +47 -0
  21. package/dist/bujo/daily.js.map +1 -0
  22. package/dist/bujo/distill.d.ts +10 -0
  23. package/dist/bujo/distill.d.ts.map +1 -0
  24. package/dist/bujo/distill.js +50 -0
  25. package/dist/bujo/distill.js.map +1 -0
  26. package/dist/bujo/entities.d.ts +24 -0
  27. package/dist/bujo/entities.d.ts.map +1 -0
  28. package/dist/bujo/entities.js +80 -0
  29. package/dist/bujo/entities.js.map +1 -0
  30. package/dist/bujo/grammar.d.ts +18 -0
  31. package/dist/bujo/grammar.d.ts.map +1 -0
  32. package/dist/bujo/grammar.js +147 -0
  33. package/dist/bujo/grammar.js.map +1 -0
  34. package/dist/bujo/graph.d.ts +17 -0
  35. package/dist/bujo/graph.d.ts.map +1 -0
  36. package/dist/bujo/graph.js +96 -0
  37. package/dist/bujo/graph.js.map +1 -0
  38. package/dist/bujo/ids.d.ts +9 -0
  39. package/dist/bujo/ids.d.ts.map +1 -0
  40. package/dist/bujo/ids.js +23 -0
  41. package/dist/bujo/ids.js.map +1 -0
  42. package/dist/bujo/index.d.ts +26 -0
  43. package/dist/bujo/index.d.ts.map +1 -0
  44. package/dist/bujo/index.js +20 -0
  45. package/dist/bujo/index.js.map +1 -0
  46. package/dist/bujo/json.d.ts +3 -0
  47. package/dist/bujo/json.d.ts.map +1 -0
  48. package/dist/bujo/json.js +58 -0
  49. package/dist/bujo/json.js.map +1 -0
  50. package/dist/bujo/llm.d.ts +14 -0
  51. package/dist/bujo/llm.d.ts.map +1 -0
  52. package/dist/bujo/llm.js +2 -0
  53. package/dist/bujo/llm.js.map +1 -0
  54. package/dist/bujo/migrate.d.ts +12 -0
  55. package/dist/bujo/migrate.d.ts.map +1 -0
  56. package/dist/bujo/migrate.js +136 -0
  57. package/dist/bujo/migrate.js.map +1 -0
  58. package/dist/bujo/model-error.d.ts +16 -0
  59. package/dist/bujo/model-error.d.ts.map +1 -0
  60. package/dist/bujo/model-error.js +20 -0
  61. package/dist/bujo/model-error.js.map +1 -0
  62. package/dist/bujo/ollama-llm.d.ts +7 -0
  63. package/dist/bujo/ollama-llm.d.ts.map +1 -0
  64. package/dist/bujo/ollama-llm.js +43 -0
  65. package/dist/bujo/ollama-llm.js.map +1 -0
  66. package/dist/bujo/projections.d.ts +8 -0
  67. package/dist/bujo/projections.d.ts.map +1 -0
  68. package/dist/bujo/projections.js +53 -0
  69. package/dist/bujo/projections.js.map +1 -0
  70. package/dist/bujo/rebuild.d.ts +12 -0
  71. package/dist/bujo/rebuild.d.ts.map +1 -0
  72. package/dist/bujo/rebuild.js +73 -0
  73. package/dist/bujo/rebuild.js.map +1 -0
  74. package/dist/bujo/recall.d.ts +7 -0
  75. package/dist/bujo/recall.d.ts.map +1 -0
  76. package/dist/bujo/recall.js +33 -0
  77. package/dist/bujo/recall.js.map +1 -0
  78. package/dist/bujo/reconcile.d.ts +37 -0
  79. package/dist/bujo/reconcile.d.ts.map +1 -0
  80. package/dist/bujo/reconcile.js +190 -0
  81. package/dist/bujo/reconcile.js.map +1 -0
  82. package/dist/bujo/reflect.d.ts +30 -0
  83. package/dist/bujo/reflect.d.ts.map +1 -0
  84. package/dist/bujo/reflect.js +100 -0
  85. package/dist/bujo/reflect.js.map +1 -0
  86. package/dist/bujo/store.d.ts +77 -0
  87. package/dist/bujo/store.d.ts.map +1 -0
  88. package/dist/bujo/store.js +222 -0
  89. package/dist/bujo/store.js.map +1 -0
  90. package/dist/bujo/types.d.ts +39 -0
  91. package/dist/bujo/types.d.ts.map +1 -0
  92. package/dist/bujo/types.js +2 -0
  93. package/dist/bujo/types.js.map +1 -0
  94. package/dist/search/chunks.d.ts +14 -0
  95. package/dist/search/chunks.d.ts.map +1 -0
  96. package/dist/search/chunks.js +75 -0
  97. package/dist/search/chunks.js.map +1 -0
  98. package/dist/search/circuit-breaker.d.ts +34 -0
  99. package/dist/search/circuit-breaker.d.ts.map +1 -0
  100. package/dist/search/circuit-breaker.js +89 -0
  101. package/dist/search/circuit-breaker.js.map +1 -0
  102. package/dist/search/embeddings.d.ts +44 -0
  103. package/dist/search/embeddings.d.ts.map +1 -0
  104. package/dist/search/embeddings.js +141 -0
  105. package/dist/search/embeddings.js.map +1 -0
  106. package/dist/search/index.d.ts +8 -0
  107. package/dist/search/index.d.ts.map +1 -0
  108. package/dist/search/index.js +5 -0
  109. package/dist/search/index.js.map +1 -0
  110. package/dist/search/types.d.ts +41 -0
  111. package/dist/search/types.d.ts.map +1 -0
  112. package/dist/search/types.js +2 -0
  113. package/dist/search/types.js.map +1 -0
  114. package/dist/search/vector-index.d.ts +28 -0
  115. package/dist/search/vector-index.d.ts.map +1 -0
  116. package/dist/search/vector-index.js +214 -0
  117. package/dist/search/vector-index.js.map +1 -0
  118. package/dist/store/contract.d.ts +2 -0
  119. package/dist/store/contract.d.ts.map +1 -0
  120. package/dist/store/contract.js +2 -0
  121. package/dist/store/contract.js.map +1 -0
  122. package/dist/store/db.d.ts +84 -0
  123. package/dist/store/db.d.ts.map +1 -0
  124. package/dist/store/db.js +471 -0
  125. package/dist/store/db.js.map +1 -0
  126. package/dist/store/fts.d.ts +3 -0
  127. package/dist/store/fts.d.ts.map +1 -0
  128. package/dist/store/fts.js +6 -0
  129. package/dist/store/fts.js.map +1 -0
  130. package/dist/store/index.d.ts +5 -0
  131. package/dist/store/index.d.ts.map +1 -0
  132. package/dist/store/index.js +3 -0
  133. package/dist/store/index.js.map +1 -0
  134. package/dist/store/ranking.d.ts +16 -0
  135. package/dist/store/ranking.d.ts.map +1 -0
  136. package/dist/store/ranking.js +32 -0
  137. package/dist/store/ranking.js.map +1 -0
  138. package/dist/store/schema.d.ts +3 -0
  139. package/dist/store/schema.d.ts.map +1 -0
  140. package/dist/store/schema.js +61 -0
  141. package/dist/store/schema.js.map +1 -0
  142. package/dist/store/types.d.ts +102 -0
  143. package/dist/store/types.d.ts.map +1 -0
  144. package/dist/store/types.js +25 -0
  145. package/dist/store/types.js.map +1 -0
  146. package/dist/store/vec.d.ts +12 -0
  147. package/dist/store/vec.d.ts.map +1 -0
  148. package/dist/store/vec.js +20 -0
  149. package/dist/store/vec.js.map +1 -0
  150. package/package.json +45 -0
@@ -0,0 +1,214 @@
1
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { MemorySearchError } from "./embeddings.js";
4
+ const DEFAULT_DOCUMENT_PREFIX = "search_document: ";
5
+ const DEFAULT_QUERY_PREFIX = "search_query: ";
6
+ const DEFAULT_BATCH_SIZE = 32;
7
+ /**
8
+ * A dependency-free embedded vector store: embeddings persisted as JSON Lines,
9
+ * searched by brute-force cosine similarity. Fast and simple well under ~50k
10
+ * chunks, which is ample for a single agent's memory; no external vector DB.
11
+ */
12
+ export class VectorMemoryIndex {
13
+ path;
14
+ embeddings;
15
+ documentPrefix;
16
+ queryPrefix;
17
+ batchSize;
18
+ records = [];
19
+ loaded = false;
20
+ constructor(options) {
21
+ if (typeof options.path !== "string" || options.path.trim().length === 0) {
22
+ throw new MemorySearchError("invalid_index_options", "Index path must be a non-empty string.");
23
+ }
24
+ this.path = resolve(options.path);
25
+ this.embeddings = options.embeddings;
26
+ this.documentPrefix = options.documentPrefix ?? DEFAULT_DOCUMENT_PREFIX;
27
+ this.queryPrefix = options.queryPrefix ?? DEFAULT_QUERY_PREFIX;
28
+ this.batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;
29
+ }
30
+ /** Replaces the entire index from the supplied chunks (used by consolidation). */
31
+ async rebuild(chunks) {
32
+ const deduped = dedupeById(chunks);
33
+ const vectors = await this.embedAll(deduped.map((chunk) => `${this.documentPrefix}${chunk.text}`));
34
+ this.records = deduped.map((chunk, index) => toRecord(chunk, vectors[index] ?? []));
35
+ this.loaded = true;
36
+ await this.persist();
37
+ return { indexed: this.records.length };
38
+ }
39
+ /** Semantic search by cosine similarity. Throws if embeddings are unavailable. */
40
+ async search(query, limit = 8, minScore = 0) {
41
+ await this.ensureLoaded();
42
+ if (this.records.length === 0 || query.trim().length === 0) {
43
+ return [];
44
+ }
45
+ const [queryVector] = await this.embeddings.embed([`${this.queryPrefix}${query}`]);
46
+ if (queryVector === undefined) {
47
+ return [];
48
+ }
49
+ const queryNorm = norm(queryVector);
50
+ if (queryNorm === 0) {
51
+ return [];
52
+ }
53
+ const scored = this.records.map((record) => ({
54
+ record,
55
+ score: cosine(queryVector, queryNorm, record.vector, record.norm),
56
+ }));
57
+ scored.sort((a, b) => b.score - a.score);
58
+ return scored
59
+ .filter((entry) => entry.score > minScore)
60
+ .slice(0, Math.max(0, limit))
61
+ .map((entry) => toHit(entry.record, entry.score));
62
+ }
63
+ async size() {
64
+ await this.ensureLoaded();
65
+ return this.records.length;
66
+ }
67
+ async embedAll(texts) {
68
+ const out = [];
69
+ for (let start = 0; start < texts.length; start += this.batchSize) {
70
+ const batch = texts.slice(start, start + this.batchSize);
71
+ const vectors = await this.embeddings.embed(batch);
72
+ out.push(...vectors);
73
+ }
74
+ return out;
75
+ }
76
+ async ensureLoaded() {
77
+ if (this.loaded) {
78
+ return;
79
+ }
80
+ let raw;
81
+ try {
82
+ raw = await readFile(this.path, "utf8");
83
+ }
84
+ catch (error) {
85
+ if (isNodeError(error, "ENOENT")) {
86
+ this.loaded = true;
87
+ return;
88
+ }
89
+ throw new MemorySearchError("index_read_failed", "Unable to read vector index.", {
90
+ path: this.path,
91
+ cause: error instanceof Error ? error.message : String(error),
92
+ });
93
+ }
94
+ const records = [];
95
+ for (const line of raw.split("\n")) {
96
+ const trimmed = line.trim();
97
+ if (trimmed.length === 0) {
98
+ continue;
99
+ }
100
+ let parsed;
101
+ try {
102
+ parsed = JSON.parse(trimmed);
103
+ }
104
+ catch (error) {
105
+ throw new MemorySearchError("index_read_failed", "Vector index contains malformed JSON.", {
106
+ path: this.path,
107
+ cause: error instanceof Error ? error.message : String(error),
108
+ });
109
+ }
110
+ const record = parseRecord(parsed);
111
+ if (record !== undefined) {
112
+ records.push(record);
113
+ }
114
+ }
115
+ this.records = records;
116
+ this.loaded = true;
117
+ }
118
+ async persist() {
119
+ const body = this.records.length === 0
120
+ ? ""
121
+ : `${this.records.map((record) => JSON.stringify({
122
+ id: record.id,
123
+ source: record.source,
124
+ ...(record.day === undefined ? {} : { day: record.day }),
125
+ text: record.text,
126
+ vector: record.vector,
127
+ })).join("\n")}\n`;
128
+ const tmpPath = `${this.path}.tmp`;
129
+ try {
130
+ await mkdir(dirname(this.path), { recursive: true });
131
+ await writeFile(tmpPath, body, "utf8");
132
+ await rename(tmpPath, this.path);
133
+ }
134
+ catch (error) {
135
+ throw new MemorySearchError("index_write_failed", "Unable to write vector index.", {
136
+ path: this.path,
137
+ cause: error instanceof Error ? error.message : String(error),
138
+ });
139
+ }
140
+ }
141
+ }
142
+ export function createVectorMemoryIndex(options) {
143
+ return new VectorMemoryIndex(options);
144
+ }
145
+ function dedupeById(chunks) {
146
+ const byId = new Map();
147
+ for (const chunk of chunks) {
148
+ if (chunk.text.trim().length > 0) {
149
+ byId.set(chunk.id, chunk);
150
+ }
151
+ }
152
+ return [...byId.values()];
153
+ }
154
+ function toRecord(chunk, vector) {
155
+ return {
156
+ id: chunk.id,
157
+ source: chunk.source,
158
+ ...(chunk.day === undefined ? {} : { day: chunk.day }),
159
+ text: chunk.text,
160
+ vector,
161
+ norm: norm(vector),
162
+ };
163
+ }
164
+ function toHit(record, score) {
165
+ return {
166
+ id: record.id,
167
+ source: record.source,
168
+ text: record.text,
169
+ score,
170
+ ...(record.day === undefined ? {} : { day: record.day }),
171
+ };
172
+ }
173
+ function parseRecord(value) {
174
+ if (typeof value !== "object" || value === null) {
175
+ return undefined;
176
+ }
177
+ const record = value;
178
+ if (typeof record.id !== "string" || typeof record.source !== "string" || typeof record.text !== "string") {
179
+ return undefined;
180
+ }
181
+ if (!Array.isArray(record.vector) || record.vector.some((component) => typeof component !== "number")) {
182
+ return undefined;
183
+ }
184
+ const vector = record.vector;
185
+ return {
186
+ id: record.id,
187
+ source: record.source,
188
+ ...(typeof record.day === "string" ? { day: record.day } : {}),
189
+ text: record.text,
190
+ vector,
191
+ norm: norm(vector),
192
+ };
193
+ }
194
+ function norm(vector) {
195
+ let sum = 0;
196
+ for (const component of vector) {
197
+ sum += component * component;
198
+ }
199
+ return Math.sqrt(sum);
200
+ }
201
+ function cosine(a, aNorm, b, bNorm) {
202
+ if (aNorm === 0 || bNorm === 0 || a.length !== b.length) {
203
+ return 0;
204
+ }
205
+ let dot = 0;
206
+ for (let index = 0; index < a.length; index += 1) {
207
+ dot += (a[index] ?? 0) * (b[index] ?? 0);
208
+ }
209
+ return dot / (aNorm * bNorm);
210
+ }
211
+ function isNodeError(error, code) {
212
+ return typeof error === "object" && error !== null && "code" in error && error.code === code;
213
+ }
214
+ //# sourceMappingURL=vector-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-index.js","sourceRoot":"","sources":["../../src/search/vector-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { MemoryBlock, MemoryStore, MemoryWriteResult } from "@mono-agent/agent-contracts";
2
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/store/contract.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/store/contract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { type Database } from "better-sqlite3";
2
+ import { type EntityRecord, type EntityRelationRecord, type MemoryDbOptions, type MemoryStoreStats, type MemoryStoreStatsOptions, type MemoryRecord, type RecallHit, type RecallOptions, type RecallWeights, type SimilarHit } from "./types.js";
3
+ import type { EmbeddingProvider } from "../search/index.js";
4
+ export declare class MemoryDb {
5
+ protected readonly db: Database;
6
+ protected readonly embeddings: EmbeddingProvider | undefined;
7
+ protected readonly dim: number;
8
+ protected readonly k: number;
9
+ protected readonly weights: RecallWeights;
10
+ protected readonly decayGamma: number;
11
+ protected readonly clock: () => Date;
12
+ constructor(options: MemoryDbOptions);
13
+ vecVersion(): string;
14
+ /** Configured busy_timeout in ms — how long a blocked writer waits before SQLITE_BUSY. */
15
+ busyTimeoutMs(): number;
16
+ /**
17
+ * Guard that an embedding vector matches the configured `dim` before it reaches sqlite-vec.
18
+ * Surfaces a clear error (e.g. when the embedding model changed but `dim` was left stale) instead
19
+ * of the opaque sqlite-vec failure on INSERT/MATCH.
20
+ */
21
+ protected assertVectorDim(vector: readonly number[], context: string): void;
22
+ upsert(record: MemoryRecord): Promise<void>;
23
+ get(id: string): MemoryRecord | undefined;
24
+ count(): number;
25
+ stats(options?: MemoryStoreStatsOptions): MemoryStoreStats;
26
+ recall(query: string, options?: RecallOptions): Promise<RecallHit[]>;
27
+ protected vectorCandidates(query: string, limit: number): Promise<string[]>;
28
+ protected keywordCandidates(query: string, limit: number): string[];
29
+ supersede(oldId: string, replacement: MemoryRecord): Promise<void>;
30
+ markSuperseded(oldId: string, replacementId: string, at?: string): void;
31
+ edges(src: string): {
32
+ src: string;
33
+ dst: string;
34
+ kind: string;
35
+ weight: number;
36
+ }[];
37
+ addEdge(src: string, dst: string, kind: "thread" | "about" | "supports" | "supersedes", weight?: number): void;
38
+ expand(seedIds: readonly string[], hops?: number): MemoryRecord[];
39
+ findSimilar(text: string, k?: number): Promise<SimilarHit[]>;
40
+ /**
41
+ * Wipe the index and rebuild it from the supplied records (used by rebuild-from-files). No LLM.
42
+ * Wipes ALL index tables — including entities/entity_relations — so the caller is responsible for
43
+ * repopulating the entity graph afterwards (memory-bujo's rebuildFromMarkdown re-ingests graph.jsonl).
44
+ * Not atomic across records: the wipe is transactional, but if a re-upsert throws mid-way the index
45
+ * is left partially rebuilt. Since the index is rebuildable from canonical files, callers should
46
+ * treat a thrown rebuild as "index dirty — re-run" rather than relying on all-or-nothing semantics.
47
+ */
48
+ rebuild(records: readonly MemoryRecord[]): Promise<{
49
+ indexed: number;
50
+ }>;
51
+ protected bumpAccess(ids: readonly string[], now: Date): void;
52
+ protected nextSeq(id: string): number;
53
+ protected toRow(record: MemoryRecord, seq: number): Record<string, unknown>;
54
+ protected fromRow(row: Record<string, unknown>): MemoryRecord;
55
+ upsertEntity(entity: EntityRecord): void;
56
+ getEntity(id: string): EntityRecord | undefined;
57
+ countEntities(): number;
58
+ /** All entities ordered by name, for index projections. */
59
+ listEntities(limit?: number): EntityRecord[];
60
+ addEntityRelation(src: string, dst: string, relation: string): void;
61
+ relationsFor(src: string): EntityRelationRecord[];
62
+ protected entityFromRow(row: Record<string, unknown>): EntityRecord;
63
+ /** Open memories with a due date at/under `now`, soonest first (the future-log queue). */
64
+ dueItems(now: Date, limit?: number): MemoryRecord[];
65
+ /** Live, low-salience, old, infrequently-accessed open memories — migration candidates. */
66
+ agingOpen(now: Date, opts?: {
67
+ olderThanDays?: number;
68
+ maxSalience?: number;
69
+ limit?: number;
70
+ }): MemoryRecord[];
71
+ /** Highest-salience live memories (for promotion / always-in-context / index). */
72
+ topSalient(limit?: number): MemoryRecord[];
73
+ /** Decay salience toward `floor` by time since last access (half-life in days). Returns count adjusted.
74
+ * Frequently-accessed memories (recent last_accessed_at) decay little; stale ones fade toward floor. */
75
+ applyDecay(now: Date, opts?: {
76
+ halfLifeDays?: number;
77
+ floor?: number;
78
+ }): {
79
+ decayed: number;
80
+ };
81
+ close(): void;
82
+ }
83
+ export declare function openMemoryDb(options: MemoryDbOptions): MemoryDb;
84
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"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"}