vibeostheog 0.24.31 → 0.24.32

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,23 @@
1
+ ## 0.24.32
2
+ - feat: promote data-backed experimental regimes (#158)
3
+ - feat: promote data-backed experimental regimes
4
+ - fix: make footer state truthful
5
+ - test: add live lifecycle regression
6
+ - chore: v0.24.31 (#163)
7
+ - chore: v0.24.28
8
+ Merge pull request #162 from DrunkkToys/codex/test-production-proof
9
+ Merge pull request #160 from DrunkkToys/codex/release-patch-0.24.28
10
+ Fix clean CI sync for generated modules
11
+ Fix CI sync for generated modules
12
+ Fix CI artifact sync
13
+ Sync generated flow rules
14
+ Merge remote-tracking branch 'origin/master' into codex/release-patch-0.24.28
15
+ Fix release CI regressions
16
+ Merge pull request #159 from DrunkkToys/codex/release-patch-0.24.28
17
+ Strengthen cascade lifecycle coverage
18
+ Merge branch 'master' of https://github.com/DrunkkToys/vibeOS into codex/release-patch-0.24.28
19
+
20
+
1
21
  ## 0.24.31
2
22
  - fix: make footer state truthful
3
23
  - fix: quiet greetings should not inherit stale tdd tags
package/dist/vibeOS.js CHANGED
@@ -11276,24 +11276,22 @@ function regimeAwareToolStyleDirective(regime, mode, stress) {
11276
11276
  const normalizedRegime = String(regime || "INIT").toUpperCase();
11277
11277
  const normalizedMode = String(mode || "budget").toLowerCase();
11278
11278
  const stressLabel = stress > 1.5 ? "high stress" : stress > 0.4 ? "elevated stress" : "calm";
11279
- const regimeTone = (() => {
11280
- if (normalizedRegime === "LOOPING") {
11281
- return "The session is looping, so keep descriptions verification-first, state-aware, and loop-breaking.";
11282
- }
11283
- if (normalizedRegime === "CONVERGING" || normalizedRegime === "CLOSED") {
11284
- return "The session is converging, so keep descriptions closure-oriented, exact, and ready for final verification.";
11285
- }
11286
- if (normalizedRegime === "REFINING" || normalizedRegime === "IMPLEMENTING") {
11287
- return "The session is building, so keep descriptions action-oriented, concrete, and tied to the next visible code step.";
11288
- }
11289
- if (normalizedRegime === "REVIEWING" || normalizedRegime === "AUDIT" || normalizedRegime === "FORENSIC") {
11290
- return "The session is reviewing evidence, so keep descriptions investigative, traceable, and focused on proof.";
11291
- }
11292
- if (normalizedRegime === "RESEARCH" || normalizedRegime === "DESIGNING" || normalizedRegime === "EXPLORING" || normalizedRegime === "DIVERGENT" || normalizedRegime === "INIT") {
11293
- return "The session is exploring, so keep descriptions discovery-oriented, specific, and lightweight.";
11294
- }
11295
- return "The session should stay aligned to the active regime and avoid generic filler.";
11296
- })();
11279
+ const regimeToneByName = {
11280
+ INIT: "The session is starting, so keep descriptions lightweight, status-oriented, and easy to scan.",
11281
+ DIVERGENT: "The session is branching, so keep descriptions exploratory and open to alternatives without sounding vague.",
11282
+ EXPLORING: "The session is investigating, so keep descriptions discovery-oriented, specific, and lightweight.",
11283
+ REFINING: "The session is polishing implementation, so keep descriptions action-oriented, concrete, and tied to the next visible code step.",
11284
+ IMPLEMENTING: "The session is executing implementation work, so keep descriptions exact, build-focused, and next-step driven.",
11285
+ RESEARCH: "The session is researching, so keep descriptions evidence-seeking, careful, and explicit about what was checked.",
11286
+ REVIEWING: "The session is reviewing, so keep descriptions audit-style, traceable, and focused on proof.",
11287
+ DESIGNING: "The session is designing, so keep descriptions structured, intent-driven, and aligned to the target shape.",
11288
+ CONVERGING: "The session is converging, so keep descriptions closure-oriented, exact, and ready for final verification.",
11289
+ CLOSED: "The session is closing, so keep descriptions final, concise, and clearly outcome-focused.",
11290
+ LOOPING: "The session is looping, so keep descriptions verification-first, state-aware, and loop-breaking.",
11291
+ AUDIT: "The session is auditing, so keep descriptions evidence-first, compliance-aware, and traceable.",
11292
+ FORENSIC: "The session is doing forensic work, so keep descriptions investigative, reproducible, and proof-heavy."
11293
+ };
11294
+ const regimeTone = regimeToneByName[normalizedRegime] || "The session should stay aligned to the active regime and avoid generic filler.";
11297
11295
  return `[tool style: dopamine] Active regime: ${normalizedRegime}; mode: ${normalizedMode}; stress: ${stressLabel}. When calling the bash tool, use a short, calm, progress-focused description that matches the current regime. ${regimeTone} Name the user-visible milestone being advanced, keep the wording human, and avoid hype or raw technical labels. Combine independent bash commands into a single call with && or ;.`;
11298
11296
  }
11299
11297
  function flowTodosDirective() {
@@ -11576,6 +11574,21 @@ var REGIME_TAG = {
11576
11574
  AUDIT: "AUDT",
11577
11575
  FORENSIC: "FRNC"
11578
11576
  };
11577
+ var REGIME_ICON = {
11578
+ INIT: "\u25CC",
11579
+ DIVERGENT: "\u21C4",
11580
+ EXPLORING: "\u2315",
11581
+ REFINING: "\u270E",
11582
+ IMPLEMENTING: "\u2699",
11583
+ RESEARCH: "\u2301",
11584
+ REVIEWING: "\u2713",
11585
+ DESIGNING: "\u25EB",
11586
+ CONVERGING: "\u27F2",
11587
+ CLOSED: "\u25C6",
11588
+ LOOPING: "\u21BB",
11589
+ AUDIT: "\u2611",
11590
+ FORENSIC: "\u27C1"
11591
+ };
11579
11592
  var BRAND_MAP = {
11580
11593
  vibeultrax: "VibeUltraX",
11581
11594
  vibeqmax: "VibeQMaX",
@@ -11597,6 +11610,9 @@ function resolveBrand(optMode, activeSlot) {
11597
11610
  function resolveTierIcon(slot) {
11598
11611
  return TIER_ICON[slot] || "\u26A1";
11599
11612
  }
11613
+ function resolveRegimeIcon(subRegime) {
11614
+ return REGIME_ICON[String(subRegime || "").toUpperCase()] || "\u25E6";
11615
+ }
11600
11616
  function formatModeLabel(optMode) {
11601
11617
  const normalized = String(optMode || "").toLowerCase();
11602
11618
  if (!normalized)
@@ -11677,8 +11693,9 @@ function buildFooterLine(input) {
11677
11693
  const { activeSlot, sessionSlot, providerLabel, modelName, ltTotal, ltTrend, vibeBrand, optMode, flashIcon, enfTags, vectorChangedSlot, subRegime } = input;
11678
11694
  const tierIcon = resolveTierIcon(activeSlot);
11679
11695
  const regimeTag = subRegime ? REGIME_TAG[subRegime] || subRegime.slice(0, 4) : null;
11696
+ const regimeIcon = subRegime ? resolveRegimeIcon(subRegime) : null;
11680
11697
  const modeLabel = formatModeLabel(optMode);
11681
- let line = `\u2014 ${tierIcon} ${activeSlot} | ${providerLabel} | ${modelName}${regimeTag ? ` \u25B6 ${regimeTag}` : ""}`;
11698
+ let line = `\u2014 ${tierIcon} ${activeSlot} | ${providerLabel} | ${modelName}${regimeTag ? ` \u25B6 ${regimeIcon} ${regimeTag}` : ""}`;
11682
11699
  if (ltTotal > 0) {
11683
11700
  const savingsPulse = formatSavingsPulse(ltTotal, ltTrend);
11684
11701
  if (savingsPulse)
@@ -12019,7 +12036,7 @@ import { writeFileSync as writeFileSync14, appendFileSync as appendFileSync6, ex
12019
12036
  import { join as join17, dirname as dirname12, basename as basename4 } from "node:path";
12020
12037
  import { createHash as createHash5 } from "node:crypto";
12021
12038
 
12022
- // src/lib/cost-anomaly.js
12039
+ // src/lib/cost-anomaly.ts
12023
12040
  var COST_WINDOW_SIZE = 20;
12024
12041
  var COST_ANOMALY_THRESHOLD = 3;
12025
12042
  var COST_WARMUP_SAMPLES = 5;
@@ -12030,26 +12047,21 @@ var CostAnomalyDetector = class {
12030
12047
  currentAnomalyCost = 0;
12031
12048
  currentAnomalyMean = 0;
12032
12049
  record(cost) {
12033
- if (this.disabled)
12034
- return;
12050
+ if (this.disabled) return;
12035
12051
  this.costHistory.push(cost);
12036
12052
  if (this.costHistory.length > COST_WINDOW_SIZE) {
12037
12053
  this.costHistory.shift();
12038
12054
  }
12039
12055
  }
12040
12056
  get mean() {
12041
- if (this.costHistory.length === 0)
12042
- return 0;
12057
+ if (this.costHistory.length === 0) return 0;
12043
12058
  return this.costHistory.reduce((a, b) => a + b, 0) / this.costHistory.length;
12044
12059
  }
12045
12060
  checkAnomaly(model, cost) {
12046
- if (this.disabled)
12047
- return false;
12048
- if (this.costHistory.length < COST_WARMUP_SAMPLES)
12049
- return false;
12061
+ if (this.disabled) return false;
12062
+ if (this.costHistory.length < COST_WARMUP_SAMPLES) return false;
12050
12063
  const avg = this.mean;
12051
- if (avg <= 0 || cost <= avg)
12052
- return false;
12064
+ if (avg <= 0 || cost <= avg) return false;
12053
12065
  const ratio = cost / avg;
12054
12066
  if (ratio > COST_ANOMALY_THRESHOLD) {
12055
12067
  this.currentAnomalyModel = model;
@@ -12071,8 +12083,7 @@ var CostAnomalyDetector = class {
12071
12083
  };
12072
12084
  var _costDetector = null;
12073
12085
  function getCostAnomalyDetector() {
12074
- if (!_costDetector)
12075
- _costDetector = new CostAnomalyDetector();
12086
+ if (!_costDetector) _costDetector = new CostAnomalyDetector();
12076
12087
  return _costDetector;
12077
12088
  }
12078
12089
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.24.31",
3
+ "version": "0.24.32",
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",