aismemory 0.7.3 → 0.7.5
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.
- package/README.md +51 -11
- package/dist/__tests__/agent-key-mode.test.js +72 -7
- package/dist/__tests__/agent-key-mode.test.js.map +1 -1
- package/dist/__tests__/ais-http.test.js +42 -2
- package/dist/__tests__/ais-http.test.js.map +1 -1
- package/dist/__tests__/credential-isolation.test.js +117 -3
- package/dist/__tests__/credential-isolation.test.js.map +1 -1
- package/dist/__tests__/device-flow-gate-e2e.test.js +5 -0
- package/dist/__tests__/device-flow-gate-e2e.test.js.map +1 -1
- package/dist/__tests__/doctor.test.js +1 -1
- package/dist/__tests__/doctor.test.js.map +1 -1
- package/dist/__tests__/mcp-init-no-auth.test.js +29 -5
- package/dist/__tests__/mcp-init-no-auth.test.js.map +1 -1
- package/dist/__tests__/mcp-tools.test.d.ts +1 -0
- package/dist/__tests__/mcp-tools.test.js +155 -0
- package/dist/__tests__/mcp-tools.test.js.map +1 -0
- package/dist/__tests__/memory-pull.test.d.ts +1 -0
- package/dist/__tests__/memory-pull.test.js +380 -0
- package/dist/__tests__/memory-pull.test.js.map +1 -0
- package/dist/__tests__/pending-device-flow-e2e.test.d.ts +19 -0
- package/dist/__tests__/pending-device-flow-e2e.test.js +159 -0
- package/dist/__tests__/pending-device-flow-e2e.test.js.map +1 -0
- package/dist/__tests__/pending-device-flow.test.d.ts +15 -0
- package/dist/__tests__/pending-device-flow.test.js +108 -0
- package/dist/__tests__/pending-device-flow.test.js.map +1 -0
- package/dist/__tests__/readme-quickstart-default-ais-url.test.d.ts +1 -0
- package/dist/__tests__/readme-quickstart-default-ais-url.test.js +80 -0
- package/dist/__tests__/readme-quickstart-default-ais-url.test.js.map +1 -0
- package/dist/__tests__/reconnect-survival-e2e.test.js +17 -8
- package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
- package/dist/__tests__/remember-duplicate-truth.test.d.ts +13 -0
- package/dist/__tests__/remember-duplicate-truth.test.js +106 -0
- package/dist/__tests__/remember-duplicate-truth.test.js.map +1 -0
- package/dist/__tests__/startup-credential-warning-e2e.test.d.ts +1 -0
- package/dist/__tests__/startup-credential-warning-e2e.test.js +102 -0
- package/dist/__tests__/startup-credential-warning-e2e.test.js.map +1 -0
- package/dist/__tests__/tool-args.test.js +10 -0
- package/dist/__tests__/tool-args.test.js.map +1 -1
- package/dist/__tests__/version-check.test.d.ts +1 -0
- package/dist/__tests__/version-check.test.js +349 -0
- package/dist/__tests__/version-check.test.js.map +1 -0
- package/dist/agent-key-mode.d.ts +1 -1
- package/dist/agent-key-mode.js +30 -10
- package/dist/agent-key-mode.js.map +1 -1
- package/dist/ais-http-error.d.ts +22 -0
- package/dist/ais-http-error.js +42 -0
- package/dist/ais-http-error.js.map +1 -1
- package/dist/ais-http.d.ts +1 -0
- package/dist/ais-http.js +39 -16
- package/dist/ais-http.js.map +1 -1
- package/dist/cli/doctor.d.ts +16 -0
- package/dist/cli/doctor.js +66 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/enable-key-auth.js +2 -1
- package/dist/cli/enable-key-auth.js.map +1 -1
- package/dist/cli/pull-memory.d.ts +17 -0
- package/dist/cli/pull-memory.js +141 -0
- package/dist/cli/pull-memory.js.map +1 -0
- package/dist/index.js +108 -383
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts +78 -0
- package/dist/mcp/tools.js +433 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/memory-pull.d.ts +114 -0
- package/dist/memory-pull.js +171 -0
- package/dist/memory-pull.js.map +1 -0
- package/dist/pending-device-flow.d.ts +49 -0
- package/dist/pending-device-flow.js +96 -0
- package/dist/pending-device-flow.js.map +1 -0
- package/dist/telemetry.d.ts +1 -1
- package/dist/telemetry.js.map +1 -1
- package/dist/tool-args.d.ts +2 -0
- package/dist/tool-args.js +6 -0
- package/dist/tool-args.js.map +1 -1
- package/dist/version-check.d.ts +72 -0
- package/dist/version-check.js +237 -0
- package/dist/version-check.js.map +1 -0
- package/dist/workspace-key-mode.js +15 -6
- package/dist/workspace-key-mode.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending device-flow persistence — unit tests (CORBOT-8F96A8EF).
|
|
3
|
+
*
|
|
4
|
+
* Jaire's sign-in minted a new agent on every run. The server already had the
|
|
5
|
+
* machinery to prevent it: present the provisional token from an earlier
|
|
6
|
+
* un-finalized flow and it reuses that provisional agent instead of minting
|
|
7
|
+
* another. The client just never presented one, because the token lived only
|
|
8
|
+
* in a module-level variable that is null in every freshly spawned process —
|
|
9
|
+
* and a stdio MCP server is spawned constantly.
|
|
10
|
+
*
|
|
11
|
+
* These cover the storage half. The cross-process proof (two separate node
|
|
12
|
+
* processes, one home directory, second run carries the first run's token)
|
|
13
|
+
* is in pending-device-flow-e2e.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
16
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync, statSync, existsSync } from 'node:fs';
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { clearPendingDeviceFlow, loadPendingDeviceFlow, pendingDeviceFlowPath, savePendingDeviceFlow, } from '../pending-device-flow.js';
|
|
20
|
+
let home;
|
|
21
|
+
function flow(overrides = {}) {
|
|
22
|
+
return {
|
|
23
|
+
provisionalToken: 'provisional-token-from-run-1',
|
|
24
|
+
agentId: 'agent-1',
|
|
25
|
+
provisionalTenantId: 'tenant-1',
|
|
26
|
+
startedAt: new Date().toISOString(),
|
|
27
|
+
...overrides,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
home = mkdtempSync(join(tmpdir(), 'aismem-pending-'));
|
|
32
|
+
delete process.env['AIS_CREDENTIALS_FILE'];
|
|
33
|
+
delete process.env['AIS_AGENT_ID'];
|
|
34
|
+
});
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
rmSync(home, { recursive: true, force: true });
|
|
37
|
+
delete process.env['AIS_CREDENTIALS_FILE'];
|
|
38
|
+
delete process.env['AIS_AGENT_ID'];
|
|
39
|
+
});
|
|
40
|
+
describe('pending device flow persistence [CORBOT-8F96A8EF]', () => {
|
|
41
|
+
it('round-trips the provisional token so a later process can present it', () => {
|
|
42
|
+
savePendingDeviceFlow(flow(), home);
|
|
43
|
+
// A different process would call load() with no in-memory state at all.
|
|
44
|
+
const loaded = loadPendingDeviceFlow(home);
|
|
45
|
+
expect(loaded?.provisionalToken).toBe('provisional-token-from-run-1');
|
|
46
|
+
expect(loaded?.agentId).toBe('agent-1');
|
|
47
|
+
});
|
|
48
|
+
it('returns null when nothing has been persisted, so sign-in falls back to minting', () => {
|
|
49
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
50
|
+
});
|
|
51
|
+
it('writes the file 0600 — it is a bearer proof-of-session, not public', () => {
|
|
52
|
+
savePendingDeviceFlow(flow(), home);
|
|
53
|
+
const mode = statSync(pendingDeviceFlowPath(home)).mode & 0o777;
|
|
54
|
+
expect(mode).toBe(0o600);
|
|
55
|
+
});
|
|
56
|
+
it('discards a token older than the 7-day server-side claim window', () => {
|
|
57
|
+
const eightDaysAgo = new Date(Date.now() - 8 * 24 * 60 * 60 * 1000).toISOString();
|
|
58
|
+
savePendingDeviceFlow(flow({ startedAt: eightDaysAgo }), home);
|
|
59
|
+
// The server would reject it anyway; sending it just wastes a round trip.
|
|
60
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
61
|
+
});
|
|
62
|
+
it('keeps a token still inside the claim window', () => {
|
|
63
|
+
const sixDaysAgo = new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString();
|
|
64
|
+
savePendingDeviceFlow(flow({ startedAt: sixDaysAgo }), home);
|
|
65
|
+
expect(loadPendingDeviceFlow(home)?.provisionalToken).toBe('provisional-token-from-run-1');
|
|
66
|
+
});
|
|
67
|
+
it('returns null on a malformed file rather than throwing', () => {
|
|
68
|
+
const file = pendingDeviceFlowPath(home);
|
|
69
|
+
mkdirSync(join(home, '.aismemory'), { recursive: true });
|
|
70
|
+
writeFileSync(file, '{ not json');
|
|
71
|
+
// Sign-in must never be broken by a corrupt cache file.
|
|
72
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
it('returns null when the token field is missing or empty', () => {
|
|
75
|
+
savePendingDeviceFlow(flow({ provisionalToken: '' }), home);
|
|
76
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
77
|
+
});
|
|
78
|
+
it('clears the record once the bond completes', () => {
|
|
79
|
+
savePendingDeviceFlow(flow(), home);
|
|
80
|
+
expect(existsSync(pendingDeviceFlowPath(home))).toBe(true);
|
|
81
|
+
clearPendingDeviceFlow(home);
|
|
82
|
+
// A token for an already-bonded agent is rejected server-side, which
|
|
83
|
+
// would send the next sign-in straight back to minting.
|
|
84
|
+
expect(existsSync(pendingDeviceFlowPath(home))).toBe(false);
|
|
85
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
it('clearing when nothing is stored is a no-op, not an error', () => {
|
|
88
|
+
expect(() => clearPendingDeviceFlow(home)).not.toThrow();
|
|
89
|
+
});
|
|
90
|
+
it('follows the per-agent credential isolation AIS_AGENT_ID already implies', () => {
|
|
91
|
+
process.env['AIS_AGENT_ID'] = 'agent-alpha';
|
|
92
|
+
const alphaPath = pendingDeviceFlowPath(home);
|
|
93
|
+
process.env['AIS_AGENT_ID'] = 'agent-beta';
|
|
94
|
+
const betaPath = pendingDeviceFlowPath(home);
|
|
95
|
+
// Two agents sharing a home must not share a provisional token, or one
|
|
96
|
+
// would bind over the other.
|
|
97
|
+
expect(alphaPath).not.toBe(betaPath);
|
|
98
|
+
expect(alphaPath).toContain('agent-alpha');
|
|
99
|
+
expect(betaPath).toContain('agent-beta');
|
|
100
|
+
});
|
|
101
|
+
it('sits beside credentials.json, not inside it', () => {
|
|
102
|
+
// Separate files: a half-finished sign-in must never be mistaken for a
|
|
103
|
+
// live bonded credential.
|
|
104
|
+
expect(pendingDeviceFlowPath(home)).toContain('pending-device-flow.json');
|
|
105
|
+
expect(pendingDeviceFlowPath(home)).not.toContain('credentials.json');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=pending-device-flow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-device-flow.test.js","sourceRoot":"","sources":["../../src/__tests__/pending-device-flow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for CORBOT-0DA63AAB.
|
|
3
|
+
*
|
|
4
|
+
* aismemory 0.7.3 dropped the documented AIS_URL default in getAisUrl(),
|
|
5
|
+
* so every client configured exactly as the README Quick Start shows it —
|
|
6
|
+
* `npx aismemory` with no AIS_URL set — failed its first `remember`,
|
|
7
|
+
* `recall`, or `inbox_read` call with "AIS_URL is not configured", while
|
|
8
|
+
* 499/499 unit tests stayed green. 0.7.4 restored the fallback. This test
|
|
9
|
+
* reproduces the README Quick Start environment exactly (only the two npm
|
|
10
|
+
* flags the config's `env` block sets — no AIS_URL, no agent-key vars) and
|
|
11
|
+
* exercises the HTTP paths those three tools use, so a future regression in
|
|
12
|
+
* the default fails here instead of shipping unnoticed.
|
|
13
|
+
*/
|
|
14
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
15
|
+
import { aisGet, aisPost } from '../ais-http.js';
|
|
16
|
+
const README_QUICKSTART_ENV_KEYS = [
|
|
17
|
+
'AIS_URL',
|
|
18
|
+
'AIS_AGENT_API_KEY',
|
|
19
|
+
'AIS_AGENT_ID',
|
|
20
|
+
'AIS_CREDENTIALS_FILE',
|
|
21
|
+
];
|
|
22
|
+
const PRODUCTION_DEFAULT_AIS_URL = 'https://ais.agentsandswarms.ai';
|
|
23
|
+
const savedEnv = new Map();
|
|
24
|
+
function jsonResponse(body, status = 200) {
|
|
25
|
+
return new Response(JSON.stringify(body), { status });
|
|
26
|
+
}
|
|
27
|
+
describe('README Quick Start default AIS_URL (CORBOT-0DA63AAB)', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
savedEnv.clear();
|
|
30
|
+
for (const key of README_QUICKSTART_ENV_KEYS) {
|
|
31
|
+
savedEnv.set(key, process.env[key]);
|
|
32
|
+
delete process.env[key];
|
|
33
|
+
}
|
|
34
|
+
// The README Quick Start `env` block sets only these two npm flags —
|
|
35
|
+
// never AIS_URL — so a client following it launches with exactly this.
|
|
36
|
+
process.env['npm_config_audit'] = 'false';
|
|
37
|
+
process.env['npm_config_fund'] = 'false';
|
|
38
|
+
});
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
for (const [key, value] of savedEnv) {
|
|
41
|
+
if (value === undefined)
|
|
42
|
+
delete process.env[key];
|
|
43
|
+
else
|
|
44
|
+
process.env[key] = value;
|
|
45
|
+
}
|
|
46
|
+
delete process.env['npm_config_audit'];
|
|
47
|
+
delete process.env['npm_config_fund'];
|
|
48
|
+
});
|
|
49
|
+
it('resolves the configured base URL to the production default', async () => {
|
|
50
|
+
const fetchCalls = [];
|
|
51
|
+
globalThis.fetch = (async (input) => {
|
|
52
|
+
fetchCalls.push(String(input));
|
|
53
|
+
return jsonResponse({ success: true });
|
|
54
|
+
});
|
|
55
|
+
await aisPost('/v1/agents/a1/memory', { content: 'x' }, 'token');
|
|
56
|
+
expect(fetchCalls[0]).toBe(`${PRODUCTION_DEFAULT_AIS_URL}/v1/agents/a1/memory`);
|
|
57
|
+
});
|
|
58
|
+
it('constructs the HTTP client for remember without throwing', async () => {
|
|
59
|
+
globalThis.fetch = (async () => jsonResponse({ success: true, data: { id: 'mem-1' } }));
|
|
60
|
+
await expect(aisPost('/v1/agents/a1/memory', { content: 'hello', type: 'fact' }, 'token')).resolves.toEqual({ success: true, data: { id: 'mem-1' } });
|
|
61
|
+
});
|
|
62
|
+
it('constructs the HTTP client for recall without throwing', async () => {
|
|
63
|
+
globalThis.fetch = (async () => jsonResponse({ success: true, data: { memories: [] } }));
|
|
64
|
+
await expect(aisGet('/v1/agents/a1/memory?query=hello', 'token')).resolves.toEqual({
|
|
65
|
+
success: true,
|
|
66
|
+
data: { memories: [] },
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it('constructs the HTTP client for inbox_read without throwing', async () => {
|
|
70
|
+
globalThis.fetch = (async () => jsonResponse({
|
|
71
|
+
success: true,
|
|
72
|
+
data: { messages: [], nextCursor: null, hasMore: false },
|
|
73
|
+
}));
|
|
74
|
+
await expect(aisGet('/v1/agents/a1/inbox?limit=20', 'token')).resolves.toEqual({
|
|
75
|
+
success: true,
|
|
76
|
+
data: { messages: [], nextCursor: null, hasMore: false },
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=readme-quickstart-default-ais-url.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readme-quickstart-default-ais-url.test.js","sourceRoot":"","sources":["../../src/__tests__/readme-quickstart-default-ais-url.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,7 +100,10 @@ describe('no-enrolled-key cohort: a stdio respawn after a completed bond never r
|
|
|
100
100
|
res.end(JSON.stringify({ success: true, data: {} }));
|
|
101
101
|
});
|
|
102
102
|
});
|
|
103
|
-
await new Promise((resolveListen) => {
|
|
103
|
+
await new Promise((resolveListen, reject) => {
|
|
104
|
+
fakeAis.once('error', (error) => {
|
|
105
|
+
reject(new Error('Reconnect e2e requires its local AIS fixture to listen on loopback', { cause: error }));
|
|
106
|
+
});
|
|
104
107
|
fakeAis.listen(0, '127.0.0.1', () => {
|
|
105
108
|
const addr = fakeAis.address();
|
|
106
109
|
if (addr && typeof addr === 'object')
|
|
@@ -190,12 +193,13 @@ describe('no-enrolled-key cohort: a stdio respawn after a completed bond never r
|
|
|
190
193
|
try {
|
|
191
194
|
// ── Process 1: drive the device flow to completion ──────────────
|
|
192
195
|
proc1 = spawn('node', [distPath], {
|
|
193
|
-
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
|
|
196
|
+
env: { ...process.env, AIS_AGENT_ID: '', AIS_AGENT_NAME: '', HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
|
|
194
197
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
195
198
|
});
|
|
196
199
|
let stdoutBuf1 = '';
|
|
197
200
|
proc1.stdout.on('data', (d) => { stdoutBuf1 += d.toString(); });
|
|
198
|
-
|
|
201
|
+
let stderrBuf1 = '';
|
|
202
|
+
proc1.stderr.on('data', (d) => { stderrBuf1 += d.toString(); });
|
|
199
203
|
proc1.stdin.write(JSON.stringify({
|
|
200
204
|
jsonrpc: '2.0', id: 0, method: 'initialize',
|
|
201
205
|
params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'reconnect-test-1', version: '0.0.0' } },
|
|
@@ -225,9 +229,9 @@ describe('no-enrolled-key cohort: a stdio respawn after a completed bond never r
|
|
|
225
229
|
}
|
|
226
230
|
expect(agentBonded).toBe(true);
|
|
227
231
|
expect(deviceAuthorizeCalls).toBe(1);
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
await
|
|
232
|
+
// Observe completion of the rejected enrollment instead of assuming
|
|
233
|
+
// a fixed sleep is sufficient on a loaded machine.
|
|
234
|
+
await waitFor(() => stderrBuf1.includes('DID key auto-enroll failed'), 10000, 'proc1 local AIS registration rejection; AIS fixture must be reachable');
|
|
231
235
|
// Confirms this genuinely exercises the "enroll failed" cohort — the
|
|
232
236
|
// key auto-enroll was attempted (and rejected by the fake AIS) at
|
|
233
237
|
// least once, so hasEnrolledKey() stays false for process 1.
|
|
@@ -244,17 +248,22 @@ describe('no-enrolled-key cohort: a stdio respawn after a completed bond never r
|
|
|
244
248
|
// ── Process 2: silent stdio respawn — must reconnect with NO new
|
|
245
249
|
// device-authorize call and NO bond prompt. ──────────────────────
|
|
246
250
|
proc2 = spawn('node', [distPath], {
|
|
247
|
-
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
|
|
251
|
+
env: { ...process.env, AIS_AGENT_ID: '', AIS_AGENT_NAME: '', HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
|
|
248
252
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
249
253
|
});
|
|
250
254
|
let stdoutBuf2 = '';
|
|
251
255
|
proc2.stdout.on('data', (d) => { stdoutBuf2 += d.toString(); });
|
|
252
|
-
|
|
256
|
+
let stderrBuf2 = '';
|
|
257
|
+
proc2.stderr.on('data', (d) => { stderrBuf2 += d.toString(); });
|
|
253
258
|
proc2.stdin.write(JSON.stringify({
|
|
254
259
|
jsonrpc: '2.0', id: 0, method: 'initialize',
|
|
255
260
|
params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'reconnect-test-2', version: '0.0.0' } },
|
|
256
261
|
}) + '\n');
|
|
257
262
|
await waitFor(() => stdoutBuf2.includes('"id":0'), 5000, 'proc2 initialize response');
|
|
263
|
+
// Startup retries enrollment asynchronously. Wait for the deliberately
|
|
264
|
+
// rejected enrollment to remove its temporary key before testing the
|
|
265
|
+
// settled no-enrolled-key reconnect path (no arbitrary sleep).
|
|
266
|
+
await waitFor(() => stderrBuf2.includes('DID key auto-enroll failed'), 10000, 'proc2 local AIS registration rejection; AIS fixture must be reachable');
|
|
258
267
|
const id2 = 100;
|
|
259
268
|
proc2.stdin.write(JSON.stringify({
|
|
260
269
|
jsonrpc: '2.0', id: id2, method: 'tools/call', params: { name: 'whoami', arguments: {} },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnect-survival-e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/reconnect-survival-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reconnect-survival-e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/reconnect-survival-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* remember must tell the truth about a deduplicated write (CORBOT-F21668B5).
|
|
3
|
+
*
|
|
4
|
+
* Reported by Jaire, running this package with an agent API key only: the
|
|
5
|
+
* second `remember` of identical content came back HTTP 409 and the tool
|
|
6
|
+
* result said "The operation did NOT succeed" — while the content was in fact
|
|
7
|
+
* safely stored by the first write. The agent concluded its memory was lost
|
|
8
|
+
* and retried a call that can never succeed.
|
|
9
|
+
*
|
|
10
|
+
* Both writes are covered below: the first (201, a real store) and the second
|
|
11
|
+
* (409, deduplicated), in agent-API-key mode and workspace-key mode.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* remember must tell the truth about a deduplicated write (CORBOT-F21668B5).
|
|
3
|
+
*
|
|
4
|
+
* Reported by Jaire, running this package with an agent API key only: the
|
|
5
|
+
* second `remember` of identical content came back HTTP 409 and the tool
|
|
6
|
+
* result said "The operation did NOT succeed" — while the content was in fact
|
|
7
|
+
* safely stored by the first write. The agent concluded its memory was lost
|
|
8
|
+
* and retried a call that can never succeed.
|
|
9
|
+
*
|
|
10
|
+
* Both writes are covered below: the first (201, a real store) and the second
|
|
11
|
+
* (409, deduplicated), in agent-API-key mode and workspace-key mode.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
14
|
+
import { dispatchToolKeyMode } from '../agent-key-mode.js';
|
|
15
|
+
import { dispatchToolWorkspaceKeyMode } from '../workspace-key-mode.js';
|
|
16
|
+
import { AisHttpError, duplicateMemoryResult, } from '../ais-http-error.js';
|
|
17
|
+
const AIS_URL = 'https://ais.example.test';
|
|
18
|
+
const AGENT_ID = 'agent-42';
|
|
19
|
+
const EXISTING_ID = 'f1c3bc6c-f602-4d2a-a5c8-9283b4ff9787';
|
|
20
|
+
const CONTENT = 'duplicate-truth probe sentence alpha';
|
|
21
|
+
function jsonResponse(status, body) {
|
|
22
|
+
return new Response(JSON.stringify(body), {
|
|
23
|
+
status,
|
|
24
|
+
headers: { 'content-type': 'application/json' },
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function storedResponse() {
|
|
28
|
+
return jsonResponse(201, {
|
|
29
|
+
success: true,
|
|
30
|
+
data: { id: EXISTING_ID, agentId: AGENT_ID, content: CONTENT, type: 'fact' },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function duplicateResponse(withId = true) {
|
|
34
|
+
return jsonResponse(409, {
|
|
35
|
+
success: false,
|
|
36
|
+
duplicate: true,
|
|
37
|
+
error: {
|
|
38
|
+
code: 'DUPLICATE_MEMORY',
|
|
39
|
+
message: `This exact content is already stored as memory ${EXISTING_ID}.`,
|
|
40
|
+
...(withId ? { details: { existingMemoryId: EXISTING_ID } } : {}),
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
describe('duplicateMemoryResult', () => {
|
|
45
|
+
it('turns a 409 DUPLICATE_MEMORY into a truthful success carrying the stored id', () => {
|
|
46
|
+
const result = duplicateMemoryResult(new AisHttpError(409, '/v1/agents/agent-42/memory', {
|
|
47
|
+
success: false,
|
|
48
|
+
error: { code: 'DUPLICATE_MEMORY', details: { existingMemoryId: EXISTING_ID } },
|
|
49
|
+
}));
|
|
50
|
+
expect(result.success).toBe(true);
|
|
51
|
+
expect(result.duplicate).toBe(true);
|
|
52
|
+
expect(result.data?.id).toBe(EXISTING_ID);
|
|
53
|
+
expect(result.message).toContain(EXISTING_ID);
|
|
54
|
+
expect(result.message).toMatch(/do not retry/i);
|
|
55
|
+
expect(result.message).not.toMatch(/did NOT succeed/);
|
|
56
|
+
});
|
|
57
|
+
it('still reports the content as stored when the server sends no id', () => {
|
|
58
|
+
const result = duplicateMemoryResult(new AisHttpError(409, '/v1/agents/agent-42/memory', {
|
|
59
|
+
success: false,
|
|
60
|
+
error: { code: 'DUPLICATE_MEMORY' },
|
|
61
|
+
}));
|
|
62
|
+
expect(result.success).toBe(true);
|
|
63
|
+
expect(result.data).toBeUndefined();
|
|
64
|
+
expect(result.message).toMatch(/already stored/i);
|
|
65
|
+
});
|
|
66
|
+
it('leaves every other failure alone', () => {
|
|
67
|
+
const otherConflict = new AisHttpError(409, '/v1/agents/agent-42/keys', {
|
|
68
|
+
error: { code: 'KEY_ALREADY_REGISTERED' },
|
|
69
|
+
});
|
|
70
|
+
const quota = new AisHttpError(429, '/v1/agents/agent-42/memory', {
|
|
71
|
+
error: { code: 'QUOTA_EXCEEDED' },
|
|
72
|
+
});
|
|
73
|
+
expect(duplicateMemoryResult(otherConflict)).toBeNull();
|
|
74
|
+
expect(duplicateMemoryResult(quota)).toBeNull();
|
|
75
|
+
expect(duplicateMemoryResult(new Error('network down'))).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('remember in agent-API-key mode', () => {
|
|
79
|
+
it('passes the first write through unchanged', async () => {
|
|
80
|
+
const fetchMock = vi.fn(async () => storedResponse());
|
|
81
|
+
const result = await dispatchToolKeyMode(AIS_URL, { apiKey: 'ais_ak_test', agentId: AGENT_ID }, 'remember', { content: CONTENT, type: 'fact' }, fetchMock);
|
|
82
|
+
expect(result).toMatchObject({ success: true, data: { id: EXISTING_ID } });
|
|
83
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
84
|
+
});
|
|
85
|
+
it('reports the second, deduplicated write as stored instead of failed', async () => {
|
|
86
|
+
const fetchMock = vi.fn(async () => duplicateResponse());
|
|
87
|
+
const result = (await dispatchToolKeyMode(AIS_URL, { apiKey: 'ais_ak_test', agentId: AGENT_ID }, 'remember', { content: CONTENT, type: 'fact' }, fetchMock));
|
|
88
|
+
expect(result.success).toBe(true);
|
|
89
|
+
expect(result.duplicate).toBe(true);
|
|
90
|
+
expect(result.data?.id).toBe(EXISTING_ID);
|
|
91
|
+
});
|
|
92
|
+
it('still fails loudly when the write is genuinely rejected', async () => {
|
|
93
|
+
const fetchMock = vi.fn(async () => jsonResponse(429, { success: false, error: { code: 'QUOTA_EXCEEDED', message: 'over quota' } }));
|
|
94
|
+
await expect(dispatchToolKeyMode(AIS_URL, { apiKey: 'ais_ak_test', agentId: AGENT_ID }, 'remember', { content: CONTENT, type: 'fact' }, fetchMock)).rejects.toThrow(/did NOT succeed/);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('remember in workspace-key mode', () => {
|
|
98
|
+
it('reports a deduplicated write as stored instead of failed', async () => {
|
|
99
|
+
const fetchMock = vi.fn(async () => duplicateResponse());
|
|
100
|
+
const result = (await dispatchToolWorkspaceKeyMode(AIS_URL, { workspaceKey: 'ais_wk_test', agentId: AGENT_ID }, 'remember', { content: CONTENT, type: 'fact' }, fetchMock));
|
|
101
|
+
expect(result.success).toBe(true);
|
|
102
|
+
expect(result.duplicate).toBe(true);
|
|
103
|
+
expect(result.data?.id).toBe(EXISTING_ID);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=remember-duplicate-truth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remember-duplicate-truth.test.js","sourceRoot":"","sources":["../../src/__tests__/remember-duplicate-truth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORBOT-9B4DBBE1: the startup credential warning must not fire when an
|
|
3
|
+
* enrolled device key means the session will authenticate silently on the
|
|
4
|
+
* first tool call. Before this fix, `MISSING_CREDENTIAL_HELP` printed
|
|
5
|
+
* whenever no v1 disk bearer was present, even with a valid enrolled key —
|
|
6
|
+
* training operators to ignore a warning that always preceded success.
|
|
7
|
+
*
|
|
8
|
+
* Both cases drive the real built binary against a fake home directory;
|
|
9
|
+
* neither needs a live AIS server since the credential branch under test
|
|
10
|
+
* runs before any tool call touches the network.
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'node:child_process';
|
|
13
|
+
import { mkdtempSync, mkdirSync, rmSync, existsSync } from 'node:fs';
|
|
14
|
+
import { tmpdir } from 'node:os';
|
|
15
|
+
import { join, resolve } from 'path';
|
|
16
|
+
import { describe, it, expect } from 'vitest';
|
|
17
|
+
import { generateAndSaveKeypair } from '../key-auth.js';
|
|
18
|
+
const distPath = resolve(__dirname, '..', '..', 'dist', 'index.js');
|
|
19
|
+
function assertBuilt() {
|
|
20
|
+
if (!existsSync(distPath)) {
|
|
21
|
+
throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function waitFor(predicate, ms, label) {
|
|
25
|
+
return new Promise((resolveOuter, reject) => {
|
|
26
|
+
const start = Date.now();
|
|
27
|
+
const tick = () => {
|
|
28
|
+
if (predicate()) {
|
|
29
|
+
resolveOuter();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (Date.now() - start > ms) {
|
|
33
|
+
reject(new Error(`timeout waiting for ${label}`));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setTimeout(tick, 50);
|
|
37
|
+
};
|
|
38
|
+
tick();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
describe('startup credential warning: only fires when no credential source exists', () => {
|
|
42
|
+
it('enrolled key, no disk bearer: names the key in use, never prints the missing-credential help', async () => {
|
|
43
|
+
assertBuilt();
|
|
44
|
+
const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-startup-key-'));
|
|
45
|
+
const aismemDir = join(fakeHome, '.aismemory');
|
|
46
|
+
mkdirSync(aismemDir, { recursive: true });
|
|
47
|
+
await generateAndSaveKeypair({
|
|
48
|
+
userId: 'u1',
|
|
49
|
+
userDid: 'did:web:test:users:u1',
|
|
50
|
+
keysDir: join(aismemDir, 'keys'),
|
|
51
|
+
});
|
|
52
|
+
let proc = null;
|
|
53
|
+
try {
|
|
54
|
+
proc = spawn('node', [distPath], {
|
|
55
|
+
env: { ...process.env, HOME: fakeHome, AIS_URL: 'http://127.0.0.1:1' },
|
|
56
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
57
|
+
});
|
|
58
|
+
let stderrBuf = '';
|
|
59
|
+
proc.stderr.on('data', (d) => { stderrBuf += d.toString(); });
|
|
60
|
+
proc.stdout.on('data', () => { });
|
|
61
|
+
await waitFor(() => stderrBuf.includes('MCP server running'), 5000, 'server startup line');
|
|
62
|
+
// Give the post-connect credential branch a moment to run and flush.
|
|
63
|
+
await waitFor(() => stderrBuf.includes('[aismemory]') && stderrBuf.split('[aismemory]').length > 2, 5000, 'credential branch line');
|
|
64
|
+
expect(stderrBuf).toContain('Using enrolled device key; session starts on first tool call.');
|
|
65
|
+
expect(stderrBuf).not.toContain('Missing AIS credential');
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
proc?.kill();
|
|
69
|
+
try {
|
|
70
|
+
rmSync(fakeHome, { recursive: true, force: true });
|
|
71
|
+
}
|
|
72
|
+
catch { /* ignore */ }
|
|
73
|
+
}
|
|
74
|
+
}, 30000);
|
|
75
|
+
it('no key, no credentials: the missing-credential help still prints', async () => {
|
|
76
|
+
assertBuilt();
|
|
77
|
+
const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-startup-nokey-'));
|
|
78
|
+
let proc = null;
|
|
79
|
+
try {
|
|
80
|
+
proc = spawn('node', [distPath], {
|
|
81
|
+
env: { ...process.env, HOME: fakeHome, AIS_URL: 'http://127.0.0.1:1' },
|
|
82
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
83
|
+
});
|
|
84
|
+
let stderrBuf = '';
|
|
85
|
+
proc.stderr.on('data', (d) => { stderrBuf += d.toString(); });
|
|
86
|
+
proc.stdout.on('data', () => { });
|
|
87
|
+
await waitFor(() => stderrBuf.includes('MCP server running'), 5000, 'server startup line');
|
|
88
|
+
await waitFor(() => stderrBuf.includes('Missing AIS credential'), 5000, 'missing-credential help line');
|
|
89
|
+
expect(stderrBuf).toContain('Missing AIS credential');
|
|
90
|
+
expect(stderrBuf).toContain('Bond URL will be surfaced on first tool call.');
|
|
91
|
+
expect(stderrBuf).not.toContain('Using enrolled device key');
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
proc?.kill();
|
|
95
|
+
try {
|
|
96
|
+
rmSync(fakeHome, { recursive: true, force: true });
|
|
97
|
+
}
|
|
98
|
+
catch { /* ignore */ }
|
|
99
|
+
}
|
|
100
|
+
}, 30000);
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=startup-credential-warning-e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-credential-warning-e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/startup-credential-warning-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,16 @@ describe('parseHandoffArgs', () => {
|
|
|
57
57
|
it('rejects too many keyLearnings', () => {
|
|
58
58
|
expect(() => parseHandoffArgs({ keyLearnings: Array.from({ length: 101 }, () => 'x') })).toThrow(/maximum of 100/);
|
|
59
59
|
});
|
|
60
|
+
// CORBOT-E3541A7F: the route persists these two in doc_path / doc_pr_url, so
|
|
61
|
+
// the parser has to keep them rather than strip them as unknown fields.
|
|
62
|
+
it('keeps docPath and docPrUrl', () => {
|
|
63
|
+
expect(parseHandoffArgs({ docPath: 'docs/handoff.md', docPrUrl: 'https://example.invalid/pull/1' })).toEqual({ docPath: 'docs/handoff.md', docPrUrl: 'https://example.invalid/pull/1' });
|
|
64
|
+
});
|
|
65
|
+
it('drops a caller-supplied agentId', () => {
|
|
66
|
+
expect(parseHandoffArgs({ summary: 'done', agentId: 'agent-SOMEONE-ELSE' })).toEqual({
|
|
67
|
+
summary: 'done',
|
|
68
|
+
});
|
|
69
|
+
});
|
|
60
70
|
});
|
|
61
71
|
describe('parseAgentLoadArgs', () => {
|
|
62
72
|
it('requires non-empty query', () => {
|