vibeostheog 0.23.11 → 0.23.13

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.23.11",
3
+ "version": "0.23.13",
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",
@@ -289,14 +289,12 @@ async function _appendFooter(input, output, directory) {
289
289
  const modeLabel = modeCapitalized(brandedToRuntime[optMode] || optMode);
290
290
  const qualityIcon = execution.quality === "brain" ? "🧠" : execution.quality === "medium" ? "⚙" : execution.quality === "free" ? "🎁" : "⚡";
291
291
  const flashIcon = isApiConnected() ? " ⚡" : "";
292
- const selProvider = selNowFooter.selected_provider || execution.provider_label;
293
- const selModel = selNowFooter.executed_model || execution.model;
294
- let vibeLine = `— ${qualityIcon} ${execution.quality} | ${selProvider} | ${modelDisplayName(selModel)}`;
292
+ let vibeLine = `— ${qualityIcon} ${execution.quality} | ${execution.provider_label} | ${modelDisplayName(execution.model)}`;
295
293
  if (ltTotal > 0) {
296
294
  vibeLine += ` | $${formatUsd(ltTotal)}`;
297
295
  }
298
296
  if (isApiConnected()) {
299
- vibeLine += ` | ${vibeBrand}${flashIcon} ${modeLabel}`;
297
+ vibeLine += ` | ${vibeBrand}${flashIcon}`;
300
298
  }
301
299
  const footerText = stripped + `\n\n${vibeLine} —`;
302
300
  if (_blackboxEnabled) {
@@ -733,11 +733,11 @@ export const onToolExecuteAfter = async (input, output) => {
733
733
  const vibeBrand = brandMap[optModeFooter] || (execution.quality === "brain" ? "VibeQMaX" : "VibeMaX");
734
734
  const qualityIcon = execution.quality === "brain" ? "\u{1F9E0}" : execution.quality === "medium" ? "\u2699" : execution.quality === "free" ? "\u{1F381}" : "\u26A1";
735
735
  const modeLabel = modeCapitalized(brandedToRuntime[optModeFooter] || optModeFooter);
736
- _footerText = `— ${qualityIcon} ${execution.quality} | ${currentSel.selected_provider || execution.provider_label} | ${modelDisplayName(currentSel.executed_model || execution.model)}`;
736
+ _footerText = `— ${qualityIcon} ${execution.quality} | ${execution.provider_label} | ${modelDisplayName(execution.model)}`;
737
737
  if (ltTotal > 0) {
738
738
  _footerText += ` | $${formatUsd(ltTotal)}`;
739
739
  }
740
- _footerText += ` | ${vibeBrand}${flashIcon} ${modeLabel} —\n\n`;
740
+ _footerText += ` | ${vibeBrand}${flashIcon} —\n\n`;
741
741
  output.title = _footerText.trim();
742
742
  if (typeof output?.output === "string")
743
743
  output.output = _footerText + output.output;
@@ -87,11 +87,22 @@ export function createTrinityTool(deps) {
87
87
  cheap: models.find(m => m.id === trinity.cheap) || { id: trinity.cheap, cost: deps._modelCost(trinity.cheap), tier: deps._modelTier(trinity.cheap) },
88
88
  };
89
89
  const tiersData = deps.safeJsonParse(deps.readFileSync(deps.TIERS_FILE, "utf-8"));
90
- tiersData.trinity = {
91
- brain: { oc: probed.brain.id, cc: deps.modelToCcAlias(probed.brain.id) },
92
- medium: { oc: probed.medium.id, cc: deps.modelToCcAlias(probed.medium.id) },
93
- cheap: { oc: probed.cheap.id, cc: deps.modelToCcAlias(probed.cheap.id) },
94
- };
90
+ const oldTiers = tiersData.trinity || {};
91
+ const oldProvider = tiersData.selection?.selected_provider || "";
92
+ const newProvider = trinity.provider || resolveExecutionIdentity(deps.currentModel, deps.directory)?.provider || "";
93
+ tiersData.trinity ??= {};
94
+ const slots = ["brain", "medium", "cheap"];
95
+ for (const s of slots) {
96
+ const autoModel = probed[s].id;
97
+ const oldModel = oldTiers[s]?.oc || "";
98
+ const oldModelProvider = oldModel.includes("/") ? oldModel.split("/")[0] : "";
99
+ if (oldModelProvider && oldModelProvider !== oldProvider && oldModelProvider !== newProvider) {
100
+ tiersData.trinity[s] = oldTiers[s];
101
+ }
102
+ else {
103
+ tiersData.trinity[s] = { oc: autoModel, cc: deps.modelToCcAlias(autoModel) };
104
+ }
105
+ }
95
106
  tiersData.selection ??= {};
96
107
  tiersData.selection.selected_provider = trinity.provider || resolveExecutionIdentity(deps.currentModel, deps.directory)?.provider || "";
97
108
  tiersData.selection.selected_model = deps.currentModel;