swarm-code 0.1.4 → 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.
Files changed (2) hide show
  1. package/dist/interactive.js +65 -22
  2. package/package.json +1 -1
@@ -1582,30 +1582,73 @@ async function interactive() {
1582
1582
  console.log();
1583
1583
  }
1584
1584
  else {
1585
- // Agent works without keys (e.g. OpenCode) — set up Ollama directly
1586
- console.log(` ${c.bold}${agent.name}${c.reset} ${c.dim}— setting up Ollama for local models:${c.reset}\n`);
1587
- const ok = await ensureOllamaSetup(setupRl, "ollama/deepseek-coder-v2");
1588
- if (ok)
1589
- usesOllama = true;
1585
+ // Agent works without keys (e.g. OpenCode) — choose backend
1586
+ console.log(` ${c.bold}${agent.name}${c.reset} ${c.dim}— choose your backend:${c.reset}\n`);
1587
+ console.log(` ${c.dim}1${c.reset} Ollama ${c.dim}Run models locally (free, requires download)${c.reset}`);
1588
+ console.log(` ${c.dim}2${c.reset} OpenRouter ${c.dim}Cloud API for 200+ models (requires API key)${c.reset}`);
1589
+ console.log();
1590
+ const backendChoice = await questionWithEsc(setupRl, ` ${c.cyan}Backend [1-2]:${c.reset} `);
1591
+ const pickedOpenRouter = backendChoice !== null && backendChoice.trim() === "2";
1592
+ if (pickedOpenRouter) {
1593
+ // OpenRouter setup
1594
+ console.log();
1595
+ const orKey = await questionWithEsc(setupRl, ` ${c.cyan}OPENROUTER_API_KEY:${c.reset} `);
1596
+ if (orKey?.trim()) {
1597
+ process.env.OPENROUTER_API_KEY = orKey.trim();
1598
+ try {
1599
+ const envPath = path.join(process.cwd(), ".env");
1600
+ let envContent = "";
1601
+ try {
1602
+ envContent = fs.readFileSync(envPath, "utf-8");
1603
+ }
1604
+ catch { }
1605
+ if (!envContent.includes("OPENROUTER_API_KEY")) {
1606
+ fs.appendFileSync(envPath, `\nOPENROUTER_API_KEY=${orKey.trim()}\n`);
1607
+ }
1608
+ console.log(` ${c.green}✓${c.reset} OpenRouter configured`);
1609
+ }
1610
+ catch {
1611
+ console.log(` ${c.green}✓${c.reset} OpenRouter key set for this session`);
1612
+ }
1613
+ currentModelId = "openrouter/auto";
1614
+ saveModelPreference(currentModelId);
1615
+ }
1616
+ else {
1617
+ console.log(` ${c.dim}No key provided — you can set OPENROUTER_API_KEY in .env later${c.reset}`);
1618
+ }
1619
+ }
1620
+ else {
1621
+ // Ollama setup
1622
+ console.log();
1623
+ const ok = await ensureOllamaSetup(setupRl, "ollama/deepseek-coder-v2");
1624
+ if (ok)
1625
+ usesOllama = true;
1626
+ }
1590
1627
  console.log();
1591
1628
  }
1592
1629
  }
1593
1630
  // ── Step 3: Set default model ────────────────────────────────
1594
- const activeProvider = Object.keys(PROVIDER_KEYS).find((p) => process.env[providerEnvKey(p)]);
1595
- if (activeProvider) {
1596
- currentProviderName = activeProvider;
1597
- const defaultModel = getDefaultModelForProvider(activeProvider);
1598
- if (defaultModel) {
1599
- currentModelId = defaultModel;
1631
+ if (currentModelId.startsWith("openrouter/")) {
1632
+ // Already set during OpenRouter setup
1633
+ console.log(` ${c.green}✓${c.reset} Default model: ${c.bold}${currentModelId}${c.reset} ${c.dim}(OpenRouter)${c.reset}`);
1634
+ }
1635
+ else {
1636
+ const activeProvider = Object.keys(PROVIDER_KEYS).find((p) => process.env[providerEnvKey(p)]);
1637
+ if (activeProvider) {
1638
+ currentProviderName = activeProvider;
1639
+ const defaultModel = getDefaultModelForProvider(activeProvider);
1640
+ if (defaultModel) {
1641
+ currentModelId = defaultModel;
1642
+ saveModelPreference(currentModelId);
1643
+ console.log(` ${c.green}✓${c.reset} Default model: ${c.bold}${currentModelId}${c.reset}`);
1644
+ }
1645
+ }
1646
+ else if (usesOllama) {
1647
+ currentModelId = "ollama/deepseek-coder-v2";
1600
1648
  saveModelPreference(currentModelId);
1601
- console.log(` ${c.green}✓${c.reset} Default model: ${c.bold}${currentModelId}${c.reset}`);
1649
+ console.log(` ${c.green}✓${c.reset} Default model: ${c.bold}${currentModelId}${c.reset} ${c.dim}(local)${c.reset}`);
1602
1650
  }
1603
1651
  }
1604
- else if (usesOllama) {
1605
- currentModelId = "ollama/deepseek-coder-v2";
1606
- saveModelPreference(currentModelId);
1607
- console.log(` ${c.green}✓${c.reset} Default model: ${c.bold}${currentModelId}${c.reset} ${c.dim}(local)${c.reset}`);
1608
- }
1609
1652
  console.log();
1610
1653
  setupRl.close();
1611
1654
  }
@@ -1637,12 +1680,12 @@ async function interactive() {
1637
1680
  }
1638
1681
  }
1639
1682
  if (!currentModel) {
1640
- if (currentModelId.startsWith("ollama/")) {
1641
- // Ollama model selected this interactive REPL mode needs a cloud API.
1642
- // Redirect to swarm mode which works with OpenCode + Ollama.
1643
- console.log(`\n ${c.green}✓${c.reset} Ollama model selected: ${c.bold}${currentModelId}${c.reset}`);
1683
+ if (currentModelId.startsWith("ollama/") || currentModelId.startsWith("openrouter/")) {
1684
+ // Non-pi-ai model — redirect to swarm mode which uses OpenCode natively.
1685
+ const backend = currentModelId.startsWith("ollama/") ? "Ollama" : "OpenRouter";
1686
+ console.log(`\n ${c.green}✓${c.reset} ${backend} model selected: ${c.bold}${currentModelId}${c.reset}`);
1644
1687
  console.log(`\n ${c.dim}This interactive REPL uses direct LLM API calls.${c.reset}`);
1645
- console.log(` ${c.dim}To use Ollama models with OpenCode, run:${c.reset}\n`);
1688
+ console.log(` ${c.dim}To use ${backend} with OpenCode, run:${c.reset}\n`);
1646
1689
  console.log(` ${c.bold}swarm --dir ./your-project "your task"${c.reset}\n`);
1647
1690
  process.exit(0);
1648
1691
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swarm-code",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Open-source swarm-native coding agent orchestrator — spawns parallel coding agents in isolated git worktrees, built on RLM (arXiv:2512.24601)",
5
5
  "type": "module",
6
6
  "bin": {