vibeostheog 0.23.0 → 0.23.1

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,7 @@
1
+ ## 0.23.1
2
+ - fix: footer dedup — content hash fallback prevents double-append from message.updated vs text.complete shape mismatch
3
+
4
+
1
5
  ## 0.22.16
2
6
 
3
7
  - test: add 12 cache isolation scenarios (no cross-session/project hallucination)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.23.0",
3
+ "version": "0.23.1",
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",
@@ -58,6 +58,7 @@ const SAVINGS_LEDGER_FILE = join(getVibeOSHome(), "savings-ledger.jsonl");
58
58
  let _prevOutputText = "";
59
59
  let _autoReportCount = 0;
60
60
  const textCompletePainted = new Set();
61
+ let _lastStrippedText = "";
61
62
  function loadSelection() {
62
63
  try {
63
64
  const raw = readFileSync(join(getVibeOSHome(), "model-tiers.json"), "utf-8");
@@ -277,6 +278,8 @@ async function _appendFooter(input, output, directory) {
277
278
  const stripped = text.replace(/— .+?VIBE[^—]*—\s*/g, "").trimEnd();
278
279
  if (stripped !== text)
279
280
  return;
281
+ if (stripped === _lastStrippedText)
282
+ return;
280
283
  const ltTotal = ltTasks + ltCache;
281
284
  const modeCapitalized = (mode) => mode.charAt(0).toUpperCase() + mode.slice(1);
282
285
  const optMode = (resolvedMode || "budget").toLowerCase();
@@ -343,6 +346,7 @@ async function _appendFooter(input, output, directory) {
343
346
  obj.text = text;
344
347
  }
345
348
  _setFooter(output, footerText);
349
+ _lastStrippedText = stripped;
346
350
  // CLI/pipe mode: stdout is already rendered, write footer to stderr
347
351
  if (!process.stdout?.isTTY) {
348
352
  console.error(`\n${vibeLine} —`);