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 @@
1
+ {"version":3,"file":"sync-memory-cli.test.js","sourceRoot":"","sources":["../../src/__tests__/sync-memory-cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { emitTelemetry, hashAgentId, isTelemetryEnabled } from '../telemetry.js';
3
+ describe('telemetry', () => {
4
+ const prev = process.env['AISMEMORY_TELEMETRY'];
5
+ beforeEach(() => {
6
+ delete process.env['AISMEMORY_TELEMETRY'];
7
+ });
8
+ afterEach(() => {
9
+ if (prev === undefined) {
10
+ delete process.env['AISMEMORY_TELEMETRY'];
11
+ }
12
+ else {
13
+ process.env['AISMEMORY_TELEMETRY'] = prev;
14
+ }
15
+ });
16
+ it('is disabled by default', () => {
17
+ expect(isTelemetryEnabled()).toBe(false);
18
+ });
19
+ it('enables on AISMEMORY_TELEMETRY=1', () => {
20
+ process.env['AISMEMORY_TELEMETRY'] = '1';
21
+ expect(isTelemetryEnabled()).toBe(true);
22
+ });
23
+ it('hashAgentId is stable and non-reversible to raw id', () => {
24
+ const h1 = hashAgentId('agent-abc');
25
+ const h2 = hashAgentId('agent-abc');
26
+ const h3 = hashAgentId('agent-xyz');
27
+ expect(h1).toBe(h2);
28
+ expect(h1).toHaveLength(16);
29
+ expect(h1).not.toBe(h3);
30
+ expect(h1).not.toContain('agent-abc');
31
+ });
32
+ it('emitTelemetry writes JSON when enabled', () => {
33
+ process.env['AISMEMORY_TELEMETRY'] = 'true';
34
+ const lines = [];
35
+ const orig = process.stderr.write.bind(process.stderr);
36
+ process.stderr.write = ((chunk) => {
37
+ lines.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8'));
38
+ return true;
39
+ });
40
+ emitTelemetry({
41
+ event: 'tool.call',
42
+ tool: 'remember',
43
+ agentIdHash: hashAgentId('a1'),
44
+ latencyMs: 12,
45
+ status: 'ok',
46
+ });
47
+ process.stderr.write = orig;
48
+ expect(lines).toHaveLength(1);
49
+ expect(lines[0]).toMatch(/^\[aismemory-telemetry\] /);
50
+ const parsed = JSON.parse(lines[0].replace(/^\[aismemory-telemetry\] /, '').trim());
51
+ expect(parsed.event).toBe('tool.call');
52
+ expect(parsed.tool).toBe('remember');
53
+ expect(parsed.status).toBe('ok');
54
+ });
55
+ it('emitTelemetry is a no-op when disabled', () => {
56
+ let called = false;
57
+ const orig = process.stderr.write.bind(process.stderr);
58
+ process.stderr.write = (() => {
59
+ called = true;
60
+ return true;
61
+ });
62
+ emitTelemetry({ event: 'auth.device_flow.start' });
63
+ process.stderr.write = orig;
64
+ expect(called).toBe(false);
65
+ });
66
+ });
67
+ //# sourceMappingURL=telemetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../src/__tests__/telemetry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,201 @@
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, beforeEach } from 'vitest';
7
+ import { generateAndSaveKeypair } from '../key-auth.js';
8
+ /**
9
+ * Regression: mid-session TOKEN_EXPIRED failures (CORBOT-A5BBD580).
10
+ *
11
+ * The MCP checked credential expiry only when loading credentials.json at
12
+ * startup; ensureCredentials() returned the cached creds forever after, and
13
+ * no TOKEN_EXPIRED response ever cleared them. A session starting inside the
14
+ * final hours of the 7-day token life expired mid-session and every memory
15
+ * write failed until the process was restarted — observed 2026-05-24,
16
+ * 2026-05-31, 2026-06-09.
17
+ *
18
+ * After the fix:
19
+ * 1. ensureCredentials() treats creds expiring within a safety margin as
20
+ * stale and silently re-runs key auth (challenge → did-prove).
21
+ * 2. A TOKEN_EXPIRED / INVALID_TOKEN response from any tool call clears
22
+ * the cached creds, re-auths, and retries the call once.
23
+ *
24
+ * Both scenarios drive the real binary against a fake AIS server, with a
25
+ * key file present in the fake HOME so re-auth is silent (no device flow).
26
+ */
27
+ const OLD_TOKEN = mintJwt('old-session-token');
28
+ const NEW_TOKEN = mintJwt('fresh-after-reauth');
29
+ function mintJwt(marker) {
30
+ const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
31
+ const payload = Buffer.from(JSON.stringify({ sub: 'user-1', user_id: 'user-1', tenant_id: 'tenant-1', marker })).toString('base64url');
32
+ return `${header}.${payload}.fakesig-${marker}`;
33
+ }
34
+ describe('aismemory MCP token-expiry re-auth', () => {
35
+ let fakeAis;
36
+ let port = 0;
37
+ let didProveCalls = 0;
38
+ const agentTokensSeen = [];
39
+ beforeAll(async () => {
40
+ fakeAis = createServer((req, res) => {
41
+ req.on('data', () => { });
42
+ req.on('end', () => {
43
+ const auth = (req.headers['authorization'] ?? '').replace('Bearer ', '');
44
+ if (req.url === '/v1/auth/challenge' && req.method === 'POST') {
45
+ res.writeHead(200, { 'content-type': 'application/json' });
46
+ res.end(JSON.stringify({
47
+ success: true,
48
+ data: { nonce: 'test-nonce', exp: Math.floor(Date.now() / 1000) + 60, hmac: 'test-hmac' },
49
+ }));
50
+ return;
51
+ }
52
+ if (req.url === '/v1/auth/did-prove' && req.method === 'POST') {
53
+ didProveCalls += 1;
54
+ res.writeHead(200, { 'content-type': 'application/json' });
55
+ res.end(JSON.stringify({
56
+ success: true,
57
+ data: {
58
+ bearerToken: NEW_TOKEN,
59
+ expiresAt: new Date(Date.now() + 7 * 24 * 3600 * 1000).toISOString(),
60
+ },
61
+ }));
62
+ return;
63
+ }
64
+ if (req.url?.startsWith('/v1/agents') && req.method === 'GET') {
65
+ agentTokensSeen.push(auth);
66
+ if (auth !== NEW_TOKEN) {
67
+ res.writeHead(401, { 'content-type': 'application/json' });
68
+ res.end(JSON.stringify({ success: false, error: { code: 'TOKEN_EXPIRED', message: 'Token expired' } }));
69
+ return;
70
+ }
71
+ if (req.url === '/v1/agents') {
72
+ res.writeHead(200, { 'content-type': 'application/json' });
73
+ res.end(JSON.stringify({
74
+ success: true,
75
+ data: { agents: [{ id: 'agent-1', name: 'TestAgent', status: 'active' }] },
76
+ }));
77
+ return;
78
+ }
79
+ if (req.url === '/v1/agents/agent-1') {
80
+ res.writeHead(200, { 'content-type': 'application/json' });
81
+ res.end(JSON.stringify({
82
+ success: true,
83
+ data: { id: 'agent-1', name: 'TestAgent', status: 'active' },
84
+ }));
85
+ return;
86
+ }
87
+ }
88
+ // Hydration / memory refresh / telemetry — irrelevant here.
89
+ res.writeHead(404, { 'content-type': 'application/json' });
90
+ res.end(JSON.stringify({ success: false, error: { code: 'NOT_FOUND' } }));
91
+ });
92
+ });
93
+ await new Promise((r) => {
94
+ fakeAis.listen(0, '127.0.0.1', () => {
95
+ const addr = fakeAis.address();
96
+ if (addr && typeof addr === 'object')
97
+ port = addr.port;
98
+ r();
99
+ });
100
+ });
101
+ });
102
+ afterAll(async () => {
103
+ await new Promise((r) => fakeAis?.close(() => r()));
104
+ });
105
+ beforeEach(() => {
106
+ didProveCalls = 0;
107
+ agentTokensSeen.length = 0;
108
+ });
109
+ async function runWhoami(credsExpiresAt) {
110
+ const distPath = resolve(__dirname, '..', '..', 'dist', 'index.js');
111
+ if (!existsSync(distPath)) {
112
+ throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
113
+ }
114
+ const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-reauth-'));
115
+ const aismemDir = join(fakeHome, '.aismemory');
116
+ mkdirSync(aismemDir, { recursive: true });
117
+ writeFileSync(join(aismemDir, 'credentials.json'), JSON.stringify({
118
+ token: OLD_TOKEN,
119
+ agentId: 'agent-1',
120
+ tenantId: 'tenant-1',
121
+ expiresAt: credsExpiresAt,
122
+ }));
123
+ await generateAndSaveKeypair({
124
+ userId: 'user-1',
125
+ userDid: 'did:web:test:users:user-1',
126
+ keysDir: join(aismemDir, 'keys'),
127
+ });
128
+ let proc = null;
129
+ try {
130
+ proc = spawn('node', [distPath], {
131
+ env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
132
+ stdio: ['pipe', 'pipe', 'pipe'],
133
+ });
134
+ let stdoutBuf = '';
135
+ proc.stdout.on('data', (d) => { stdoutBuf += d.toString(); });
136
+ proc.stderr.on('data', () => { });
137
+ proc.stdin.write(JSON.stringify({
138
+ jsonrpc: '2.0', id: 1, method: 'initialize',
139
+ params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'reauth-test', version: '0.0.0' } },
140
+ }) + '\n');
141
+ await waitFor(() => stdoutBuf.includes('"id":1'), 5000, 'initialize response');
142
+ proc.stdin.write(JSON.stringify({
143
+ jsonrpc: '2.0', id: 2, method: 'tools/call',
144
+ params: { name: 'whoami', arguments: {} },
145
+ }) + '\n');
146
+ await waitFor(() => stdoutBuf.includes('"id":2'), 15000, 'whoami response');
147
+ return extractResponseText(stdoutBuf, 2);
148
+ }
149
+ finally {
150
+ proc?.kill();
151
+ }
152
+ }
153
+ it('re-auths via key file and retries once when AIS rejects the stored token', async () => {
154
+ // Creds look fresh by clock (30 days out) but the server rejects them —
155
+ // covers server-side rotation/expiry discovered only on use.
156
+ const response = await runWhoami(new Date(Date.now() + 30 * 24 * 3600 * 1000).toISOString());
157
+ expect(didProveCalls).toBe(1);
158
+ expect(response).toContain('TestAgent');
159
+ expect(response).not.toContain('TOKEN_EXPIRED');
160
+ }, 30000);
161
+ it('refuses near-expiry cached creds and re-auths before using them', async () => {
162
+ // Creds expire in 60s — inside the safety margin. The old token must
163
+ // never reach the API.
164
+ const response = await runWhoami(new Date(Date.now() + 60 * 1000).toISOString());
165
+ expect(didProveCalls).toBe(1);
166
+ expect(agentTokensSeen).not.toContain(OLD_TOKEN);
167
+ expect(response).toContain('TestAgent');
168
+ }, 30000);
169
+ });
170
+ function waitFor(predicate, ms, label) {
171
+ return new Promise((resolveOuter, reject) => {
172
+ const start = Date.now();
173
+ const tick = () => {
174
+ if (predicate()) {
175
+ resolveOuter();
176
+ return;
177
+ }
178
+ if (Date.now() - start > ms) {
179
+ reject(new Error(`timeout waiting for ${label}`));
180
+ return;
181
+ }
182
+ setTimeout(tick, 50);
183
+ };
184
+ tick();
185
+ });
186
+ }
187
+ function extractResponseText(buf, id) {
188
+ for (const line of buf.split('\n')) {
189
+ if (!line.includes(`"id":${id}`))
190
+ continue;
191
+ try {
192
+ const parsed = JSON.parse(line);
193
+ const text = parsed.result?.content?.[0]?.text;
194
+ if (typeof text === 'string')
195
+ return text;
196
+ }
197
+ catch { /* malformed line; skip */ }
198
+ }
199
+ return '';
200
+ }
201
+ //# sourceMappingURL=token-expiry-reauth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-expiry-reauth.test.js","sourceRoot":"","sources":["../../src/__tests__/token-expiry-reauth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,78 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { MAX_MEMORY_CONTENT_LENGTH, parseAgentLoadArgs, parseEmptyToolArgs, parseHandoffArgs, parseRecallArgs, parseRememberArgs, } from '../tool-args.js';
3
+ describe('parseRememberArgs', () => {
4
+ it('accepts valid remember payload', () => {
5
+ const parsed = parseRememberArgs({
6
+ content: 'hello',
7
+ type: 'fact',
8
+ importance: 0.8,
9
+ });
10
+ expect(parsed).toEqual({ content: 'hello', type: 'fact', importance: 0.8 });
11
+ });
12
+ it('applies defaults for optional fields', () => {
13
+ expect(parseRememberArgs({ content: 'x' })).toEqual({
14
+ content: 'x',
15
+ type: 'context',
16
+ importance: 0.5,
17
+ });
18
+ });
19
+ it('rejects missing content', () => {
20
+ expect(() => parseRememberArgs({})).toThrow(/content is required/);
21
+ });
22
+ it('rejects invalid memory type', () => {
23
+ expect(() => parseRememberArgs({ content: 'x', type: 'invalid' })).toThrow();
24
+ });
25
+ it('rejects importance outside 0-1', () => {
26
+ expect(() => parseRememberArgs({ content: 'x', importance: 2 })).toThrow();
27
+ });
28
+ it('rejects oversized content', () => {
29
+ expect(() => parseRememberArgs({ content: 'x'.repeat(MAX_MEMORY_CONTENT_LENGTH + 1) })).toThrow(/exceeds maximum length/);
30
+ });
31
+ });
32
+ describe('parseRecallArgs', () => {
33
+ it('requires query', () => {
34
+ expect(() => parseRecallArgs({})).toThrow(/query is required/);
35
+ });
36
+ it('accepts query with optional limit and type', () => {
37
+ expect(parseRecallArgs({ query: 'cats', limit: 5, type: 'fact' })).toEqual({
38
+ query: 'cats',
39
+ limit: 5,
40
+ type: 'fact',
41
+ });
42
+ });
43
+ it('rejects limit above MAX_QUERY_LIMIT', () => {
44
+ expect(() => parseRecallArgs({ query: 'x', limit: 101 })).toThrow();
45
+ });
46
+ it('rejects oversized query', () => {
47
+ expect(() => parseRecallArgs({ query: 'q'.repeat(MAX_MEMORY_CONTENT_LENGTH + 1) })).toThrow(/exceeds maximum length/);
48
+ });
49
+ });
50
+ describe('parseHandoffArgs', () => {
51
+ it('accepts empty handoff args', () => {
52
+ expect(parseHandoffArgs({})).toEqual({});
53
+ });
54
+ it('accepts summary and keyLearnings', () => {
55
+ expect(parseHandoffArgs({ summary: 'done', keyLearnings: ['a', 'b'] })).toEqual({ summary: 'done', keyLearnings: ['a', 'b'] });
56
+ });
57
+ it('rejects too many keyLearnings', () => {
58
+ expect(() => parseHandoffArgs({ keyLearnings: Array.from({ length: 101 }, () => 'x') })).toThrow(/maximum of 100/);
59
+ });
60
+ });
61
+ describe('parseAgentLoadArgs', () => {
62
+ it('requires non-empty query', () => {
63
+ expect(() => parseAgentLoadArgs({})).toThrow(/query is required/);
64
+ expect(() => parseAgentLoadArgs({ query: ' ' })).toThrow(/query is required/);
65
+ });
66
+ it('trims whitespace from query', () => {
67
+ expect(parseAgentLoadArgs({ query: ' Corbot ' })).toEqual({ query: 'Corbot' });
68
+ });
69
+ });
70
+ describe('parseEmptyToolArgs', () => {
71
+ it('accepts empty object for no-arg tools', () => {
72
+ expect(parseEmptyToolArgs({})).toEqual({});
73
+ });
74
+ it('rejects unexpected keys', () => {
75
+ expect(() => parseEmptyToolArgs({ extra: true })).toThrow();
76
+ });
77
+ });
78
+ //# sourceMappingURL=tool-args.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-args.test.js","sourceRoot":"","sources":["../../src/__tests__/tool-args.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Typed error for non-2xx responses from the Agent Identity Service.
3
+ *
4
+ * Why this exists: aisPost/aisGet previously returned `res.json()` even on a
5
+ * non-2xx status, so a failed memory write (422 flagged content, 429 quota,
6
+ * 409 duplicate, 5xx) was handed back to the agent as an ordinary tool result
7
+ * — and `remember` recorded it as "stored" regardless. The agent believed it
8
+ * had remembered something it had not, which is the worst possible failure
9
+ * mode for a memory product. Throwing this error routes the failure through
10
+ * the MCP catch handler, which marks the tool response `isError: true` so the
11
+ * agent sees an unmistakable failure.
12
+ *
13
+ * Token-rejection bodies (TOKEN_EXPIRED / INVALID_TOKEN) are deliberately NOT
14
+ * thrown by the callers — those feed the silent re-auth-and-retry loop
15
+ * (see isAuthErrorResult in auth-staleness.ts).
16
+ */
17
+ /** Pull a human-readable message out of an AIS error body, if present. */
18
+ export declare function extractServerMessage(body: unknown): string | null;
19
+ /** Build the agent-facing message for a failed AIS request. */
20
+ export declare function formatAisHttpError(status: number, path: string, body: unknown): string;
21
+ export declare class AisHttpError extends Error {
22
+ readonly status: number;
23
+ readonly path: string;
24
+ readonly body: unknown;
25
+ constructor(status: number, path: string, body: unknown);
26
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Typed error for non-2xx responses from the Agent Identity Service.
3
+ *
4
+ * Why this exists: aisPost/aisGet previously returned `res.json()` even on a
5
+ * non-2xx status, so a failed memory write (422 flagged content, 429 quota,
6
+ * 409 duplicate, 5xx) was handed back to the agent as an ordinary tool result
7
+ * — and `remember` recorded it as "stored" regardless. The agent believed it
8
+ * had remembered something it had not, which is the worst possible failure
9
+ * mode for a memory product. Throwing this error routes the failure through
10
+ * the MCP catch handler, which marks the tool response `isError: true` so the
11
+ * agent sees an unmistakable failure.
12
+ *
13
+ * Token-rejection bodies (TOKEN_EXPIRED / INVALID_TOKEN) are deliberately NOT
14
+ * thrown by the callers — those feed the silent re-auth-and-retry loop
15
+ * (see isAuthErrorResult in auth-staleness.ts).
16
+ */
17
+ /** Pull a human-readable message out of an AIS error body, if present. */
18
+ export function extractServerMessage(body) {
19
+ if (typeof body !== 'object' || body === null) {
20
+ return typeof body === 'string' && body.trim() !== '' ? body : null;
21
+ }
22
+ const b = body;
23
+ if (typeof b.error === 'string' && b.error.trim() !== '')
24
+ return b.error;
25
+ if (typeof b.error === 'object' && b.error !== null) {
26
+ const e = b.error;
27
+ const parts = [];
28
+ if (typeof e.message === 'string' && e.message.trim() !== '')
29
+ parts.push(e.message);
30
+ if (typeof e.code === 'string' && e.code.trim() !== '')
31
+ parts.push(`(${e.code})`);
32
+ if (parts.length > 0)
33
+ return parts.join(' ');
34
+ }
35
+ if (typeof b.message === 'string' && b.message.trim() !== '')
36
+ return b.message;
37
+ return null;
38
+ }
39
+ /** A status-specific hint so the agent understands WHY the request failed. */
40
+ function statusHint(status) {
41
+ switch (status) {
42
+ case 409:
43
+ return 'duplicate — this memory already exists';
44
+ case 422:
45
+ return 'content rejected (validation/safety) — try plain ASCII, no smart quotes or arrows';
46
+ case 429:
47
+ return 'quota or rate limit exceeded';
48
+ case 401:
49
+ case 403:
50
+ return 'not authorized';
51
+ default:
52
+ if (status >= 500)
53
+ return 'AIS server error — retry later';
54
+ return 'request rejected';
55
+ }
56
+ }
57
+ /** Build the agent-facing message for a failed AIS request. */
58
+ export function formatAisHttpError(status, path, body) {
59
+ const serverMsg = extractServerMessage(body);
60
+ const detail = serverMsg ? `: ${serverMsg}` : '';
61
+ return `AIS request to ${path} failed — HTTP ${status} (${statusHint(status)})${detail}. The operation did NOT succeed.`;
62
+ }
63
+ export class AisHttpError extends Error {
64
+ status;
65
+ path;
66
+ body;
67
+ constructor(status, path, body) {
68
+ super(formatAisHttpError(status, path, body));
69
+ this.name = 'AisHttpError';
70
+ this.status = status;
71
+ this.path = path;
72
+ this.body = body;
73
+ }
74
+ }
75
+ //# sourceMappingURL=ais-http-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ais-http-error.js","sourceRoot":"","sources":["../src/ais-http-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Credential staleness + auth-error detection for the MCP re-auth loop.
3
+ *
4
+ * key-auth.ts promises: "When the JWT expires (or AIS rotates JWT_SECRET)
5
+ * the client silently re-runs challenge/prove. The user notices nothing."
6
+ * These helpers are the detection half of that promise (CORBOT-A5BBD580):
7
+ * ensureCredentials() uses isCredsStale() to refuse near-expiry cached
8
+ * creds, and the tool dispatcher uses isAuthErrorResult() to clear creds
9
+ * and retry once when AIS rejects a token mid-session.
10
+ */
11
+ /**
12
+ * Safety margin before the recorded expiry at which cached credentials are
13
+ * treated as stale. Five minutes comfortably covers clock skew between the
14
+ * client and AIS plus the duration of any single tool call.
15
+ */
16
+ export declare const CREDS_STALENESS_MARGIN_MS: number;
17
+ /**
18
+ * True when credentials expiring at `expiresAt` should no longer be used at
19
+ * time `nowMs`. Unparseable expiry timestamps are treated as stale — a
20
+ * re-auth is cheap, silently using a token of unknown validity is not.
21
+ */
22
+ export declare function isCredsStale(expiresAt: string, nowMs: number, marginMs?: number): boolean;
23
+ /**
24
+ * True when an AIS response body is a token-rejection error
25
+ * (TOKEN_EXPIRED or INVALID_TOKEN) — the signal to re-auth and retry.
26
+ */
27
+ export declare function isAuthErrorResult(result: unknown): boolean;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Credential staleness + auth-error detection for the MCP re-auth loop.
3
+ *
4
+ * key-auth.ts promises: "When the JWT expires (or AIS rotates JWT_SECRET)
5
+ * the client silently re-runs challenge/prove. The user notices nothing."
6
+ * These helpers are the detection half of that promise (CORBOT-A5BBD580):
7
+ * ensureCredentials() uses isCredsStale() to refuse near-expiry cached
8
+ * creds, and the tool dispatcher uses isAuthErrorResult() to clear creds
9
+ * and retry once when AIS rejects a token mid-session.
10
+ */
11
+ /**
12
+ * Safety margin before the recorded expiry at which cached credentials are
13
+ * treated as stale. Five minutes comfortably covers clock skew between the
14
+ * client and AIS plus the duration of any single tool call.
15
+ */
16
+ export const CREDS_STALENESS_MARGIN_MS = 5 * 60 * 1000;
17
+ /**
18
+ * True when credentials expiring at `expiresAt` should no longer be used at
19
+ * time `nowMs`. Unparseable expiry timestamps are treated as stale — a
20
+ * re-auth is cheap, silently using a token of unknown validity is not.
21
+ */
22
+ export function isCredsStale(expiresAt, nowMs, marginMs = CREDS_STALENESS_MARGIN_MS) {
23
+ const expiresMs = Date.parse(expiresAt);
24
+ if (Number.isNaN(expiresMs))
25
+ return true;
26
+ return expiresMs - nowMs <= marginMs;
27
+ }
28
+ /**
29
+ * True when an AIS response body is a token-rejection error
30
+ * (TOKEN_EXPIRED or INVALID_TOKEN) — the signal to re-auth and retry.
31
+ */
32
+ export function isAuthErrorResult(result) {
33
+ if (typeof result !== 'object' || result === null)
34
+ return false;
35
+ const r = result;
36
+ if (r.success !== false)
37
+ return false;
38
+ const code = r.error?.code;
39
+ return code === 'TOKEN_EXPIRED' || code === 'INVALID_TOKEN';
40
+ }
41
+ //# sourceMappingURL=auth-staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-staleness.js","sourceRoot":"","sources":["../src/auth-staleness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,KAAa,EACb,WAAmB,yBAAyB;IAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,SAAS,GAAG,KAAK,IAAI,QAAQ,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,CAAC,GAAG,MAA0D,CAAC;IACrE,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC;IAC3B,OAAO,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,eAAe,CAAC;AAC9D,CAAC"}
@@ -1,9 +1,11 @@
1
1
  export declare class ActivityTracker {
2
2
  private toolCounts;
3
3
  private storedMemories;
4
+ private storedMemoryCount;
4
5
  recordToolUse(toolName: string): void;
5
6
  recordMemoryStored(content: string): void;
6
7
  getToolCounts(): Record<string, number>;
8
+ getStoredMemoryCount(): number;
7
9
  getStoredMemories(): string[];
8
10
  hasActivity(): boolean;
9
11
  }