opencode-visual-cache 1.6.4 → 1.6.5
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/dist/_version.d.ts +1 -1
- package/dist/_version.js +1 -1
- package/dist/balance-providers.d.ts +9 -0
- package/dist/balance-providers.js +219 -1
- package/dist/i18n.d.ts +13 -0
- package/dist/i18n.js +52 -0
- package/dist/index.js +106 -4
- package/dist/tui.js +554 -161
- package/package.json +2 -1
- package/src/_version.ts +1 -1
- package/src/balance-providers.ts +248 -1
- package/src/i18n.ts +52 -0
- package/src/index.tsx +124 -9
package/dist/tui.js
CHANGED
|
@@ -13,7 +13,7 @@ import { createElement as _$createElement } from "@opentui/solid";
|
|
|
13
13
|
import { createMemo, createSignal, createEffect, onMount, onCleanup, Show, For, untrack } from "solid-js";
|
|
14
14
|
|
|
15
15
|
// src/_version.ts
|
|
16
|
-
var PLUGIN_VERSION = "1.6.
|
|
16
|
+
var PLUGIN_VERSION = "1.6.5";
|
|
17
17
|
|
|
18
18
|
// src/balance-providers.ts
|
|
19
19
|
var BalanceError = class extends Error {
|
|
@@ -122,7 +122,200 @@ var hyperProvider = {
|
|
|
122
122
|
return [{ currency: "USD", total: usd }];
|
|
123
123
|
}
|
|
124
124
|
};
|
|
125
|
-
|
|
125
|
+
function decodeJwtPayload(token) {
|
|
126
|
+
try {
|
|
127
|
+
const encoded = token.split(".")[1];
|
|
128
|
+
if (!encoded || typeof atob !== "function") return void 0;
|
|
129
|
+
const binary = atob(encoded.replace(/-/g, "+").replace(/_/g, "/"));
|
|
130
|
+
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
131
|
+
return JSON.parse(new TextDecoder().decode(bytes));
|
|
132
|
+
} catch {
|
|
133
|
+
return void 0;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function getChatGPTAccountId(token) {
|
|
137
|
+
const payload = decodeJwtPayload(token);
|
|
138
|
+
const auth = payload?.["https://api.openai.com/auth"];
|
|
139
|
+
if (auth && typeof auth === "object") {
|
|
140
|
+
const accountId2 = auth.chatgpt_account_id;
|
|
141
|
+
if (typeof accountId2 === "string" && accountId2) return accountId2;
|
|
142
|
+
}
|
|
143
|
+
const accountId = payload?.chatgpt_account_id;
|
|
144
|
+
return typeof accountId === "string" && accountId ? accountId : void 0;
|
|
145
|
+
}
|
|
146
|
+
function asRecord(value) {
|
|
147
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
148
|
+
}
|
|
149
|
+
function asFiniteNumber(value) {
|
|
150
|
+
const number = typeof value === "number" ? value : typeof value === "string" && value.trim() ? Number(value) : NaN;
|
|
151
|
+
return Number.isFinite(number) ? number : void 0;
|
|
152
|
+
}
|
|
153
|
+
function clampPercent(value) {
|
|
154
|
+
return Math.max(0, Math.min(100, value));
|
|
155
|
+
}
|
|
156
|
+
function formatPercent(value) {
|
|
157
|
+
return Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1);
|
|
158
|
+
}
|
|
159
|
+
function formatCreditAmount(value) {
|
|
160
|
+
if (Number.isInteger(value)) return String(value);
|
|
161
|
+
return value.toFixed(2).replace(/\.?0+$/, "");
|
|
162
|
+
}
|
|
163
|
+
function getPercentages(snapshot) {
|
|
164
|
+
const explicitUsed = asFiniteNumber(snapshot.used_percent);
|
|
165
|
+
const explicitRemaining = asFiniteNumber(snapshot.remaining_percent);
|
|
166
|
+
if (explicitUsed !== void 0 || explicitRemaining !== void 0) {
|
|
167
|
+
const used = clampPercent(explicitUsed ?? 100 - explicitRemaining);
|
|
168
|
+
const remaining = clampPercent(explicitRemaining ?? 100 - used);
|
|
169
|
+
return { used, remaining };
|
|
170
|
+
}
|
|
171
|
+
const limit = asFiniteNumber(snapshot.limit);
|
|
172
|
+
const usedAmount = asFiniteNumber(snapshot.used);
|
|
173
|
+
const remainingAmount = asFiniteNumber(snapshot.remaining);
|
|
174
|
+
if (limit !== void 0 && limit > 0 && (usedAmount !== void 0 || remainingAmount !== void 0)) {
|
|
175
|
+
const used = usedAmount !== void 0 ? usedAmount / limit * 100 : 100 - remainingAmount / limit * 100;
|
|
176
|
+
const remaining = remainingAmount !== void 0 ? remainingAmount / limit * 100 : 100 - used;
|
|
177
|
+
return { used: clampPercent(used), remaining: clampPercent(remaining) };
|
|
178
|
+
}
|
|
179
|
+
const amountTotal = (usedAmount ?? 0) + (remainingAmount ?? 0);
|
|
180
|
+
if (amountTotal > 0 && (usedAmount !== void 0 || remainingAmount !== void 0)) {
|
|
181
|
+
const used = usedAmount !== void 0 ? usedAmount / amountTotal * 100 : 0;
|
|
182
|
+
return { used: clampPercent(used), remaining: clampPercent(100 - used) };
|
|
183
|
+
}
|
|
184
|
+
return void 0;
|
|
185
|
+
}
|
|
186
|
+
function getRateWindows(rateLimit) {
|
|
187
|
+
const record = asRecord(rateLimit);
|
|
188
|
+
if (!record) return [];
|
|
189
|
+
return Object.entries(record).map(([name, value], order) => {
|
|
190
|
+
const data = asRecord(value);
|
|
191
|
+
if (!data) return void 0;
|
|
192
|
+
const normalizedName = name.toLowerCase();
|
|
193
|
+
if (normalizedName.includes("individual")) return void 0;
|
|
194
|
+
const windowSeconds = asFiniteNumber(data.limit_window_seconds);
|
|
195
|
+
const looksLikeWindow = normalizedName.includes("window") || windowSeconds !== void 0 || "used_percent" in data || "remaining_percent" in data;
|
|
196
|
+
if (!looksLikeWindow) return void 0;
|
|
197
|
+
return { data, windowSeconds, order };
|
|
198
|
+
}).filter((window) => window !== void 0).sort((a, b) => (a.windowSeconds ?? Number.MAX_SAFE_INTEGER) - (b.windowSeconds ?? Number.MAX_SAFE_INTEGER) || a.order - b.order);
|
|
199
|
+
}
|
|
200
|
+
function getResetAfterSeconds(snapshot, nowMs) {
|
|
201
|
+
const relative = asFiniteNumber(snapshot.reset_after_seconds);
|
|
202
|
+
if (relative !== void 0) return Math.max(0, Math.round(relative));
|
|
203
|
+
for (const key of ["reset_at", "resets_at", "resetAt", "resetsAt"]) {
|
|
204
|
+
const timestamp = asFiniteNumber(snapshot[key]);
|
|
205
|
+
if (timestamp === void 0) continue;
|
|
206
|
+
const timestampSeconds = timestamp > 1e12 ? timestamp / 1e3 : timestamp;
|
|
207
|
+
return Math.max(0, Math.round(timestampSeconds - nowMs / 1e3));
|
|
208
|
+
}
|
|
209
|
+
return void 0;
|
|
210
|
+
}
|
|
211
|
+
function appendQuotaDetails(details, percentages, windowSeconds) {
|
|
212
|
+
const scope = windowSeconds === void 0 ? {} : { windowSeconds };
|
|
213
|
+
details.push({ key: "used", value: `${formatPercent(percentages.used)}%`, ...scope });
|
|
214
|
+
details.push({ key: "remaining", value: `${formatPercent(percentages.remaining)}%`, ...scope });
|
|
215
|
+
}
|
|
216
|
+
function parseOpenAIUsage(raw, nowMs = Date.now()) {
|
|
217
|
+
const json = asRecord(raw);
|
|
218
|
+
if (!json) throw new BalanceError("EMPTY");
|
|
219
|
+
const details = [];
|
|
220
|
+
if (typeof json.plan_type === "string" && json.plan_type) {
|
|
221
|
+
details.push({ key: "plan", value: json.plan_type.toUpperCase() });
|
|
222
|
+
}
|
|
223
|
+
const rateLimit = asRecord(json.rate_limit);
|
|
224
|
+
const remainingValues = [];
|
|
225
|
+
let hasRateQuota = false;
|
|
226
|
+
for (const window of getRateWindows(rateLimit)) {
|
|
227
|
+
const percentages = getPercentages(window.data);
|
|
228
|
+
if (percentages) {
|
|
229
|
+
appendQuotaDetails(details, percentages, window.windowSeconds);
|
|
230
|
+
remainingValues.push(percentages.remaining);
|
|
231
|
+
hasRateQuota = true;
|
|
232
|
+
}
|
|
233
|
+
const resetAfter = getResetAfterSeconds(window.data, nowMs);
|
|
234
|
+
if (resetAfter !== void 0) {
|
|
235
|
+
details.push({
|
|
236
|
+
key: "reset",
|
|
237
|
+
value: String(resetAfter),
|
|
238
|
+
...window.windowSeconds === void 0 ? {} : { windowSeconds: window.windowSeconds }
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const spendControl = asRecord(asRecord(json.spend_control)?.individual_limit);
|
|
243
|
+
const individualLimit = asRecord(json.individual_limit) ?? asRecord(rateLimit?.individual_limit) ?? spendControl;
|
|
244
|
+
const individualPercentages = individualLimit ? getPercentages(individualLimit) : void 0;
|
|
245
|
+
if (individualPercentages) {
|
|
246
|
+
remainingValues.push(individualPercentages.remaining);
|
|
247
|
+
if (!hasRateQuota) appendQuotaDetails(details, individualPercentages);
|
|
248
|
+
}
|
|
249
|
+
if (individualLimit) {
|
|
250
|
+
const resetAfter = getResetAfterSeconds(individualLimit, nowMs);
|
|
251
|
+
if (resetAfter !== void 0) details.push({ key: "reset", value: String(resetAfter) });
|
|
252
|
+
}
|
|
253
|
+
const codeReviewWindow = asRecord(asRecord(json.code_review_rate_limit)?.primary_window);
|
|
254
|
+
const codeReviewUsed = asFiniteNumber(codeReviewWindow?.used_percent);
|
|
255
|
+
if (codeReviewUsed !== void 0) {
|
|
256
|
+
details.push({ key: "codeReview", value: `${formatPercent(clampPercent(100 - codeReviewUsed))}%` });
|
|
257
|
+
}
|
|
258
|
+
const credits = asRecord(json.credits);
|
|
259
|
+
let hasCreditDetail = false;
|
|
260
|
+
if (credits?.unlimited === true) {
|
|
261
|
+
details.push({ key: "credits", value: "unlimited" });
|
|
262
|
+
hasCreditDetail = true;
|
|
263
|
+
} else {
|
|
264
|
+
const creditBalance = asFiniteNumber(credits?.balance);
|
|
265
|
+
if (creditBalance !== void 0) {
|
|
266
|
+
details.push({ key: "credits", value: `$${creditBalance.toFixed(2)}` });
|
|
267
|
+
hasCreditDetail = true;
|
|
268
|
+
} else if (individualLimit) {
|
|
269
|
+
const remaining = asFiniteNumber(individualLimit.remaining);
|
|
270
|
+
const limit = asFiniteNumber(individualLimit.limit);
|
|
271
|
+
const amounts = [remaining, limit].filter((value) => value !== void 0);
|
|
272
|
+
if (amounts.length > 0) {
|
|
273
|
+
details.push({ key: "credits", value: amounts.map(formatCreditAmount).join(" / ") });
|
|
274
|
+
hasCreditDetail = true;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const resetCredits = asFiniteNumber(asRecord(json.rate_limit_reset_credits)?.available_count);
|
|
279
|
+
if (resetCredits !== void 0) details.push({ key: "resetCredits", value: String(resetCredits) });
|
|
280
|
+
if (details.length === 0 || !hasRateQuota && !individualPercentages && !hasCreditDetail && resetCredits === void 0) {
|
|
281
|
+
throw new BalanceError("EMPTY");
|
|
282
|
+
}
|
|
283
|
+
const summaryRemaining = remainingValues.length > 0 ? Math.min(...remainingValues) : void 0;
|
|
284
|
+
const summary = summaryRemaining === void 0 ? void 0 : formatPercent(summaryRemaining);
|
|
285
|
+
return [{
|
|
286
|
+
currency: "CODEX",
|
|
287
|
+
total: summary === void 0 ? "0" : `${summary}%`,
|
|
288
|
+
display: summary === void 0 ? "Codex" : `Codex ${summary}%`,
|
|
289
|
+
details
|
|
290
|
+
}];
|
|
291
|
+
}
|
|
292
|
+
var openaiProvider = {
|
|
293
|
+
id: "openai",
|
|
294
|
+
name: "OpenAI Codex",
|
|
295
|
+
keyPlaceholder: "OAuth access token (eyJ...)",
|
|
296
|
+
async fetchBalance(accessToken, signal) {
|
|
297
|
+
const headers = {
|
|
298
|
+
Authorization: `Bearer ${accessToken}`,
|
|
299
|
+
Accept: "application/json",
|
|
300
|
+
Referer: "https://chatgpt.com/",
|
|
301
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/147.0.0.0 Safari/537.36",
|
|
302
|
+
"OpenAI-Beta": "codex-1",
|
|
303
|
+
"oai-language": "zh-CN",
|
|
304
|
+
originator: "Codex Desktop"
|
|
305
|
+
};
|
|
306
|
+
const accountId = getChatGPTAccountId(accessToken);
|
|
307
|
+
if (accountId) headers["ChatGPT-Account-Id"] = accountId;
|
|
308
|
+
const res = await fetch("https://chatgpt.com/backend-api/wham/usage", { headers, signal });
|
|
309
|
+
if (!res.ok) {
|
|
310
|
+
if (res.status === 401) throw new BalanceError("401");
|
|
311
|
+
if (res.status === 403) throw new BalanceError("403");
|
|
312
|
+
throw new BalanceError(String(res.status));
|
|
313
|
+
}
|
|
314
|
+
const json = await res.json();
|
|
315
|
+
return parseOpenAIUsage(json);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
var balanceProviders = [deepseekProvider, siliconflowProvider, openrouterProvider, moonshotProvider, hyperProvider, openaiProvider];
|
|
126
319
|
function getBalanceProvider(id) {
|
|
127
320
|
return balanceProviders.find((p) => p.id === id) ?? balanceProviders[0] ?? deepseekProvider;
|
|
128
321
|
}
|
|
@@ -178,6 +371,19 @@ var ZH_T = {
|
|
|
178
371
|
balErrEmpty: "\u672A\u83B7\u53D6\u5230\u4F59\u989D\u6570\u636E",
|
|
179
372
|
balErrTimeout: "\u67E5\u8BE2\u8D85\u65F6",
|
|
180
373
|
balUnsupported: "\u5F53\u524D\u63D0\u4F9B\u5546\u4E0D\u652F\u6301\u4F59\u989D\u67E5\u8BE2",
|
|
374
|
+
balDetailPlan: "\u5957\u9910",
|
|
375
|
+
balDetailUsed: "\u5DF2\u7528",
|
|
376
|
+
balDetailRemaining: "\u5269\u4F59",
|
|
377
|
+
balDetailWindow: "\u5468\u671F",
|
|
378
|
+
balDetailReset: "\u91CD\u7F6E",
|
|
379
|
+
balDetailCodeReview: "Code Review",
|
|
380
|
+
balDetailCredits: "Credits",
|
|
381
|
+
balDetailResetCredits: "\u91CD\u7F6E\u6B21\u6570",
|
|
382
|
+
balUnlimited: "\u65E0\u9650",
|
|
383
|
+
balDay: "\u5929",
|
|
384
|
+
balHour: "\u5C0F\u65F6",
|
|
385
|
+
balMinute: "\u5206\u949F",
|
|
386
|
+
balResetSoon: "\u5373\u5C06\u91CD\u7F6E",
|
|
181
387
|
barHit: "\u547D\u4E2D\u7387",
|
|
182
388
|
barBal: "\u4F59\u989D",
|
|
183
389
|
barTok: "Tokens",
|
|
@@ -259,6 +465,19 @@ var EN_T = {
|
|
|
259
465
|
balErrEmpty: "No balance data",
|
|
260
466
|
balErrTimeout: "Request timed out",
|
|
261
467
|
balUnsupported: "Balance query unsupported",
|
|
468
|
+
balDetailPlan: "Plan",
|
|
469
|
+
balDetailUsed: "Used",
|
|
470
|
+
balDetailRemaining: "Remaining",
|
|
471
|
+
balDetailWindow: "Window",
|
|
472
|
+
balDetailReset: "Reset",
|
|
473
|
+
balDetailCodeReview: "Code Review",
|
|
474
|
+
balDetailCredits: "Credits",
|
|
475
|
+
balDetailResetCredits: "Reset credits",
|
|
476
|
+
balUnlimited: "Unlimited",
|
|
477
|
+
balDay: "d",
|
|
478
|
+
balHour: "h",
|
|
479
|
+
balMinute: "m",
|
|
480
|
+
balResetSoon: "soon",
|
|
262
481
|
barHit: "Hit",
|
|
263
482
|
barBal: "Balance",
|
|
264
483
|
barTok: "Tokens",
|
|
@@ -340,6 +559,19 @@ var JA_T = {
|
|
|
340
559
|
balErrEmpty: "\u6B8B\u9AD8\u30C7\u30FC\u30BF\u306A\u3057",
|
|
341
560
|
balErrTimeout: "\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8",
|
|
342
561
|
balUnsupported: "\u3053\u306E\u30D7\u30ED\u30D0\u30A4\u30C0\u306F\u6B8B\u9AD8\u7167\u4F1A\u975E\u5BFE\u5FDC",
|
|
562
|
+
balDetailPlan: "\u30D7\u30E9\u30F3",
|
|
563
|
+
balDetailUsed: "\u4F7F\u7528\u6E08\u307F",
|
|
564
|
+
balDetailRemaining: "\u6B8B\u308A",
|
|
565
|
+
balDetailWindow: "\u671F\u9593",
|
|
566
|
+
balDetailReset: "\u30EA\u30BB\u30C3\u30C8",
|
|
567
|
+
balDetailCodeReview: "Code Review",
|
|
568
|
+
balDetailCredits: "Credits",
|
|
569
|
+
balDetailResetCredits: "\u30EA\u30BB\u30C3\u30C8\u56DE\u6570",
|
|
570
|
+
balUnlimited: "\u7121\u5236\u9650",
|
|
571
|
+
balDay: "\u65E5",
|
|
572
|
+
balHour: "\u6642\u9593",
|
|
573
|
+
balMinute: "\u5206",
|
|
574
|
+
balResetSoon: "\u307E\u3082\u306A\u304F",
|
|
343
575
|
barHit: "\u30D2\u30C3\u30C8\u7387",
|
|
344
576
|
barBal: "\u6B8B\u9AD8",
|
|
345
577
|
barTok: "Tokens",
|
|
@@ -421,6 +653,19 @@ var KO_T = {
|
|
|
421
653
|
balErrEmpty: "\uC794\uC561 \uB370\uC774\uD130 \uC5C6\uC74C",
|
|
422
654
|
balErrTimeout: "\uC2DC\uAC04 \uCD08\uACFC",
|
|
423
655
|
balUnsupported: "\uC774 \uD504\uB85C\uBC14\uC774\uB354\uB294 \uC794\uC561 \uC870\uD68C \uBBF8\uC9C0\uC6D0",
|
|
656
|
+
balDetailPlan: "\uD50C\uB79C",
|
|
657
|
+
balDetailUsed: "\uC0AC\uC6A9",
|
|
658
|
+
balDetailRemaining: "\uC794\uC5EC",
|
|
659
|
+
balDetailWindow: "\uC8FC\uAE30",
|
|
660
|
+
balDetailReset: "\uC7AC\uC124\uC815",
|
|
661
|
+
balDetailCodeReview: "Code Review",
|
|
662
|
+
balDetailCredits: "Credits",
|
|
663
|
+
balDetailResetCredits: "\uC7AC\uC124\uC815 \uD69F\uC218",
|
|
664
|
+
balUnlimited: "\uBB34\uC81C\uD55C",
|
|
665
|
+
balDay: "\uC77C",
|
|
666
|
+
balHour: "\uC2DC\uAC04",
|
|
667
|
+
balMinute: "\uBD84",
|
|
668
|
+
balResetSoon: "\uACE7 \uC7AC\uC124\uC815",
|
|
424
669
|
barHit: "\uD788\uD2B8\uC728",
|
|
425
670
|
barBal: "\uC794\uC561",
|
|
426
671
|
barTok: "Tokens",
|
|
@@ -652,11 +897,42 @@ function convertBalance(target, targetRate, amount, from) {
|
|
|
652
897
|
const usd = from === "USD" ? amount : amount / fromRate;
|
|
653
898
|
return target === "USD" ? usd : usd * targetRate;
|
|
654
899
|
}
|
|
900
|
+
function readOpenAIOAuthToken(api) {
|
|
901
|
+
try {
|
|
902
|
+
const loader = typeof process !== "undefined" ? process?.getBuiltinModule : void 0;
|
|
903
|
+
const fs = loader?.("node:fs");
|
|
904
|
+
if (!fs) return "";
|
|
905
|
+
const stateDir = api.state.path.state.replace(/[\\/]+$/, "");
|
|
906
|
+
const home = typeof process !== "undefined" ? process?.env.HOME || process?.env.USERPROFILE || "" : "";
|
|
907
|
+
const dataHome = typeof process !== "undefined" ? process?.env.XDG_DATA_HOME : void 0;
|
|
908
|
+
const paths = [stateDir ? `${stateDir}/auth.json` : "", dataHome ? `${dataHome}/opencode/auth.json` : "", home ? `${home}/.local/share/opencode/auth.json` : ""];
|
|
909
|
+
for (const path of paths) {
|
|
910
|
+
if (!path) continue;
|
|
911
|
+
try {
|
|
912
|
+
const auth = JSON.parse(fs.readFileSync(path, "utf8"));
|
|
913
|
+
const openai = auth.openai;
|
|
914
|
+
if (openai && typeof openai === "object") {
|
|
915
|
+
const record = openai;
|
|
916
|
+
if (record.type === "oauth" && typeof record.access === "string") return record.access;
|
|
917
|
+
}
|
|
918
|
+
} catch {
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
return "";
|
|
922
|
+
} catch {
|
|
923
|
+
return "";
|
|
924
|
+
}
|
|
925
|
+
}
|
|
655
926
|
function findOpencodeKey(api, provider) {
|
|
656
927
|
try {
|
|
657
928
|
const provs = api.state.provider;
|
|
658
929
|
const id = provider.id.toLowerCase();
|
|
659
930
|
const hit = provs.find((p) => p.id.toLowerCase() === id) ?? provs.find((p) => p.id.toLowerCase().startsWith(id));
|
|
931
|
+
const isOpenAI = id === "openai";
|
|
932
|
+
if (isOpenAI) {
|
|
933
|
+
const oauth = readOpenAIOAuthToken(api);
|
|
934
|
+
if (oauth) return oauth;
|
|
935
|
+
}
|
|
660
936
|
if (!hit) return "";
|
|
661
937
|
const k = typeof hit.key === "string" ? hit.key : "";
|
|
662
938
|
if (k) return k;
|
|
@@ -686,6 +962,8 @@ function formatBalanceAmount(total) {
|
|
|
686
962
|
});
|
|
687
963
|
}
|
|
688
964
|
function formatBalanceText(list, pref, rate) {
|
|
965
|
+
const custom = list.find((x) => x.display);
|
|
966
|
+
if (custom?.display) return custom.display;
|
|
689
967
|
const native = pref ? list.find((x) => x.currency === pref) : void 0;
|
|
690
968
|
if (native) return balanceSymbol(native.currency) + formatBalanceAmount(native.total);
|
|
691
969
|
const base = list[0];
|
|
@@ -696,6 +974,16 @@ function formatBalanceText(list, pref, rate) {
|
|
|
696
974
|
}) : formatBalanceAmount(base.total);
|
|
697
975
|
return balanceSymbol(pref || base.currency) + shown;
|
|
698
976
|
}
|
|
977
|
+
var BALANCE_DETAIL_LABELS = {
|
|
978
|
+
plan: "balDetailPlan",
|
|
979
|
+
used: "balDetailUsed",
|
|
980
|
+
remaining: "balDetailRemaining",
|
|
981
|
+
window: "balDetailWindow",
|
|
982
|
+
reset: "balDetailReset",
|
|
983
|
+
codeReview: "balDetailCodeReview",
|
|
984
|
+
credits: "balDetailCredits",
|
|
985
|
+
resetCredits: "balDetailResetCredits"
|
|
986
|
+
};
|
|
699
987
|
var CURRENCIES = {
|
|
700
988
|
USD: "$",
|
|
701
989
|
CNY: "\xA5",
|
|
@@ -727,6 +1015,7 @@ function TokenCachePanel(props) {
|
|
|
727
1015
|
const [modelOpen, setModelOpen] = createSignal(true);
|
|
728
1016
|
const [distOpen, setDistOpen] = createSignal(false);
|
|
729
1017
|
const [skillsOpen, setSkillsOpen] = createSignal(true);
|
|
1018
|
+
const [balanceOpen, setBalanceOpen] = createSignal(false);
|
|
730
1019
|
let boxEl;
|
|
731
1020
|
createEffect(() => {
|
|
732
1021
|
props.signals.setSidebarVisible(true);
|
|
@@ -762,6 +1051,31 @@ function TokenCachePanel(props) {
|
|
|
762
1051
|
setBorderVisible
|
|
763
1052
|
} = props.signals;
|
|
764
1053
|
const t = createT(() => langCode());
|
|
1054
|
+
const formatBalanceDuration = (seconds, fallback = "") => {
|
|
1055
|
+
if (!Number.isFinite(seconds)) return "";
|
|
1056
|
+
let remaining = Math.max(0, Math.round(seconds));
|
|
1057
|
+
const days = Math.floor(remaining / 86400);
|
|
1058
|
+
remaining %= 86400;
|
|
1059
|
+
const hours = Math.floor(remaining / 3600);
|
|
1060
|
+
remaining %= 3600;
|
|
1061
|
+
const minutes = Math.floor(remaining / 60);
|
|
1062
|
+
const parts = [];
|
|
1063
|
+
if (days > 0) parts.push(`${days}${t("balDay")}`);
|
|
1064
|
+
if (hours > 0 && parts.length < 2) parts.push(`${hours}${t("balHour")}`);
|
|
1065
|
+
if (minutes > 0 && parts.length < 2) parts.push(`${minutes}${t("balMinute")}`);
|
|
1066
|
+
return parts.join(langCode() === "en" ? " " : "") || fallback;
|
|
1067
|
+
};
|
|
1068
|
+
const formatBalanceDetailValue = (detail) => {
|
|
1069
|
+
if (detail.value === "unlimited") return t("balUnlimited");
|
|
1070
|
+
if (detail.key !== "reset") return detail.value;
|
|
1071
|
+
return formatBalanceDuration(Number(detail.value), t("balResetSoon")) || detail.value;
|
|
1072
|
+
};
|
|
1073
|
+
const formatBalanceDetailLabel = (detail) => {
|
|
1074
|
+
const label = t(BALANCE_DETAIL_LABELS[detail.key]);
|
|
1075
|
+
if (detail.windowSeconds === void 0) return label;
|
|
1076
|
+
const window = formatBalanceDuration(detail.windowSeconds);
|
|
1077
|
+
return window ? `${label} (${window})` : label;
|
|
1078
|
+
};
|
|
765
1079
|
const [lastDist, setLastDist] = createSignal({
|
|
766
1080
|
system: 0,
|
|
767
1081
|
user: 0,
|
|
@@ -1075,6 +1389,7 @@ function TokenCachePanel(props) {
|
|
|
1075
1389
|
const data = createMemo(() => {
|
|
1076
1390
|
return dataSignal();
|
|
1077
1391
|
});
|
|
1392
|
+
const balanceDetails = createMemo(() => balanceState().data?.find((entry) => entry.details)?.details ?? []);
|
|
1078
1393
|
createEffect(() => {
|
|
1079
1394
|
const d = data();
|
|
1080
1395
|
if (d.hasDistData) {
|
|
@@ -1106,6 +1421,7 @@ function TokenCachePanel(props) {
|
|
|
1106
1421
|
setModelOpen(Boolean(props.api.kv.get(`${KV_PREFIX}.model`, true)));
|
|
1107
1422
|
setDistOpen(Boolean(props.api.kv.get(`${KV_PREFIX}.dist`, false)));
|
|
1108
1423
|
setSkillsOpen(Boolean(props.api.kv.get(`${KV_PREFIX}.skills`, true)));
|
|
1424
|
+
setBalanceOpen(Boolean(props.api.kv.get(`${KV_PREFIX}.balance.open`, false)));
|
|
1109
1425
|
} catch {
|
|
1110
1426
|
}
|
|
1111
1427
|
const doRestore = () => {
|
|
@@ -1235,6 +1551,19 @@ function TokenCachePanel(props) {
|
|
|
1235
1551
|
const gap = Math.max(1, gauge - used);
|
|
1236
1552
|
return label + " ".repeat(gap) + value + (unit ? " " + unit : "");
|
|
1237
1553
|
};
|
|
1554
|
+
const balanceHeader = () => {
|
|
1555
|
+
const arrow = balanceDetails().length > 0 ? balanceOpen() ? "\u25BC " : "\u25B6 " : "";
|
|
1556
|
+
const title = t("secBalance");
|
|
1557
|
+
const summary = balanceState().data ? formatBalanceText(balanceState().data, balanceCurrency(), exchangeRate()) : "";
|
|
1558
|
+
const gauge = panelWidth() - gutter();
|
|
1559
|
+
const dividerLength = Math.max(1, gauge - visualWidth(arrow + title) - visualWidth(summary) - 1);
|
|
1560
|
+
return {
|
|
1561
|
+
arrow,
|
|
1562
|
+
title,
|
|
1563
|
+
summary,
|
|
1564
|
+
divider: sep().slice(0, dividerLength)
|
|
1565
|
+
};
|
|
1566
|
+
};
|
|
1238
1567
|
return (() => {
|
|
1239
1568
|
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createElement("span"), _el$4 = _$createElement("span"), _el$5 = _$createElement("b");
|
|
1240
1569
|
_$insertNode(_el$, _el$2);
|
|
@@ -1356,25 +1685,25 @@ function TokenCachePanel(props) {
|
|
|
1356
1685
|
const prefix = " \u21B3 " + t("subPrefix");
|
|
1357
1686
|
const maxSidW = Math.max(6, panelWidth() - visualWidth(prefix));
|
|
1358
1687
|
return (() => {
|
|
1359
|
-
var _el$
|
|
1360
|
-
_$insertNode(_el$
|
|
1361
|
-
_$insertNode(_el$
|
|
1362
|
-
_$insert(_el$
|
|
1363
|
-
_$insert(_el$
|
|
1688
|
+
var _el$76 = _$createElement("text"), _el$77 = _$createElement("span"), _el$78 = _$createElement("span");
|
|
1689
|
+
_$insertNode(_el$76, _el$77);
|
|
1690
|
+
_$insertNode(_el$76, _el$78);
|
|
1691
|
+
_$insert(_el$77, prefix);
|
|
1692
|
+
_$insert(_el$78, () => truncateVisual(props.signals.overrideSessionId(), maxSidW));
|
|
1364
1693
|
_$effect((_p$) => {
|
|
1365
|
-
var _v$
|
|
1694
|
+
var _v$21 = {
|
|
1366
1695
|
fg: pal().muted
|
|
1367
|
-
}, _v$
|
|
1696
|
+
}, _v$22 = {
|
|
1368
1697
|
fg: pal().text
|
|
1369
1698
|
};
|
|
1370
|
-
_v$
|
|
1371
|
-
_v$
|
|
1699
|
+
_v$21 !== _p$.e && (_p$.e = _$setProp(_el$77, "style", _v$21, _p$.e));
|
|
1700
|
+
_v$22 !== _p$.t && (_p$.t = _$setProp(_el$78, "style", _v$22, _p$.t));
|
|
1372
1701
|
return _p$;
|
|
1373
1702
|
}, {
|
|
1374
1703
|
e: void 0,
|
|
1375
1704
|
t: void 0
|
|
1376
1705
|
});
|
|
1377
|
-
return _el$
|
|
1706
|
+
return _el$76;
|
|
1378
1707
|
})();
|
|
1379
1708
|
})();
|
|
1380
1709
|
}
|
|
@@ -1384,30 +1713,30 @@ function TokenCachePanel(props) {
|
|
|
1384
1713
|
},
|
|
1385
1714
|
get fallback() {
|
|
1386
1715
|
return [(() => {
|
|
1387
|
-
var _el$
|
|
1388
|
-
_$insert(_el$
|
|
1389
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1390
|
-
return _el$
|
|
1716
|
+
var _el$79 = _$createElement("text");
|
|
1717
|
+
_$insert(_el$79, sep);
|
|
1718
|
+
_$effect((_$p) => _$setProp(_el$79, "fg", pal().muted, _$p));
|
|
1719
|
+
return _el$79;
|
|
1391
1720
|
})(), (() => {
|
|
1392
|
-
var _el$
|
|
1393
|
-
_$insertNode(_el$
|
|
1394
|
-
_$insertNode(_el$
|
|
1395
|
-
_$insertNode(_el$
|
|
1396
|
-
_$insert(_el$
|
|
1721
|
+
var _el$80 = _$createElement("text"), _el$81 = _$createElement("span"), _el$83 = _$createElement("span");
|
|
1722
|
+
_$insertNode(_el$80, _el$81);
|
|
1723
|
+
_$insertNode(_el$80, _el$83);
|
|
1724
|
+
_$insertNode(_el$81, _$createTextNode(`> `));
|
|
1725
|
+
_$insert(_el$83, () => t("noData"));
|
|
1397
1726
|
_$effect((_p$) => {
|
|
1398
|
-
var _v$
|
|
1727
|
+
var _v$23 = {
|
|
1399
1728
|
fg: pal().muted
|
|
1400
|
-
}, _v$
|
|
1729
|
+
}, _v$24 = {
|
|
1401
1730
|
fg: pal().muted
|
|
1402
1731
|
};
|
|
1403
|
-
_v$
|
|
1404
|
-
_v$
|
|
1732
|
+
_v$23 !== _p$.e && (_p$.e = _$setProp(_el$81, "style", _v$23, _p$.e));
|
|
1733
|
+
_v$24 !== _p$.t && (_p$.t = _$setProp(_el$83, "style", _v$24, _p$.t));
|
|
1405
1734
|
return _p$;
|
|
1406
1735
|
}, {
|
|
1407
1736
|
e: void 0,
|
|
1408
1737
|
t: void 0
|
|
1409
1738
|
});
|
|
1410
|
-
return _el$
|
|
1739
|
+
return _el$80;
|
|
1411
1740
|
})()];
|
|
1412
1741
|
},
|
|
1413
1742
|
get children() {
|
|
@@ -1586,37 +1915,37 @@ function TokenCachePanel(props) {
|
|
|
1586
1915
|
},
|
|
1587
1916
|
get children() {
|
|
1588
1917
|
return [_$memo(() => (() => {
|
|
1589
|
-
var _el$
|
|
1590
|
-
_$insertNode(_el$
|
|
1591
|
-
_$insertNode(_el$
|
|
1592
|
-
_$insertNode(_el$
|
|
1593
|
-
_$setProp(_el$
|
|
1918
|
+
var _el$84 = _$createElement("text"), _el$85 = _$createElement("span"), _el$86 = _$createElement("span"), _el$87 = _$createElement("b"), _el$88 = _$createElement("span");
|
|
1919
|
+
_$insertNode(_el$84, _el$85);
|
|
1920
|
+
_$insertNode(_el$84, _el$86);
|
|
1921
|
+
_$insertNode(_el$84, _el$88);
|
|
1922
|
+
_$setProp(_el$84, "onMouseUp", () => setModelOpen((o) => {
|
|
1594
1923
|
const n = !o;
|
|
1595
1924
|
persistFold("model", n);
|
|
1596
1925
|
return n;
|
|
1597
1926
|
}));
|
|
1598
|
-
_$insert(_el$
|
|
1599
|
-
_$insertNode(_el$
|
|
1600
|
-
_$insert(_el$
|
|
1601
|
-
_$insert(_el$
|
|
1927
|
+
_$insert(_el$85, () => modelOpen() ? "\u25BC " : "\u25B6 ");
|
|
1928
|
+
_$insertNode(_el$86, _el$87);
|
|
1929
|
+
_$insert(_el$87, () => t("secModel"));
|
|
1930
|
+
_$insert(_el$88, () => sep().slice(visualWidth((modelOpen() ? "\u25BC " : "\u25B6 ") + t("secModel"))));
|
|
1602
1931
|
_$effect((_p$) => {
|
|
1603
|
-
var _v$
|
|
1932
|
+
var _v$25 = {
|
|
1604
1933
|
fg: pal().muted
|
|
1605
|
-
}, _v$
|
|
1934
|
+
}, _v$26 = {
|
|
1606
1935
|
fg: pal().primary
|
|
1607
|
-
}, _v$
|
|
1936
|
+
}, _v$27 = {
|
|
1608
1937
|
fg: pal().muted
|
|
1609
1938
|
};
|
|
1610
|
-
_v$
|
|
1611
|
-
_v$
|
|
1612
|
-
_v$
|
|
1939
|
+
_v$25 !== _p$.e && (_p$.e = _$setProp(_el$85, "style", _v$25, _p$.e));
|
|
1940
|
+
_v$26 !== _p$.t && (_p$.t = _$setProp(_el$86, "style", _v$26, _p$.t));
|
|
1941
|
+
_v$27 !== _p$.a && (_p$.a = _$setProp(_el$88, "style", _v$27, _p$.a));
|
|
1613
1942
|
return _p$;
|
|
1614
1943
|
}, {
|
|
1615
1944
|
e: void 0,
|
|
1616
1945
|
t: void 0,
|
|
1617
1946
|
a: void 0
|
|
1618
1947
|
});
|
|
1619
|
-
return _el$
|
|
1948
|
+
return _el$84;
|
|
1620
1949
|
})()), _$createComponent(Show, {
|
|
1621
1950
|
get when() {
|
|
1622
1951
|
return modelOpen();
|
|
@@ -1689,37 +2018,37 @@ function TokenCachePanel(props) {
|
|
|
1689
2018
|
},
|
|
1690
2019
|
get children() {
|
|
1691
2020
|
return [_$memo(() => (() => {
|
|
1692
|
-
var _el$
|
|
1693
|
-
_$insertNode(_el$
|
|
1694
|
-
_$insertNode(_el$
|
|
1695
|
-
_$insertNode(_el$
|
|
1696
|
-
_$setProp(_el$
|
|
2021
|
+
var _el$89 = _$createElement("text"), _el$90 = _$createElement("span"), _el$91 = _$createElement("span"), _el$92 = _$createElement("b"), _el$93 = _$createElement("span");
|
|
2022
|
+
_$insertNode(_el$89, _el$90);
|
|
2023
|
+
_$insertNode(_el$89, _el$91);
|
|
2024
|
+
_$insertNode(_el$89, _el$93);
|
|
2025
|
+
_$setProp(_el$89, "onMouseUp", () => setDistOpen((o) => {
|
|
1697
2026
|
const n = !o;
|
|
1698
2027
|
persistFold("dist", n);
|
|
1699
2028
|
return n;
|
|
1700
2029
|
}));
|
|
1701
|
-
_$insert(_el$
|
|
1702
|
-
_$insertNode(_el$
|
|
1703
|
-
_$insert(_el$
|
|
1704
|
-
_$insert(_el$
|
|
2030
|
+
_$insert(_el$90, () => distOpen() ? "\u25BC " : "\u25B6 ");
|
|
2031
|
+
_$insertNode(_el$91, _el$92);
|
|
2032
|
+
_$insert(_el$92, () => t("distTitle"));
|
|
2033
|
+
_$insert(_el$93, () => sep().slice(visualWidth((distOpen() ? "\u25BC " : "\u25B6 ") + t("distTitle"))));
|
|
1705
2034
|
_$effect((_p$) => {
|
|
1706
|
-
var _v$
|
|
2035
|
+
var _v$28 = {
|
|
1707
2036
|
fg: pal().muted
|
|
1708
|
-
}, _v$
|
|
2037
|
+
}, _v$29 = {
|
|
1709
2038
|
fg: pal().primary
|
|
1710
|
-
}, _v$
|
|
2039
|
+
}, _v$30 = {
|
|
1711
2040
|
fg: pal().muted
|
|
1712
2041
|
};
|
|
1713
|
-
_v$
|
|
1714
|
-
_v$
|
|
1715
|
-
_v$
|
|
2042
|
+
_v$28 !== _p$.e && (_p$.e = _$setProp(_el$90, "style", _v$28, _p$.e));
|
|
2043
|
+
_v$29 !== _p$.t && (_p$.t = _$setProp(_el$91, "style", _v$29, _p$.t));
|
|
2044
|
+
_v$30 !== _p$.a && (_p$.a = _$setProp(_el$93, "style", _v$30, _p$.a));
|
|
1716
2045
|
return _p$;
|
|
1717
2046
|
}, {
|
|
1718
2047
|
e: void 0,
|
|
1719
2048
|
t: void 0,
|
|
1720
2049
|
a: void 0
|
|
1721
2050
|
});
|
|
1722
|
-
return _el$
|
|
2051
|
+
return _el$89;
|
|
1723
2052
|
})()), _$createComponent(Show, {
|
|
1724
2053
|
get when() {
|
|
1725
2054
|
return distOpen();
|
|
@@ -1802,37 +2131,37 @@ function TokenCachePanel(props) {
|
|
|
1802
2131
|
},
|
|
1803
2132
|
get children() {
|
|
1804
2133
|
return [_$memo(() => (() => {
|
|
1805
|
-
var _el$
|
|
1806
|
-
_$insertNode(_el$
|
|
1807
|
-
_$insertNode(_el$
|
|
1808
|
-
_$insertNode(_el$
|
|
1809
|
-
_$insertNode(_el$
|
|
1810
|
-
_$setProp(_el$
|
|
2134
|
+
var _el$94 = _$createElement("text"), _el$95 = _$createElement("span"), _el$96 = _$createElement("span"), _el$97 = _$createElement("b"), _el$98 = _$createElement("span"), _el$99 = _$createTextNode(` (`), _el$100 = _$createTextNode(`)`), _el$101 = _$createElement("span");
|
|
2135
|
+
_$insertNode(_el$94, _el$95);
|
|
2136
|
+
_$insertNode(_el$94, _el$96);
|
|
2137
|
+
_$insertNode(_el$94, _el$98);
|
|
2138
|
+
_$insertNode(_el$94, _el$101);
|
|
2139
|
+
_$setProp(_el$94, "onMouseUp", () => setSkillsOpen((o) => {
|
|
1811
2140
|
const n = !o;
|
|
1812
2141
|
persistFold("skills", n);
|
|
1813
2142
|
return n;
|
|
1814
2143
|
}));
|
|
1815
|
-
_$insert(_el$
|
|
1816
|
-
_$insertNode(_el$
|
|
1817
|
-
_$insert(_el$
|
|
1818
|
-
_$insertNode(_el$
|
|
1819
|
-
_$insertNode(_el$
|
|
1820
|
-
_$insert(_el$
|
|
1821
|
-
_$insert(_el$
|
|
2144
|
+
_$insert(_el$95, () => skillsOpen() ? "\u25BC " : "\u25B6 ");
|
|
2145
|
+
_$insertNode(_el$96, _el$97);
|
|
2146
|
+
_$insert(_el$97, () => t("secSkills"));
|
|
2147
|
+
_$insertNode(_el$98, _el$99);
|
|
2148
|
+
_$insertNode(_el$98, _el$100);
|
|
2149
|
+
_$insert(_el$98, () => data().skills.length, _el$100);
|
|
2150
|
+
_$insert(_el$101, () => sep().slice(visualWidth((skillsOpen() ? "\u25BC " : "\u25B6 ") + t("secSkills") + ` (${data().skills.length})`)));
|
|
1822
2151
|
_$effect((_p$) => {
|
|
1823
|
-
var _v$
|
|
2152
|
+
var _v$31 = {
|
|
1824
2153
|
fg: pal().muted
|
|
1825
|
-
}, _v$
|
|
2154
|
+
}, _v$32 = {
|
|
1826
2155
|
fg: pal().primary
|
|
1827
|
-
}, _v$
|
|
2156
|
+
}, _v$33 = {
|
|
1828
2157
|
fg: pal().muted
|
|
1829
|
-
}, _v$
|
|
2158
|
+
}, _v$34 = {
|
|
1830
2159
|
fg: pal().muted
|
|
1831
2160
|
};
|
|
1832
|
-
_v$
|
|
1833
|
-
_v$
|
|
1834
|
-
_v$
|
|
1835
|
-
_v$
|
|
2161
|
+
_v$31 !== _p$.e && (_p$.e = _$setProp(_el$95, "style", _v$31, _p$.e));
|
|
2162
|
+
_v$32 !== _p$.t && (_p$.t = _$setProp(_el$96, "style", _v$32, _p$.t));
|
|
2163
|
+
_v$33 !== _p$.a && (_p$.a = _$setProp(_el$98, "style", _v$33, _p$.a));
|
|
2164
|
+
_v$34 !== _p$.o && (_p$.o = _$setProp(_el$101, "style", _v$34, _p$.o));
|
|
1836
2165
|
return _p$;
|
|
1837
2166
|
}, {
|
|
1838
2167
|
e: void 0,
|
|
@@ -1840,7 +2169,7 @@ function TokenCachePanel(props) {
|
|
|
1840
2169
|
a: void 0,
|
|
1841
2170
|
o: void 0
|
|
1842
2171
|
});
|
|
1843
|
-
return _el$
|
|
2172
|
+
return _el$94;
|
|
1844
2173
|
})()), _$createComponent(Show, {
|
|
1845
2174
|
get when() {
|
|
1846
2175
|
return skillsOpen();
|
|
@@ -1851,10 +2180,10 @@ function TokenCachePanel(props) {
|
|
|
1851
2180
|
const maxLabel = Math.max(4, panelWidth() - gutter() - rightW - 1);
|
|
1852
2181
|
const label = truncateVisual(sk.name, maxLabel);
|
|
1853
2182
|
return (() => {
|
|
1854
|
-
var _el$
|
|
1855
|
-
_$insert(_el$
|
|
1856
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1857
|
-
return _el$
|
|
2183
|
+
var _el$102 = _$createElement("text");
|
|
2184
|
+
_$insert(_el$102, () => justify(label, fmt(sk.tokens), t("tok")));
|
|
2185
|
+
_$effect((_$p) => _$setProp(_el$102, "fg", pal().muted, _$p));
|
|
2186
|
+
return _el$102;
|
|
1858
2187
|
})();
|
|
1859
2188
|
});
|
|
1860
2189
|
}
|
|
@@ -1867,33 +2196,28 @@ function TokenCachePanel(props) {
|
|
|
1867
2196
|
return sectionBalance();
|
|
1868
2197
|
},
|
|
1869
2198
|
get children() {
|
|
1870
|
-
return [(
|
|
1871
|
-
var _el$52 = _$createElement("text");
|
|
1872
|
-
_$insert(_el$52, sep);
|
|
1873
|
-
_$effect((_$p) => _$setProp(_el$52, "fg", pal().muted, _$p));
|
|
1874
|
-
return _el$52;
|
|
1875
|
-
})(), _$createComponent(Show, {
|
|
2199
|
+
return [_$createComponent(Show, {
|
|
1876
2200
|
get when() {
|
|
1877
2201
|
return balanceUnsupported();
|
|
1878
2202
|
},
|
|
1879
2203
|
get children() {
|
|
1880
|
-
var _el$
|
|
1881
|
-
_$insertNode(_el$
|
|
1882
|
-
_$insertNode(_el$
|
|
1883
|
-
_$insertNode(_el$
|
|
1884
|
-
_$insert(_el$
|
|
2204
|
+
var _el$52 = _$createElement("text"), _el$53 = _$createElement("span"), _el$55 = _$createElement("span");
|
|
2205
|
+
_$insertNode(_el$52, _el$53);
|
|
2206
|
+
_$insertNode(_el$52, _el$55);
|
|
2207
|
+
_$insertNode(_el$53, _$createTextNode(`> `));
|
|
2208
|
+
_$insert(_el$55, () => t("balUnsupported"));
|
|
1885
2209
|
_$effect((_p$) => {
|
|
1886
2210
|
var _v$9 = pal().muted, _v$0 = {
|
|
1887
2211
|
fg: pal().muted
|
|
1888
2212
|
};
|
|
1889
|
-
_v$9 !== _p$.e && (_p$.e = _$setProp(_el$
|
|
1890
|
-
_v$0 !== _p$.t && (_p$.t = _$setProp(_el$
|
|
2213
|
+
_v$9 !== _p$.e && (_p$.e = _$setProp(_el$52, "fg", _v$9, _p$.e));
|
|
2214
|
+
_v$0 !== _p$.t && (_p$.t = _$setProp(_el$53, "style", _v$0, _p$.t));
|
|
1891
2215
|
return _p$;
|
|
1892
2216
|
}, {
|
|
1893
2217
|
e: void 0,
|
|
1894
2218
|
t: void 0
|
|
1895
2219
|
});
|
|
1896
|
-
return _el$
|
|
2220
|
+
return _el$52;
|
|
1897
2221
|
}
|
|
1898
2222
|
}), _$createComponent(Show, {
|
|
1899
2223
|
get when() {
|
|
@@ -1905,59 +2229,59 @@ function TokenCachePanel(props) {
|
|
|
1905
2229
|
return balanceState().status === "idle";
|
|
1906
2230
|
},
|
|
1907
2231
|
get children() {
|
|
1908
|
-
var _el$
|
|
1909
|
-
_$insertNode(_el$
|
|
1910
|
-
_$insertNode(_el$
|
|
1911
|
-
_$insertNode(_el$
|
|
1912
|
-
_$insert(_el$
|
|
2232
|
+
var _el$56 = _$createElement("text"), _el$57 = _$createElement("span"), _el$59 = _$createElement("span");
|
|
2233
|
+
_$insertNode(_el$56, _el$57);
|
|
2234
|
+
_$insertNode(_el$56, _el$59);
|
|
2235
|
+
_$insertNode(_el$57, _$createTextNode(`> `));
|
|
2236
|
+
_$insert(_el$59, () => t("balNoKey", {
|
|
1913
2237
|
p: providerName()
|
|
1914
2238
|
}));
|
|
1915
2239
|
_$effect((_p$) => {
|
|
1916
2240
|
var _v$1 = pal().muted, _v$10 = {
|
|
1917
2241
|
fg: pal().muted
|
|
1918
2242
|
};
|
|
1919
|
-
_v$1 !== _p$.e && (_p$.e = _$setProp(_el$
|
|
1920
|
-
_v$10 !== _p$.t && (_p$.t = _$setProp(_el$
|
|
2243
|
+
_v$1 !== _p$.e && (_p$.e = _$setProp(_el$56, "fg", _v$1, _p$.e));
|
|
2244
|
+
_v$10 !== _p$.t && (_p$.t = _$setProp(_el$57, "style", _v$10, _p$.t));
|
|
1921
2245
|
return _p$;
|
|
1922
2246
|
}, {
|
|
1923
2247
|
e: void 0,
|
|
1924
2248
|
t: void 0
|
|
1925
2249
|
});
|
|
1926
|
-
return _el$
|
|
2250
|
+
return _el$56;
|
|
1927
2251
|
}
|
|
1928
2252
|
}), _$createComponent(Show, {
|
|
1929
2253
|
get when() {
|
|
1930
2254
|
return balanceState().status === "loading";
|
|
1931
2255
|
},
|
|
1932
2256
|
get children() {
|
|
1933
|
-
var _el$
|
|
1934
|
-
_$insertNode(_el$
|
|
1935
|
-
_$insertNode(_el$
|
|
1936
|
-
_$insertNode(_el$
|
|
1937
|
-
_$insert(_el$
|
|
2257
|
+
var _el$60 = _$createElement("text"), _el$61 = _$createElement("span"), _el$63 = _$createElement("span");
|
|
2258
|
+
_$insertNode(_el$60, _el$61);
|
|
2259
|
+
_$insertNode(_el$60, _el$63);
|
|
2260
|
+
_$insertNode(_el$61, _$createTextNode(`> `));
|
|
2261
|
+
_$insert(_el$63, () => t("balLoading"));
|
|
1938
2262
|
_$effect((_p$) => {
|
|
1939
2263
|
var _v$11 = pal().muted, _v$12 = {
|
|
1940
2264
|
fg: pal().muted
|
|
1941
2265
|
};
|
|
1942
|
-
_v$11 !== _p$.e && (_p$.e = _$setProp(_el$
|
|
1943
|
-
_v$12 !== _p$.t && (_p$.t = _$setProp(_el$
|
|
2266
|
+
_v$11 !== _p$.e && (_p$.e = _$setProp(_el$60, "fg", _v$11, _p$.e));
|
|
2267
|
+
_v$12 !== _p$.t && (_p$.t = _$setProp(_el$61, "style", _v$12, _p$.t));
|
|
1944
2268
|
return _p$;
|
|
1945
2269
|
}, {
|
|
1946
2270
|
e: void 0,
|
|
1947
2271
|
t: void 0
|
|
1948
2272
|
});
|
|
1949
|
-
return _el$
|
|
2273
|
+
return _el$60;
|
|
1950
2274
|
}
|
|
1951
2275
|
}), _$createComponent(Show, {
|
|
1952
2276
|
get when() {
|
|
1953
2277
|
return balanceState().status === "error";
|
|
1954
2278
|
},
|
|
1955
2279
|
get children() {
|
|
1956
|
-
var _el$
|
|
1957
|
-
_$insertNode(_el$
|
|
1958
|
-
_$insertNode(_el$
|
|
1959
|
-
_$insertNode(_el$
|
|
1960
|
-
_$insert(_el$
|
|
2280
|
+
var _el$64 = _$createElement("text"), _el$65 = _$createElement("span"), _el$67 = _$createElement("span");
|
|
2281
|
+
_$insertNode(_el$64, _el$65);
|
|
2282
|
+
_$insertNode(_el$64, _el$67);
|
|
2283
|
+
_$insertNode(_el$65, _$createTextNode(`> `));
|
|
2284
|
+
_$insert(_el$67, () => {
|
|
1961
2285
|
const code = balanceState().error;
|
|
1962
2286
|
if (code === "401") return t("balErr401");
|
|
1963
2287
|
if (code === "403") return t("balErr403");
|
|
@@ -1969,24 +2293,93 @@ function TokenCachePanel(props) {
|
|
|
1969
2293
|
var _v$13 = pal().error, _v$14 = {
|
|
1970
2294
|
fg: pal().muted
|
|
1971
2295
|
};
|
|
1972
|
-
_v$13 !== _p$.e && (_p$.e = _$setProp(_el$
|
|
1973
|
-
_v$14 !== _p$.t && (_p$.t = _$setProp(_el$
|
|
2296
|
+
_v$13 !== _p$.e && (_p$.e = _$setProp(_el$64, "fg", _v$13, _p$.e));
|
|
2297
|
+
_v$14 !== _p$.t && (_p$.t = _$setProp(_el$65, "style", _v$14, _p$.t));
|
|
1974
2298
|
return _p$;
|
|
1975
2299
|
}, {
|
|
1976
2300
|
e: void 0,
|
|
1977
2301
|
t: void 0
|
|
1978
2302
|
});
|
|
1979
|
-
return _el$
|
|
2303
|
+
return _el$64;
|
|
1980
2304
|
}
|
|
1981
2305
|
}), _$createComponent(Show, {
|
|
1982
2306
|
get when() {
|
|
1983
2307
|
return _$memo(() => balanceState().status === "ok")() && balanceState().data;
|
|
1984
2308
|
},
|
|
1985
2309
|
get children() {
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
2310
|
+
return [_$createComponent(Show, {
|
|
2311
|
+
get when() {
|
|
2312
|
+
return balanceDetails().length > 0;
|
|
2313
|
+
},
|
|
2314
|
+
get children() {
|
|
2315
|
+
return [(() => {
|
|
2316
|
+
var _el$68 = _$createElement("text"), _el$69 = _$createElement("span"), _el$70 = _$createElement("span"), _el$71 = _$createElement("b"), _el$72 = _$createElement("span"), _el$73 = _$createElement("span");
|
|
2317
|
+
_$insertNode(_el$68, _el$69);
|
|
2318
|
+
_$insertNode(_el$68, _el$70);
|
|
2319
|
+
_$insertNode(_el$68, _el$72);
|
|
2320
|
+
_$insertNode(_el$68, _el$73);
|
|
2321
|
+
_$setProp(_el$68, "onMouseUp", () => {
|
|
2322
|
+
const next = !balanceOpen();
|
|
2323
|
+
setBalanceOpen(next);
|
|
2324
|
+
persistFold("balance.open", next);
|
|
2325
|
+
});
|
|
2326
|
+
_$insert(_el$69, () => balanceHeader().arrow);
|
|
2327
|
+
_$insertNode(_el$70, _el$71);
|
|
2328
|
+
_$insert(_el$71, () => balanceHeader().title);
|
|
2329
|
+
_$insert(_el$72, () => balanceHeader().divider);
|
|
2330
|
+
_$insert(_el$73, () => " " + balanceHeader().summary);
|
|
2331
|
+
_$effect((_p$) => {
|
|
2332
|
+
var _v$15 = pal().text, _v$16 = {
|
|
2333
|
+
fg: pal().muted
|
|
2334
|
+
}, _v$17 = {
|
|
2335
|
+
fg: pal().primary
|
|
2336
|
+
}, _v$18 = {
|
|
2337
|
+
fg: pal().muted
|
|
2338
|
+
};
|
|
2339
|
+
_v$15 !== _p$.e && (_p$.e = _$setProp(_el$68, "fg", _v$15, _p$.e));
|
|
2340
|
+
_v$16 !== _p$.t && (_p$.t = _$setProp(_el$69, "style", _v$16, _p$.t));
|
|
2341
|
+
_v$17 !== _p$.a && (_p$.a = _$setProp(_el$70, "style", _v$17, _p$.a));
|
|
2342
|
+
_v$18 !== _p$.o && (_p$.o = _$setProp(_el$72, "style", _v$18, _p$.o));
|
|
2343
|
+
return _p$;
|
|
2344
|
+
}, {
|
|
2345
|
+
e: void 0,
|
|
2346
|
+
t: void 0,
|
|
2347
|
+
a: void 0,
|
|
2348
|
+
o: void 0
|
|
2349
|
+
});
|
|
2350
|
+
return _el$68;
|
|
2351
|
+
})(), _$createComponent(Show, {
|
|
2352
|
+
get when() {
|
|
2353
|
+
return balanceOpen();
|
|
2354
|
+
},
|
|
2355
|
+
get children() {
|
|
2356
|
+
return balanceDetails().map((detail) => (() => {
|
|
2357
|
+
var _el$103 = _$createElement("text");
|
|
2358
|
+
_$insert(_el$103, () => justify(formatBalanceDetailLabel(detail) + ":", formatBalanceDetailValue(detail)));
|
|
2359
|
+
_$effect((_$p) => _$setProp(_el$103, "fg", pal().muted, _$p));
|
|
2360
|
+
return _el$103;
|
|
2361
|
+
})());
|
|
2362
|
+
}
|
|
2363
|
+
})];
|
|
2364
|
+
}
|
|
2365
|
+
}), _$createComponent(Show, {
|
|
2366
|
+
get when() {
|
|
2367
|
+
return balanceDetails().length === 0;
|
|
2368
|
+
},
|
|
2369
|
+
get children() {
|
|
2370
|
+
return [(() => {
|
|
2371
|
+
var _el$74 = _$createElement("text");
|
|
2372
|
+
_$insert(_el$74, sep);
|
|
2373
|
+
_$effect((_$p) => _$setProp(_el$74, "fg", pal().muted, _$p));
|
|
2374
|
+
return _el$74;
|
|
2375
|
+
})(), (() => {
|
|
2376
|
+
var _el$75 = _$createElement("text");
|
|
2377
|
+
_$insert(_el$75, () => justify(t("balTotal"), formatBalanceText(balanceState().data, balanceCurrency(), exchangeRate())));
|
|
2378
|
+
_$effect((_$p) => _$setProp(_el$75, "fg", pal().text, _$p));
|
|
2379
|
+
return _el$75;
|
|
2380
|
+
})()];
|
|
2381
|
+
}
|
|
2382
|
+
})];
|
|
1990
2383
|
}
|
|
1991
2384
|
})];
|
|
1992
2385
|
}
|
|
@@ -1998,13 +2391,13 @@ function TokenCachePanel(props) {
|
|
|
1998
2391
|
}
|
|
1999
2392
|
}), null);
|
|
2000
2393
|
_$effect((_p$) => {
|
|
2001
|
-
var _v$
|
|
2394
|
+
var _v$19 = {
|
|
2002
2395
|
fg: pal().muted
|
|
2003
|
-
}, _v$
|
|
2396
|
+
}, _v$20 = {
|
|
2004
2397
|
fg: pal().primary
|
|
2005
2398
|
};
|
|
2006
|
-
_v$
|
|
2007
|
-
_v$
|
|
2399
|
+
_v$19 !== _p$.e && (_p$.e = _$setProp(_el$3, "style", _v$19, _p$.e));
|
|
2400
|
+
_v$20 !== _p$.t && (_p$.t = _$setProp(_el$4, "style", _v$20, _p$.t));
|
|
2008
2401
|
return _p$;
|
|
2009
2402
|
}, {
|
|
2010
2403
|
e: void 0,
|
|
@@ -2268,39 +2661,39 @@ function BottomStatusBar(props) {
|
|
|
2268
2661
|
},
|
|
2269
2662
|
get fallback() {
|
|
2270
2663
|
return (() => {
|
|
2271
|
-
var _el$
|
|
2272
|
-
_$insert(_el$
|
|
2273
|
-
_$effect((_$p) => _$setProp(_el$
|
|
2274
|
-
return _el$
|
|
2664
|
+
var _el$108 = _$createElement("text");
|
|
2665
|
+
_$insert(_el$108, dirFallback);
|
|
2666
|
+
_$effect((_$p) => _$setProp(_el$108, "fg", pal().muted, _$p));
|
|
2667
|
+
return _el$108;
|
|
2275
2668
|
})();
|
|
2276
2669
|
},
|
|
2277
2670
|
get children() {
|
|
2278
|
-
var _el$
|
|
2279
|
-
_$insertNode(_el$
|
|
2280
|
-
_$insertNode(_el$
|
|
2281
|
-
_$setProp(_el$
|
|
2282
|
-
_$setProp(_el$
|
|
2283
|
-
_$setProp(_el$
|
|
2284
|
-
_$setProp(_el$
|
|
2285
|
-
_$setProp(_el$
|
|
2286
|
-
_$insert(_el$
|
|
2287
|
-
_$insertNode(_el$
|
|
2288
|
-
_$setProp(_el$
|
|
2289
|
-
_$insert(_el$
|
|
2671
|
+
var _el$104 = _$createElement("box"), _el$105 = _$createElement("text"), _el$106 = _$createElement("box"), _el$107 = _$createElement("text");
|
|
2672
|
+
_$insertNode(_el$104, _el$105);
|
|
2673
|
+
_$insertNode(_el$104, _el$106);
|
|
2674
|
+
_$setProp(_el$104, "marginLeft", 1);
|
|
2675
|
+
_$setProp(_el$104, "flexGrow", 1);
|
|
2676
|
+
_$setProp(_el$104, "flexShrink", 0);
|
|
2677
|
+
_$setProp(_el$104, "flexDirection", "row");
|
|
2678
|
+
_$setProp(_el$104, "justifyContent", "space-between");
|
|
2679
|
+
_$insert(_el$105, dirDisplay);
|
|
2680
|
+
_$insertNode(_el$106, _el$107);
|
|
2681
|
+
_$setProp(_el$106, "flexDirection", "row");
|
|
2682
|
+
_$insert(_el$107, _$createComponent(For, {
|
|
2290
2683
|
get each() {
|
|
2291
2684
|
return statsSegs();
|
|
2292
2685
|
},
|
|
2293
2686
|
children: (sg) => (() => {
|
|
2294
|
-
var _el$
|
|
2295
|
-
_$insert(_el$
|
|
2296
|
-
_$effect((_$p) => _$setProp(_el$
|
|
2687
|
+
var _el$109 = _$createElement("span");
|
|
2688
|
+
_$insert(_el$109, () => sg.text);
|
|
2689
|
+
_$effect((_$p) => _$setProp(_el$109, "style", {
|
|
2297
2690
|
fg: sg.color
|
|
2298
2691
|
}, _$p));
|
|
2299
|
-
return _el$
|
|
2692
|
+
return _el$109;
|
|
2300
2693
|
})()
|
|
2301
2694
|
}));
|
|
2302
|
-
_$effect((_$p) => _$setProp(_el$
|
|
2303
|
-
return _el$
|
|
2695
|
+
_$effect((_$p) => _$setProp(_el$105, "fg", pal().muted, _$p));
|
|
2696
|
+
return _el$104;
|
|
2304
2697
|
}
|
|
2305
2698
|
});
|
|
2306
2699
|
}
|
|
@@ -2541,11 +2934,11 @@ var tui = async (api) => {
|
|
|
2541
2934
|
return provider.name;
|
|
2542
2935
|
},
|
|
2543
2936
|
description: () => (() => {
|
|
2544
|
-
var _el$
|
|
2545
|
-
_$insert(_el$
|
|
2937
|
+
var _el$110 = _$createElement("text");
|
|
2938
|
+
_$insert(_el$110, () => t("balKeyPrompt", {
|
|
2546
2939
|
p: provider.name
|
|
2547
2940
|
}));
|
|
2548
|
-
return _el$
|
|
2941
|
+
return _el$110;
|
|
2549
2942
|
})(),
|
|
2550
2943
|
get placeholder() {
|
|
2551
2944
|
return provider.keyPlaceholder ?? "sk-...";
|
|
@@ -2625,9 +3018,9 @@ var tui = async (api) => {
|
|
|
2625
3018
|
dialog?.replace(() => _$createComponent(api.ui.DialogPrompt, {
|
|
2626
3019
|
title: "Exchange Rate",
|
|
2627
3020
|
description: () => (() => {
|
|
2628
|
-
var _el$
|
|
2629
|
-
_$insertNode(_el$
|
|
2630
|
-
return _el$
|
|
3021
|
+
var _el$111 = _$createElement("text");
|
|
3022
|
+
_$insertNode(_el$111, _$createTextNode(`Enter the exchange rate from USD to your currency (e.g. 7.2 for CNY)`));
|
|
3023
|
+
return _el$111;
|
|
2631
3024
|
})(),
|
|
2632
3025
|
placeholder: "1.0",
|
|
2633
3026
|
get value() {
|
|
@@ -3039,9 +3432,9 @@ var tui = async (api) => {
|
|
|
3039
3432
|
return _$memo(() => !!signals.overrideSessionId())() ? t("subSwitchTitle") : t("subViewTitle");
|
|
3040
3433
|
},
|
|
3041
3434
|
description: () => (() => {
|
|
3042
|
-
var _el$
|
|
3043
|
-
_$insert(_el$
|
|
3044
|
-
return _el$
|
|
3435
|
+
var _el$113 = _$createElement("text");
|
|
3436
|
+
_$insert(_el$113, () => t("subNoFound"));
|
|
3437
|
+
return _el$113;
|
|
3045
3438
|
})(),
|
|
3046
3439
|
placeholder: "ses_...",
|
|
3047
3440
|
get value() {
|