vibeostheog 0.23.1 → 0.23.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 CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.23.3
2
+ - fix: footer model display — OpenCode Go alias, generic -free suffix handling, 🎁 free icon
3
+
4
+
5
+ ## 0.23.2
6
+ - fix: footer regex case-sensitivity — /VIBE/i matches VibeMaX to prevent double-append
7
+
8
+
1
9
  ## 0.23.1
2
10
  - fix: footer dedup — content hash fallback prevents double-append from message.updated vs text.complete shape mismatch
3
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.23.1",
3
+ "version": "0.23.3",
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*/g, "").trimEnd();
278
+ const stripped = text.replace(/— .+?VIBE[^—]*—\s*/gi, "").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";