@clien-ai/mcp 0.1.0
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 +221 -0
- package/dist/auth/oauth.js +468 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/pkce.js +31 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/storage.js +371 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/cli.js +280 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/authorize.js +57 -0
- package/dist/commands/authorize.js.map +1 -0
- package/dist/commands/install.js +144 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logout.js +35 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/status.js +70 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.js +48 -0
- package/dist/config.js.map +1 -0
- package/dist/server.js +189 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/research.js +453 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/types/report.js +60 -0
- package/dist/types/report.js.map +1 -0
- package/dist/util/atomic-write.js +43 -0
- package/dist/util/atomic-write.js.map +1 -0
- package/dist/util/exit-codes.js +97 -0
- package/dist/util/exit-codes.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PKCE helpers per RFC 7636.
|
|
3
|
+
*
|
|
4
|
+
* - Verifier: 32 random bytes, base64url-encoded -> 43 chars (unreserved).
|
|
5
|
+
* - Challenge: base64url(SHA-256(verifier)).
|
|
6
|
+
* - State: 32 random bytes, base64url-encoded (used to bind authorize -> callback).
|
|
7
|
+
*/
|
|
8
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
9
|
+
/** Base64url encode (no padding). Node 16+ supports this encoding natively. */
|
|
10
|
+
function b64url(buf) {
|
|
11
|
+
return buf.toString('base64url');
|
|
12
|
+
}
|
|
13
|
+
export function generateCodeVerifier() {
|
|
14
|
+
// 32 bytes -> 43 base64url chars, within RFC 7636 min 43 / max 128.
|
|
15
|
+
return b64url(randomBytes(32));
|
|
16
|
+
}
|
|
17
|
+
export function deriveCodeChallenge(verifier) {
|
|
18
|
+
return b64url(createHash('sha256').update(verifier).digest());
|
|
19
|
+
}
|
|
20
|
+
export function generatePkcePair() {
|
|
21
|
+
const verifier = generateCodeVerifier();
|
|
22
|
+
return {
|
|
23
|
+
verifier,
|
|
24
|
+
challenge: deriveCodeChallenge(verifier),
|
|
25
|
+
method: 'S256',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function generateState() {
|
|
29
|
+
return b64url(randomBytes(32));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=pkce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAQrD,+EAA+E;AAC/E,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,oEAAoE;IACpE,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAA;IACvC,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,mBAAmB,CAAC,QAAQ,CAAC;QACxC,MAAM,EAAE,MAAM;KACf,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refresh-token storage for @clien-ai/mcp.
|
|
3
|
+
*
|
|
4
|
+
* Tries `keytar` (OS-native keyring) first; if unavailable (common on WSL,
|
|
5
|
+
* headless Linux without libsecret), falls back to an AES-256-GCM encrypted
|
|
6
|
+
* file at `~/.clien-ai/tokens.json.enc`. The encryption key is derived from a
|
|
7
|
+
* host-stable identifier (machine-id / IOPlatformUUID / MachineGuid) via
|
|
8
|
+
* SHA-256. Not as strong as the OS keychain but strictly better than plaintext.
|
|
9
|
+
*
|
|
10
|
+
* We do NOT multi-write (file + keyring). Once a backend is chosen the token
|
|
11
|
+
* lives only there. On the first successful OAuth after the backend flips
|
|
12
|
+
* (e.g. libsecret installed later), the old file is lazily cleared.
|
|
13
|
+
*/
|
|
14
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes, } from 'node:crypto';
|
|
15
|
+
import { execFileSync } from 'node:child_process';
|
|
16
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, statSync, } from 'node:fs';
|
|
17
|
+
import { homedir, platform } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import lockfile from 'proper-lockfile';
|
|
20
|
+
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
21
|
+
import { OAuthError } from './oauth.js';
|
|
22
|
+
const SERVICE_NAME = 'clien-ai';
|
|
23
|
+
const ACCOUNT = 'refresh';
|
|
24
|
+
const STORAGE_DIR = '.clien-ai';
|
|
25
|
+
const TOKEN_FILE = 'tokens.json.enc';
|
|
26
|
+
let cachedKeytar;
|
|
27
|
+
let keytarAvailability = 'unknown';
|
|
28
|
+
async function getKeytar() {
|
|
29
|
+
if (cachedKeytar !== undefined)
|
|
30
|
+
return cachedKeytar;
|
|
31
|
+
try {
|
|
32
|
+
// Dynamic import so build doesn't fail when keytar (native module) is
|
|
33
|
+
// missing. The optionalDependencies entry in package.json lets npm skip
|
|
34
|
+
// on platforms without libsecret.
|
|
35
|
+
const mod = (await import('keytar'));
|
|
36
|
+
const impl = mod.default ?? mod;
|
|
37
|
+
cachedKeytar = impl;
|
|
38
|
+
keytarAvailability = 'available';
|
|
39
|
+
return impl;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
cachedKeytar = null;
|
|
43
|
+
keytarAvailability = 'missing';
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// ------------------------------------------------------------------
|
|
48
|
+
// Machine-id derived encryption key (fallback path)
|
|
49
|
+
// ------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Derive a stable per-host identifier. Falls back to hostname if the platform
|
|
52
|
+
* lookup fails — weaker than machine-id but still deterministic per host.
|
|
53
|
+
*/
|
|
54
|
+
function readMachineId() {
|
|
55
|
+
try {
|
|
56
|
+
switch (platform()) {
|
|
57
|
+
case 'linux':
|
|
58
|
+
// /etc/machine-id or /var/lib/dbus/machine-id
|
|
59
|
+
for (const p of ['/etc/machine-id', '/var/lib/dbus/machine-id']) {
|
|
60
|
+
if (existsSync(p)) {
|
|
61
|
+
const val = readFileSync(p, 'utf8').trim();
|
|
62
|
+
if (val.length > 0)
|
|
63
|
+
return val;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
case 'darwin': {
|
|
68
|
+
const out = execFileSync('ioreg', ['-rd1', '-c', 'IOPlatformExpertDevice'], { encoding: 'utf8' });
|
|
69
|
+
const m = /"IOPlatformUUID"\s*=\s*"([0-9A-Fa-f-]+)"/.exec(out);
|
|
70
|
+
if (m)
|
|
71
|
+
return m[1];
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'win32': {
|
|
75
|
+
try {
|
|
76
|
+
// reg.exe is always present on Windows. Parse raw output for the
|
|
77
|
+
// MachineGuid value. Node 20+ ships no winreg binding by default.
|
|
78
|
+
const out = execFileSync('reg', [
|
|
79
|
+
'query',
|
|
80
|
+
'HKLM\\SOFTWARE\\Microsoft\\Cryptography',
|
|
81
|
+
'/v',
|
|
82
|
+
'MachineGuid',
|
|
83
|
+
], { encoding: 'utf8' });
|
|
84
|
+
const m = /MachineGuid\s+REG_SZ\s+([0-9A-Fa-f-]+)/.exec(out);
|
|
85
|
+
if (m)
|
|
86
|
+
return m[1];
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// fall through
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// fall through
|
|
97
|
+
}
|
|
98
|
+
// Deterministic fallback — homedir + hostname is host-stable enough.
|
|
99
|
+
const fallback = `${homedir()}:${process.env.HOSTNAME ?? 'unknown'}`;
|
|
100
|
+
return fallback;
|
|
101
|
+
}
|
|
102
|
+
function deriveKey() {
|
|
103
|
+
const id = readMachineId();
|
|
104
|
+
return createHash('sha256').update(`clien-ai:v1:${id}`).digest(); // 32 bytes
|
|
105
|
+
}
|
|
106
|
+
// ------------------------------------------------------------------
|
|
107
|
+
// Encrypted file helpers
|
|
108
|
+
// ------------------------------------------------------------------
|
|
109
|
+
function storageDir() {
|
|
110
|
+
return join(homedir(), STORAGE_DIR);
|
|
111
|
+
}
|
|
112
|
+
function tokenFilePath() {
|
|
113
|
+
return join(storageDir(), TOKEN_FILE);
|
|
114
|
+
}
|
|
115
|
+
function ensureDir() {
|
|
116
|
+
const dir = storageDir();
|
|
117
|
+
try {
|
|
118
|
+
if (!existsSync(dir)) {
|
|
119
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
120
|
+
}
|
|
121
|
+
chmodSync(dir, 0o700);
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
// ENOENT is a benign race; rethrow others
|
|
125
|
+
if (e.code !== 'ENOENT')
|
|
126
|
+
throw e;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function encryptValue(plain, key) {
|
|
130
|
+
const iv = randomBytes(12);
|
|
131
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
132
|
+
const encrypted = Buffer.concat([cipher.update(plain, 'utf8'), cipher.final()]);
|
|
133
|
+
const tag = cipher.getAuthTag();
|
|
134
|
+
return {
|
|
135
|
+
v: 1,
|
|
136
|
+
iv: iv.toString('base64url'),
|
|
137
|
+
tag: tag.toString('base64url'),
|
|
138
|
+
ct: encrypted.toString('base64url'),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function decryptValue(envelope, key) {
|
|
142
|
+
const iv = Buffer.from(envelope.iv, 'base64url');
|
|
143
|
+
const tag = Buffer.from(envelope.tag, 'base64url');
|
|
144
|
+
const ct = Buffer.from(envelope.ct, 'base64url');
|
|
145
|
+
const decipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
146
|
+
decipher.setAuthTag(tag);
|
|
147
|
+
const plain = Buffer.concat([decipher.update(ct), decipher.final()]);
|
|
148
|
+
return plain.toString('utf8');
|
|
149
|
+
}
|
|
150
|
+
function readFileToken() {
|
|
151
|
+
const path = tokenFilePath();
|
|
152
|
+
if (!existsSync(path))
|
|
153
|
+
return null;
|
|
154
|
+
try {
|
|
155
|
+
const buf = readFileSync(path, 'utf8');
|
|
156
|
+
const envelope = JSON.parse(buf);
|
|
157
|
+
if (envelope.v !== 1 || !envelope.iv || !envelope.tag || !envelope.ct) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return decryptValue(envelope, deriveKey());
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Corrupt file or decryption failure -> treat as missing. The tool call
|
|
164
|
+
// will re-authenticate and overwrite.
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function writeFileToken(value) {
|
|
169
|
+
ensureDir();
|
|
170
|
+
const envelope = encryptValue(value, deriveKey());
|
|
171
|
+
writeFileAtomic(tokenFilePath(), JSON.stringify(envelope));
|
|
172
|
+
}
|
|
173
|
+
function removeFileToken() {
|
|
174
|
+
const p = tokenFilePath();
|
|
175
|
+
if (existsSync(p)) {
|
|
176
|
+
try {
|
|
177
|
+
unlinkSync(p);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// ignore
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Load the refresh token; null if nothing stored or corrupt. */
|
|
185
|
+
export async function loadRefreshToken() {
|
|
186
|
+
const keytar = await getKeytar();
|
|
187
|
+
if (keytar) {
|
|
188
|
+
try {
|
|
189
|
+
const val = await keytar.getPassword(SERVICE_NAME, ACCOUNT);
|
|
190
|
+
if (val && val.length > 0)
|
|
191
|
+
return val;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// keychain failure is unusual once keytar itself loaded — fall through.
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return readFileToken();
|
|
198
|
+
}
|
|
199
|
+
/** Persist the refresh token. Writes to keytar if available, else file. */
|
|
200
|
+
export async function saveRefreshToken(token) {
|
|
201
|
+
if (!token || token.length === 0) {
|
|
202
|
+
throw new Error('Refresh token cannot be empty');
|
|
203
|
+
}
|
|
204
|
+
const keytar = await getKeytar();
|
|
205
|
+
if (keytar) {
|
|
206
|
+
try {
|
|
207
|
+
await keytar.setPassword(SERVICE_NAME, ACCOUNT, token);
|
|
208
|
+
// If we previously fell back to file, clean it up so we don't have
|
|
209
|
+
// two copies drifting apart.
|
|
210
|
+
removeFileToken();
|
|
211
|
+
return 'keytar';
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// fall through to file
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
writeFileToken(token);
|
|
218
|
+
return 'file';
|
|
219
|
+
}
|
|
220
|
+
/** Clear all stored credentials. Best-effort across both backends. */
|
|
221
|
+
export async function clearTokens() {
|
|
222
|
+
const keytar = await getKeytar();
|
|
223
|
+
if (keytar) {
|
|
224
|
+
try {
|
|
225
|
+
await keytar.deletePassword(SERVICE_NAME, ACCOUNT);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// ignore
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
removeFileToken();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Path to the encrypted token file (`~/.clien-ai/tokens.json.enc`). Public
|
|
235
|
+
* because `clien-mcp status` needs it to compute file mtime for the
|
|
236
|
+
* "last refresh" timestamp; previously reached for via the test-only
|
|
237
|
+
* `__testing.tokenFilePath` hatch from production code.
|
|
238
|
+
*/
|
|
239
|
+
export function getTokenFilePath() {
|
|
240
|
+
return tokenFilePath();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Cross-process advisory lock for the token store. Holds the lock for the
|
|
244
|
+
* duration of `fn()` so that "load -> refresh -> save" stays atomic from
|
|
245
|
+
* other MCP processes' perspective.
|
|
246
|
+
*
|
|
247
|
+
* Why we need this: Supabase rotates the refresh token on every refresh, so
|
|
248
|
+
* if two MCP processes both refresh from the same stored token, the second
|
|
249
|
+
* one gets `invalid_grant` ("refresh token already used") and would clear
|
|
250
|
+
* credentials, forcing the user to re-do OAuth. With the lock, the second
|
|
251
|
+
* process waits, then re-reads the rotated token before refreshing.
|
|
252
|
+
*
|
|
253
|
+
* Implementation: proper-lockfile creates `<tokenFile>.lock/` next to the
|
|
254
|
+
* token file. `realpath: false` lets us lock a path even if the token file
|
|
255
|
+
* itself doesn't exist yet (first install).
|
|
256
|
+
*
|
|
257
|
+
* Calibration:
|
|
258
|
+
* - `retries`: ~12s of contention coverage (10 retries x 100-1000ms backoff
|
|
259
|
+
* plus the initial attempt). Long enough to ride out a peer completing
|
|
260
|
+
* its lock body; short enough to surface "stuck" promptly.
|
|
261
|
+
* - `stale: 60s`: lock body holds across a 30s fetch timeout plus a save
|
|
262
|
+
* round-trip. 60s gives ~2x headroom so a healthy-but-slow peer isn't
|
|
263
|
+
* auto-kicked from the lock mid-fetch (which would fire `onCompromised`
|
|
264
|
+
* and abort the lock body via the default-throw behavior).
|
|
265
|
+
* - `onCompromised`: the proper-lockfile default throws an unrecoverable
|
|
266
|
+
* error from the lock body. Ours just logs to stderr (stdout is the MCP
|
|
267
|
+
* transport) and lets fn() finish. Worst case is a peer wins a
|
|
268
|
+
* conflicting save, which our reload-on-invalid-grant retry handles.
|
|
269
|
+
*
|
|
270
|
+
* Lock-acquisition failures (ELOCKED after exhausted retries, EACCES, ...)
|
|
271
|
+
* are wrapped in `OAuthError('lock_unavailable', ...)` so the top-level CLI
|
|
272
|
+
* catch can render an actionable message instead of the raw proper-lockfile
|
|
273
|
+
* string "Lock file is already being held".
|
|
274
|
+
*/
|
|
275
|
+
const LOCK_RETRIES = { retries: 10, minTimeout: 100, maxTimeout: 1000 };
|
|
276
|
+
const LOCK_STALE_MS = 60_000;
|
|
277
|
+
export async function withTokenLock(fn) {
|
|
278
|
+
ensureDir();
|
|
279
|
+
let release;
|
|
280
|
+
try {
|
|
281
|
+
release = await lockfile.lock(tokenFilePath(), {
|
|
282
|
+
realpath: false,
|
|
283
|
+
retries: LOCK_RETRIES,
|
|
284
|
+
stale: LOCK_STALE_MS,
|
|
285
|
+
onCompromised: (err) => {
|
|
286
|
+
process.stderr.write(`[clien-mcp] token lock compromised mid-body (continuing anyway): ${err.message}\n`);
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
292
|
+
throw new OAuthError('lock_unavailable', `Could not acquire the token lock at ${tokenFilePath()}.lock (${message}). ` +
|
|
293
|
+
'Another clien-mcp process may be stuck refreshing -- check `ps -ax | grep clien-mcp`, stop the offender, or remove the .lock directory and retry.');
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
return await fn();
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
try {
|
|
300
|
+
await release();
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// The lock may have already been auto-released as stale, or the
|
|
304
|
+
// underlying fs op failed — neither is worth surfacing to the caller
|
|
305
|
+
// at this point (the protected work has completed).
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Diagnostic helper for `clien-mcp status` and tests.
|
|
311
|
+
*
|
|
312
|
+
* Reports which backend is currently authoritative AND whether either
|
|
313
|
+
* backend holds a token. Critical: when keytar is loadable but reports no
|
|
314
|
+
* password, we MUST fall through to the file backend before declaring
|
|
315
|
+
* "no token" — otherwise `loadRefreshToken()` would still find a file token
|
|
316
|
+
* that `getStorageStatus` claimed didn't exist (correctness regression
|
|
317
|
+
* flagged in cluster 4 review).
|
|
318
|
+
*
|
|
319
|
+
* The reported `backend` reflects where saveRefreshToken() would write
|
|
320
|
+
* next. `hasToken` reflects whether ANY backend currently holds one.
|
|
321
|
+
*/
|
|
322
|
+
export async function getStorageStatus() {
|
|
323
|
+
const path = tokenFilePath();
|
|
324
|
+
const filePresent = existsSync(path) && (() => {
|
|
325
|
+
try {
|
|
326
|
+
return statSync(path).size > 0;
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
})();
|
|
332
|
+
const keytar = await getKeytar();
|
|
333
|
+
if (keytar) {
|
|
334
|
+
try {
|
|
335
|
+
const val = await keytar.getPassword(SERVICE_NAME, ACCOUNT);
|
|
336
|
+
// saveRefreshToken would write to keytar next; report backend='keytar'.
|
|
337
|
+
// hasToken is true if EITHER keytar OR the file fallback holds one.
|
|
338
|
+
return {
|
|
339
|
+
backend: 'keytar',
|
|
340
|
+
hasToken: (!!val && val.length > 0) || filePresent,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// keytar IPC failure — fall through to file-only reporting.
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return { backend: 'file', hasToken: filePresent };
|
|
348
|
+
}
|
|
349
|
+
/** Test-only helpers. Not exported through the package entry. */
|
|
350
|
+
export const __testing = {
|
|
351
|
+
readMachineId,
|
|
352
|
+
deriveKey,
|
|
353
|
+
encryptValue,
|
|
354
|
+
decryptValue,
|
|
355
|
+
tokenFilePath,
|
|
356
|
+
removeFileToken,
|
|
357
|
+
readFileToken,
|
|
358
|
+
writeFileToken,
|
|
359
|
+
resetKeytarCache() {
|
|
360
|
+
cachedKeytar = undefined;
|
|
361
|
+
keytarAvailability = 'unknown';
|
|
362
|
+
},
|
|
363
|
+
setKeytarMock(mock) {
|
|
364
|
+
cachedKeytar = mock;
|
|
365
|
+
keytarAvailability = mock ? 'available' : 'missing';
|
|
366
|
+
},
|
|
367
|
+
getKeytarAvailability() {
|
|
368
|
+
return keytarAvailability;
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/auth/storage.ts"],"names":[],"mappings":"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"}
|