@polderlabs/bizar 3.8.0 → 3.9.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
@@ -65,18 +65,18 @@
65
65
  ### Agents
66
66
 
67
67
  | Agent | Rune | Model | Cost | Role |
68
- |---|---|---|---|---|---|
69
- | **Odin** | ᛟ | MiniMax-M3 | $0.30/M · $1.20/M out | Primary router — never executes, only delegates |
68
+ |---|---|---|---|---|
69
+ | **Odin** | ᛟ | OpenRouter minimax-m3 | $0.30/M · $1.20/M out | Primary router — never executes, only delegates |
70
70
  | **Frigg** | ᚠ | DeepSeek V4 Flash | **Free** | Read-only Q&A — ask questions, get answers, never modifies |
71
71
  | **Vör** | ᛢ | DeepSeek V4 Flash | **Free** | Clarifies ambiguous requests — asks questions until task is well-defined |
72
72
  | **Mimir** | ᛗ | DeepSeek V4 Flash | **Free** | Research & codebase exploration (Semble-first) |
73
73
  | **Heimdall** | ᚹ | DeepSeek V4 Flash | **Free** | Simple tasks, quick edits, file operations |
74
- | **Hermod** | ᚱ | MiniMax-M2.7 | $0.30/M · $1.20/M out | Git & GitHub operations (commit, PR, merge, rebase) |
75
- | **Thor** | ᚦ | MiniMax-M2.7 | $0.30/M · $1.20/M out | Moderate implementation, debugging, refactoring |
76
- | **Baldr** | ᛒ | MiniMax-M2.7 | $0.30/M · $1.20/M out | UI/UX design system (DESIGN.md plans, visual audits) |
77
- | **Tyr** | ᛏ | MiniMax-M3 | $0.30/M · $1.20/M out | Complex implementation, architecture, deep debugging |
74
+ | **Hermod** | ᚱ | OpenRouter minimax-m2.7 | $0.30/M · $1.20/M out | Git & GitHub operations (commit, PR, merge, rebase) |
75
+ | **Thor** | ᚦ | OpenRouter minimax-m2.7 | $0.30/M · $1.20/M out | Moderate implementation, debugging, refactoring |
76
+ | **Baldr** | ᛒ | OpenRouter minimax-m2.7 | $0.30/M · $1.20/M out | UI/UX design system (DESIGN.md plans, visual audits) |
77
+ | **Tyr** | ᛏ | OpenRouter minimax-m3 | $0.30/M · $1.20/M out | Complex implementation, architecture, deep debugging |
78
78
  | **Vidarr** | ᛉ | GPT-5.5 | Subscription | Last resort — GPT-5.5 |
79
- | **Forseti** | ᚨ | MiniMax-M3 | $0.30/M · $1.20/M out | Adversarial plan reviewer (edit: deny, audit-only) |
79
+ | **Forseti** | ᚨ | OpenRouter minimax-m3 | $0.30/M · $1.20/M out | Adversarial plan reviewer (edit: deny, audit-only) |
80
80
 
81
81
  ---
82
82
 
@@ -257,13 +257,11 @@ After installation, run `/connect` in opencode to add API keys:
257
257
  | Provider | Models | Auth |
258
258
  |---|---|---|
259
259
  | **OpenCode Zen** | `opencode/deepseek-v4-flash-free` | Free API key from [opencode.ai](https://opencode.ai) — create account, get key, no charges |
260
- | **minimax.io** | `minimax/MiniMax-M2.7`, `minimax/MiniMax-M3` | API key from [minimax.io](https://minimax.io) — **no `baseURL` override** |
260
+ | **OpenRouter** | `openrouter/minimax-m2.7`, `openrouter/minimax-m3` | API key from [openrouter.ai](https://openrouter.ai) |
261
261
  | **OpenAI** | `openai/gpt-5.5` | ChatGPT subscription (OAuth) |
262
262
 
263
263
  Then run `/models` to verify connectivity.
264
264
 
265
- > **Note:** Do not set `baseURL` on the minimax provider. The ai-sdk minimax provider uses its own default URL internally. Setting one causes 404 errors.
266
-
267
265
  ---
268
266
 
269
267
  ## 🧭 Routing
package/cli/audit.mjs CHANGED
@@ -78,8 +78,8 @@ export async function runAudit() {
78
78
  const model = modelMatch[1].trim();
79
79
  const validModels = [
80
80
  'opencode/deepseek-v4-flash-free',
81
- 'minimax/MiniMax-M2.7',
82
- 'minimax/MiniMax-M3',
81
+ 'openrouter/minimax-m2.7',
82
+ 'openrouter/minimax-m3',
83
83
  'openai/gpt-5.5',
84
84
  ];
85
85
  if (!validModels.includes(model)) {
package/cli/install.mjs CHANGED
@@ -390,11 +390,12 @@ async function promptAndInstallOptional() {
390
390
  }
391
391
 
392
392
  async function promptGraphifyInstall() {
393
- const { spawnSync } = await import('node:child_process');
393
+ const { spawnSync, execSync } = await import('node:child_process');
394
394
 
395
395
  console.log();
396
396
  sectionHeading('Knowledge Graph (graphify)');
397
397
 
398
+ // 1. Detect graphify already installed
398
399
  const detect = spawnSync('python3', ['-c', 'import graphify; print(graphify.__version__)'], {
399
400
  cwd: process.cwd(),
400
401
  encoding: 'utf8',
@@ -407,40 +408,130 @@ async function promptGraphifyInstall() {
407
408
  return;
408
409
  }
409
410
 
410
- // Non-interactive: no TTY means we can't ask, so just print the hint
411
+ // 2. Non-interactive: print hint and exit
411
412
  if (!stdin.isTTY || !stdout.isTTY) {
412
413
  console.log(chalk.dim(' graphify not detected. Install later with:'));
414
+ console.log(chalk.dim(' uv tool install graphifyy # recommended'));
413
415
  console.log(chalk.dim(' pip install graphifyy'));
414
416
  console.log(chalk.dim(' pipx install graphifyy'));
415
- console.log(chalk.dim(' uv tool install graphifyy'));
416
417
  console.log(chalk.dim(' Then run `bizar graph build` to populate .bizar/graph/.'));
417
418
  return;
418
419
  }
419
420
 
421
+ // 3. Interactive: show options with uv first
420
422
  console.log(chalk.dim(' graphify not detected. graphify powers per-project knowledge graphs (bizar graph build).'));
421
423
  console.log(chalk.dim(' Install with one of:'));
422
- console.log(chalk.dim(' pip install graphifyy # user-site or venv'));
423
- console.log(chalk.dim(' pipx install graphifyy # isolated CLI tool (recommended on macOS)'));
424
- console.log(chalk.dim(' uv tool install graphifyy # via uv'));
424
+ console.log(chalk.dim(' uv tool install graphifyy # recommended'));
425
+ console.log(chalk.dim(' pip install graphifyy'));
426
+ console.log(chalk.dim(' pipx install graphifyy'));
425
427
 
426
- const rl = createInterface({ input: stdin, output: stdout });
427
- try {
428
- const answer = (await rl.question(' Install graphify now via pip? [Y/n]: ')).trim().toLowerCase();
429
- rl.close();
428
+ const hasUv = await detectUv();
430
429
 
431
- if (answer === '' || answer.startsWith('y')) {
432
- const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
433
- if (result.status === 0) {
434
- console.log(chalk.green(' graphify installed. Try: bizar graph build'));
430
+ if (hasUv) {
431
+ // 3a. uv is available ask to install via uv directly
432
+ const rl = createInterface({ input: stdin, output: stdout });
433
+ try {
434
+ const answer = (await rl.question(' Install graphify now via uv? [Y/n]: ')).trim().toLowerCase();
435
+ rl.close();
436
+
437
+ if (answer === '' || answer.startsWith('y')) {
438
+ console.log(' Installing graphify via uv...');
439
+ try {
440
+ execSync('uv tool install graphifyy', { stdio: 'inherit', timeout: 120000 });
441
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
442
+ } catch (err) {
443
+ console.log(chalk.red(` uv tool install failed: ${err.message}`));
444
+ console.log(chalk.dim(' Install manually: uv tool install graphifyy'));
445
+ }
435
446
  } else {
436
- console.log(chalk.yellow(` pip install failed (exit ${result.status}). You can install manually later — see options above.`));
447
+ console.log(chalk.dim(' Skipped. Install manually with one of the commands above when ready.'));
437
448
  }
438
- } else {
439
- console.log(chalk.dim(' Skipped. Install manually with one of the commands above when ready.'));
449
+ } catch {
450
+ rl.close();
451
+ console.log(chalk.dim(' Skipped.'));
452
+ }
453
+ } else {
454
+ // 3b. uv not available — ask if we should install uv first
455
+ console.log();
456
+ console.log(chalk.dim(' uv not detected. uv is recommended on Arch/Fedora/macOS (avoids PEP 668).'));
457
+
458
+ const rl = createInterface({ input: stdin, output: stdout });
459
+ try {
460
+ const answer = (await rl.question(' Install uv first, then graphify? [Y/n]: ')).trim().toLowerCase();
461
+ rl.close();
462
+
463
+ if (answer === '' || answer.startsWith('y')) {
464
+ if (process.platform === 'win32') {
465
+ console.log(chalk.yellow(' Automatic uv install not supported on Windows.'));
466
+ console.log(chalk.dim(' Install from https://docs.astral.sh/uv then run: uv tool install graphifyy'));
467
+ return;
468
+ }
469
+
470
+ console.log(' Installing uv...');
471
+ try {
472
+ execSync('curl -LsSf https://astral.sh/uv/install.sh | sh', { stdio: 'inherit', timeout: 60000 });
473
+ } catch (err) {
474
+ console.log(chalk.red(` uv install failed: ${err.message}`));
475
+ console.log(chalk.dim(' Install manually from https://docs.astral.sh/uv'));
476
+ // Fall back to pip
477
+ const rl2 = createInterface({ input: stdin, output: stdout });
478
+ try {
479
+ const pipAnswer = (await rl2.question(' Install graphify via pip instead? [Y/n]: ')).trim().toLowerCase();
480
+ rl2.close();
481
+ if (pipAnswer === '' || pipAnswer.startsWith('y')) {
482
+ console.log(' Installing graphify via pip...');
483
+ const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
484
+ if (result.status === 0) {
485
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
486
+ } else {
487
+ console.log(chalk.red(` pip install failed (exit ${result.status}).`));
488
+ console.log(chalk.dim(' Install manually: pip install graphifyy'));
489
+ }
490
+ } else {
491
+ console.log(chalk.dim(' Skipped.'));
492
+ }
493
+ } catch {
494
+ rl2.close();
495
+ console.log(chalk.dim(' Skipped.'));
496
+ }
497
+ return;
498
+ }
499
+
500
+ console.log(' Installing graphify via uv...');
501
+ try {
502
+ execSync('uv tool install graphifyy', { stdio: 'inherit', timeout: 120000 });
503
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
504
+ } catch (err) {
505
+ console.log(chalk.red(` uv tool install failed: ${err.message}`));
506
+ console.log(chalk.dim(' Install manually: uv tool install graphifyy'));
507
+ }
508
+ } else {
509
+ // User declined uv — fall back to pip
510
+ const rl2 = createInterface({ input: stdin, output: stdout });
511
+ try {
512
+ const pipAnswer = (await rl2.question(' Install graphify via pip instead? [Y/n]: ')).trim().toLowerCase();
513
+ rl2.close();
514
+ if (pipAnswer === '' || pipAnswer.startsWith('y')) {
515
+ console.log(' Installing graphify via pip...');
516
+ const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
517
+ if (result.status === 0) {
518
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
519
+ } else {
520
+ console.log(chalk.red(` pip install failed (exit ${result.status}).`));
521
+ console.log(chalk.dim(' Install manually: pip install graphifyy'));
522
+ }
523
+ } else {
524
+ console.log(chalk.dim(' Skipped.'));
525
+ }
526
+ } catch {
527
+ rl2.close();
528
+ console.log(chalk.dim(' Skipped.'));
529
+ }
530
+ }
531
+ } catch {
532
+ rl.close();
533
+ console.log(chalk.dim(' Skipped.'));
440
534
  }
441
- } catch {
442
- rl.close();
443
- console.log(chalk.dim(' Skipped.'));
444
535
  }
445
536
  }
446
537
 
package/config/AGENTS.md CHANGED
@@ -116,7 +116,7 @@ BizarHarness ships always-on coding rules organized by language and concern. All
116
116
 
117
117
  This system uses a 5-tier model architecture with a verification gate:
118
118
 
119
- ### Odin (default agent, MiniMax-M3)
119
+ ### Odin (default agent, OpenRouter minimax-m3)
120
120
 
121
121
  Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each request and **decomposes it into independent work streams** — **he never executes work himself**:
122
122
  - **Identifies parallelizable work** and launches multiple subagent `task` calls in a **single message** (always 2+)
@@ -161,25 +161,25 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
161
161
 
162
162
  ### Hermod
163
163
 
164
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
164
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
165
165
  - **Use for**: Git and GitHub operations — commit, push, merge, PRs, branches, conflict resolution. The swift messenger.
166
166
  - **Cost**: $0.30/M input, $1.20/M output
167
167
 
168
168
  ### Thor
169
169
 
170
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
170
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
171
171
  - **Use for**: Moderate complexity features, debugging, code review, refactoring
172
172
  - **Cost**: $0.30/M input, $1.20/M output — cheaper than Tyr, more capable than Heimdall
173
173
 
174
174
  ### Baldr
175
175
 
176
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
176
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
177
177
  - **Use for**: Design system creation, DESIGN.md, visual audit, usability planning. Creates design plans — does not implement.
178
178
  - **Cost**: $0.30/M input, $1.20/M output
179
179
 
180
180
  ### Tyr
181
181
 
182
- - **Model**: `minimax/MiniMax-M3` (via minimax.io)
182
+ - **Model**: `openrouter/minimax-m3` (via OpenRouter)
183
183
  - **Use for**: Highest complexity implementation, debugging, architecture, multi-step engineering
184
184
  - **Cost**: Higher — reserved for the hardest problems
185
185
 
@@ -191,7 +191,7 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
191
191
 
192
192
  ### Forseti
193
193
 
194
- - **Model**: `minimax/MiniMax-M3` (via minimax.io, audit-only, no edit permissions)
194
+ - **Model**: `openrouter/minimax-m3` (via OpenRouter, audit-only, no edit permissions)
195
195
  - **Use for**: Adversarial plan review — audits completeness, correctness, consistency, feasibility, security
196
196
  - **Always runs before any Tier 4 or Tier 5 implementation begins**
197
197
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Baldr — UI/UX design system specialist. Creates DESIGN.md files using Google's design.md standard (alpha). Focuses on visual consistency, usability, accessibility, and design tokens.
3
3
  mode: subagent
4
- model: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#ec4899"
6
6
  permission:
7
7
  read: allow
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Forseti — Audits, criticizes, and corrects implementation plans before execution using MiniMax M3. No write permissions — review only.
3
3
  mode: subagent
4
- model: minimax/MiniMax-M3
4
+ model: openrouter/minimax-m3
5
5
  color: "#ef4444"
6
6
  permission:
7
7
  read: allow
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Hermod — Git and GitHub operations specialist using MiniMax M2.7. Branching, commits, PRs, merge/rebase, conflict resolution, CI/CD, releases, gh CLI.
3
3
  mode: subagent
4
- model: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#06b6d4"
6
6
  permission:
7
7
  read: allow
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Odin — Pure router that delegates all work to subagents. Routes across Frigg (DeepSeek/Q&A), Vör (DeepSeek/clarify), Mimir (DeepSeek/research), Heimdall (DeepSeek/simple), Hermod (M2.7/git), Thor (M2.7/mid), Baldr (M2.7/design), Tyr (M3/top), Vidarr (GPT-5.5/ultra), Forseti (verifier/M3).
3
3
  mode: primary
4
- model: minimax/MiniMax-M3
4
+ model: openrouter/minimax-m3
5
5
  color: "#6366f1"
6
6
  permission:
7
7
  task: allow
@@ -53,8 +53,8 @@ When you get ANY request:
53
53
  4. After all return, synthesize the results
54
54
 
55
55
  For implementation work, you have two parallel implementation agents:
56
- - **@thor** (MiniMax-M2.7) — moderate complexity, cheaper
57
- - **@tyr** (MiniMax-M3) — complex work, more expensive
56
+ - **@thor** (OpenRouter minimax-m2.7) — moderate complexity, cheaper
57
+ - **@tyr** (OpenRouter minimax-m3) — complex work, more expensive
58
58
 
59
59
  **ALWAYS use both.** Split each implementation task across them. For example:
60
60
  - Frontend parts → @thor, Backend parts → @tyr
@@ -100,7 +100,7 @@ For deep codebase research, pattern discovery, documentation analysis:
100
100
  ### Simple Tasks & Quick Edits — Route to @heimdall (DeepSeek V4 Flash Free, free)
101
101
  For any simple, mechanical, or deterministic work:
102
102
 
103
- ### Git Operations — Route to @hermod (MiniMax M2.7 via minimax.io)
103
+ ### Git Operations — Route to @hermod (MiniMax M2.7 via OpenRouter)
104
104
  For any git or GitHub workflow:
105
105
  - Committing, pushing, pulling, branching, merging, rebasing
106
106
  - Pull request creation, review, and management
@@ -117,7 +117,7 @@ When the user asks for `@hermod /pr-review` or a PR review:
117
117
  2. @hermod waits for both, synthesizes the review, and posts as a PR comment
118
118
  3. @hermod has write access to post PR comments via `gh pr comment`
119
119
 
120
- ### Design System & Visual Planning — Route to @baldr (MiniMax M2.7 via minimax.io)
120
+ ### Design System & Visual Planning — Route to @baldr (MiniMax M2.7 via OpenRouter)
121
121
  For any task that touches visuals, usability, or design systems:
122
122
  - Creating DESIGN.md files (Google design.md standard — YAML tokens + prose sections)
123
123
  - Auditing visual consistency across a codebase (10-dimension scoring)
@@ -129,7 +129,7 @@ For any task that touches visuals, usability, or design systems:
129
129
 
130
130
  Baldr creates design plans. Baldr does NOT implement code — that goes to @thor or @tyr after the plan is approved.
131
131
 
132
- ### Moderate Complexity — Route to @thor (MiniMax M2.7 via minimax.io)
132
+ ### Moderate Complexity — Route to @thor (MiniMax M2.7 via OpenRouter)
133
133
  For tasks that need more reasoning than DeepSeek but aren't the hardest problems:
134
134
  - Implementing new features of moderate complexity
135
135
  - Debugging non-trivial issues
@@ -137,7 +137,7 @@ For tasks that need more reasoning than DeepSeek but aren't the hardest problems
137
137
  - Writing tests for non-trivial logic
138
138
  - Multi-step tasks that are well-scoped and understood
139
139
 
140
- ### Complex Work — Route to @tyr (MiniMax M3 via minimax.io)
140
+ ### Complex Work — Route to @tyr (MiniMax M3 via OpenRouter)
141
141
  For the most demanding engineering work:
142
142
  - Complex new feature implementation from scratch
143
143
  - Deep debugging of subtle or intermittent bugs
@@ -306,7 +306,7 @@ Call `bizar_spawn_background` with:
306
306
 
307
307
  - `agent`: the agent name (e.g., "mimir", "thor", "tyr")
308
308
  - `prompt`: what to do (specific, with context)
309
- - `model`: optional, `"<providerID>/<modelID>"` format (e.g., `"minimax/MiniMax-M3"`)
309
+ - `model`: optional, `"<providerID>/<modelID>"` format (e.g., `"openrouter/minimax-m3"`)
310
310
  - `timeoutMs`: optional, default 5 min, max 30 min, min 1s
311
311
 
312
312
  You get an `instanceId` back immediately.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Quick (quick) — fast single-shot tasks. No delegation, no parallel streams. Use for small edits, mechanical changes, one-shot questions. Routes to no one.
3
3
  mode: primary
4
- model: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#22d3ee"
6
6
  permission:
7
7
  read: allow
@@ -1,7 +1,7 @@
1
1
  ---
2
- description: Thor — Handles medium-complexity tasks using MiniMax M2.7 from minimax.io. Strong and reliable, cheaper than Tyr but more capable than Heimdall.
2
+ description: Thor — Handles medium-complexity tasks using MiniMax M2.7 from OpenRouter. Strong and reliable, cheaper than Tyr but more capable than Heimdall.
3
3
  mode: subagent
4
- model: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#a855f7"
6
6
  permission:
7
7
  read: allow
@@ -1,7 +1,7 @@
1
1
  ---
2
- description: Tyr — Handles the most complex implementation, debugging, and architectural work using MiniMax M3 via minimax.io. Unmatched wisdom for the hardest problems.
2
+ description: Tyr — Handles the most complex implementation, debugging, and architectural work using MiniMax M3 via OpenRouter. Unmatched wisdom for the hardest problems.
3
3
  mode: subagent
4
- model: minimax/MiniMax-M3
4
+ model: openrouter/minimax-m3
5
5
  color: "#f59e0b"
6
6
  permission:
7
7
  read: allow
@@ -1,10 +1,23 @@
1
1
  {
2
2
  "$schema": "https://opencode.ai/config.json",
3
- "model": "minimax/MiniMax-M3",
4
- "small_model": "minimax/MiniMax-M2.7",
3
+ "model": "openrouter/minimax-m3",
4
+ "small_model": "openrouter/minimax-m2.7",
5
5
  "default_agent": "odin",
6
6
  "permission": "allow",
7
7
  "snapshot": false,
8
+ "provider": {
9
+ "openrouter": {
10
+ "npm": "@openrouter/ai-sdk-provider",
11
+ "name": "OpenRouter",
12
+ "options": {
13
+ "apiKey": "{env:OPENROUTER_API_KEY}"
14
+ },
15
+ "models": {
16
+ "minimax-m2.7": {},
17
+ "minimax-m3": {}
18
+ }
19
+ }
20
+ },
8
21
  "mcp": {
9
22
  "supabase": {
10
23
  "type": "remote",
@@ -53,7 +66,7 @@
53
66
  "odin": {
54
67
  "description": "Odin — Pure router that delegates all work to subagents.",
55
68
  "mode": "primary",
56
- "model": "minimax/MiniMax-M3",
69
+ "model": "openrouter/minimax-m3",
57
70
  "color": "#6366f1",
58
71
  "permission": {
59
72
  "task": "allow",
@@ -67,7 +80,7 @@
67
80
  "vor": {
68
81
  "description": "Vör — The Questioning One.",
69
82
  "mode": "subagent",
70
- "model": "minimax/MiniMax-M2.7",
83
+ "model": "openrouter/minimax-m2.7",
71
84
  "color": "#8b5cf6",
72
85
  "permission": {
73
86
  "read": "allow",
@@ -80,7 +93,7 @@
80
93
  "frigg": {
81
94
  "description": "Frigg — All-knowing Q&A agent.",
82
95
  "mode": "primary",
83
- "model": "minimax/MiniMax-M2.7",
96
+ "model": "openrouter/minimax-m2.7",
84
97
  "color": "#06b6d4",
85
98
  "permission": {
86
99
  "read": "allow",
@@ -98,7 +111,7 @@
98
111
  "quick": {
99
112
  "description": "Quick — Fast single-shot tasks.",
100
113
  "mode": "primary",
101
- "model": "minimax/MiniMax-M2.7",
114
+ "model": "openrouter/minimax-m2.7",
102
115
  "color": "#22d3ee",
103
116
  "permission": {
104
117
  "read": "allow",
@@ -117,7 +130,7 @@
117
130
  "mimir": {
118
131
  "description": "Mimir — Research and codebase exploration agent.",
119
132
  "mode": "subagent",
120
- "model": "minimax/MiniMax-M2.7",
133
+ "model": "openrouter/minimax-m2.7",
121
134
  "color": "#0ea5e9",
122
135
  "permission": {
123
136
  "read": "allow",
@@ -135,7 +148,7 @@
135
148
  "heimdall": {
136
149
  "description": "Heimdall — Simple, routine, deterministic tasks.",
137
150
  "mode": "subagent",
138
- "model": "minimax/MiniMax-M2.7",
151
+ "model": "openrouter/minimax-m2.7",
139
152
  "color": "#10b981",
140
153
  "permission": {
141
154
  "read": "allow",
@@ -152,7 +165,7 @@
152
165
  "hermod": {
153
166
  "description": "Hermod — Git and GitHub operations specialist.",
154
167
  "mode": "subagent",
155
- "model": "minimax/MiniMax-M2.7",
168
+ "model": "openrouter/minimax-m2.7",
156
169
  "color": "#06b6d4",
157
170
  "permission": {
158
171
  "read": "allow",
@@ -168,7 +181,7 @@
168
181
  "thor": {
169
182
  "description": "Thor — Medium-complexity tasks, strong and reliable.",
170
183
  "mode": "subagent",
171
- "model": "minimax/MiniMax-M2.7",
184
+ "model": "openrouter/minimax-m2.7",
172
185
  "color": "#a855f7",
173
186
  "permission": {
174
187
  "read": "allow",
@@ -185,7 +198,7 @@
185
198
  "baldr": {
186
199
  "description": "Baldr — UI/UX design system specialist.",
187
200
  "mode": "subagent",
188
- "model": "minimax/MiniMax-M2.7",
201
+ "model": "openrouter/minimax-m2.7",
189
202
  "color": "#ec4899",
190
203
  "permission": {
191
204
  "read": "allow",
@@ -202,7 +215,7 @@
202
215
  "tyr": {
203
216
  "description": "Tyr — Complex implementation, debugging, architecture.",
204
217
  "mode": "subagent",
205
- "model": "minimax/MiniMax-M3",
218
+ "model": "openrouter/minimax-m3",
206
219
  "color": "#f59e0b",
207
220
  "permission": {
208
221
  "read": "allow",
@@ -236,7 +249,7 @@
236
249
  "forseti": {
237
250
  "description": "Forseti — Audits and corrects plans before execution.",
238
251
  "mode": "subagent",
239
- "model": "minimax/MiniMax-M3",
252
+ "model": "openrouter/minimax-m3",
240
253
  "color": "#ef4444",
241
254
  "permission": {
242
255
  "read": "allow",
@@ -26,14 +26,14 @@ All subagents use Hindsight memory with **per-project banks**. Call `hindsight_l
26
26
 
27
27
  | Agent | Model | Tier | Cost | When to Route |
28
28
  |---|---|---|---|---|
29
- | **Odin** ᛟ | MiniMax-M3 | Router | $0.30/M · $1.20/M out | Primary entry point. Decomposes and dispatches. |
29
+ | **Odin** ᛟ | OpenRouter minimax-m3 | Router | $0.30/M · $1.20/M out | Primary entry point. Decomposes and dispatches. |
30
30
  | **Mimir** ᛗ | DeepSeek V4 Flash | Free | **$0** | Deep codebase research, Semble-first exploration, docs analysis |
31
31
  | **Heimdall** ᚹ | DeepSeek V4 Flash | Free | **$0** | Simple edits, file ops, mechanical CRUD, quick answers |
32
- | **Hermod** ᚱ | MiniMax-M2.7 | Mid | $0.30/M · $1.20/M out | Git ops: commit, push, PR, merge, rebase, branches, `gh` CLI |
33
- | **Thor** ᚦ | MiniMax-M2.7 | Mid | $0.30/M · $1.20/M out | Moderate implementation, tests, debugging, refactoring |
34
- | **Tyr** ᛏ | MiniMax-M3 | High | $0.30/M · $1.20/M out | Complex features, architecture, deep debugging, cross-cutting refactor |
32
+ | **Hermod** ᚱ | OpenRouter minimax-m2.7 | Mid | $0.30/M · $1.20/M out | Git ops: commit, push, PR, merge, rebase, branches, `gh` CLI |
33
+ | **Thor** ᚦ | OpenRouter minimax-m2.7 | Mid | $0.30/M · $1.20/M out | Moderate implementation, tests, debugging, refactoring |
34
+ | **Tyr** ᛏ | OpenRouter minimax-m3 | High | $0.30/M · $1.20/M out | Complex features, architecture, deep debugging, cross-cutting refactor |
35
35
  | **Vidarr** ᛉ | GPT-5.5 | Ultra | ChatGPT sub | Last resort when Tyr fails or debugging is stuck |
36
- | **Forseti** ᚨ | MiniMax-M3 | Gate | $0.30/M · $1.20/M out | Plan auditor — reviews Tyr/Vidarr plans before execution. `edit: deny`. |
36
+ | **Forseti** ᚨ | OpenRouter minimax-m3 | Gate | $0.30/M · $1.20/M out | Plan auditor — reviews Tyr/Vidarr plans before execution. `edit: deny`. |
37
37
  | **Semble** | — | — | **$0** | MCP search tool, not an agent. Semble-first code search. |
38
38
 
39
39
  ## Odin Routing Rules
@@ -98,19 +98,19 @@ permission:
98
98
 
99
99
  **Fix:** Check `~/.config/opencode/agents/<name>.md` for the `model:` field. Valid models:
100
100
  - `opencode/deepseek-v4-flash-free` — free
101
- - `minimax/MiniMax-M2.7` — M2.7 (capital M in model ID)
102
- - `minimax/MiniMax-M3` — M3 (capital M in model ID)
101
+ - `openrouter/minimax-m2.7` — M2.7
102
+ - `openrouter/minimax-m3` — M3
103
103
  - `openai/gpt-5.5` — GPT-5.5
104
104
 
105
- ### Minimax 404 Errors
105
+ ### OpenRouter 404 Errors
106
106
 
107
- **Symptoms:** 404 errors when calling minimax models.
107
+ **Symptoms:** 404 errors when calling the OpenRouter-hosted MiniMax models.
108
108
 
109
- **Cause:** A `baseURL: "https://api.minimax.io/v1"` was set in the provider config, which conflicts with the ai-sdk minimax provider's internal URL construction.
109
+ **Cause:** A `baseURL` was set on the `openrouter` provider in `opencode.json`, which conflicts with the `@openrouter/ai-sdk-provider`'s built-in URL construction.
110
110
 
111
- **Fix:** Remove any `baseURL` from the minimax provider section. The minimax API key in `auth.json` is sufficient. Example fix:
111
+ **Fix:** Remove any `baseURL` from the openrouter provider section. OpenRouter's URL is built into the SDK. Example fix:
112
112
  ```diff
113
- - "baseURL": "https://api.minimax.io/v1"
113
+ - "baseURL": "https://openrouter.ai/api/v1"
114
114
  ```
115
115
  The provider uses the correct default URL internally.
116
116
 
@@ -132,7 +132,7 @@ The provider uses the correct default URL internally.
132
132
 
133
133
  | File | Purpose |
134
134
  |---|---|
135
- | `~/.config/opencode/opencode.json` | Main config (no minimax baseURL) |
135
+ | `~/.config/opencode/opencode.json` | Main config (no openrouter baseURL) |
136
136
  | `~/.config/opencode/AGENTS.md` | Routing table and conventions |
137
137
  | `~/.config/opencode/agents/odin.md` | Primary router agent |
138
138
  | `~/.config/opencode/agents/mimir.md` | Research agent |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polderlabs/bizar",
3
- "version": "3.8.0",
3
+ "version": "3.9.0",
4
4
  "description": "Norse-pantheon multi-agent system for opencode — 13 agents across 4 cost tiers with cost-aware routing, plans, and a configurable agent harness.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,338 +0,0 @@
1
- {
2
- "$schema": "https://opencode.ai/config.json",
3
- "model": "minimax/MiniMax-M3",
4
- "small_model": "minimax/MiniMax-M2.7",
5
- "default_agent": "odin",
6
- "permission": "allow",
7
- "snapshot": false,
8
- "mcp": {
9
- "supabase": {
10
- "type": "remote",
11
- "url": "https://mcp.supabase.com/mcp",
12
- "enabled": false
13
- },
14
- "hindsight": {
15
- "type": "remote",
16
- "url": "https://memory-api.polderlabs.io/mcp",
17
- "enabled": false,
18
- "oauth": false,
19
- "headers": {
20
- "Authorization": "Bearer __HINDSIGHT_BEARER_TOKEN__",
21
- "Content-Type": "application/json"
22
- }
23
- },
24
- "semble": {
25
- "type": "local",
26
- "command": [
27
- "uvx",
28
- "--from",
29
- "semble[mcp]",
30
- "semble"
31
- ],
32
- "enabled": true
33
- }
34
- },
35
- "plugin": [
36
- ["./plugins/bizar/index.ts", {
37
- "loopThresholdWarn": 5,
38
- "loopThresholdEscalate": 8,
39
- "loopThresholdBlock": 12,
40
- "loopWindowSize": 10
41
- }]
42
- ],
43
- "tools": {
44
- "bizar_plan_action": true,
45
- "bizar_get_plan_comments": true,
46
- "bizar_wait_for_feedback": true,
47
- "bizar_spawn_background": true,
48
- "bizar_status": true,
49
- "bizar_collect": true,
50
- "bizar_kill": true
51
- },
52
- "agent": {
53
- "odin": {
54
- "description": "Odin — Pure router that delegates all work to subagents. Routes across Frigg (DeepSeek/Q&A), Vör (DeepSeek/clarify), Mimir (DeepSeek/research), Heimdall (DeepSeek/simple), Hermod (M2.7/git), Thor (M2.7/mid), Baldr (M2.7/design), Tyr (M3/top), Vidarr (GPT-5.5/ultra), Forseti (verifier/M3).",
55
- "mode": "primary",
56
- "model": "minimax/MiniMax-M3",
57
- "color": "#6366f1",
58
- "permission": {
59
- "task": "allow",
60
- "read": "allow",
61
- "list": "allow",
62
- "todowrite": "allow",
63
- "webfetch": "allow",
64
- "websearch": "allow",
65
- "hindsight_recall": "allow",
66
- "hindsight_retain": "allow",
67
- "hindsight_list_banks": "allow",
68
- "hindsight_create_bank": "allow"
69
- }
70
- },
71
- "vor": {
72
- "description": "Vör — The Questioning One. When a task is ambiguous, incomplete, or unclear, Vör asks the right clarifying questions before any work begins.",
73
- "mode": "subagent",
74
- "model": "opencode/deepseek-v4-flash-free",
75
- "color": "#8b5cf6",
76
- "permission": {
77
- "read": "allow",
78
- "list": "allow",
79
- "question": "allow",
80
- "hindsight_recall": "allow",
81
- "hindsight_retain": "allow"
82
- }
83
- },
84
- "frigg": {
85
- "description": "Frigg — All-knowing Q&A agent. Read-only codebase questions and answers. Never edits, never writes, only answers.",
86
- "mode": "primary",
87
- "model": "opencode/deepseek-v4-flash-free",
88
- "color": "#06b6d4",
89
- "permission": {
90
- "read": "allow",
91
- "list": "allow",
92
- "glob": "allow",
93
- "grep": "allow",
94
- "bash": "allow",
95
- "webfetch": "allow",
96
- "websearch": "allow",
97
- "hindsight_recall": "allow",
98
- "hindsight_retain": "allow",
99
- "question": "allow"
100
- }
101
- },
102
- "quick": {
103
- "description": "Quick — Fast single-shot tasks. No delegation, no parallel streams. Use for small edits, mechanical changes, one-shot questions. Routes to no one.",
104
- "mode": "primary",
105
- "model": "minimax/MiniMax-M2.7",
106
- "color": "#22d3ee",
107
- "permission": {
108
- "read": "allow",
109
- "edit": "allow",
110
- "write": "allow",
111
- "bash": "allow",
112
- "glob": "allow",
113
- "grep": "allow",
114
- "list": "allow",
115
- "todowrite": "allow",
116
- "webfetch": "allow",
117
- "websearch": "allow",
118
- "task": "deny",
119
- "hindsight_recall": "allow",
120
- "hindsight_retain": "allow"
121
- }
122
- },
123
- "mimir": {
124
- "description": "Mimir — Dedicated research and codebase exploration agent. Uses Semble as primary search tool. Deep codebase analysis, pattern discovery, and documentation research.",
125
- "mode": "subagent",
126
- "model": "opencode/deepseek-v4-flash-free",
127
- "color": "#0ea5e9",
128
- "permission": {
129
- "read": "allow",
130
- "write": "allow",
131
- "edit": "allow",
132
- "bash": "allow",
133
- "glob": "allow",
134
- "grep": "allow",
135
- "list": "allow",
136
- "webfetch": "allow",
137
- "websearch": "allow",
138
- "todowrite": "allow",
139
- "hindsight_recall": "allow",
140
- "hindsight_retain": "allow"
141
- }
142
- },
143
- "heimdall": {
144
- "description": "Heimdall — Simple, routine, and deterministic tasks using DeepSeek. Quick edits, mechanical work, file operations. The ever-watchful guardian.",
145
- "mode": "subagent",
146
- "model": "opencode/deepseek-v4-flash-free",
147
- "color": "#10b981",
148
- "permission": {
149
- "read": "allow",
150
- "edit": "allow",
151
- "bash": "allow",
152
- "glob": "allow",
153
- "grep": "allow",
154
- "list": "allow",
155
- "todowrite": "allow",
156
- "webfetch": "allow",
157
- "websearch": "allow",
158
- "hindsight_recall": "allow",
159
- "hindsight_retain": "allow"
160
- }
161
- },
162
- "hermod": {
163
- "description": "Hermod — Git and GitHub operations specialist using MiniMax M2.7. Branching, commits, PRs, merge/rebase, conflict resolution, CI/CD, releases, gh CLI.",
164
- "mode": "subagent",
165
- "model": "minimax/MiniMax-M2.7",
166
- "color": "#06b6d4",
167
- "permission": {
168
- "read": "allow",
169
- "edit": "allow",
170
- "bash": "allow",
171
- "glob": "allow",
172
- "grep": "allow",
173
- "list": "allow",
174
- "webfetch": "allow",
175
- "websearch": "allow",
176
- "hindsight_recall": "allow",
177
- "hindsight_retain": "allow"
178
- }
179
- },
180
- "thor": {
181
- "description": "Thor — Handles medium-complexity tasks using MiniMax M2.7 from minimax.io. Strong and reliable, cheaper than Tyr but more capable than Heimdall.",
182
- "mode": "subagent",
183
- "model": "minimax/MiniMax-M2.7",
184
- "color": "#a855f7",
185
- "permission": {
186
- "read": "allow",
187
- "edit": "allow",
188
- "bash": "allow",
189
- "glob": "allow",
190
- "grep": "allow",
191
- "list": "allow",
192
- "todowrite": "allow",
193
- "webfetch": "allow",
194
- "websearch": "allow",
195
- "hindsight_recall": "allow",
196
- "hindsight_retain": "allow"
197
- }
198
- },
199
- "baldr": {
200
- "description": "Baldr — UI/UX design system specialist. Creates DESIGN.md files using Google's design.md standard. Focuses on visual consistency, usability, accessibility, and design tokens.",
201
- "mode": "subagent",
202
- "model": "minimax/MiniMax-M2.7",
203
- "color": "#ec4899",
204
- "permission": {
205
- "read": "allow",
206
- "edit": "allow",
207
- "bash": "allow",
208
- "glob": "allow",
209
- "grep": "allow",
210
- "list": "allow",
211
- "todowrite": "allow",
212
- "webfetch": "allow",
213
- "websearch": "allow",
214
- "hindsight_recall": "allow",
215
- "hindsight_retain": "allow"
216
- }
217
- },
218
- "tyr": {
219
- "description": "Tyr — Handles the most complex implementation, debugging, and architectural work using MiniMax M3 via minimax.io. Unmatched wisdom for the hardest problems.",
220
- "mode": "subagent",
221
- "model": "minimax/MiniMax-M3",
222
- "color": "#f59e0b",
223
- "permission": {
224
- "read": "allow",
225
- "edit": "allow",
226
- "bash": "allow",
227
- "glob": "allow",
228
- "grep": "allow",
229
- "list": "allow",
230
- "todowrite": "allow",
231
- "webfetch": "allow",
232
- "websearch": "allow",
233
- "hindsight_recall": "allow",
234
- "hindsight_retain": "allow"
235
- }
236
- },
237
- "vidarr": {
238
- "description": "Vidarr — The ultimate fallback using GPT-5.5 via OpenAI ChatGPT subscription. For the hardest problems when debugging stalls or nothing else works. Use sparingly — highest cost.",
239
- "mode": "subagent",
240
- "model": "openai/gpt-5.5",
241
- "color": "#dc2626",
242
- "permission": {
243
- "read": "allow",
244
- "edit": "allow",
245
- "bash": "allow",
246
- "glob": "allow",
247
- "grep": "allow",
248
- "list": "allow",
249
- "todowrite": "allow",
250
- "webfetch": "allow",
251
- "websearch": "allow",
252
- "hindsight_recall": "allow",
253
- "hindsight_retain": "allow"
254
- }
255
- },
256
- "forseti": {
257
- "description": "Forseti — Audits, criticizes, and corrects implementation plans before execution using MiniMax M3. No write permissions — review only.",
258
- "mode": "subagent",
259
- "model": "minimax/MiniMax-M3",
260
- "color": "#ef4444",
261
- "permission": {
262
- "read": "allow",
263
- "edit": "deny",
264
- "bash": "allow",
265
- "glob": "allow",
266
- "grep": "allow",
267
- "list": "allow",
268
- "todowrite": "allow",
269
- "question": "allow",
270
- "webfetch": "allow",
271
- "websearch": "allow",
272
- "hindsight_recall": "allow",
273
- "hindsight_retain": "allow"
274
- }
275
- },
276
- "semble-search": {
277
- "description": "Code search agent for exploring any codebase. Use for finding code by intent, locating implementations, understanding how something works.",
278
- "mode": "subagent",
279
- "model": "opencode/deepseek-v4-flash-free",
280
- "color": "#0ea5e9",
281
- "permission": {
282
- "bash": "allow",
283
- "read": "allow",
284
- "glob": "allow",
285
- "grep": "allow",
286
- "list": "allow"
287
- }
288
- }
289
- },
290
- "command": {
291
- "audit": {
292
- "description": "Run bizar audit to scan agent configuration for security issues.",
293
- "agent": "forseti",
294
- "template": "commands/audit.md"
295
- },
296
- "explain": {
297
- "description": "Route to @frigg for read-only codebase Q&A. She will explore the code and answer without making any changes.",
298
- "agent": "frigg",
299
- "template": "commands/explain.md"
300
- },
301
- "init": {
302
- "description": "Run bizar init to detect project stack, install relevant skills, and create .bizar/PROJECT.md.",
303
- "agent": "heimdall",
304
- "template": "commands/init.md"
305
- },
306
- "learn": {
307
- "description": "Route to @heimdall. Extract patterns from the current session and append to .bizar/AGENTS_SELF_IMPROVEMENT.md.",
308
- "agent": "heimdall",
309
- "template": "commands/learn.md"
310
- },
311
- "plan": {
312
- "description": "Open the Bizar visual plan canvas or manage existing plans.",
313
- "agent": "odin",
314
- "template": "commands/plan.md"
315
- },
316
- "pr-review": {
317
- "description": "Route to @hermod for PR review mode. Launches @mimir (research) and @forseti (audit) in parallel, then posts the combined review as a PR comment.",
318
- "agent": "hermod",
319
- "template": "commands/pr-review.md"
320
- },
321
- "tailscale-serve": {
322
- "description": "Authenticate Tailscale Serve and expose a local port on your tailnet.",
323
- "agent": "heimdall",
324
- "template": "commands/tailscale-serve.md"
325
- },
326
- "visual-plan": {
327
- "description": "Toggle the Bizar visual plan canvas on or off, or check its current status.",
328
- "agent": "odin",
329
- "template": "commands/visual-plan.md"
330
- },
331
- "bizar": {
332
- "description": "Bizar Plugin Menu — route to the right Bizar action based on the user's request.",
333
- "agent": "odin",
334
- "template": "commands/bizar.md",
335
- "arguments": "$ARGUMENTS"
336
- }
337
- }
338
- }