@mrrlin-dev/external-agents 0.2.2 → 0.2.3

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.
Files changed (3) hide show
  1. package/agents.yaml +15 -0
  2. package/package.json +1 -1
  3. package/ui.js +36 -22
package/agents.yaml CHANGED
@@ -372,3 +372,18 @@ agents:
372
372
  usage_url: "https://console.anthropic.com/settings/usage"
373
373
  transports:
374
374
  edit_exists: "claude --print"
375
+
376
+ # Weak-tier Sonnet — same Claude subscription, cheaper model. Included in
377
+ # default `pick_agents` runs (weak filter passes it), so `dispatch` /
378
+ # `/consensus` terminal-picks and the atomic-executor workload can route to
379
+ # Claude via subscription without burning Opus tokens.
380
+ - id: claude-sonnet
381
+ provider: anthropic
382
+ model: claude-sonnet-5
383
+ tier: weak
384
+ tags: [quick]
385
+ auth: "cli:claude"
386
+ preference_order: 20
387
+ usage_url: "https://console.anthropic.com/settings/usage"
388
+ transports:
389
+ edit_exists: "claude --print --model claude-sonnet-5"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrrlin-dev/external-agents",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "One MCP server for every LLM you talk to — direct-API dispatcher across Gemini, DeepSeek, Groq, OpenRouter, Cerebras, and more. Part of mrrlin.com.",
5
5
  "type": "module",
6
6
  "main": "server.js",
package/ui.js CHANGED
@@ -177,7 +177,7 @@ const PAGE = `<!doctype html>
177
177
 
178
178
  <div style="margin-top: 32px; padding: 16px; background: #fff; border: 1px dashed #ccc; border-radius: 4px;">
179
179
  <h3 style="margin: 0 0 4px 0; font-size: 15px;">Missing your model?</h3>
180
- <p style="margin: 0 0 12px 0; color: #666; font-size: 13px;">Suggest a new model or provider — we&rsquo;ll pick it up.</p>
180
+ <p style="margin: 0 0 12px 0; color: #666; font-size: 13px;">Suggest a new model or provider &mdash; opens a pre-filled issue on the public tracker at <a href="https://github.com/mrrlin-dev/external-agents/issues" target="_blank" rel="noopener noreferrer">mrrlin-dev/external-agents</a> (also logged locally).</p>
181
181
  <div style="display: flex; gap: 8px; align-items: center; flex-wrap: wrap;">
182
182
  <input id="suggest-name" placeholder="Model or provider name (e.g. anthropic/haiku-4-5)" style="flex: 1; min-width: 260px; padding: 6px 10px; border: 1px solid #ccc; border-radius: 4px; font: inherit;">
183
183
  <input id="suggest-url" placeholder="Docs / setup URL (optional)" style="flex: 1; min-width: 260px; padding: 6px 10px; border: 1px solid #ccc; border-radius: 4px; font: inherit;">
@@ -221,28 +221,42 @@ async function submitSuggest() {
221
221
  const url = document.getElementById("suggest-url").value.trim();
222
222
  const out = document.getElementById("suggest-result");
223
223
  if (!name) { out.textContent = "please enter a model or provider name"; out.style.color = "#a33"; return; }
224
- out.textContent = "sending...";
224
+ out.textContent = "opening GitHub issue…";
225
225
  out.style.color = "#666";
226
- try {
227
- const r = await fetch("/api/suggest", {
228
- method: "POST",
229
- headers: { "Content-Type": "application/json" },
230
- body: JSON.stringify({ name, url })
231
- });
232
- const j = await r.json();
233
- if (r.ok) {
234
- out.textContent = "thanks — recorded (id " + (j.id || "?") + "). We’ll pick it up.";
235
- out.style.color = "#4a8";
236
- document.getElementById("suggest-name").value = "";
237
- document.getElementById("suggest-url").value = "";
238
- } else {
239
- out.textContent = "error: " + (j.error || r.statusText);
240
- out.style.color = "#a33";
241
- }
242
- } catch (e) {
243
- out.textContent = "network error: " + e.message;
244
- out.style.color = "#a33";
245
- }
226
+
227
+ // 1) Fire-and-forget local JSONL record so `external-agents ui` still has an
228
+ // audit trail even if the user cancels the GitHub tab.
229
+ fetch("/api/suggest", {
230
+ method: "POST",
231
+ headers: { "Content-Type": "application/json" },
232
+ body: JSON.stringify({ name, url }),
233
+ }).catch(() => { /* non-blocking; the public issue below is the real submit */ });
234
+
235
+ // 2) Public path — open a pre-filled New Issue on the external-agents repo.
236
+ // The registry maintainer picks it up from the public tracker; anyone else
237
+ // watching the repo can see it too, so proposals are discoverable, not stuck
238
+ // in a private JSONL.
239
+ const body = [
240
+ "**Model / provider:** " + name,
241
+ "",
242
+ url ? "**Docs / setup URL:** " + url : "**Docs / setup URL:** _(none provided)_",
243
+ "",
244
+ "---",
245
+ "_Submitted via `external-agents ui` — the local dashboard's \"Missing your model?\" form._",
246
+ ].join("\n");
247
+ const issueUrl =
248
+ "https://github.com/mrrlin-dev/external-agents/issues/new?" +
249
+ "labels=missing-model" +
250
+ "&title=" + encodeURIComponent("Add " + name) +
251
+ "&body=" + encodeURIComponent(body);
252
+ window.open(issueUrl, "_blank", "noopener,noreferrer");
253
+
254
+ out.innerHTML = "opened a pre-filled GitHub issue in a new tab — " +
255
+ "just click <b>Submit new issue</b> there. " +
256
+ '(also logged locally as backup)';
257
+ out.style.color = "#4a8";
258
+ document.getElementById("suggest-name").value = "";
259
+ document.getElementById("suggest-url").value = "";
246
260
  }
247
261
  // Per-provider signup metadata for the unlock banner. Only providers whose
248
262
  // entries carry the "free" tag AND may show up in needs_auth appear here.