vibeostheog 0.24.1 → 0.24.3

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Cost-aware control plane for OpenCode Desktop.
4
4
 
5
- > ## v0.23.61 — Return
5
+ > ## v0.24.0 — Return
6
6
  > Compact footer format: `🦠 brain | Deepseek | V4 Pro | $12.57 | VibeMaX ⚡ Budget`
7
7
  > VibeMaX is now the default optimization mode. Model display names cleaned up (V4 Pro, Sonnet, 2.5 Flash).
8
8
  > Install: `npx vibeostheog setup --project` or `npx vibeostheog setup`
package/dist/vibeOS.js CHANGED
@@ -436,7 +436,7 @@ function autoSelectMode(subRegime, stressMultiplier) {
436
436
  if (regime === "LOOPING") return "speed";
437
437
  if (regime === "CONVERGING" || regime === "CLOSED") return "quality";
438
438
  if (stressMultiplier && stressMultiplier > QUALITY_STRESS_THRESHOLD) return "quality";
439
- return "vibelitex";
439
+ return "litex";
440
440
  }
441
441
  var REGIME_CONTROL, DEFAULT_CONTROL, QUALITY_STRESS_THRESHOLD;
442
442
  var init_meta_controller = __esm({
@@ -6074,9 +6074,22 @@ function classifyTurnSimple(userText) {
6074
6074
  if (/(inject|exploit|penetration|cve|attack|threat|encrypt|forensic|research|deep analysis|investigate|root cause|reverse engineer|disassemble|memory dump|core dump)/i.test(lower)) {
6075
6075
  return "FORENSIC";
6076
6076
  }
6077
- if (/^(how|what|why|when|where|who|can you|could you|tell me|explain|describe|show|list|check|is there|are there|does|do you|summarize|elaborate|clarify|inspect|trace|find|search|look|read|show me|dump)/i.test(lower)) {
6077
+ const IMPL_VERBS = "fix|write|create|build|implement|change|edit|modify|update|refactor|generate|delete|remove|migrate|deploy|commit|push";
6078
+ if (new RegExp("^(can you|could you|tell me|we should|we need to|please) (" + IMPL_VERBS + ")\\b", "i").test(lower)) {
6079
+ return "REFINING";
6080
+ }
6081
+ if (new RegExp("^I (need|want|would like) to (" + IMPL_VERBS + ")\\b", "i").test(lower)) {
6082
+ return "REFINING";
6083
+ }
6084
+ if (/^(the |there is |there are |i think |looks like |seems like |i see |why (is|are|does|did) )/.test(lower)) {
6085
+ return "EXPLORING";
6086
+ }
6087
+ if (/^(how|what|why|when|where|who|can you|could you|let me|tell me|explain|describe|show|list|check|is there|are there|does|do you|summarize|elaborate|clarify|inspect|trace|find|search|look|read|show me|dump|debug)/i.test(lower)) {
6078
6088
  return "EXPLORING";
6079
6089
  }
6090
+ if (new RegExp("\\b(" + IMPL_VERBS + ")\\b", "i").test(lower)) {
6091
+ return "REFINING";
6092
+ }
6080
6093
  if (/^(write|create|add|build|implement|fix|change|edit|modify|update|refactor|generate|make|commit|push|deploy|release|publish|install|remove|delete|rename|move|copy|transform|convert|migrate)/i.test(lower)) {
6081
6094
  return "REFINING";
6082
6095
  }
@@ -6128,6 +6141,21 @@ function isLikelyOffTopic(userText, job) {
6128
6141
  }
6129
6142
 
6130
6143
  // src/lib/turn-classify.ts
6144
+ function classifyTurnSimple2(userText) {
6145
+ return classifyTurnSimple(userText);
6146
+ }
6147
+ async function classifyTurnRemote(text) {
6148
+ try {
6149
+ const client2 = getApiClient2();
6150
+ if (!client2 || isApiFallback()) return classifyTurnSimple(text);
6151
+ const res = await client2.classifyQuery(text);
6152
+ if (res && typeof res === "object" && "sub_regime" in res) {
6153
+ return res.sub_regime;
6154
+ }
6155
+ } catch {
6156
+ }
6157
+ return classifyTurnSimple(text);
6158
+ }
6131
6159
  function getVibeOSHome5() {
6132
6160
  return process.env.VIBEOS_HOME || join7(process.env.HOME || "", ".claude");
6133
6161
  }
@@ -6190,7 +6218,9 @@ function computeControlVector2(_state, _action, _optimizationMode) {
6190
6218
  wbp_verbosity: isStrict ? "verbose" : isRelaxed ? "minimal" : "normal",
6191
6219
  agent_mode: (subRegime === "REFINING" || subRegime === "CONVERGING" || subRegime === "CLOSED") && stress <= QUALITY_STRESS_THRESHOLD2 ? "plan" : void 0,
6192
6220
  optimization_mode: mode,
6193
- directives: []
6221
+ directives: isRelaxed && (subRegime === "EXPLORING" || subRegime === "INIT" || subRegime === "AUDIT" || subRegime === "FORENSIC" || subRegime === "LOOPING") ? [
6222
+ `[speed guard] VERIFY BEFORE ACT - Speed-oriented mode "${mode}" is active and user intent is ${subRegime}. Before modifying files or executing commands, first verify the current state. When a request is ambiguous between "check and report" vs "fix", always choose CHECK FIRST. Treat "look at", "check", "investigate", "tell me about" as requests for information, not action items.`
6223
+ ] : []
6194
6224
  };
6195
6225
  }
6196
6226
  function buildControlHistoryEntry2(turn, regime, control, reward = null) {
@@ -9359,9 +9389,6 @@ function recordSaving(tool2, reason, saveEst, meta = {}) {
9359
9389
  }
9360
9390
  }
9361
9391
  const ses = s.sessions[sid];
9362
- ses.total_savings_usd = roundUsd(Number(ses.total_savings_usd || 0) + saveEst);
9363
- s.lifetime.total_savings_usd = roundUsd(Number(s.lifetime.total_savings_usd || 0) + saveEst);
9364
- s.lifetime.warn_count = (s.lifetime.warn_count || 0) + 1;
9365
9392
  if (reason && firstWord) {
9366
9393
  const now = Date.now();
9367
9394
  const warnKey = `${_OC_SID}:${firstWord}`;
@@ -9371,13 +9398,13 @@ function recordSaving(tool2, reason, saveEst, meta = {}) {
9371
9398
  const w = ses.warns[i];
9372
9399
  if (w?.key === warnKey && now - w.ts < WARN_DEDUPE_WINDOW_MS) {
9373
9400
  w.count = (w.count || 1) + 1;
9374
- w.reason = reason;
9375
- w.saveEst = (w.saveEst || 0) + saveEst;
9376
- w.est_savings_usd = (w.est_savings_usd || 0) + saveEst;
9377
9401
  deduped = true;
9378
9402
  }
9379
9403
  }
9380
9404
  if (!deduped) {
9405
+ ses.total_savings_usd = roundUsd(Number(ses.total_savings_usd || 0) + saveEst);
9406
+ s.lifetime.total_savings_usd = roundUsd(Number(s.lifetime.total_savings_usd || 0) + saveEst);
9407
+ s.lifetime.warn_count = (s.lifetime.warn_count || 0) + 1;
9381
9408
  ses.warns.push({ key: warnKey, reason, saveEst, est_savings_usd: saveEst, firstWord, ts: now, count: 1, tool: tool2 });
9382
9409
  }
9383
9410
  if (!ses.seenWarnKeys[warnKey]) {
@@ -10025,15 +10052,16 @@ var onSystemTransform = async (_input, output) => {
10025
10052
  if (typeof userText === "string" && userText.trim()) latestUserIntent = userText;
10026
10053
  else if (!latestUserIntent) latestUserIntent = null;
10027
10054
  if (latestUserIntent) observeUserCorrection(latestUserIntent);
10055
+ const classifiedRegime = _latestBlackboxState3?.sub_regime || (latestUserIntent ? await classifyTurnRemote(latestUserIntent) : "INIT");
10028
10056
  const optimizationSuggestion = await selectOptimizationModeRemote(
10029
- _latestBlackboxState3?.sub_regime || (latestUserIntent ? classifyTurnSimple(latestUserIntent) : "INIT"),
10057
+ classifiedRegime,
10030
10058
  latestUserIntent ? scoreStress(latestUserIntent) : 0,
10031
10059
  loadOptimizationMode()
10032
10060
  );
10033
10061
  const optimizationDecision = applyBudgetFirstMode({
10034
10062
  requestedMode: loadOptimizationMode(),
10035
10063
  suggestedMode: optimizationSuggestion,
10036
- subRegime: _latestBlackboxState3?.sub_regime || (latestUserIntent ? classifyTurnSimple(latestUserIntent) : "INIT"),
10064
+ subRegime: classifiedRegime,
10037
10065
  stress: latestUserIntent ? scoreStress(latestUserIntent) : 0,
10038
10066
  nInteractions: _latestBlackboxState3?.n_interactions ?? 0
10039
10067
  });
@@ -10047,7 +10075,7 @@ var onSystemTransform = async (_input, output) => {
10047
10075
  } else if (latestUserIntent) {
10048
10076
  const st = scoreStress(latestUserIntent);
10049
10077
  _controlVector = await apiComputeControlVector({
10050
- sub_regime: classifyTurnSimple(latestUserIntent),
10078
+ sub_regime: classifiedRegime,
10051
10079
  latest_stress_multiplier: st || void 0
10052
10080
  }, void 0, optimizationMode);
10053
10081
  }
@@ -10208,7 +10236,7 @@ var onSystemTransform = async (_input, output) => {
10208
10236
  }
10209
10237
  const calDir = getVibeOSHome9();
10210
10238
  const calFile = join14(calDir, "calibration-data.jsonl");
10211
- const regime2 = _latestBlackboxState3?.sub_regime || classifyTurnSimple(latestUserIntent || "");
10239
+ const regime2 = _latestBlackboxState3?.sub_regime || classifyTurnSimple2(latestUserIntent || "");
10212
10240
  const calRecord = JSON.stringify({
10213
10241
  ts: (/* @__PURE__ */ new Date()).toISOString(),
10214
10242
  sid: _OC_SID4,
@@ -10528,7 +10556,7 @@ async function _appendFooter(input, output, directory3) {
10528
10556
  });
10529
10557
  const resolvedMode = peekBudgetFirstMode({
10530
10558
  requestedMode: optModeFooter,
10531
- subRegime: _latestBlackboxState?.sub_regime || classifyTurnSimple(latestUserIntent || ""),
10559
+ subRegime: _latestBlackboxState?.sub_regime || classifyTurnSimple2(latestUserIntent || ""),
10532
10560
  stress: _footerStress
10533
10561
  }).mode;
10534
10562
  const stripped = text.replace(/\u2014 [^\u2014]+ \u2014\s*/g, "").trimEnd();
@@ -10565,7 +10593,7 @@ ${vibeLine}`;
10565
10593
  if (outcome) {
10566
10594
  recordBudgetFirstOutcome({
10567
10595
  outcome,
10568
- subRegime: _latestBlackboxState?.sub_regime || classifyTurnSimple(latestUserIntent || ""),
10596
+ subRegime: _latestBlackboxState?.sub_regime || classifyTurnSimple2(latestUserIntent || ""),
10569
10597
  stress: _footerStress
10570
10598
  });
10571
10599
  const tracker = getBlackboxTracker();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.24.1",
3
+ "version": "0.24.3",
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",