@oddessentials/agent-guild 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -47,7 +47,7 @@ Grok Build and a plain shell each get a card. A tool that is missing shows
47
47
  vendor's install command for a tool not published on npm. An installed
48
48
  tool shows its version and offers **Update** when a newer one is out, using
49
49
  the same installer that put it there: npm, Homebrew, WinGet or the vendor's
50
- own.
50
+ own. The cloud icon on each card opens the vendor's web app.
51
51
 
52
52
  **Real terminals that outlive the page.** Every session is a full interactive
53
53
  terminal: type instructions, answer prompts, watch output. Run as many as you
@@ -29,6 +29,7 @@
29
29
  "docs": "https://code.claude.com/docs/en/setup",
30
30
  "usageUrl": "https://claude.ai/settings/usage",
31
31
  "billingUrl": "https://claude.ai/settings/billing",
32
+ "cloudUrl": "https://claude.ai/code",
32
33
  "win32": {
33
34
  "install": "irm https://claude.ai/install.ps1 | iex",
34
35
  "channels": {
@@ -65,6 +66,7 @@
65
66
  "docs": "https://github.com/openai/codex",
66
67
  "usageUrl": "https://chatgpt.com/codex/settings/usage",
67
68
  "billingUrl": "https://chatgpt.com/#settings/Billing",
69
+ "cloudUrl": "https://chatgpt.com/codex",
68
70
  "win32": {
69
71
  "install": "powershell -ExecutionPolicy ByPass -c \"irm https://chatgpt.com/codex/install.ps1 | iex\"",
70
72
  "channels": {
@@ -92,6 +94,7 @@
92
94
  },
93
95
  "docs": "https://antigravity.google/docs/cli/install",
94
96
  "billingUrl": "https://one.google.com/settings",
97
+ "cloudUrl": "https://gemini.google.com/",
95
98
  "win32": {
96
99
  "install": "irm https://antigravity.google/cli/install.ps1 | iex",
97
100
  "channels": {
@@ -123,6 +126,7 @@
123
126
  "docs": "https://docs.x.ai/build/overview",
124
127
  "usageUrl": "https://grok.com/?_s=usage",
125
128
  "billingUrl": "https://grok.com/?_s=billing",
129
+ "cloudUrl": "https://grok.com/",
126
130
  "win32": {
127
131
  "install": "irm https://x.ai/cli/install.ps1 | iex"
128
132
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oddessentials/agent-guild",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Launch and watch AI coding-assistant terminal sessions from one local web page. A bundled session manager owns the terminals so the page can close and reconnect.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -182,6 +182,7 @@ function normalize(raw, platform, warnings) {
182
182
  docs: String(merged.docs || ''),
183
183
  usageUrl: httpsUrl(merged.usageUrl, 'usageUrl', merged.id, warnings),
184
184
  billingUrl: httpsUrl(merged.billingUrl, 'billingUrl', merged.id, warnings),
185
+ cloudUrl: httpsUrl(merged.cloudUrl, 'cloudUrl', merged.id, warnings),
185
186
  enabled: merged.enabled !== false,
186
187
  };
187
188
  }
@@ -637,6 +638,7 @@ export class ProviderRegistry extends EventEmitter {
637
638
  docs: provider.docs,
638
639
  usageUrl: provider.usageUrl,
639
640
  billingUrl: provider.billingUrl,
641
+ cloudUrl: provider.cloudUrl,
640
642
  available: Boolean(resolvedPath),
641
643
  resolvedPath,
642
644
  };
package/web/app.js CHANGED
@@ -557,7 +557,7 @@ function renderProviders() {
557
557
  update.addEventListener('click', () => installProvider(provider, node));
558
558
  renderHint(hint, provider);
559
559
  renderCopies(node.querySelector('.copies'), provider);
560
- renderConsoleLinks(node, provider);
560
+ renderVendorLinks(node, provider);
561
561
  renderAccounts(node, provider);
562
562
  renderUsage(node, provider);
563
563
  renderReportingSetup(node, provider);
@@ -627,19 +627,22 @@ function renderHint(hint, provider) {
627
627
  hint.append(' ', link);
628
628
  }
629
629
 
630
- function renderConsoleLinks(card, provider) {
631
- let any = false;
632
- for (const [selector, url, what] of [['.usage-link', provider.usageUrl, 'usage'], ['.billing-link', provider.billingUrl, 'billing']]) {
633
- const link = card.querySelector(selector);
634
- const href = httpsHref(url);
635
- link.hidden = !href;
636
- if (!href) { link.removeAttribute('href'); continue; }
637
- any = true;
638
- link.href = href;
639
- link.title = `${provider.vendor} ${what} console: ${href}`;
640
- link.setAttribute('aria-label', `${provider.vendor} ${what} console (opens in a new tab)`);
641
- }
642
- card.querySelector('.provider-links').hidden = !any;
630
+ function renderVendorLinks(card, provider) {
631
+ const usage = setVendorLink(card.querySelector('.usage-link'), provider.usageUrl, `${provider.vendor} usage console`);
632
+ const billing = setVendorLink(card.querySelector('.billing-link'), provider.billingUrl, `${provider.vendor} billing console`);
633
+ card.querySelector('.provider-links').hidden = !usage && !billing;
634
+ setVendorLink(card.querySelector('.cloud-link'), provider.cloudUrl, `${provider.vendor} web app`);
635
+ }
636
+
637
+ /** Point a link at an https URL, or hide it. Returns whether it is shown. */
638
+ function setVendorLink(link, url, label) {
639
+ const href = httpsHref(url);
640
+ link.hidden = !href;
641
+ if (!href) { link.removeAttribute('href'); return false; }
642
+ link.href = href;
643
+ link.title = `${label}: ${href}`;
644
+ link.setAttribute('aria-label', `${label} (opens in a new tab)`);
645
+ return true;
643
646
  }
644
647
 
645
648
  function renderTier(card, provider, usage) {
package/web/index.html CHANGED
@@ -259,6 +259,7 @@
259
259
  <span class="tool"></span>
260
260
  <span class="state"></span>
261
261
  </span>
262
+ <a class="cloud-link" target="_blank" rel="noopener noreferrer" hidden></a>
262
263
  </div>
263
264
  <div class="accounts" role="tablist" aria-label="Accounts" hidden></div>
264
265
  <div class="usage"></div>
package/web/styles.css CHANGED
@@ -23,7 +23,8 @@
23
23
  --icon-sun: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='4.2'/%3E%3Cpath d='M12 2.5v2.2M12 19.3v2.2M2.5 12h2.2M19.3 12h2.2M5.3 5.3l1.6 1.6M17.1 17.1l1.6 1.6M5.3 18.7l1.6-1.6M17.1 6.9l1.6-1.6'/%3E%3C/svg%3E");
24
24
  --icon-moon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M19.5 14.6A8 8 0 0 1 9.4 4.5a8 8 0 1 0 10.1 10.1z'/%3E%3C/svg%3E");
25
25
  --icon-external: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 17L17 7M9 7h8v8'/%3E%3C/svg%3E");
26
- --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5.5l6.5 6.5L9 18.5'/%3E%3C/svg%3E");
26
+ --icon-cloud: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M7 18.5h10.5a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.5 9.6 4.5 4.5 0 0 0 7 18.5z'/%3E%3C/svg%3E");
27
+ --icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5.5l6.5 6.5L9 18.5'/%3E%3C/svg%3E");
27
28
  --icon-github: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z'/%3E%3C/svg%3E");
28
29
  --icon-info: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 10.8v6.2' stroke-width='2.4'/%3E%3Ccircle cx='12' cy='7.3' r='1.2' fill='black' stroke='none'/%3E%3C/svg%3E");
29
30
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
@@ -201,6 +202,10 @@ main { max-width: 1200px; margin: 0 auto; padding: 26px 16px 56px; display: grid
201
202
  .console-link { color: var(--accent); text-decoration: none; }
202
203
  .console-link:hover { text-decoration: underline; }
203
204
  .console-link:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 3px; }
205
+ .cloud-link { display: block; flex: none; align-self: flex-start; width: 32px; height: 32px; margin: -4px -6px 0 0; border-radius: 8px; color: var(--muted); }
206
+ .cloud-link::before { content: ""; display: block; width: 100%; height: 100%; background: currentColor; mask: var(--icon-cloud) center / 20px no-repeat; }
207
+ .cloud-link:hover { color: var(--accent); }
208
+ .cloud-link:focus-visible { color: var(--accent); outline: 2px solid var(--focus); outline-offset: 0; }
204
209
  .provider-actions { margin-top: auto; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
205
210
  .provider .hint { font-size: 0.78rem; color: var(--muted); overflow-wrap: anywhere; }
206
211
  .provider .copies { font-size: 0.78rem; color: var(--muted); overflow-wrap: anywhere; }