@evident-ai/cli 3.2.1-dev.84ddd25 → 3.2.1-dev.8f13d30
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/dist/index.js +68 -28
- package/dist/index.js.map +1 -1
- package/package.json +2 -4
package/dist/index.js
CHANGED
|
@@ -212,51 +212,80 @@ var api = {
|
|
|
212
212
|
|
|
213
213
|
// src/lib/keychain.ts
|
|
214
214
|
var SERVICE_NAME = "evident-cli";
|
|
215
|
-
var
|
|
216
|
-
|
|
215
|
+
var PROBE_SERVICE_NAME = "evident-cli-probe";
|
|
216
|
+
var keychainWarned = false;
|
|
217
|
+
function warnUnavailable(err) {
|
|
218
|
+
if (!keychainWarned) {
|
|
219
|
+
keychainWarned = true;
|
|
220
|
+
console.warn(
|
|
221
|
+
`System keychain unavailable, falling back to file-based credential storage: ${err instanceof Error ? err.message : String(err)}`
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
var keychain;
|
|
226
|
+
async function probeKeychain() {
|
|
217
227
|
try {
|
|
218
|
-
const keytar = await import("keytar");
|
|
228
|
+
const keytar = await import("@napi-rs/keyring/keytar.js");
|
|
219
229
|
if (typeof keytar.setPassword !== "function") {
|
|
220
230
|
return null;
|
|
221
231
|
}
|
|
232
|
+
await keytar.findCredentials(PROBE_SERVICE_NAME);
|
|
222
233
|
return keytar;
|
|
223
234
|
} catch (err) {
|
|
224
|
-
|
|
225
|
-
keytarWarned = true;
|
|
226
|
-
console.warn(
|
|
227
|
-
`System keychain unavailable, falling back to file-based credential storage: ${err instanceof Error ? err.message : String(err)}`
|
|
228
|
-
);
|
|
229
|
-
}
|
|
235
|
+
warnUnavailable(err);
|
|
230
236
|
return null;
|
|
231
237
|
}
|
|
232
238
|
}
|
|
239
|
+
function resolveKeychain() {
|
|
240
|
+
if (!keychain) {
|
|
241
|
+
keychain = probeKeychain();
|
|
242
|
+
}
|
|
243
|
+
return keychain;
|
|
244
|
+
}
|
|
233
245
|
function keychainAccount() {
|
|
234
246
|
return getApiUrlConfig();
|
|
235
247
|
}
|
|
248
|
+
function storeInFileFallback(credentials2) {
|
|
249
|
+
setCredentials({
|
|
250
|
+
token: credentials2.token,
|
|
251
|
+
user: credentials2.user,
|
|
252
|
+
expiresAt: credentials2.expiresAt
|
|
253
|
+
});
|
|
254
|
+
}
|
|
236
255
|
async function storeToken(credentials2) {
|
|
237
|
-
const keytar = await
|
|
256
|
+
const keytar = await resolveKeychain();
|
|
238
257
|
if (keytar) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
});
|
|
258
|
+
try {
|
|
259
|
+
await keytar.setPassword(SERVICE_NAME, keychainAccount(), JSON.stringify(credentials2));
|
|
260
|
+
return;
|
|
261
|
+
} catch (err) {
|
|
262
|
+
warnUnavailable(err);
|
|
263
|
+
}
|
|
246
264
|
}
|
|
265
|
+
storeInFileFallback(credentials2);
|
|
247
266
|
}
|
|
248
267
|
async function getToken() {
|
|
249
|
-
const keytar = await
|
|
268
|
+
const keytar = await resolveKeychain();
|
|
250
269
|
if (keytar) {
|
|
251
270
|
const account = keychainAccount();
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
271
|
+
try {
|
|
272
|
+
const stored = await keytar.getPassword(SERVICE_NAME, account);
|
|
273
|
+
if (stored) {
|
|
274
|
+
try {
|
|
275
|
+
return JSON.parse(stored);
|
|
276
|
+
} catch {
|
|
277
|
+
try {
|
|
278
|
+
await keytar.deletePassword(SERVICE_NAME, account);
|
|
279
|
+
} catch (err) {
|
|
280
|
+
console.warn(
|
|
281
|
+
`Failed to clear invalid keychain entry for ${account}: ${err instanceof Error ? err.message : String(err)}`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
259
286
|
}
|
|
287
|
+
} catch (err) {
|
|
288
|
+
warnUnavailable(err);
|
|
260
289
|
}
|
|
261
290
|
}
|
|
262
291
|
const creds = getCredentials();
|
|
@@ -273,7 +302,7 @@ function toError(err) {
|
|
|
273
302
|
return err instanceof Error ? err : new Error(String(err));
|
|
274
303
|
}
|
|
275
304
|
async function deleteToken(options = {}) {
|
|
276
|
-
const keytar = await
|
|
305
|
+
const keytar = await resolveKeychain();
|
|
277
306
|
const failures = [];
|
|
278
307
|
if (keytar) {
|
|
279
308
|
if (options.all) {
|
|
@@ -286,14 +315,25 @@ async function deleteToken(options = {}) {
|
|
|
286
315
|
await Promise.all(
|
|
287
316
|
accounts.map(async (entry) => {
|
|
288
317
|
try {
|
|
289
|
-
await keytar.deletePassword(SERVICE_NAME, entry.account);
|
|
318
|
+
const deleted = await keytar.deletePassword(SERVICE_NAME, entry.account);
|
|
319
|
+
if (!deleted) {
|
|
320
|
+
failures.push({
|
|
321
|
+
type: "delete",
|
|
322
|
+
account: entry.account,
|
|
323
|
+
error: new Error("deletePassword resolved false")
|
|
324
|
+
});
|
|
325
|
+
}
|
|
290
326
|
} catch (err) {
|
|
291
327
|
failures.push({ type: "delete", account: entry.account, error: toError(err) });
|
|
292
328
|
}
|
|
293
329
|
})
|
|
294
330
|
);
|
|
295
331
|
} else {
|
|
296
|
-
|
|
332
|
+
try {
|
|
333
|
+
await keytar.deletePassword(SERVICE_NAME, keychainAccount());
|
|
334
|
+
} catch (err) {
|
|
335
|
+
warnUnavailable(err);
|
|
336
|
+
}
|
|
297
337
|
}
|
|
298
338
|
}
|
|
299
339
|
if (options.all) {
|