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.
- package/README.md +249 -68
- package/bin/lib.js +433 -29
- package/bin/oc-go-usage-display-init.js +42 -13
- package/bin/oc-go-usage-display-remove.js +38 -0
- package/bin/oc-go-usage-display-show.js +47 -39
- package/bin/oc-go-usage-display-status.js +33 -42
- package/bin/oc-go-usage-display-update.js +27 -14
- package/dist/helpers.d.ts +116 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +568 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +5 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +258 -278
- package/dist/index.js.map +1 -1
- package/dist/plugins/oc-go-usage-display.kilo.ts +678 -0
- package/dist/plugins/oc-go-usage-display.kilo.tsx +1272 -0
- package/dist/plugins/oc-go-usage-display.ts +678 -0
- package/dist/plugins/oc-go-usage-display.tsx +1018 -0
- package/dist/shared.d.ts +96 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +575 -0
- package/dist/shared.js.map +1 -0
- package/dist/tui-shared.d.ts +109 -0
- package/dist/tui-shared.d.ts.map +1 -0
- package/dist/tui-shared.js +372 -0
- package/dist/tui-shared.js.map +1 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +226 -377
- package/dist/tui.js.map +1 -1
- package/dist/tui.kilo.d.ts +8 -0
- package/dist/tui.kilo.d.ts.map +1 -0
- package/dist/tui.kilo.js +502 -0
- package/dist/tui.kilo.js.map +1 -0
- package/package.json +47 -13
- package/src/helpers.ts +733 -0
- package/src/index.ts +331 -304
- package/src/shared.ts +696 -0
- package/src/tui-shared.tsx +705 -0
- package/src/tui.kilo.tsx +816 -0
- 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;
|
|
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"}
|