vibeostheog 0.24.29 → 0.24.30

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,9 +1,13 @@
1
+ ## 0.24.30
2
+ - fix: prefer trinity slot in footer
3
+
4
+
1
5
  ## 0.24.29
2
6
  - feat: promote data-backed experimental regimes (#158)
3
7
  - feat: promote data-backed experimental regimes
8
+ - fix: prefer trinity slot in footer
4
9
  - test: add live lifecycle regression
5
10
  - chore: v0.24.28
6
- Merge pull request #160 from DrunkkToys/codex/release-patch-0.24.28
7
11
  Fix clean CI sync for generated modules
8
12
  Fix CI sync for generated modules
9
13
  Fix CI artifact sync
package/README.md CHANGED
@@ -104,7 +104,7 @@ Benchmarked on 1000 simulated questions across 20 runs, using model accuracies f
104
104
  | **Flow enforcer** | Pattern-rule checks on write/edit. Extracts TODO/FIXME into append-only queue. |
105
105
  | **TDD enforcer** | Auto-creates test skeletons for changed source. Strict mode: TODO tests fail. |
106
106
  | **Pattern learner** | Tracks recurring struggle/routine patterns per project. |
107
- | **VibeBoX** | 7 sub-regimes, 11 features per turn, 4 loop intervention levels, PIVOT/SWITCH detection. Auto-mode maps regime to optimization mode. |
107
+ | **VibeBoX** | 7 canonical sub-regimes plus promoted ML/runtime regimes (IMPLEMENTING, RESEARCH, REVIEWING, DESIGNING, AUDIT, FORENSIC), 11 features per turn, 4 loop intervention levels, PIVOT/SWITCH detection. Auto-mode maps regime to optimization mode. |
108
108
  | **Stress-aware routing** | Stress gauge in footer. Stress > 1.5 escalates to quality mode. |
109
109
  | **Cache savings** | Separate cache_savings_usd tracking for scratchpad cache hits. |
110
110
  | **Report tools** | report-save, report-list, report-read, research-audit. |
@@ -238,15 +238,20 @@ When the remote API is unreachable, the plugin degrades gracefully to rule-based
238
238
 
239
239
  ### VibeBoX Decision Engine
240
240
 
241
- 7 sub-regimes (INIT, DIVERGENT, EXPLORING, REFINING, CONVERGING, CLOSED, LOOPING). Classification via entropy trends, action consistency, feature contradiction, embedding drift. 11 derived features per turn. 4 loop intervention levels. PIVOT/SWITCH detection. Outcome tracking from satisfaction signals.
241
+ Canonical blackbox core: 7 sub-regimes (INIT, DIVERGENT, EXPLORING, REFINING, CONVERGING, CLOSED, LOOPING). The runtime and ML layers also surface promoted regime tags for real workflow signals: IMPLEMENTING, RESEARCH, REVIEWING, DESIGNING, AUDIT, and FORENSIC. Classification uses entropy trends, action consistency, feature contradiction, and embedding drift. 11 derived features per turn. 4 loop intervention levels. PIVOT/SWITCH detection. Outcome tracking from satisfaction signals.
242
242
 
243
243
  Regime -> mode mapping via syncControlSettings():
244
244
 
245
245
  | Regime | Mode | Enforce | Flow | TDD | Tier | Think |
246
246
  |--------|------|---------|------|-----|------|-------|
247
247
  | INIT / DIVERGENT / EXPLORING / REFINING | vibemax (default) | relaxed | audit | lazy | cheap | off |
248
+ | IMPLEMENTING | quality | strict | strict | quality | brain | full |
249
+ | RESEARCH / DESIGNING | longrun | relaxed | audit | lazy | medium | off |
250
+ | REVIEWING | audit | relaxed | audit | lazy | medium | brief |
248
251
  | CONVERGING / CLOSED | quality | strict | strict | quality | brain | full |
249
252
  | LOOPING | speed | relaxed | audit | lazy | medium | off |
253
+ | AUDIT | audit | relaxed | audit | lazy | medium | brief |
254
+ | FORENSIC | forensic | relaxed | audit | lazy | medium | full |
250
255
 
251
256
  Stress > 1.5 escalates any regime to quality.
252
257
 
package/dist/vibeOS.js CHANGED
@@ -5290,6 +5290,12 @@ function resolveExecutionIdentity(modelId, directory3 = "") {
5290
5290
  model_label: shortModelName(resolved || raw)
5291
5291
  };
5292
5292
  }
5293
+ function resolveTrinityDisplayModel(directory3 = "", activeSlot = "", liveModel = "", currentModelId = "") {
5294
+ const slot = String(activeSlot || "").trim();
5295
+ const slotModel = slot === "brain" ? TRINITY_BRAIN || "" : slot === "medium" ? TRINITY_MEDIUM || "" : slot === "cheap" ? TRINITY_CHEAP || "" : "";
5296
+ const raw = [slotModel, liveModel, currentModelId].map((value) => String(value || "").trim()).find(Boolean) || "";
5297
+ return resolveDisplayModelId(raw, directory3) || raw;
5298
+ }
5293
5299
  function _providerOfModel(modelId, fallbackProvider = "") {
5294
5300
  const provider = getModelProvider(modelId);
5295
5301
  return provider || String(fallbackProvider || "").trim();
@@ -11856,13 +11862,13 @@ async function _appendFooter(input, output, directory3) {
11856
11862
  if (!liveModel) {
11857
11863
  liveModel = readConfig(directory3) || readConfig(join15(process.env.HOME || "", ".config", "opencode")) || process?.env?.OPENCODE_MODEL || "";
11858
11864
  }
11859
- const displayModel = resolveDisplayModelId(liveModel || brainModel || currentModel || "", directory3) || liveModel || brainModel || currentModel;
11865
+ const displayModel = resolveTrinityDisplayModel(directory3, slot, liveModel, currentModel) || brainModel || liveModel || currentModel;
11860
11866
  const resolvedModel = displayModel || liveModel || brainModel || currentModel || "";
11861
11867
  if (resolvedModel && resolvedModel !== currentModel) {
11862
11868
  setCurrentModel(resolvedModel);
11863
11869
  setCurrentTier(classify(resolvedModel));
11864
11870
  }
11865
- const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", directory3);
11871
+ const execution = resolveExecutionIdentity(displayModel || resolvedModel || "", directory3);
11866
11872
  let modelTag = `[${shortModelName(displayModel)}]`;
11867
11873
  const _workerModel = slot === "brain" ? TRINITY_MEDIUM : null;
11868
11874
  const totalTurns = (sesModelTurns?.brain || 0) + (sesModelTurns?.worker || 0);
@@ -11990,7 +11996,7 @@ import { writeFileSync as writeFileSync14, appendFileSync as appendFileSync6, ex
11990
11996
  import { join as join17, dirname as dirname12, basename as basename4 } from "node:path";
11991
11997
  import { createHash as createHash5 } from "node:crypto";
11992
11998
 
11993
- // src/lib/cost-anomaly.ts
11999
+ // src/lib/cost-anomaly.js
11994
12000
  var COST_WINDOW_SIZE = 20;
11995
12001
  var COST_ANOMALY_THRESHOLD = 3;
11996
12002
  var COST_WARMUP_SAMPLES = 5;
@@ -12001,21 +12007,26 @@ var CostAnomalyDetector = class {
12001
12007
  currentAnomalyCost = 0;
12002
12008
  currentAnomalyMean = 0;
12003
12009
  record(cost) {
12004
- if (this.disabled) return;
12010
+ if (this.disabled)
12011
+ return;
12005
12012
  this.costHistory.push(cost);
12006
12013
  if (this.costHistory.length > COST_WINDOW_SIZE) {
12007
12014
  this.costHistory.shift();
12008
12015
  }
12009
12016
  }
12010
12017
  get mean() {
12011
- if (this.costHistory.length === 0) return 0;
12018
+ if (this.costHistory.length === 0)
12019
+ return 0;
12012
12020
  return this.costHistory.reduce((a, b) => a + b, 0) / this.costHistory.length;
12013
12021
  }
12014
12022
  checkAnomaly(model, cost) {
12015
- if (this.disabled) return false;
12016
- if (this.costHistory.length < COST_WARMUP_SAMPLES) return false;
12023
+ if (this.disabled)
12024
+ return false;
12025
+ if (this.costHistory.length < COST_WARMUP_SAMPLES)
12026
+ return false;
12017
12027
  const avg = this.mean;
12018
- if (avg <= 0 || cost <= avg) return false;
12028
+ if (avg <= 0 || cost <= avg)
12029
+ return false;
12019
12030
  const ratio = cost / avg;
12020
12031
  if (ratio > COST_ANOMALY_THRESHOLD) {
12021
12032
  this.currentAnomalyModel = model;
@@ -12037,7 +12048,8 @@ var CostAnomalyDetector = class {
12037
12048
  };
12038
12049
  var _costDetector = null;
12039
12050
  function getCostAnomalyDetector() {
12040
- if (!_costDetector) _costDetector = new CostAnomalyDetector();
12051
+ if (!_costDetector)
12052
+ _costDetector = new CostAnomalyDetector();
12041
12053
  return _costDetector;
12042
12054
  }
12043
12055
 
@@ -14002,13 +14014,13 @@ var onToolExecuteAfter = async (input, output) => {
14002
14014
  if (!liveModel) {
14003
14015
  liveModel = readConfig(projectDirectory) || readConfig(join17(process.env.HOME || "", ".config", "opencode")) || process?.env?.OPENCODE_MODEL || "";
14004
14016
  }
14005
- const displayModel = resolveDisplayModelId(liveModel || currentModel || "", projectDirectory) || liveModel || currentModel;
14017
+ const displayModel = resolveTrinityDisplayModel(projectDirectory, selNow.active_slot || "", liveModel, currentModel) || liveModel || currentModel;
14006
14018
  const resolvedModel = displayModel || liveModel || currentModel || "";
14007
14019
  if (resolvedModel && resolvedModel !== currentModel) {
14008
14020
  setCurrentModel(resolvedModel);
14009
14021
  setCurrentTier(classify(resolvedModel));
14010
14022
  }
14011
- const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", projectDirectory);
14023
+ const execution = resolveExecutionIdentity(displayModel || resolvedModel || "", projectDirectory);
14012
14024
  const currentSid = _OC_SID;
14013
14025
  const currentSubRegime = loadBlackboxState()?.sessions?.[currentSid]?.sub_regime || classifyTurnSimple2(latestUserIntent || "");
14014
14026
  const bbMode = resolveEnforcementMode();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.24.29",
3
+ "version": "0.24.30",
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",