@agentconnect/ui 0.1.3 → 0.1.5

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;IAqFrB,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,38 @@ 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);
303
324
  }
304
- const providers = await client.providers.list();
305
- this.state.providers = providers;
325
+ if (!providerIds.length) {
326
+ providerIds = this.createInitialProviders().map((entry) => entry.id);
327
+ }
328
+ const existing = new Map(this.state.providers.map((entry) => [entry.id, entry]));
329
+ const initial = new Map(this.createInitialProviders().map((entry) => [entry.id, entry]));
330
+ this.state.providers = providerIds.map((id) => {
331
+ const base = existing.get(id) ||
332
+ initial.get(id) || {
333
+ id,
334
+ name: id,
335
+ installed: false,
336
+ loggedIn: false,
337
+ };
338
+ return { ...base, pending: true };
339
+ });
306
340
  if (this.state.connected) {
307
341
  this.state.selectedProvider = this.state.connected.provider;
308
342
  this.state.selectedModel = this.state.connected.model;
309
343
  }
310
344
  else if (!this.state.selectedProvider) {
311
- this.state.selectedProvider = providers[0]?.id || null;
345
+ this.state.selectedProvider = providerIds[0] || null;
312
346
  }
347
+ this.renderProviders();
313
348
  const shouldRefreshModels = !this.state.selectedProvider ||
314
349
  this.state.models.length === 0 ||
315
350
  this.modelsProvider !== this.state.selectedProvider ||
@@ -329,9 +364,14 @@ export class AgentConnectConnect extends HTMLElement {
329
364
  this.renderReasoningEfforts();
330
365
  this.updatePopoverTitle();
331
366
  this.updateButtonLabel();
367
+ this.scheduleUpdateRefresh();
332
368
  if (this.state.view === 'connected') {
333
369
  requestAnimationFrame(() => this.positionPopover());
334
370
  }
371
+ providerIds.forEach((providerId) => {
372
+ const name = this.state.providers.find((entry) => entry.id === providerId)?.name;
373
+ this.checkProviderStatus(providerId, name, { silent: true }).catch(() => { });
374
+ });
335
375
  }
336
376
  catch {
337
377
  if (!silent) {
@@ -363,34 +403,8 @@ export class AgentConnectConnect extends HTMLElement {
363
403
  this.loginPollTimer = null;
364
404
  }
365
405
  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
- }
406
+ const providerIds = this.state.providers.map((entry) => entry.id);
407
+ await Promise.all(providerIds.map((providerId) => this.checkProviderStatus(providerId, undefined, { silent: true })));
394
408
  this.updateLoginPolling();
395
409
  }
396
410
  shouldPollLogin() {
@@ -414,12 +428,14 @@ export class AgentConnectConnect extends HTMLElement {
414
428
  return;
415
429
  this.state.providers[index] = { ...this.state.providers[index], ...updates };
416
430
  }
417
- async checkProviderStatus(providerId, providerName) {
431
+ async checkProviderStatus(providerId, providerName, options = {}) {
418
432
  if (this.statusCheckInFlight.has(providerId))
419
433
  return;
420
434
  this.statusCheckInFlight.add(providerId);
421
435
  const label = providerName || providerId;
422
- this.setStatus(`Checking ${label} status...`);
436
+ if (!options.silent) {
437
+ this.setStatus(`Checking ${label} status...`);
438
+ }
423
439
  try {
424
440
  const client = await getClient();
425
441
  const status = await client.providers.status(providerId);
@@ -427,6 +443,14 @@ export class AgentConnectConnect extends HTMLElement {
427
443
  installed: status.installed,
428
444
  loggedIn: status.loggedIn,
429
445
  version: status.version,
446
+ pending: false,
447
+ updateAvailable: status.updateAvailable,
448
+ latestVersion: status.latestVersion,
449
+ updateCheckedAt: status.updateCheckedAt,
450
+ updateSource: status.updateSource,
451
+ updateCommand: status.updateCommand,
452
+ updateMessage: status.updateMessage,
453
+ updateInProgress: status.updateInProgress,
430
454
  });
431
455
  if (status.loggedIn) {
432
456
  this.loginPending.delete(providerId);
@@ -438,6 +462,13 @@ export class AgentConnectConnect extends HTMLElement {
438
462
  this.updatePopoverTitle();
439
463
  this.updateButtonLabel();
440
464
  this.updateLoginPolling();
465
+ this.scheduleUpdateRefresh();
466
+ }
467
+ catch {
468
+ this.updateProviderEntry(providerId, { pending: false });
469
+ this.renderProviders();
470
+ this.updatePopoverTitle();
471
+ this.updateButtonLabel();
441
472
  }
442
473
  finally {
443
474
  this.statusCheckInFlight.delete(providerId);
@@ -458,6 +489,13 @@ export class AgentConnectConnect extends HTMLElement {
458
489
  installed: status.installed,
459
490
  loggedIn: status.loggedIn,
460
491
  version: status.version,
492
+ updateAvailable: status.updateAvailable,
493
+ latestVersion: status.latestVersion,
494
+ updateCheckedAt: status.updateCheckedAt,
495
+ updateSource: status.updateSource,
496
+ updateCommand: status.updateCommand,
497
+ updateMessage: status.updateMessage,
498
+ updateInProgress: status.updateInProgress,
461
499
  });
462
500
  if (status.loggedIn) {
463
501
  this.loginPending.delete(providerId);
@@ -467,6 +505,7 @@ export class AgentConnectConnect extends HTMLElement {
467
505
  this.updatePopoverTitle();
468
506
  this.updateButtonLabel();
469
507
  this.updateLoginPolling();
508
+ this.scheduleUpdateRefresh();
470
509
  return true;
471
510
  }
472
511
  await new Promise((resolve) => setTimeout(resolve, this.loginPollIntervalMs));
@@ -484,11 +523,37 @@ export class AgentConnectConnect extends HTMLElement {
484
523
  await this.prefetchAllProviderModels();
485
524
  this.prefetching = false;
486
525
  }
526
+ scheduleUpdateRefresh() {
527
+ if (this.updateRefreshTimer)
528
+ return;
529
+ if (this.updateRefreshAttempts >= this.updateRefreshMaxAttempts)
530
+ return;
531
+ const needsUpdateInfo = this.state.providers.some((provider) => provider.installed && provider.updateCheckedAt === undefined);
532
+ if (!needsUpdateInfo)
533
+ return;
534
+ this.updateRefreshAttempts += 1;
535
+ this.updateRefreshTimer = setTimeout(() => {
536
+ this.updateRefreshTimer = null;
537
+ this.refresh({ silent: true }).catch(() => { });
538
+ }, this.updateRefreshDelayMs);
539
+ }
487
540
  async prefetchAllProviderModels() {
488
541
  if (!this.state.providers.length)
489
542
  return;
490
543
  const client = await getClient();
491
- await Promise.allSettled(this.state.providers.map((provider) => client.models.list(provider.id)));
544
+ await Promise.allSettled(this.state.providers.map((provider) => {
545
+ const key = `agentconnect:models-prefetch:${provider.id}`;
546
+ if (localStorage.getItem(key) === '1') {
547
+ return Promise.resolve();
548
+ }
549
+ try {
550
+ localStorage.setItem(key, '1');
551
+ }
552
+ catch {
553
+ // ignore
554
+ }
555
+ return client.models.list(provider.id);
556
+ }));
492
557
  }
493
558
  async refreshModels() {
494
559
  if (!this.state.selectedProvider) {
@@ -576,25 +641,36 @@ export class AgentConnectConnect extends HTMLElement {
576
641
  icon.appendChild(iconLabel);
577
642
  }
578
643
  const textWrap = document.createElement('div');
644
+ const nameRow = document.createElement('div');
645
+ nameRow.className = 'ac-provider-name-row';
579
646
  const name = document.createElement('div');
580
647
  name.className = 'ac-provider-name';
581
648
  name.textContent = provider.name || provider.id;
649
+ nameRow.appendChild(name);
650
+ if (provider.updateAvailable && !this.isUpdatingProvider(provider)) {
651
+ const updateBadge = document.createElement('span');
652
+ updateBadge.className = 'ac-provider-update';
653
+ updateBadge.textContent = 'Update available';
654
+ nameRow.appendChild(updateBadge);
655
+ }
582
656
  const status = document.createElement('div');
583
657
  status.className = 'ac-provider-status';
584
658
  status.textContent = statusText;
585
- textWrap.append(name, status);
659
+ textWrap.append(nameRow, status);
586
660
  meta.append(icon, textWrap);
587
661
  row.appendChild(meta);
588
662
  card.appendChild(row);
589
663
  card.addEventListener('click', () => {
590
664
  this.handleProviderSelect(provider);
591
665
  });
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);
666
+ const actions = this.buildProviderActions(provider);
667
+ if (actions.length) {
668
+ const actionsEl = document.createElement('div');
669
+ actionsEl.className = 'ac-provider-actions';
670
+ for (const action of actions) {
671
+ actionsEl.appendChild(action);
672
+ }
673
+ card.appendChild(actionsEl);
598
674
  }
599
675
  return card;
600
676
  }
@@ -603,8 +679,11 @@ export class AgentConnectConnect extends HTMLElement {
603
679
  const isLocal = provider.id === 'local';
604
680
  const hasLocalConfig = this.hasLocalConfig();
605
681
  const isConnected = this.state.connected?.provider === provider.id;
682
+ const updating = this.isUpdatingProvider(provider);
606
683
  if (pending)
607
684
  return 'Checking...';
685
+ if (updating)
686
+ return 'Updating...';
608
687
  if (isLocal) {
609
688
  if (!hasLocalConfig)
610
689
  return 'Needs setup';
@@ -620,17 +699,31 @@ export class AgentConnectConnect extends HTMLElement {
620
699
  return 'Connected';
621
700
  return 'Detected';
622
701
  }
623
- buildProviderAction(provider) {
702
+ isUpdatingProvider(provider) {
703
+ return Boolean(provider.updateInProgress || this.updatePending.has(provider.id));
704
+ }
705
+ buildProviderActions(provider) {
706
+ const actions = [];
624
707
  const pending = provider.pending === true;
625
708
  const isLocal = provider.id === 'local';
626
709
  const hasLocalConfig = this.hasLocalConfig();
627
710
  const isConnected = this.state.connected?.provider === provider.id;
628
711
  const terminalLogin = provider.id === 'claude' && this.state.loginExperience === 'terminal';
712
+ const updating = this.isUpdatingProvider(provider);
629
713
  if (pending) {
630
- return this.buildActionButton('Checking...', true);
714
+ actions.push(this.buildActionButton('Checking...', true));
715
+ return actions;
716
+ }
717
+ if (updating) {
718
+ actions.push(this.buildUpdateButton(provider, true));
719
+ return actions;
631
720
  }
632
721
  if (isLocal) {
633
- return this.buildActionButton(hasLocalConfig ? 'Edit' : 'Configure', false, () => this.openLocalConfig());
722
+ actions.push(this.buildActionButton(hasLocalConfig ? 'Edit' : 'Configure', false, () => this.openLocalConfig()));
723
+ return actions;
724
+ }
725
+ if (provider.updateAvailable) {
726
+ actions.push(this.buildUpdateButton(provider, false));
634
727
  }
635
728
  if (!provider.installed) {
636
729
  const label = terminalLogin ? 'Install + Run /login' : 'Install + Login';
@@ -638,12 +731,14 @@ export class AgentConnectConnect extends HTMLElement {
638
731
  if (terminalLogin) {
639
732
  button.title = 'Opens a terminal and runs claude login';
640
733
  }
641
- return button;
734
+ actions.push(button);
735
+ return actions;
642
736
  }
643
737
  if (this.loginPending.has(provider.id)) {
644
738
  const button = this.buildActionButton('Waiting for login...', false, () => this.checkProviderStatus(provider.id, provider.name));
645
739
  button.title = `Click to check ${provider.name || provider.id} login status`;
646
- return button;
740
+ actions.push(button);
741
+ return actions;
647
742
  }
648
743
  if (!provider.loggedIn) {
649
744
  const label = terminalLogin ? 'Run /login' : 'Login';
@@ -651,15 +746,16 @@ export class AgentConnectConnect extends HTMLElement {
651
746
  if (terminalLogin) {
652
747
  button.title = 'Opens a terminal and runs claude login';
653
748
  }
654
- return button;
749
+ actions.push(button);
750
+ return actions;
655
751
  }
656
752
  if (isConnected)
657
- return null;
658
- return null;
753
+ return actions;
754
+ return actions;
659
755
  }
660
- buildActionButton(label, disabled, onClick, loading = false) {
756
+ buildActionButton(label, disabled, onClick, loading = false, variant = 'secondary') {
661
757
  const button = document.createElement('button');
662
- button.className = 'ac-button secondary';
758
+ button.className = `ac-button ${variant}`;
663
759
  if (loading) {
664
760
  button.classList.add('loading');
665
761
  }
@@ -673,11 +769,37 @@ export class AgentConnectConnect extends HTMLElement {
673
769
  }
674
770
  return button;
675
771
  }
772
+ buildUpdateButton(provider, loading) {
773
+ const updateButton = document.createElement('button');
774
+ updateButton.className = 'ac-button update icon';
775
+ updateButton.type = 'button';
776
+ updateButton.setAttribute('aria-label', `Update ${provider.name || provider.id}`);
777
+ updateButton.title = provider.updateMessage || 'Update available';
778
+ if (loading) {
779
+ updateButton.classList.add('loading');
780
+ updateButton.disabled = true;
781
+ }
782
+ updateButton.innerHTML = `
783
+ <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
784
+ <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" />
785
+ <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" />
786
+ </svg>
787
+ `;
788
+ if (!loading) {
789
+ updateButton.addEventListener('click', (event) => {
790
+ event.stopPropagation();
791
+ this.updateProvider(provider);
792
+ });
793
+ }
794
+ return updateButton;
795
+ }
676
796
  async handleProviderSelect(provider) {
677
797
  if (this.busy)
678
798
  return;
679
799
  if (provider.pending)
680
800
  return;
801
+ if (this.isUpdatingProvider(provider))
802
+ return;
681
803
  if (provider.id === 'local') {
682
804
  this.openLocalConfig();
683
805
  return;
@@ -720,6 +842,29 @@ export class AgentConnectConnect extends HTMLElement {
720
842
  this.setProviderLoading(provider.id, false);
721
843
  }
722
844
  }
845
+ async updateProvider(provider) {
846
+ if (this.updatePending.has(provider.id))
847
+ return;
848
+ this.updatePending.add(provider.id);
849
+ this.renderProviders();
850
+ try {
851
+ const client = await getClient();
852
+ await client.providers.update(provider.id);
853
+ await this.refresh({ silent: true });
854
+ }
855
+ catch (err) {
856
+ this.setAlert({
857
+ title: 'Update failed',
858
+ message: err instanceof Error ? err.message : 'Could not update provider.',
859
+ action: 'Retry',
860
+ onAction: () => this.updateProvider(provider),
861
+ });
862
+ }
863
+ finally {
864
+ this.updatePending.delete(provider.id);
865
+ this.renderProviders();
866
+ }
867
+ }
723
868
  setProviderLoading(providerId, loading, label = 'Working...') {
724
869
  const card = this.elements?.providerList?.querySelector(`.ac-provider-card[data-provider="${providerId}"]`);
725
870
  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.3",
3
+ "version": "0.1.5",
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": "workspace:*"
32
+ "@agentconnect/sdk": "^0.1.5"
33
33
  },
34
34
  "devDependencies": {
35
35
  "typescript": "^5.6.2"