@polderlabs/bizar 3.8.0 → 3.9.1

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
@@ -102,6 +102,7 @@ BizarHarness ships always-on coding rules organized by language and concern. All
102
102
  | `rules/python.md` | Python conventions |
103
103
  | `rules/git.md` | Git and commit conventions |
104
104
  | `rules/testing.md` | Test methodology and coverage |
105
+ | `rules/thinking.md` | All agents — concise thinking behavior |
105
106
 
106
107
  ### How to Use
107
108
 
@@ -110,13 +111,17 @@ BizarHarness ships always-on coding rules organized by language and concern. All
110
111
  3. All implementation agents (Heimdall, Thor, Tyr, Vidarr) MUST follow these rules
111
112
  4. Agents MAY propose additions to the rule files when patterns are discovered
112
113
 
114
+ ### Thinking Rule
115
+
116
+ For agents with `reasoning: true` + `variant: "high"`, follow `rules/thinking.md` strictly. Cap reasoning at 2–4 sentences. No informal self-talk, no "what if" loops, no mid-thought self-correction. Think once, decide, act.
117
+
113
118
  ---
114
119
 
115
120
  ## Model Routing & Agents
116
121
 
117
122
  This system uses a 5-tier model architecture with a verification gate:
118
123
 
119
- ### Odin (default agent, MiniMax-M3)
124
+ ### Odin (default agent, OpenRouter minimax-m3)
120
125
 
121
126
  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
127
  - **Identifies parallelizable work** and launches multiple subagent `task` calls in a **single message** (always 2+)
@@ -161,25 +166,25 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
161
166
 
162
167
  ### Hermod
163
168
 
164
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
169
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
165
170
  - **Use for**: Git and GitHub operations — commit, push, merge, PRs, branches, conflict resolution. The swift messenger.
166
171
  - **Cost**: $0.30/M input, $1.20/M output
167
172
 
168
173
  ### Thor
169
174
 
170
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
175
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
171
176
  - **Use for**: Moderate complexity features, debugging, code review, refactoring
172
177
  - **Cost**: $0.30/M input, $1.20/M output — cheaper than Tyr, more capable than Heimdall
173
178
 
174
179
  ### Baldr
175
180
 
176
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
181
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
177
182
  - **Use for**: Design system creation, DESIGN.md, visual audit, usability planning. Creates design plans — does not implement.
178
183
  - **Cost**: $0.30/M input, $1.20/M output
179
184
 
180
185
  ### Tyr
181
186
 
182
- - **Model**: `minimax/MiniMax-M3` (via minimax.io)
187
+ - **Model**: `openrouter/minimax-m3` (via OpenRouter)
183
188
  - **Use for**: Highest complexity implementation, debugging, architecture, multi-step engineering
184
189
  - **Cost**: Higher — reserved for the hardest problems
185
190
 
@@ -191,7 +196,7 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
191
196
 
192
197
  ### Forseti
193
198
 
194
- - **Model**: `minimax/MiniMax-M3` (via minimax.io, audit-only, no edit permissions)
199
+ - **Model**: `openrouter/minimax-m3` (via OpenRouter, audit-only, no edit permissions)
195
200
  - **Use for**: Adversarial plan review — audits completeness, correctness, consistency, feasibility, security
196
201
  - **Always runs before any Tier 4 or Tier 5 implementation begins**
197
202
 
@@ -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
@@ -184,6 +184,9 @@ You may be dispatched alongside sibling agents working on the same repository at
184
184
  ### Reporting
185
185
  End your final summary with: `Siblings: <list>. Conflicts: <list or "none">. Git ops performed: <list or "none">.`
186
186
 
187
+ ## Thinking style
188
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
189
+
187
190
  ---
188
191
 
189
192
  ## Always-On Behavior Baseline
@@ -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
@@ -124,6 +124,9 @@ Be professional and concise. Do not write long essays for every action.
124
124
  - One sentence of context beats three paragraphs of preamble.
125
125
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
126
126
 
127
+ ## Thinking style
128
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
129
+
127
130
  ## Parallel Execution
128
131
 
129
132
  You may be invoked alongside other audit agents (parallel reviews of different files) or alongside implementation agents. The shared `AGENTS.md` baseline rules apply.
@@ -111,6 +111,10 @@ The injected message you will see is exactly one of:
111
111
  - `[loop guard: 8 identical calls to <tool>]. Consider using the task tool to report back to your parent with what you've learned and what you need.`
112
112
  - An error containing: `Loop protection: 12 identical calls to <tool>. Use task to escalate.`
113
113
 
114
+
115
+ ## Thinking style
116
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
117
+
114
118
  ---
115
119
 
116
120
  ## Always-On Behavior Baseline
@@ -169,6 +169,9 @@ Be professional and concise. Do not write long essays for every action.
169
169
  - One sentence of context beats three paragraphs of preamble.
170
170
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
171
171
 
172
+ ## Thinking style
173
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
174
+
172
175
  ## Parallel Execution
173
176
 
174
177
  You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
@@ -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
@@ -144,6 +144,9 @@ Be professional and concise. Do not write long essays for every action.
144
144
  - One sentence of context beats three paragraphs of preamble.
145
145
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
146
146
 
147
+ ## Thinking style
148
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
149
+
147
150
  ## PR Review Mode
148
151
 
149
152
  When dispatched for a `/pr-review`:
@@ -127,6 +127,9 @@ Be professional and concise. Do not write long essays for every action.
127
127
  - One sentence of context beats three paragraphs of preamble.
128
128
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
129
129
 
130
+ ## Thinking style
131
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
132
+
130
133
  ## Parallel Execution
131
134
 
132
135
  You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
@@ -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
@@ -90,6 +90,10 @@ The injected message you will see is exactly one of:
90
90
  - `[loop guard: 8 identical calls to <tool>]. Consider using the task tool to report back to your parent with what you've learned and what you need.`
91
91
  - An error containing: `Loop protection: 12 identical calls to <tool>. Use task to escalate.`
92
92
 
93
+
94
+ ## Thinking style
95
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
96
+
93
97
  ---
94
98
 
95
99
  ## Always-On Behavior Baseline
@@ -50,6 +50,9 @@ If `semble` is not on `$PATH`, use `uvx --from "semble[mcp]" semble` in its plac
50
50
 
51
51
  ---
52
52
 
53
+ ## Thinking style
54
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
55
+
53
56
  ## Always-On Behavior Baseline
54
57
 
55
58
  **Follow the global baseline in `config/AGENTS.md` → "General Agent Baseline — Always-On Behavior".** It covers identity, refusal, tone, formatting, lists, user wellbeing, evenhandedness, mistakes, knowledge cutoff and research-first, MCP servers and skills, mandatory skill-read, file creation, file handling, search, copyright, harmful content, citations, images, memory privacy, execution, clarification, and communication.
@@ -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
@@ -109,6 +109,9 @@ Be professional and concise. Do not write long essays for every action.
109
109
  - One sentence of context beats three paragraphs of preamble.
110
110
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
111
111
 
112
+ ## Thinking style
113
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
114
+
112
115
  ## Parallel Execution
113
116
 
114
117
  You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
@@ -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
@@ -108,6 +108,9 @@ Be professional and concise. Do not write long essays for every action.
108
108
  - One sentence of context beats three paragraphs of preamble.
109
109
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
110
110
 
111
+ ## Thinking style
112
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
113
+
111
114
  ## Parallel Execution
112
115
 
113
116
  You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
@@ -112,6 +112,9 @@ Be professional and concise. Do not write long essays for every action.
112
112
  - One sentence of context beats three paragraphs of preamble.
113
113
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
114
114
 
115
+ ## Thinking style
116
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
117
+
115
118
  ## Parallel Execution
116
119
 
117
120
  You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
@@ -150,6 +150,9 @@ Be professional and concise. Do not write long essays for every action.
150
150
  - One sentence of context beats three paragraphs of preamble.
151
151
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
152
152
 
153
+ ## Thinking style
154
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
155
+
153
156
  ---
154
157
 
155
158
  ## Always-On Behavior Baseline
@@ -334,5 +334,35 @@
334
334
  "template": "commands/bizar.md",
335
335
  "arguments": "$ARGUMENTS"
336
336
  }
337
+ },
338
+ "provider": {
339
+ "minimax": {
340
+ "models": {
341
+ "MiniMax-M3": {
342
+ "interleaved": { "field": "reasoning_details" },
343
+ "reasoning": true
344
+ },
345
+ "MiniMax-M2.7": {
346
+ "interleaved": { "field": "reasoning_details" },
347
+ "reasoning": true
348
+ }
349
+ }
350
+ },
351
+ "openrouter": {
352
+ "models": {
353
+ "minimax/minimax-m3": {
354
+ "interleaved": { "field": "reasoning_details" },
355
+ "reasoning": true
356
+ },
357
+ "minimax/minimax-m2.7": {
358
+ "interleaved": { "field": "reasoning_details" },
359
+ "reasoning": true
360
+ },
361
+ "minimax/owl-alpha": {
362
+ "interleaved": { "field": "reasoning_details" },
363
+ "reasoning": true
364
+ }
365
+ }
366
+ }
337
367
  }
338
368
  }
@@ -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",
@@ -306,5 +319,35 @@
306
319
  "agent": "odin",
307
320
  "template": "commands-bizar/bizar.md\n\n$ARGUMENTS"
308
321
  }
322
+ },
323
+ "provider": {
324
+ "minimax": {
325
+ "models": {
326
+ "MiniMax-M3": {
327
+ "interleaved": { "field": "reasoning_details" },
328
+ "reasoning": true
329
+ },
330
+ "MiniMax-M2.7": {
331
+ "interleaved": { "field": "reasoning_details" },
332
+ "reasoning": true
333
+ }
334
+ }
335
+ },
336
+ "openrouter": {
337
+ "models": {
338
+ "minimax/minimax-m3": {
339
+ "interleaved": { "field": "reasoning_details" },
340
+ "reasoning": true
341
+ },
342
+ "minimax/minimax-m2.7": {
343
+ "interleaved": { "field": "reasoning_details" },
344
+ "reasoning": true
345
+ },
346
+ "minimax/owl-alpha": {
347
+ "interleaved": { "field": "reasoning_details" },
348
+ "reasoning": true
349
+ }
350
+ }
351
+ }
309
352
  }
310
353
  }
@@ -0,0 +1,56 @@
1
+ # Concise Thinking Rule
2
+
3
+ ## The Problem
4
+
5
+ Models with `reasoning: true` + `variant: "high"` produce unbounded self-talk: "oh but what if this... actually let me reconsider... wait..." This is verbose, indecisive, and costly.
6
+
7
+ ## The Rule
8
+
9
+ **Think in 2–4 sentences. One-shot. No loops.**
10
+
11
+ ### Structure
12
+
13
+ Every reasoning output must follow this shape:
14
+
15
+ ```
16
+ [Premise — what I know] → [Decision — what I'm doing] → [Next step]
17
+ ```
18
+
19
+ No hedging. No "but what if". No mid-thought self-correction.
20
+
21
+ ### Hard Bans
22
+
23
+ Never use these phrases in thinking output:
24
+ - "oh but what if..."
25
+ - "actually..."
26
+ - "let me think..."
27
+ - "wait..."
28
+ - "hmm..."
29
+ - "I wonder..."
30
+ - "on second thought..."
31
+ - "alternatively..."
32
+
33
+ ### One-Shot Pattern
34
+
35
+ Think once. Decide. Act. Move on.
36
+
37
+ **Forbidden patterns:**
38
+ - "Option A... no wait Option B... actually let's try C..."
39
+ - "I considered X, but then I realized Y, so maybe Z..."
40
+ - "Let me reconsider..." followed by another reconsideration
41
+
42
+ ### What Thinking Should Look Like
43
+
44
+ **BAD:**
45
+ > "The file is missing a semicolon. Oh but what if it's actually a parsing issue? Let me think... Actually, looking more carefully, the real problem is the import statement is wrong. Wait, I should also check if the export is correct. Actually let me try fixing the import first..."
46
+
47
+ **GOOD:**
48
+ > "The import path is wrong — `../utils` should be `./utils`. Fixing the path resolves the missing export error. Next: re-run the build."
49
+
50
+ ### Length Cap
51
+
52
+ Maximum **80 words** of thinking output before the first tool call or response. If you cannot decide in 80 words, state the decision you reached and proceed.
53
+
54
+ ### Enforcement
55
+
56
+ This rule is injected into every model that supports `reasoning: true`. Non-compliance produces verbose, unhelpful output and is a correctness failure.
@@ -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.1",
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": {
@@ -42,5 +42,13 @@
42
42
  },
43
43
  "devDependencies": {
44
44
  "typescript": "^5.0.0"
45
- }
45
+ },
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git@github.com:DrB0rk/BizarHarness.git"
49
+ },
50
+ "bugs": {
51
+ "url": "https://github.com/DrB0rk/BizarHarness/issues"
52
+ },
53
+ "homepage": "https://github.com/DrB0rk/BizarHarness#readme"
46
54
  }