aismemory 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -94,6 +94,22 @@ an explicit "not available with agent API key auth" error rather than
94
94
  failing silently or faking success. `whoami` answers from `AIS_AGENT_ID`
95
95
  directly instead of calling the (unscoped) identity route.
96
96
 
97
+ ## Troubleshooting
98
+
99
+ If aismemory "doesn't work," run the built-in self-diagnosis before filing a
100
+ support ticket:
101
+
102
+ ```
103
+ npx aismemory doctor
104
+ ```
105
+
106
+ It checks your Node version, DNS/TLS reachability of the AIS host, REST API
107
+ and MCP endpoint health, local credential state (not bonded / expired /
108
+ rejected / accepted), proxy environment variables, and clock skew — each
109
+ with a PASS/WARN/FAIL line and a remediation hint. Nothing is written to the
110
+ API. Pass `--json` for machine-readable output. Exits `0` unless a check
111
+ FAILs.
112
+
97
113
  ## License
98
114
 
99
115
  MIT
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Regression test for CORBOT-497C7FA3:
3
+ * agent_load must persist the switched agentId to disk so that process
4
+ * restarts (silent MCP reconnects via StdioServerTransport) restore the
5
+ * correct agent instead of silently reverting to the default (Corbot).
6
+ *
7
+ * Root cause: agent_load updated `creds` in memory but did not call
8
+ * saveCredentials(), so the credentials.json file still held the original
9
+ * agentId after a reconnect.
10
+ *
11
+ * Fix: saveCredentials() is now called immediately after the in-memory
12
+ * update inside the agent_load handler.
13
+ */
14
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
15
+ import { mkdtempSync, rmSync } from 'node:fs';
16
+ import { tmpdir } from 'node:os';
17
+ import { join } from 'node:path';
18
+ import { saveOAuthCredentials, loadOAuthCredentials, } from '../oauth-credentials.js';
19
+ const FUTURE_EXPIRY = new Date(Date.now() + 3_600_000).toISOString();
20
+ function makeCreds(agentId) {
21
+ return {
22
+ token: 'tok-test',
23
+ agentId,
24
+ tenantId: 'tenant-1',
25
+ expiresAt: FUTURE_EXPIRY,
26
+ };
27
+ }
28
+ describe('agent_load credential persistence (CORBOT-497C7FA3)', () => {
29
+ let tmpHome;
30
+ beforeEach(() => {
31
+ tmpHome = mkdtempSync(join(tmpdir(), 'aismem-agent-load-'));
32
+ });
33
+ afterEach(() => {
34
+ rmSync(tmpHome, { recursive: true, force: true });
35
+ });
36
+ it('credentials file reflects the switched agentId after saveOAuthCredentials', () => {
37
+ // Start with the default (Corbot) agent on disk, as it would be after initial auth.
38
+ saveOAuthCredentials(makeCreds('corbot-id'), tmpHome);
39
+ // Simulate what agent_load now does: update agentId AND persist to disk.
40
+ const switched = { ...makeCreds('corbot-id'), agentId: 'ender-id' };
41
+ saveOAuthCredentials(switched, tmpHome); // the fix ensures this is called
42
+ // A new process (reconnect) loads credentials from disk — must get 'ender-id'.
43
+ const restored = loadOAuthCredentials(tmpHome);
44
+ expect(restored?.agentId).toBe('ender-id');
45
+ });
46
+ it('without persisting, a reload returns the original agentId — documents the pre-fix bug', () => {
47
+ // Start with 'corbot-id' on disk.
48
+ saveOAuthCredentials(makeCreds('corbot-id'), tmpHome);
49
+ // Pre-fix: agent_load only updated the in-memory variable, never called save.
50
+ // Demonstrate what that means: disk still has the old agentId.
51
+ const _inMemoryOnly = { ...makeCreds('corbot-id'), agentId: 'ender-id' };
52
+ // (intentionally NOT calling saveOAuthCredentials here)
53
+ // Reconnect scenario: fresh process reads from disk → wrong agent.
54
+ const restored = loadOAuthCredentials(tmpHome);
55
+ expect(restored?.agentId).toBe('corbot-id'); // bug: silent revert to default
56
+ });
57
+ it('token and tenantId are preserved when only agentId is updated', () => {
58
+ const initial = makeCreds('corbot-id');
59
+ saveOAuthCredentials(initial, tmpHome);
60
+ const switched = { ...initial, agentId: 'ender-id' };
61
+ saveOAuthCredentials(switched, tmpHome);
62
+ const restored = loadOAuthCredentials(tmpHome);
63
+ expect(restored?.agentId).toBe('ender-id');
64
+ expect(restored?.token).toBe(initial.token);
65
+ expect(restored?.tenantId).toBe(initial.tenantId);
66
+ expect(restored?.expiresAt).toBe(initial.expiresAt);
67
+ });
68
+ });
69
+ //# sourceMappingURL=agent-load-persistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-load-persistence.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-load-persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Unit tests for `aismemory doctor` (CORBOT-A74B4C8C).
3
+ *
4
+ * Every check function takes its network/fs/clock dependency as a parameter,
5
+ * so tests inject fakes instead of hitting the real network or filesystem.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { checkNodeVersion, checkDnsResolution, checkTlsReachability, checkRestHealth, checkMcpEndpoint, checkCredentials, checkProxyEnv, checkClockSkew, runDoctor, } from '../cli/doctor.js';
9
+ function fakeResponse(status, headers = {}) {
10
+ const headerMap = new Headers(headers);
11
+ return {
12
+ ok: status >= 200 && status < 300,
13
+ status,
14
+ headers: headerMap,
15
+ json: async () => ({}),
16
+ };
17
+ }
18
+ describe('checkNodeVersion', () => {
19
+ it('passes when node major >= minimum', () => {
20
+ const result = checkNodeVersion('v20.10.0', 18);
21
+ expect(result.status).toBe('PASS');
22
+ });
23
+ it('fails when node major < minimum', () => {
24
+ const result = checkNodeVersion('v16.20.0', 18);
25
+ expect(result.status).toBe('FAIL');
26
+ expect(result.hint).toBeDefined();
27
+ });
28
+ it('warns on an unparseable version string', () => {
29
+ const result = checkNodeVersion('not-a-version', 18);
30
+ expect(result.status).toBe('WARN');
31
+ });
32
+ });
33
+ describe('checkDnsResolution', () => {
34
+ it('passes when lookup resolves', async () => {
35
+ const result = await checkDnsResolution('ais.agentsandswarms.ai', async () => ({
36
+ address: '1.2.3.4',
37
+ family: 4,
38
+ }));
39
+ expect(result.status).toBe('PASS');
40
+ expect(result.message).toContain('1.2.3.4');
41
+ });
42
+ it('fails when lookup rejects', async () => {
43
+ const result = await checkDnsResolution('bad.invalid', async () => {
44
+ throw new Error('ENOTFOUND bad.invalid');
45
+ });
46
+ expect(result.status).toBe('FAIL');
47
+ expect(result.hint).toBeDefined();
48
+ });
49
+ });
50
+ describe('checkTlsReachability', () => {
51
+ it('passes when the probe resolves', async () => {
52
+ const result = await checkTlsReachability('ais.agentsandswarms.ai', async () => undefined);
53
+ expect(result.status).toBe('PASS');
54
+ });
55
+ it('fails when the probe rejects', async () => {
56
+ const result = await checkTlsReachability('ais.agentsandswarms.ai', async () => {
57
+ throw new Error('connect ECONNREFUSED');
58
+ });
59
+ expect(result.status).toBe('FAIL');
60
+ expect(result.hint).toContain('proxy');
61
+ });
62
+ });
63
+ describe('checkRestHealth', () => {
64
+ it('passes and captures the Date header on 200', async () => {
65
+ const fetchImpl = async () => fakeResponse(200, { date: 'Tue, 07 Jul 2026 06:00:00 GMT' });
66
+ const result = await checkRestHealth('https://ais.agentsandswarms.ai', fetchImpl);
67
+ expect(result.status).toBe('PASS');
68
+ expect(result.dateHeader).toBe('Tue, 07 Jul 2026 06:00:00 GMT');
69
+ });
70
+ it('warns on a reachable but non-2xx response', async () => {
71
+ const fetchImpl = async () => fakeResponse(503);
72
+ const result = await checkRestHealth('https://ais.agentsandswarms.ai', fetchImpl);
73
+ expect(result.status).toBe('WARN');
74
+ });
75
+ it('fails when fetch throws (unreachable)', async () => {
76
+ const fetchImpl = async () => {
77
+ throw new TypeError('fetch failed');
78
+ };
79
+ const result = await checkRestHealth('https://ais.agentsandswarms.ai', fetchImpl);
80
+ expect(result.status).toBe('FAIL');
81
+ });
82
+ });
83
+ describe('checkMcpEndpoint', () => {
84
+ it('passes (reachable) on a 401 — auth required is not the same as down', async () => {
85
+ const fetchImpl = async () => fakeResponse(401);
86
+ const result = await checkMcpEndpoint('https://ais.agentsandswarms.ai', fetchImpl);
87
+ expect(result.status).toBe('PASS');
88
+ expect(result.message).toContain('auth required');
89
+ });
90
+ it('fails when the connection cannot be established', async () => {
91
+ const fetchImpl = async () => {
92
+ throw new Error('getaddrinfo ENOTFOUND');
93
+ };
94
+ const result = await checkMcpEndpoint('https://ais.agentsandswarms.ai', fetchImpl);
95
+ expect(result.status).toBe('FAIL');
96
+ });
97
+ });
98
+ describe('checkCredentials', () => {
99
+ const baseCreds = {
100
+ token: 'tok',
101
+ agentId: 'agent-1',
102
+ tenantId: 'tenant-1',
103
+ expiresAt: new Date(Date.now() + 3_600_000).toISOString(),
104
+ };
105
+ it('warns when no credentials file exists', async () => {
106
+ const result = await checkCredentials('https://ais.agentsandswarms.ai', {
107
+ load: () => null,
108
+ });
109
+ expect(result.status).toBe('WARN');
110
+ expect(result.hint).toContain('bond');
111
+ });
112
+ it('warns when credentials are expired', async () => {
113
+ const expired = { ...baseCreds, expiresAt: new Date(Date.now() - 1000).toISOString() };
114
+ const result = await checkCredentials('https://ais.agentsandswarms.ai', {
115
+ load: () => expired,
116
+ });
117
+ expect(result.status).toBe('WARN');
118
+ expect(result.message).toContain('expired');
119
+ });
120
+ it('passes when AIS accepts the token', async () => {
121
+ const fetchImpl = async () => fakeResponse(200);
122
+ const result = await checkCredentials('https://ais.agentsandswarms.ai', {
123
+ load: () => baseCreds,
124
+ fetchImpl,
125
+ });
126
+ expect(result.status).toBe('PASS');
127
+ });
128
+ it('warns when AIS rejects the token', async () => {
129
+ const fetchImpl = async () => fakeResponse(401);
130
+ const result = await checkCredentials('https://ais.agentsandswarms.ai', {
131
+ load: () => baseCreds,
132
+ fetchImpl,
133
+ });
134
+ expect(result.status).toBe('WARN');
135
+ });
136
+ it('fails when the authed call cannot reach the network', async () => {
137
+ const fetchImpl = async () => {
138
+ throw new Error('network down');
139
+ };
140
+ const result = await checkCredentials('https://ais.agentsandswarms.ai', {
141
+ load: () => baseCreds,
142
+ fetchImpl,
143
+ });
144
+ expect(result.status).toBe('FAIL');
145
+ });
146
+ });
147
+ describe('checkProxyEnv', () => {
148
+ it('passes when no proxy vars are set', () => {
149
+ const result = checkProxyEnv({});
150
+ expect(result.status).toBe('PASS');
151
+ });
152
+ it('warns when HTTPS_PROXY is set', () => {
153
+ const result = checkProxyEnv({ HTTPS_PROXY: 'http://proxy.corp:8080' });
154
+ expect(result.status).toBe('WARN');
155
+ expect(result.message).toContain('HTTPS_PROXY');
156
+ });
157
+ });
158
+ describe('checkClockSkew', () => {
159
+ it('warns when there is no Date header to compare', () => {
160
+ const result = checkClockSkew(undefined);
161
+ expect(result.status).toBe('WARN');
162
+ });
163
+ it('passes when clocks are close', () => {
164
+ const now = Date.now();
165
+ const result = checkClockSkew(new Date(now).toUTCString(), () => now);
166
+ expect(result.status).toBe('PASS');
167
+ });
168
+ it('warns when clocks differ by more than the threshold', () => {
169
+ const now = Date.now();
170
+ const skewed = new Date(now - 10 * 60 * 1000).toUTCString();
171
+ const result = checkClockSkew(skewed, () => now);
172
+ expect(result.status).toBe('WARN');
173
+ expect(result.hint).toContain('NTP');
174
+ });
175
+ });
176
+ describe('runDoctor', () => {
177
+ it('produces a report with one entry per check, exit code 0 when all pass', async () => {
178
+ const now = Date.now();
179
+ const fetchImpl = async (input) => {
180
+ const url = String(input);
181
+ if (url.endsWith('/livez'))
182
+ return fakeResponse(200, { date: new Date(now).toUTCString() });
183
+ if (url.endsWith('/mcp'))
184
+ return fakeResponse(401);
185
+ return fakeResponse(200);
186
+ };
187
+ const report = await runDoctor({
188
+ aisUrl: 'https://ais.agentsandswarms.ai',
189
+ env: {},
190
+ nodeVersion: 'v20.10.0',
191
+ now: () => now,
192
+ fetchImpl,
193
+ dnsLookup: async () => ({ address: '1.2.3.4', family: 4 }),
194
+ tlsProbe: async () => undefined,
195
+ loadCreds: () => null,
196
+ });
197
+ expect(report.checks).toHaveLength(8);
198
+ expect(report.checks.every((c) => c.status !== 'FAIL')).toBe(true);
199
+ expect(report.verdict).toBe('problems'); // credentials WARN (not bonded) keeps this non-zero
200
+ expect(report.exitCode).toBe(0);
201
+ });
202
+ it('sets exit code 1 when any check fails', async () => {
203
+ const report = await runDoctor({
204
+ aisUrl: 'https://ais.agentsandswarms.ai',
205
+ env: {},
206
+ nodeVersion: 'v14.0.0', // below minimum -> FAIL
207
+ now: () => Date.now(),
208
+ fetchImpl: async () => fakeResponse(200),
209
+ dnsLookup: async () => ({ address: '1.2.3.4', family: 4 }),
210
+ tlsProbe: async () => undefined,
211
+ loadCreds: () => null,
212
+ });
213
+ expect(report.exitCode).toBe(1);
214
+ expect(report.verdict).toBe('problems');
215
+ expect(report.problemCount).toBeGreaterThan(0);
216
+ });
217
+ it('reports a clean pass when every check succeeds including credentials', async () => {
218
+ const now = Date.now();
219
+ const creds = {
220
+ token: 'tok',
221
+ agentId: 'agent-1',
222
+ tenantId: 'tenant-1',
223
+ expiresAt: new Date(now + 3_600_000).toISOString(),
224
+ };
225
+ const fetchImpl = async (input) => {
226
+ const url = String(input);
227
+ if (url.endsWith('/livez'))
228
+ return fakeResponse(200, { date: new Date(now).toUTCString() });
229
+ if (url.endsWith('/mcp'))
230
+ return fakeResponse(401);
231
+ return fakeResponse(200); // credentials whoami call
232
+ };
233
+ const report = await runDoctor({
234
+ aisUrl: 'https://ais.agentsandswarms.ai',
235
+ env: {},
236
+ nodeVersion: 'v20.10.0',
237
+ now: () => now,
238
+ fetchImpl,
239
+ dnsLookup: async () => ({ address: '1.2.3.4', family: 4 }),
240
+ tlsProbe: async () => undefined,
241
+ loadCreds: () => creds,
242
+ });
243
+ expect(report.problemCount).toBe(0);
244
+ expect(report.verdict).toBe('pass');
245
+ expect(report.exitCode).toBe(0);
246
+ });
247
+ });
248
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../src/__tests__/doctor.test.ts"],"names":[],"mappings":"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"}
@@ -207,15 +207,29 @@ describe('runIngestion', () => {
207
207
  sourcePrompt: '',
208
208
  },
209
209
  }));
210
- // Use a custom adapter stub that returns our 203 fake drafts
210
+ // Use a custom adapter stub that returns our 203 fake drafts. It maps
211
+ // content back to the original draft rather than doing real field
212
+ // mapping, since this test only exercises bulk-store chunking.
211
213
  const stubAdapter = {
212
214
  id: 'claude-local',
213
- parseResponse: () => ({ memories: fakeDrafts, warnings: [] }),
214
- mapToAis: (_src, _scope, _agentId) => _src,
215
+ displayName: 'Test Adapter',
216
+ kind: 'filesystem',
217
+ extractionPrompt: () => '',
218
+ parseResponse: () => ({
219
+ memories: fakeDrafts.map((draft) => ({ content: draft.content })),
220
+ warnings: [],
221
+ }),
222
+ mapToAis: (src) => {
223
+ const draft = fakeDrafts.find((d) => d.content === src.content);
224
+ if (!draft)
225
+ throw new Error(`stub adapter: no draft for content ${src.content}`);
226
+ return draft;
227
+ },
228
+ dedupeKey: (src) => src.content,
215
229
  };
216
230
  const result = await runIngestion({
217
231
  adapter: stubAdapter,
218
- rawSourceData: '',
232
+ rawSourceData: { rootPath: '/tmp', files: [] },
219
233
  scope: { kind: 'project', label: 'chunk-test', projectPath: '/tmp' },
220
234
  agentId: 'agent1',
221
235
  config,
@@ -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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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,156 @@
1
+ /**
2
+ * CORBOT-59EA5189: on re-authorize, the client must send the prior flow's
3
+ * provisional_token as Bearer auth so the server (OAuthDeviceService.authorize,
4
+ * S5 / CORBOT-CDDC15FA) can reuse the un-finalized provisional agent instead
5
+ * of minting a fresh one — otherwise every expired-code refresh (S2, PR #3239)
6
+ * or dead-flow restart leaves behind an orphaned "ghost" provisional agent.
7
+ *
8
+ * This drives the built binary against a fake AIS that:
9
+ * - returns a unique provisional_token per `/v1/oauth/device/authorize` call
10
+ * - returns `expired_token` on the first `/v1/oauth/token` poll, forcing the
11
+ * S2 poll-loop auto-restart (a second authorize call) inside the same flow
12
+ *
13
+ * The first authorize call has no prior flow, so it must NOT carry a Bearer
14
+ * header. The second (S2 restart) call must carry the FIRST call's
15
+ * provisional_token as `Authorization: Bearer <token>`.
16
+ */
17
+ import { createServer } from 'node:http';
18
+ import { spawn } from 'node:child_process';
19
+ import { mkdtempSync, rmSync, existsSync } from 'node:fs';
20
+ import { tmpdir } from 'node:os';
21
+ import { join, resolve } from 'path';
22
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
23
+ describe('aismemory MCP sends prior provisional token on re-authorize', () => {
24
+ let fakeAisServer;
25
+ let fakeAisPort = 0;
26
+ let authorizeCalls = 0;
27
+ const authorizeAuthHeaders = [];
28
+ const issuedProvisionalTokens = [];
29
+ beforeAll(async () => {
30
+ fakeAisServer = createServer((req, res) => {
31
+ req.on('data', () => { });
32
+ req.on('end', () => {
33
+ if (req.url === '/v1/oauth/device/authorize' && req.method === 'POST') {
34
+ authorizeCalls += 1;
35
+ authorizeAuthHeaders.push(req.headers.authorization);
36
+ const provisionalToken = `provisional-token-${authorizeCalls}`;
37
+ issuedProvisionalTokens.push(provisionalToken);
38
+ const userCode = `TEST-${String(authorizeCalls).padStart(4, '0')}`;
39
+ res.writeHead(200, { 'content-type': 'application/json' });
40
+ res.end(JSON.stringify({
41
+ success: true,
42
+ data: {
43
+ device_code: `device-${authorizeCalls}`,
44
+ user_code: userCode,
45
+ verification_uri: `http://127.0.0.1:${fakeAisPort}/activate`,
46
+ verification_uri_complete: `http://127.0.0.1:${fakeAisPort}/activate?user_code=${userCode}`,
47
+ expires_in: 1800,
48
+ interval: 1, // 1s poll → bounded to 5s min by the client
49
+ agent_id: `agent-${authorizeCalls}`,
50
+ provisional_tenant_id: `tenant-${authorizeCalls}`,
51
+ provisional_token: provisionalToken,
52
+ },
53
+ }));
54
+ return;
55
+ }
56
+ if (req.url === '/v1/oauth/token' && req.method === 'POST') {
57
+ // Always expire so the S2 poll-loop auto-restart fires on every
58
+ // poll — we only need to observe the SECOND authorize call's header.
59
+ res.writeHead(400, { 'content-type': 'application/json' });
60
+ res.end(JSON.stringify({ error: 'expired_token' }));
61
+ return;
62
+ }
63
+ res.writeHead(404);
64
+ res.end();
65
+ });
66
+ });
67
+ await new Promise((resolveServer) => {
68
+ fakeAisServer.listen(0, '127.0.0.1', () => {
69
+ const addr = fakeAisServer.address();
70
+ if (addr && typeof addr === 'object') {
71
+ fakeAisPort = addr.port;
72
+ }
73
+ resolveServer();
74
+ });
75
+ });
76
+ });
77
+ afterAll(async () => {
78
+ await new Promise((r) => fakeAisServer?.close(() => r()));
79
+ });
80
+ beforeEach(() => {
81
+ authorizeCalls = 0;
82
+ authorizeAuthHeaders.length = 0;
83
+ issuedProvisionalTokens.length = 0;
84
+ });
85
+ it('carries the prior flow provisional_token as Bearer auth on S2 restart', async () => {
86
+ const distPath = resolve(__dirname, '..', '..', 'dist', 'index.js');
87
+ if (!existsSync(distPath)) {
88
+ throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
89
+ }
90
+ const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-provisional-reauth-'));
91
+ let proc = null;
92
+ try {
93
+ proc = spawn('node', [distPath], {
94
+ env: {
95
+ ...process.env,
96
+ HOME: fakeHome,
97
+ AIS_URL: `http://127.0.0.1:${fakeAisPort}`,
98
+ },
99
+ stdio: ['pipe', 'pipe', 'pipe'],
100
+ });
101
+ let stdoutBuf = '';
102
+ proc.stdout.on('data', (d) => { stdoutBuf += d.toString(); });
103
+ proc.stderr.on('data', () => { });
104
+ proc.stdin.write(JSON.stringify({
105
+ jsonrpc: '2.0',
106
+ id: 1,
107
+ method: 'initialize',
108
+ params: {
109
+ protocolVersion: '2024-11-05',
110
+ capabilities: {},
111
+ clientInfo: { name: 'provisional-reauth-test', version: '0.0.0' },
112
+ },
113
+ }) + '\n');
114
+ await waitFor(() => stdoutBuf.includes('"id":1'), 5000, 'initialize response');
115
+ // Kicks off device flow #1 (authorize call #1 — no prior token exists).
116
+ proc.stdin.write(JSON.stringify({
117
+ jsonrpc: '2.0',
118
+ id: 2,
119
+ method: 'tools/call',
120
+ params: { name: 'whoami', arguments: {} },
121
+ }) + '\n');
122
+ await waitFor(() => stdoutBuf.includes('"id":2'), 15000, 'first whoami response');
123
+ // Wait for the S2 auto-restart to actually fire a second authorize call
124
+ // (triggered by the first poll's expired_token response).
125
+ await waitFor(() => authorizeCalls >= 2, 15000, 'second (S2 restart) authorize call');
126
+ expect(authorizeAuthHeaders[0]).toBeUndefined();
127
+ expect(issuedProvisionalTokens[0]).toBeTruthy();
128
+ expect(authorizeAuthHeaders[1]).toBe(`Bearer ${issuedProvisionalTokens[0]}`);
129
+ }
130
+ finally {
131
+ proc?.kill();
132
+ try {
133
+ rmSync(fakeHome, { recursive: true, force: true });
134
+ }
135
+ catch { /* ignore */ }
136
+ }
137
+ }, 45000);
138
+ });
139
+ function waitFor(predicate, ms, label) {
140
+ return new Promise((resolveOuter, reject) => {
141
+ const start = Date.now();
142
+ const tick = () => {
143
+ if (predicate()) {
144
+ resolveOuter();
145
+ return;
146
+ }
147
+ if (Date.now() - start > ms) {
148
+ reject(new Error(`timeout waiting for ${label}`));
149
+ return;
150
+ }
151
+ setTimeout(tick, 50);
152
+ };
153
+ tick();
154
+ });
155
+ }
156
+ //# sourceMappingURL=provisional-token-reauth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisional-token-reauth.test.js","sourceRoot":"","sources":["../../src/__tests__/provisional-token-reauth.test.ts"],"names":[],"mappings":"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"}