aismemory 0.5.0 → 0.5.2

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 (86) hide show
  1. package/dist/__tests__/ais-http-error.test.d.ts +1 -0
  2. package/dist/__tests__/ais-http-error.test.js +49 -0
  3. package/dist/__tests__/ais-http-error.test.js.map +1 -0
  4. package/dist/__tests__/auth-staleness.test.d.ts +9 -0
  5. package/dist/__tests__/auth-staleness.test.js +46 -0
  6. package/dist/__tests__/auth-staleness.test.js.map +1 -0
  7. package/dist/__tests__/auto-handoff.test.js +108 -2
  8. package/dist/__tests__/auto-handoff.test.js.map +1 -1
  9. package/dist/__tests__/config.test.js +6 -3
  10. package/dist/__tests__/config.test.js.map +1 -1
  11. package/dist/__tests__/env-agent.test.d.ts +1 -0
  12. package/dist/__tests__/env-agent.test.js +19 -0
  13. package/dist/__tests__/env-agent.test.js.map +1 -0
  14. package/dist/__tests__/existing-hashes.test.d.ts +1 -0
  15. package/dist/__tests__/existing-hashes.test.js +122 -0
  16. package/dist/__tests__/existing-hashes.test.js.map +1 -0
  17. package/dist/__tests__/hydration.test.js +38 -0
  18. package/dist/__tests__/hydration.test.js.map +1 -1
  19. package/dist/__tests__/local-mirror.test.js +4 -0
  20. package/dist/__tests__/local-mirror.test.js.map +1 -1
  21. package/dist/__tests__/memory-write-failure.test.d.ts +1 -0
  22. package/dist/__tests__/memory-write-failure.test.js +148 -0
  23. package/dist/__tests__/memory-write-failure.test.js.map +1 -0
  24. package/dist/__tests__/oauth-credentials.test.d.ts +1 -0
  25. package/dist/__tests__/oauth-credentials.test.js +29 -0
  26. package/dist/__tests__/oauth-credentials.test.js.map +1 -0
  27. package/dist/__tests__/pipeline-ingestion.test.js +112 -1
  28. package/dist/__tests__/pipeline-ingestion.test.js.map +1 -1
  29. package/dist/__tests__/refresh.test.js +24 -0
  30. package/dist/__tests__/refresh.test.js.map +1 -1
  31. package/dist/__tests__/sync-memory-cli.test.d.ts +1 -0
  32. package/dist/__tests__/sync-memory-cli.test.js +200 -0
  33. package/dist/__tests__/sync-memory-cli.test.js.map +1 -0
  34. package/dist/__tests__/telemetry.test.d.ts +1 -0
  35. package/dist/__tests__/telemetry.test.js +67 -0
  36. package/dist/__tests__/telemetry.test.js.map +1 -0
  37. package/dist/__tests__/token-expiry-reauth.test.d.ts +1 -0
  38. package/dist/__tests__/token-expiry-reauth.test.js +201 -0
  39. package/dist/__tests__/token-expiry-reauth.test.js.map +1 -0
  40. package/dist/__tests__/tool-args.test.d.ts +1 -0
  41. package/dist/__tests__/tool-args.test.js +78 -0
  42. package/dist/__tests__/tool-args.test.js.map +1 -0
  43. package/dist/ais-http-error.d.ts +26 -0
  44. package/dist/ais-http-error.js +75 -0
  45. package/dist/ais-http-error.js.map +1 -0
  46. package/dist/auth-staleness.d.ts +27 -0
  47. package/dist/auth-staleness.js +41 -0
  48. package/dist/auth-staleness.js.map +1 -0
  49. package/dist/auto-handoff.d.ts +2 -0
  50. package/dist/auto-handoff.js +40 -16
  51. package/dist/auto-handoff.js.map +1 -1
  52. package/dist/cli/sync-memory.js +31 -36
  53. package/dist/cli/sync-memory.js.map +1 -1
  54. package/dist/config.js +4 -1
  55. package/dist/config.js.map +1 -1
  56. package/dist/env-agent.d.ts +10 -0
  57. package/dist/env-agent.js +14 -0
  58. package/dist/env-agent.js.map +1 -0
  59. package/dist/hydration.js +54 -3
  60. package/dist/hydration.js.map +1 -1
  61. package/dist/index.js +243 -115
  62. package/dist/index.js.map +1 -1
  63. package/dist/local-mirror.d.ts +5 -0
  64. package/dist/local-mirror.js +72 -14
  65. package/dist/local-mirror.js.map +1 -1
  66. package/dist/oauth-credentials.d.ts +14 -0
  67. package/dist/oauth-credentials.js +35 -0
  68. package/dist/oauth-credentials.js.map +1 -0
  69. package/dist/pipeline/bulk-store.d.ts +46 -0
  70. package/dist/pipeline/bulk-store.js +165 -0
  71. package/dist/pipeline/bulk-store.js.map +1 -0
  72. package/dist/pipeline/existing-hashes.d.ts +20 -0
  73. package/dist/pipeline/existing-hashes.js +111 -0
  74. package/dist/pipeline/existing-hashes.js.map +1 -0
  75. package/dist/pipeline/ingestion.d.ts +8 -4
  76. package/dist/pipeline/ingestion.js +36 -8
  77. package/dist/pipeline/ingestion.js.map +1 -1
  78. package/dist/telemetry.d.ts +22 -0
  79. package/dist/telemetry.js +28 -0
  80. package/dist/telemetry.js.map +1 -0
  81. package/dist/tool-args.d.ts +52 -0
  82. package/dist/tool-args.js +78 -0
  83. package/dist/tool-args.js.map +1 -0
  84. package/dist/trust-ledger.js +2 -2
  85. package/dist/trust-ledger.js.map +1 -1
  86. package/package.json +9 -4
@@ -0,0 +1,148 @@
1
+ import { createServer } from 'node:http';
2
+ import { spawn } from 'node:child_process';
3
+ import { mkdtempSync, mkdirSync, writeFileSync, existsSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join, resolve } from 'path';
6
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
7
+ import { generateAndSaveKeypair } from '../key-auth.js';
8
+ /**
9
+ * Regression: a failed memory write must NOT look like a success.
10
+ *
11
+ * aisPost() used to return res.json() even on a non-2xx status, so a 422
12
+ * (content rejected) or 429 (over quota) response was handed back as an
13
+ * ordinary tool result and `remember` recorded it as stored. The agent
14
+ * believed it had remembered something it had not — the documented
15
+ * "AIS memory writes fail silently" symptom.
16
+ *
17
+ * After the fix, any non-2xx (other than a token-rejection, which feeds the
18
+ * re-auth loop) throws AisHttpError, which the MCP handler renders as
19
+ * `isError: true` with an unmistakable failure message.
20
+ */
21
+ const TOKEN = mintJwt('fresh-token');
22
+ function mintJwt(marker) {
23
+ const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
24
+ const payload = Buffer.from(JSON.stringify({ sub: 'user-1', user_id: 'user-1', tenant_id: 'tenant-1', marker })).toString('base64url');
25
+ return `${header}.${payload}.fakesig-${marker}`;
26
+ }
27
+ describe('aismemory MCP surfaces failed memory writes', () => {
28
+ let fakeAis;
29
+ let port = 0;
30
+ beforeAll(async () => {
31
+ fakeAis = createServer((req, res) => {
32
+ req.on('data', () => { });
33
+ req.on('end', () => {
34
+ // The one path under test: a memory write the server rejects (422).
35
+ if (req.url === '/v1/agents/agent-1/memory' && req.method === 'POST') {
36
+ res.writeHead(422, { 'content-type': 'application/json' });
37
+ res.end(JSON.stringify({
38
+ success: false,
39
+ error: { code: 'CONTENT_FLAGGED', message: 'content rejected by safety pipeline' },
40
+ }));
41
+ return;
42
+ }
43
+ // Everything else (whoami / hydration / refresh) succeeds so the
44
+ // binary reaches a steady state and the remember call is the only
45
+ // failing request.
46
+ res.writeHead(200, { 'content-type': 'application/json' });
47
+ res.end(JSON.stringify({
48
+ success: true,
49
+ data: { id: 'agent-1', name: 'TestAgent', status: 'active', agents: [], recentMemories: [], goals: [] },
50
+ }));
51
+ });
52
+ });
53
+ await new Promise((r) => {
54
+ fakeAis.listen(0, '127.0.0.1', () => {
55
+ const addr = fakeAis.address();
56
+ if (addr && typeof addr === 'object')
57
+ port = addr.port;
58
+ r();
59
+ });
60
+ });
61
+ });
62
+ afterAll(async () => {
63
+ await new Promise((r) => fakeAis?.close(() => r()));
64
+ });
65
+ it('returns an MCP error (not a fake success) when the write is rejected', async () => {
66
+ const distPath = resolve(__dirname, '..', '..', 'dist', 'index.js');
67
+ if (!existsSync(distPath)) {
68
+ throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
69
+ }
70
+ const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-writefail-'));
71
+ const aismemDir = join(fakeHome, '.aismemory');
72
+ mkdirSync(aismemDir, { recursive: true });
73
+ writeFileSync(join(aismemDir, 'credentials.json'), JSON.stringify({
74
+ token: TOKEN,
75
+ agentId: 'agent-1',
76
+ tenantId: 'tenant-1',
77
+ expiresAt: new Date(Date.now() + 30 * 24 * 3600 * 1000).toISOString(),
78
+ }));
79
+ await generateAndSaveKeypair({
80
+ userId: 'user-1',
81
+ userDid: 'did:web:test:users:user-1',
82
+ keysDir: join(aismemDir, 'keys'),
83
+ });
84
+ let proc = null;
85
+ try {
86
+ proc = spawn('node', [distPath], {
87
+ env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
88
+ stdio: ['pipe', 'pipe', 'pipe'],
89
+ });
90
+ let stdoutBuf = '';
91
+ proc.stdout.on('data', (d) => { stdoutBuf += d.toString(); });
92
+ proc.stderr.on('data', () => { });
93
+ proc.stdin.write(JSON.stringify({
94
+ jsonrpc: '2.0', id: 1, method: 'initialize',
95
+ params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'writefail-test', version: '0.0.0' } },
96
+ }) + '\n');
97
+ await waitFor(() => stdoutBuf.includes('"id":1'), 5000, 'initialize response');
98
+ proc.stdin.write(JSON.stringify({
99
+ jsonrpc: '2.0', id: 2, method: 'tools/call',
100
+ params: { name: 'remember', arguments: { content: 'a fact the server will reject', type: 'fact' } },
101
+ }) + '\n');
102
+ await waitFor(() => stdoutBuf.includes('"id":2'), 15000, 'remember response');
103
+ const result = extractResult(stdoutBuf, 2);
104
+ // The failure must be visible to the agent, not masked as success.
105
+ expect(result.isError).toBe(true);
106
+ expect(result.text).toMatch(/did NOT succeed/i);
107
+ expect(result.text).toContain('422');
108
+ }
109
+ finally {
110
+ proc?.kill();
111
+ }
112
+ }, 30000);
113
+ });
114
+ function waitFor(predicate, ms, label) {
115
+ return new Promise((resolveOuter, reject) => {
116
+ const start = Date.now();
117
+ const tick = () => {
118
+ if (predicate()) {
119
+ resolveOuter();
120
+ return;
121
+ }
122
+ if (Date.now() - start > ms) {
123
+ reject(new Error(`timeout waiting for ${label}`));
124
+ return;
125
+ }
126
+ setTimeout(tick, 50);
127
+ };
128
+ tick();
129
+ });
130
+ }
131
+ function extractResult(buf, id) {
132
+ for (const line of buf.split('\n')) {
133
+ if (!line.includes(`"id":${id}`))
134
+ continue;
135
+ try {
136
+ const parsed = JSON.parse(line);
137
+ if (parsed.result) {
138
+ return {
139
+ isError: parsed.result.isError === true,
140
+ text: parsed.result.content?.[0]?.text ?? '',
141
+ };
142
+ }
143
+ }
144
+ catch { /* malformed line; skip */ }
145
+ }
146
+ return { isError: false, text: '' };
147
+ }
148
+ //# sourceMappingURL=memory-write-failure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-write-failure.test.js","sourceRoot":"","sources":["../../src/__tests__/memory-write-failure.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtempSync, rmSync, statSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { credentialsDir, credentialsFilePath, loadOAuthCredentials, saveOAuthCredentials, } from '../oauth-credentials.js';
6
+ describe('saveOAuthCredentials', () => {
7
+ let tmpHome;
8
+ beforeEach(() => {
9
+ tmpHome = mkdtempSync(join(tmpdir(), 'aismem-oauth-'));
10
+ });
11
+ afterEach(() => rmSync(tmpHome, { recursive: true, force: true }));
12
+ it('writes credentials.json with mode 0600 and parent dir 0700 on POSIX', () => {
13
+ const creds = {
14
+ token: 'test-token',
15
+ agentId: 'agent-1',
16
+ tenantId: 'tenant-1',
17
+ expiresAt: new Date(Date.now() + 3600_000).toISOString(),
18
+ };
19
+ saveOAuthCredentials(creds, tmpHome);
20
+ const dir = credentialsDir(tmpHome);
21
+ const file = credentialsFilePath(tmpHome);
22
+ expect(loadOAuthCredentials(tmpHome)).toEqual(creds);
23
+ if (process.platform !== 'win32') {
24
+ expect(statSync(dir).mode & 0o777).toBe(0o700);
25
+ expect(statSync(file).mode & 0o777).toBe(0o600);
26
+ }
27
+ });
28
+ });
29
+ //# sourceMappingURL=oauth-credentials.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-credentials.test.js","sourceRoot":"","sources":["../../src/__tests__/oauth-credentials.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAEjC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnE,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE;SACzD,CAAC;QACF,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAErD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -2,7 +2,7 @@ import { describe, it, expect, vi } from 'vitest';
2
2
  import { readFileSync, readdirSync, statSync, rmSync, mkdtempSync } from 'node:fs';
3
3
  import { tmpdir } from 'node:os';
4
4
  import { join } from 'node:path';
5
- import { runIngestion } from '../pipeline/ingestion.js';
5
+ import { runIngestion, BULK_BATCH_SIZE } from '../pipeline/ingestion.js';
6
6
  import { LocalClaudeSource } from '../sources/local-claude.js';
7
7
  import { SyncConfig } from '../config.js';
8
8
  import { TrustLedger } from '../trust-ledger.js';
@@ -128,6 +128,117 @@ describe('runIngestion', () => {
128
128
  rmSync(tmpHome, { recursive: true, force: true });
129
129
  }
130
130
  });
131
+ it('does not advance trust ledger when bulkStore has partial failures', async () => {
132
+ const fs = readFixtureFs(FIXTURE_PATH);
133
+ const tmpHome = mkdtempSync(join(tmpdir(), 'aismem-partialfail-'));
134
+ try {
135
+ const config = new SyncConfig(tmpHome);
136
+ const ledger = new TrustLedger(tmpHome);
137
+ const mirror = new LocalMirror(tmpHome, 30);
138
+ const scopeKey = `project||${FIXTURE_PATH}|partialfail`;
139
+ const recordSyncSpy = vi.spyOn(ledger, 'recordSync');
140
+ const result = await runIngestion({
141
+ adapter: new LocalClaudeSource(),
142
+ rawSourceData: fs,
143
+ scope: { kind: 'project', label: 'partialfail', projectPath: FIXTURE_PATH },
144
+ agentId: 'agent1',
145
+ config,
146
+ ledger,
147
+ mirror,
148
+ existingHashes: new Set(),
149
+ bulkStore: async (drafts) => ({
150
+ created: drafts.length > 0 ? [{ index: 0, id: 'm-0' }] : [],
151
+ failed: drafts.length > 1 ? [{ index: 1, error: 'ais rejected' }] : [],
152
+ }),
153
+ review: async (d) => d,
154
+ });
155
+ expect(result.failed.length).toBeGreaterThan(0);
156
+ expect(recordSyncSpy).not.toHaveBeenCalled();
157
+ expect(ledger.isTrusted('agent1', 'claude-local', scopeKey)).toBe(false);
158
+ // Two partial-failure runs must not reach auto-commit trust (syncCount would be 2).
159
+ await runIngestion({
160
+ adapter: new LocalClaudeSource(),
161
+ rawSourceData: fs,
162
+ scope: { kind: 'project', label: 'partialfail', projectPath: FIXTURE_PATH },
163
+ agentId: 'agent1',
164
+ config,
165
+ ledger,
166
+ mirror,
167
+ existingHashes: new Set(),
168
+ bulkStore: async (drafts) => ({
169
+ created: drafts.length > 0 ? [{ index: 0, id: 'm-0' }] : [],
170
+ failed: drafts.length > 1 ? [{ index: 1, error: 'ais rejected' }] : [],
171
+ }),
172
+ review: async (d) => d,
173
+ });
174
+ expect(ledger.isTrusted('agent1', 'claude-local', scopeKey)).toBe(false);
175
+ }
176
+ finally {
177
+ rmSync(tmpHome, { recursive: true, force: true });
178
+ }
179
+ });
180
+ it('splits >100 approved drafts into chunks of at most BULK_BATCH_SIZE', async () => {
181
+ // Build 203 synthetic drafts by repeating a fixture-derived draft with unique content
182
+ const tmpHome = mkdtempSync(join(tmpdir(), 'aismem-chunk-'));
183
+ try {
184
+ const config = new SyncConfig(tmpHome);
185
+ const ledger = new TrustLedger(tmpHome);
186
+ const mirror = new LocalMirror(tmpHome, 30);
187
+ const batchSizes = [];
188
+ const bulkStore = vi.fn(async (drafts) => {
189
+ batchSizes.push(drafts.length);
190
+ return {
191
+ created: drafts.map((_, i) => ({ index: i, id: `m-${batchSizes.length}-${i}` })),
192
+ failed: [],
193
+ };
194
+ });
195
+ // Generate 203 unique drafts
196
+ const fakeDrafts = Array.from({ length: 203 }, (_, i) => ({
197
+ content: `synthetic memory entry number ${i}`,
198
+ type: 'fact',
199
+ importance: 0.5,
200
+ trustScore: 0.5,
201
+ provenance: {
202
+ source: 'claude-local',
203
+ sourceHash: `hash-${i}`,
204
+ importedAt: new Date().toISOString(),
205
+ importedBy: 'agent1',
206
+ sourceScope: { kind: 'project', label: 'chunk-test' },
207
+ sourcePrompt: '',
208
+ },
209
+ }));
210
+ // Use a custom adapter stub that returns our 203 fake drafts
211
+ const stubAdapter = {
212
+ id: 'claude-local',
213
+ parseResponse: () => ({ memories: fakeDrafts, warnings: [] }),
214
+ mapToAis: (_src, _scope, _agentId) => _src,
215
+ };
216
+ const result = await runIngestion({
217
+ adapter: stubAdapter,
218
+ rawSourceData: '',
219
+ scope: { kind: 'project', label: 'chunk-test', projectPath: '/tmp' },
220
+ agentId: 'agent1',
221
+ config,
222
+ ledger,
223
+ mirror,
224
+ existingHashes: new Set(),
225
+ bulkStore,
226
+ review: async (d) => d,
227
+ });
228
+ expect(result.imported).toBe(203);
229
+ expect(result.failed).toHaveLength(0);
230
+ // Must have called bulkStore multiple times, never exceeding BULK_BATCH_SIZE
231
+ expect(batchSizes.length).toBeGreaterThan(1);
232
+ for (const size of batchSizes) {
233
+ expect(size).toBeLessThanOrEqual(BULK_BATCH_SIZE);
234
+ }
235
+ // Total items across all batches equals 203
236
+ expect(batchSizes.reduce((a, b) => a + b, 0)).toBe(203);
237
+ }
238
+ finally {
239
+ rmSync(tmpHome, { recursive: true, force: true });
240
+ }
241
+ });
131
242
  it('dedupes against existingHashes', async () => {
132
243
  const fs = readFixtureFs(FIXTURE_PATH);
133
244
  const source = new LocalClaudeSource();
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-ingestion.test.js","sourceRoot":"","sources":["../../src/__tests__/pipeline-ingestion.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-ingestion.test.js","sourceRoot":"","sources":["../../src/__tests__/pipeline-ingestion.test.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,30 @@ describe('startRefreshTimer', () => {
51
51
  expect(mockFetch).toHaveBeenCalledTimes(2);
52
52
  expect(onUpdate).not.toHaveBeenCalled();
53
53
  });
54
+ it('restarting with a new agentId switches the fetch target (agent_load pattern)', async () => {
55
+ const newAgentMemories = [
56
+ { id: 'm2', content: 'Other agent memory', type: 'episodic', importance: 0.9, createdAt: '2026-01-02T00:00:00Z' },
57
+ ];
58
+ const mockFetch = vi
59
+ .fn()
60
+ .mockResolvedValueOnce({
61
+ ok: true,
62
+ json: vi.fn().mockResolvedValue({ success: true, data: { memories: mockMemories } }),
63
+ })
64
+ .mockResolvedValueOnce({
65
+ ok: true,
66
+ json: vi.fn().mockResolvedValue({ success: true, data: { memories: newAgentMemories } }),
67
+ });
68
+ vi.stubGlobal('fetch', mockFetch);
69
+ const onUpdate = vi.fn();
70
+ startRefreshTimer(MOCK_AIS_URL, MOCK_AGENT_ID, MOCK_TOKEN, onUpdate, INTERVAL_MS);
71
+ await vi.advanceTimersByTimeAsync(INTERVAL_MS);
72
+ const newAgentId = 'agent-456';
73
+ startRefreshTimer(MOCK_AIS_URL, newAgentId, MOCK_TOKEN, onUpdate, INTERVAL_MS);
74
+ await vi.advanceTimersByTimeAsync(INTERVAL_MS);
75
+ expect(mockFetch).toHaveBeenLastCalledWith(`${MOCK_AIS_URL}/v1/agents/${newAgentId}/memory?limit=20&minImportance=0.5`, { headers: { Authorization: `Bearer ${MOCK_TOKEN}` } });
76
+ expect(onUpdate).toHaveBeenLastCalledWith(newAgentMemories);
77
+ });
54
78
  it('stopRefreshTimer clears the interval so no more callbacks fire', async () => {
55
79
  const mockFetch = makeFetchMock(true, {
56
80
  success: true,
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.test.js","sourceRoot":"","sources":["../../src/__tests__/refresh.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refresh.test.js","sourceRoot":"","sources":["../../src/__tests__/refresh.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Unit tests for CORBOT-452ED9F0: AIS bulk memory writes timeout resilience.
3
+ *
4
+ * Tests the exported helpers in pipeline/bulk-store.ts:
5
+ * - bulkStoreViaAis: chunks at BULK_CHUNK_SIZE (25)
6
+ * - writeWithRetry: recursive split on AbortError / 5xx
7
+ * - postSingleWrite: per-item fallback
8
+ * - singleWriteAllViaAis: --single-write operator mode
9
+ */
10
+ import { describe, it, expect, vi, afterEach } from 'vitest';
11
+ import { bulkStoreViaAis, singleWriteAllViaAis, writeWithRetry, postSingleWrite, BULK_CHUNK_SIZE, } from '../pipeline/bulk-store.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ const CREDS = { apiBase: 'https://ais.test', apiKey: 'key', tenantId: 'tenant' };
16
+ const AGENT = 'agent1';
17
+ // Use a very long timeout in tests so AbortController doesn't fire on its own.
18
+ const LONG_TIMEOUT = 60_000;
19
+ function makeDraft(i) {
20
+ const prov = {
21
+ source: 'claude-local',
22
+ sourceHash: `hash-${i}`,
23
+ importedAt: new Date().toISOString(),
24
+ importedBy: AGENT,
25
+ sourceScope: { kind: 'project', label: 'test' },
26
+ sourcePrompt: '',
27
+ };
28
+ return { content: `memory ${i}`, type: 'fact', importance: 0.5, trustScore: 0.5, provenance: prov };
29
+ }
30
+ function makeDrafts(n) {
31
+ return Array.from({ length: n }, (_, i) => makeDraft(i));
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ afterEach(() => {
35
+ vi.unstubAllGlobals();
36
+ });
37
+ // ---------------------------------------------------------------------------
38
+ // bulkStoreViaAis — chunked writes
39
+ // ---------------------------------------------------------------------------
40
+ describe('bulkStoreViaAis', () => {
41
+ it(`chunks ${BULK_CHUNK_SIZE + 5} drafts into two POST calls`, async () => {
42
+ const total = BULK_CHUNK_SIZE + 5;
43
+ const drafts = makeDrafts(total);
44
+ const chunkSizes = [];
45
+ vi.stubGlobal('fetch', async (_url, init) => {
46
+ const body = JSON.parse(init?.body);
47
+ chunkSizes.push(body.memories.length);
48
+ const created = body.memories.map((_, idx) => ({ index: idx, id: `id-${idx}` }));
49
+ return new Response(JSON.stringify({ data: { created, failed: [] } }), { status: 200, headers: { 'Content-Type': 'application/json' } });
50
+ });
51
+ const result = await bulkStoreViaAis(AGENT, drafts, CREDS);
52
+ expect(chunkSizes).toHaveLength(2);
53
+ expect(chunkSizes[0]).toBe(BULK_CHUNK_SIZE);
54
+ expect(chunkSizes[1]).toBe(5);
55
+ expect(result.created).toHaveLength(total);
56
+ expect(result.failed).toHaveLength(0);
57
+ });
58
+ it('remaps chunk-local indices to global indices', async () => {
59
+ const drafts = makeDrafts(BULK_CHUNK_SIZE + 2);
60
+ vi.stubGlobal('fetch', async (_url, init) => {
61
+ const body = JSON.parse(init?.body);
62
+ const created = body.memories.map((_, idx) => ({ index: idx, id: `id-${idx}` }));
63
+ return new Response(JSON.stringify({ data: { created, failed: [] } }), { status: 200, headers: { 'Content-Type': 'application/json' } });
64
+ });
65
+ const result = await bulkStoreViaAis(AGENT, drafts, CREDS);
66
+ // Global indices must be 0..N-1 with no duplicates
67
+ const indices = result.created.map((c) => c.index).sort((a, b) => a - b);
68
+ expect(indices).toEqual(Array.from({ length: drafts.length }, (_, i) => i));
69
+ });
70
+ });
71
+ // ---------------------------------------------------------------------------
72
+ // writeWithRetry — recursive split on transient errors
73
+ // ---------------------------------------------------------------------------
74
+ describe('writeWithRetry', () => {
75
+ it('splits on AbortError and falls through to single writes', async () => {
76
+ const drafts = makeDrafts(4);
77
+ const callLog = [];
78
+ vi.stubGlobal('fetch', async (_url, init) => {
79
+ const body = JSON.parse(init?.body);
80
+ if (body.memories && body.memories.length > 1) {
81
+ callLog.push(`bulk:${body.memories.length}`);
82
+ const err = new Error('The operation was aborted');
83
+ err.name = 'AbortError';
84
+ throw err;
85
+ }
86
+ // Single-write endpoint
87
+ callLog.push('single');
88
+ const id = `sid-${callLog.filter((l) => l === 'single').length}`;
89
+ return new Response(JSON.stringify({ data: { id } }), { status: 200, headers: { 'Content-Type': 'application/json' } });
90
+ });
91
+ const baseIndices = drafts.map((_, i) => i);
92
+ const result = await writeWithRetry(AGENT, drafts, baseIndices, CREDS, LONG_TIMEOUT);
93
+ // Four single writes must have happened
94
+ expect(callLog.filter((l) => l === 'single')).toHaveLength(4);
95
+ expect(result.created).toHaveLength(4);
96
+ expect(result.failed).toHaveLength(0);
97
+ });
98
+ it('splits on HTTP 502 response', async () => {
99
+ const drafts = makeDrafts(2);
100
+ const callLog = [];
101
+ vi.stubGlobal('fetch', async (_url, init) => {
102
+ const body = JSON.parse(init?.body);
103
+ if (body.memories && body.memories.length > 1) {
104
+ callLog.push('bulk-502');
105
+ return new Response('Bad Gateway', { status: 502 });
106
+ }
107
+ callLog.push('single');
108
+ return new Response(JSON.stringify({ data: { id: 'sid' } }), { status: 200, headers: { 'Content-Type': 'application/json' } });
109
+ });
110
+ const result = await writeWithRetry(AGENT, drafts, [0, 1], CREDS, LONG_TIMEOUT);
111
+ expect(callLog).toContain('bulk-502');
112
+ expect(callLog.filter((l) => l === 'single')).toHaveLength(2);
113
+ expect(result.created).toHaveLength(2);
114
+ expect(result.failed).toHaveLength(0);
115
+ });
116
+ it('throws immediately on 401 auth error without splitting', async () => {
117
+ const drafts = makeDrafts(4);
118
+ const fetchCallCount = { n: 0 };
119
+ vi.stubGlobal('fetch', async () => {
120
+ fetchCallCount.n++;
121
+ return new Response('Unauthorized', { status: 401 });
122
+ });
123
+ await expect(writeWithRetry(AGENT, drafts, [0, 1, 2, 3], CREDS, LONG_TIMEOUT)).rejects.toThrow('auth error');
124
+ // Only one fetch call — no splitting attempted
125
+ expect(fetchCallCount.n).toBe(1);
126
+ });
127
+ it('retries per-item bulk failures via single write', async () => {
128
+ const drafts = makeDrafts(3);
129
+ vi.stubGlobal('fetch', async (_url, init) => {
130
+ const body = JSON.parse(init?.body);
131
+ if (body.memories) {
132
+ return new Response(JSON.stringify({
133
+ data: {
134
+ created: [{ index: 0, id: 'bulk-id-0' }],
135
+ failed: [
136
+ { index: 1, error: 'validation error' },
137
+ { index: 2, error: 'duplicate' },
138
+ ],
139
+ },
140
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } });
141
+ }
142
+ // Single write fallback succeeds
143
+ return new Response(JSON.stringify({ data: { id: 'single-id' } }), { status: 200, headers: { 'Content-Type': 'application/json' } });
144
+ });
145
+ const result = await writeWithRetry(AGENT, drafts, [0, 1, 2], CREDS, LONG_TIMEOUT);
146
+ // All three should be created (1 from bulk + 2 from single retries)
147
+ expect(result.created).toHaveLength(3);
148
+ expect(result.failed).toHaveLength(0);
149
+ });
150
+ });
151
+ // ---------------------------------------------------------------------------
152
+ // postSingleWrite — single-write fallback
153
+ // ---------------------------------------------------------------------------
154
+ describe('postSingleWrite', () => {
155
+ it('returns created entry on success', async () => {
156
+ vi.stubGlobal('fetch', async () => new Response(JSON.stringify({ data: { id: 'new-id' } }), { status: 200, headers: { 'Content-Type': 'application/json' } }));
157
+ const result = await postSingleWrite(AGENT, makeDraft(0), 5, CREDS, LONG_TIMEOUT);
158
+ expect(result.created).toEqual([{ index: 5, id: 'new-id' }]);
159
+ expect(result.failed).toHaveLength(0);
160
+ });
161
+ it('returns failed entry on non-auth HTTP error', async () => {
162
+ vi.stubGlobal('fetch', async () => new Response('Internal Server Error', { status: 500 }));
163
+ const result = await postSingleWrite(AGENT, makeDraft(0), 3, CREDS, LONG_TIMEOUT);
164
+ expect(result.created).toHaveLength(0);
165
+ expect(result.failed[0].index).toBe(3);
166
+ });
167
+ it('returns failed entry on AbortError (timeout)', async () => {
168
+ vi.stubGlobal('fetch', async () => {
169
+ const err = new Error('aborted');
170
+ err.name = 'AbortError';
171
+ throw err;
172
+ });
173
+ const result = await postSingleWrite(AGENT, makeDraft(0), 7, CREDS, LONG_TIMEOUT);
174
+ expect(result.failed[0]).toMatchObject({ index: 7, error: 'request timed out' });
175
+ });
176
+ it('throws on 401', async () => {
177
+ vi.stubGlobal('fetch', async () => new Response('Unauthorized', { status: 401 }));
178
+ await expect(postSingleWrite(AGENT, makeDraft(0), 0, CREDS, LONG_TIMEOUT)).rejects.toThrow('auth error');
179
+ });
180
+ });
181
+ // ---------------------------------------------------------------------------
182
+ // singleWriteAllViaAis — --single-write operator mode
183
+ // ---------------------------------------------------------------------------
184
+ describe('singleWriteAllViaAis', () => {
185
+ it('writes all drafts individually and returns correct indices', async () => {
186
+ const drafts = makeDrafts(3);
187
+ let callCount = 0;
188
+ vi.stubGlobal('fetch', async () => {
189
+ const id = `s-${callCount++}`;
190
+ return new Response(JSON.stringify({ data: { id } }), { status: 200, headers: { 'Content-Type': 'application/json' } });
191
+ });
192
+ const result = await singleWriteAllViaAis(AGENT, drafts, CREDS);
193
+ expect(result.created).toHaveLength(3);
194
+ expect(result.failed).toHaveLength(0);
195
+ // Indices must be 0, 1, 2
196
+ const indices = result.created.map((c) => c.index).sort((a, b) => a - b);
197
+ expect(indices).toEqual([0, 1, 2]);
198
+ });
199
+ });
200
+ //# sourceMappingURL=sync-memory-cli.test.js.map