vibeostheog 0.24.27 → 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,3 +1,24 @@
1
+ ## 0.24.30
2
+ - fix: prefer trinity slot in footer
3
+
4
+
5
+ ## 0.24.29
6
+ - feat: promote data-backed experimental regimes (#158)
7
+ - feat: promote data-backed experimental regimes
8
+ - fix: prefer trinity slot in footer
9
+ - test: add live lifecycle regression
10
+ - chore: v0.24.28
11
+ Fix clean CI sync for generated modules
12
+ Fix CI sync for generated modules
13
+ Fix CI artifact sync
14
+ Sync generated flow rules
15
+ Merge remote-tracking branch 'origin/master' into codex/release-patch-0.24.28
16
+ Fix release CI regressions
17
+ Merge pull request #159 from DrunkkToys/codex/release-patch-0.24.28
18
+ Strengthen cascade lifecycle coverage
19
+ Merge branch 'master' of https://github.com/DrunkkToys/vibeOS into codex/release-patch-0.24.28
20
+
21
+
1
22
  ## 0.24.25
2
23
  - fix: heal stale vibelitex recovery across cascade
3
24
 
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
@@ -454,6 +454,12 @@ function autoSelectMode(subRegime, stressMultiplier) {
454
454
  return "speed";
455
455
  if (regime === "CONVERGING" || regime === "CLOSED")
456
456
  return "quality";
457
+ if (regime === "IMPLEMENTING")
458
+ return "quality";
459
+ if (regime === "RESEARCH" || regime === "DESIGNING")
460
+ return "longrun";
461
+ if (regime === "REVIEWING")
462
+ return "audit";
457
463
  if (stressMultiplier && stressMultiplier > QUALITY_STRESS_THRESHOLD)
458
464
  return "quality";
459
465
  return "litex";
@@ -515,6 +521,58 @@ var init_meta_controller = __esm({
515
521
  context7_urgency: "preferred",
516
522
  wbp_verbosity: "normal"
517
523
  },
524
+ IMPLEMENTING: {
525
+ enforcement_mode: "strict",
526
+ enforcement_reason: "implementation work \u2014 validate code changes and keep tests on",
527
+ flow_mode: "strict",
528
+ flow_focus: ["write-edit-check", "no-untouched-files"],
529
+ tdd_mode: "strict",
530
+ tdd_focus: ["skeleton-on-write", "assertion-check"],
531
+ tier_bias: "brain",
532
+ thinking_mode: "brief",
533
+ stress_multiplier: 1.3,
534
+ context7_urgency: "required",
535
+ wbp_verbosity: "normal"
536
+ },
537
+ RESEARCH: {
538
+ enforcement_mode: "normal",
539
+ enforcement_reason: "research mode \u2014 collect evidence before changing anything",
540
+ flow_mode: "audit",
541
+ flow_focus: ["trace-audit"],
542
+ tdd_mode: "lazy",
543
+ tdd_focus: [],
544
+ tier_bias: "brain",
545
+ thinking_mode: "full",
546
+ stress_multiplier: 1.2,
547
+ context7_urgency: "required",
548
+ wbp_verbosity: "detailed"
549
+ },
550
+ REVIEWING: {
551
+ enforcement_mode: "strict",
552
+ enforcement_reason: "review mode \u2014 validate diffs and surface risks",
553
+ flow_mode: "strict",
554
+ flow_focus: ["write-edit-check", "no-untouched-files", "no-lgtm"],
555
+ tdd_mode: "quality",
556
+ tdd_focus: ["full-coverage", "edge-cases"],
557
+ tier_bias: "brain",
558
+ thinking_mode: "brief",
559
+ stress_multiplier: 1.1,
560
+ context7_urgency: "required",
561
+ wbp_verbosity: "normal"
562
+ },
563
+ DESIGNING: {
564
+ enforcement_mode: "normal",
565
+ enforcement_reason: "design mode \u2014 explore architecture and tradeoffs",
566
+ flow_mode: "audit",
567
+ flow_focus: ["trace-audit"],
568
+ tdd_mode: "normal",
569
+ tdd_focus: [],
570
+ tier_bias: "brain",
571
+ thinking_mode: "full",
572
+ stress_multiplier: 1.1,
573
+ context7_urgency: "required",
574
+ wbp_verbosity: "detailed"
575
+ },
518
576
  CONVERGING: {
519
577
  enforcement_mode: "strict",
520
578
  enforcement_reason: "user about to commit \u2014 full enforcement, catch violations",
@@ -5232,6 +5290,12 @@ function resolveExecutionIdentity(modelId, directory3 = "") {
5232
5290
  model_label: shortModelName(resolved || raw)
5233
5291
  };
5234
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
+ }
5235
5299
  function _providerOfModel(modelId, fallbackProvider = "") {
5236
5300
  const provider = getModelProvider(modelId);
5237
5301
  return provider || String(fallbackProvider || "").trim();
@@ -6292,7 +6356,7 @@ import { join as join7, dirname as dirname8 } from "node:path";
6292
6356
 
6293
6357
  // src/vibeOS-lib/blackbox/resolution-tracker.js
6294
6358
  var ResolutionTracker = class _ResolutionTracker {
6295
- static SUB_REGIMES = ["INIT", "DIVERGENT", "EXPLORING", "REFINING", "CONVERGING", "CLOSED", "LOOPING"];
6359
+ static SUB_REGIMES = ["INIT", "DIVERGENT", "EXPLORING", "REFINING", "IMPLEMENTING", "RESEARCH", "REVIEWING", "DESIGNING", "CONVERGING", "CLOSED", "LOOPING"];
6296
6360
  sessionId;
6297
6361
  maxHistory;
6298
6362
  history;
@@ -6902,6 +6966,12 @@ function autoSelectMode2(subRegime, stressMultiplier) {
6902
6966
  return "speed";
6903
6967
  if (regime === "CONVERGING" || regime === "CLOSED")
6904
6968
  return "quality";
6969
+ if (regime === "IMPLEMENTING")
6970
+ return "quality";
6971
+ if (regime === "RESEARCH" || regime === "DESIGNING")
6972
+ return "longrun";
6973
+ if (regime === "REVIEWING")
6974
+ return "audit";
6905
6975
  if (stress > QUALITY_STRESS_THRESHOLD2)
6906
6976
  return "quality";
6907
6977
  return "vibelitex";
@@ -10461,6 +10531,10 @@ function recordSaving(tool2, reason, saveEst, meta = {}) {
10461
10531
  const w = ses.warns[i];
10462
10532
  if (w?.key === warnKey && now - w.ts < WARN_DEDUPE_WINDOW_MS) {
10463
10533
  w.count = (w.count || 1) + 1;
10534
+ w.est_savings_usd = roundUsd(Number(w.est_savings_usd || 0) + saveEst);
10535
+ w.saveEst = roundUsd(Number(w.saveEst || 0) + saveEst);
10536
+ ses.total_savings_usd = roundUsd(Number(ses.total_savings_usd || 0) + saveEst);
10537
+ s.lifetime.total_savings_usd = roundUsd(Number(s.lifetime.total_savings_usd || 0) + saveEst);
10464
10538
  deduped = true;
10465
10539
  }
10466
10540
  }
@@ -11474,6 +11548,10 @@ var REGIME_TAG = {
11474
11548
  DIVERGENT: "DVRG",
11475
11549
  EXPLORING: "XPLR",
11476
11550
  REFINING: "RFNE",
11551
+ IMPLEMENTING: "IMPL",
11552
+ RESEARCH: "RSCH",
11553
+ REVIEWING: "RVW",
11554
+ DESIGNING: "DSGN",
11477
11555
  CONVERGING: "CVGE",
11478
11556
  CLOSED: "CLSD",
11479
11557
  LOOPING: "LOOP",
@@ -11501,6 +11579,28 @@ function resolveBrand(optMode, activeSlot) {
11501
11579
  function resolveTierIcon(slot) {
11502
11580
  return TIER_ICON[slot] || "\u26A1";
11503
11581
  }
11582
+ function formatModeLabel(optMode) {
11583
+ const normalized = String(optMode || "").toLowerCase();
11584
+ if (!normalized)
11585
+ return "";
11586
+ if (normalized === "vibemax" || normalized === "vibelitex" || normalized === "budget")
11587
+ return "Budget";
11588
+ if (normalized === "vibeqmax" || normalized === "quality")
11589
+ return "Quality";
11590
+ if (normalized === "vibeultrax")
11591
+ return "VibeUltraX";
11592
+ if (normalized === "speed")
11593
+ return "Speed";
11594
+ if (normalized === "longrun")
11595
+ return "Longrun";
11596
+ if (normalized === "audit")
11597
+ return "Audit";
11598
+ if (normalized === "forensic")
11599
+ return "Forensic";
11600
+ if (normalized === "balanced")
11601
+ return "Balanced";
11602
+ return normalized.charAt(0).toUpperCase() + normalized.slice(1);
11603
+ }
11504
11604
  function formatVectorPulse(vectorChangedSlot) {
11505
11605
  if (!vectorChangedSlot)
11506
11606
  return "";
@@ -11559,6 +11659,7 @@ function buildFooterLine(input) {
11559
11659
  const { activeSlot, sessionSlot, providerLabel, modelName, ltTotal, ltTrend, vibeBrand, optMode, flashIcon, enfTags, vectorChangedSlot, subRegime } = input;
11560
11660
  const tierIcon = resolveTierIcon(activeSlot);
11561
11661
  const regimeTag = subRegime ? REGIME_TAG[subRegime] || subRegime.slice(0, 4) : null;
11662
+ const modeLabel = formatModeLabel(optMode);
11562
11663
  let line = `\u2014 ${tierIcon} ${activeSlot} | ${providerLabel} | ${modelName}${regimeTag ? ` \u25B6 ${regimeTag}` : ""}`;
11563
11664
  if (ltTotal > 0) {
11564
11665
  const savingsPulse = formatSavingsPulse(ltTotal, ltTrend);
@@ -11567,7 +11668,7 @@ function buildFooterLine(input) {
11567
11668
  }
11568
11669
  line += ` | ${vibeBrand}${flashIcon}`;
11569
11670
  if (optMode && optMode !== "auto") {
11570
- line += ` ${optMode}`;
11671
+ line += ` ${modeLabel}`;
11571
11672
  }
11572
11673
  if (vectorChangedSlot && vectorChangedSlot !== activeSlot) {
11573
11674
  line += ` | ${formatVectorPulse(vectorChangedSlot)}`;
@@ -11761,13 +11862,13 @@ async function _appendFooter(input, output, directory3) {
11761
11862
  if (!liveModel) {
11762
11863
  liveModel = readConfig(directory3) || readConfig(join15(process.env.HOME || "", ".config", "opencode")) || process?.env?.OPENCODE_MODEL || "";
11763
11864
  }
11764
- const displayModel = resolveDisplayModelId(liveModel || brainModel || currentModel || "", directory3) || liveModel || brainModel || currentModel;
11865
+ const displayModel = resolveTrinityDisplayModel(directory3, slot, liveModel, currentModel) || brainModel || liveModel || currentModel;
11765
11866
  const resolvedModel = displayModel || liveModel || brainModel || currentModel || "";
11766
11867
  if (resolvedModel && resolvedModel !== currentModel) {
11767
11868
  setCurrentModel(resolvedModel);
11768
11869
  setCurrentTier(classify(resolvedModel));
11769
11870
  }
11770
- const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", directory3);
11871
+ const execution = resolveExecutionIdentity(displayModel || resolvedModel || "", directory3);
11771
11872
  let modelTag = `[${shortModelName(displayModel)}]`;
11772
11873
  const _workerModel = slot === "brain" ? TRINITY_MEDIUM : null;
11773
11874
  const totalTurns = (sesModelTurns?.brain || 0) + (sesModelTurns?.worker || 0);
@@ -11824,7 +11925,7 @@ async function _appendFooter(input, output, directory3) {
11824
11925
  const activeSlot = selNowFooter.active_slot || "brain";
11825
11926
  const flashIcon = isApiConnected2() ? " \u26A1" : "";
11826
11927
  const displayMode = autoSelectMode2(currentSubRegime, _footerStress);
11827
- const vibeBrand = resolveBrand(displayMode, activeSlot);
11928
+ const vibeBrand = resolveBrand(loadOptimizationMode() || displayMode, activeSlot);
11828
11929
  const vibeLine = buildFooterLine({
11829
11930
  activeSlot,
11830
11931
  providerLabel: execution.provider_label,
@@ -13913,13 +14014,13 @@ var onToolExecuteAfter = async (input, output) => {
13913
14014
  if (!liveModel) {
13914
14015
  liveModel = readConfig(projectDirectory) || readConfig(join17(process.env.HOME || "", ".config", "opencode")) || process?.env?.OPENCODE_MODEL || "";
13915
14016
  }
13916
- const displayModel = resolveDisplayModelId(liveModel || currentModel || "", projectDirectory) || liveModel || currentModel;
14017
+ const displayModel = resolveTrinityDisplayModel(projectDirectory, selNow.active_slot || "", liveModel, currentModel) || liveModel || currentModel;
13917
14018
  const resolvedModel = displayModel || liveModel || currentModel || "";
13918
14019
  if (resolvedModel && resolvedModel !== currentModel) {
13919
14020
  setCurrentModel(resolvedModel);
13920
14021
  setCurrentTier(classify(resolvedModel));
13921
14022
  }
13922
- const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", projectDirectory);
14023
+ const execution = resolveExecutionIdentity(displayModel || resolvedModel || "", projectDirectory);
13923
14024
  const currentSid = _OC_SID;
13924
14025
  const currentSubRegime = loadBlackboxState()?.sessions?.[currentSid]?.sub_regime || classifyTurnSimple2(latestUserIntent || "");
13925
14026
  const bbMode = resolveEnforcementMode();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.24.27",
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",