vibeostheog 0.23.2 → 0.23.4
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 +8 -0
- package/package.json +1 -1
- package/src/lib/hooks/footer.js +2 -2
- package/src/lib/pricing.js +130 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## 0.23.4
|
|
2
|
+
- fix: add complete OpenCode Go + Zen pricing maps, footer dedup/regex fix, free icon
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## 0.23.3
|
|
6
|
+
- fix: footer model display — OpenCode Go alias, generic -free suffix handling, 🎁 free icon
|
|
7
|
+
|
|
8
|
+
|
|
1
9
|
## 0.23.2
|
|
2
10
|
- fix: footer regex case-sensitivity — /VIBE/i matches VibeMaX to prevent double-append
|
|
3
11
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibeostheog",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.4",
|
|
4
4
|
"description": "Cost-aware delegation enforcer for OpenCode. Tracks model usage, routes Task subagents to cheaper tiers, surfaces cumulative savings in chat. Includes research audit, reporting framework, project memory, progressive scratchpad decadence, and trinity CLI for brain/medium/cheap slot switching.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"release": "node scripts/release.mjs",
|
package/src/lib/hooks/footer.js
CHANGED
|
@@ -275,7 +275,7 @@ async function _appendFooter(input, output, directory) {
|
|
|
275
275
|
subRegime: _latestBlackboxState?.sub_regime || classifyTurnSimple(latestUserIntent || ""),
|
|
276
276
|
stress: _footerStress,
|
|
277
277
|
}).mode;
|
|
278
|
-
const stripped = text.replace(/—
|
|
278
|
+
const stripped = text.replace(/— [^—]+ —\s*/g, "").trimEnd();
|
|
279
279
|
if (stripped !== text)
|
|
280
280
|
return;
|
|
281
281
|
if (stripped === _lastStrippedText)
|
|
@@ -285,7 +285,7 @@ async function _appendFooter(input, output, directory) {
|
|
|
285
285
|
const optMode = (resolvedMode || "budget").toLowerCase();
|
|
286
286
|
const vibeBrand = optMode === "vibemax" ? "VibeMaX" : optMode === "vibeultrax" ? "VibeUltraX" : optMode === "quality" ? "VibeQMaX" : "VibeMaX";
|
|
287
287
|
const modeLabel = modeCapitalized(optMode);
|
|
288
|
-
const qualityIcon = execution.quality === "brain" ? "🧠" : execution.quality === "medium" ? "⚙" : "⚡";
|
|
288
|
+
const qualityIcon = execution.quality === "brain" ? "🧠" : execution.quality === "medium" ? "⚙" : execution.quality === "free" ? "🎁" : "⚡";
|
|
289
289
|
const flashIcon = isApiConnected() ? " ⚡" : "";
|
|
290
290
|
let vibeLine = `— ${qualityIcon} ${execution.quality} | ${execution.provider_label} | ${modelDisplayName(execution.model)}`;
|
|
291
291
|
if (ltTotal > 0) {
|
package/src/lib/pricing.js
CHANGED
|
@@ -145,6 +145,8 @@ export function formatProviderName(providerName) {
|
|
|
145
145
|
return "Anthropic";
|
|
146
146
|
if (raw === "google")
|
|
147
147
|
return "Google";
|
|
148
|
+
if (raw === "opencode-go")
|
|
149
|
+
return "OpenCode Go";
|
|
148
150
|
return raw.charAt(0).toUpperCase() + raw.slice(1);
|
|
149
151
|
}
|
|
150
152
|
export function formatQualityName(quality) {
|
|
@@ -258,13 +260,16 @@ export function shortModelName(modelId) {
|
|
|
258
260
|
const MODEL_DISPLAY_PREFIXES = /^(deepseek|claude|gemini|gpt|davinci|llama|qwq|qwen)-/i;
|
|
259
261
|
export function modelDisplayName(modelId) {
|
|
260
262
|
const short = shortModelName(modelId);
|
|
261
|
-
const
|
|
263
|
+
const isFree = short.endsWith("-free");
|
|
264
|
+
const base = isFree ? short.slice(0, -5) : short;
|
|
265
|
+
const cleaned = base.replace(MODEL_DISPLAY_PREFIXES, "");
|
|
262
266
|
if (!cleaned)
|
|
263
267
|
return short;
|
|
264
|
-
|
|
268
|
+
const display = cleaned
|
|
265
269
|
.split(/[-_]/)
|
|
266
270
|
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
267
271
|
.join(" ");
|
|
272
|
+
return isFree ? `${display} Free` : display;
|
|
268
273
|
}
|
|
269
274
|
export function trendDisplay(sesTrend) {
|
|
270
275
|
const t = sesTrend === "up" || sesTrend === "down" ? sesTrend : "stable";
|
|
@@ -346,7 +351,18 @@ export function formatUsd(v) {
|
|
|
346
351
|
// These skip enforcement entirely to avoid noise.
|
|
347
352
|
// deepseek-chat is free with a DeepSeek API token — priced at $1e-12 (near-zero).
|
|
348
353
|
const FREE_MODEL_TURN_USD = 1e-10;
|
|
349
|
-
const FREE_MODELS = new Set([
|
|
354
|
+
const FREE_MODELS = new Set([
|
|
355
|
+
// OpenCode Zen free models
|
|
356
|
+
"opencode/big-pickle",
|
|
357
|
+
"opencode/mimo-v2.5-free",
|
|
358
|
+
"opencode/deepseek-v4-flash-free",
|
|
359
|
+
"opencode/nemotron-3-ultra-free",
|
|
360
|
+
// Normalized variants (after opencode/ prefix stripped)
|
|
361
|
+
"big-pickle",
|
|
362
|
+
"mimo-v2.5-free",
|
|
363
|
+
"deepseek-v4-flash-free",
|
|
364
|
+
"nemotron-3-ultra-free",
|
|
365
|
+
]);
|
|
350
366
|
// Actual input / output pricing per 1M tokens, sourced from provider API pages
|
|
351
367
|
// and OpenRouter /api/v1/models. Format: USD per 1 million tokens.
|
|
352
368
|
// Entries with provider/ prefix = OpenRouter route; without prefix = native provider.
|
|
@@ -429,6 +445,61 @@ const MODEL_PRICING_PER_1M = {
|
|
|
429
445
|
"mistralai/mistral-large-2512": { input: 0.50, output: 1.50 },
|
|
430
446
|
"mistralai/mistral-small-2603": { input: 0.15, output: 0.60 },
|
|
431
447
|
"mistralai/mistral-nemo": { input: 0.02, output: 0.03 },
|
|
448
|
+
// ── OpenCode Go ─────────────────────────────
|
|
449
|
+
"opencode-go/glm-5.1": { input: 1.40, output: 4.40 },
|
|
450
|
+
"opencode-go/glm-5": { input: 1.00, output: 3.20 },
|
|
451
|
+
"opencode-go/kimi-k2.6": { input: 0.95, output: 4.00 },
|
|
452
|
+
"opencode-go/kimi-k2.5": { input: 0.60, output: 3.00 },
|
|
453
|
+
"opencode-go/mimo-v2.5": { input: 0.14, output: 0.28 },
|
|
454
|
+
"opencode-go/mimo-v2.5-pro": { input: 1.74, output: 3.48 },
|
|
455
|
+
"opencode-go/minimax-m3": { input: 0.60, output: 2.40 },
|
|
456
|
+
"opencode-go/minimax-m2.7": { input: 0.30, output: 1.20 },
|
|
457
|
+
"opencode-go/minimax-m2.5": { input: 0.30, output: 1.20 },
|
|
458
|
+
"opencode-go/qwen3.7-max": { input: 2.50, output: 7.50 },
|
|
459
|
+
"opencode-go/qwen3.7-plus": { input: 0.40, output: 1.60 },
|
|
460
|
+
"opencode-go/qwen3.6-plus": { input: 0.50, output: 3.00 },
|
|
461
|
+
// ── OpenCode Zen (bare model names, opencode/ prefix stripped) ──
|
|
462
|
+
"minimax-m2.7": { input: 0.30, output: 1.20 },
|
|
463
|
+
"minimax-m2.5": { input: 0.30, output: 1.20 },
|
|
464
|
+
"glm-5.1": { input: 1.40, output: 4.40 },
|
|
465
|
+
"glm-5": { input: 1.00, output: 3.20 },
|
|
466
|
+
"kimi-k2.5": { input: 0.60, output: 3.00 },
|
|
467
|
+
"kimi-k2.6": { input: 0.95, output: 4.00 },
|
|
468
|
+
"qwen3.7-max": { input: 2.50, output: 7.50 },
|
|
469
|
+
"qwen3.7-plus": { input: 0.40, output: 1.60 },
|
|
470
|
+
"qwen3.6-plus": { input: 0.50, output: 3.00 },
|
|
471
|
+
"qwen3.5-plus": { input: 0.20, output: 1.20 },
|
|
472
|
+
"deepseek-v4-flash": { input: 0.14, output: 0.28 },
|
|
473
|
+
"grok-build-0.1": { input: 1.00, output: 2.00 },
|
|
474
|
+
"claude-opus-4-8": { input: 5.00, output: 25.00 },
|
|
475
|
+
"claude-opus-4-7": { input: 5.00, output: 25.00 },
|
|
476
|
+
"claude-opus-4-6": { input: 5.00, output: 25.00 },
|
|
477
|
+
"claude-opus-4-5": { input: 5.00, output: 25.00 },
|
|
478
|
+
"claude-opus-4-1": { input: 15.00, output: 75.00 },
|
|
479
|
+
"claude-sonnet-4-6": { input: 3.00, output: 15.00 },
|
|
480
|
+
"claude-sonnet-4-5": { input: 3.00, output: 15.00 },
|
|
481
|
+
"claude-sonnet-4": { input: 3.00, output: 15.00 },
|
|
482
|
+
"claude-haiku-4-5": { input: 1.00, output: 5.00 },
|
|
483
|
+
"gemini-3.5-flash": { input: 1.50, output: 9.00 },
|
|
484
|
+
"gemini-3.1-pro": { input: 2.00, output: 12.00 },
|
|
485
|
+
"gemini-3-flash": { input: 0.50, output: 3.00 },
|
|
486
|
+
"gpt-5.5": { input: 5.00, output: 30.00 },
|
|
487
|
+
"gpt-5.5-pro": { input: 30.00, output: 180.00 },
|
|
488
|
+
"gpt-5.4": { input: 2.50, output: 15.00 },
|
|
489
|
+
"gpt-5.4-pro": { input: 30.00, output: 180.00 },
|
|
490
|
+
"gpt-5.4-mini": { input: 0.75, output: 4.50 },
|
|
491
|
+
"gpt-5.4-nano": { input: 0.20, output: 1.25 },
|
|
492
|
+
"gpt-5.3-codex-spark": { input: 1.75, output: 14.00 },
|
|
493
|
+
"gpt-5.3-codex": { input: 1.75, output: 14.00 },
|
|
494
|
+
"gpt-5.2": { input: 1.75, output: 14.00 },
|
|
495
|
+
"gpt-5.2-codex": { input: 1.75, output: 14.00 },
|
|
496
|
+
"gpt-5.1": { input: 1.07, output: 8.50 },
|
|
497
|
+
"gpt-5.1-codex": { input: 1.07, output: 8.50 },
|
|
498
|
+
"gpt-5.1-codex-max": { input: 1.25, output: 10.00 },
|
|
499
|
+
"gpt-5.1-codex-mini": { input: 0.25, output: 2.00 },
|
|
500
|
+
"gpt-5": { input: 1.07, output: 8.50 },
|
|
501
|
+
"gpt-5-codex": { input: 1.07, output: 8.50 },
|
|
502
|
+
"gpt-5-nano": { input: 0.05, output: 0.40 },
|
|
432
503
|
};
|
|
433
504
|
// Approximate USD per typical ~1 K-token turn (blended input+output).
|
|
434
505
|
// Blend: 700 input + 300 output tokens per turn (line 272-273).
|
|
@@ -473,6 +544,61 @@ const MODEL_USD_PER_TURN = {
|
|
|
473
544
|
"openai/gpt-4.1-mini": 0.00019,
|
|
474
545
|
"openai/o3": 0.0038,
|
|
475
546
|
"openai/o4-mini": 0.0021,
|
|
547
|
+
// ── OpenCode Go ─────────────────────────────
|
|
548
|
+
"opencode-go/glm-5.1": 0.00230,
|
|
549
|
+
"opencode-go/glm-5": 0.00166,
|
|
550
|
+
"opencode-go/kimi-k2.6": 0.00187,
|
|
551
|
+
"opencode-go/kimi-k2.5": 0.00132,
|
|
552
|
+
"opencode-go/mimo-v2.5": 0.000182,
|
|
553
|
+
"opencode-go/mimo-v2.5-pro": 0.00226,
|
|
554
|
+
"opencode-go/minimax-m3": 0.00114,
|
|
555
|
+
"opencode-go/minimax-m2.7": 0.00057,
|
|
556
|
+
"opencode-go/minimax-m2.5": 0.00057,
|
|
557
|
+
"opencode-go/qwen3.7-max": 0.00400,
|
|
558
|
+
"opencode-go/qwen3.7-plus": 0.00076,
|
|
559
|
+
"opencode-go/qwen3.6-plus": 0.00125,
|
|
560
|
+
// ── OpenCode Zen (bare model names, opencode/ prefix stripped by normalizeModelId) ──
|
|
561
|
+
"minimax-m2.7": 0.00057,
|
|
562
|
+
"minimax-m2.5": 0.00057,
|
|
563
|
+
"glm-5.1": 0.00230,
|
|
564
|
+
"glm-5": 0.00166,
|
|
565
|
+
"kimi-k2.5": 0.00132,
|
|
566
|
+
"kimi-k2.6": 0.00187,
|
|
567
|
+
"qwen3.7-max": 0.00400,
|
|
568
|
+
"qwen3.7-plus": 0.00076,
|
|
569
|
+
"qwen3.6-plus": 0.00125,
|
|
570
|
+
"qwen3.5-plus": 0.00050,
|
|
571
|
+
"deepseek-v4-flash": 0.000182,
|
|
572
|
+
"grok-build-0.1": 0.00130,
|
|
573
|
+
"claude-opus-4-8": 0.01100,
|
|
574
|
+
"claude-opus-4-7": 0.01100,
|
|
575
|
+
"claude-opus-4-6": 0.01100,
|
|
576
|
+
"claude-opus-4-5": 0.01100,
|
|
577
|
+
"claude-opus-4-1": 0.03300,
|
|
578
|
+
"claude-sonnet-4-6": 0.00660,
|
|
579
|
+
"claude-sonnet-4-5": 0.00660,
|
|
580
|
+
"claude-sonnet-4": 0.00660,
|
|
581
|
+
"claude-haiku-4-5": 0.00220,
|
|
582
|
+
"gemini-3.5-flash": 0.00375,
|
|
583
|
+
"gemini-3.1-pro": 0.00500,
|
|
584
|
+
"gemini-3-flash": 0.00125,
|
|
585
|
+
"gpt-5.5": 0.01250,
|
|
586
|
+
"gpt-5.5-pro": 0.07500,
|
|
587
|
+
"gpt-5.4": 0.00625,
|
|
588
|
+
"gpt-5.4-pro": 0.07500,
|
|
589
|
+
"gpt-5.4-mini": 0.00188,
|
|
590
|
+
"gpt-5.4-nano": 0.00052,
|
|
591
|
+
"gpt-5.3-codex-spark": 0.00543,
|
|
592
|
+
"gpt-5.3-codex": 0.00543,
|
|
593
|
+
"gpt-5.2": 0.00543,
|
|
594
|
+
"gpt-5.2-codex": 0.00543,
|
|
595
|
+
"gpt-5.1": 0.00330,
|
|
596
|
+
"gpt-5.1-codex": 0.00330,
|
|
597
|
+
"gpt-5.1-codex-max": 0.00388,
|
|
598
|
+
"gpt-5.1-codex-mini": 0.00078,
|
|
599
|
+
"gpt-5": 0.00330,
|
|
600
|
+
"gpt-5-codex": 0.00330,
|
|
601
|
+
"gpt-5-nano": 0.00016,
|
|
476
602
|
};
|
|
477
603
|
let _pricingOverridesCache = null;
|
|
478
604
|
let _pricingOverridesLoadedAt = 0;
|
|
@@ -673,7 +799,7 @@ export function modelCostPerTurn(model) {
|
|
|
673
799
|
}
|
|
674
800
|
}
|
|
675
801
|
console.error(`[vibeOS] modelCostPerTurn: unknown model '${model}' (normalized: '${key}') — add to MODEL_USD_PER_TURN`);
|
|
676
|
-
return
|
|
802
|
+
return 0.00001; // unknown model default — cheap, but not free
|
|
677
803
|
}
|
|
678
804
|
export function isModelFree(model) {
|
|
679
805
|
if (!model || typeof model !== "string")
|