bullswarm 0.28.2 → 0.28.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/connectors/command-code.json +13 -0
- package/package.json +1 -1
- package/src/setup.js +28 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# bullswarm changelog
|
|
2
2
|
|
|
3
|
+
## 0.28.3 — connector upgrades learn new packaged profiles
|
|
4
|
+
|
|
5
|
+
- command-code: a profile entry for `deepseek/deepseek-v4.1-flash` that
|
|
6
|
+
carries the model's own pricing from
|
|
7
|
+
https://commandcode.ai/docs/resources/pricing-limits (2026-09-11): input
|
|
8
|
+
$0.15, cache read $0.003, output $0.60 per million tokens off peak (the
|
|
9
|
+
peak window is documented in the entry). Tier and rank stay exactly what the
|
|
10
|
+
generic flash catch-all gives; this is not a recommendation, and none will
|
|
11
|
+
be packaged without benchmark evidence. Note for operators: model discovery
|
|
12
|
+
is only re-run by `bullswarm strategy refresh`, so a model a CLI added since
|
|
13
|
+
the last refresh is rejected by `strategy set-rung` until you refresh.
|
|
14
|
+
- Connector upgrades now insert packaged `modelProfiles` entries that the
|
|
15
|
+
installed connector lacks (keyed by `match` or `id`) at the position the
|
|
16
|
+
packaged order implies: before the installed generic catch-all a specific
|
|
17
|
+
entry was written to precede, never ahead of a profile the operator
|
|
18
|
+
authored. Profiles the installed connector already holds are never touched.
|
|
19
|
+
Before this, `modelProfiles` was copied only when the installed connector
|
|
20
|
+
had none at all, so existing installations never learned new entries.
|
|
21
|
+
|
|
3
22
|
## 0.28.2 — terminal glyph fallback, issue watcher, health on a fresh home
|
|
4
23
|
|
|
5
24
|
- `bullswarm workflow` repainted flashing `?` characters on macOS
|
|
@@ -256,6 +256,19 @@
|
|
|
256
256
|
"tier": "low",
|
|
257
257
|
"qualityRank": 3
|
|
258
258
|
},
|
|
259
|
+
{
|
|
260
|
+
"match": "^deepseek/deepseek-v4\\.1-flash$",
|
|
261
|
+
"tier": "low",
|
|
262
|
+
"qualityRank": 2,
|
|
263
|
+
"$comment-deepseek": "Facts only, no recommendation: tier and rank are exactly what the generic flash catch-all below would give, kept here so the entry carries the model's own pricing. OpenRouter publishes no indices for this model yet; raise nothing here without benchmark evidence. Pricing is the off-peak rate (17 h/day); peak is $0.30 input / $1.20 output during 01–04 and 06–10 UTC Monday–Friday.",
|
|
264
|
+
"pricing": {
|
|
265
|
+
"inputUsdPerMillion": 0.15,
|
|
266
|
+
"cacheReadUsdPerMillion": 0.003,
|
|
267
|
+
"outputUsdPerMillion": 0.6
|
|
268
|
+
},
|
|
269
|
+
"pricingSource": "https://commandcode.ai/docs/resources/pricing-limits",
|
|
270
|
+
"pricingUpdatedAt": "2026-09-11"
|
|
271
|
+
},
|
|
259
272
|
{
|
|
260
273
|
"match": "(?:flash|(?:^|[/.-])mini(?:$|[/.-])|luna|free)",
|
|
261
274
|
"tier": "low",
|
package/package.json
CHANGED
package/src/setup.js
CHANGED
|
@@ -269,6 +269,34 @@ export function upgradeConnectorMetadata(bullswarmDir, {
|
|
|
269
269
|
changed = true;
|
|
270
270
|
}
|
|
271
271
|
}
|
|
272
|
+
// A packaged profile the installed connector has never seen (keyed by
|
|
273
|
+
// its `match` pattern or `id`) is inserted where the packaged order puts
|
|
274
|
+
// it: right before the first installed entry that comes later in the
|
|
275
|
+
// packaged list, else at the end. So a new specific entry lands ahead of
|
|
276
|
+
// the packaged generic catch-all it was written to precede, but never
|
|
277
|
+
// ahead of a profile the operator authored themselves. Entries the
|
|
278
|
+
// installed connector already holds, edited or not, are never touched;
|
|
279
|
+
// recommendation guards were handled above.
|
|
280
|
+
if (Array.isArray(installed.modelProfiles) && Array.isArray(packaged.modelProfiles)) {
|
|
281
|
+
const keyOf = (profile) => (profile?.match != null ? `match:${profile.match}`
|
|
282
|
+
: profile?.id != null ? `id:${profile.id}` : null);
|
|
283
|
+
// Guards are prepended by policy above, so they never anchor order.
|
|
284
|
+
const packagedIndex = new Map(packaged.modelProfiles
|
|
285
|
+
.map((profile, index) => [keyOf(profile), index])
|
|
286
|
+
.filter(([key], index) => key != null && typeof packaged.modelProfiles[index].autoRecommend !== 'boolean'));
|
|
287
|
+
packaged.modelProfiles.forEach((profile, index) => {
|
|
288
|
+
const key = keyOf(profile);
|
|
289
|
+
if (key == null || typeof profile.autoRecommend === 'boolean') return;
|
|
290
|
+
if (installed.modelProfiles.some((entry) => keyOf(entry) === key)) return;
|
|
291
|
+
let at = installed.modelProfiles.length;
|
|
292
|
+
for (let j = 0; j < installed.modelProfiles.length; j += 1) {
|
|
293
|
+
const laterInPackage = packagedIndex.get(keyOf(installed.modelProfiles[j]));
|
|
294
|
+
if (laterInPackage != null && laterInPackage > index) { at = j; break; }
|
|
295
|
+
}
|
|
296
|
+
installed.modelProfiles.splice(at, 0, profile);
|
|
297
|
+
changed = true;
|
|
298
|
+
});
|
|
299
|
+
}
|
|
272
300
|
if (changed) {
|
|
273
301
|
writeFileSync(dst, `${JSON.stringify(installed, null, 2)}\n`);
|
|
274
302
|
upgraded.push(f);
|