bullswarm 0.22.0 → 0.23.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/CHANGELOG.md +12 -0
- package/README.md +58 -3
- package/connectors/_schema.json +1 -0
- package/connectors/claude-code.json +1 -1
- package/connectors/command-code.json +1 -1
- package/connectors/opencode2.json +3 -1
- package/data/README.md +9 -0
- package/data/openrouter-benchmarks.json +34038 -0
- package/fixtures/openrouter/benchmarks.json +23 -0
- package/fixtures/openrouter/models.json +13 -0
- package/package.json +3 -1
- package/skill/references/operations.md +7 -2
- package/src/cli.js +34 -6
- package/src/help.js +73 -11
- package/src/lib/config.js +7 -2
- package/src/lib/openrouter-models.js +225 -0
- package/src/lib/strategy.js +205 -7
- package/src/meters/registry.js +6 -1
- package/src/setup.js +23 -2
- package/src/strategy-cli.js +307 -11
- package/src/strategy-dashboard.js +545 -0
- package/src/workflow/dashboard.js +187 -57
- package/src/workflow/runtime.js +9 -2
- package/src/workflow/v2-dispatch.js +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# bullswarm changelog
|
|
2
2
|
|
|
3
|
+
## 0.22.1 — unified workflow dashboard navigation
|
|
4
|
+
|
|
5
|
+
- The workflow dashboard now keeps V2 runs in the unified list and timeline
|
|
6
|
+
shell on both desktop and narrow terminals, with stable mobile borders and
|
|
7
|
+
the same phase-segmented timeline for current and historical runs.
|
|
8
|
+
|
|
9
|
+
- Timeline phases are numbered and presented in declared program order, so
|
|
10
|
+
parallel workers finishing out of order cannot place Phase 2 above Phase 1.
|
|
11
|
+
Preflight is selectable and opens the Workflow Planner; Up and Down move
|
|
12
|
+
through Preflight, Phase 1, Phase 2, and later phases, while Enter or Right
|
|
13
|
+
opens the selected planner or phase agents.
|
|
14
|
+
|
|
3
15
|
## 0.22.0 — autonomous Dynamic Workflow V2
|
|
4
16
|
|
|
5
17
|
- Autonomous goals now run on the V2 kernel: agents propose bounded programs
|
package/README.md
CHANGED
|
@@ -70,9 +70,10 @@ re-delegating and creating recursive swarms.
|
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
72
|
bullswarm # first run: interactive setup wizard
|
|
73
|
-
bullswarm setup #
|
|
73
|
+
bullswarm setup # interactive provider/model configuration
|
|
74
|
+
bullswarm setup --wizard # broader worktree + integration questionnaire
|
|
74
75
|
bullswarm pools # meter state, pace position, quarantine status
|
|
75
|
-
bullswarm strategy
|
|
76
|
+
bullswarm strategy # explicit alias for the same routing control center
|
|
76
77
|
bullswarm delegate --cwd ~/some-repo --prompt "Explain the parser" # one agent
|
|
77
78
|
bullswarm delegate --cwd ~/some-repo --prompt "Audit all commands, fix help, and independently verify" # workflow
|
|
78
79
|
bullswarm delegate --dry-run --json --cwd ~/some-repo --prompt "Your task" # bounded classification + decision/plan; no work dispatch
|
|
@@ -92,7 +93,7 @@ bullswarm health # re-judge saved outputs; catch gate failures
|
|
|
92
93
|
| `run` | route → dispatch → watch → verify → one JSON verdict |
|
|
93
94
|
| `health` | Re-judge saved outputs against their verdicts; surface verify-gate failures and quarantine clusters |
|
|
94
95
|
| `pools` | Show each pool's meter state, pace position, quarantine status |
|
|
95
|
-
| `strategy` |
|
|
96
|
+
| `strategy` | Interactive provider/model control center with live high/medium/low route previews and an agent-facing JSON API |
|
|
96
97
|
| `doctor` | Machine-readable readiness report; self-heals on first call |
|
|
97
98
|
| `workflow` | Start an autonomous goal, or run / validate / draft / inspect explicit workflows and their live instances. |
|
|
98
99
|
| `runs` | Short alias for `workflow runs`, including list, show, result, delete, and cleanup operations. |
|
|
@@ -132,6 +133,15 @@ Bullswarm can inventory the models exposed by installed agent CLIs and combine
|
|
|
132
133
|
connector-declared, dated pricing/benchmark metadata with live quota surplus:
|
|
133
134
|
|
|
134
135
|
```bash
|
|
136
|
+
bullswarm setup # TTY: interactive control center
|
|
137
|
+
bullswarm strategy # explicit routing-focused alias
|
|
138
|
+
bullswarm strategy inventory --json # agent-readable detection + policy + routes
|
|
139
|
+
bullswarm strategy routes --json # compact effective choices
|
|
140
|
+
bullswarm strategy set-provider codex off --yes
|
|
141
|
+
bullswarm strategy set-model opencode2 kaihk/gpt-5.6-luna \
|
|
142
|
+
--tiers high,medium,low --yes
|
|
143
|
+
bullswarm strategy configure --file strategy.json --yes # atomic agent-authored policy
|
|
144
|
+
bullswarm strategy reset-tier low --yes # restore one tier to automatic
|
|
135
145
|
bullswarm strategy refresh
|
|
136
146
|
bullswarm strategy show --json
|
|
137
147
|
bullswarm strategy apply --yes --refresh-hours 24
|
|
@@ -143,6 +153,51 @@ bullswarm strategy exclude-model claude-fable-5
|
|
|
143
153
|
bullswarm run --effort high --lane analyze --task-file /tmp/task.md --json
|
|
144
154
|
```
|
|
145
155
|
|
|
156
|
+
Setup first asks whether to analyze live usage and recommend routes or open the
|
|
157
|
+
current configuration for manual editing. Analysis shows a spinner plus
|
|
158
|
+
per-provider usage progress, then presents the proposed defaults before making
|
|
159
|
+
any routing change. Press `Y` to apply them or `N` to retain the current policy.
|
|
160
|
+
The analysis selects at most one default model for each provider and effort
|
|
161
|
+
tier. It uses OpenRouter's agentic, coding, and intelligence indices as quality
|
|
162
|
+
signals and API-equivalent pricing as the budget signal. A repository-owned
|
|
163
|
+
GitHub Actions job calls the authenticated OpenRouter APIs once per day and
|
|
164
|
+
replaces a public, validated `openrouter-benchmarks.json` asset on the rolling
|
|
165
|
+
`benchmark-data-latest` GitHub Release. Installed CLIs download only that public
|
|
166
|
+
file and never need or receive an OpenRouter key.
|
|
167
|
+
The sources are OpenRouter's [benchmarks API](https://openrouter.ai/docs/api/api-reference/benchmarks/list-benchmarks)
|
|
168
|
+
and [models API](https://openrouter.ai/docs/api/api-reference/models/list-all-models-and-their-properties).
|
|
169
|
+
The CLI caches the datapack under `~/.bullswarm/cache/`; network failure falls
|
|
170
|
+
back to a stale or bundled datapack, then connector metadata, without blocking
|
|
171
|
+
setup.
|
|
172
|
+
|
|
173
|
+
The TUI lists every detected provider/account separately so its toggle matches
|
|
174
|
+
its own quota meter. Enter drills into that provider's detected models. In the
|
|
175
|
+
model matrix, `Up`/`Down` selects a model, `Left`/`Right` moves a visibly
|
|
176
|
+
highlighted cell across High, Medium, and Low, and `Enter` toggles that cell.
|
|
177
|
+
Type to filter model names; assigned models sort above unassigned or disabled
|
|
178
|
+
models. Select `Finish setup` and press `Enter`, or press `F` directly, to leave
|
|
179
|
+
the control center. The effective-route panel is recomputed from the same policy
|
|
180
|
+
and live surplus used by real dispatch. Provider and model edits affect new
|
|
181
|
+
direct runs and workflow dispatches.
|
|
182
|
+
|
|
183
|
+
An external AI agent should first read `strategy inventory --json`, then use
|
|
184
|
+
the validated `set-provider` / `set-model` commands or write one JSON document
|
|
185
|
+
for `strategy configure --file`. Unknown pools and models are rejected before
|
|
186
|
+
state is saved. Existing automatic choices are preserved when a human begins
|
|
187
|
+
curating a tier; a model-level `off` never empties unrelated tiers.
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"providers": { "codex": false, "opencode2": true },
|
|
192
|
+
"models": {
|
|
193
|
+
"opencode2": {
|
|
194
|
+
"kaihk/gpt-5.6-sol": ["high"],
|
|
195
|
+
"kaihk/gpt-5.6-luna": ["medium", "low"]
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
146
201
|
Interactive setup asks whether to enable strategy autopilot; non-interactive
|
|
147
202
|
setup requires the explicit `setup --yes --strategy` flag. Recommendations are
|
|
148
203
|
context-filtered before ranking: high requires analysis plus workflow-planning,
|
package/connectors/_schema.json
CHANGED
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"pricing": {"inputUsdPerMillion": null, "cacheReadUsdPerMillion": null, "outputUsdPerMillion": null},
|
|
69
69
|
"pricingSource": "optional dated primary source",
|
|
70
70
|
"pricingUpdatedAt": "YYYY-MM-DD",
|
|
71
|
+
"autoRecommend": true,
|
|
71
72
|
"free": false
|
|
72
73
|
}],
|
|
73
74
|
"modelSelection": {"flag": "--model", "mode": "replace-or-append"},
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"resumeArgs": ["--resume", "{sessionId}"]
|
|
60
60
|
},
|
|
61
61
|
"modelProfiles": [
|
|
62
|
-
{ "match": "
|
|
62
|
+
{ "match": "(?:^|/)claude-fable-", "tier": "high", "qualityRank": 6, "autoRecommend": false, "pricing": { "inputUsdPerMillion": 10, "cacheReadUsdPerMillion": 1, "outputUsdPerMillion": 50 }, "pricingSource": "https://platform.claude.com/docs/en/about-claude/pricing", "pricingUpdatedAt": "2026-08-27" },
|
|
63
63
|
{ "match": "^claude-opus-(5|4-[5-8])$", "tier": "high", "qualityRank": 5, "pricing": { "inputUsdPerMillion": 5, "cacheReadUsdPerMillion": 0.5, "outputUsdPerMillion": 25 }, "pricingSource": "https://platform.claude.com/docs/en/about-claude/pricing", "pricingUpdatedAt": "2026-08-27" },
|
|
64
64
|
{ "match": "^claude-sonnet-5$", "tier": "medium", "qualityRank": 4, "pricing": { "inputUsdPerMillion": 2, "cacheReadUsdPerMillion": 0.2, "outputUsdPerMillion": 10 }, "pricingSource": "https://platform.claude.com/docs/en/about-claude/pricing", "pricingUpdatedAt": "2026-08-27" },
|
|
65
65
|
{ "match": "^claude-sonnet-", "tier": "medium", "qualityRank": 4 },
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
{ "match": "^gpt-5\\.6-sol$", "tier": "high", "qualityRank": 6, "pricing": { "inputUsdPerMillion": 4, "cacheReadUsdPerMillion": 0.4, "outputUsdPerMillion": 20 }, "pricingSource": "https://help.openai.com/en/articles/20001415-chatgpt-rate-card-enterprise-token-based-pricing", "pricingUpdatedAt": "2026-08-27" },
|
|
57
57
|
{ "match": "^gpt-5\\.6-terra$", "tier": "medium", "qualityRank": 4, "pricing": { "inputUsdPerMillion": 2, "cacheReadUsdPerMillion": 0.2, "outputUsdPerMillion": 12 }, "pricingSource": "https://developers.openai.com/api/docs/models/gpt-5.6-terra", "pricingUpdatedAt": "2026-08-27" },
|
|
58
58
|
{ "match": "^gpt-5\\.6-luna$", "tier": "low", "qualityRank": 3, "pricing": { "inputUsdPerMillion": 0.2, "cacheReadUsdPerMillion": 0.02, "outputUsdPerMillion": 1.2 }, "pricingSource": "https://developers.openai.com/api/docs/models", "pricingUpdatedAt": "2026-08-27" },
|
|
59
|
-
{ "match": "
|
|
59
|
+
{ "match": "(?:^|/)claude-fable-", "tier": "high", "qualityRank": 6, "autoRecommend": false, "pricing": { "inputUsdPerMillion": 10, "cacheReadUsdPerMillion": 1, "outputUsdPerMillion": 50 }, "pricingSource": "https://platform.claude.com/docs/en/about-claude/pricing", "pricingUpdatedAt": "2026-08-27" },
|
|
60
60
|
{ "match": "^claude-opus-", "tier": "high", "qualityRank": 5 },
|
|
61
61
|
{ "match": "^claude-sonnet-", "tier": "medium", "qualityRank": 4 },
|
|
62
62
|
{ "match": "^claude-haiku-", "tier": "low", "qualityRank": 3 },
|
|
@@ -33,7 +33,9 @@
|
|
|
33
33
|
"modelDiscovery": { "cmd": ["opencode", "models"], "parse": "lines", "includePattern": "^[^\\s]+/[^\\s]+$", "timeoutMs": 20000, "maxModels": 250 },
|
|
34
34
|
"modelSelection": { "flag": "--model", "mode": "replace-or-append" },
|
|
35
35
|
"modelProfiles": [
|
|
36
|
-
{ "match": "(
|
|
36
|
+
{ "match": "(?:^|/)claude-fable-", "tier": "high", "qualityRank": 6, "autoRecommend": false },
|
|
37
|
+
{ "match": "gpt-5\\.6-sol$", "tier": "high", "qualityRank": 6, "autoRecommend": true },
|
|
38
|
+
{ "match": "(?:opus|gpt-5\\.5$)", "tier": "high", "qualityRank": 5 },
|
|
37
39
|
{ "match": "(?:sonnet|terra|gpt-5\\.4$|deepseek-v4)", "tier": "medium", "qualityRank": 4 },
|
|
38
40
|
{ "match": "(?:haiku|luna|(?:^|[/.-])mini(?:$|[/.-])|flash|free)", "tier": "low", "qualityRank": 2 }
|
|
39
41
|
],
|
package/data/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Benchmark datapack
|
|
2
|
+
|
|
3
|
+
`openrouter-benchmarks.json` is generated daily by
|
|
4
|
+
`.github/workflows/refresh-openrouter-benchmarks.yml` and published as the
|
|
5
|
+
replaceable asset on the `benchmark-data-latest` GitHub Release. Normal package
|
|
6
|
+
releases download that asset into this directory as an offline fallback. It
|
|
7
|
+
contains public model metadata and benchmark results only. The OpenRouter API
|
|
8
|
+
key remains in GitHub Actions secrets and is never written here or shipped with
|
|
9
|
+
the CLI.
|