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 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.2",
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",
@@ -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(/— .+?VIBE[^—]*—\s*/gi, "").trimEnd();
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) {
@@ -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 cleaned = short.replace(MODEL_DISPLAY_PREFIXES, "");
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
- return cleaned
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 FREE_MODEL_TURN_USD;
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")