vibeostheog 0.23.42 → 0.23.45
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 +1 -2
- package/src/lib/hooks/footer.js +30 -23
- package/src/lib/hooks/tool-execute.js +33 -23
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## 0.23.45
|
|
2
|
+
- fix: propagate local agent_mode as fallback when remote CV omits it
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## 0.23.44
|
|
6
|
+
- fix: force-add run-test-suite.mjs for CI release workflow
|
|
7
|
+
- fix: restart stale startup plan agent and clear workspace followup pause
|
|
8
|
+
- chore: sync package-lock version
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## 0.23.43
|
|
12
|
+
- fix: support desktop footer alert chain
|
|
13
|
+
|
|
14
|
+
|
|
1
15
|
## 0.23.42
|
|
2
16
|
Fix paused build followup recovery
|
|
3
17
|
Fix stuck startup plan restore
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibeostheog",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.45",
|
|
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,7 +75,7 @@ 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
|
-
return { ...res.control_vector, tier_bias: local.tier_bias, optimization_mode: local.optimization_mode };
|
|
78
|
+
return { agent_mode: local.agent_mode, ...res.control_vector, tier_bias: local.tier_bias, optimization_mode: local.optimization_mode };
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
catch { }
|
|
@@ -284,7 +284,6 @@ export function syncControlSettings(cv, options = {}) {
|
|
|
284
284
|
if (restoreAgent && oc.default_agent === "plan") {
|
|
285
285
|
oc.default_agent = restoreAgent;
|
|
286
286
|
writeFileSync(OC_CONFIG, JSON.stringify(oc, null, 2) + "\n");
|
|
287
|
-
clearWorkspaceFollowupPauseForSession(sid);
|
|
288
287
|
if (currentSel.previous_default_agent)
|
|
289
288
|
writeSelection("previous_default_agent", null);
|
|
290
289
|
}
|
package/src/lib/hooks/footer.js
CHANGED
|
@@ -170,17 +170,23 @@ async function _appendFooter(input, output, directory) {
|
|
|
170
170
|
null;
|
|
171
171
|
if (messageID && textCompletePainted.has(messageID))
|
|
172
172
|
return;
|
|
173
|
+
function _payload(obj) {
|
|
174
|
+
if (obj?.message && typeof obj.message === "object")
|
|
175
|
+
return obj.message;
|
|
176
|
+
return obj;
|
|
177
|
+
}
|
|
173
178
|
function _extractText(obj) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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");
|
|
184
190
|
return "";
|
|
185
191
|
}
|
|
186
192
|
const text = _extractText(output);
|
|
@@ -332,28 +338,29 @@ async function _appendFooter(input, output, directory) {
|
|
|
332
338
|
catch { }
|
|
333
339
|
}
|
|
334
340
|
function _setFooter(obj, text) {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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");
|
|
343
350
|
if (textParts.length > 0)
|
|
344
351
|
textParts[textParts.length - 1].text = text;
|
|
345
352
|
else
|
|
346
|
-
|
|
353
|
+
target.content.push({ type: "text", text });
|
|
347
354
|
}
|
|
348
|
-
else if (Array.isArray(
|
|
349
|
-
const textParts =
|
|
355
|
+
else if (Array.isArray(target?.parts)) {
|
|
356
|
+
const textParts = target.parts.filter(p => p?.type === "text");
|
|
350
357
|
if (textParts.length > 0)
|
|
351
358
|
textParts[textParts.length - 1].text = text;
|
|
352
359
|
else
|
|
353
|
-
|
|
360
|
+
target.parts.push({ type: "text", text });
|
|
354
361
|
}
|
|
355
362
|
else
|
|
356
|
-
|
|
363
|
+
target.text = text;
|
|
357
364
|
}
|
|
358
365
|
_setFooter(output, footerText);
|
|
359
366
|
_lastStrippedText = stripped;
|
|
@@ -750,17 +750,21 @@ export const onToolExecuteAfter = async (input, output) => {
|
|
|
750
750
|
_footerText += ` | $${formatUsd(ltTotal)}`;
|
|
751
751
|
}
|
|
752
752
|
_footerText += ` | ${vibeBrand}${flashIcon} —\n\n`;
|
|
753
|
+
const footerTarget = _payload(output);
|
|
753
754
|
output.title = _footerText.trim();
|
|
754
|
-
if (
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
755
|
+
if (footerTarget !== output && footerTarget && typeof footerTarget === "object") {
|
|
756
|
+
footerTarget.title = _footerText.trim();
|
|
757
|
+
}
|
|
758
|
+
if (typeof footerTarget?.output === "string")
|
|
759
|
+
footerTarget.output = _footerText + footerTarget.output;
|
|
760
|
+
else if (typeof footerTarget?.result === "string")
|
|
761
|
+
footerTarget.result = _footerText + footerTarget.result;
|
|
762
|
+
else if (typeof footerTarget?.text === "string")
|
|
763
|
+
footerTarget.text = _footerText + footerTarget.text;
|
|
764
|
+
else if (typeof footerTarget?.content === "string")
|
|
765
|
+
footerTarget.content = _footerText + footerTarget.content;
|
|
762
766
|
else
|
|
763
|
-
|
|
767
|
+
footerTarget.output = _footerText;
|
|
764
768
|
_autoReportCount = (_autoReportCount || 0) + 1;
|
|
765
769
|
if (_autoReportCount % 5 === 0 && ltTotal > 0) {
|
|
766
770
|
saveReport({
|
|
@@ -847,30 +851,36 @@ export const onToolExecuteAfter = async (input, output) => {
|
|
|
847
851
|
return s;
|
|
848
852
|
});
|
|
849
853
|
}
|
|
854
|
+
function _payload(obj) {
|
|
855
|
+
if (obj?.message && typeof obj.message === "object")
|
|
856
|
+
return obj.message;
|
|
857
|
+
return obj;
|
|
858
|
+
}
|
|
850
859
|
// Inject pending delegation UI note (set in tool.execute.before).
|
|
851
860
|
// This surfaces the warning in the OC chat transcript, not just stderr.
|
|
852
861
|
if (pendingUiNote) {
|
|
862
|
+
const target = _payload(output);
|
|
853
863
|
if (enforcementBlocked) {
|
|
854
864
|
const note = `[vibeOS] ${pendingUiNote}`;
|
|
855
|
-
if (typeof
|
|
856
|
-
|
|
857
|
-
else if (typeof
|
|
858
|
-
|
|
859
|
-
else if (typeof
|
|
860
|
-
|
|
865
|
+
if (typeof target?.result === "string")
|
|
866
|
+
target.result += `\n\n${note}`;
|
|
867
|
+
else if (typeof target?.text === "string")
|
|
868
|
+
target.text += `\n\n${note}`;
|
|
869
|
+
else if (typeof target?.content === "string")
|
|
870
|
+
target.content += `\n\n${note}`;
|
|
861
871
|
else
|
|
862
|
-
|
|
872
|
+
target.result = pendingUiNote;
|
|
863
873
|
}
|
|
864
874
|
else {
|
|
865
875
|
const note = `\n\n${pendingUiNote}`;
|
|
866
|
-
if (typeof
|
|
867
|
-
|
|
868
|
-
else if (typeof
|
|
869
|
-
|
|
870
|
-
else if (typeof
|
|
871
|
-
|
|
876
|
+
if (typeof target?.result === "string")
|
|
877
|
+
target.result += note;
|
|
878
|
+
else if (typeof target?.text === "string")
|
|
879
|
+
target.text += note;
|
|
880
|
+
else if (typeof target?.content === "string")
|
|
881
|
+
target.content += note;
|
|
872
882
|
else
|
|
873
|
-
|
|
883
|
+
target.result = pendingUiNote;
|
|
874
884
|
}
|
|
875
885
|
pendingUiNote = null;
|
|
876
886
|
}
|