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/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.4";
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
- var balanceProviders = [deepseekProvider, siliconflowProvider, openrouterProvider, moonshotProvider, hyperProvider];
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$70 = _$createElement("text"), _el$71 = _$createElement("span"), _el$72 = _$createElement("span");
1360
- _$insertNode(_el$70, _el$71);
1361
- _$insertNode(_el$70, _el$72);
1362
- _$insert(_el$71, prefix);
1363
- _$insert(_el$72, () => truncateVisual(props.signals.overrideSessionId(), maxSidW));
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$17 = {
1694
+ var _v$21 = {
1366
1695
  fg: pal().muted
1367
- }, _v$18 = {
1696
+ }, _v$22 = {
1368
1697
  fg: pal().text
1369
1698
  };
1370
- _v$17 !== _p$.e && (_p$.e = _$setProp(_el$71, "style", _v$17, _p$.e));
1371
- _v$18 !== _p$.t && (_p$.t = _$setProp(_el$72, "style", _v$18, _p$.t));
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$70;
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$73 = _$createElement("text");
1388
- _$insert(_el$73, sep);
1389
- _$effect((_$p) => _$setProp(_el$73, "fg", pal().muted, _$p));
1390
- return _el$73;
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$74 = _$createElement("text"), _el$75 = _$createElement("span"), _el$77 = _$createElement("span");
1393
- _$insertNode(_el$74, _el$75);
1394
- _$insertNode(_el$74, _el$77);
1395
- _$insertNode(_el$75, _$createTextNode(`> `));
1396
- _$insert(_el$77, () => t("noData"));
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$19 = {
1727
+ var _v$23 = {
1399
1728
  fg: pal().muted
1400
- }, _v$20 = {
1729
+ }, _v$24 = {
1401
1730
  fg: pal().muted
1402
1731
  };
1403
- _v$19 !== _p$.e && (_p$.e = _$setProp(_el$75, "style", _v$19, _p$.e));
1404
- _v$20 !== _p$.t && (_p$.t = _$setProp(_el$77, "style", _v$20, _p$.t));
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$74;
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$78 = _$createElement("text"), _el$79 = _$createElement("span"), _el$80 = _$createElement("span"), _el$81 = _$createElement("b"), _el$82 = _$createElement("span");
1590
- _$insertNode(_el$78, _el$79);
1591
- _$insertNode(_el$78, _el$80);
1592
- _$insertNode(_el$78, _el$82);
1593
- _$setProp(_el$78, "onMouseUp", () => setModelOpen((o) => {
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$79, () => modelOpen() ? "\u25BC " : "\u25B6 ");
1599
- _$insertNode(_el$80, _el$81);
1600
- _$insert(_el$81, () => t("secModel"));
1601
- _$insert(_el$82, () => sep().slice(visualWidth((modelOpen() ? "\u25BC " : "\u25B6 ") + t("secModel"))));
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$21 = {
1932
+ var _v$25 = {
1604
1933
  fg: pal().muted
1605
- }, _v$22 = {
1934
+ }, _v$26 = {
1606
1935
  fg: pal().primary
1607
- }, _v$23 = {
1936
+ }, _v$27 = {
1608
1937
  fg: pal().muted
1609
1938
  };
1610
- _v$21 !== _p$.e && (_p$.e = _$setProp(_el$79, "style", _v$21, _p$.e));
1611
- _v$22 !== _p$.t && (_p$.t = _$setProp(_el$80, "style", _v$22, _p$.t));
1612
- _v$23 !== _p$.a && (_p$.a = _$setProp(_el$82, "style", _v$23, _p$.a));
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$78;
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$83 = _$createElement("text"), _el$84 = _$createElement("span"), _el$85 = _$createElement("span"), _el$86 = _$createElement("b"), _el$87 = _$createElement("span");
1693
- _$insertNode(_el$83, _el$84);
1694
- _$insertNode(_el$83, _el$85);
1695
- _$insertNode(_el$83, _el$87);
1696
- _$setProp(_el$83, "onMouseUp", () => setDistOpen((o) => {
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$84, () => distOpen() ? "\u25BC " : "\u25B6 ");
1702
- _$insertNode(_el$85, _el$86);
1703
- _$insert(_el$86, () => t("distTitle"));
1704
- _$insert(_el$87, () => sep().slice(visualWidth((distOpen() ? "\u25BC " : "\u25B6 ") + t("distTitle"))));
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$24 = {
2035
+ var _v$28 = {
1707
2036
  fg: pal().muted
1708
- }, _v$25 = {
2037
+ }, _v$29 = {
1709
2038
  fg: pal().primary
1710
- }, _v$26 = {
2039
+ }, _v$30 = {
1711
2040
  fg: pal().muted
1712
2041
  };
1713
- _v$24 !== _p$.e && (_p$.e = _$setProp(_el$84, "style", _v$24, _p$.e));
1714
- _v$25 !== _p$.t && (_p$.t = _$setProp(_el$85, "style", _v$25, _p$.t));
1715
- _v$26 !== _p$.a && (_p$.a = _$setProp(_el$87, "style", _v$26, _p$.a));
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$83;
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$88 = _$createElement("text"), _el$89 = _$createElement("span"), _el$90 = _$createElement("span"), _el$91 = _$createElement("b"), _el$92 = _$createElement("span"), _el$93 = _$createTextNode(` (`), _el$94 = _$createTextNode(`)`), _el$95 = _$createElement("span");
1806
- _$insertNode(_el$88, _el$89);
1807
- _$insertNode(_el$88, _el$90);
1808
- _$insertNode(_el$88, _el$92);
1809
- _$insertNode(_el$88, _el$95);
1810
- _$setProp(_el$88, "onMouseUp", () => setSkillsOpen((o) => {
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$89, () => skillsOpen() ? "\u25BC " : "\u25B6 ");
1816
- _$insertNode(_el$90, _el$91);
1817
- _$insert(_el$91, () => t("secSkills"));
1818
- _$insertNode(_el$92, _el$93);
1819
- _$insertNode(_el$92, _el$94);
1820
- _$insert(_el$92, () => data().skills.length, _el$94);
1821
- _$insert(_el$95, () => sep().slice(visualWidth((skillsOpen() ? "\u25BC " : "\u25B6 ") + t("secSkills") + ` (${data().skills.length})`)));
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$27 = {
2152
+ var _v$31 = {
1824
2153
  fg: pal().muted
1825
- }, _v$28 = {
2154
+ }, _v$32 = {
1826
2155
  fg: pal().primary
1827
- }, _v$29 = {
2156
+ }, _v$33 = {
1828
2157
  fg: pal().muted
1829
- }, _v$30 = {
2158
+ }, _v$34 = {
1830
2159
  fg: pal().muted
1831
2160
  };
1832
- _v$27 !== _p$.e && (_p$.e = _$setProp(_el$89, "style", _v$27, _p$.e));
1833
- _v$28 !== _p$.t && (_p$.t = _$setProp(_el$90, "style", _v$28, _p$.t));
1834
- _v$29 !== _p$.a && (_p$.a = _$setProp(_el$92, "style", _v$29, _p$.a));
1835
- _v$30 !== _p$.o && (_p$.o = _$setProp(_el$95, "style", _v$30, _p$.o));
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$88;
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$96 = _$createElement("text");
1855
- _$insert(_el$96, () => justify(label, fmt(sk.tokens), t("tok")));
1856
- _$effect((_$p) => _$setProp(_el$96, "fg", pal().muted, _$p));
1857
- return _el$96;
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$53 = _$createElement("text"), _el$54 = _$createElement("span"), _el$56 = _$createElement("span");
1881
- _$insertNode(_el$53, _el$54);
1882
- _$insertNode(_el$53, _el$56);
1883
- _$insertNode(_el$54, _$createTextNode(`> `));
1884
- _$insert(_el$56, () => t("balUnsupported"));
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$53, "fg", _v$9, _p$.e));
1890
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$54, "style", _v$0, _p$.t));
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$53;
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$57 = _$createElement("text"), _el$58 = _$createElement("span"), _el$60 = _$createElement("span");
1909
- _$insertNode(_el$57, _el$58);
1910
- _$insertNode(_el$57, _el$60);
1911
- _$insertNode(_el$58, _$createTextNode(`> `));
1912
- _$insert(_el$60, () => t("balNoKey", {
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$57, "fg", _v$1, _p$.e));
1920
- _v$10 !== _p$.t && (_p$.t = _$setProp(_el$58, "style", _v$10, _p$.t));
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$57;
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$61 = _$createElement("text"), _el$62 = _$createElement("span"), _el$64 = _$createElement("span");
1934
- _$insertNode(_el$61, _el$62);
1935
- _$insertNode(_el$61, _el$64);
1936
- _$insertNode(_el$62, _$createTextNode(`> `));
1937
- _$insert(_el$64, () => t("balLoading"));
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$61, "fg", _v$11, _p$.e));
1943
- _v$12 !== _p$.t && (_p$.t = _$setProp(_el$62, "style", _v$12, _p$.t));
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$61;
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$65 = _$createElement("text"), _el$66 = _$createElement("span"), _el$68 = _$createElement("span");
1957
- _$insertNode(_el$65, _el$66);
1958
- _$insertNode(_el$65, _el$68);
1959
- _$insertNode(_el$66, _$createTextNode(`> `));
1960
- _$insert(_el$68, () => {
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$65, "fg", _v$13, _p$.e));
1973
- _v$14 !== _p$.t && (_p$.t = _$setProp(_el$66, "style", _v$14, _p$.t));
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$65;
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
- var _el$69 = _$createElement("text");
1987
- _$insert(_el$69, () => justify(t("balTotal"), formatBalanceText(balanceState().data, balanceCurrency(), exchangeRate())));
1988
- _$effect((_$p) => _$setProp(_el$69, "fg", pal().text, _$p));
1989
- return _el$69;
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$15 = {
2394
+ var _v$19 = {
2002
2395
  fg: pal().muted
2003
- }, _v$16 = {
2396
+ }, _v$20 = {
2004
2397
  fg: pal().primary
2005
2398
  };
2006
- _v$15 !== _p$.e && (_p$.e = _$setProp(_el$3, "style", _v$15, _p$.e));
2007
- _v$16 !== _p$.t && (_p$.t = _$setProp(_el$4, "style", _v$16, _p$.t));
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$101 = _$createElement("text");
2272
- _$insert(_el$101, dirFallback);
2273
- _$effect((_$p) => _$setProp(_el$101, "fg", pal().muted, _$p));
2274
- return _el$101;
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$97 = _$createElement("box"), _el$98 = _$createElement("text"), _el$99 = _$createElement("box"), _el$100 = _$createElement("text");
2279
- _$insertNode(_el$97, _el$98);
2280
- _$insertNode(_el$97, _el$99);
2281
- _$setProp(_el$97, "marginLeft", 1);
2282
- _$setProp(_el$97, "flexGrow", 1);
2283
- _$setProp(_el$97, "flexShrink", 0);
2284
- _$setProp(_el$97, "flexDirection", "row");
2285
- _$setProp(_el$97, "justifyContent", "space-between");
2286
- _$insert(_el$98, dirDisplay);
2287
- _$insertNode(_el$99, _el$100);
2288
- _$setProp(_el$99, "flexDirection", "row");
2289
- _$insert(_el$100, _$createComponent(For, {
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$102 = _$createElement("span");
2295
- _$insert(_el$102, () => sg.text);
2296
- _$effect((_$p) => _$setProp(_el$102, "style", {
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$102;
2692
+ return _el$109;
2300
2693
  })()
2301
2694
  }));
2302
- _$effect((_$p) => _$setProp(_el$98, "fg", pal().muted, _$p));
2303
- return _el$97;
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$103 = _$createElement("text");
2545
- _$insert(_el$103, () => t("balKeyPrompt", {
2937
+ var _el$110 = _$createElement("text");
2938
+ _$insert(_el$110, () => t("balKeyPrompt", {
2546
2939
  p: provider.name
2547
2940
  }));
2548
- return _el$103;
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$104 = _$createElement("text");
2629
- _$insertNode(_el$104, _$createTextNode(`Enter the exchange rate from USD to your currency (e.g. 7.2 for CNY)`));
2630
- return _el$104;
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$106 = _$createElement("text");
3043
- _$insert(_el$106, () => t("subNoFound"));
3044
- return _el$106;
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() {