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 +4 -19
- package/README.md +2 -7
- package/dist/vibeOS.js +52 -24
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,7 @@
|
|
|
1
|
-
## 0.24.
|
|
2
|
-
- fix:
|
|
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
|
|
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
|
-
|
|
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,
|
|
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 =
|
|
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(
|
|
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
|
|
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
|
|
11928
|
-
const vibeBrand = resolveBrand(loadOptimizationMode() ||
|
|
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:
|
|
11959
|
+
optMode: displayMode2,
|
|
11937
11960
|
flashIcon,
|
|
11938
11961
|
enfTags,
|
|
11939
11962
|
sessionSlot,
|
|
11940
11963
|
vectorChangedSlot: selNowFooter?.vector_changed_slot,
|
|
11941
|
-
subRegime:
|
|
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 =
|
|
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(
|
|
14050
|
+
const execution = resolveExecutionIdentity(input?.args?.model || resolvedModel || "", projectDirectory);
|
|
14024
14051
|
const currentSid = _OC_SID;
|
|
14025
|
-
const
|
|
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
|
|
14036
|
-
const vibeBrand = resolveBrand(
|
|
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:
|
|
14074
|
+
optMode: displayMode2,
|
|
14047
14075
|
flashIcon,
|
|
14048
14076
|
enfTags,
|
|
14049
14077
|
sessionSlot,
|
|
14050
14078
|
vectorChangedSlot: selNow.vector_changed_slot,
|
|
14051
|
-
subRegime:
|
|
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.
|
|
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",
|