vibeostheog 0.25.32 → 0.25.34
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 +15 -44
- package/dist/assets/dashboard/vibeos-dashboard-config.js +1 -1
- package/dist/vibeOS.js +82 -32
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,47 +1,18 @@
|
|
|
1
|
-
## 0.25.
|
|
2
|
-
-
|
|
3
|
-
-
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
- fix: reset warn counts on each test invocation (_resetWarnCountsForTest)
|
|
17
|
-
- fix: add srv.unref() to MCP server so child processes can exit
|
|
18
|
-
- fix: move orchestratorDirective inside try/catch (prevents loadSelection throw from breaking onSystemTransform)
|
|
19
|
-
- fix: wire orchestratorDirective to system prompt (was dead code)
|
|
20
|
-
- fix: add process.exit(0) to delegation test child scripts to prevent MCP server hang
|
|
21
|
-
- fix: _cachedPct returns null when total is 0 (avoids stale 0-credit cache)
|
|
22
|
-
- fix: set VIBEOS_HOME in recordFlowTodo test to use correct sandbox path
|
|
23
|
-
- fix: store cascade data in blackbox history, tune loop detection threshold to 3 (#226)
|
|
24
|
-
- fix: keep VIBEOS_HOME set to sandbox (don't delete in beforeEach) to prevent stale credit cache collisions
|
|
25
|
-
- fix: reset session ID in beforeEach to prevent warn key collision across tests
|
|
26
|
-
- fix: delegation test assertions for new enforcement note format
|
|
27
|
-
- fix: delegation test assertions match new format + VIBEOS_API_DISABLED
|
|
28
|
-
- fix: always record savings from enforcement, cap UI notes only
|
|
29
|
-
- fix: re-add credit nudge for all tools, cap at 5 per tool per session
|
|
30
|
-
- fix: cap repetitive warnings (max 3 per tool per session), remove credit nudge from bash/read
|
|
31
|
-
- fix: compression notice wording — 'has been compressed' → 'will be compressed next' (accurate)
|
|
32
|
-
- fix: readConfig falls back to bare model, fix 3 pre-existing test failures (#225)
|
|
33
|
-
- fix: readConfig falls back to bare model, fix 3 pre-existing test failures
|
|
34
|
-
- fix: cascade icon uses requested_optimization_mode (not loadOptimizationMode which recovers to budget)
|
|
35
|
-
- fix: pass latestUserIntent to computeControlVector for real cascade decision
|
|
36
|
-
- fix: cascade icon uses live computeControlVector (not undefined _controlVector) (#224)
|
|
37
|
-
- docs: update all .md files to use vibe as primary command name
|
|
38
|
-
- docs: footer README, real cascade tests, execFileSync timeouts
|
|
39
|
-
- test: add 3 delegation tests (orchestrator guide, enforcement note, syncControlSettings)
|
|
40
|
-
- test: add 7 regression tests (classify, readConfig, metrics, status payload, classification patterns, turn counter, autoSelectMode)
|
|
41
|
-
- test: add compact memory cascade tests (scratchpad, turn 7+ notice, counter consistency)
|
|
42
|
-
- chore: v0.25.31
|
|
43
|
-
- chore: remove 8 toy test files, remove dead code (PRIORITY, VIBEMAX_CFG, modeCapitalized)
|
|
44
|
-
- chore: remove 8 pure toy test files (zero assertions)
|
|
1
|
+
## 0.25.34
|
|
2
|
+
- fix: remove hardcoded model names from fallback
|
|
3
|
+
- fix: restore apiRoute gate for cascade (#239)
|
|
4
|
+
- fix: cascade triggered only by ML_ENABLED, not apiRoute (#238)
|
|
5
|
+
- fix: cascade router must run regardless of remote API route (#237)
|
|
6
|
+
- fix: cascade fallback only when ML API route is unavailable
|
|
7
|
+
- fix: race condition in token refresh with concurrent session renewal (#235)
|
|
8
|
+
- fix: cascade applySlot fires for all tools regardless of delegation_enforce
|
|
9
|
+
- fix: rename pipeline tier 'local' to 'cheap' (#232)
|
|
10
|
+
- docs: add TDD template + branch-first workflow to AGENTS.md
|
|
11
|
+
- build: strip sync-ts-build from pipeline, esbuild-only bundle (#242)
|
|
12
|
+
Reapply "fix: remove hardcoded model names from fallback" (#244)
|
|
13
|
+
Revert "fix: remove hardcoded model names from fallback"
|
|
14
|
+
Fix fail-open delegation and remove hardcoded fallback (#243)
|
|
15
|
+
Remove hardcoded task fallback model (#241)
|
|
45
16
|
|
|
46
17
|
|
|
47
18
|
## 0.25.31
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.__VIBEOS_DASHBOARD_BASE__ = "http://127.0.0.1:
|
|
1
|
+
window.__VIBEOS_DASHBOARD_BASE__ = "http://127.0.0.1:42977";
|
package/dist/vibeOS.js
CHANGED
|
@@ -4200,16 +4200,16 @@ function learnedRouteFromGraph(text) {
|
|
|
4200
4200
|
}
|
|
4201
4201
|
function profileFromCascade(decision, learned = null) {
|
|
4202
4202
|
if (learned?.learnedTier === "cheap")
|
|
4203
|
-
return { profile: "direct", cascade_depth: 1, pipeline_root: ["
|
|
4203
|
+
return { profile: "direct", cascade_depth: 1, pipeline_root: ["cheap"], tier_bias: "cheap" };
|
|
4204
4204
|
if (learned?.learnedTier === "medium")
|
|
4205
4205
|
return { profile: "standard", cascade_depth: 2, pipeline_root: ["medium", "brain"], tier_bias: "medium" };
|
|
4206
4206
|
if (learned?.learnedTier === "brain")
|
|
4207
|
-
return { profile: "deep", cascade_depth: 3, pipeline_root: ["
|
|
4207
|
+
return { profile: "deep", cascade_depth: 3, pipeline_root: ["cheap", "medium", "brain"], tier_bias: "brain" };
|
|
4208
4208
|
if (decision.useCheap && decision.escalate)
|
|
4209
|
-
return { profile: "deep", cascade_depth: 3, pipeline_root: ["
|
|
4209
|
+
return { profile: "deep", cascade_depth: 3, pipeline_root: ["cheap", "medium", "brain"], tier_bias: "brain" };
|
|
4210
4210
|
if (decision.escalate)
|
|
4211
4211
|
return { profile: "standard", cascade_depth: 2, pipeline_root: ["medium", "brain"], tier_bias: "brain" };
|
|
4212
|
-
return { profile: "direct", cascade_depth: 1, pipeline_root: ["
|
|
4212
|
+
return { profile: "direct", cascade_depth: 1, pipeline_root: ["cheap"], tier_bias: "cheap" };
|
|
4213
4213
|
}
|
|
4214
4214
|
function getPivotCache2() {
|
|
4215
4215
|
if (!globalThis.__vibeultraxPivotCache)
|
|
@@ -5378,7 +5378,8 @@ function setApiToken(newToken) {
|
|
|
5378
5378
|
VIBEOS_API_TOKEN = normalizeDirectApiToken(newToken);
|
|
5379
5379
|
VIBEOS_API_BOOTSTRAP_TOKEN = readBootstrapTokenFromDisk() || VIBEOS_API_BOOTSTRAP_TOKEN;
|
|
5380
5380
|
syncApiEnabledState(process.env.VIBEOS_API_ENABLED !== "false" && (!!VIBEOS_API_TOKEN || !!VIBEOS_API_BOOTSTRAP_TOKEN));
|
|
5381
|
-
|
|
5381
|
+
_apiClientGen++;
|
|
5382
|
+
_apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: VIBEOS_API_TOKEN };
|
|
5382
5383
|
_apiFallbackMode = false;
|
|
5383
5384
|
_apiFallbackSince = null;
|
|
5384
5385
|
persistPrimaryApiEnvState({ token: VIBEOS_API_TOKEN, disabled: false });
|
|
@@ -5396,7 +5397,8 @@ function invalidateApiToken() {
|
|
|
5396
5397
|
VIBEOS_API_TOKEN = "";
|
|
5397
5398
|
VIBEOS_API_BOOTSTRAP_TOKEN = "";
|
|
5398
5399
|
syncApiEnabledState(false);
|
|
5399
|
-
|
|
5400
|
+
_apiClientGen++;
|
|
5401
|
+
_apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: "" };
|
|
5400
5402
|
_apiFallbackMode = false;
|
|
5401
5403
|
_apiFallbackSince = null;
|
|
5402
5404
|
if (_anomalyDetector)
|
|
@@ -5422,7 +5424,8 @@ function setApiBootstrapToken(newToken) {
|
|
|
5422
5424
|
console.error("[vibeOS] Failed to update alpha bootstrap token:", e.message);
|
|
5423
5425
|
}
|
|
5424
5426
|
}
|
|
5425
|
-
var
|
|
5427
|
+
var _apiClientHolder = { client: null, gen: 0, tokenSnapshot: "" };
|
|
5428
|
+
var _apiClientGen = 0;
|
|
5426
5429
|
var _apiFallbackMode = false;
|
|
5427
5430
|
var _apiFallbackSince = null;
|
|
5428
5431
|
var _bootstrapExchangeInFlight = null;
|
|
@@ -5499,7 +5502,8 @@ function syncApiTokenFromDisk() {
|
|
|
5499
5502
|
VIBEOS_API_TOKEN = "";
|
|
5500
5503
|
VIBEOS_API_BOOTSTRAP_TOKEN = "";
|
|
5501
5504
|
syncApiEnabledState(false);
|
|
5502
|
-
|
|
5505
|
+
_apiClientGen++;
|
|
5506
|
+
_apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: "" };
|
|
5503
5507
|
_apiFallbackMode = false;
|
|
5504
5508
|
_apiFallbackSince = null;
|
|
5505
5509
|
resetApiConnection();
|
|
@@ -5511,7 +5515,8 @@ function syncApiTokenFromDisk() {
|
|
|
5511
5515
|
VIBEOS_API_DISABLED = false;
|
|
5512
5516
|
VIBEOS_API_TOKEN = diskToken;
|
|
5513
5517
|
syncApiEnabledState(process.env.VIBEOS_API_ENABLED !== "false" && (!!VIBEOS_API_TOKEN || !!VIBEOS_API_BOOTSTRAP_TOKEN));
|
|
5514
|
-
|
|
5518
|
+
_apiClientGen++;
|
|
5519
|
+
_apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: VIBEOS_API_TOKEN };
|
|
5515
5520
|
_apiFallbackMode = false;
|
|
5516
5521
|
_apiFallbackSince = null;
|
|
5517
5522
|
markApiConnected();
|
|
@@ -5547,14 +5552,21 @@ function syncApiTokenFromDisk() {
|
|
|
5547
5552
|
}
|
|
5548
5553
|
function getApiClient2() {
|
|
5549
5554
|
syncApiTokenFromDisk();
|
|
5550
|
-
if (
|
|
5551
|
-
|
|
5555
|
+
if (_apiClientHolder.client && _apiClientHolder.gen === _apiClientGen) {
|
|
5556
|
+
return _apiClientHolder.client;
|
|
5557
|
+
}
|
|
5558
|
+
if (isApiEnabled() && VIBEOS_API_TOKEN) {
|
|
5559
|
+
_apiClientHolder.client = new VibeOSApiClient({
|
|
5552
5560
|
baseUrl: VIBEOS_API_URL,
|
|
5553
5561
|
apiToken: VIBEOS_API_TOKEN,
|
|
5554
5562
|
timeout: 5e3
|
|
5555
5563
|
});
|
|
5564
|
+
_apiClientHolder.gen = _apiClientGen;
|
|
5565
|
+
_apiClientHolder.tokenSnapshot = VIBEOS_API_TOKEN;
|
|
5566
|
+
} else {
|
|
5567
|
+
_apiClientHolder.client = null;
|
|
5556
5568
|
}
|
|
5557
|
-
return
|
|
5569
|
+
return _apiClientHolder.client;
|
|
5558
5570
|
}
|
|
5559
5571
|
function isApiFallback() {
|
|
5560
5572
|
return _apiFallbackMode || isApiFallbackMode() || !isApiEnabled();
|
|
@@ -5570,7 +5582,6 @@ async function remoteCall(method, args, fallbackFn) {
|
|
|
5570
5582
|
syncApiTokenFromDisk();
|
|
5571
5583
|
if (!VIBEOS_API_TOKEN && VIBEOS_API_BOOTSTRAP_TOKEN) {
|
|
5572
5584
|
await ensureBootstrapExchange();
|
|
5573
|
-
syncApiTokenFromDisk();
|
|
5574
5585
|
}
|
|
5575
5586
|
if (tryResetFallbackCooldown()) {
|
|
5576
5587
|
if (process.env.VIBEOS_DEBUG)
|
|
@@ -9273,14 +9284,14 @@ var BRANDED_MODES = [
|
|
|
9273
9284
|
index: 1,
|
|
9274
9285
|
name: "VibeUltraX",
|
|
9275
9286
|
icon: "\u{1F3C6}",
|
|
9276
|
-
pipeline: ["
|
|
9287
|
+
pipeline: ["cheap", "medium", "brain"],
|
|
9277
9288
|
thinking: "full",
|
|
9278
9289
|
tdd: "quality",
|
|
9279
9290
|
enforcement: "strict",
|
|
9280
9291
|
flow: "strict",
|
|
9281
9292
|
qualityVsBrain: 107,
|
|
9282
9293
|
costVsBrain: 58,
|
|
9283
|
-
desc: "3-model debate:
|
|
9294
|
+
desc: "3-model debate: cheap proposes, medium reviews, brain refines."
|
|
9284
9295
|
},
|
|
9285
9296
|
{
|
|
9286
9297
|
id: "vibeqmax",
|
|
@@ -12203,6 +12214,11 @@ function syncControlSettings(cv, options = {}) {
|
|
|
12203
12214
|
writeIf("active_pipeline", JSON.stringify(modeEntry.pipeline));
|
|
12204
12215
|
}
|
|
12205
12216
|
}
|
|
12217
|
+
if (cv?.pipeline_root && Array.isArray(cv.pipeline_root)) {
|
|
12218
|
+
writeIf("active_pipeline", JSON.stringify(cv.pipeline_root));
|
|
12219
|
+
} else if (cv?.cascade_depth && cv.cascade_depth >= 3) {
|
|
12220
|
+
writeIf("active_pipeline", JSON.stringify(["cheap", "medium", "brain"]));
|
|
12221
|
+
}
|
|
12206
12222
|
writeIf("enabled", true);
|
|
12207
12223
|
const compatibilityMode = currentSel.onboarding_mode === "assist";
|
|
12208
12224
|
const flowManuallyDisabled = currentSel.flow_enabled === false && currentSel.flow_enforce === false;
|
|
@@ -12582,8 +12598,7 @@ function orchestratorDirective(cv, sel) {
|
|
|
12582
12598
|
const mediumModel = TRINITY_MEDIUM || "the medium model";
|
|
12583
12599
|
const targetModel = tierBias === "cheap" ? cheapModel : tierBias === "medium" ? mediumModel : tierBias === "brain" ? brainModel : `${cheapModel} or ${mediumModel}`;
|
|
12584
12600
|
const compatibilityMode = sel?.onboarding_mode === "assist";
|
|
12585
|
-
const cheapSlot = TRINITY_CHEAP ||
|
|
12586
|
-
const mediumSlot = TRINITY_MEDIUM || "deepseek/deepseek-v4-flash";
|
|
12601
|
+
const cheapSlot = TRINITY_CHEAP || cheapModel;
|
|
12587
12602
|
return `[AI ORCHESTRATOR AGENT] You are an AI orchestrator agent. Delegate heavy work to Task subagents (runs on ${targetModel}). Your role is to verify, fill gaps, and synthesize cleanly. ` + (compatibilityMode ? "Compatibility mode is active, so direct Write/Edit stays available until strict guardrails are enabled." : "Brain-tier focuses on orchestration \u2014 hand file writes and edits to Task subagents (cheaper, same quality). Use medium directly with `trinity medium` if the task is simple enough.") + ` [delegation guide] When a write/edit is blocked, use the \`task\` tool with: subagent_type="general" model="${cheapSlot}" prompt="write <path> with: <content>". The task subagent runs on the cheap tier and handles file operations transparently. Parallel task calls are encouraged for independent file changes. Always display the vibeOS cost footer.` + (tierBias !== "auto" ? ` [tier routing] This turn is biased toward ${tierBias} tier.` : "");
|
|
12588
12603
|
}
|
|
12589
12604
|
function flowTodosDirective() {
|
|
@@ -12643,6 +12658,14 @@ var onSystemTransform = async (_input, output) => {
|
|
|
12643
12658
|
if (!loadSelection().enabled)
|
|
12644
12659
|
return;
|
|
12645
12660
|
try {
|
|
12661
|
+
const bbOnDisk = loadBlackboxState();
|
|
12662
|
+
if (_latestBlackboxState3 && bbOnDisk) {
|
|
12663
|
+
const diskHasSessions = Object.keys(bbOnDisk.sessions || {}).length > 0;
|
|
12664
|
+
const stateHasRegime = !!_latestBlackboxState3.sub_regime;
|
|
12665
|
+
if (diskHasSessions && !stateHasRegime) {
|
|
12666
|
+
_latestBlackboxState3 = bbOnDisk;
|
|
12667
|
+
}
|
|
12668
|
+
}
|
|
12646
12669
|
const hookDirectory = String(onSystemTransform._directory || "");
|
|
12647
12670
|
const userText = extractLastUserText(_input) || extractLastUserText(output);
|
|
12648
12671
|
if (typeof userText === "string" && userText.trim())
|
|
@@ -12668,6 +12691,25 @@ var onSystemTransform = async (_input, output) => {
|
|
|
12668
12691
|
if (st)
|
|
12669
12692
|
_latestBlackboxState3.latest_stress_multiplier = st;
|
|
12670
12693
|
_controlVector = await apiComputeControlVector(_latestBlackboxState3, void 0, optimizationMode);
|
|
12694
|
+
if (_controlVector) {
|
|
12695
|
+
const fullState = loadBlackboxState() || { sessions: {}, enabled: true };
|
|
12696
|
+
fullState.cv = _controlVector;
|
|
12697
|
+
if (_latestBlackboxState3) {
|
|
12698
|
+
if (_latestBlackboxState3.sub_regime)
|
|
12699
|
+
fullState.sub_regime = _latestBlackboxState3.sub_regime;
|
|
12700
|
+
if (_latestBlackboxState3.latest_stress_multiplier)
|
|
12701
|
+
fullState.latest_stress_multiplier = _latestBlackboxState3.latest_stress_multiplier;
|
|
12702
|
+
if (_latestBlackboxState3.n_interactions)
|
|
12703
|
+
fullState.n_interactions = _latestBlackboxState3.n_interactions;
|
|
12704
|
+
if (_latestBlackboxState3.resolution)
|
|
12705
|
+
fullState.resolution = _latestBlackboxState3.resolution;
|
|
12706
|
+
if (_latestBlackboxState3.momentum)
|
|
12707
|
+
fullState.momentum = _latestBlackboxState3.momentum;
|
|
12708
|
+
fullState.latest_control_vector_ts = Date.now();
|
|
12709
|
+
}
|
|
12710
|
+
fullState.sessions ??= {};
|
|
12711
|
+
saveBlackboxState(fullState);
|
|
12712
|
+
}
|
|
12671
12713
|
} else if (latestUserIntent) {
|
|
12672
12714
|
const st = scoreStress(latestUserIntent);
|
|
12673
12715
|
_controlVector = await apiComputeControlVector({
|
|
@@ -15269,19 +15311,27 @@ ${argsJson}
|
|
|
15269
15311
|
}
|
|
15270
15312
|
}
|
|
15271
15313
|
const activePipeline = loadSelection().active_pipeline;
|
|
15272
|
-
if (activePipeline && Array.isArray(activePipeline) && activePipeline.length > 1 && TRINITY_CHEAP && TRINITY_MEDIUM) {
|
|
15314
|
+
if (!apiRoute?.target && activePipeline && Array.isArray(activePipeline) && activePipeline.length > 1 && TRINITY_CHEAP && TRINITY_MEDIUM) {
|
|
15273
15315
|
try {
|
|
15274
15316
|
const cheapCost = 1e-3;
|
|
15275
15317
|
const mediumCost = 5e-3;
|
|
15276
15318
|
const brainCost = 0.02;
|
|
15277
15319
|
const cascadeResult = cascadeDecide(_prompt, cheapCost, mediumCost, brainCost, 0.85);
|
|
15278
|
-
const tierMap = { cheap: TRINITY_CHEAP, medium: TRINITY_MEDIUM, brain: TRINITY_BRAIN
|
|
15320
|
+
const tierMap = { cheap: TRINITY_CHEAP, medium: TRINITY_MEDIUM, brain: TRINITY_BRAIN };
|
|
15279
15321
|
const pipelineModels = activePipeline.map((t2) => tierMap[t2] || TRINITY_CHEAP);
|
|
15280
15322
|
if (cascadeResult.escalate && pipelineModels.length > 1) {
|
|
15281
|
-
|
|
15282
|
-
|
|
15283
|
-
_target
|
|
15284
|
-
|
|
15323
|
+
if (pipelineModels.length > 2 && cascadeResult.confidence >= 0.8) {
|
|
15324
|
+
const escalated = pipelineModels[2];
|
|
15325
|
+
if (escalated && escalated !== currentModel && (!_target || escalated !== _target)) {
|
|
15326
|
+
_target = escalated;
|
|
15327
|
+
console.error(`[vibeOS] \u{1F500} Cascade depth-3 escalate: ${cascadeResult.reason} \u2192 ${escalated}`);
|
|
15328
|
+
}
|
|
15329
|
+
} else {
|
|
15330
|
+
const escalated = pipelineModels[1];
|
|
15331
|
+
if (escalated && escalated !== currentModel && (!_target || escalated !== _target)) {
|
|
15332
|
+
_target = escalated;
|
|
15333
|
+
console.error(`[vibeOS] \u{1F500} Cascade escalate: ${cascadeResult.reason} \u2192 ${escalated}`);
|
|
15334
|
+
}
|
|
15285
15335
|
}
|
|
15286
15336
|
} else if (cascadeResult.useCheap && !_target) {
|
|
15287
15337
|
_target = pipelineModels[0];
|
|
@@ -15309,8 +15359,8 @@ ${argsJson}
|
|
|
15309
15359
|
_setModel(inArgs);
|
|
15310
15360
|
try {
|
|
15311
15361
|
const selNow = loadSelection();
|
|
15312
|
-
const desiredSlot = _target === TRINITY_CHEAP ? "cheap" : _target === TRINITY_MEDIUM ? "medium" : null;
|
|
15313
|
-
if (
|
|
15362
|
+
const desiredSlot = _target === TRINITY_CHEAP ? "cheap" : _target === TRINITY_MEDIUM ? "medium" : _target === TRINITY_BRAIN ? "brain" : null;
|
|
15363
|
+
if (desiredSlot && selNow.active_slot !== desiredSlot) {
|
|
15314
15364
|
taskSlotRestore = selNow.active_slot || "brain";
|
|
15315
15365
|
const switched = applySlot(desiredSlot);
|
|
15316
15366
|
if (switched?.ok) {
|
|
@@ -15405,8 +15455,8 @@ ${argsJson}
|
|
|
15405
15455
|
const originalPath = argSources.flatMap((src) => [src?.filePath, src?.file_path, src?.path]).find((v) => typeof v === "string" && v.trim()) || "";
|
|
15406
15456
|
const basename6 = originalPath.split("/").pop() || "blocked";
|
|
15407
15457
|
const apiResult = await remoteCall("delegateCheck", [tLower, currentTier, currentModel, _prompt], () => ({
|
|
15408
|
-
blocked:
|
|
15409
|
-
savings:
|
|
15458
|
+
blocked: false,
|
|
15459
|
+
savings: 0,
|
|
15410
15460
|
_fallback: true
|
|
15411
15461
|
}));
|
|
15412
15462
|
const remoteSavings = Number(apiResult?.savings);
|
|
@@ -15421,7 +15471,7 @@ ${argsJson}
|
|
|
15421
15471
|
projectName: currentProjectName || "",
|
|
15422
15472
|
sessionId: getCurrentSessionId()
|
|
15423
15473
|
});
|
|
15424
|
-
const taskModel = TRINITY_CHEAP || "
|
|
15474
|
+
const taskModel = TRINITY_CHEAP || TRINITY_MEDIUM || currentModel || TRINITY_BRAIN || "";
|
|
15425
15475
|
pendingUiNote = `[delegation] ${t} blocked on brain tier. Use a task subagent instead: \`task subagent_type="general" model="${taskModel}" prompt="${t} <file> with the intended content"\`. Keeps brain focused on orchestration.`;
|
|
15426
15476
|
enforcementBlocked = true;
|
|
15427
15477
|
_mutateBlockedToolArgs(t, argSources, originalPath, output);
|
|
@@ -16161,10 +16211,10 @@ async function _seedOrRepairModelTiers(directory3) {
|
|
|
16161
16211
|
let medium = trinity?.medium || brain;
|
|
16162
16212
|
let cheap = trinity?.cheap || medium || brain;
|
|
16163
16213
|
if (!brain) {
|
|
16164
|
-
brain = "
|
|
16165
|
-
medium = "
|
|
16166
|
-
cheap = "
|
|
16167
|
-
console.error(
|
|
16214
|
+
brain = "generic/brain";
|
|
16215
|
+
medium = "generic/medium";
|
|
16216
|
+
cheap = "generic/cheap";
|
|
16217
|
+
console.error('[vibeOS] no providers or trinity config found \u2014 run "vibe rebuild" to set model tiers');
|
|
16168
16218
|
}
|
|
16169
16219
|
const existingSelection = existing?.selection && typeof existing.selection === "object" ? existing.selection : {};
|
|
16170
16220
|
const existingTrinity = existing?.trinity && typeof existing.trinity === "object" ? existing.trinity : {};
|
package/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibeostheog",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.34",
|
|
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",
|
|
7
7
|
"release:patch": "node scripts/release.mjs patch --yes",
|
|
8
8
|
"release:minor": "node scripts/release.mjs minor --yes",
|
|
9
9
|
"release:major": "node scripts/release.mjs major --yes",
|
|
10
|
-
"build": "npm run build:bundle && node scripts/deploy.mjs",
|
|
11
|
-
"build:bundle": "
|
|
10
|
+
"build": "npm run typecheck && npm run build:bundle && node scripts/deploy.mjs",
|
|
11
|
+
"build:bundle": "node scripts/build-bundle.mjs",
|
|
12
12
|
"build:single": "node scripts/build-bundle.mjs",
|
|
13
13
|
"deploy": "node scripts/deploy.mjs",
|
|
14
14
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
15
15
|
"checkpoint:validate": "node scripts/checkpoint-validate.mjs",
|
|
16
16
|
"test:scripts": "node scripts/run-test-suite.mjs scripts",
|
|
17
17
|
"ts:audit": "node scripts/ts-audit.mjs",
|
|
18
|
-
"test": "
|
|
19
|
-
"test:ci": "
|
|
18
|
+
"test": "tsc -p tsconfig.json && node scripts/build-bundle.mjs && node scripts/run-test-suite.mjs full",
|
|
19
|
+
"test:ci": "tsc -p tsconfig.json && node scripts/build-bundle.mjs && node scripts/run-test-suite.mjs ci",
|
|
20
20
|
"guard": "bash plugins/vibetheog-guard/scripts/run-guard.sh",
|
|
21
21
|
"guard:full": "VIBETHEOG_GUARD_FULL=1 bash plugins/vibetheog-guard/scripts/run-guard.sh",
|
|
22
22
|
"hook:precommit": "bash plugins/vibetheog-guard/hooks/pre-commit.sh",
|