@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 CHANGED
@@ -212,51 +212,80 @@ var api = {
212
212
 
213
213
  // src/lib/keychain.ts
214
214
  var SERVICE_NAME = "evident-cli";
215
- var keytarWarned = false;
216
- async function getKeytar() {
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
- if (!keytarWarned) {
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 getKeytar();
256
+ const keytar = await resolveKeychain();
238
257
  if (keytar) {
239
- await keytar.setPassword(SERVICE_NAME, keychainAccount(), JSON.stringify(credentials2));
240
- } else {
241
- setCredentials({
242
- token: credentials2.token,
243
- user: credentials2.user,
244
- expiresAt: credentials2.expiresAt
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 getKeytar();
268
+ const keytar = await resolveKeychain();
250
269
  if (keytar) {
251
270
  const account = keychainAccount();
252
- const stored = await keytar.getPassword(SERVICE_NAME, account);
253
- if (stored) {
254
- try {
255
- return JSON.parse(stored);
256
- } catch {
257
- await keytar.deletePassword(SERVICE_NAME, account);
258
- return null;
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 getKeytar();
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
- await keytar.deletePassword(SERVICE_NAME, keychainAccount());
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) {