@agentconnect/ui 0.1.4 → 0.1.6

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.
@@ -22,10 +22,16 @@ export declare class AgentConnectConnect extends HTMLElement {
22
22
  private readonly loginPending;
23
23
  private readonly statusCheckInFlight;
24
24
  private readonly modelsRefreshIntervalMs;
25
+ private readonly updatePending;
26
+ private updateRefreshTimer;
27
+ private updateRefreshAttempts;
28
+ private readonly updateRefreshDelayMs;
29
+ private readonly updateRefreshMaxAttempts;
25
30
  constructor();
26
31
  connectedCallback(): void;
27
32
  disconnectedCallback(): void;
28
33
  private createInitialState;
34
+ private createInitialProviders;
29
35
  private get storageKey();
30
36
  private get localConfigKey();
31
37
  private render;
@@ -51,15 +57,19 @@ export declare class AgentConnectConnect extends HTMLElement {
51
57
  private checkProviderStatus;
52
58
  private waitForProviderLogin;
53
59
  private prefetchProviders;
60
+ private scheduleUpdateRefresh;
54
61
  private prefetchAllProviderModels;
55
62
  private refreshModels;
56
63
  private renderProviders;
57
64
  private buildProviderCard;
58
65
  private getProviderStatusText;
59
- private buildProviderAction;
66
+ private isUpdatingProvider;
67
+ private buildProviderActions;
60
68
  private buildActionButton;
69
+ private buildUpdateButton;
61
70
  private handleProviderSelect;
62
71
  private connectProvider;
72
+ private updateProvider;
63
73
  private setProviderLoading;
64
74
  private ensureProviderReady;
65
75
  private openLocalConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/components/connect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAU;;IAyBlD,iBAAiB,IAAI,IAAI;IASzB,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,UAAU;IAiElB,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,OAAO;IAsBf,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,gBAAgB;YAeV,OAAO;IA2DrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,gBAAgB;YAMV,kBAAkB;IA+BhC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,mBAAmB;YAMb,mBAAmB;YA4BnB,oBAAoB;YAoCpB,iBAAiB;YAQjB,yBAAyB;YAQzB,aAAa;IAyC3B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAmEzB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,mBAAmB;IA0C3B,OAAO,CAAC,iBAAiB;YAsBX,oBAAoB;YAUpB,eAAe;IAiC7B,OAAO,CAAC,kBAAkB;YAqBZ,mBAAmB;IA6DjC,OAAO,CAAC,eAAe;YAST,eAAe;IAoE7B,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,yBAAyB;IAOjC,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,0BAA0B;IA6BlC,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;IAwChB,OAAO,CAAC,OAAO;CAkBhB"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/components/connect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAK;;IA2B9C,iBAAiB,IAAI,IAAI;IASzB,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,UAAU;IAiElB,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,OAAO;IAsBf,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,gBAAgB;YAeV,OAAO;IA8FrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,gBAAgB;YAMV,kBAAkB;IAUhC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,mBAAmB;YASb,mBAAmB;YAgDnB,oBAAoB;YA4CpB,iBAAiB;IAQ/B,OAAO,CAAC,qBAAqB;YAcf,yBAAyB;YAmBzB,aAAa;IAyC3B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAgFzB,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IA0D5B,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,iBAAiB;YAyBX,oBAAoB;YAWpB,eAAe;YAiCf,cAAc;IAqB5B,OAAO,CAAC,kBAAkB;YAqBZ,mBAAmB;IA6DjC,OAAO,CAAC,eAAe;YAST,eAAe;IAoE7B,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,yBAAyB;IAOjC,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,0BAA0B;IA6BlC,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;IAwChB,OAAO,CAAC,OAAO;CAkBhB"}
@@ -26,6 +26,11 @@ export class AgentConnectConnect extends HTMLElement {
26
26
  loginPending = new Set();
27
27
  statusCheckInFlight = new Set();
28
28
  modelsRefreshIntervalMs = 30_000;
29
+ updatePending = new Set();
30
+ updateRefreshTimer;
31
+ updateRefreshAttempts;
32
+ updateRefreshDelayMs = 1500;
33
+ updateRefreshMaxAttempts = 2;
29
34
  constructor() {
30
35
  super();
31
36
  this.attachShadow({ mode: 'open' });
@@ -42,6 +47,8 @@ export class AgentConnectConnect extends HTMLElement {
42
47
  this.modelsFetchedAt = 0;
43
48
  this.elements = null;
44
49
  this.loginPollTimer = null;
50
+ this.updateRefreshTimer = null;
51
+ this.updateRefreshAttempts = 0;
45
52
  this.handleResize = () => {
46
53
  if (this.state.view === 'connected' && this.elements?.overlay?.classList.contains('open')) {
47
54
  this.positionPopover(true);
@@ -73,6 +80,14 @@ export class AgentConnectConnect extends HTMLElement {
73
80
  loginExperience: null,
74
81
  };
75
82
  }
83
+ createInitialProviders() {
84
+ return [
85
+ { id: 'claude', name: 'Claude', installed: false, loggedIn: false, pending: true },
86
+ { id: 'codex', name: 'Codex', installed: false, loggedIn: false, pending: true },
87
+ { id: 'cursor', name: 'Cursor', installed: false, loggedIn: false, pending: true },
88
+ { id: 'local', name: 'Local', installed: false, loggedIn: false, pending: true },
89
+ ];
90
+ }
76
91
  get storageKey() {
77
92
  return this.getAttribute('storage-key') || STORAGE_KEYS.lastSelection;
78
93
  }
@@ -258,6 +273,7 @@ export class AgentConnectConnect extends HTMLElement {
258
273
  return [
259
274
  { id: 'claude', name: 'Claude', installed: false, loggedIn: false, pending: true },
260
275
  { id: 'codex', name: 'Codex', installed: false, loggedIn: false, pending: true },
276
+ { id: 'cursor', name: 'Cursor', installed: false, loggedIn: false, pending: true },
261
277
  { id: 'local', name: 'Local', installed: false, loggedIn: false, pending: true },
262
278
  ];
263
279
  }
@@ -297,19 +313,48 @@ export class AgentConnectConnect extends HTMLElement {
297
313
  }
298
314
  try {
299
315
  const client = await getClient();
316
+ let providerIds = [];
300
317
  if (!this.state.loginExperience) {
301
318
  const hello = await client.hello().catch(() => null);
302
319
  this.state.loginExperience = hello?.loginExperience ?? null;
320
+ providerIds = hello?.providers ?? [];
321
+ }
322
+ if (!providerIds.length) {
323
+ providerIds = this.state.providers.map((entry) => entry.id);
324
+ }
325
+ if (!providerIds.length) {
326
+ providerIds = this.createInitialProviders().map((entry) => entry.id);
327
+ }
328
+ let listProviders = null;
329
+ try {
330
+ listProviders = await client.providers.list();
303
331
  }
304
- const providers = await client.providers.list();
305
- this.state.providers = providers;
332
+ catch {
333
+ listProviders = null;
334
+ }
335
+ const listed = new Map((listProviders || []).map((entry) => [entry.id, entry]));
336
+ const existing = new Map(this.state.providers.map((entry) => [entry.id, entry]));
337
+ const initial = new Map(this.createInitialProviders().map((entry) => [entry.id, entry]));
338
+ this.state.providers = providerIds.map((id) => {
339
+ const base = listed.get(id) ||
340
+ existing.get(id) ||
341
+ initial.get(id) || {
342
+ id,
343
+ name: id,
344
+ installed: false,
345
+ loggedIn: false,
346
+ };
347
+ const pending = !listed.get(id);
348
+ return { ...base, pending };
349
+ });
306
350
  if (this.state.connected) {
307
351
  this.state.selectedProvider = this.state.connected.provider;
308
352
  this.state.selectedModel = this.state.connected.model;
309
353
  }
310
354
  else if (!this.state.selectedProvider) {
311
- this.state.selectedProvider = providers[0]?.id || null;
355
+ this.state.selectedProvider = providerIds[0] || null;
312
356
  }
357
+ this.renderProviders();
313
358
  const shouldRefreshModels = !this.state.selectedProvider ||
314
359
  this.state.models.length === 0 ||
315
360
  this.modelsProvider !== this.state.selectedProvider ||
@@ -329,9 +374,14 @@ export class AgentConnectConnect extends HTMLElement {
329
374
  this.renderReasoningEfforts();
330
375
  this.updatePopoverTitle();
331
376
  this.updateButtonLabel();
377
+ this.scheduleUpdateRefresh();
332
378
  if (this.state.view === 'connected') {
333
379
  requestAnimationFrame(() => this.positionPopover());
334
380
  }
381
+ providerIds.forEach((providerId) => {
382
+ const name = this.state.providers.find((entry) => entry.id === providerId)?.name;
383
+ this.checkProviderStatus(providerId, name, { silent: true }).catch(() => { });
384
+ });
335
385
  }
336
386
  catch {
337
387
  if (!silent) {
@@ -363,34 +413,8 @@ export class AgentConnectConnect extends HTMLElement {
363
413
  this.loginPollTimer = null;
364
414
  }
365
415
  async pollProviderStatus() {
366
- const client = await getClient();
367
- const previous = this.state.providers;
368
- const providers = await client.providers.list();
369
- this.state.providers = providers;
370
- for (const provider of providers) {
371
- if (provider.loggedIn) {
372
- this.loginPending.delete(provider.id);
373
- }
374
- }
375
- if (this.state.view === 'connected') {
376
- this.updatePopoverTitle();
377
- this.updateButtonLabel();
378
- }
379
- else {
380
- this.renderProviders();
381
- this.updatePopoverTitle();
382
- this.updateButtonLabel();
383
- }
384
- const selected = this.state.selectedProvider;
385
- if (!selected)
386
- return;
387
- const before = previous.find((entry) => entry.id === selected);
388
- const after = providers.find((entry) => entry.id === selected);
389
- if (before && after && !before.loggedIn && after.loggedIn) {
390
- await this.refreshModels();
391
- this.renderConnectedModels();
392
- this.renderReasoningEfforts();
393
- }
416
+ const providerIds = this.state.providers.map((entry) => entry.id);
417
+ await Promise.all(providerIds.map((providerId) => this.checkProviderStatus(providerId, undefined, { silent: true })));
394
418
  this.updateLoginPolling();
395
419
  }
396
420
  shouldPollLogin() {
@@ -414,12 +438,14 @@ export class AgentConnectConnect extends HTMLElement {
414
438
  return;
415
439
  this.state.providers[index] = { ...this.state.providers[index], ...updates };
416
440
  }
417
- async checkProviderStatus(providerId, providerName) {
441
+ async checkProviderStatus(providerId, providerName, options = {}) {
418
442
  if (this.statusCheckInFlight.has(providerId))
419
443
  return;
420
444
  this.statusCheckInFlight.add(providerId);
421
445
  const label = providerName || providerId;
422
- this.setStatus(`Checking ${label} status...`);
446
+ if (!options.silent) {
447
+ this.setStatus(`Checking ${label} status...`);
448
+ }
423
449
  try {
424
450
  const client = await getClient();
425
451
  const status = await client.providers.status(providerId);
@@ -427,6 +453,14 @@ export class AgentConnectConnect extends HTMLElement {
427
453
  installed: status.installed,
428
454
  loggedIn: status.loggedIn,
429
455
  version: status.version,
456
+ pending: false,
457
+ updateAvailable: status.updateAvailable,
458
+ latestVersion: status.latestVersion,
459
+ updateCheckedAt: status.updateCheckedAt,
460
+ updateSource: status.updateSource,
461
+ updateCommand: status.updateCommand,
462
+ updateMessage: status.updateMessage,
463
+ updateInProgress: status.updateInProgress,
430
464
  });
431
465
  if (status.loggedIn) {
432
466
  this.loginPending.delete(providerId);
@@ -438,6 +472,13 @@ export class AgentConnectConnect extends HTMLElement {
438
472
  this.updatePopoverTitle();
439
473
  this.updateButtonLabel();
440
474
  this.updateLoginPolling();
475
+ this.scheduleUpdateRefresh();
476
+ }
477
+ catch {
478
+ this.updateProviderEntry(providerId, { pending: false });
479
+ this.renderProviders();
480
+ this.updatePopoverTitle();
481
+ this.updateButtonLabel();
441
482
  }
442
483
  finally {
443
484
  this.statusCheckInFlight.delete(providerId);
@@ -458,6 +499,13 @@ export class AgentConnectConnect extends HTMLElement {
458
499
  installed: status.installed,
459
500
  loggedIn: status.loggedIn,
460
501
  version: status.version,
502
+ updateAvailable: status.updateAvailable,
503
+ latestVersion: status.latestVersion,
504
+ updateCheckedAt: status.updateCheckedAt,
505
+ updateSource: status.updateSource,
506
+ updateCommand: status.updateCommand,
507
+ updateMessage: status.updateMessage,
508
+ updateInProgress: status.updateInProgress,
461
509
  });
462
510
  if (status.loggedIn) {
463
511
  this.loginPending.delete(providerId);
@@ -467,6 +515,7 @@ export class AgentConnectConnect extends HTMLElement {
467
515
  this.updatePopoverTitle();
468
516
  this.updateButtonLabel();
469
517
  this.updateLoginPolling();
518
+ this.scheduleUpdateRefresh();
470
519
  return true;
471
520
  }
472
521
  await new Promise((resolve) => setTimeout(resolve, this.loginPollIntervalMs));
@@ -484,11 +533,37 @@ export class AgentConnectConnect extends HTMLElement {
484
533
  await this.prefetchAllProviderModels();
485
534
  this.prefetching = false;
486
535
  }
536
+ scheduleUpdateRefresh() {
537
+ if (this.updateRefreshTimer)
538
+ return;
539
+ if (this.updateRefreshAttempts >= this.updateRefreshMaxAttempts)
540
+ return;
541
+ const needsUpdateInfo = this.state.providers.some((provider) => provider.installed && provider.updateCheckedAt === undefined);
542
+ if (!needsUpdateInfo)
543
+ return;
544
+ this.updateRefreshAttempts += 1;
545
+ this.updateRefreshTimer = setTimeout(() => {
546
+ this.updateRefreshTimer = null;
547
+ this.refresh({ silent: true }).catch(() => { });
548
+ }, this.updateRefreshDelayMs);
549
+ }
487
550
  async prefetchAllProviderModels() {
488
551
  if (!this.state.providers.length)
489
552
  return;
490
553
  const client = await getClient();
491
- await Promise.allSettled(this.state.providers.map((provider) => client.models.list(provider.id)));
554
+ await Promise.allSettled(this.state.providers.map((provider) => {
555
+ const key = `agentconnect:models-prefetch:${provider.id}`;
556
+ if (localStorage.getItem(key) === '1') {
557
+ return Promise.resolve();
558
+ }
559
+ try {
560
+ localStorage.setItem(key, '1');
561
+ }
562
+ catch {
563
+ // ignore
564
+ }
565
+ return client.models.list(provider.id);
566
+ }));
492
567
  }
493
568
  async refreshModels() {
494
569
  if (!this.state.selectedProvider) {
@@ -576,25 +651,36 @@ export class AgentConnectConnect extends HTMLElement {
576
651
  icon.appendChild(iconLabel);
577
652
  }
578
653
  const textWrap = document.createElement('div');
654
+ const nameRow = document.createElement('div');
655
+ nameRow.className = 'ac-provider-name-row';
579
656
  const name = document.createElement('div');
580
657
  name.className = 'ac-provider-name';
581
658
  name.textContent = provider.name || provider.id;
659
+ nameRow.appendChild(name);
660
+ if (provider.updateAvailable && !this.isUpdatingProvider(provider)) {
661
+ const updateBadge = document.createElement('span');
662
+ updateBadge.className = 'ac-provider-update';
663
+ updateBadge.textContent = 'Update available';
664
+ nameRow.appendChild(updateBadge);
665
+ }
582
666
  const status = document.createElement('div');
583
667
  status.className = 'ac-provider-status';
584
668
  status.textContent = statusText;
585
- textWrap.append(name, status);
669
+ textWrap.append(nameRow, status);
586
670
  meta.append(icon, textWrap);
587
671
  row.appendChild(meta);
588
672
  card.appendChild(row);
589
673
  card.addEventListener('click', () => {
590
674
  this.handleProviderSelect(provider);
591
675
  });
592
- const action = this.buildProviderAction(provider);
593
- if (action) {
594
- const actions = document.createElement('div');
595
- actions.className = 'ac-provider-actions';
596
- actions.appendChild(action);
597
- card.appendChild(actions);
676
+ const actions = this.buildProviderActions(provider);
677
+ if (actions.length) {
678
+ const actionsEl = document.createElement('div');
679
+ actionsEl.className = 'ac-provider-actions';
680
+ for (const action of actions) {
681
+ actionsEl.appendChild(action);
682
+ }
683
+ card.appendChild(actionsEl);
598
684
  }
599
685
  return card;
600
686
  }
@@ -603,8 +689,11 @@ export class AgentConnectConnect extends HTMLElement {
603
689
  const isLocal = provider.id === 'local';
604
690
  const hasLocalConfig = this.hasLocalConfig();
605
691
  const isConnected = this.state.connected?.provider === provider.id;
692
+ const updating = this.isUpdatingProvider(provider);
606
693
  if (pending)
607
694
  return 'Checking...';
695
+ if (updating)
696
+ return 'Updating...';
608
697
  if (isLocal) {
609
698
  if (!hasLocalConfig)
610
699
  return 'Needs setup';
@@ -620,17 +709,31 @@ export class AgentConnectConnect extends HTMLElement {
620
709
  return 'Connected';
621
710
  return 'Detected';
622
711
  }
623
- buildProviderAction(provider) {
712
+ isUpdatingProvider(provider) {
713
+ return Boolean(provider.updateInProgress || this.updatePending.has(provider.id));
714
+ }
715
+ buildProviderActions(provider) {
716
+ const actions = [];
624
717
  const pending = provider.pending === true;
625
718
  const isLocal = provider.id === 'local';
626
719
  const hasLocalConfig = this.hasLocalConfig();
627
720
  const isConnected = this.state.connected?.provider === provider.id;
628
721
  const terminalLogin = provider.id === 'claude' && this.state.loginExperience === 'terminal';
722
+ const updating = this.isUpdatingProvider(provider);
629
723
  if (pending) {
630
- return this.buildActionButton('Checking...', true);
724
+ actions.push(this.buildActionButton('Checking...', true));
725
+ return actions;
726
+ }
727
+ if (updating) {
728
+ actions.push(this.buildUpdateButton(provider, true));
729
+ return actions;
631
730
  }
632
731
  if (isLocal) {
633
- return this.buildActionButton(hasLocalConfig ? 'Edit' : 'Configure', false, () => this.openLocalConfig());
732
+ actions.push(this.buildActionButton(hasLocalConfig ? 'Edit' : 'Configure', false, () => this.openLocalConfig()));
733
+ return actions;
734
+ }
735
+ if (provider.updateAvailable) {
736
+ actions.push(this.buildUpdateButton(provider, false));
634
737
  }
635
738
  if (!provider.installed) {
636
739
  const label = terminalLogin ? 'Install + Run /login' : 'Install + Login';
@@ -638,12 +741,14 @@ export class AgentConnectConnect extends HTMLElement {
638
741
  if (terminalLogin) {
639
742
  button.title = 'Opens a terminal and runs claude login';
640
743
  }
641
- return button;
744
+ actions.push(button);
745
+ return actions;
642
746
  }
643
747
  if (this.loginPending.has(provider.id)) {
644
748
  const button = this.buildActionButton('Waiting for login...', false, () => this.checkProviderStatus(provider.id, provider.name));
645
749
  button.title = `Click to check ${provider.name || provider.id} login status`;
646
- return button;
750
+ actions.push(button);
751
+ return actions;
647
752
  }
648
753
  if (!provider.loggedIn) {
649
754
  const label = terminalLogin ? 'Run /login' : 'Login';
@@ -651,15 +756,16 @@ export class AgentConnectConnect extends HTMLElement {
651
756
  if (terminalLogin) {
652
757
  button.title = 'Opens a terminal and runs claude login';
653
758
  }
654
- return button;
759
+ actions.push(button);
760
+ return actions;
655
761
  }
656
762
  if (isConnected)
657
- return null;
658
- return null;
763
+ return actions;
764
+ return actions;
659
765
  }
660
- buildActionButton(label, disabled, onClick, loading = false) {
766
+ buildActionButton(label, disabled, onClick, loading = false, variant = 'secondary') {
661
767
  const button = document.createElement('button');
662
- button.className = 'ac-button secondary';
768
+ button.className = `ac-button ${variant}`;
663
769
  if (loading) {
664
770
  button.classList.add('loading');
665
771
  }
@@ -673,11 +779,37 @@ export class AgentConnectConnect extends HTMLElement {
673
779
  }
674
780
  return button;
675
781
  }
782
+ buildUpdateButton(provider, loading) {
783
+ const updateButton = document.createElement('button');
784
+ updateButton.className = 'ac-button update icon';
785
+ updateButton.type = 'button';
786
+ updateButton.setAttribute('aria-label', `Update ${provider.name || provider.id}`);
787
+ updateButton.title = provider.updateMessage || 'Update available';
788
+ if (loading) {
789
+ updateButton.classList.add('loading');
790
+ updateButton.disabled = true;
791
+ }
792
+ updateButton.innerHTML = `
793
+ <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
794
+ <path d="M12 3a1 1 0 0 1 1 1v8.17l2.59-2.58a1 1 0 1 1 1.41 1.42l-4.3 4.29a1 1 0 0 1-1.42 0l-4.3-4.29a1 1 0 0 1 1.41-1.42L11 12.17V4a1 1 0 0 1 1-1z" />
795
+ <path d="M5 19a1 1 0 0 1-1-1v-2a1 1 0 1 1 2 0v1h12v-1a1 1 0 1 1 2 0v2a1 1 0 0 1-1 1H5z" />
796
+ </svg>
797
+ `;
798
+ if (!loading) {
799
+ updateButton.addEventListener('click', (event) => {
800
+ event.stopPropagation();
801
+ this.updateProvider(provider);
802
+ });
803
+ }
804
+ return updateButton;
805
+ }
676
806
  async handleProviderSelect(provider) {
677
807
  if (this.busy)
678
808
  return;
679
809
  if (provider.pending)
680
810
  return;
811
+ if (this.isUpdatingProvider(provider))
812
+ return;
681
813
  if (provider.id === 'local') {
682
814
  this.openLocalConfig();
683
815
  return;
@@ -720,6 +852,29 @@ export class AgentConnectConnect extends HTMLElement {
720
852
  this.setProviderLoading(provider.id, false);
721
853
  }
722
854
  }
855
+ async updateProvider(provider) {
856
+ if (this.updatePending.has(provider.id))
857
+ return;
858
+ this.updatePending.add(provider.id);
859
+ this.renderProviders();
860
+ try {
861
+ const client = await getClient();
862
+ await client.providers.update(provider.id);
863
+ await this.refresh({ silent: true });
864
+ }
865
+ catch (err) {
866
+ this.setAlert({
867
+ title: 'Update failed',
868
+ message: err instanceof Error ? err.message : 'Could not update provider.',
869
+ action: 'Retry',
870
+ onAction: () => this.updateProvider(provider),
871
+ });
872
+ }
873
+ finally {
874
+ this.updatePending.delete(provider.id);
875
+ this.renderProviders();
876
+ }
877
+ }
723
878
  setProviderLoading(providerId, loading, label = 'Working...') {
724
879
  const card = this.elements?.providerList?.querySelector(`.ac-provider-card[data-provider="${providerId}"]`);
725
880
  if (!card)
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAoC7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAUrD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,y6GA+E5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;YAIjB,MAAM,EAAE;CACvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAoC7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAarD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,y6GA+E5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;YAIjB,MAAM,EAAE;CACvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC"}
package/dist/constants.js CHANGED
@@ -47,6 +47,9 @@ export const ERROR_MESSAGES = {
47
47
  export const PROVIDER_ICONS = {
48
48
  claude: `<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
49
49
  <path d="m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"/>
50
+ </svg>`,
51
+ cursor: `<svg viewBox="0 0 466.73 532.09" xmlns="http://www.w3.org/2000/svg">
52
+ <path d="M457.43 125.94 244.42 2.96c-6.84-3.95-15.28-3.95-22.12 0L9.3 125.94c-5.75 3.32-9.3 9.46-9.3 16.11v247.99c0 6.65 3.55 12.79 9.3 16.11l213.01 122.98c6.84 3.95 15.28 3.95 22.12 0l213.01-122.98c5.75-3.32 9.3-9.46 9.3-16.11V142.05c0-6.65-3.55-12.79-9.3-16.11ZM444.05 151.99 238.42 508.15c-1.39 2.4-5.06 1.42-5.06-1.36V273.58c0-4.66-2.49-8.97-6.53-11.31L24.87 145.67c-2.4-1.39-1.42-5.06 1.36-5.06h411.26c5.84 0 9.49 6.33 6.57 11.39Z"/>
50
53
  </svg>`,
51
54
  codex: `<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
52
55
  <path d="M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"/>
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAgBnD"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAmBnD"}
package/dist/register.js CHANGED
@@ -2,6 +2,21 @@
2
2
  * Custom element registration.
3
3
  */
4
4
  import { AgentConnectLoginButton, AgentConnectModelPicker, AgentConnectProviderStatus, AgentConnectConnect, } from './components';
5
+ import { getClient } from './client';
6
+ let prefetchStarted = false;
7
+ async function prefetchProviderData() {
8
+ if (prefetchStarted)
9
+ return;
10
+ prefetchStarted = true;
11
+ try {
12
+ const client = await getClient();
13
+ const providers = await client.providers.list();
14
+ await Promise.allSettled(providers.map((provider) => client.models.list(provider.id)));
15
+ }
16
+ catch {
17
+ // Ignore background prefetch errors
18
+ }
19
+ }
5
20
  /**
6
21
  * Register all AgentConnect custom elements.
7
22
  * Safe to call multiple times - will only register once.
@@ -22,4 +37,7 @@ export function defineAgentConnectComponents() {
22
37
  if (!customElements.get('agentconnect-connect')) {
23
38
  customElements.define('agentconnect-connect', AgentConnectConnect);
24
39
  }
40
+ queueMicrotask(() => {
41
+ void prefetchProviderData();
42
+ });
25
43
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Button styles.
3
3
  */
4
- export declare const buttonStyles = "\n .ac-button {\n appearance: none;\n border: 1px solid transparent;\n border-radius: 999px;\n padding: 10px 16px;\n background: var(--ac-button-bg, #0b1320);\n color: var(--ac-button-color, #f8fbff);\n font-size: 13px;\n font-weight: 700;\n letter-spacing: 0.01em;\n cursor: pointer;\n transition: transform 0.15s ease, box-shadow 0.2s ease, opacity 0.2s ease;\n }\n .ac-button:hover:not([disabled]) {\n transform: translateY(-1px);\n box-shadow: 0 14px 30px rgba(10, 16, 28, 0.2);\n }\n .ac-button.secondary {\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(250, 251, 254, 0.9) 100%\n );\n color: #1a1f2e;\n border: 1px solid rgba(195, 165, 90, 0.35);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .ac-button.secondary:hover:not([disabled]) {\n border-color: rgba(200, 170, 90, 0.55);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 1) 0%,\n rgba(253, 253, 255, 0.95) 100%\n );\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.12),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 12px rgba(0, 0, 0, 0.06);\n }\n .ac-button.ghost {\n background: transparent;\n color: rgba(80, 70, 50, 0.7);\n border: 1px solid rgba(195, 165, 90, 0.3);\n box-shadow: none;\n }\n .ac-button.ghost:hover:not([disabled]) {\n color: rgba(80, 70, 50, 0.9);\n border-color: rgba(200, 170, 90, 0.45);\n background: rgba(255, 255, 255, 0.5);\n }\n .ac-button.ac-close {\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 999px;\n font-size: 18px;\n line-height: 1;\n color: rgba(80, 70, 50, 0.5);\n }\n .ac-button.ac-close:hover:not([disabled]) {\n color: rgba(80, 70, 50, 0.8);\n background: rgba(200, 170, 90, 0.12);\n }\n .ac-button[disabled] {\n opacity: 0.6;\n cursor: default;\n box-shadow: none;\n }\n .ac-chip {\n font-size: 12px;\n font-weight: 600;\n padding: 6px 10px;\n border-radius: 999px;\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.9) 0%,\n rgba(250, 248, 245, 0.85) 100%\n );\n color: rgba(80, 70, 50, 0.8);\n border: 1px solid rgba(195, 165, 90, 0.28);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n .ac-button.loading {\n position: relative;\n color: transparent;\n pointer-events: none;\n }\n .ac-button.loading::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n width: 16px;\n height: 16px;\n border: 2px solid var(--ac-button-color, #f8fbff);\n border-top-color: transparent;\n border-radius: 50%;\n animation: ac-spin 0.8s linear infinite;\n }\n .ac-button.secondary.loading::after {\n border-color: var(--ac-button-secondary-color, #0b1320);\n border-top-color: transparent;\n }\n .ac-button:active:not([disabled]) {\n transform: scale(0.98);\n }\n";
5
- export declare const connectButtonStyles = "\n .ac-connect .ac-button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n min-height: 52px;\n padding: 14px 24px;\n border-radius: 999px;\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(245, 247, 250, 0.9) 25%,\n rgba(235, 238, 245, 0.85) 50%,\n rgba(240, 242, 248, 0.9) 75%,\n rgba(250, 251, 254, 0.95) 100%\n );\n color: #1a1f2e;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.02em;\n border: 1.5px solid rgba(195, 165, 90, 0.55);\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.2),\n 0 1px 2px rgba(0, 0, 0, 0.04),\n 0 4px 12px rgba(0, 0, 0, 0.06),\n 0 12px 36px rgba(0, 0, 0, 0.08),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n inset 0 -1px 0 rgba(0, 0, 0, 0.03);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n width: min(var(--ac-connect-width, 240px), 92vw);\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .ac-connect .ac-connect-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ac-connect .ac-connect-icon {\n width: 20px;\n height: 20px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 20px;\n }\n .ac-connect .ac-connect-icon svg {\n width: 18px;\n height: 18px;\n }\n .ac-connect .ac-connect-icon[data-provider=\"claude\"] svg {\n fill: #d97757;\n }\n .ac-connect .ac-button:hover:not([disabled]) {\n transform: translateY(-2px);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 1) 0%,\n rgba(250, 252, 255, 0.95) 25%,\n rgba(245, 248, 255, 0.9) 50%,\n rgba(248, 250, 255, 0.95) 75%,\n rgba(255, 255, 255, 1) 100%\n );\n border-color: rgba(200, 170, 90, 0.65);\n box-shadow:\n 0 0 0 1px rgba(215, 185, 100, 0.25),\n 0 2px 4px rgba(0, 0, 0, 0.04),\n 0 8px 24px rgba(0, 0, 0, 0.08),\n 0 20px 50px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n inset 0 -1px 0 rgba(0, 0, 0, 0.02);\n }\n .ac-connect .ac-button:active:not([disabled]) {\n transform: translateY(0) scale(0.98);\n background: linear-gradient(\n 165deg,\n rgba(245, 247, 252, 0.95) 0%,\n rgba(240, 243, 250, 0.9) 50%,\n rgba(245, 247, 252, 0.95) 100%\n );\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.05),\n 0 4px 12px rgba(0, 0, 0, 0.06),\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n inset 0 -1px 0 rgba(0, 0, 0, 0.02);\n }\n";
4
+ export declare const buttonStyles = "\n .ac-button {\n appearance: none;\n border: 1px solid transparent;\n border-radius: 999px;\n padding: 10px 16px;\n background: var(--ac-button-bg, #0b1320);\n color: var(--ac-button-color, #f8fbff);\n font-size: 13px;\n font-weight: 700;\n letter-spacing: 0.01em;\n cursor: pointer;\n transition: transform 0.15s ease, box-shadow 0.2s ease, opacity 0.2s ease;\n }\n .ac-button:hover:not([disabled]) {\n transform: translateY(-1px);\n box-shadow: 0 14px 30px rgba(10, 16, 28, 0.2);\n }\n .ac-button.secondary {\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(250, 251, 254, 0.9) 100%\n );\n color: #1a1f2e;\n border: 1px solid rgba(195, 165, 90, 0.35);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .ac-button.secondary:hover:not([disabled]) {\n border-color: rgba(200, 170, 90, 0.55);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 1) 0%,\n rgba(253, 253, 255, 0.95) 100%\n );\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.12),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 12px rgba(0, 0, 0, 0.06);\n }\n .ac-button.update {\n background: transparent;\n color: #2b2f3a;\n border: 1px solid rgba(120, 129, 145, 0.45);\n --ac-button-color: #2b2f3a;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n 0 6px 16px rgba(18, 24, 38, 0.12);\n }\n .ac-button.update:hover:not([disabled]) {\n border-color: rgba(90, 100, 120, 0.7);\n background: transparent;\n box-shadow:\n 0 0 0 1px rgba(80, 90, 110, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 10px 20px rgba(18, 24, 38, 0.16);\n }\n .ac-button.update.icon {\n width: 40px;\n height: 40px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: transform 0.15s ease, box-shadow 0.2s ease, border-color 0.2s ease;\n }\n .ac-button.update.icon svg {\n width: 18px;\n height: 18px;\n fill: currentColor;\n filter: none;\n }\n .ac-button.update.icon:hover:not([disabled]) {\n border-color: rgba(90, 100, 120, 0.7);\n box-shadow:\n 0 0 0 1px rgba(80, 90, 110, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 10px 20px rgba(18, 24, 38, 0.16);\n }\n .ac-button.ghost {\n background: transparent;\n color: rgba(80, 70, 50, 0.7);\n border: 1px solid rgba(195, 165, 90, 0.3);\n box-shadow: none;\n }\n .ac-button.ghost:hover:not([disabled]) {\n color: rgba(80, 70, 50, 0.9);\n border-color: rgba(200, 170, 90, 0.45);\n background: rgba(255, 255, 255, 0.5);\n }\n .ac-button.ac-close {\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 999px;\n font-size: 18px;\n line-height: 1;\n color: rgba(80, 70, 50, 0.5);\n }\n .ac-button.ac-close:hover:not([disabled]) {\n color: rgba(80, 70, 50, 0.8);\n background: rgba(200, 170, 90, 0.12);\n }\n .ac-button[disabled] {\n opacity: 0.6;\n cursor: default;\n box-shadow: none;\n }\n .ac-chip {\n font-size: 12px;\n font-weight: 600;\n padding: 6px 10px;\n border-radius: 999px;\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.9) 0%,\n rgba(250, 248, 245, 0.85) 100%\n );\n color: rgba(80, 70, 50, 0.8);\n border: 1px solid rgba(195, 165, 90, 0.28);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n .ac-button.loading {\n position: relative;\n color: transparent;\n pointer-events: none;\n }\n .ac-button.loading::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n width: 16px;\n height: 16px;\n border: 2px solid var(--ac-button-color, #f8fbff);\n border-top-color: transparent;\n border-radius: 50%;\n animation: ac-spin 0.8s linear infinite;\n }\n .ac-button.secondary.loading::after {\n border-color: var(--ac-button-secondary-color, #0b1320);\n border-top-color: transparent;\n }\n .ac-button:active:not([disabled]) {\n transform: scale(0.98);\n }\n";
5
+ export declare const connectButtonStyles = "\n .ac-connect .ac-button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n min-height: 52px;\n padding: 14px 24px;\n border-radius: 999px;\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(245, 247, 250, 0.9) 25%,\n rgba(235, 238, 245, 0.85) 50%,\n rgba(240, 242, 248, 0.9) 75%,\n rgba(250, 251, 254, 0.95) 100%\n );\n color: #1a1f2e;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.02em;\n border: 1.5px solid rgba(195, 165, 90, 0.55);\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.2),\n 0 1px 2px rgba(0, 0, 0, 0.04),\n 0 4px 12px rgba(0, 0, 0, 0.06),\n 0 12px 36px rgba(0, 0, 0, 0.08),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n inset 0 -1px 0 rgba(0, 0, 0, 0.03);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n width: min(var(--ac-connect-width, 240px), 92vw);\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .ac-connect .ac-connect-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ac-connect .ac-connect-icon {\n width: 20px;\n height: 20px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 20px;\n }\n .ac-connect .ac-connect-icon svg {\n width: 18px;\n height: 18px;\n }\n .ac-connect .ac-connect-icon[data-provider=\"claude\"] svg {\n fill: #d97757;\n }\n .ac-connect .ac-connect-icon[data-provider=\"cursor\"] svg {\n fill: #26251e;\n }\n .ac-connect .ac-button:hover:not([disabled]) {\n transform: translateY(-2px);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 1) 0%,\n rgba(250, 252, 255, 0.95) 25%,\n rgba(245, 248, 255, 0.9) 50%,\n rgba(248, 250, 255, 0.95) 75%,\n rgba(255, 255, 255, 1) 100%\n );\n border-color: rgba(200, 170, 90, 0.65);\n box-shadow:\n 0 0 0 1px rgba(215, 185, 100, 0.25),\n 0 2px 4px rgba(0, 0, 0, 0.04),\n 0 8px 24px rgba(0, 0, 0, 0.08),\n 0 20px 50px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n inset 0 -1px 0 rgba(0, 0, 0, 0.02);\n }\n .ac-connect .ac-button:active:not([disabled]) {\n transform: translateY(0) scale(0.98);\n background: linear-gradient(\n 165deg,\n rgba(245, 247, 252, 0.95) 0%,\n rgba(240, 243, 250, 0.9) 50%,\n rgba(245, 247, 252, 0.95) 100%\n );\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.05),\n 0 4px 12px rgba(0, 0, 0, 0.06),\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n inset 0 -1px 0 rgba(0, 0, 0, 0.02);\n }\n";
6
6
  //# sourceMappingURL=buttons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../src/styles/buttons.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,s8FA6GxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,urFA4F/B,CAAC"}
1
+ {"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../src/styles/buttons.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,mmIAqJxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,gxFA+F/B,CAAC"}
@@ -43,6 +43,46 @@ export const buttonStyles = `
43
43
  inset 0 1px 0 rgba(255, 255, 255, 1),
44
44
  0 4px 12px rgba(0, 0, 0, 0.06);
45
45
  }
46
+ .ac-button.update {
47
+ background: transparent;
48
+ color: #2b2f3a;
49
+ border: 1px solid rgba(120, 129, 145, 0.45);
50
+ --ac-button-color: #2b2f3a;
51
+ box-shadow:
52
+ inset 0 1px 0 rgba(255, 255, 255, 0.9),
53
+ 0 6px 16px rgba(18, 24, 38, 0.12);
54
+ }
55
+ .ac-button.update:hover:not([disabled]) {
56
+ border-color: rgba(90, 100, 120, 0.7);
57
+ background: transparent;
58
+ box-shadow:
59
+ 0 0 0 1px rgba(80, 90, 110, 0.2),
60
+ inset 0 1px 0 rgba(255, 255, 255, 1),
61
+ 0 10px 20px rgba(18, 24, 38, 0.16);
62
+ }
63
+ .ac-button.update.icon {
64
+ width: 40px;
65
+ height: 40px;
66
+ padding: 0;
67
+ display: inline-flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ position: relative;
71
+ transition: transform 0.15s ease, box-shadow 0.2s ease, border-color 0.2s ease;
72
+ }
73
+ .ac-button.update.icon svg {
74
+ width: 18px;
75
+ height: 18px;
76
+ fill: currentColor;
77
+ filter: none;
78
+ }
79
+ .ac-button.update.icon:hover:not([disabled]) {
80
+ border-color: rgba(90, 100, 120, 0.7);
81
+ box-shadow:
82
+ 0 0 0 1px rgba(80, 90, 110, 0.2),
83
+ inset 0 1px 0 rgba(255, 255, 255, 1),
84
+ 0 10px 20px rgba(18, 24, 38, 0.16);
85
+ }
46
86
  .ac-button.ghost {
47
87
  background: transparent;
48
88
  color: rgba(80, 70, 50, 0.7);
@@ -170,6 +210,9 @@ export const connectButtonStyles = `
170
210
  .ac-connect .ac-connect-icon[data-provider="claude"] svg {
171
211
  fill: #d97757;
172
212
  }
213
+ .ac-connect .ac-connect-icon[data-provider="cursor"] svg {
214
+ fill: #26251e;
215
+ }
173
216
  .ac-connect .ac-button:hover:not([disabled]) {
174
217
  transform: translateY(-2px);
175
218
  background: linear-gradient(
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Provider card styles.
3
3
  */
4
- export declare const cardStyles = "\n .ac-provider-list {\n display: grid;\n gap: 12px;\n }\n .ac-provider-card {\n border: 1px solid rgba(195, 165, 90, 0.28);\n border-radius: 16px;\n padding: 14px 16px;\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: 12px;\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.8) 0%,\n rgba(250, 251, 254, 0.7) 50%,\n rgba(255, 255, 255, 0.8) 100%\n );\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.8),\n 0 2px 8px rgba(0, 0, 0, 0.04);\n }\n .ac-provider-card:hover {\n transform: translateY(-2px);\n border-color: rgba(200, 170, 90, 0.5);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(252, 253, 255, 0.9) 50%,\n rgba(255, 255, 255, 0.95) 100%\n );\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.12),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(0, 0, 0, 0.08);\n }\n .ac-provider-card[data-provider=\"claude\"]:hover {\n border-color: rgba(217, 119, 87, 0.45);\n box-shadow:\n 0 0 0 1px rgba(217, 119, 87, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(217, 119, 87, 0.12);\n }\n .ac-provider-card[data-provider=\"codex\"]:hover {\n border-color: rgba(32, 33, 35, 0.45);\n box-shadow:\n 0 0 0 1px rgba(32, 33, 35, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(32, 33, 35, 0.12);\n }\n .ac-provider-card[data-provider=\"local\"]:hover {\n border-color: rgba(100, 116, 139, 0.45);\n box-shadow:\n 0 0 0 1px rgba(100, 116, 139, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(100, 116, 139, 0.12);\n }\n .ac-provider-card.active {\n border-color: rgba(200, 170, 90, 0.6);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 1) 0%,\n rgba(253, 252, 250, 0.95) 50%,\n rgba(255, 255, 255, 1) 100%\n );\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.18),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(180, 150, 80, 0.15);\n }\n .ac-provider-card[data-provider=\"claude\"].active {\n border-color: rgba(217, 119, 87, 0.55);\n box-shadow:\n 0 0 0 1px rgba(217, 119, 87, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(217, 119, 87, 0.18);\n }\n .ac-provider-card[data-provider=\"codex\"].active {\n border-color: rgba(32, 33, 35, 0.55);\n box-shadow:\n 0 0 0 1px rgba(32, 33, 35, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(32, 33, 35, 0.18);\n }\n .ac-provider-card[data-provider=\"local\"].active {\n border-color: rgba(100, 116, 139, 0.55);\n box-shadow:\n 0 0 0 1px rgba(100, 116, 139, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(100, 116, 139, 0.18);\n }\n .ac-provider-row {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .ac-provider-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .ac-provider-icon {\n width: 48px;\n height: 48px;\n border-radius: 14px;\n display: grid;\n place-items: center;\n font-weight: 700;\n letter-spacing: 0.06em;\n font-size: 11px;\n background: linear-gradient(\n 145deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(245, 243, 240, 0.9) 100%\n );\n color: rgba(100, 85, 60, 0.8);\n border: 1.5px solid rgba(195, 165, 90, 0.35);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n inset 0 -1px 0 rgba(0, 0, 0, 0.03),\n 0 2px 6px rgba(0, 0, 0, 0.04);\n }\n .ac-provider-icon svg {\n width: 26px;\n height: 26px;\n }\n .ac-provider-icon[data-provider=\"claude\"] {\n background: linear-gradient(145deg, #fff8f3 0%, #ffeee2 100%);\n border-color: rgba(217, 119, 87, 0.4);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(217, 119, 87, 0.12);\n }\n .ac-provider-icon[data-provider=\"claude\"] svg {\n fill: #d97757;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"claude\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(217, 119, 87, 0.2);\n }\n .ac-provider-icon[data-provider=\"codex\"] {\n background: linear-gradient(145deg, #f5f5f5 0%, #e8e8e8 100%);\n border-color: rgba(32, 33, 35, 0.4);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(32, 33, 35, 0.12);\n }\n .ac-provider-icon[data-provider=\"codex\"] svg {\n fill: #202123;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"codex\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(32, 33, 35, 0.2);\n }\n .ac-provider-icon[data-provider=\"local\"] {\n background: linear-gradient(145deg, #f2f4f8 0%, #e4e8f0 100%);\n border-color: rgba(100, 116, 139, 0.4);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(100, 116, 139, 0.12);\n }\n .ac-provider-icon[data-provider=\"local\"] svg {\n fill: #64748b;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"local\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(100, 116, 139, 0.2);\n }\n .ac-provider-name {\n font-size: 15px;\n font-weight: 700;\n }\n .ac-provider-status {\n font-size: 12px;\n color: var(--ac-muted, #556070);\n }\n .ac-provider-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .ac-provider-card.loading {\n pointer-events: none;\n }\n .ac-provider-card.loading .ac-provider-name,\n .ac-provider-card.loading .ac-provider-status {\n background: var(--ac-skeleton-base, #e3e8ef);\n color: transparent;\n border-radius: 4px;\n animation: ac-shimmer 1.5s ease-in-out infinite;\n background-size: 200% 100%;\n }\n .ac-provider-card:active {\n transform: scale(0.99);\n }\n .ac-provider-card .ac-provider-actions .ac-button {\n pointer-events: none;\n }\n .ac-provider-card .ac-provider-actions .ac-button:hover {\n transform: none;\n box-shadow: inherit;\n }\n";
4
+ export declare const cardStyles = "\n .ac-provider-list {\n display: grid;\n gap: 12px;\n }\n\n .ac-provider-card {\n border: 1px solid rgba(195, 165, 90, 0.28);\n border-radius: 16px;\n padding: 14px 16px;\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: 12px;\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.8) 0%,\n rgba(250, 251, 254, 0.7) 50%,\n rgba(255, 255, 255, 0.8) 100%\n );\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.8),\n 0 2px 8px rgba(0, 0, 0, 0.04);\n }\n .ac-provider-card:hover {\n transform: translateY(-2px);\n border-color: rgba(200, 170, 90, 0.5);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(252, 253, 255, 0.9) 50%,\n rgba(255, 255, 255, 0.95) 100%\n );\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.12),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(0, 0, 0, 0.08);\n }\n .ac-provider-card:active {\n transform: scale(0.99);\n }\n .ac-provider-card.active {\n border-color: rgba(200, 170, 90, 0.6);\n background: linear-gradient(\n 165deg,\n rgba(255, 255, 255, 1) 0%,\n rgba(253, 252, 250, 0.95) 50%,\n rgba(255, 255, 255, 1) 100%\n );\n box-shadow:\n 0 0 0 1px rgba(210, 180, 100, 0.18),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(180, 150, 80, 0.15);\n }\n\n .ac-provider-card[data-provider=\"claude\"]:hover {\n border-color: rgba(217, 119, 87, 0.45);\n box-shadow:\n 0 0 0 1px rgba(217, 119, 87, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(217, 119, 87, 0.12);\n }\n .ac-provider-card[data-provider=\"claude\"].active {\n border-color: rgba(217, 119, 87, 0.55);\n box-shadow:\n 0 0 0 1px rgba(217, 119, 87, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(217, 119, 87, 0.18);\n }\n\n .ac-provider-card[data-provider=\"codex\"]:hover {\n border-color: rgba(97, 108, 120, 0.45);\n box-shadow:\n 0 0 0 1px rgba(97, 108, 120, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(97, 108, 120, 0.12);\n }\n .ac-provider-card[data-provider=\"codex\"].active {\n border-color: rgba(97, 108, 120, 0.55);\n box-shadow:\n 0 0 0 1px rgba(97, 108, 120, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(97, 108, 120, 0.18);\n }\n\n .ac-provider-card[data-provider=\"cursor\"]:hover {\n border-color: rgba(20, 22, 26, 0.55);\n box-shadow:\n 0 0 0 1px rgba(20, 22, 26, 0.18),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(20, 22, 26, 0.16);\n }\n .ac-provider-card[data-provider=\"cursor\"].active {\n border-color: rgba(20, 22, 26, 0.65);\n box-shadow:\n 0 0 0 1px rgba(20, 22, 26, 0.22),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(20, 22, 26, 0.2);\n }\n\n .ac-provider-card[data-provider=\"local\"]:hover {\n border-color: rgba(100, 116, 139, 0.45);\n box-shadow:\n 0 0 0 1px rgba(100, 116, 139, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 24px rgba(100, 116, 139, 0.12);\n }\n .ac-provider-card[data-provider=\"local\"].active {\n border-color: rgba(100, 116, 139, 0.55);\n box-shadow:\n 0 0 0 1px rgba(100, 116, 139, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 8px 28px rgba(100, 116, 139, 0.18);\n }\n\n .ac-provider-row {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .ac-provider-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .ac-provider-icon {\n width: 48px;\n height: 48px;\n border-radius: 14px;\n display: grid;\n place-items: center;\n font-weight: 700;\n letter-spacing: 0.06em;\n font-size: 11px;\n background: linear-gradient(\n 145deg,\n rgba(255, 255, 255, 0.95) 0%,\n rgba(245, 243, 240, 0.9) 100%\n );\n color: rgba(100, 85, 60, 0.8);\n border: 1.5px solid rgba(195, 165, 90, 0.35);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n inset 0 -1px 0 rgba(0, 0, 0, 0.03),\n 0 2px 6px rgba(0, 0, 0, 0.04);\n }\n .ac-provider-icon svg {\n width: 26px;\n height: 26px;\n }\n\n .ac-provider-icon[data-provider=\"claude\"] {\n background: linear-gradient(145deg, #fff8f3 0%, #ffeee2 100%);\n border-color: rgba(217, 119, 87, 0.4);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(217, 119, 87, 0.12);\n }\n .ac-provider-icon[data-provider=\"claude\"] svg {\n fill: #d97757;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"claude\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(217, 119, 87, 0.2);\n }\n\n .ac-provider-icon[data-provider=\"codex\"] {\n background: linear-gradient(145deg, #f5f5f5 0%, #e8e8e8 100%);\n border-color: rgba(122, 132, 146, 0.4);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(97, 108, 120, 0.14);\n }\n .ac-provider-icon[data-provider=\"codex\"] svg {\n fill: #2a2f36;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"codex\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(97, 108, 120, 0.2);\n }\n\n .ac-provider-icon[data-provider=\"cursor\"] {\n background: linear-gradient(145deg, #fbfaf6 0%, #f0ede6 100%);\n border-color: rgba(29, 32, 38, 0.42);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(20, 22, 26, 0.16);\n }\n .ac-provider-icon[data-provider=\"cursor\"] svg {\n fill: #111316;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"cursor\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(20, 22, 26, 0.24);\n }\n\n .ac-provider-icon[data-provider=\"local\"] {\n background: linear-gradient(145deg, #f2f4f8 0%, #e4e8f0 100%);\n border-color: rgba(100, 116, 139, 0.4);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 2px 8px rgba(100, 116, 139, 0.12);\n }\n .ac-provider-icon[data-provider=\"local\"] svg {\n fill: #64748b;\n }\n .ac-provider-card:hover .ac-provider-icon[data-provider=\"local\"] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 1),\n 0 4px 16px rgba(100, 116, 139, 0.2);\n }\n\n .ac-provider-name {\n font-size: 15px;\n font-weight: 700;\n }\n .ac-provider-name-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .ac-provider-update {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.01em;\n background: transparent;\n color: #2b2f3a;\n border: 1px solid rgba(120, 129, 145, 0.45);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n 0 6px 16px rgba(18, 24, 38, 0.12);\n background-image: linear-gradient(120deg, #6b7280 0%, #1f2937 45%, #64748b 100%);\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n .ac-provider-status {\n font-size: 12px;\n color: var(--ac-muted, #556070);\n }\n .ac-provider-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .ac-provider-card.loading {\n pointer-events: none;\n }\n .ac-provider-card.loading .ac-provider-name,\n .ac-provider-card.loading .ac-provider-status {\n background: var(--ac-skeleton-base, #e3e8ef);\n color: transparent;\n border-radius: 4px;\n animation: ac-shimmer 1.5s ease-in-out infinite;\n background-size: 200% 100%;\n }\n .ac-provider-card .ac-provider-actions .ac-button {\n pointer-events: none;\n }\n .ac-provider-card .ac-provider-actions .ac-button.update.icon {\n pointer-events: auto;\n }\n";
5
5
  //# sourceMappingURL=cards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/styles/cards.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,UAAU,qnMAgNtB,CAAC"}
1
+ {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/styles/cards.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,UAAU,i1PAiRtB,CAAC"}
@@ -6,6 +6,7 @@ export const cardStyles = `
6
6
  display: grid;
7
7
  gap: 12px;
8
8
  }
9
+
9
10
  .ac-provider-card {
10
11
  border: 1px solid rgba(195, 165, 90, 0.28);
11
12
  border-radius: 16px;
@@ -40,26 +41,8 @@ export const cardStyles = `
40
41
  inset 0 1px 0 rgba(255, 255, 255, 1),
41
42
  0 8px 24px rgba(0, 0, 0, 0.08);
42
43
  }
43
- .ac-provider-card[data-provider="claude"]:hover {
44
- border-color: rgba(217, 119, 87, 0.45);
45
- box-shadow:
46
- 0 0 0 1px rgba(217, 119, 87, 0.1),
47
- inset 0 1px 0 rgba(255, 255, 255, 1),
48
- 0 8px 24px rgba(217, 119, 87, 0.12);
49
- }
50
- .ac-provider-card[data-provider="codex"]:hover {
51
- border-color: rgba(32, 33, 35, 0.45);
52
- box-shadow:
53
- 0 0 0 1px rgba(32, 33, 35, 0.1),
54
- inset 0 1px 0 rgba(255, 255, 255, 1),
55
- 0 8px 24px rgba(32, 33, 35, 0.12);
56
- }
57
- .ac-provider-card[data-provider="local"]:hover {
58
- border-color: rgba(100, 116, 139, 0.45);
59
- box-shadow:
60
- 0 0 0 1px rgba(100, 116, 139, 0.1),
61
- inset 0 1px 0 rgba(255, 255, 255, 1),
62
- 0 8px 24px rgba(100, 116, 139, 0.12);
44
+ .ac-provider-card:active {
45
+ transform: scale(0.99);
63
46
  }
64
47
  .ac-provider-card.active {
65
48
  border-color: rgba(200, 170, 90, 0.6);
@@ -74,6 +57,14 @@ export const cardStyles = `
74
57
  inset 0 1px 0 rgba(255, 255, 255, 1),
75
58
  0 8px 28px rgba(180, 150, 80, 0.15);
76
59
  }
60
+
61
+ .ac-provider-card[data-provider="claude"]:hover {
62
+ border-color: rgba(217, 119, 87, 0.45);
63
+ box-shadow:
64
+ 0 0 0 1px rgba(217, 119, 87, 0.1),
65
+ inset 0 1px 0 rgba(255, 255, 255, 1),
66
+ 0 8px 24px rgba(217, 119, 87, 0.12);
67
+ }
77
68
  .ac-provider-card[data-provider="claude"].active {
78
69
  border-color: rgba(217, 119, 87, 0.55);
79
70
  box-shadow:
@@ -81,12 +72,43 @@ export const cardStyles = `
81
72
  inset 0 1px 0 rgba(255, 255, 255, 1),
82
73
  0 8px 28px rgba(217, 119, 87, 0.18);
83
74
  }
75
+
76
+ .ac-provider-card[data-provider="codex"]:hover {
77
+ border-color: rgba(97, 108, 120, 0.45);
78
+ box-shadow:
79
+ 0 0 0 1px rgba(97, 108, 120, 0.1),
80
+ inset 0 1px 0 rgba(255, 255, 255, 1),
81
+ 0 8px 24px rgba(97, 108, 120, 0.12);
82
+ }
84
83
  .ac-provider-card[data-provider="codex"].active {
85
- border-color: rgba(32, 33, 35, 0.55);
84
+ border-color: rgba(97, 108, 120, 0.55);
86
85
  box-shadow:
87
- 0 0 0 1px rgba(32, 33, 35, 0.15),
86
+ 0 0 0 1px rgba(97, 108, 120, 0.15),
88
87
  inset 0 1px 0 rgba(255, 255, 255, 1),
89
- 0 8px 28px rgba(32, 33, 35, 0.18);
88
+ 0 8px 28px rgba(97, 108, 120, 0.18);
89
+ }
90
+
91
+ .ac-provider-card[data-provider="cursor"]:hover {
92
+ border-color: rgba(20, 22, 26, 0.55);
93
+ box-shadow:
94
+ 0 0 0 1px rgba(20, 22, 26, 0.18),
95
+ inset 0 1px 0 rgba(255, 255, 255, 1),
96
+ 0 8px 24px rgba(20, 22, 26, 0.16);
97
+ }
98
+ .ac-provider-card[data-provider="cursor"].active {
99
+ border-color: rgba(20, 22, 26, 0.65);
100
+ box-shadow:
101
+ 0 0 0 1px rgba(20, 22, 26, 0.22),
102
+ inset 0 1px 0 rgba(255, 255, 255, 1),
103
+ 0 8px 28px rgba(20, 22, 26, 0.2);
104
+ }
105
+
106
+ .ac-provider-card[data-provider="local"]:hover {
107
+ border-color: rgba(100, 116, 139, 0.45);
108
+ box-shadow:
109
+ 0 0 0 1px rgba(100, 116, 139, 0.1),
110
+ inset 0 1px 0 rgba(255, 255, 255, 1),
111
+ 0 8px 24px rgba(100, 116, 139, 0.12);
90
112
  }
91
113
  .ac-provider-card[data-provider="local"].active {
92
114
  border-color: rgba(100, 116, 139, 0.55);
@@ -95,6 +117,7 @@ export const cardStyles = `
95
117
  inset 0 1px 0 rgba(255, 255, 255, 1),
96
118
  0 8px 28px rgba(100, 116, 139, 0.18);
97
119
  }
120
+
98
121
  .ac-provider-row {
99
122
  display: flex;
100
123
  align-items: center;
@@ -105,6 +128,7 @@ export const cardStyles = `
105
128
  align-items: center;
106
129
  gap: 12px;
107
130
  }
131
+
108
132
  .ac-provider-icon {
109
133
  width: 48px;
110
134
  height: 48px;
@@ -130,6 +154,7 @@ export const cardStyles = `
130
154
  width: 26px;
131
155
  height: 26px;
132
156
  }
157
+
133
158
  .ac-provider-icon[data-provider="claude"] {
134
159
  background: linear-gradient(145deg, #fff8f3 0%, #ffeee2 100%);
135
160
  border-color: rgba(217, 119, 87, 0.4);
@@ -145,21 +170,39 @@ export const cardStyles = `
145
170
  inset 0 1px 0 rgba(255, 255, 255, 1),
146
171
  0 4px 16px rgba(217, 119, 87, 0.2);
147
172
  }
173
+
148
174
  .ac-provider-icon[data-provider="codex"] {
149
175
  background: linear-gradient(145deg, #f5f5f5 0%, #e8e8e8 100%);
150
- border-color: rgba(32, 33, 35, 0.4);
176
+ border-color: rgba(122, 132, 146, 0.4);
151
177
  box-shadow:
152
178
  inset 0 1px 0 rgba(255, 255, 255, 1),
153
- 0 2px 8px rgba(32, 33, 35, 0.12);
179
+ 0 2px 8px rgba(97, 108, 120, 0.14);
154
180
  }
155
181
  .ac-provider-icon[data-provider="codex"] svg {
156
- fill: #202123;
182
+ fill: #2a2f36;
157
183
  }
158
184
  .ac-provider-card:hover .ac-provider-icon[data-provider="codex"] {
159
185
  box-shadow:
160
186
  inset 0 1px 0 rgba(255, 255, 255, 1),
161
- 0 4px 16px rgba(32, 33, 35, 0.2);
187
+ 0 4px 16px rgba(97, 108, 120, 0.2);
188
+ }
189
+
190
+ .ac-provider-icon[data-provider="cursor"] {
191
+ background: linear-gradient(145deg, #fbfaf6 0%, #f0ede6 100%);
192
+ border-color: rgba(29, 32, 38, 0.42);
193
+ box-shadow:
194
+ inset 0 1px 0 rgba(255, 255, 255, 1),
195
+ 0 2px 8px rgba(20, 22, 26, 0.16);
162
196
  }
197
+ .ac-provider-icon[data-provider="cursor"] svg {
198
+ fill: #111316;
199
+ }
200
+ .ac-provider-card:hover .ac-provider-icon[data-provider="cursor"] {
201
+ box-shadow:
202
+ inset 0 1px 0 rgba(255, 255, 255, 1),
203
+ 0 4px 16px rgba(20, 22, 26, 0.24);
204
+ }
205
+
163
206
  .ac-provider-icon[data-provider="local"] {
164
207
  background: linear-gradient(145deg, #f2f4f8 0%, #e4e8f0 100%);
165
208
  border-color: rgba(100, 116, 139, 0.4);
@@ -175,10 +218,35 @@ export const cardStyles = `
175
218
  inset 0 1px 0 rgba(255, 255, 255, 1),
176
219
  0 4px 16px rgba(100, 116, 139, 0.2);
177
220
  }
221
+
178
222
  .ac-provider-name {
179
223
  font-size: 15px;
180
224
  font-weight: 700;
181
225
  }
226
+ .ac-provider-name-row {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: 8px;
230
+ }
231
+ .ac-provider-update {
232
+ display: inline-flex;
233
+ align-items: center;
234
+ padding: 3px 10px;
235
+ border-radius: 999px;
236
+ font-size: 11px;
237
+ font-weight: 600;
238
+ letter-spacing: 0.01em;
239
+ background: transparent;
240
+ color: #2b2f3a;
241
+ border: 1px solid rgba(120, 129, 145, 0.45);
242
+ box-shadow:
243
+ inset 0 1px 0 rgba(255, 255, 255, 0.9),
244
+ 0 6px 16px rgba(18, 24, 38, 0.12);
245
+ background-image: linear-gradient(120deg, #6b7280 0%, #1f2937 45%, #64748b 100%);
246
+ -webkit-background-clip: text;
247
+ background-clip: text;
248
+ -webkit-text-fill-color: transparent;
249
+ }
182
250
  .ac-provider-status {
183
251
  font-size: 12px;
184
252
  color: var(--ac-muted, #556070);
@@ -188,6 +256,7 @@ export const cardStyles = `
188
256
  align-items: center;
189
257
  gap: 8px;
190
258
  }
259
+
191
260
  .ac-provider-card.loading {
192
261
  pointer-events: none;
193
262
  }
@@ -199,14 +268,10 @@ export const cardStyles = `
199
268
  animation: ac-shimmer 1.5s ease-in-out infinite;
200
269
  background-size: 200% 100%;
201
270
  }
202
- .ac-provider-card:active {
203
- transform: scale(0.99);
204
- }
205
271
  .ac-provider-card .ac-provider-actions .ac-button {
206
272
  pointer-events: none;
207
273
  }
208
- .ac-provider-card .ac-provider-actions .ac-button:hover {
209
- transform: none;
210
- box-shadow: inherit;
274
+ .ac-provider-card .ac-provider-actions .ac-button.update.icon {
275
+ pointer-events: auto;
211
276
  }
212
277
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentconnect/ui",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/rayzhudev/agent-connect",
@@ -29,7 +29,7 @@
29
29
  "dev": "tsc --watch"
30
30
  },
31
31
  "dependencies": {
32
- "@agentconnect/sdk": "^0.1.3"
32
+ "@agentconnect/sdk": "^0.1.6"
33
33
  },
34
34
  "devDependencies": {
35
35
  "typescript": "^5.6.2"