@osovv/vv-opencode 1.3.0 → 1.3.1
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 +8 -0
- package/dist/tui/analytics/indicator.d.ts +1 -0
- package/dist/tui/analytics/indicator.js +4 -3
- package/dist/tui/analytics/indicator.js.map +1 -1
- package/dist/tui/branding/footer.js +3 -2
- package/dist/tui/branding/footer.js.map +1 -1
- package/dist/tui/color.d.ts +13 -0
- package/dist/tui/color.js +30 -0
- package/dist/tui/color.js.map +1 -0
- package/package.json +1 -1
- package/schemas/vvoc/v3.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## <small>1.3.1 (2026-08-19)</small>
|
|
2
|
+
|
|
3
|
+
### Summary
|
|
4
|
+
|
|
5
|
+
Version 1.3.1 fixes a TUI stability issue where the live cache hit rate indicator and the vvoc branding footer rendered label text in a way that OpenTUI rejected, which could crash the OpenCode terminal interface. Labels are now wrapped in proper text elements, and theme colors are converted to a reliable hex format that OpenTUI parses consistently. Regression tests were added with real OpenTUI rendering to prevent this class of crash from returning.
|
|
6
|
+
|
|
7
|
+
* fix(tui): wrap slot labels in text elements to prevent OpenTUI orphan text crashes ([70589a7](https://github.com/osovv/vv-opencode/commit/70589a7))
|
|
8
|
+
|
|
1
9
|
## 1.3.0 (2026-08-19)
|
|
2
10
|
|
|
3
11
|
### Summary
|
|
@@ -22,6 +22,7 @@ export type IndicatorDependencies = {
|
|
|
22
22
|
/** Renders the label node; defaults to the themed span. */
|
|
23
23
|
renderLabel: (label: IndicatorLabel, color: string) => JSX.Element;
|
|
24
24
|
};
|
|
25
|
+
export declare const DEFAULT_DEPENDENCIES: IndicatorDependencies;
|
|
25
26
|
/** Rolling per-session sums fed by step-finish parts. Same eligibility rule as metrics. */
|
|
26
27
|
export declare function createIndicatorAccumulator(): {
|
|
27
28
|
applyPart(part: StepFinishLike): void;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "@opentui/solid/jsx-runtime";
|
|
2
2
|
import { loadVvocConfigForRead } from "../../lib/config-layers.js";
|
|
3
3
|
import { isVvocPluginEnabled } from "../../lib/plugin-toggle-config.js";
|
|
4
|
-
|
|
4
|
+
import { rgbaToHex } from "../color.js";
|
|
5
|
+
export const DEFAULT_DEPENDENCIES = {
|
|
5
6
|
enabled: async (api) => {
|
|
6
7
|
const vvoc = await loadVvocConfigForRead({
|
|
7
8
|
scope: "effective",
|
|
@@ -10,7 +11,7 @@ const DEFAULT_DEPENDENCIES = {
|
|
|
10
11
|
});
|
|
11
12
|
return isVvocPluginEnabled(vvoc.config, "analytics");
|
|
12
13
|
},
|
|
13
|
-
renderLabel: (label, color) => _jsx("span", { style: { color }, children: label.text }),
|
|
14
|
+
renderLabel: (label, color) => (_jsx("text", { children: _jsx("span", { style: { fg: color }, children: label.text }) })),
|
|
14
15
|
};
|
|
15
16
|
// START_BLOCK_INDICATOR_ACCUMULATOR
|
|
16
17
|
/** Rolling per-session sums fed by step-finish parts. Same eligibility rule as metrics. */
|
|
@@ -112,6 +113,6 @@ function toneColor(api, tone) {
|
|
|
112
113
|
: tone === "red"
|
|
113
114
|
? theme.error
|
|
114
115
|
: theme.textMuted;
|
|
115
|
-
return
|
|
116
|
+
return rgbaToHex(rgba);
|
|
116
117
|
}
|
|
117
118
|
//# sourceMappingURL=indicator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indicator.js","sourceRoot":"","sources":["../../../src/tui/analytics/indicator.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"indicator.js","sourceRoot":"","sources":["../../../src/tui/analytics/indicator.tsx"],"names":[],"mappings":";AA2BA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmBxC,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC;YACvC,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;SAC9B,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IACD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAC7B,yBACE,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAG,KAAK,CAAC,IAAI,GAAQ,GAC1C,CACR;CACF,CAAC;AAEF,oCAAoC;AACpC,2FAA2F;AAC3F,MAAM,UAAU,0BAA0B;IAIxC,IAAI,KAAK,GAAoB;QAC3B,KAAK,EAAE,CAAC;QACR,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,CAAC;KACT,CAAC;IACF,OAAO;QACL,SAAS,CAAC,IAAoB;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO;YACxC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAGhC,CAAC;YACF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAChD,KAAK,GAAG;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;gBACtB,aAAa,EAAE,KAAK,CAAC,aAAa,GAAG,CAAC,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzE,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS;gBACtC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,UAAU;gBACzC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;aAC3C,CAAC;QACJ,CAAC;QACD,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,6EAA6E;AAC7E,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AACD,kCAAkC;AAElC,iCAAiC;AACjC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAiB,EACjB,OAAuB,EACvB,eAAsC,oBAAoB;IAE1D,IAAI,OAAO,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO;IACvC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO;IAE/C,MAAM,WAAW,GAAG,0BAA0B,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE;QACjE,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClD,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YACjB,KAAK,EAAE;gBACL,oBAAoB,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACpC,IAAI,KAAK,CAAC,UAAU,KAAK,gBAAgB,CAAC,GAAG,CAAC;wBAAE,OAAO,SAAS,CAAC;oBACjE,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;oBAChD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;wBAAE,OAAO,SAAS,CAAC;oBAC7C,OAAO,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrE,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,gBAAgB,CAAC,GAAiB;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;QAC1C,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,0DAA0D;AAC1D,SAAS,SAAS,CAAC,GAAiB,EAAE,IAA4B;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;IAChC,MAAM,IAAI,GACR,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,IAAI,KAAK,QAAQ;YACjB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,IAAI,KAAK,KAAK;gBACd,CAAC,CAAC,KAAK,CAAC,KAAK;gBACb,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "@opentui/solid/jsx-runtime";
|
|
2
2
|
import { getPackageVersionSync } from "../../lib/package.js";
|
|
3
|
+
import { rgbaToHex } from "../color.js";
|
|
3
4
|
const DEFAULT_DEPENDENCIES = {
|
|
4
|
-
renderLabel: (text, color) => _jsx("span", { style: { color }, children: text }),
|
|
5
|
+
renderLabel: (text, color) => (_jsx("text", { children: _jsx("span", { style: { fg: color }, children: text }) })),
|
|
5
6
|
};
|
|
6
7
|
/** The rendered label, e.g. "vvoc v1.2.11". */
|
|
7
8
|
export function brandingFooterLabel() {
|
|
@@ -21,7 +22,7 @@ export function registerBrandingFooter(api, dependencies = DEFAULT_DEPENDENCIES)
|
|
|
21
22
|
slots: {
|
|
22
23
|
sidebar_footer: () => {
|
|
23
24
|
const muted = api.theme.current.textMuted;
|
|
24
|
-
const color =
|
|
25
|
+
const color = rgbaToHex(api.theme.current.textMuted);
|
|
25
26
|
return dependencies.renderLabel(brandingFooterLabel(), color);
|
|
26
27
|
},
|
|
27
28
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../src/tui/branding/footer.tsx"],"names":[],"mappings":";AAuBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../src/tui/branding/footer.tsx"],"names":[],"mappings":";AAuBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,MAAM,oBAAoB,GAAyB;IACjD,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC5B,yBACE,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAG,IAAI,GAAQ,GACpC,CACR;CACF,CAAC;AAEF,+CAA+C;AAC/C,MAAM,UAAU,mBAAmB;IACjC,OAAO,SAAS,qBAAqB,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED,uCAAuC;AACvC;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAiB,EACjB,eAAqC,oBAAoB;IAEzD,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,UAAU;QAAE,OAAO;IACtD,IAAI,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YACjB,KAAK,EAAE;gBACL,cAAc,EAAE,GAAG,EAAE;oBACnB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;oBAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACrD,OAAO,YAAY,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChE,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** RGBA-like theme color shape produced by the OpenCode TUI theme API. */
|
|
2
|
+
export type RgbaLike = {
|
|
3
|
+
r: number;
|
|
4
|
+
g: number;
|
|
5
|
+
b: number;
|
|
6
|
+
a: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Formats an RGBA-like theme color as a six-digit hex string.
|
|
10
|
+
* Alpha is dropped: rgba() strings and 8-digit hex parse unreliably in
|
|
11
|
+
* @opentui/core, while #rrggbb parses exactly.
|
|
12
|
+
*/
|
|
13
|
+
export declare function rgbaToHex(color: RgbaLike): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// FILE: src/tui/color.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Convert OpenTUI RGBA theme values into color strings the OpenTUI solid span style reliably parses.
|
|
5
|
+
// SCOPE: Six-digit hex formatting from RGBA components; alpha is intentionally dropped because 8-digit forms parse unreliably in @opentui/core.
|
|
6
|
+
// DEPENDS: [none]
|
|
7
|
+
// LINKS: [M-TUI-BRANDING-FOOTER, M-TUI-ANALYTICS-INDICATOR]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// rgbaToHex - Formats an RGBA-like theme color as #rrggbb.
|
|
14
|
+
// END_MODULE_MAP
|
|
15
|
+
//
|
|
16
|
+
// START_CHANGE_SUMMARY
|
|
17
|
+
// LAST_CHANGE: [2026-08-20-orphan-text-fix - Added reliable theme color formatting for text span foregrounds.]
|
|
18
|
+
// END_CHANGE_SUMMARY
|
|
19
|
+
/**
|
|
20
|
+
* Formats an RGBA-like theme color as a six-digit hex string.
|
|
21
|
+
* Alpha is dropped: rgba() strings and 8-digit hex parse unreliably in
|
|
22
|
+
* @opentui/core, while #rrggbb parses exactly.
|
|
23
|
+
*/
|
|
24
|
+
export function rgbaToHex(color) {
|
|
25
|
+
const channel = (value) => Math.max(0, Math.min(255, Math.round(value)))
|
|
26
|
+
.toString(16)
|
|
27
|
+
.padStart(2, "0");
|
|
28
|
+
return `#${channel(color.r)}${channel(color.g)}${channel(color.b)}`;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/tui/color.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,iBAAiB;AACjB,wBAAwB;AACxB,gHAAgH;AAChH,kJAAkJ;AAClJ,oBAAoB;AACpB,8DAA8D;AAC9D,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,6DAA6D;AAC7D,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,iHAAiH;AACjH,qBAAqB;AAUrB;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAChC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1C,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC"}
|
package/package.json
CHANGED
package/schemas/vvoc/v3.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.3.
|
|
3
|
+
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.3.1/schemas/vvoc/v3.json",
|
|
4
4
|
"title": "vvoc config",
|
|
5
5
|
"description": "Canonical vvoc configuration document.",
|
|
6
6
|
"type": "object",
|