aismemory 0.7.0 → 0.7.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.
@@ -0,0 +1,206 @@
1
+ /**
2
+ * CORBOT-48DD2E25 (F4/F5a): upgrade split-brain regression lock.
3
+ *
4
+ * Reproduces the exact upgrade scenario the adjudication traced: a home
5
+ * directory that already has BOTH an enrolled device key (from a prior
6
+ * 0.7.0 session) AND a leftover v1 credentials.json (a stale bearer that
7
+ * predates the key — the shape every home was left in by 0.6.2, or by any
8
+ * 0.7.0 session before enrollKeyIfNeeded ran).
9
+ *
10
+ * Before the fix, `main()` unconditionally pinned `runPostAuth(creds)` to
11
+ * this stale disk token at startup (index.ts, the `if (creds) {...}` block
12
+ * after the transport connects) — so `hydrateIdentity`, the memory-refresh
13
+ * timer, and auto-handoff all closed over the stale bearer, while the very
14
+ * next tool call mints and uses a DIFFERENT token via the TokenManager
15
+ * (key-auth path). Two live tokens, one session: split-brain.
16
+ *
17
+ * This test proves the stale disk bearer is never sent to AIS at all (F4),
18
+ * and that the disk file itself gets migrated to v2 (no token key) by the
19
+ * time startup post-auth would have run (F5a).
20
+ */
21
+ import { createServer } from 'node:http';
22
+ import { spawn } from 'node:child_process';
23
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync } from 'node:fs';
24
+ import { tmpdir } from 'node:os';
25
+ import { join, resolve } from 'path';
26
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
27
+ import { generateAndSaveKeypair } from '../key-auth.js';
28
+ const STALE_DISK_TOKEN = 'STALE-DISK-TOKEN-V1-MUST-NEVER-BE-SENT';
29
+ function mintJwt(callNumber) {
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', call: callNumber })).toString('base64url');
32
+ return `${header}.${payload}.fakesig-${callNumber}`;
33
+ }
34
+ describe('upgrade split-brain: stale v1 disk token never used when a device key is enrolled', () => {
35
+ let fakeAis;
36
+ let port = 0;
37
+ let authHeadersSeen = [];
38
+ let proveCalls = 0;
39
+ beforeAll(async () => {
40
+ fakeAis = createServer((req, res) => {
41
+ req.on('data', () => { });
42
+ req.on('end', () => {
43
+ const url = req.url ?? '';
44
+ const auth = req.headers['authorization'] ?? '';
45
+ if (auth)
46
+ authHeadersSeen.push(auth);
47
+ if (url === '/v1/auth/challenge' && req.method === 'POST') {
48
+ res.writeHead(200, { 'content-type': 'application/json' });
49
+ res.end(JSON.stringify({
50
+ success: true,
51
+ data: { nonce: 'test-nonce', exp: Math.floor(Date.now() / 1000) + 60, hmac: 'test-hmac' },
52
+ }));
53
+ return;
54
+ }
55
+ if (url === '/v1/auth/did-prove' && req.method === 'POST') {
56
+ proveCalls += 1;
57
+ res.writeHead(200, { 'content-type': 'application/json' });
58
+ res.end(JSON.stringify({
59
+ success: true,
60
+ data: {
61
+ bearerToken: mintJwt(proveCalls),
62
+ expiresAt: new Date(Date.now() + 3600 * 1000).toISOString(),
63
+ },
64
+ }));
65
+ return;
66
+ }
67
+ if (url.startsWith('/v1/agents') && !url.includes('/v1/agents/agent-') && req.method === 'GET') {
68
+ res.writeHead(200, { 'content-type': 'application/json' });
69
+ res.end(JSON.stringify({
70
+ success: true,
71
+ data: {
72
+ agents: [{ id: 'agent-1', name: 'Agent1', status: 'active' }],
73
+ pagination: { total: 1, page: 1, limit: 100, hasMore: false },
74
+ },
75
+ }));
76
+ return;
77
+ }
78
+ if (url === '/v1/agents/agent-1' && req.method === 'GET') {
79
+ res.writeHead(200, { 'content-type': 'application/json' });
80
+ res.end(JSON.stringify({ success: true, data: { id: 'agent-1', name: 'Agent1', status: 'active' } }));
81
+ return;
82
+ }
83
+ // hydration (/v1/agents/agent-1/full-context), memory refresh,
84
+ // handoff — generic success.
85
+ res.writeHead(200, { 'content-type': 'application/json' });
86
+ res.end(JSON.stringify({ success: true, data: {} }));
87
+ });
88
+ });
89
+ await new Promise((resolveListen) => {
90
+ fakeAis.listen(0, '127.0.0.1', () => {
91
+ const addr = fakeAis.address();
92
+ if (addr && typeof addr === 'object')
93
+ port = addr.port;
94
+ resolveListen();
95
+ });
96
+ });
97
+ });
98
+ afterAll(async () => {
99
+ await new Promise((r) => fakeAis?.close(() => r()));
100
+ });
101
+ it('startup with an enrolled key + stale v1 disk token: hydrate/refresh/handoff never carry the stale bearer, and the disk file is migrated to v2', async () => {
102
+ const distPath = resolve(__dirname, '..', '..', 'dist', 'index.js');
103
+ if (!existsSync(distPath)) {
104
+ throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
105
+ }
106
+ authHeadersSeen = [];
107
+ proveCalls = 0;
108
+ const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-split-brain-'));
109
+ const aismemDir = join(fakeHome, '.aismemory');
110
+ mkdirSync(aismemDir, { recursive: true });
111
+ // A device key is already enrolled (prior session).
112
+ await generateAndSaveKeypair({
113
+ userId: 'user-1',
114
+ userDid: 'did:web:test:users:user-1',
115
+ keysDir: join(aismemDir, 'keys'),
116
+ });
117
+ // AND a stale v1 credentials.json is still sitting on disk, valid
118
+ // (not expired) so the pre-fix code's isCredsStale() margin check
119
+ // would happily accept it as the "live" session.
120
+ const credsPath = join(aismemDir, 'credentials.json');
121
+ writeFileSync(credsPath, JSON.stringify({
122
+ token: STALE_DISK_TOKEN,
123
+ agentId: 'agent-1',
124
+ tenantId: 'tenant-1',
125
+ expiresAt: new Date(Date.now() + 3600 * 1000).toISOString(),
126
+ }));
127
+ let proc = null;
128
+ try {
129
+ proc = spawn('node', [distPath], {
130
+ env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}` },
131
+ stdio: ['pipe', 'pipe', 'pipe'],
132
+ });
133
+ let stdoutBuf = '';
134
+ proc.stdout.on('data', (d) => { stdoutBuf += d.toString(); });
135
+ proc.stderr.on('data', () => { });
136
+ proc.stdin.write(JSON.stringify({
137
+ jsonrpc: '2.0', id: 0, method: 'initialize',
138
+ params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'split-brain-test', version: '0.0.0' } },
139
+ }) + '\n');
140
+ await waitFor(() => stdoutBuf.includes('"id":0'), 5000, 'initialize response');
141
+ // Drive one real tool call through the key-auth (TokenManager) path
142
+ // so post-auth wiring (hydrate/refresh/handoff) actually runs.
143
+ const id1 = 1;
144
+ proc.stdin.write(JSON.stringify({
145
+ jsonrpc: '2.0', id: id1, method: 'tools/call', params: { name: 'whoami', arguments: {} },
146
+ }) + '\n');
147
+ await waitFor(() => stdoutBuf.includes(`"id":${id1}`), 15000, 'first whoami response');
148
+ expect(extractResponseText(stdoutBuf, id1)).toContain('agent-1');
149
+ // Give async post-auth (enrollKeyIfNeeded no-op, hydrateIdentity,
150
+ // applyMemoryRefresh, setupAutoHandoff) a moment to run.
151
+ await new Promise((r) => setTimeout(r, 500));
152
+ // F4: the stale disk bearer must NEVER have been sent to AIS, from
153
+ // startup through post-auth — every Authorization header observed
154
+ // must be a manager-minted token, never the stale one.
155
+ const staleBearerHeader = `Bearer ${STALE_DISK_TOKEN}`;
156
+ expect(authHeadersSeen).not.toContain(staleBearerHeader);
157
+ expect(proveCalls).toBeGreaterThan(0); // the TokenManager did mint its own token
158
+ // F5a: the on-disk file must already be migrated to v2 (ids only) —
159
+ // the stale bearer does not survive past this same process start.
160
+ const rawOnDisk = readFileSync(credsPath, 'utf-8');
161
+ const parsedOnDisk = JSON.parse(rawOnDisk);
162
+ expect(parsedOnDisk.schemaVersion).toBe(2);
163
+ expect(Object.prototype.hasOwnProperty.call(parsedOnDisk, 'token')).toBe(false);
164
+ expect(rawOnDisk).not.toContain(STALE_DISK_TOKEN);
165
+ }
166
+ finally {
167
+ proc?.kill();
168
+ try {
169
+ rmSync(fakeHome, { recursive: true, force: true });
170
+ }
171
+ catch { /* ignore */ }
172
+ }
173
+ }, 30000);
174
+ });
175
+ function waitFor(predicate, ms, label) {
176
+ return new Promise((resolveOuter, reject) => {
177
+ const start = Date.now();
178
+ const tick = () => {
179
+ if (predicate()) {
180
+ resolveOuter();
181
+ return;
182
+ }
183
+ if (Date.now() - start > ms) {
184
+ reject(new Error(`timeout waiting for ${label}`));
185
+ return;
186
+ }
187
+ setTimeout(tick, 50);
188
+ };
189
+ tick();
190
+ });
191
+ }
192
+ function extractResponseText(buf, id) {
193
+ for (const line of buf.split('\n')) {
194
+ if (!line.includes(`"id":${id}`))
195
+ continue;
196
+ try {
197
+ const parsed = JSON.parse(line);
198
+ const text = parsed.result?.content?.[0]?.text;
199
+ if (typeof text === 'string')
200
+ return text;
201
+ }
202
+ catch { /* malformed line; skip */ }
203
+ }
204
+ return '';
205
+ }
206
+ //# sourceMappingURL=split-brain-upgrade-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-brain-upgrade-e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/split-brain-upgrade-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -227,6 +227,156 @@ describe('createTokenManager', () => {
227
227
  expect(auth.calls()).toBe(2); // gated — no extra authenticate() attempt inside the window
228
228
  mgr.stop();
229
229
  });
230
+ // ─────────────────────────────────────────────────────────────────────────
231
+ // CORBOT-4F7CAA8E: TokenManager hardening (F1, F2a, F2b, F3, F7)
232
+ // ─────────────────────────────────────────────────────────────────────────
233
+ it('F2a: recordFailure runs exactly once per failed inFlight regardless of concurrent waiter count', async () => {
234
+ const auth = createAuthMock();
235
+ auth.setMode('fail'); // AIS down from the first call — cold-start failure, shared by 3 concurrent waiters
236
+ const identity = createIdentityMock();
237
+ const events = [];
238
+ const mgr = createTokenManager({
239
+ authenticate: auth.fn,
240
+ resolveIdentity: identity.fn,
241
+ onEvent: (event, detail) => events.push({ event, detail }),
242
+ });
243
+ const results = await Promise.allSettled([
244
+ mgr.getCredentials(),
245
+ mgr.getCredentials(),
246
+ mgr.getCredentials(),
247
+ ]);
248
+ for (const r of results) {
249
+ expect(r.status).toBe('rejected');
250
+ }
251
+ // One shared inFlight authenticate() attempt for all 3 waiters...
252
+ expect(auth.calls()).toBe(1);
253
+ // ...and exactly one recordFailure — NOT one per waiter (which would
254
+ // escalate retryDelayMs 5s -> 10s -> 20s from a single failure).
255
+ expect(events.filter((e) => e.event === 'renew.retry')).toHaveLength(1);
256
+ mgr.stop();
257
+ });
258
+ it('F1: renew() joins the shared inFlight instead of racing a second authenticate() when the gate window and the jittered retry timer disagree', async () => {
259
+ // Force jitter() to always draw its maximum factor (1.2x) so the
260
+ // jittered retry timer fires measurably LATER than the un-jittered
261
+ // backoff value. Before the fix, getCredentials()'s gate compared
262
+ // against the un-jittered retryDelayMs, so a call landing in that gap
263
+ // would slip past the gate and start its OWN authenticate() call while
264
+ // the background renew() timer was still pending — a second, concurrent
265
+ // authenticate() for the same outage window. The race only matters once
266
+ // the current token has hard-expired (before that the fast path shields
267
+ // every call), so this test uses a short (40s) TTL to reach hard expiry
268
+ // quickly instead of the 1h TTL used elsewhere in this file.
269
+ const randomSpy = vi.spyOn(Math, 'random').mockReturnValue(1);
270
+ try {
271
+ const identity = createIdentityMock();
272
+ let mode = 'ok';
273
+ let callCount = 0;
274
+ const auth = vi.fn(async () => {
275
+ callCount++;
276
+ if (mode === 'fail') {
277
+ throw new Error(`auth-failed-${callCount}`);
278
+ }
279
+ return { token: `t${callCount}`, expiresAt: new Date(Date.now() + 40_000).toISOString() };
280
+ });
281
+ const mgr = createTokenManager({ authenticate: auth, resolveIdentity: identity.fn });
282
+ await mgr.getCredentials(); // t1, call #1, expires T=40_000
283
+ expect(callCount).toBe(1);
284
+ mode = 'fail';
285
+ // scheduleRenewal floors at 30s (F7), so the background renewal fires
286
+ // at T=30_000 (before t1's own T=40_000 expiry).
287
+ await vi.advanceTimersByTimeAsync(30_000); // T=30_000 -> call #2 fails; retryDelayMs=5_000, nextAttemptAt=T=36_000
288
+ expect(callCount).toBe(2);
289
+ await vi.advanceTimersByTimeAsync(6_000); // T=36_000 -> call #3 fails; retryDelayMs=10_000, nextAttemptAt=T=48_000
290
+ expect(callCount).toBe(3);
291
+ // T=47_000: t1 (expired T=40_000) is now hard-expired, so
292
+ // getCredentials() actually reaches the gate instead of the fast
293
+ // path. The OLD, buggy gate compared against the un-jittered
294
+ // retryDelayMs (36_000+10_000=46_000) and would have let this call
295
+ // through — racing the real jittered schedule (36_000 +
296
+ // jitter(10_000)=48_000 with the pinned 1.2x factor).
297
+ await vi.advanceTimersByTimeAsync(11_000); // T=47_000
298
+ await expect(mgr.getCredentials()).rejects.toBeInstanceOf(AisUnreachableError);
299
+ expect(callCount).toBe(3); // gated -- no extra authenticate() call from this call
300
+ // Cross the real jittered mark (T=48_000) -- only the background
301
+ // renew() timer makes the next attempt.
302
+ await vi.advanceTimersByTimeAsync(2_000); // T=49_000
303
+ expect(callCount).toBe(4);
304
+ mgr.stop();
305
+ }
306
+ finally {
307
+ randomSpy.mockRestore();
308
+ }
309
+ });
310
+ it('F3: a failed FIRST acquire (no current token) schedules the background retry loop, matching renew()\'s catch', async () => {
311
+ const auth = createAuthMock();
312
+ auth.setMode('fail'); // AIS down before any successful acquire ever happens
313
+ const identity = createIdentityMock();
314
+ const mgr = createTokenManager({ authenticate: auth.fn, resolveIdentity: identity.fn });
315
+ await expect(mgr.getCredentials()).rejects.toBeInstanceOf(AisUnreachableError);
316
+ expect(auth.calls()).toBe(1);
317
+ // Recovery must happen purely from the background retry loop this fix
318
+ // schedules on a cold-start failure — no further getCredentials() call
319
+ // is made here.
320
+ auth.setMode('ok');
321
+ await advanceUntil(() => auth.calls() > 1, 6_500, 5);
322
+ expect(auth.calls()).toBe(2);
323
+ mgr.stop();
324
+ });
325
+ it('F7: acquire() rejects an expiresAt in the past', async () => {
326
+ const identity = createIdentityMock();
327
+ let authCalls = 0;
328
+ const pastAuth = vi.fn(async () => {
329
+ authCalls++;
330
+ return { token: 'past-token', expiresAt: new Date(Date.now() - 1_000).toISOString() };
331
+ });
332
+ const mgr = createTokenManager({ authenticate: pastAuth, resolveIdentity: identity.fn });
333
+ await expect(mgr.getCredentials()).rejects.toBeInstanceOf(AisUnreachableError);
334
+ expect(authCalls).toBe(1);
335
+ mgr.stop();
336
+ });
337
+ it('F7: scheduleRenewal floors the renewal delay at 30s even for a short-TTL token', async () => {
338
+ const identity = createIdentityMock();
339
+ let authCalls = 0;
340
+ const shortTtlAuth = vi.fn(async () => {
341
+ authCalls++;
342
+ return { token: `s${authCalls}`, expiresAt: new Date(Date.now() + 10_000).toISOString() }; // 10s TTL
343
+ });
344
+ const mgr = createTokenManager({ authenticate: shortTtlAuth, resolveIdentity: identity.fn });
345
+ await mgr.getCredentials();
346
+ expect(authCalls).toBe(1);
347
+ // 75% of a 10s TTL is 7.5s -- without the 30s floor, renewal would
348
+ // already have fired well before this point.
349
+ await vi.advanceTimersByTimeAsync(20_000);
350
+ expect(authCalls).toBe(1);
351
+ await vi.advanceTimersByTimeAsync(10_500); // crosses the 30s floor
352
+ expect(authCalls).toBe(2);
353
+ mgr.stop();
354
+ });
355
+ it('F2b regression (escalated-backoff rotation strand): invalidate({resetBackoff:true}) after escalated backoff lets the next getCredentials() re-prove immediately', async () => {
356
+ const auth = createAuthMock();
357
+ const identity = createIdentityMock();
358
+ const mgr = createTokenManager({ authenticate: auth.fn, resolveIdentity: identity.fn });
359
+ await mgr.getCredentials(); // t1, call #1
360
+ auth.setMode('fail');
361
+ // Escalate backoff through several failed renewals: 5s -> 10s -> 20s.
362
+ await vi.advanceTimersByTimeAsync(2_700_000); // 75% TTL -> renewal fails, call #2 (retryDelayMs=5s)
363
+ expect(auth.calls()).toBe(2);
364
+ await advanceUntil(() => auth.calls() >= 3, 6_500, 5); // call #3 (retryDelayMs=10s)
365
+ await advanceUntil(() => auth.calls() >= 4, 12_500, 5); // call #4 (retryDelayMs=20s)
366
+ expect(auth.calls()).toBe(4);
367
+ // t1 is still time-valid — a plain getCredentials() would just return it
368
+ // via the fast path. Simulate the server-rejection / JWT-rotation case
369
+ // invalidate() exists for: the server (now healthy again) rejects the
370
+ // still-time-valid token mid-session.
371
+ auth.setMode('ok');
372
+ mgr.invalidate({ resetBackoff: true });
373
+ // Must re-prove IMMEDIATELY — the escalated 20s backoff window (still
374
+ // very much active by wall-clock terms) must NOT gate this call.
375
+ const recovered = await mgr.getCredentials();
376
+ expect(recovered.token).not.toBe('t1');
377
+ expect(auth.calls()).toBe(5);
378
+ mgr.stop();
379
+ });
230
380
  it('acquire(): a non-finite expiresAt from authenticate() rejects instead of scheduling a near-zero renewal loop', async () => {
231
381
  const identity = createIdentityMock();
232
382
  let authCalls = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"token-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/token-manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/token-manager.test.ts"],"names":[],"mappings":"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"}
@@ -7,18 +7,53 @@ export interface AgentPreference {
7
7
  * Persist agent preference (schemaVersion + ids, no secrets) under
8
8
  * ~/.aismemory/credentials.json with restrictive POSIX permissions
9
9
  * (dir 0700, file 0600). Replaces legacy token-based persistence.
10
+ *
11
+ * F6 (CORBOT-48DD2E25): writes via a tmp file + renameSync so a crash
12
+ * mid-write can never leave a truncated/corrupt credentials.json behind,
13
+ * and two processes racing this same path never interleave partial writes
14
+ * (mirrors the atomic-write pattern in config.ts:59-62).
10
15
  */
11
16
  export declare function saveAgentPreference(pref: {
12
17
  agentId: string;
13
18
  tenantId: string;
14
19
  }, home?: string): void;
20
+ /**
21
+ * Migrate a legacy v1 credentials.json (token/agentId/tenantId/expiresAt) to
22
+ * the v2 schema (schemaVersion + ids only) IN PLACE, atomically — but ONLY
23
+ * when a device key is enrolled.
24
+ *
25
+ * F5a (CORBOT-48DD2E25): once a device key exists, the TokenManager mints
26
+ * its own tokens via key auth and the disk bearer is no longer needed —
27
+ * it must not survive past the first process start that observes both the
28
+ * v1 file and the enrolled key ("zero secrets at rest" was false for that
29
+ * window before this fix; the bearer used to live on disk until the next
30
+ * unrelated write).
31
+ *
32
+ * F5b (CORBOT-48DD2E25): when NO device key is enrolled, migrating here
33
+ * would strand that cohort with neither a live disk token nor a key to
34
+ * silently re-auth with — every silent stdio respawn would then demand a
35
+ * fresh browser bond, which 0.6.2 never did (it kept the token on disk and
36
+ * reconnected silently). So the v1 token is deliberately left in place
37
+ * until a key gets enrolled (this same check migrates it on the very next
38
+ * load) or a fresh device-flow completion overwrites the file.
39
+ *
40
+ * Best-effort: any read/parse/write failure is swallowed — migration must
41
+ * never block startup or credential loading. `home`/`hasKey` are
42
+ * parameterized for tests; production callers use the defaults.
43
+ */
44
+ export declare function migrateCredentialsFileIfNeeded(home?: string, hasKey?: () => boolean): void;
15
45
  /**
16
46
  * Load agent preference from ~/.aismemory/credentials.json.
17
47
  * Handles both v2 files (agentId/tenantId only) and legacy v1 files
18
48
  * (token/agentId/tenantId/expiresAt) — returns ids only.
19
49
  * Returns null if file is missing or corrupt.
50
+ *
51
+ * Triggers migrateCredentialsFileIfNeeded() first (F5a/F5b) so every
52
+ * caller on this path — including the TokenManager's per-acquire
53
+ * resolveIdentity() in index.ts — helps migrate a v1 file left over from
54
+ * before the device key was enrolled.
20
55
  */
21
- export declare function loadAgentPreference(home?: string): {
56
+ export declare function loadAgentPreference(home?: string, hasKey?: () => boolean): {
22
57
  agentId: string;
23
58
  tenantId: string;
24
59
  } | null;
@@ -1,14 +1,26 @@
1
- import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
3
4
  import { credentialsDir, credentialsFilePath } from './oauth-credentials.js';
5
+ import { hasEnrolledKey } from './key-auth.js';
6
+ /** Default hasKey() check for `home`, wired to the real on-disk key store. */
7
+ function defaultHasKey(home) {
8
+ return () => hasEnrolledKey({ keysDir: join(home, '.aismemory', 'keys') });
9
+ }
4
10
  /**
5
11
  * Persist agent preference (schemaVersion + ids, no secrets) under
6
12
  * ~/.aismemory/credentials.json with restrictive POSIX permissions
7
13
  * (dir 0700, file 0600). Replaces legacy token-based persistence.
14
+ *
15
+ * F6 (CORBOT-48DD2E25): writes via a tmp file + renameSync so a crash
16
+ * mid-write can never leave a truncated/corrupt credentials.json behind,
17
+ * and two processes racing this same path never interleave partial writes
18
+ * (mirrors the atomic-write pattern in config.ts:59-62).
8
19
  */
9
20
  export function saveAgentPreference(pref, home = homedir()) {
10
21
  const dir = credentialsDir(home);
11
22
  const file = credentialsFilePath(home);
23
+ const tmp = `${file}.tmp`;
12
24
  // Create directory with restrictive permissions (0700)
13
25
  mkdirSync(dir, { recursive: true, mode: 0o700 });
14
26
  // Write the file with schemaVersion + ids (no legacy token/expiresAt)
@@ -17,19 +29,83 @@ export function saveAgentPreference(pref, home = homedir()) {
17
29
  agentId: pref.agentId,
18
30
  tenantId: pref.tenantId,
19
31
  };
20
- writeFileSync(file, JSON.stringify(data, null, 2), { mode: 0o600 });
32
+ writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });
33
+ renameSync(tmp, file);
21
34
  // chmod is the reliable path on POSIX
22
35
  if (process.platform !== 'win32') {
23
36
  chmodSync(file, 0o600);
24
37
  }
25
38
  }
39
+ /**
40
+ * Migrate a legacy v1 credentials.json (token/agentId/tenantId/expiresAt) to
41
+ * the v2 schema (schemaVersion + ids only) IN PLACE, atomically — but ONLY
42
+ * when a device key is enrolled.
43
+ *
44
+ * F5a (CORBOT-48DD2E25): once a device key exists, the TokenManager mints
45
+ * its own tokens via key auth and the disk bearer is no longer needed —
46
+ * it must not survive past the first process start that observes both the
47
+ * v1 file and the enrolled key ("zero secrets at rest" was false for that
48
+ * window before this fix; the bearer used to live on disk until the next
49
+ * unrelated write).
50
+ *
51
+ * F5b (CORBOT-48DD2E25): when NO device key is enrolled, migrating here
52
+ * would strand that cohort with neither a live disk token nor a key to
53
+ * silently re-auth with — every silent stdio respawn would then demand a
54
+ * fresh browser bond, which 0.6.2 never did (it kept the token on disk and
55
+ * reconnected silently). So the v1 token is deliberately left in place
56
+ * until a key gets enrolled (this same check migrates it on the very next
57
+ * load) or a fresh device-flow completion overwrites the file.
58
+ *
59
+ * Best-effort: any read/parse/write failure is swallowed — migration must
60
+ * never block startup or credential loading. `home`/`hasKey` are
61
+ * parameterized for tests; production callers use the defaults.
62
+ */
63
+ export function migrateCredentialsFileIfNeeded(home = homedir(), hasKey = defaultHasKey(home)) {
64
+ const file = credentialsFilePath(home);
65
+ try {
66
+ if (!existsSync(file))
67
+ return;
68
+ const raw = readFileSync(file, 'utf-8');
69
+ const parsed = JSON.parse(raw);
70
+ // Already v2 (or an unrecognized shape) — nothing to migrate.
71
+ if (typeof parsed['token'] !== 'string')
72
+ return;
73
+ const agentId = parsed['agentId'];
74
+ const tenantId = parsed['tenantId'];
75
+ if (typeof agentId !== 'string' || typeof tenantId !== 'string')
76
+ return;
77
+ // F5b: do not strand the no-enrolled-key cohort.
78
+ if (!hasKey())
79
+ return;
80
+ const dir = credentialsDir(home);
81
+ const tmp = `${file}.tmp`;
82
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
83
+ const data = { schemaVersion: 2, agentId, tenantId };
84
+ writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });
85
+ renameSync(tmp, file);
86
+ if (process.platform !== 'win32') {
87
+ chmodSync(file, 0o600);
88
+ }
89
+ }
90
+ catch {
91
+ // Best-effort — a migration failure must never block startup. The
92
+ // existing v1-tolerant parse in loadAgentPreference (below) and
93
+ // loadCredentials (index.ts) still work even if migration didn't run.
94
+ }
95
+ }
26
96
  /**
27
97
  * Load agent preference from ~/.aismemory/credentials.json.
28
98
  * Handles both v2 files (agentId/tenantId only) and legacy v1 files
29
99
  * (token/agentId/tenantId/expiresAt) — returns ids only.
30
100
  * Returns null if file is missing or corrupt.
101
+ *
102
+ * Triggers migrateCredentialsFileIfNeeded() first (F5a/F5b) so every
103
+ * caller on this path — including the TokenManager's per-acquire
104
+ * resolveIdentity() in index.ts — helps migrate a v1 file left over from
105
+ * before the device key was enrolled.
31
106
  */
32
- export function loadAgentPreference(home = homedir()) {
107
+ export function loadAgentPreference(home = homedir(), hasKey = defaultHasKey(home)) {
108
+ migrateCredentialsFileIfNeeded(home, hasKey);
33
109
  const file = credentialsFilePath(home);
34
110
  try {
35
111
  if (!existsSync(file))
@@ -1 +1 @@
1
- {"version":3,"file":"agent-preference.js","sourceRoot":"","sources":["../src/agent-preference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAQ7E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAA2C,EAC3C,OAAe,OAAO,EAAE;IAExB,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEvC,uDAAuD;IACvD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEjD,sEAAsE;IACtE,MAAM,IAAI,GAAG;QACX,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;IAEF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpE,sCAAsC;IACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,OAAO,EAAE;IAI1D,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAE9D,uEAAuE;QACvE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"agent-preference.js","sourceRoot":"","sources":["../src/agent-preference.ts"],"names":[],"mappings":"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"}