@mrrlin-dev/external-agents 0.2.1 → 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 +32 -0
  2. package/package.json +1 -1
  3. package/ui.js +36 -22
package/agents.yaml CHANGED
@@ -346,6 +346,13 @@ agents:
346
346
  edit_exists: "opencode -p"
347
347
 
348
348
  # ============ Primary orchestrator (subscription CLI) ============
349
+ # These are strong-tier agentic CLIs backed by an operator subscription — not
350
+ # API keys. `pick_agents` excludes strong-tier by default (weak-only filter),
351
+ # so they are reached only via an explicit `dispatch <id>` call, typically as
352
+ # the primary-orchestrator role or as `escalate_to_pro: true` on a weak-tier
353
+ # dispatch that failed. Which of the two is "primary" is decided by the
354
+ # consumer (mrrlin will make this operator-configurable in a later slice);
355
+ # both are registered here so either can serve.
349
356
  - id: codex
350
357
  provider: openai
351
358
  model: gpt-5.2-codex
@@ -355,3 +362,28 @@ agents:
355
362
  usage_url: "https://platform.openai.com/usage"
356
363
  transports:
357
364
  edit_exists: "codex exec"
365
+
366
+ - id: claude
367
+ provider: anthropic
368
+ model: claude-opus-4-7
369
+ tier: strong
370
+ tags: []
371
+ auth: "cli:claude"
372
+ usage_url: "https://console.anthropic.com/settings/usage"
373
+ transports:
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.1",
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.