oc-go-usage-display 1.0.2 → 2.0.0

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.
Files changed (41) hide show
  1. package/README.md +249 -68
  2. package/bin/lib.js +433 -29
  3. package/bin/oc-go-usage-display-init.js +42 -13
  4. package/bin/oc-go-usage-display-remove.js +38 -0
  5. package/bin/oc-go-usage-display-show.js +47 -39
  6. package/bin/oc-go-usage-display-status.js +33 -42
  7. package/bin/oc-go-usage-display-update.js +27 -14
  8. package/dist/helpers.d.ts +116 -0
  9. package/dist/helpers.d.ts.map +1 -0
  10. package/dist/helpers.js +568 -0
  11. package/dist/helpers.js.map +1 -0
  12. package/dist/index.d.ts +5 -9
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +258 -278
  15. package/dist/index.js.map +1 -1
  16. package/dist/plugins/oc-go-usage-display.kilo.ts +678 -0
  17. package/dist/plugins/oc-go-usage-display.kilo.tsx +1272 -0
  18. package/dist/plugins/oc-go-usage-display.ts +678 -0
  19. package/dist/plugins/oc-go-usage-display.tsx +1018 -0
  20. package/dist/shared.d.ts +96 -0
  21. package/dist/shared.d.ts.map +1 -0
  22. package/dist/shared.js +575 -0
  23. package/dist/shared.js.map +1 -0
  24. package/dist/tui-shared.d.ts +109 -0
  25. package/dist/tui-shared.d.ts.map +1 -0
  26. package/dist/tui-shared.js +372 -0
  27. package/dist/tui-shared.js.map +1 -0
  28. package/dist/tui.d.ts.map +1 -1
  29. package/dist/tui.js +226 -377
  30. package/dist/tui.js.map +1 -1
  31. package/dist/tui.kilo.d.ts +8 -0
  32. package/dist/tui.kilo.d.ts.map +1 -0
  33. package/dist/tui.kilo.js +502 -0
  34. package/dist/tui.kilo.js.map +1 -0
  35. package/package.json +47 -13
  36. package/src/helpers.ts +733 -0
  37. package/src/index.ts +331 -304
  38. package/src/shared.ts +696 -0
  39. package/src/tui-shared.tsx +705 -0
  40. package/src/tui.kilo.tsx +816 -0
  41. package/src/tui.tsx +356 -465
@@ -0,0 +1,109 @@
1
+ /** @jsxImportSource @opentui/solid */
2
+ import type { JSX } from "@opentui/solid/jsx-runtime";
3
+ import type { TuiTheme } from "@opencode-ai/plugin/tui";
4
+ import type { PlanRow, ProviderSource, ResetCountdown, SurfaceSelection, UsageMeterSeverity, UsageRow } from "./helpers.js";
5
+ import type { UsageHost, UsageSnapshot } from "./shared.js";
6
+ export declare const POLL_INTERVAL_MS = 60000;
7
+ export declare const EVENT_TTL_MS = 15000;
8
+ export declare const KV_DISPLAY_KEY = "display";
9
+ export declare const KV_COLLAPSED_SIDEBAR_KEY = "collapsed_sidebar";
10
+ export declare const KV_COLLAPSED_STATUSLINE_KEY = "collapsed_statusline";
11
+ export type UsagePanelApi = {
12
+ kv: {
13
+ get<Value = unknown>(key: string, fallback?: Value): Value;
14
+ set(key: string, value: unknown): void;
15
+ };
16
+ client: {
17
+ app: {
18
+ log(entry: {
19
+ service: string;
20
+ level: "error";
21
+ message: string;
22
+ }): Promise<unknown>;
23
+ };
24
+ };
25
+ };
26
+ export declare function reactiveChild(accessor: () => unknown): JSX.Element;
27
+ export declare function meterColor(theme: TuiTheme, severity: UsageMeterSeverity): import("@opentui/core").RGBA;
28
+ export declare function logUsageError(api: UsagePanelApi, message: string): Promise<void>;
29
+ export type UsageStore = {
30
+ snapshot: () => UsageSnapshot | null;
31
+ refresh: () => Promise<void>;
32
+ refreshSafely: (ttlOverride?: number) => void;
33
+ };
34
+ export declare function createUsageStore(api: UsagePanelApi, host: UsageHost): UsageStore;
35
+ export type DisplayOptions = {
36
+ sidebar?: unknown;
37
+ statusline?: unknown;
38
+ display?: unknown;
39
+ };
40
+ export declare function resolveSurfaceSelection(options: DisplayOptions | undefined, api: UsagePanelApi, host: UsageHost): SurfaceSelection;
41
+ export type CollapseState = {
42
+ isSidebarCollapsed: () => boolean;
43
+ isStatuslineCollapsed: () => boolean;
44
+ toggleSidebar: () => void;
45
+ toggleStatusline: () => void;
46
+ };
47
+ export declare function createCollapseState(api: UsagePanelApi): CollapseState;
48
+ export declare function isGoUsageProvider(providerId: string | undefined): boolean;
49
+ export declare function makeProviderResolver(state: ProviderSource | undefined, fallback: () => string | undefined): (sessionId: string) => string | undefined;
50
+ export type ProviderCatalogSource = {
51
+ state?: {
52
+ provider?: ReadonlyArray<{
53
+ id?: unknown;
54
+ name?: unknown;
55
+ models?: Readonly<Record<string, {
56
+ name?: unknown;
57
+ } | undefined>>;
58
+ }>;
59
+ };
60
+ };
61
+ export declare function readProviderDisplayNames(source: ProviderCatalogSource): ReadonlyMap<string, string>;
62
+ export declare function readModelDisplayName(source: ProviderCatalogSource, providerID: string, modelID: string): string | null;
63
+ export declare function LabeledValueRow(props: {
64
+ theme: TuiTheme;
65
+ row: UsageRow;
66
+ }): import("solid-js").JSX.Element;
67
+ export declare const MIN_METER_WIDTH = 6;
68
+ export declare function MeterBar(props: {
69
+ theme: TuiTheme;
70
+ percent: number;
71
+ severity: UsageMeterSeverity;
72
+ }): import("solid-js").JSX.Element;
73
+ export declare function GoPlanRow(props: {
74
+ theme: TuiTheme;
75
+ row: PlanRow;
76
+ }): import("solid-js").JSX.Element;
77
+ export declare function GoPlanSection(props: {
78
+ theme: TuiTheme;
79
+ rows: PlanRow[];
80
+ }): import("solid-js").JSX.Element;
81
+ export declare function SectionHeader(props: {
82
+ theme: TuiTheme;
83
+ label: string;
84
+ expanded: () => boolean;
85
+ count: () => number | null;
86
+ onToggle: () => void;
87
+ }): import("solid-js").JSX.Element;
88
+ export declare function CollapsibleSection(props: {
89
+ theme: TuiTheme;
90
+ label: string;
91
+ count: () => number | null;
92
+ expanded: () => boolean;
93
+ onToggle: () => void;
94
+ body: () => JSX.Element;
95
+ }): import("solid-js").JSX.Element;
96
+ export declare function GoShareRow(props: {
97
+ theme: TuiTheme;
98
+ percent: number;
99
+ }): import("solid-js").JSX.Element;
100
+ export declare function GoUsageBlock(props: {
101
+ api: UsagePanelApi;
102
+ theme: TuiTheme;
103
+ snapshot: () => UsageSnapshot | null;
104
+ resetLine?: () => ResetCountdown | null;
105
+ }): import("solid-js").JSX.Element;
106
+ export declare function GoStatusline(props: {
107
+ snapshot: () => UsageSnapshot | null;
108
+ }): import("solid-js").JSX.Element;
109
+ //# sourceMappingURL=tui-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-shared.d.ts","sourceRoot":"","sources":["../src/tui-shared.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,372 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
2
+ import { For, Show, createEffect, createMemo, createSignal } from "solid-js";
3
+ import { PLAN_LABEL_WIDTH, buildPlanRows, formatPercentCell, formatStatusline, isDisplayMode, isSnapshotEmpty, meterFillPercent, meterSeverityForPercent, parseBooleanFlag, resolveProviderId, surfaceSelectionFromDisplayMode, } from "./helpers.js";
4
+ import { extractSnapshotFromApiPayload, hostEnv, isRecord, mockSnapshot, readAuthJsonApiKey, toNonEmptyString, unavailableSnapshot, GO_PLAN_HEADING, GO_PROVIDER_ID, INTEGRATED_GO_SHARE_LABEL, SIDEBAR_COLLAPSED_GLYPH, SIDEBAR_EXPANDED_GLYPH, } from "./shared.js";
5
+ // ---------------------------------------------------------------------------
6
+ // Constants
7
+ // ---------------------------------------------------------------------------
8
+ const API_USAGE_URL = "https://opencode.ai/zen/go/v1/usage";
9
+ // One refresh policy for both hosts, so the numbers on a host's sidebar and its
10
+ // statusline can never come from two different cadences: the background poll,
11
+ // the event TTL and the debounce below are the same numbers as the ones each
12
+ // entry passes to `refreshSafely`.
13
+ export const POLL_INTERVAL_MS = 60_000;
14
+ export const EVENT_TTL_MS = 15_000;
15
+ const DEBOUNCE_MS = 5_000;
16
+ const FETCH_TIMEOUT_MS = 10_000;
17
+ const LOG_SERVICE = "oc-go-usage-display";
18
+ // Persisted `api.kv` keys. Each host keeps its own store, so the same names
19
+ // never collide across hosts.
20
+ export const KV_DISPLAY_KEY = "display";
21
+ export const KV_COLLAPSED_SIDEBAR_KEY = "collapsed_sidebar";
22
+ export const KV_COLLAPSED_STATUSLINE_KEY = "collapsed_statusline";
23
+ const KV_COLLAPSED_LEGACY_KEY = "collapsed";
24
+ export function reactiveChild(accessor) {
25
+ return accessor;
26
+ }
27
+ export function meterColor(theme, severity) {
28
+ if (severity === "error")
29
+ return theme.current.error;
30
+ if (severity === "warning")
31
+ return theme.current.warning;
32
+ return theme.current.textMuted;
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Failure boundary (api.client.app.log, never console; secrets never logged)
36
+ // ---------------------------------------------------------------------------
37
+ export async function logUsageError(api, message) {
38
+ try {
39
+ await api.client.app.log({ service: LOG_SERVICE, level: "error", message });
40
+ }
41
+ catch {
42
+ // Logging is best-effort; the usage display must never break the host.
43
+ }
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Data boundary (auth.json -> Bearer usage fetch; throws nothing)
47
+ // ---------------------------------------------------------------------------
48
+ async function fetchJsonWithTimeout(url, apiKey) {
49
+ const controller = new AbortController();
50
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
51
+ try {
52
+ const response = await fetch(url, {
53
+ signal: controller.signal,
54
+ headers: { Authorization: `Bearer ${apiKey}`, Accept: "application/json" },
55
+ });
56
+ if (response.status === 401 || response.status === 403)
57
+ return { __rejected: true };
58
+ if (!response.ok)
59
+ return null;
60
+ try {
61
+ return (await response.json());
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ finally {
71
+ clearTimeout(timer);
72
+ }
73
+ }
74
+ async function loadUsageSnapshot(host) {
75
+ if (hostEnv(host, "MOCK") === "1")
76
+ return mockSnapshot();
77
+ const apiKey = toNonEmptyString(hostEnv(host, "API_KEY")) ?? readAuthJsonApiKey(host);
78
+ if (apiKey === null)
79
+ return null;
80
+ const payload = await fetchJsonWithTimeout(API_USAGE_URL, apiKey);
81
+ if (payload === null)
82
+ return null;
83
+ // Mirror the server: a rejected key is a distinct unavailable snapshot
84
+ // (surfaced via `apiError`) rather than a silent null.
85
+ if (isRecord(payload) && payload.__rejected === true) {
86
+ return unavailableSnapshot("API key rejected (401/403)");
87
+ }
88
+ return extractSnapshotFromApiPayload(payload);
89
+ }
90
+ export function createUsageStore(api, host) {
91
+ const [snapshot, setSnapshot] = createSignal(null);
92
+ let cachedAt = 0;
93
+ let lastFetchAt = 0;
94
+ let refreshInFlight = false;
95
+ async function refresh(ttlOverride) {
96
+ if (refreshInFlight)
97
+ return;
98
+ const effectiveTtl = ttlOverride ?? POLL_INTERVAL_MS;
99
+ if (ttlOverride !== undefined) {
100
+ if (Date.now() - lastFetchAt < DEBOUNCE_MS)
101
+ return;
102
+ if (Date.now() - cachedAt < effectiveTtl && snapshot() !== null)
103
+ return;
104
+ }
105
+ else if (Date.now() - cachedAt < POLL_INTERVAL_MS && snapshot() !== null) {
106
+ return;
107
+ }
108
+ refreshInFlight = true;
109
+ try {
110
+ const next = await loadUsageSnapshot(host);
111
+ if (next === null) {
112
+ if (snapshot() === null) {
113
+ await logUsageError(api, "Go usage unavailable (not configured or request failed)");
114
+ }
115
+ return;
116
+ }
117
+ cachedAt = Date.now();
118
+ setSnapshot(next);
119
+ }
120
+ catch {
121
+ // Keep stale data; the panel simply shows the last known snapshot.
122
+ }
123
+ finally {
124
+ lastFetchAt = Date.now();
125
+ refreshInFlight = false;
126
+ }
127
+ }
128
+ return {
129
+ snapshot,
130
+ refresh: () => refresh(),
131
+ refreshSafely: (ttlOverride) => {
132
+ void refresh(ttlOverride).catch(() => {
133
+ // refresh already swallows failures; this guards a regression.
134
+ });
135
+ },
136
+ };
137
+ }
138
+ export function resolveSurfaceSelection(options, api, host) {
139
+ if (options !== undefined) {
140
+ const sidebarOption = parseBooleanFlag(options.sidebar);
141
+ const statuslineOption = parseBooleanFlag(options.statusline);
142
+ if (sidebarOption !== null || statuslineOption !== null) {
143
+ return { sidebar: sidebarOption ?? true, statusline: statuslineOption ?? true };
144
+ }
145
+ if (isDisplayMode(options.display))
146
+ return surfaceSelectionFromDisplayMode(options.display);
147
+ }
148
+ const sidebarEnv = parseBooleanFlag(hostEnv(host, "SIDEBAR"));
149
+ const statuslineEnv = parseBooleanFlag(hostEnv(host, "STATUSLINE"));
150
+ if (sidebarEnv !== null || statuslineEnv !== null) {
151
+ return { sidebar: sidebarEnv ?? true, statusline: statuslineEnv ?? true };
152
+ }
153
+ const displayEnv = toNonEmptyString(hostEnv(host, "DISPLAY"));
154
+ if (displayEnv !== null && isDisplayMode(displayEnv)) {
155
+ return surfaceSelectionFromDisplayMode(displayEnv);
156
+ }
157
+ try {
158
+ const stored = api.kv.get(KV_DISPLAY_KEY, "both");
159
+ if (isDisplayMode(stored))
160
+ return surfaceSelectionFromDisplayMode(stored);
161
+ }
162
+ catch {
163
+ // Persisted settings are best-effort; fall through to the default.
164
+ }
165
+ return { sidebar: true, statusline: true };
166
+ }
167
+ function readCollapsedFlag(api, key) {
168
+ try {
169
+ return api.kv.get(key, false) === true;
170
+ }
171
+ catch {
172
+ return false;
173
+ }
174
+ }
175
+ function migrateLegacyCollapsedFlag(api) {
176
+ let legacyCollapsed = false;
177
+ try {
178
+ legacyCollapsed = api.kv.get(KV_COLLAPSED_LEGACY_KEY, false) === true;
179
+ }
180
+ catch {
181
+ return;
182
+ }
183
+ if (!legacyCollapsed)
184
+ return;
185
+ try {
186
+ api.kv.set(KV_COLLAPSED_SIDEBAR_KEY, true);
187
+ api.kv.set(KV_COLLAPSED_STATUSLINE_KEY, true);
188
+ api.kv.set(KV_COLLAPSED_LEGACY_KEY, false);
189
+ }
190
+ catch {
191
+ // Collapse state is best-effort persistence only.
192
+ }
193
+ }
194
+ export function createCollapseState(api) {
195
+ migrateLegacyCollapsedFlag(api);
196
+ const [isSidebarCollapsed, setIsSidebarCollapsed] = createSignal(readCollapsedFlag(api, KV_COLLAPSED_SIDEBAR_KEY));
197
+ const [isStatuslineCollapsed, setIsStatuslineCollapsed] = createSignal(readCollapsedFlag(api, KV_COLLAPSED_STATUSLINE_KEY));
198
+ return {
199
+ isSidebarCollapsed,
200
+ isStatuslineCollapsed,
201
+ toggleSidebar() {
202
+ try {
203
+ const next = !isSidebarCollapsed();
204
+ setIsSidebarCollapsed(next);
205
+ api.kv.set(KV_COLLAPSED_SIDEBAR_KEY, next);
206
+ }
207
+ catch {
208
+ // Collapse state is best-effort persistence only.
209
+ }
210
+ },
211
+ toggleStatusline() {
212
+ try {
213
+ const next = !isStatuslineCollapsed();
214
+ setIsStatuslineCollapsed(next);
215
+ api.kv.set(KV_COLLAPSED_STATUSLINE_KEY, next);
216
+ }
217
+ catch {
218
+ // Collapse state is best-effort persistence only.
219
+ }
220
+ },
221
+ };
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Provider gate
225
+ // ---------------------------------------------------------------------------
226
+ export function isGoUsageProvider(providerId) {
227
+ return providerId === GO_PROVIDER_ID;
228
+ }
229
+ // Which provider is in use, read live on every render rather than latched at
230
+ // init. Latching left the gate closed for anyone without a config-level model,
231
+ // and `session.updated` only fires on a server-side change, so opening a
232
+ // session or switching model in the picker never re-armed it -- the plugin
233
+ // loaded, showed as `active` in the Plugins menu, and rendered nothing.
234
+ export function makeProviderResolver(state, fallback) {
235
+ return (sessionId) => resolveProviderId(state, sessionId, fallback());
236
+ }
237
+ export function readProviderDisplayNames(source) {
238
+ const names = new Map();
239
+ try {
240
+ for (const provider of source.state?.provider ?? []) {
241
+ const id = toNonEmptyString(provider.id);
242
+ if (id === null)
243
+ continue;
244
+ names.set(id, toNonEmptyString(provider.name) ?? id);
245
+ }
246
+ }
247
+ catch {
248
+ // The catalog is optional: a group falls back to its raw provider id.
249
+ }
250
+ return names;
251
+ }
252
+ export function readModelDisplayName(source, providerID, modelID) {
253
+ try {
254
+ const provider = source.state?.provider?.find((entry) => entry.id === providerID);
255
+ return toNonEmptyString(provider?.models?.[modelID]?.name);
256
+ }
257
+ catch {
258
+ return null;
259
+ }
260
+ }
261
+ // ---------------------------------------------------------------------------
262
+ // Row grammar
263
+ // ---------------------------------------------------------------------------
264
+ // A `space-between` label/value row, the grammar the hosts' own panels use.
265
+ export function LabeledValueRow(props) {
266
+ return (_jsxs("box", { flexDirection: "row", justifyContent: "space-between", children: [_jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: props.row.label }), _jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: props.row.value })] }));
267
+ }
268
+ // The narrowest a meter may become before it stops being a meter: enough to read
269
+ // a filled-vs-empty split at a glance.
270
+ export const MIN_METER_WIDTH = 6;
271
+ // A meter as two boxes: the filled part at the window's percentage, the track for
272
+ // the rest. Both fill whatever the row has, so the bar reaches the sidebar's
273
+ // right edge on any host, at any sidebar width, with nothing to measure and
274
+ // nothing to guess -- the failure modes a fixed-width glyph string has (too short
275
+ // on a wide sidebar, clipped on a narrow one) cannot happen.
276
+ //
277
+ // The track is a surface tone rather than the severity colour, so an empty meter
278
+ // reads as an empty track instead of blank space.
279
+ export function MeterBar(props) {
280
+ const fill = createMemo(() => meterFillPercent(props.percent));
281
+ return (_jsxs("box", { flexDirection: "row", flexGrow: 1, flexShrink: 1, minWidth: MIN_METER_WIDTH, children: [_jsx("box", { width: `${fill()}%`, backgroundColor: meterColor(props.theme, props.severity) }), _jsx("box", { flexGrow: 1, backgroundColor: props.theme.current.backgroundElement })] }));
282
+ }
283
+ // One plan window as a row of three FIXED-WIDTH columns: label, bar, percent.
284
+ //
285
+ // Not `justifyContent="space-between"` on a label plus a bar: that lets the bar
286
+ // start wherever the label happened to end, so the three meters only look
287
+ // stacked when every label is the same width -- and a terminal font that draws
288
+ // the empty meter glyph narrower than the full one shifts the bar of a 0% row
289
+ // against a 100% one (seen at 30d 100% next to 5h 0%). Fixed columns make the
290
+ // meters stack whatever the font does, and the percentages right-align on one
291
+ // edge.
292
+ export function GoPlanRow(props) {
293
+ return (_jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", children: [_jsx("box", { width: PLAN_LABEL_WIDTH, marginRight: 1, flexShrink: 0, flexDirection: "row", children: _jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: props.row.label }) }), _jsx(MeterBar, { theme: props.theme, percent: props.row.percent, severity: props.row.severity }), _jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", flexShrink: 0, children: formatPercentCell(props.row.percent) })] }), _jsx(Show, { when: props.row.reset, children: (reset) => (_jsxs("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: ["resets in ", reset()] })) })] }));
294
+ }
295
+ export function GoPlanSection(props) {
296
+ return (_jsxs("box", { flexDirection: "column", children: [_jsx("text", { fg: props.theme.current.text, wrapMode: "none", children: _jsx("b", { children: GO_PLAN_HEADING }) }), _jsx("box", { flexDirection: "column", paddingLeft: 1, children: _jsx(For, { each: props.rows, children: (row) => _jsx(GoPlanRow, { theme: props.theme, row: row }) }) })] }));
297
+ }
298
+ export function SectionHeader(props) {
299
+ return (_jsxs("box", { flexDirection: "row", gap: 1, flexShrink: 0, onMouseDown: props.onToggle, children: [_jsx("text", { fg: props.theme.current.text, wrapMode: "none", flexShrink: 0, children: reactiveChild(() => (props.expanded() ? SIDEBAR_EXPANDED_GLYPH : SIDEBAR_COLLAPSED_GLYPH)) }), _jsx("text", { fg: props.theme.current.text, wrapMode: "none", children: _jsx("b", { children: reactiveChild(() => {
300
+ const count = props.count();
301
+ return count === null ? props.label : `${props.label} (${count})`;
302
+ }) }) })] }));
303
+ }
304
+ // A collapsible region: the header reacts to its own state, and the body is a
305
+ // memo so an unchanged subtree keeps the very same element instead of being
306
+ // rebuilt on every unrelated signal write.
307
+ export function CollapsibleSection(props) {
308
+ return (_jsxs("box", { flexDirection: "column", children: [_jsx(SectionHeader, { theme: props.theme, label: props.label, count: props.count, expanded: props.expanded, onToggle: props.onToggle }), _jsx("box", { flexDirection: "column", gap: 1, children: reactiveChild(() => (props.expanded() ? props.body() : null)) })] }));
309
+ }
310
+ // A model's share of the Go tokens spent in this session tree, drawn with the
311
+ // same block bar and the same threshold coloring as the plan meters. It is a
312
+ // share of tokens and nothing else: not of the plan, not a quota, not a price.
313
+ // A model's Go share: the bar and the percent pinned to the RIGHT edge of the
314
+ // row, so they line up with the Steps/Cost columns of the table above instead of
315
+ // trailing the label wherever it happens to end. The label takes the slack
316
+ // (`flexGrow`), the meter group never shrinks.
317
+ export function GoShareRow(props) {
318
+ const rounded = Math.round(props.percent);
319
+ return (_jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", flexShrink: 0, flexGrow: 1, children: INTEGRATED_GO_SHARE_LABEL }), _jsx(MeterBar, { theme: props.theme, percent: rounded, severity: meterSeverityForPercent(rounded) }), _jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", flexShrink: 0, children: formatPercentCell(rounded) })] }));
320
+ }
321
+ // ---------------------------------------------------------------------------
322
+ // The compact `Go Usage` block both hosts lead the sidebar with
323
+ // ---------------------------------------------------------------------------
324
+ // The `Go Usage` block both hosts lead their sidebar with: the next reset on one
325
+ // line, then the plan as the meters themselves, one row per window, stacked in
326
+ // fixed-width columns.
327
+ //
328
+ // One shape for both hosts, on purpose. Kilo's standalone band and opencode's
329
+ // whole sidebar used to be different layouts (label/value rows with a separate
330
+ // `Go Plan` heading, versus meters inline), which meant the plan looked like a
331
+ // different feature depending on where it was drawn. Kilo's integrated mode does
332
+ // not use this block at all -- the plan is drawn once, inside its Models table
333
+ // where it belongs to the provider it meters.
334
+ //
335
+ // There is no meter width in here to tune: `MeterBar` fills the row.
336
+ export function GoUsageBlock(props) {
337
+ createEffect(() => {
338
+ const snapshot = props.snapshot();
339
+ if (snapshot !== null && snapshot.source === "unavailable") {
340
+ void logUsageError(props.api, snapshot.apiError ? `Go usage unavailable (${snapshot.apiError})` : "Go usage snapshot unavailable");
341
+ }
342
+ });
343
+ const body = createMemo(() => {
344
+ const snapshot = props.snapshot();
345
+ if (snapshot === null) {
346
+ return (_jsx("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: "Go loading\u2026" }));
347
+ }
348
+ // Rejected keys (and other unavailable snapshots) must surface a row
349
+ // instead of a bare header with zero rows. The statusline stays hidden for
350
+ // unavailable (isSnapshotEmpty -> null).
351
+ if (snapshot.source === "unavailable") {
352
+ return (_jsxs("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: ["Go n/a (", snapshot.apiError ?? "unavailable", ")"] }));
353
+ }
354
+ // The per-row `resets in` suffix is dropped here: `resetLine` already prints
355
+ // the plan's countdown under the header, and printing one countdown twice in
356
+ // a single block is noise rather than emphasis. Both that line and the
357
+ // statusline read `relevantReset`, so the block and the statusline can only
358
+ // ever be counting down to the same window.
359
+ const planRows = buildPlanRows(snapshot).map((row) => ({ ...row, reset: null }));
360
+ return (_jsxs("box", { flexDirection: "column", children: [_jsx(Show, { when: props.resetLine === undefined ? null : props.resetLine(), children: (reset) => (_jsxs("text", { fg: props.theme.current.textMuted, wrapMode: "none", children: [reset().label, " resets in ", reset().text] })) }), _jsx(For, { each: planRows, children: (row) => _jsx(GoPlanRow, { theme: props.theme, row: row }) })] }));
361
+ });
362
+ return (_jsxs("box", { flexDirection: "column", children: [_jsx("text", { fg: props.theme.current.text, children: _jsx("b", { children: "Go Usage" }) }), reactiveChild(body)] }));
363
+ }
364
+ // The compact statusline: one muted line next to the host's context readout.
365
+ export function GoStatusline(props) {
366
+ return (_jsx(Show, { when: props.snapshot(), fallback: null, children: (snapshot) => {
367
+ if (isSnapshotEmpty(snapshot()))
368
+ return null;
369
+ return _jsx("text", { children: formatStatusline(snapshot()) });
370
+ } }));
371
+ }
372
+ //# sourceMappingURL=tui-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-shared.js","sourceRoot":"","sources":["../src/tui-shared.tsx"],"names":[],"mappings":"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"}
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAqDtC,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,yBAAyB,CAAC;;;;;AA8djC,wBAAwF"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAuDtC,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,yBAAyB,CAAC;;;;;AA+WjC,wBAAwF"}