@raviolelabs/engram-mcp 0.5.2 → 0.5.4

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 (169) hide show
  1. package/README.md +13 -1
  2. package/dist/cloud/pairing.d.ts.map +1 -1
  3. package/dist/cloud/pairing.js +45 -4
  4. package/dist/cloud/pairing.js.map +1 -1
  5. package/package.json +1 -2
  6. package/dist/mcp-server/tests/mcp-e2e.test.d.ts +0 -2
  7. package/dist/mcp-server/tests/mcp-e2e.test.d.ts.map +0 -1
  8. package/dist/mcp-server/tests/mcp-e2e.test.js +0 -157
  9. package/dist/mcp-server/tests/mcp-e2e.test.js.map +0 -1
  10. package/dist/memory/modules/_custom/tests/custom-types.test.d.ts +0 -2
  11. package/dist/memory/modules/_custom/tests/custom-types.test.d.ts.map +0 -1
  12. package/dist/memory/modules/_custom/tests/custom-types.test.js +0 -96
  13. package/dist/memory/modules/_custom/tests/custom-types.test.js.map +0 -1
  14. package/dist/memory/modules/audio/tests/audio.test.d.ts +0 -2
  15. package/dist/memory/modules/audio/tests/audio.test.d.ts.map +0 -1
  16. package/dist/memory/modules/audio/tests/audio.test.js +0 -66
  17. package/dist/memory/modules/audio/tests/audio.test.js.map +0 -1
  18. package/dist/memory/modules/audio/tests/transcriber.test.d.ts +0 -2
  19. package/dist/memory/modules/audio/tests/transcriber.test.d.ts.map +0 -1
  20. package/dist/memory/modules/audio/tests/transcriber.test.js +0 -27
  21. package/dist/memory/modules/audio/tests/transcriber.test.js.map +0 -1
  22. package/dist/memory/modules/conversations/tests/conversations.test.d.ts +0 -2
  23. package/dist/memory/modules/conversations/tests/conversations.test.d.ts.map +0 -1
  24. package/dist/memory/modules/conversations/tests/conversations.test.js +0 -75
  25. package/dist/memory/modules/conversations/tests/conversations.test.js.map +0 -1
  26. package/dist/memory/modules/drive/tests/drive.test.d.ts +0 -2
  27. package/dist/memory/modules/drive/tests/drive.test.d.ts.map +0 -1
  28. package/dist/memory/modules/drive/tests/drive.test.js +0 -66
  29. package/dist/memory/modules/drive/tests/drive.test.js.map +0 -1
  30. package/dist/memory/modules/notes/tests/notes.test.d.ts +0 -2
  31. package/dist/memory/modules/notes/tests/notes.test.d.ts.map +0 -1
  32. package/dist/memory/modules/notes/tests/notes.test.js +0 -64
  33. package/dist/memory/modules/notes/tests/notes.test.js.map +0 -1
  34. package/dist/memory/modules/notion/tests/notion.test.d.ts +0 -2
  35. package/dist/memory/modules/notion/tests/notion.test.d.ts.map +0 -1
  36. package/dist/memory/modules/notion/tests/notion.test.js +0 -53
  37. package/dist/memory/modules/notion/tests/notion.test.js.map +0 -1
  38. package/dist/memory/modules/obsidian/tests/obsidian.test.d.ts +0 -2
  39. package/dist/memory/modules/obsidian/tests/obsidian.test.d.ts.map +0 -1
  40. package/dist/memory/modules/obsidian/tests/obsidian.test.js +0 -72
  41. package/dist/memory/modules/obsidian/tests/obsidian.test.js.map +0 -1
  42. package/dist/memory/modules/obsidian/tests/vault-reader.test.d.ts +0 -2
  43. package/dist/memory/modules/obsidian/tests/vault-reader.test.d.ts.map +0 -1
  44. package/dist/memory/modules/obsidian/tests/vault-reader.test.js +0 -37
  45. package/dist/memory/modules/obsidian/tests/vault-reader.test.js.map +0 -1
  46. package/dist/memory/modules/youtube/tests/channel.test.d.ts +0 -2
  47. package/dist/memory/modules/youtube/tests/channel.test.d.ts.map +0 -1
  48. package/dist/memory/modules/youtube/tests/channel.test.js +0 -61
  49. package/dist/memory/modules/youtube/tests/channel.test.js.map +0 -1
  50. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.d.ts +0 -2
  51. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.d.ts.map +0 -1
  52. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.js +0 -23
  53. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.js.map +0 -1
  54. package/dist/memory/modules/youtube/tests/youtube.test.d.ts +0 -2
  55. package/dist/memory/modules/youtube/tests/youtube.test.d.ts.map +0 -1
  56. package/dist/memory/modules/youtube/tests/youtube.test.js +0 -61
  57. package/dist/memory/modules/youtube/tests/youtube.test.js.map +0 -1
  58. package/dist/sync/tests/apply.test.d.ts +0 -4
  59. package/dist/sync/tests/apply.test.d.ts.map +0 -1
  60. package/dist/sync/tests/apply.test.js +0 -117
  61. package/dist/sync/tests/apply.test.js.map +0 -1
  62. package/dist/sync/tests/ops-log.test.d.ts +0 -2
  63. package/dist/sync/tests/ops-log.test.d.ts.map +0 -1
  64. package/dist/sync/tests/ops-log.test.js +0 -105
  65. package/dist/sync/tests/ops-log.test.js.map +0 -1
  66. package/dist/sync/tests/two-device-sync.test.d.ts +0 -2
  67. package/dist/sync/tests/two-device-sync.test.d.ts.map +0 -1
  68. package/dist/sync/tests/two-device-sync.test.js +0 -250
  69. package/dist/sync/tests/two-device-sync.test.js.map +0 -1
  70. package/dist/tests/chunker.test.d.ts +0 -2
  71. package/dist/tests/chunker.test.d.ts.map +0 -1
  72. package/dist/tests/chunker.test.js +0 -24
  73. package/dist/tests/chunker.test.js.map +0 -1
  74. package/dist/tests/cloud-auth.test.d.ts +0 -2
  75. package/dist/tests/cloud-auth.test.d.ts.map +0 -1
  76. package/dist/tests/cloud-auth.test.js +0 -75
  77. package/dist/tests/cloud-auth.test.js.map +0 -1
  78. package/dist/tests/cloud-crypto.test.d.ts +0 -2
  79. package/dist/tests/cloud-crypto.test.d.ts.map +0 -1
  80. package/dist/tests/cloud-crypto.test.js +0 -58
  81. package/dist/tests/cloud-crypto.test.js.map +0 -1
  82. package/dist/tests/cloud-integration.test.d.ts +0 -2
  83. package/dist/tests/cloud-integration.test.d.ts.map +0 -1
  84. package/dist/tests/cloud-integration.test.js +0 -193
  85. package/dist/tests/cloud-integration.test.js.map +0 -1
  86. package/dist/tests/cloud-pairing.test.d.ts +0 -2
  87. package/dist/tests/cloud-pairing.test.d.ts.map +0 -1
  88. package/dist/tests/cloud-pairing.test.js +0 -86
  89. package/dist/tests/cloud-pairing.test.js.map +0 -1
  90. package/dist/tests/cloud-saves-integration.test.d.ts +0 -2
  91. package/dist/tests/cloud-saves-integration.test.d.ts.map +0 -1
  92. package/dist/tests/cloud-saves-integration.test.js +0 -92
  93. package/dist/tests/cloud-saves-integration.test.js.map +0 -1
  94. package/dist/tests/cloud-transit.test.d.ts +0 -2
  95. package/dist/tests/cloud-transit.test.d.ts.map +0 -1
  96. package/dist/tests/cloud-transit.test.js +0 -263
  97. package/dist/tests/cloud-transit.test.js.map +0 -1
  98. package/dist/tests/config.test.d.ts +0 -2
  99. package/dist/tests/config.test.d.ts.map +0 -1
  100. package/dist/tests/config.test.js +0 -25
  101. package/dist/tests/config.test.js.map +0 -1
  102. package/dist/tests/db.test.d.ts +0 -2
  103. package/dist/tests/db.test.d.ts.map +0 -1
  104. package/dist/tests/db.test.js +0 -73
  105. package/dist/tests/db.test.js.map +0 -1
  106. package/dist/tests/embeddings-providers.test.d.ts +0 -2
  107. package/dist/tests/embeddings-providers.test.d.ts.map +0 -1
  108. package/dist/tests/embeddings-providers.test.js +0 -62
  109. package/dist/tests/embeddings-providers.test.js.map +0 -1
  110. package/dist/tests/embeddings.test.d.ts +0 -2
  111. package/dist/tests/embeddings.test.d.ts.map +0 -1
  112. package/dist/tests/embeddings.test.js +0 -22
  113. package/dist/tests/embeddings.test.js.map +0 -1
  114. package/dist/tests/integrations-api.test.d.ts +0 -2
  115. package/dist/tests/integrations-api.test.d.ts.map +0 -1
  116. package/dist/tests/integrations-api.test.js +0 -129
  117. package/dist/tests/integrations-api.test.js.map +0 -1
  118. package/dist/tests/memory-store.test.d.ts +0 -2
  119. package/dist/tests/memory-store.test.d.ts.map +0 -1
  120. package/dist/tests/memory-store.test.js +0 -129
  121. package/dist/tests/memory-store.test.js.map +0 -1
  122. package/dist/tests/module-registry.test.d.ts +0 -2
  123. package/dist/tests/module-registry.test.d.ts.map +0 -1
  124. package/dist/tests/module-registry.test.js +0 -44
  125. package/dist/tests/module-registry.test.js.map +0 -1
  126. package/dist/tests/property-extractor.test.d.ts +0 -2
  127. package/dist/tests/property-extractor.test.d.ts.map +0 -1
  128. package/dist/tests/property-extractor.test.js +0 -24
  129. package/dist/tests/property-extractor.test.js.map +0 -1
  130. package/dist/tests/public-tools.test.d.ts +0 -2
  131. package/dist/tests/public-tools.test.d.ts.map +0 -1
  132. package/dist/tests/public-tools.test.js +0 -286
  133. package/dist/tests/public-tools.test.js.map +0 -1
  134. package/dist/tests/reindex.test.d.ts +0 -2
  135. package/dist/tests/reindex.test.d.ts.map +0 -1
  136. package/dist/tests/reindex.test.js +0 -58
  137. package/dist/tests/reindex.test.js.map +0 -1
  138. package/dist/tests/scope-encryption.test.d.ts +0 -2
  139. package/dist/tests/scope-encryption.test.d.ts.map +0 -1
  140. package/dist/tests/scope-encryption.test.js +0 -71
  141. package/dist/tests/scope-encryption.test.js.map +0 -1
  142. package/dist/tests/shamir.test.d.ts +0 -2
  143. package/dist/tests/shamir.test.d.ts.map +0 -1
  144. package/dist/tests/shamir.test.js +0 -57
  145. package/dist/tests/shamir.test.js.map +0 -1
  146. package/dist/tests/source-registry.test.d.ts +0 -2
  147. package/dist/tests/source-registry.test.d.ts.map +0 -1
  148. package/dist/tests/source-registry.test.js +0 -58
  149. package/dist/tests/source-registry.test.js.map +0 -1
  150. package/dist/tests/types.test.d.ts +0 -2
  151. package/dist/tests/types.test.d.ts.map +0 -1
  152. package/dist/tests/types.test.js +0 -26
  153. package/dist/tests/types.test.js.map +0 -1
  154. package/dist/tests/vector.test.d.ts +0 -2
  155. package/dist/tests/vector.test.d.ts.map +0 -1
  156. package/dist/tests/vector.test.js +0 -61
  157. package/dist/tests/vector.test.js.map +0 -1
  158. package/dist/tests/wikilinks.test.d.ts +0 -2
  159. package/dist/tests/wikilinks.test.d.ts.map +0 -1
  160. package/dist/tests/wikilinks.test.js +0 -20
  161. package/dist/tests/wikilinks.test.js.map +0 -1
  162. package/dist/webapp/tests/api.test.d.ts +0 -2
  163. package/dist/webapp/tests/api.test.d.ts.map +0 -1
  164. package/dist/webapp/tests/api.test.js +0 -125
  165. package/dist/webapp/tests/api.test.js.map +0 -1
  166. package/dist/webapp/tests/mcp-http.test.d.ts +0 -2
  167. package/dist/webapp/tests/mcp-http.test.d.ts.map +0 -1
  168. package/dist/webapp/tests/mcp-http.test.js +0 -47
  169. package/dist/webapp/tests/mcp-http.test.js.map +0 -1
@@ -1,263 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import fs from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
- import http from 'http';
6
- import { ulid } from 'ulid';
7
- import { initDb, closeDb, getDb } from '../db/index.js';
8
- import { initVectorStore } from '../vector/store.js';
9
- import { MemoryStore } from '../memory/core/store.js';
10
- import { saveTokens } from '../cloud/auth.js';
11
- import { generateMasterKeySalt, deriveMasterKey, encryptBlob } from '../cloud/crypto.js';
12
- import { pollOnce } from '../cloud/transit-poller.js';
13
- function startMockTransitServer(state) {
14
- return new Promise((resolve) => {
15
- const server = http.createServer((req, res) => {
16
- const url = new URL(req.url, `http://localhost`);
17
- // GET /transit/inbox?since=…
18
- if (req.method === 'GET' && url.pathname === '/transit/inbox') {
19
- const since = url.searchParams.get('since') ?? '';
20
- const items = state.inbox.filter((i) => i.createdAt > since);
21
- res.writeHead(200, { 'Content-Type': 'application/json' });
22
- res.end(JSON.stringify({ items }));
23
- return;
24
- }
25
- // GET /blob/:id — simulates R2 signed URL
26
- if (req.method === 'GET' && url.pathname.startsWith('/blob/')) {
27
- const id = url.pathname.replace('/blob/', '');
28
- const blob = state.blobsByItemId.get(id);
29
- if (!blob) {
30
- res.writeHead(404);
31
- res.end('Not found');
32
- return;
33
- }
34
- res.writeHead(200, { 'Content-Type': 'application/octet-stream' });
35
- res.end(Buffer.from(blob));
36
- return;
37
- }
38
- // POST /transit/ack
39
- if (req.method === 'POST' && url.pathname === '/transit/ack') {
40
- let body = '';
41
- req.on('data', (d) => (body += d));
42
- req.on('end', () => {
43
- const { id } = JSON.parse(body);
44
- state.ackedIds.push(id);
45
- // Remove from inbox
46
- state.inbox = state.inbox.filter((i) => i.id !== id);
47
- res.writeHead(200, { 'Content-Type': 'application/json' });
48
- res.end(JSON.stringify({ ok: true }));
49
- });
50
- return;
51
- }
52
- res.writeHead(404);
53
- res.end();
54
- });
55
- server.listen(0, '127.0.0.1', () => {
56
- const addr = server.address();
57
- resolve({ server, baseUrl: `http://127.0.0.1:${addr.port}` });
58
- });
59
- });
60
- }
61
- // ---------------------------------------------------------------------------
62
- // Helpers
63
- // ---------------------------------------------------------------------------
64
- const ollamaConfig = {
65
- provider: 'ollama',
66
- baseUrl: 'http://localhost:11434',
67
- model: 'nomic-embed-text',
68
- dimensions: 768,
69
- };
70
- function fakeJwt(expSec) {
71
- const h = Buffer.from(JSON.stringify({ alg: 'HS256' })).toString('base64url');
72
- const p = Buffer.from(JSON.stringify({ sub: 'u', exp: expSec })).toString('base64url');
73
- return `${h}.${p}.sig`;
74
- }
75
- // ---------------------------------------------------------------------------
76
- // Tests
77
- // ---------------------------------------------------------------------------
78
- describe('cloud/transit-poller', () => {
79
- let tmpDir;
80
- let store;
81
- let masterKey;
82
- let saltHex;
83
- let mockState;
84
- let mockServer;
85
- let baseUrl;
86
- let config;
87
- beforeEach(async () => {
88
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'engram-transit-'));
89
- initDb(tmpDir);
90
- initVectorStore(tmpDir);
91
- store = new MemoryStore({ embeddings: ollamaConfig });
92
- // Generate master key
93
- saltHex = await generateMasterKeySalt();
94
- masterKey = await deriveMasterKey('test-passphrase', saltHex);
95
- // Save fake JWT to oauth_tokens (poller calls getValidJwt which reads DB)
96
- const expSec = Math.floor(Date.now() / 1000) + 3600;
97
- saveTokens({
98
- jwt: fakeJwt(expSec),
99
- refreshToken: 'rt',
100
- apiKey: 'ak-test',
101
- expiresAt: expSec * 1000,
102
- });
103
- // Start mock server
104
- mockState = { inbox: [], ackedIds: [], blobsByItemId: new Map() };
105
- const started = await startMockTransitServer(mockState);
106
- mockServer = started.server;
107
- baseUrl = started.baseUrl;
108
- config = {
109
- dataDir: tmpDir,
110
- embeddings: ollamaConfig,
111
- propertyExtraction: {
112
- enabled: false,
113
- baseUrl: 'http://localhost:11434',
114
- model: 'llama3.2:3b',
115
- maxTokens: 300,
116
- },
117
- whisper: { enabled: true, model: 'small.en', language: 'auto' },
118
- youtube: { enabled: true, preferLanguage: 'en', fallbackToYtdlp: true },
119
- modules: {},
120
- mcp: { stdio: true, httpPort: 7777 },
121
- engramAccount: {
122
- jwt: fakeJwt(Math.floor(Date.now() / 1000) + 3600),
123
- refreshToken: 'rt',
124
- apiKey: 'ak-test',
125
- masterKeySalt: saltHex,
126
- baseUrl,
127
- pairedAt: new Date().toISOString(),
128
- },
129
- };
130
- });
131
- afterEach(() => {
132
- closeDb();
133
- mockServer.close();
134
- fs.rmSync(tmpDir, { recursive: true, force: true });
135
- });
136
- it('pollOnce returns processed=0 when inbox is empty', async () => {
137
- const result = await pollOnce({ store, config, masterKey });
138
- expect(result.processed).toBe(0);
139
- expect(result.errors).toBe(0);
140
- });
141
- it('pollOnce ingests a text item and acks it', async () => {
142
- // Prepare encrypted text blob
143
- const itemId = ulid();
144
- const plaintext = new TextEncoder().encode('Hello from mobile! This is a transit text note.');
145
- const encrypted = await encryptBlob(plaintext, masterKey);
146
- mockState.blobsByItemId.set(itemId, encrypted);
147
- const item = {
148
- id: itemId,
149
- type: 'text',
150
- downloadUrl: `${baseUrl}/blob/${itemId}`,
151
- createdAt: new Date().toISOString(),
152
- mimeType: 'text/plain',
153
- filename: 'note.txt',
154
- sizeBytes: encrypted.length,
155
- };
156
- mockState.inbox.push(item);
157
- const result = await pollOnce({ store, config, masterKey });
158
- expect(result.processed).toBe(1);
159
- expect(result.errors).toBe(0);
160
- expect(mockState.ackedIds).toContain(itemId);
161
- expect(mockState.inbox).toHaveLength(0);
162
- // Verify the memory was actually stored
163
- const memories = getDb()
164
- .prepare("SELECT content, properties_json FROM memories WHERE type = 'notes'")
165
- .all();
166
- expect(memories).toHaveLength(1);
167
- expect(memories[0].content).toBe('Hello from mobile! This is a transit text note.');
168
- const props = JSON.parse(memories[0].properties_json);
169
- expect(props.custom?.transit_id).toBe(itemId);
170
- }, 30_000);
171
- it('pollOnce processes multiple items and acks each', async () => {
172
- for (let i = 0; i < 3; i++) {
173
- const id = ulid();
174
- const pt = new TextEncoder().encode(`Transit note number ${i}`);
175
- const enc = await encryptBlob(pt, masterKey);
176
- mockState.blobsByItemId.set(id, enc);
177
- mockState.inbox.push({
178
- id,
179
- type: 'text',
180
- downloadUrl: `${baseUrl}/blob/${id}`,
181
- createdAt: new Date(Date.now() + i).toISOString(),
182
- mimeType: 'text/plain',
183
- sizeBytes: enc.length,
184
- });
185
- }
186
- const result = await pollOnce({ store, config, masterKey });
187
- expect(result.processed).toBe(3);
188
- expect(result.errors).toBe(0);
189
- expect(mockState.ackedIds).toHaveLength(3);
190
- expect(mockState.inbox).toHaveLength(0);
191
- }, 60_000);
192
- it('pollOnce handles decryption failure gracefully (wrong key), counts as error', async () => {
193
- const itemId = ulid();
194
- // Encrypt with a DIFFERENT master key
195
- const otherSalt = await generateMasterKeySalt();
196
- const otherKey = await deriveMasterKey('other-passphrase', otherSalt);
197
- const enc = await encryptBlob(new TextEncoder().encode('secret'), otherKey);
198
- mockState.blobsByItemId.set(itemId, enc);
199
- mockState.inbox.push({
200
- id: itemId,
201
- type: 'text',
202
- downloadUrl: `${baseUrl}/blob/${itemId}`,
203
- createdAt: new Date().toISOString(),
204
- mimeType: 'text/plain',
205
- sizeBytes: enc.length,
206
- });
207
- const result = await pollOnce({ store, config, masterKey });
208
- // Error counted, item NOT acked (stays in inbox)
209
- expect(result.errors).toBe(1);
210
- expect(result.processed).toBe(0);
211
- expect(mockState.ackedIds).toHaveLength(0);
212
- expect(mockState.inbox).toHaveLength(1);
213
- }, 30_000);
214
- it('pollOnce persists last_ts watermark so next poll uses since filter', async () => {
215
- const id1 = ulid();
216
- const ts1 = '2026-01-01T00:00:00.000Z';
217
- const pt = new TextEncoder().encode('old note');
218
- const enc = await encryptBlob(pt, masterKey);
219
- mockState.blobsByItemId.set(id1, enc);
220
- mockState.inbox.push({
221
- id: id1,
222
- type: 'text',
223
- downloadUrl: `${baseUrl}/blob/${id1}`,
224
- createdAt: ts1,
225
- mimeType: 'text/plain',
226
- sizeBytes: enc.length,
227
- });
228
- await pollOnce({ store, config, masterKey });
229
- // Second poll — inbox is empty, mock server filters by since
230
- const result2 = await pollOnce({ store, config, masterKey });
231
- expect(result2.processed).toBe(0);
232
- // module_state should have the watermark
233
- const row = getDb()
234
- .prepare("SELECT value_json FROM module_state WHERE module_id = 'cloud_transit' AND key = 'last_ts'")
235
- .get();
236
- expect(row).not.toBeUndefined();
237
- expect(JSON.parse(row.value_json)).toBe(ts1);
238
- }, 30_000);
239
- it('doc item is ingested as notes with doc tags', async () => {
240
- const id = ulid();
241
- const text = 'This is a shared document excerpt. Machine learning basics.';
242
- const enc = await encryptBlob(new TextEncoder().encode(text), masterKey);
243
- mockState.blobsByItemId.set(id, enc);
244
- mockState.inbox.push({
245
- id,
246
- type: 'doc',
247
- downloadUrl: `${baseUrl}/blob/${id}`,
248
- createdAt: new Date().toISOString(),
249
- mimeType: 'application/pdf',
250
- filename: 'ml-basics.pdf',
251
- sizeBytes: enc.length,
252
- });
253
- const result = await pollOnce({ store, config, masterKey });
254
- expect(result.processed).toBe(1);
255
- const memories = getDb()
256
- .prepare("SELECT properties_json FROM memories WHERE type = 'notes'")
257
- .all();
258
- const props = JSON.parse(memories[0].properties_json);
259
- expect(props.tags).toContain('document');
260
- expect(props.custom?.mime_type).toBe('application/pdf');
261
- }, 30_000);
262
- });
263
- //# sourceMappingURL=cloud-transit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-transit.test.js","sourceRoot":"","sources":["../../src/tests/cloud-transit.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/tests/config.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { EngramConfigSchema, defaultConfig } from '../config/schema.js';
3
- describe('EngramConfig schema', () => {
4
- it('accepts the default config', () => {
5
- expect(() => EngramConfigSchema.parse(defaultConfig)).not.toThrow();
6
- });
7
- it('requires embeddings.model', () => {
8
- const bad = { ...defaultConfig, embeddings: { provider: 'ollama' } };
9
- expect(() => EngramConfigSchema.parse(bad)).toThrow();
10
- });
11
- });
12
- describe('EngramConfig propertyExtraction', () => {
13
- it('default config has property extraction disabled (calling agent provides title/tags)', () => {
14
- expect(defaultConfig.propertyExtraction.enabled).toBe(false);
15
- expect(defaultConfig.propertyExtraction.model).toBe('llama3.2:3b'); // model still set for opt-in case
16
- });
17
- it('parses a config that enables property extraction', () => {
18
- const cfg = {
19
- ...defaultConfig,
20
- propertyExtraction: { ...defaultConfig.propertyExtraction, enabled: true },
21
- };
22
- expect(() => EngramConfigSchema.parse(cfg)).not.toThrow();
23
- });
24
- });
25
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/tests/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,GAAG,GAAG,EAAE,GAAG,aAAa,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC;QACrE,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,kCAAkC;IACxG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAG;YACV,GAAG,aAAa;YAChB,kBAAkB,EAAE,EAAE,GAAG,aAAa,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE;SAC3E,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=db.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../src/tests/db.test.ts"],"names":[],"mappings":""}
@@ -1,73 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import fs from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
- import { initDb, getDb, closeDb } from '../db/index.js';
6
- describe('db migrations', () => {
7
- let tmpDir;
8
- beforeEach(() => {
9
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'engram-test-'));
10
- initDb(tmpDir);
11
- });
12
- afterEach(() => {
13
- closeDb();
14
- fs.rmSync(tmpDir, { recursive: true, force: true });
15
- });
16
- it('creates the memories table', () => {
17
- const row = getDb()
18
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories'")
19
- .get();
20
- expect(row).toBeDefined();
21
- });
22
- it('creates the FTS5 table', () => {
23
- const row = getDb()
24
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'")
25
- .get();
26
- expect(row).toBeDefined();
27
- });
28
- it('records schema version up to latest', () => {
29
- const row = getDb().prepare('SELECT MAX(version) as v FROM schema_version').get();
30
- expect(row.v).toBe(7); // v7 adds poll_count to ingest_jobs for exponential backoff hints
31
- });
32
- it('creates the ops_log + tombstones + device_identity tables at v4', () => {
33
- const opsLog = getDb()
34
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='ops_log'")
35
- .get();
36
- const tombstones = getDb()
37
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='tombstones'")
38
- .get();
39
- const deviceIdentity = getDb()
40
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='device_identity'")
41
- .get();
42
- expect(opsLog).toBeDefined();
43
- expect(tombstones).toBeDefined();
44
- expect(deviceIdentity).toBeDefined();
45
- });
46
- it('creates the watched_sources table at v2', () => {
47
- const row = getDb()
48
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='watched_sources'")
49
- .get();
50
- expect(row).toBeDefined();
51
- });
52
- it('creates the saved_views and settings tables at v3', () => {
53
- const views = getDb()
54
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='saved_views'")
55
- .get();
56
- const settings = getDb()
57
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='settings'")
58
- .get();
59
- expect(views).toBeDefined();
60
- expect(settings).toBeDefined();
61
- });
62
- it('creates the recovery_shards + snapshot_log tables at v5', () => {
63
- const shards = getDb()
64
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='recovery_shards'")
65
- .get();
66
- const snapLog = getDb()
67
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='snapshot_log'")
68
- .get();
69
- expect(shards).toBeDefined();
70
- expect(snapLog).toBeDefined();
71
- });
72
- });
73
- //# sourceMappingURL=db.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/tests/db.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=embeddings-providers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embeddings-providers.test.d.ts","sourceRoot":"","sources":["../../src/tests/embeddings-providers.test.ts"],"names":[],"mappings":""}
@@ -1,62 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { embed } from '../embeddings/index.js';
3
- describe('embeddings provider dispatch', () => {
4
- it('routes to Ollama', async () => {
5
- const config = {
6
- provider: 'ollama',
7
- baseUrl: 'http://localhost:11434',
8
- model: 'nomic-embed-text',
9
- dimensions: 768,
10
- };
11
- const vec = await embed('hello', config);
12
- expect(vec.length).toBe(768);
13
- }, 30_000);
14
- it('rejects voyage without apiKey', async () => {
15
- await expect(embed('hello', {
16
- provider: 'voyage',
17
- model: 'voyage-3-large',
18
- dimensions: 1024,
19
- })).rejects.toThrow(/apiKey/);
20
- });
21
- it('rejects openai without apiKey', async () => {
22
- await expect(embed('hello', {
23
- provider: 'openai',
24
- model: 'text-embedding-3-small',
25
- dimensions: 1536,
26
- })).rejects.toThrow(/apiKey/);
27
- });
28
- it('rejects engram without apiKey', async () => {
29
- await expect(embed('hello', {
30
- provider: 'engram',
31
- model: 'engram-base',
32
- dimensions: 1024,
33
- })).rejects.toThrow(/apiKey/);
34
- });
35
- it('rejects openai-compatible without baseUrl', async () => {
36
- await expect(embed('hello', {
37
- provider: 'openai-compatible',
38
- model: 'my-model',
39
- dimensions: 768,
40
- })).rejects.toThrow(/baseUrl/);
41
- });
42
- // Voyage/OpenAI real-API tests are run manually when VOYAGE_API_KEY / OPENAI_API_KEY are set.
43
- it.skipIf(!process.env.VOYAGE_API_KEY)('real Voyage call returns expected dim', async () => {
44
- const vec = await embed('Hello world', {
45
- provider: 'voyage',
46
- model: 'voyage-3-large',
47
- apiKey: process.env.VOYAGE_API_KEY,
48
- dimensions: 1024,
49
- });
50
- expect(vec.length).toBe(1024);
51
- }, 20_000);
52
- it.skipIf(!process.env.OPENAI_API_KEY)('real OpenAI call returns expected dim', async () => {
53
- const vec = await embed('Hello world', {
54
- provider: 'openai',
55
- model: 'text-embedding-3-small',
56
- apiKey: process.env.OPENAI_API_KEY,
57
- dimensions: 1536,
58
- });
59
- expect(vec.length).toBe(1536);
60
- }, 20_000);
61
- });
62
- //# sourceMappingURL=embeddings-providers.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embeddings-providers.test.js","sourceRoot":"","sources":["../../src/tests/embeddings-providers.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=embeddings.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embeddings.test.d.ts","sourceRoot":"","sources":["../../src/tests/embeddings.test.ts"],"names":[],"mappings":""}
@@ -1,22 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { embed, cosineSimilarity } from '../embeddings/index.js';
3
- const config = {
4
- provider: 'ollama',
5
- baseUrl: 'http://localhost:11434',
6
- model: 'nomic-embed-text',
7
- dimensions: 768,
8
- };
9
- describe('embeddings (real Ollama)', () => {
10
- it('embeds a short string to a 768-dim vector', async () => {
11
- const vec = await embed('hello world', config);
12
- expect(vec).toBeInstanceOf(Float32Array);
13
- expect(vec.length).toBe(768);
14
- });
15
- it('similar texts have high cosine similarity', async () => {
16
- const a = await embed('I love programming', config);
17
- const b = await embed('Coding is my passion', config);
18
- const c = await embed('The weather is nice', config);
19
- expect(cosineSimilarity(a, b)).toBeGreaterThan(cosineSimilarity(a, c));
20
- });
21
- });
22
- //# sourceMappingURL=embeddings.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embeddings.test.js","sourceRoot":"","sources":["../../src/tests/embeddings.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE,QAAiB;IAC3B,OAAO,EAAE,wBAAwB;IACjC,KAAK,EAAE,kBAAkB;IACzB,UAAU,EAAE,GAAG;CAChB,CAAC;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=integrations-api.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrations-api.test.d.ts","sourceRoot":"","sources":["../../src/tests/integrations-api.test.ts"],"names":[],"mappings":""}