vibeostheog 0.24.30 → 0.24.31

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,22 +1,7 @@
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
1
+ ## 0.24.31
2
+ - fix: make footer state truthful
3
+ - fix: quiet greetings should not inherit stale tdd tags
4
+ - test: add live regression for stale config footer mismatch
20
5
 
21
6
 
22
7
  ## 0.24.25
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 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. |
107
+ | **VibeBoX** | 7 sub-regimes, 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,20 +238,15 @@ When the remote API is unreachable, the plugin degrades gracefully to rule-based
238
238
 
239
239
  ### VibeBoX Decision Engine
240
240
 
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.
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.
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 |
251
248
  | CONVERGING / CLOSED | quality | strict | strict | quality | brain | full |
252
249
  | LOOPING | speed | relaxed | audit | lazy | medium | off |
253
- | AUDIT | audit | relaxed | audit | lazy | medium | brief |
254
- | FORENSIC | forensic | relaxed | audit | lazy | medium | full |
255
250
 
256
251
  Stress > 1.5 escalates any regime to quality.
257
252
 
package/dist/vibeOS.js CHANGED
@@ -5290,12 +5290,6 @@ 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
- }
5299
5293
  function _providerOfModel(modelId, fallbackProvider = "") {
5300
5294
  const provider = getModelProvider(modelId);
5301
5295
  return provider || String(fallbackProvider || "").trim();
@@ -11278,6 +11272,30 @@ function thinkingDirective(level) {
11278
11272
  }
11279
11273
  return `[thinking policy] Reasoning depth: OFF (manually set, ${creditNote}). Respond directly, avoid extra scratch work, and reserve extended thinking for when the user asks for it.`;
11280
11274
  }
11275
+ function regimeAwareToolStyleDirective(regime, mode, stress) {
11276
+ const normalizedRegime = String(regime || "INIT").toUpperCase();
11277
+ const normalizedMode = String(mode || "budget").toLowerCase();
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
+ })();
11297
+ 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
+ }
11281
11299
  function flowTodosDirective() {
11282
11300
  const pendingTodos = loadTodos().filter((t) => t.status === "pending").length;
11283
11301
  if (pendingTodos === 0)
@@ -11535,7 +11553,7 @@ var onSystemTransform = async (_input, output) => {
11535
11553
  pushSystem(output, "[vibeOS dashboard display] When the trinity tool returns output starting with '[vibeOS-dashboard]', use the question tool to display that data in a clean, human-readable format. Use the question field (not the header) to show the dashboard data. Format it with clear sections separated by blank lines, aligned columns with spaces, and plain text only. The header should be 'vibeOS Dashboard'. Include only one option in options: {label: 'Dismiss', description: ''}. Strip the '[vibeOS-dashboard]' marker line before displaying.");
11536
11554
  }
11537
11555
  if (!oneShot("vibeos_dopamine_style_" + fp2)) {
11538
- pushSystem(output, "[tool style: dopamine] When calling the bash tool, use a short, calm, progress-focused description that names the user-visible milestone being advanced. Combine independent bash commands into a single call with && or ;. Keep the wording human and avoid hype or raw technical labels.");
11556
+ pushSystem(output, regimeAwareToolStyleDirective(currentSubRegime, displayMode, stressScore));
11539
11557
  }
11540
11558
  } catch (err) {
11541
11559
  console.error(`[vibeOS] system.transform failed: ${err.message}`);
@@ -11639,7 +11657,7 @@ function formatSavingsPulse(amountUsd, trend) {
11639
11657
  }
11640
11658
  function buildEnforcementTags(opts) {
11641
11659
  const tags = [];
11642
- if (opts.bbMode === "relaxed") {
11660
+ if (opts.quietIntent || opts.bbMode === "relaxed") {
11643
11661
  tags.push("[Q&A]");
11644
11662
  } else {
11645
11663
  if (opts.delegationEnforce)
@@ -11709,6 +11727,10 @@ function loadSelection3() {
11709
11727
  return { active_slot: "medium", enabled: true, delegation_enforce: true, flow_enabled: true, flow_enforce: true, tdd_enforce: false, tdd_strict: false };
11710
11728
  }
11711
11729
  }
11730
+ function isGreetingLike(text) {
11731
+ const value = String(text || "").trim().toLowerCase();
11732
+ return value === "hi" || value === "hello" || value === "hey" || value === "yo" || /^hi[!.?\s]*$/.test(value) || /^hello[!.?\s]*$/.test(value) || /^hey[!.?\s]*$/.test(value);
11733
+ }
11712
11734
  function readLifetimeSavings2() {
11713
11735
  try {
11714
11736
  reconcileStateFromLedger();
@@ -11862,13 +11884,13 @@ async function _appendFooter(input, output, directory3) {
11862
11884
  if (!liveModel) {
11863
11885
  liveModel = readConfig(directory3) || readConfig(join15(process.env.HOME || "", ".config", "opencode")) || process?.env?.OPENCODE_MODEL || "";
11864
11886
  }
11865
- const displayModel = resolveTrinityDisplayModel(directory3, slot, liveModel, currentModel) || brainModel || liveModel || currentModel;
11887
+ const displayModel = resolveDisplayModelId(liveModel || brainModel || currentModel || "", directory3) || liveModel || brainModel || currentModel;
11866
11888
  const resolvedModel = displayModel || liveModel || brainModel || currentModel || "";
11867
11889
  if (resolvedModel && resolvedModel !== currentModel) {
11868
11890
  setCurrentModel(resolvedModel);
11869
11891
  setCurrentTier(classify(resolvedModel));
11870
11892
  }
11871
- const execution = resolveExecutionIdentity(displayModel || resolvedModel || "", directory3);
11893
+ const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", directory3);
11872
11894
  let modelTag = `[${shortModelName(displayModel)}]`;
11873
11895
  const _workerModel = slot === "brain" ? TRINITY_MEDIUM : null;
11874
11896
  const totalTurns = (sesModelTurns?.brain || 0) + (sesModelTurns?.worker || 0);
@@ -11907,14 +11929,15 @@ async function _appendFooter(input, output, directory3) {
11907
11929
  }
11908
11930
  const selNowFooter = loadSelection3();
11909
11931
  const normalizedIntent = classifyTurnSimple2(latestUserIntent || "");
11910
- const currentSubRegime = _latestBlackboxState?.sub_regime || normalizedIntent;
11932
+ const currentSubRegime2 = _latestBlackboxState?.sub_regime || normalizedIntent;
11911
11933
  const bbMode = resolveEnforcementMode();
11912
11934
  const enfTags = buildEnforcementTags({
11913
11935
  delegationEnforce: selNowFooter.delegation_enforce,
11914
11936
  flowEnforce: selNowFooter.flow_enforce,
11915
11937
  tddEnforce: selNowFooter.tdd_enforce,
11916
11938
  bbMode,
11917
- modelLocked: _modelLocked
11939
+ modelLocked: _modelLocked,
11940
+ quietIntent: isGreetingLike(latestUserIntent || "")
11918
11941
  });
11919
11942
  const stripped = text.replace(/\u2014 [^\u2014]+ \u2014\s*/g, "").trimEnd();
11920
11943
  if (stripped !== text)
@@ -11924,8 +11947,8 @@ async function _appendFooter(input, output, directory3) {
11924
11947
  const ltTotal = ltTasks + ltCache;
11925
11948
  const activeSlot = selNowFooter.active_slot || "brain";
11926
11949
  const flashIcon = isApiConnected2() ? " \u26A1" : "";
11927
- const displayMode = autoSelectMode2(currentSubRegime, _footerStress);
11928
- const vibeBrand = resolveBrand(loadOptimizationMode() || displayMode, activeSlot);
11950
+ const displayMode2 = autoSelectMode2(currentSubRegime2, _footerStress);
11951
+ const vibeBrand = resolveBrand(loadOptimizationMode() || displayMode2, activeSlot);
11929
11952
  const vibeLine = buildFooterLine({
11930
11953
  activeSlot,
11931
11954
  providerLabel: execution.provider_label,
@@ -11933,12 +11956,12 @@ async function _appendFooter(input, output, directory3) {
11933
11956
  ltTotal,
11934
11957
  ltTrend: sesTrend,
11935
11958
  vibeBrand,
11936
- optMode: displayMode,
11959
+ optMode: displayMode2,
11937
11960
  flashIcon,
11938
11961
  enfTags,
11939
11962
  sessionSlot,
11940
11963
  vectorChangedSlot: selNowFooter?.vector_changed_slot,
11941
- subRegime: currentSubRegime
11964
+ subRegime: currentSubRegime2
11942
11965
  });
11943
11966
  const footerText = stripped + `
11944
11967
 
@@ -13382,6 +13405,10 @@ function buildTestReminder(filePath) {
13382
13405
  }
13383
13406
 
13384
13407
  // src/lib/hooks/tool-execute.js
13408
+ function isGreetingLike2(text) {
13409
+ const value = String(text || "").trim().toLowerCase();
13410
+ return value === "hi" || value === "hello" || value === "hey" || value === "yo" || /^hi[!.?\s]*$/.test(value) || /^hello[!.?\s]*$/.test(value) || /^hey[!.?\s]*$/.test(value);
13411
+ }
13385
13412
  var BYTES_PER_TOKEN2 = 4;
13386
13413
  var DEBUG_INTERNALS2 = process.env.VIBEOS_DEBUG_INTERNALS === "1";
13387
13414
  var IS_CLI_RUNTIME2 = Boolean(process.stdout?.isTTY || process.stderr?.isTTY || process.stdin?.isTTY);
@@ -14014,26 +14041,27 @@ var onToolExecuteAfter = async (input, output) => {
14014
14041
  if (!liveModel) {
14015
14042
  liveModel = readConfig(projectDirectory) || readConfig(join17(process.env.HOME || "", ".config", "opencode")) || process?.env?.OPENCODE_MODEL || "";
14016
14043
  }
14017
- const displayModel = resolveTrinityDisplayModel(projectDirectory, selNow.active_slot || "", liveModel, currentModel) || liveModel || currentModel;
14044
+ const displayModel = resolveDisplayModelId(liveModel || currentModel || "", projectDirectory) || liveModel || currentModel;
14018
14045
  const resolvedModel = displayModel || liveModel || currentModel || "";
14019
14046
  if (resolvedModel && resolvedModel !== currentModel) {
14020
14047
  setCurrentModel(resolvedModel);
14021
14048
  setCurrentTier(classify(resolvedModel));
14022
14049
  }
14023
- const execution = resolveExecutionIdentity(displayModel || resolvedModel || "", projectDirectory);
14050
+ const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", projectDirectory);
14024
14051
  const currentSid = _OC_SID;
14025
- const currentSubRegime = loadBlackboxState()?.sessions?.[currentSid]?.sub_regime || classifyTurnSimple2(latestUserIntent || "");
14052
+ const currentSubRegime2 = loadBlackboxState()?.sessions?.[currentSid]?.sub_regime || classifyTurnSimple2(latestUserIntent || "");
14026
14053
  const bbMode = resolveEnforcementMode();
14027
14054
  const enfTags = buildEnforcementTags({
14028
14055
  delegationEnforce: selNow.delegation_enforce,
14029
14056
  flowEnforce: selNow.flow_enforce,
14030
14057
  tddEnforce: selNow.tdd_enforce,
14031
14058
  bbMode,
14032
- modelLocked: _modelLocked
14059
+ modelLocked: _modelLocked,
14060
+ quietIntent: isGreetingLike2(latestUserIntent || "")
14033
14061
  });
14034
14062
  const activeSlot = selNow.active_slot || (execution.quality === "brain" ? "brain" : execution.quality === "medium" ? "medium" : "cheap");
14035
- const displayMode = autoSelectMode2(currentSubRegime, latestUserIntent ? scoreStress(latestUserIntent) : 0);
14036
- const vibeBrand = resolveBrand(displayMode, activeSlot);
14063
+ const displayMode2 = autoSelectMode2(currentSubRegime2, latestUserIntent ? scoreStress(latestUserIntent) : 0);
14064
+ const vibeBrand = resolveBrand(displayMode2, activeSlot);
14037
14065
  const sessionSlot = loadSessionSlot(currentSid);
14038
14066
  const flashIcon = isApiConnected2() ? " \u26A1" : "";
14039
14067
  _footerText = buildFooterLine({
@@ -14043,12 +14071,12 @@ var onToolExecuteAfter = async (input, output) => {
14043
14071
  ltTotal,
14044
14072
  ltTrend: sesTrend || "",
14045
14073
  vibeBrand,
14046
- optMode: displayMode,
14074
+ optMode: displayMode2,
14047
14075
  flashIcon,
14048
14076
  enfTags,
14049
14077
  sessionSlot,
14050
14078
  vectorChangedSlot: selNow.vector_changed_slot,
14051
- subRegime: currentSubRegime
14079
+ subRegime: currentSubRegime2
14052
14080
  }) + "\n\n";
14053
14081
  const footerTarget = _payload(output);
14054
14082
  output.title = _footerText.trim();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.24.30",
3
+ "version": "0.24.31",
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",