vibeostheog 0.23.43 → 0.23.46
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 +14 -0
- package/package.json +1 -1
- package/src/lib/hooks/chat-transform.js +6 -3
- package/src/lib/hooks/footer.js +44 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## 0.23.46
|
|
2
|
+
- fix: strip agent_mode from control vector to prevent ML plan-mode breakage
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## 0.23.45
|
|
6
|
+
- fix: propagate local agent_mode as fallback when remote CV omits it
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## 0.23.44
|
|
10
|
+
- fix: force-add run-test-suite.mjs for CI release workflow
|
|
11
|
+
- fix: restart stale startup plan agent and clear workspace followup pause
|
|
12
|
+
- chore: sync package-lock version
|
|
13
|
+
|
|
14
|
+
|
|
1
15
|
## 0.23.43
|
|
2
16
|
- fix: support desktop footer alert chain
|
|
3
17
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibeostheog",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.46",
|
|
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",
|
|
@@ -75,11 +75,15 @@ async function apiComputeControlVector(state, action, optimizationMode) {
|
|
|
75
75
|
const res = await remoteCall("blackboxControlVector", [state, action, optimizationMode], null);
|
|
76
76
|
if (res?.control_vector) {
|
|
77
77
|
const local = computeControlVector(state, action, optimizationMode);
|
|
78
|
-
|
|
78
|
+
const cv = { agent_mode: local.agent_mode, ...res.control_vector, tier_bias: local.tier_bias, optimization_mode: local.optimization_mode };
|
|
79
|
+
delete cv.agent_mode;
|
|
80
|
+
return cv;
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
catch { }
|
|
82
|
-
|
|
84
|
+
const fallbackCv = computeControlVector(state, action, optimizationMode);
|
|
85
|
+
delete fallbackCv.agent_mode;
|
|
86
|
+
return fallbackCv;
|
|
83
87
|
}
|
|
84
88
|
function observeUserCorrection(text) {
|
|
85
89
|
if (!text || typeof text !== "string")
|
|
@@ -284,7 +288,6 @@ export function syncControlSettings(cv, options = {}) {
|
|
|
284
288
|
if (restoreAgent && oc.default_agent === "plan") {
|
|
285
289
|
oc.default_agent = restoreAgent;
|
|
286
290
|
writeFileSync(OC_CONFIG, JSON.stringify(oc, null, 2) + "\n");
|
|
287
|
-
clearWorkspaceFollowupPauseForSession(sid);
|
|
288
291
|
if (currentSel.previous_default_agent)
|
|
289
292
|
writeSelection("previous_default_agent", null);
|
|
290
293
|
}
|
package/src/lib/hooks/footer.js
CHANGED
|
@@ -168,27 +168,27 @@ async function _appendFooter(input, output, directory) {
|
|
|
168
168
|
output?.messageId ||
|
|
169
169
|
output?.message?.id ||
|
|
170
170
|
null;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
171
|
+
if (messageID && textCompletePainted.has(messageID))
|
|
172
|
+
return;
|
|
173
|
+
function _payload(obj) {
|
|
174
|
+
if (obj?.message && typeof obj.message === "object")
|
|
175
|
+
return obj.message;
|
|
176
|
+
return obj;
|
|
177
|
+
}
|
|
178
|
+
function _extractText(obj) {
|
|
179
|
+
const payload = _payload(obj);
|
|
180
|
+
if (typeof payload?.text === "string")
|
|
181
|
+
return payload.text;
|
|
182
|
+
if (typeof payload?.result === "string")
|
|
183
|
+
return payload.result;
|
|
184
|
+
if (typeof payload?.content === "string")
|
|
185
|
+
return payload.content;
|
|
186
|
+
if (Array.isArray(payload?.content))
|
|
187
|
+
return payload.content.filter(p => p?.type === "text").map(p => p.text).filter(Boolean).join("\n");
|
|
188
|
+
if (Array.isArray(payload?.parts))
|
|
189
|
+
return payload.parts.filter(p => p?.type === "text").map(p => p.text).filter(Boolean).join("\n");
|
|
190
|
+
return "";
|
|
191
|
+
}
|
|
192
192
|
const text = _extractText(output);
|
|
193
193
|
if (!text)
|
|
194
194
|
return;
|
|
@@ -336,32 +336,32 @@ async function _appendFooter(input, output, directory) {
|
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
catch { }
|
|
339
|
-
}
|
|
340
|
-
function _setFooter(obj, text) {
|
|
341
|
-
const target = _payload(obj);
|
|
342
|
-
if (typeof target?.text === "string")
|
|
343
|
-
target.text = text;
|
|
344
|
-
else if (typeof target?.result === "string")
|
|
345
|
-
target.result = text;
|
|
346
|
-
else if (typeof target?.content === "string")
|
|
347
|
-
target.content = text;
|
|
348
|
-
else if (Array.isArray(target?.content)) {
|
|
349
|
-
const textParts = target.content.filter(p => p?.type === "text");
|
|
350
|
-
if (textParts.length > 0)
|
|
351
|
-
textParts[textParts.length - 1].text = text;
|
|
352
|
-
else
|
|
353
|
-
target.content.push({ type: "text", text });
|
|
354
339
|
}
|
|
355
|
-
|
|
356
|
-
const
|
|
357
|
-
if (
|
|
358
|
-
|
|
340
|
+
function _setFooter(obj, text) {
|
|
341
|
+
const target = _payload(obj);
|
|
342
|
+
if (typeof target?.text === "string")
|
|
343
|
+
target.text = text;
|
|
344
|
+
else if (typeof target?.result === "string")
|
|
345
|
+
target.result = text;
|
|
346
|
+
else if (typeof target?.content === "string")
|
|
347
|
+
target.content = text;
|
|
348
|
+
else if (Array.isArray(target?.content)) {
|
|
349
|
+
const textParts = target.content.filter(p => p?.type === "text");
|
|
350
|
+
if (textParts.length > 0)
|
|
351
|
+
textParts[textParts.length - 1].text = text;
|
|
352
|
+
else
|
|
353
|
+
target.content.push({ type: "text", text });
|
|
354
|
+
}
|
|
355
|
+
else if (Array.isArray(target?.parts)) {
|
|
356
|
+
const textParts = target.parts.filter(p => p?.type === "text");
|
|
357
|
+
if (textParts.length > 0)
|
|
358
|
+
textParts[textParts.length - 1].text = text;
|
|
359
|
+
else
|
|
360
|
+
target.parts.push({ type: "text", text });
|
|
361
|
+
}
|
|
359
362
|
else
|
|
360
|
-
target.
|
|
363
|
+
target.text = text;
|
|
361
364
|
}
|
|
362
|
-
else
|
|
363
|
-
target.text = text;
|
|
364
|
-
}
|
|
365
365
|
_setFooter(output, footerText);
|
|
366
366
|
_lastStrippedText = stripped;
|
|
367
367
|
// CLI/pipe mode: stdout is already rendered, write footer to stderr
|