opencode-visual-cache 1.2.16 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tui.js CHANGED
@@ -13,7 +13,7 @@ import { createElement as _$createElement } from "@opentui/solid";
13
13
  import { createMemo, createSignal, createEffect, onMount, onCleanup, Show, untrack } from "solid-js";
14
14
 
15
15
  // src/_version.ts
16
- var PLUGIN_VERSION = "1.2.16";
16
+ var PLUGIN_VERSION = "1.4.0";
17
17
 
18
18
  // src/index.tsx
19
19
  function charColumns(c) {
@@ -89,7 +89,15 @@ var ZH_T = {
89
89
  distOut: "\u8F93\u51FA:",
90
90
  secDetail: "\u660E\u7EC6",
91
91
  secModel: "\u6A21\u578B",
92
- secSkills: "\u5DF2\u52A0\u8F7D\u6280\u80FD"
92
+ secSkills: "\u5DF2\u52A0\u8F7D\u6280\u80FD",
93
+ balTotal: "\u603B\u4F59\u989D:",
94
+ balNoKey: "\u672A\u914D\u7F6E API Key",
95
+ balLoading: "\u67E5\u8BE2\u4E2D...",
96
+ balError: "\u67E5\u8BE2\u5931\u8D25",
97
+ balErr401: "API Key \u65E0\u6548",
98
+ balErr403: "\u4F59\u989D\u67E5\u8BE2\u88AB\u62D2\u7EDD",
99
+ balErrEmpty: "\u672A\u83B7\u53D6\u5230\u4F59\u989D\u6570\u636E",
100
+ balErrTimeout: "\u67E5\u8BE2\u8D85\u65F6"
93
101
  };
94
102
  var EN_T = {
95
103
  title: "Token Cache",
@@ -120,7 +128,15 @@ var EN_T = {
120
128
  distOut: "Output:",
121
129
  secDetail: "Detail",
122
130
  secModel: "Model",
123
- secSkills: "Loaded Skills"
131
+ secSkills: "Loaded Skills",
132
+ balTotal: "Total:",
133
+ balNoKey: "No API Key set",
134
+ balLoading: "Fetching...",
135
+ balError: "Fetch failed",
136
+ balErr401: "Invalid API Key",
137
+ balErr403: "Balance request rejected",
138
+ balErrEmpty: "No balance data",
139
+ balErrTimeout: "Request timed out"
124
140
  };
125
141
  function rgb(raw) {
126
142
  if (typeof raw === "string" && raw.startsWith("#")) {
@@ -174,6 +190,14 @@ function desaturateTo(raw, maxSat, fallback) {
174
190
  const nb = Math.round(c.b + (luma - c.b) * hi);
175
191
  return "#" + [nr, ng, nb].map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, "0")).join("");
176
192
  }
193
+ function dimColor(hex, factor = 0.5) {
194
+ const c = rgb(hex);
195
+ if (!c) return hex;
196
+ const r = Math.round(c.r * factor);
197
+ const g = Math.round(c.g * factor);
198
+ const b = Math.round(c.b * factor);
199
+ return "#" + [r, g, b].map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, "0")).join("");
200
+ }
177
201
  var FALLBACK = {
178
202
  primary: "#8B9DAF",
179
203
  text: "#C5C5BB",
@@ -224,6 +248,38 @@ function estimateTokens(text) {
224
248
  const asciiPerToken = jsonLike ? 3.5 : codeLike ? 3.5 : 4;
225
249
  return Math.max(1, Math.ceil(ascii / asciiPerToken + cjk / 1));
226
250
  }
251
+ var BALANCE_POLL_MS = 5 * 60 * 1e3;
252
+ async function fetchDeepSeekBalance(apiKey, signal) {
253
+ const res = await fetch("https://api.deepseek.com/user/balance", {
254
+ headers: {
255
+ Authorization: `Bearer ${apiKey}`,
256
+ Accept: "application/json"
257
+ },
258
+ signal
259
+ });
260
+ if (!res.ok) {
261
+ if (res.status === 401) throw new Error("401");
262
+ if (res.status === 402 || res.status === 403) throw new Error("403");
263
+ throw new Error(String(res.status));
264
+ }
265
+ const json = await res.json();
266
+ const infos = json.balance_infos ?? [];
267
+ if (infos.length === 0) throw new Error("EMPTY");
268
+ return infos.map((info) => ({
269
+ currency: info.currency ?? "CNY",
270
+ total: info.total_balance ?? "0"
271
+ }));
272
+ }
273
+ function convertBalance(target, targetRate, amount, from) {
274
+ if (from === target) return amount;
275
+ const fromRate = DEFAULT_RATES[from] ?? 1;
276
+ const usd = from === "USD" ? amount : amount / fromRate;
277
+ return target === "USD" ? usd : usd * targetRate;
278
+ }
279
+ function balanceSymbol(currency) {
280
+ const sym = CURRENCIES[currency];
281
+ return sym ?? currency + " ";
282
+ }
227
283
  var CURRENCIES = {
228
284
  USD: "$",
229
285
  CNY: "\xA5",
@@ -271,6 +327,11 @@ function TokenCachePanel(props) {
271
327
  setSectionDist,
272
328
  sectionSkills,
273
329
  setSectionSkills,
330
+ sectionBalance,
331
+ setSectionBalance,
332
+ balanceRefresh,
333
+ balanceCurrency,
334
+ setBalanceCurrency,
274
335
  borderVisible,
275
336
  setBorderVisible
276
337
  } = props.signals;
@@ -321,8 +382,83 @@ function TokenCachePanel(props) {
321
382
  hasSkills: false
322
383
  });
323
384
  const [refreshTick, setRefreshTick] = createSignal(0);
385
+ const [balanceState, setBalanceState] = createSignal({
386
+ status: "idle",
387
+ data: null,
388
+ lastFetch: 0
389
+ });
390
+ let balanceSeq = 0;
391
+ const pollBalance = async () => {
392
+ const key = props.api.kv.get(`${KV_PREFIX}.ds_key`, "");
393
+ if (!key) {
394
+ setBalanceState({
395
+ status: "idle",
396
+ data: null,
397
+ lastFetch: 0,
398
+ error: void 0,
399
+ key: void 0
400
+ });
401
+ return;
402
+ }
403
+ const now = Date.now();
404
+ const prev = balanceState();
405
+ if (prev.status === "ok" && prev.key === key && now - prev.lastFetch < BALANCE_POLL_MS) return;
406
+ const seq = ++balanceSeq;
407
+ setBalanceState({
408
+ ...prev,
409
+ status: "loading",
410
+ error: void 0,
411
+ key
412
+ });
413
+ const controller = new AbortController();
414
+ let timedOut = false;
415
+ const timer = setTimeout(() => {
416
+ timedOut = true;
417
+ controller.abort();
418
+ }, 1e4);
419
+ try {
420
+ const data2 = await fetchDeepSeekBalance(key, controller.signal);
421
+ clearTimeout(timer);
422
+ if (seq !== balanceSeq) return;
423
+ setBalanceState({
424
+ status: "ok",
425
+ data: data2,
426
+ lastFetch: Date.now(),
427
+ error: void 0,
428
+ key
429
+ });
430
+ } catch (err) {
431
+ clearTimeout(timer);
432
+ if (seq !== balanceSeq) return;
433
+ const code = timedOut ? "TIMEOUT" : err instanceof Error ? err.message : "";
434
+ setBalanceState({
435
+ status: "error",
436
+ data: null,
437
+ lastFetch: 0,
438
+ error: code,
439
+ key
440
+ });
441
+ }
442
+ };
443
+ createEffect(() => {
444
+ void balanceRefresh();
445
+ untrack(() => {
446
+ void pollBalance();
447
+ });
448
+ });
449
+ let lastMainSid = props.sessionId;
324
450
  createEffect(() => {
325
451
  const sid = props.sessionId;
452
+ if (sid !== lastMainSid) {
453
+ lastMainSid = sid;
454
+ if (props.signals.overrideSessionId()) {
455
+ props.signals.setOverrideSessionId(void 0);
456
+ props.api.kv.set(`${KV_PREFIX}.session`, "");
457
+ }
458
+ }
459
+ });
460
+ createEffect(() => {
461
+ const sid = props.signals.overrideSessionId() ?? props.sessionId;
326
462
  void refreshTick();
327
463
  void partVersion();
328
464
  const msgs = props.api.state.session.messages(sid);
@@ -551,10 +687,13 @@ function TokenCachePanel(props) {
551
687
  const rate = props.api.kv.get(`${KV_PREFIX}.rate`);
552
688
  if (typeof sym === "string") setCurrencySymbol(sym);
553
689
  if (typeof rate === "number" && rate > 0) setExchangeRate(rate);
690
+ const balCur = props.api.kv.get(`${KV_PREFIX}.balance_currency`);
691
+ if (typeof balCur === "string") setBalanceCurrency(balCur);
554
692
  setSectionDetail(Boolean(props.api.kv.get(`${KV_PREFIX}.section.detail`, true)));
555
693
  setSectionModel(Boolean(props.api.kv.get(`${KV_PREFIX}.section.model`, true)));
556
694
  setSectionDist(Boolean(props.api.kv.get(`${KV_PREFIX}.section.dist`, true)));
557
695
  setSectionSkills(Boolean(props.api.kv.get(`${KV_PREFIX}.section.skills`, true)));
696
+ setSectionBalance(Boolean(props.api.kv.get(`${KV_PREFIX}.section.balance`, true)));
558
697
  const bv = props.api.kv.get(`${KV_PREFIX}.border`, true);
559
698
  setBorderVisible(bv !== false);
560
699
  const savedLang = props.api.kv.get(`${KV_PREFIX}.lang`);
@@ -607,8 +746,10 @@ function TokenCachePanel(props) {
607
746
  setRefreshTick((v) => v + 1);
608
747
  });
609
748
  setRefreshTick((v) => v + 1);
749
+ const balanceTimer = setInterval(pollBalance, BALANCE_POLL_MS);
610
750
  onCleanup(() => {
611
751
  clearTimeout(partTimer);
752
+ clearInterval(balanceTimer);
612
753
  unsubPart();
613
754
  unsubMsg();
614
755
  unsubSession();
@@ -700,12 +841,11 @@ function TokenCachePanel(props) {
700
841
  return open();
701
842
  },
702
843
  get children() {
703
- var _el$6 = _$createElement("span"), _el$7 = _$createTextNode(` (v`), _el$8 = _$createTextNode(`)`);
844
+ var _el$6 = _$createElement("span"), _el$7 = _$createTextNode(` v`);
704
845
  _$insertNode(_el$6, _el$7);
705
- _$insertNode(_el$6, _el$8);
706
- _$insert(_el$6, PLUGIN_VERSION, _el$8);
846
+ _$insert(_el$6, PLUGIN_VERSION, null);
707
847
  _$effect((_$p) => _$setProp(_el$6, "style", {
708
- fg: pal().muted
848
+ fg: dimColor(pal().muted, 0.75)
709
849
  }, _$p));
710
850
  return _el$6;
711
851
  }
@@ -721,26 +861,26 @@ function TokenCachePanel(props) {
721
861
  },
722
862
  get children() {
723
863
  return [(() => {
724
- var _el$9 = _$createElement("span");
725
- _$insert(_el$9, () => " ".repeat(Math.max(1, panelWidth() - gutter() - HEADER_PREFIX - visualWidth(t().title) - visualWidth(pct() + " " + t().hitFolded + " " + trendLabel(data().trend)))));
726
- return _el$9;
864
+ var _el$8 = _$createElement("span");
865
+ _$insert(_el$8, () => " ".repeat(Math.max(1, panelWidth() - gutter() - HEADER_PREFIX - visualWidth(t().title) - visualWidth(pct() + " " + t().hitFolded + " " + trendLabel(data().trend)))));
866
+ return _el$8;
727
867
  })(), (() => {
728
- var _el$0 = _$createElement("span"), _el$1 = _$createTextNode(` `);
729
- _$insertNode(_el$0, _el$1);
730
- _$insert(_el$0, pct, _el$1);
731
- _$insert(_el$0, () => t().hitFolded, null);
732
- _$effect((_$p) => _$setProp(_el$0, "style", {
868
+ var _el$9 = _$createElement("span"), _el$0 = _$createTextNode(` `);
869
+ _$insertNode(_el$9, _el$0);
870
+ _$insert(_el$9, pct, _el$0);
871
+ _$insert(_el$9, () => t().hitFolded, null);
872
+ _$effect((_$p) => _$setProp(_el$9, "style", {
733
873
  fg: hitColor()
734
874
  }, _$p));
735
- return _el$0;
875
+ return _el$9;
736
876
  })(), (() => {
737
- var _el$10 = _$createElement("span"), _el$11 = _$createTextNode(` `);
738
- _$insertNode(_el$10, _el$11);
739
- _$insert(_el$10, () => trendLabel(data().trend), null);
740
- _$effect((_$p) => _$setProp(_el$10, "style", {
877
+ var _el$1 = _$createElement("span"), _el$10 = _$createTextNode(` `);
878
+ _$insertNode(_el$1, _el$10);
879
+ _$insert(_el$1, () => trendLabel(data().trend), null);
880
+ _$effect((_$p) => _$setProp(_el$1, "style", {
741
881
  fg: data().trend !== 0 ? data().trend > 0 ? pal().success : pal().error : pal().text
742
882
  }, _$p));
743
- return _el$10;
883
+ return _el$1;
744
884
  })()];
745
885
  }
746
886
  }), _$createComponent(Show, {
@@ -749,18 +889,18 @@ function TokenCachePanel(props) {
749
889
  },
750
890
  get children() {
751
891
  return [(() => {
752
- var _el$12 = _$createElement("span");
753
- _$insert(_el$12, () => " ".repeat(Math.max(1, panelWidth() - gutter() - HEADER_PREFIX - visualWidth(t().title) - visualWidth(pct() + " " + t().hitFolded))));
754
- return _el$12;
892
+ var _el$11 = _$createElement("span");
893
+ _$insert(_el$11, () => " ".repeat(Math.max(1, panelWidth() - gutter() - HEADER_PREFIX - visualWidth(t().title) - visualWidth(pct() + " " + t().hitFolded))));
894
+ return _el$11;
755
895
  })(), (() => {
756
- var _el$13 = _$createElement("span"), _el$14 = _$createTextNode(` `);
757
- _$insertNode(_el$13, _el$14);
758
- _$insert(_el$13, pct, _el$14);
759
- _$insert(_el$13, () => t().hitFolded, null);
760
- _$effect((_$p) => _$setProp(_el$13, "style", {
896
+ var _el$12 = _$createElement("span"), _el$13 = _$createTextNode(` `);
897
+ _$insertNode(_el$12, _el$13);
898
+ _$insert(_el$12, pct, _el$13);
899
+ _$insert(_el$12, () => t().hitFolded, null);
900
+ _$effect((_$p) => _$setProp(_el$12, "style", {
761
901
  fg: hitColor()
762
902
  }, _$p));
763
- return _el$13;
903
+ return _el$12;
764
904
  })()];
765
905
  }
766
906
  })];
@@ -771,67 +911,98 @@ function TokenCachePanel(props) {
771
911
  return open();
772
912
  },
773
913
  get children() {
774
- return _$createComponent(Show, {
914
+ return [_$createComponent(Show, {
915
+ get when() {
916
+ return props.signals.overrideSessionId();
917
+ },
918
+ get children() {
919
+ return (() => {
920
+ const prefix = " \u21B3 " + (langZH() ? "\u5B50\u4EE3\u7406: " : "Sub: ");
921
+ const maxSidW = Math.max(6, panelWidth() - visualWidth(prefix));
922
+ return (() => {
923
+ var _el$64 = _$createElement("text"), _el$65 = _$createElement("span"), _el$66 = _$createElement("span");
924
+ _$insertNode(_el$64, _el$65);
925
+ _$insertNode(_el$64, _el$66);
926
+ _$insert(_el$65, prefix);
927
+ _$insert(_el$66, () => truncateVisual(props.signals.overrideSessionId(), maxSidW));
928
+ _$effect((_p$) => {
929
+ var _v$15 = {
930
+ fg: pal().muted
931
+ }, _v$16 = {
932
+ fg: pal().text
933
+ };
934
+ _v$15 !== _p$.e && (_p$.e = _$setProp(_el$65, "style", _v$15, _p$.e));
935
+ _v$16 !== _p$.t && (_p$.t = _$setProp(_el$66, "style", _v$16, _p$.t));
936
+ return _p$;
937
+ }, {
938
+ e: void 0,
939
+ t: void 0
940
+ });
941
+ return _el$64;
942
+ })();
943
+ })();
944
+ }
945
+ }), _$createComponent(Show, {
775
946
  get when() {
776
947
  return data().hasData;
777
948
  },
778
949
  get fallback() {
779
950
  return [(() => {
780
- var _el$52 = _$createElement("text");
781
- _$insert(_el$52, sep);
782
- _$effect((_$p) => _$setProp(_el$52, "fg", pal().muted, _$p));
783
- return _el$52;
951
+ var _el$67 = _$createElement("text");
952
+ _$insert(_el$67, sep);
953
+ _$effect((_$p) => _$setProp(_el$67, "fg", pal().muted, _$p));
954
+ return _el$67;
784
955
  })(), (() => {
785
- var _el$53 = _$createElement("text"), _el$54 = _$createElement("span"), _el$56 = _$createElement("span");
786
- _$insertNode(_el$53, _el$54);
787
- _$insertNode(_el$53, _el$56);
788
- _$insertNode(_el$54, _$createTextNode(`> `));
789
- _$insert(_el$56, () => t().noData);
956
+ var _el$68 = _$createElement("text"), _el$69 = _$createElement("span"), _el$71 = _$createElement("span");
957
+ _$insertNode(_el$68, _el$69);
958
+ _$insertNode(_el$68, _el$71);
959
+ _$insertNode(_el$69, _$createTextNode(`> `));
960
+ _$insert(_el$71, () => t().noData);
790
961
  _$effect((_p$) => {
791
- var _v$1 = {
962
+ var _v$17 = {
792
963
  fg: pal().muted
793
- }, _v$10 = {
964
+ }, _v$18 = {
794
965
  fg: pal().muted
795
966
  };
796
- _v$1 !== _p$.e && (_p$.e = _$setProp(_el$54, "style", _v$1, _p$.e));
797
- _v$10 !== _p$.t && (_p$.t = _$setProp(_el$56, "style", _v$10, _p$.t));
967
+ _v$17 !== _p$.e && (_p$.e = _$setProp(_el$69, "style", _v$17, _p$.e));
968
+ _v$18 !== _p$.t && (_p$.t = _$setProp(_el$71, "style", _v$18, _p$.t));
798
969
  return _p$;
799
970
  }, {
800
971
  e: void 0,
801
972
  t: void 0
802
973
  });
803
- return _el$53;
974
+ return _el$68;
804
975
  })()];
805
976
  },
806
977
  get children() {
807
978
  return [(() => {
808
- var _el$15 = _$createElement("text");
809
- _$insert(_el$15, sep);
810
- _$effect((_$p) => _$setProp(_el$15, "fg", pal().muted, _$p));
811
- return _el$15;
979
+ var _el$14 = _$createElement("text");
980
+ _$insert(_el$14, sep);
981
+ _$effect((_$p) => _$setProp(_el$14, "fg", pal().muted, _$p));
982
+ return _el$14;
812
983
  })(), (() => {
813
- var _el$16 = _$createElement("text"), _el$17 = _$createElement("span"), _el$18 = _$createTextNode(` `), _el$19 = _$createElement("span"), _el$20 = _$createTextNode(`[`), _el$21 = _$createTextNode(`] `), _el$22 = _$createElement("span");
984
+ var _el$15 = _$createElement("text"), _el$16 = _$createElement("span"), _el$17 = _$createTextNode(` `), _el$18 = _$createElement("span"), _el$19 = _$createTextNode(`[`), _el$20 = _$createTextNode(`] `), _el$21 = _$createElement("span");
985
+ _$insertNode(_el$15, _el$16);
986
+ _$insertNode(_el$15, _el$18);
987
+ _$insertNode(_el$15, _el$21);
814
988
  _$insertNode(_el$16, _el$17);
815
- _$insertNode(_el$16, _el$19);
816
- _$insertNode(_el$16, _el$22);
817
- _$insertNode(_el$17, _el$18);
818
- _$insert(_el$17, () => t().hit, _el$18);
819
- _$insertNode(_el$19, _el$20);
820
- _$insertNode(_el$19, _el$21);
821
- _$insert(_el$19, bar, _el$21);
822
- _$insert(_el$22, pct);
823
- _$insert(_el$16, _$createComponent(Show, {
989
+ _$insert(_el$16, () => t().hit, _el$17);
990
+ _$insertNode(_el$18, _el$19);
991
+ _$insertNode(_el$18, _el$20);
992
+ _$insert(_el$18, bar, _el$20);
993
+ _$insert(_el$21, pct);
994
+ _$insert(_el$15, _$createComponent(Show, {
824
995
  get when() {
825
996
  return data().hasTrendData;
826
997
  },
827
998
  get children() {
828
- var _el$23 = _$createElement("span"), _el$24 = _$createTextNode(` `);
829
- _$insertNode(_el$23, _el$24);
830
- _$insert(_el$23, () => trendLabel(data().trend), null);
831
- _$effect((_$p) => _$setProp(_el$23, "style", {
999
+ var _el$22 = _$createElement("span"), _el$23 = _$createTextNode(` `);
1000
+ _$insertNode(_el$22, _el$23);
1001
+ _$insert(_el$22, () => trendLabel(data().trend), null);
1002
+ _$effect((_$p) => _$setProp(_el$22, "style", {
832
1003
  fg: data().trend !== 0 ? data().trend > 0 ? pal().success : pal().error : pal().text
833
1004
  }, _$p));
834
- return _el$23;
1005
+ return _el$22;
835
1006
  }
836
1007
  }), null);
837
1008
  _$effect((_p$) => {
@@ -842,40 +1013,40 @@ function TokenCachePanel(props) {
842
1013
  }, _v$3 = {
843
1014
  fg: pal().text
844
1015
  };
845
- _v$ !== _p$.e && (_p$.e = _$setProp(_el$17, "style", _v$, _p$.e));
846
- _v$2 !== _p$.t && (_p$.t = _$setProp(_el$19, "style", _v$2, _p$.t));
847
- _v$3 !== _p$.a && (_p$.a = _$setProp(_el$22, "style", _v$3, _p$.a));
1016
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$16, "style", _v$, _p$.e));
1017
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$18, "style", _v$2, _p$.t));
1018
+ _v$3 !== _p$.a && (_p$.a = _$setProp(_el$21, "style", _v$3, _p$.a));
848
1019
  return _p$;
849
1020
  }, {
850
1021
  e: void 0,
851
1022
  t: void 0,
852
1023
  a: void 0
853
1024
  });
854
- return _el$16;
1025
+ return _el$15;
855
1026
  })(), (() => {
856
- var _el$25 = _$createElement("text");
857
- _$insert(_el$25, () => justify(t().totalHit, (Math.floor(data().sessionHitRate * 10) / 10).toFixed(1) + "%"));
858
- _$effect((_$p) => _$setProp(_el$25, "fg", pal().muted, _$p));
859
- return _el$25;
1027
+ var _el$24 = _$createElement("text");
1028
+ _$insert(_el$24, () => justify(t().totalHit, (Math.floor(data().sessionHitRate * 10) / 10).toFixed(1) + "%"));
1029
+ _$effect((_$p) => _$setProp(_el$24, "fg", pal().muted, _$p));
1030
+ return _el$24;
860
1031
  })(), _$createComponent(Show, {
861
1032
  get when() {
862
1033
  return sectionDetail();
863
1034
  },
864
1035
  get children() {
865
1036
  return [(() => {
866
- var _el$26 = _$createElement("text"), _el$27 = _$createElement("span"), _el$28 = _$createElement("span"), _el$29 = _$createElement("b"), _el$30 = _$createElement("span");
867
- _$insertNode(_el$26, _el$27);
868
- _$insertNode(_el$26, _el$28);
869
- _$insertNode(_el$26, _el$30);
870
- _$setProp(_el$26, "onMouseUp", () => setDetailOpen((o) => {
1037
+ var _el$25 = _$createElement("text"), _el$26 = _$createElement("span"), _el$27 = _$createElement("span"), _el$28 = _$createElement("b"), _el$29 = _$createElement("span");
1038
+ _$insertNode(_el$25, _el$26);
1039
+ _$insertNode(_el$25, _el$27);
1040
+ _$insertNode(_el$25, _el$29);
1041
+ _$setProp(_el$25, "onMouseUp", () => setDetailOpen((o) => {
871
1042
  const n = !o;
872
1043
  persistFold("detail", n);
873
1044
  return n;
874
1045
  }));
875
- _$insert(_el$27, () => detailOpen() ? "\u25BC " : "\u25B6 ");
876
- _$insertNode(_el$28, _el$29);
877
- _$insert(_el$29, () => t().secDetail);
878
- _$insert(_el$30, () => sep().slice(visualWidth((detailOpen() ? "\u25BC " : "\u25B6 ") + t().secDetail)));
1046
+ _$insert(_el$26, () => detailOpen() ? "\u25BC " : "\u25B6 ");
1047
+ _$insertNode(_el$27, _el$28);
1048
+ _$insert(_el$28, () => t().secDetail);
1049
+ _$insert(_el$29, () => sep().slice(visualWidth((detailOpen() ? "\u25BC " : "\u25B6 ") + t().secDetail)));
879
1050
  _$effect((_p$) => {
880
1051
  var _v$4 = {
881
1052
  fg: pal().muted
@@ -884,16 +1055,16 @@ function TokenCachePanel(props) {
884
1055
  }, _v$6 = {
885
1056
  fg: pal().muted
886
1057
  };
887
- _v$4 !== _p$.e && (_p$.e = _$setProp(_el$27, "style", _v$4, _p$.e));
888
- _v$5 !== _p$.t && (_p$.t = _$setProp(_el$28, "style", _v$5, _p$.t));
889
- _v$6 !== _p$.a && (_p$.a = _$setProp(_el$30, "style", _v$6, _p$.a));
1058
+ _v$4 !== _p$.e && (_p$.e = _$setProp(_el$26, "style", _v$4, _p$.e));
1059
+ _v$5 !== _p$.t && (_p$.t = _$setProp(_el$27, "style", _v$5, _p$.t));
1060
+ _v$6 !== _p$.a && (_p$.a = _$setProp(_el$29, "style", _v$6, _p$.a));
890
1061
  return _p$;
891
1062
  }, {
892
1063
  e: void 0,
893
1064
  t: void 0,
894
1065
  a: void 0
895
1066
  });
896
- return _el$26;
1067
+ return _el$25;
897
1068
  })(), _$createComponent(Show, {
898
1069
  get when() {
899
1070
  return detailOpen();
@@ -904,58 +1075,58 @@ function TokenCachePanel(props) {
904
1075
  return data().read > 0;
905
1076
  },
906
1077
  get children() {
907
- var _el$31 = _$createElement("text");
908
- _$insert(_el$31, () => justify(t().read, fmt(data().read), t().tok));
909
- _$effect((_$p) => _$setProp(_el$31, "fg", pal().muted, _$p));
910
- return _el$31;
1078
+ var _el$30 = _$createElement("text");
1079
+ _$insert(_el$30, () => justify(t().read, fmt(data().read), t().tok));
1080
+ _$effect((_$p) => _$setProp(_el$30, "fg", pal().muted, _$p));
1081
+ return _el$30;
911
1082
  }
912
1083
  }), _$createComponent(Show, {
913
1084
  get when() {
914
1085
  return data().write > 0;
915
1086
  },
916
1087
  get children() {
917
- var _el$32 = _$createElement("text");
918
- _$insert(_el$32, () => justify(t().write, fmt(data().write), t().tok));
919
- _$effect((_$p) => _$setProp(_el$32, "fg", pal().muted, _$p));
920
- return _el$32;
1088
+ var _el$31 = _$createElement("text");
1089
+ _$insert(_el$31, () => justify(t().write, fmt(data().write), t().tok));
1090
+ _$effect((_$p) => _$setProp(_el$31, "fg", pal().muted, _$p));
1091
+ return _el$31;
921
1092
  }
922
1093
  }), (() => {
1094
+ var _el$32 = _$createElement("text");
1095
+ _$insert(_el$32, () => justify(t().miss, fmt(data().freshInput), t().tok));
1096
+ _$effect((_$p) => _$setProp(_el$32, "fg", pal().muted, _$p));
1097
+ return _el$32;
1098
+ })(), (() => {
923
1099
  var _el$33 = _$createElement("text");
924
- _$insert(_el$33, () => justify(t().miss, fmt(data().freshInput), t().tok));
1100
+ _$insert(_el$33, () => justify(t().out, fmt(data().output), t().tok));
925
1101
  _$effect((_$p) => _$setProp(_el$33, "fg", pal().muted, _$p));
926
1102
  return _el$33;
927
- })(), (() => {
928
- var _el$34 = _$createElement("text");
929
- _$insert(_el$34, () => justify(t().out, fmt(data().output), t().tok));
930
- _$effect((_$p) => _$setProp(_el$34, "fg", pal().muted, _$p));
931
- return _el$34;
932
1103
  })(), _$createComponent(Show, {
933
1104
  get when() {
934
1105
  return data().saved > 0;
935
1106
  },
936
1107
  get children() {
937
- var _el$35 = _$createElement("text"), _el$36 = _$createElement("span"), _el$37 = _$createElement("span"), _el$38 = _$createElement("span"), _el$39 = _$createTextNode(`~`);
938
- _$insertNode(_el$35, _el$36);
939
- _$insertNode(_el$35, _el$37);
940
- _$insertNode(_el$35, _el$38);
941
- _$insert(_el$36, () => t().saved);
942
- _$insert(_el$37, () => " ".repeat(Math.max(1, panelWidth() - gutter() - visualWidth(t().saved) - visualWidth("~" + fmtCost(data().saved, currencySymbol(), exchangeRate())))));
943
- _$insertNode(_el$38, _el$39);
944
- _$insert(_el$38, () => fmtCost(data().saved, currencySymbol(), exchangeRate()), null);
1108
+ var _el$34 = _$createElement("text"), _el$35 = _$createElement("span"), _el$36 = _$createElement("span"), _el$37 = _$createElement("span"), _el$38 = _$createTextNode(`~`);
1109
+ _$insertNode(_el$34, _el$35);
1110
+ _$insertNode(_el$34, _el$36);
1111
+ _$insertNode(_el$34, _el$37);
1112
+ _$insert(_el$35, () => t().saved);
1113
+ _$insert(_el$36, () => " ".repeat(Math.max(1, panelWidth() - gutter() - visualWidth(t().saved) - visualWidth("~" + fmtCost(data().saved, currencySymbol(), exchangeRate())))));
1114
+ _$insertNode(_el$37, _el$38);
1115
+ _$insert(_el$37, () => fmtCost(data().saved, currencySymbol(), exchangeRate()), null);
945
1116
  _$effect((_p$) => {
946
1117
  var _v$7 = {
947
1118
  fg: pal().muted
948
1119
  }, _v$8 = {
949
1120
  fg: pal().success
950
1121
  };
951
- _v$7 !== _p$.e && (_p$.e = _$setProp(_el$36, "style", _v$7, _p$.e));
952
- _v$8 !== _p$.t && (_p$.t = _$setProp(_el$38, "style", _v$8, _p$.t));
1122
+ _v$7 !== _p$.e && (_p$.e = _$setProp(_el$35, "style", _v$7, _p$.e));
1123
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$37, "style", _v$8, _p$.t));
953
1124
  return _p$;
954
1125
  }, {
955
1126
  e: void 0,
956
1127
  t: void 0
957
1128
  });
958
- return _el$35;
1129
+ return _el$34;
959
1130
  }
960
1131
  })];
961
1132
  }
@@ -967,91 +1138,91 @@ function TokenCachePanel(props) {
967
1138
  },
968
1139
  get children() {
969
1140
  return [_$memo(() => (() => {
970
- var _el$57 = _$createElement("text"), _el$58 = _$createElement("span"), _el$59 = _$createElement("span"), _el$60 = _$createElement("b"), _el$61 = _$createElement("span");
971
- _$insertNode(_el$57, _el$58);
972
- _$insertNode(_el$57, _el$59);
973
- _$insertNode(_el$57, _el$61);
974
- _$setProp(_el$57, "onMouseUp", () => setModelOpen((o) => {
1141
+ var _el$72 = _$createElement("text"), _el$73 = _$createElement("span"), _el$74 = _$createElement("span"), _el$75 = _$createElement("b"), _el$76 = _$createElement("span");
1142
+ _$insertNode(_el$72, _el$73);
1143
+ _$insertNode(_el$72, _el$74);
1144
+ _$insertNode(_el$72, _el$76);
1145
+ _$setProp(_el$72, "onMouseUp", () => setModelOpen((o) => {
975
1146
  const n = !o;
976
1147
  persistFold("model", n);
977
1148
  return n;
978
1149
  }));
979
- _$insert(_el$58, () => modelOpen() ? "\u25BC " : "\u25B6 ");
980
- _$insertNode(_el$59, _el$60);
981
- _$insert(_el$60, () => t().secModel);
982
- _$insert(_el$61, () => sep().slice(visualWidth((modelOpen() ? "\u25BC " : "\u25B6 ") + t().secModel)));
1150
+ _$insert(_el$73, () => modelOpen() ? "\u25BC " : "\u25B6 ");
1151
+ _$insertNode(_el$74, _el$75);
1152
+ _$insert(_el$75, () => t().secModel);
1153
+ _$insert(_el$76, () => sep().slice(visualWidth((modelOpen() ? "\u25BC " : "\u25B6 ") + t().secModel)));
983
1154
  _$effect((_p$) => {
984
- var _v$11 = {
1155
+ var _v$19 = {
985
1156
  fg: pal().muted
986
- }, _v$12 = {
1157
+ }, _v$20 = {
987
1158
  fg: pal().primary
988
- }, _v$13 = {
1159
+ }, _v$21 = {
989
1160
  fg: pal().muted
990
1161
  };
991
- _v$11 !== _p$.e && (_p$.e = _$setProp(_el$58, "style", _v$11, _p$.e));
992
- _v$12 !== _p$.t && (_p$.t = _$setProp(_el$59, "style", _v$12, _p$.t));
993
- _v$13 !== _p$.a && (_p$.a = _$setProp(_el$61, "style", _v$13, _p$.a));
1162
+ _v$19 !== _p$.e && (_p$.e = _$setProp(_el$73, "style", _v$19, _p$.e));
1163
+ _v$20 !== _p$.t && (_p$.t = _$setProp(_el$74, "style", _v$20, _p$.t));
1164
+ _v$21 !== _p$.a && (_p$.a = _$setProp(_el$76, "style", _v$21, _p$.a));
994
1165
  return _p$;
995
1166
  }, {
996
1167
  e: void 0,
997
1168
  t: void 0,
998
1169
  a: void 0
999
1170
  });
1000
- return _el$57;
1171
+ return _el$72;
1001
1172
  })()), _$createComponent(Show, {
1002
1173
  get when() {
1003
1174
  return modelOpen();
1004
1175
  },
1005
1176
  get children() {
1006
1177
  return [(() => {
1007
- var _el$40 = _$createElement("text");
1008
- _$insert(_el$40, () => justify(t().cost, fmtCost(data().cost, currencySymbol(), exchangeRate())));
1009
- _$effect((_$p) => _$setProp(_el$40, "fg", pal().text, _$p));
1010
- return _el$40;
1178
+ var _el$39 = _$createElement("text");
1179
+ _$insert(_el$39, () => justify(t().cost, fmtCost(data().cost, currencySymbol(), exchangeRate())));
1180
+ _$effect((_$p) => _$setProp(_el$39, "fg", pal().text, _$p));
1181
+ return _el$39;
1011
1182
  })(), _$createComponent(Show, {
1012
1183
  get when() {
1013
1184
  return data().providerName;
1014
1185
  },
1015
1186
  get children() {
1016
- var _el$41 = _$createElement("text");
1017
- _$insert(_el$41, () => justify(t().provider, data().providerName));
1018
- _$effect((_$p) => _$setProp(_el$41, "fg", pal().muted, _$p));
1019
- return _el$41;
1187
+ var _el$40 = _$createElement("text");
1188
+ _$insert(_el$40, () => justify(t().provider, data().providerName));
1189
+ _$effect((_$p) => _$setProp(_el$40, "fg", pal().muted, _$p));
1190
+ return _el$40;
1020
1191
  }
1021
1192
  }), (() => {
1022
- var _el$42 = _$createElement("text");
1023
- _$insert(_el$42, () => justify(t().model, data().model));
1024
- _$effect((_$p) => _$setProp(_el$42, "fg", pal().muted, _$p));
1025
- return _el$42;
1193
+ var _el$41 = _$createElement("text");
1194
+ _$insert(_el$41, () => justify(t().model, data().model));
1195
+ _$effect((_$p) => _$setProp(_el$41, "fg", pal().muted, _$p));
1196
+ return _el$41;
1026
1197
  })(), _$createComponent(Show, {
1027
1198
  get when() {
1028
1199
  return data().hasPricing;
1029
1200
  },
1030
1201
  get children() {
1031
1202
  return [(() => {
1032
- var _el$43 = _$createElement("text");
1033
- _$insert(_el$43, () => justify(t().rate, currencySymbol() + (data().inputRate * exchangeRate()).toFixed(2) + "/M " + t().inputRate));
1034
- _$effect((_$p) => _$setProp(_el$43, "fg", pal().muted, _$p));
1035
- return _el$43;
1203
+ var _el$42 = _$createElement("text");
1204
+ _$insert(_el$42, () => justify(t().rate, currencySymbol() + (data().inputRate * exchangeRate()).toFixed(2) + "/M " + t().inputRate));
1205
+ _$effect((_$p) => _$setProp(_el$42, "fg", pal().muted, _$p));
1206
+ return _el$42;
1036
1207
  })(), _$createComponent(Show, {
1037
1208
  get when() {
1038
1209
  return data().cacheReadRate > 0;
1039
1210
  },
1040
1211
  get children() {
1041
- var _el$44 = _$createElement("text");
1042
- _$insert(_el$44, () => justify("", currencySymbol() + (data().cacheReadRate * exchangeRate()).toFixed(2) + "/M " + t().cacheRate));
1043
- _$effect((_$p) => _$setProp(_el$44, "fg", pal().muted, _$p));
1044
- return _el$44;
1212
+ var _el$43 = _$createElement("text");
1213
+ _$insert(_el$43, () => justify("", currencySymbol() + (data().cacheReadRate * exchangeRate()).toFixed(2) + "/M " + t().cacheRate));
1214
+ _$effect((_$p) => _$setProp(_el$43, "fg", pal().muted, _$p));
1215
+ return _el$43;
1045
1216
  }
1046
1217
  }), _$createComponent(Show, {
1047
1218
  get when() {
1048
1219
  return data().cacheWriteRate > 0;
1049
1220
  },
1050
1221
  get children() {
1051
- var _el$45 = _$createElement("text");
1052
- _$insert(_el$45, () => justify("", currencySymbol() + (data().cacheWriteRate * exchangeRate()).toFixed(2) + "/M " + t().writeRate));
1053
- _$effect((_$p) => _$setProp(_el$45, "fg", pal().muted, _$p));
1054
- return _el$45;
1222
+ var _el$44 = _$createElement("text");
1223
+ _$insert(_el$44, () => justify("", currencySymbol() + (data().cacheWriteRate * exchangeRate()).toFixed(2) + "/M " + t().writeRate));
1224
+ _$effect((_$p) => _$setProp(_el$44, "fg", pal().muted, _$p));
1225
+ return _el$44;
1055
1226
  }
1056
1227
  })];
1057
1228
  }
@@ -1070,37 +1241,37 @@ function TokenCachePanel(props) {
1070
1241
  },
1071
1242
  get children() {
1072
1243
  return [_$memo(() => (() => {
1073
- var _el$62 = _$createElement("text"), _el$63 = _$createElement("span"), _el$64 = _$createElement("span"), _el$65 = _$createElement("b"), _el$66 = _$createElement("span");
1074
- _$insertNode(_el$62, _el$63);
1075
- _$insertNode(_el$62, _el$64);
1076
- _$insertNode(_el$62, _el$66);
1077
- _$setProp(_el$62, "onMouseUp", () => setDistOpen((o) => {
1244
+ var _el$77 = _$createElement("text"), _el$78 = _$createElement("span"), _el$79 = _$createElement("span"), _el$80 = _$createElement("b"), _el$81 = _$createElement("span");
1245
+ _$insertNode(_el$77, _el$78);
1246
+ _$insertNode(_el$77, _el$79);
1247
+ _$insertNode(_el$77, _el$81);
1248
+ _$setProp(_el$77, "onMouseUp", () => setDistOpen((o) => {
1078
1249
  const n = !o;
1079
1250
  persistFold("dist", n);
1080
1251
  return n;
1081
1252
  }));
1082
- _$insert(_el$63, () => distOpen() ? "\u25BC " : "\u25B6 ");
1083
- _$insertNode(_el$64, _el$65);
1084
- _$insert(_el$65, () => t().distTitle);
1085
- _$insert(_el$66, () => sep().slice(visualWidth((distOpen() ? "\u25BC " : "\u25B6 ") + t().distTitle)));
1253
+ _$insert(_el$78, () => distOpen() ? "\u25BC " : "\u25B6 ");
1254
+ _$insertNode(_el$79, _el$80);
1255
+ _$insert(_el$80, () => t().distTitle);
1256
+ _$insert(_el$81, () => sep().slice(visualWidth((distOpen() ? "\u25BC " : "\u25B6 ") + t().distTitle)));
1086
1257
  _$effect((_p$) => {
1087
- var _v$14 = {
1258
+ var _v$22 = {
1088
1259
  fg: pal().muted
1089
- }, _v$15 = {
1260
+ }, _v$23 = {
1090
1261
  fg: pal().primary
1091
- }, _v$16 = {
1262
+ }, _v$24 = {
1092
1263
  fg: pal().muted
1093
1264
  };
1094
- _v$14 !== _p$.e && (_p$.e = _$setProp(_el$63, "style", _v$14, _p$.e));
1095
- _v$15 !== _p$.t && (_p$.t = _$setProp(_el$64, "style", _v$15, _p$.t));
1096
- _v$16 !== _p$.a && (_p$.a = _$setProp(_el$66, "style", _v$16, _p$.a));
1265
+ _v$22 !== _p$.e && (_p$.e = _$setProp(_el$78, "style", _v$22, _p$.e));
1266
+ _v$23 !== _p$.t && (_p$.t = _$setProp(_el$79, "style", _v$23, _p$.t));
1267
+ _v$24 !== _p$.a && (_p$.a = _$setProp(_el$81, "style", _v$24, _p$.a));
1097
1268
  return _p$;
1098
1269
  }, {
1099
1270
  e: void 0,
1100
1271
  t: void 0,
1101
1272
  a: void 0
1102
1273
  });
1103
- return _el$62;
1274
+ return _el$77;
1104
1275
  })()), _$createComponent(Show, {
1105
1276
  get when() {
1106
1277
  return distOpen();
@@ -1110,57 +1281,57 @@ function TokenCachePanel(props) {
1110
1281
  get when() {
1111
1282
  return data().dist.system > 0;
1112
1283
  },
1284
+ get children() {
1285
+ var _el$45 = _$createElement("text");
1286
+ _$insert(_el$45, () => justify(t().distSys, fmt(data().dist.system), t().tok));
1287
+ _$effect((_$p) => _$setProp(_el$45, "fg", pal().muted, _$p));
1288
+ return _el$45;
1289
+ }
1290
+ }), _$createComponent(Show, {
1291
+ get when() {
1292
+ return data().dist.user > 0;
1293
+ },
1113
1294
  get children() {
1114
1295
  var _el$46 = _$createElement("text");
1115
- _$insert(_el$46, () => justify(t().distSys, fmt(data().dist.system), t().tok));
1296
+ _$insert(_el$46, () => justify(t().distUser, fmt(data().dist.user), t().tok));
1116
1297
  _$effect((_$p) => _$setProp(_el$46, "fg", pal().muted, _$p));
1117
1298
  return _el$46;
1118
1299
  }
1119
1300
  }), _$createComponent(Show, {
1120
1301
  get when() {
1121
- return data().dist.user > 0;
1302
+ return data().dist.agent > 0;
1122
1303
  },
1123
1304
  get children() {
1124
1305
  var _el$47 = _$createElement("text");
1125
- _$insert(_el$47, () => justify(t().distUser, fmt(data().dist.user), t().tok));
1306
+ _$insert(_el$47, () => justify(t().distAgent, fmt(data().dist.agent), t().tok));
1126
1307
  _$effect((_$p) => _$setProp(_el$47, "fg", pal().muted, _$p));
1127
1308
  return _el$47;
1128
1309
  }
1129
1310
  }), _$createComponent(Show, {
1130
1311
  get when() {
1131
- return data().dist.agent > 0;
1312
+ return data().dist.toolCall > 0;
1132
1313
  },
1133
1314
  get children() {
1134
1315
  var _el$48 = _$createElement("text");
1135
- _$insert(_el$48, () => justify(t().distAgent, fmt(data().dist.agent), t().tok));
1316
+ _$insert(_el$48, () => justify(t().distTool, fmt(data().dist.toolCall), t().tok));
1136
1317
  _$effect((_$p) => _$setProp(_el$48, "fg", pal().muted, _$p));
1137
1318
  return _el$48;
1138
1319
  }
1139
1320
  }), _$createComponent(Show, {
1140
1321
  get when() {
1141
- return data().dist.toolCall > 0;
1322
+ return data().dist.toolResult > 0;
1142
1323
  },
1143
1324
  get children() {
1144
1325
  var _el$49 = _$createElement("text");
1145
- _$insert(_el$49, () => justify(t().distTool, fmt(data().dist.toolCall), t().tok));
1326
+ _$insert(_el$49, () => justify(t().distRes, fmt(data().dist.toolResult), t().tok));
1146
1327
  _$effect((_$p) => _$setProp(_el$49, "fg", pal().muted, _$p));
1147
1328
  return _el$49;
1148
1329
  }
1149
- }), _$createComponent(Show, {
1150
- get when() {
1151
- return data().dist.toolResult > 0;
1152
- },
1153
- get children() {
1154
- var _el$50 = _$createElement("text");
1155
- _$insert(_el$50, () => justify(t().distRes, fmt(data().dist.toolResult), t().tok));
1156
- _$effect((_$p) => _$setProp(_el$50, "fg", pal().muted, _$p));
1157
- return _el$50;
1158
- }
1159
1330
  }), (() => {
1160
- var _el$51 = _$createElement("text");
1161
- _$insert(_el$51, () => justify(t().distTotal, fmt(data().dist.apiInput), t().tok));
1162
- _$effect((_$p) => _$setProp(_el$51, "fg", pal().text, _$p));
1163
- return _el$51;
1331
+ var _el$50 = _$createElement("text");
1332
+ _$insert(_el$50, () => justify(t().distTotal, fmt(data().dist.apiInput), t().tok));
1333
+ _$effect((_$p) => _$setProp(_el$50, "fg", pal().text, _$p));
1334
+ return _el$50;
1164
1335
  })()];
1165
1336
  }
1166
1337
  })];
@@ -1178,37 +1349,37 @@ function TokenCachePanel(props) {
1178
1349
  },
1179
1350
  get children() {
1180
1351
  return [_$memo(() => (() => {
1181
- var _el$67 = _$createElement("text"), _el$68 = _$createElement("span"), _el$69 = _$createElement("span"), _el$70 = _$createElement("b"), _el$71 = _$createElement("span"), _el$72 = _$createTextNode(` (`), _el$73 = _$createTextNode(`)`), _el$74 = _$createElement("span");
1182
- _$insertNode(_el$67, _el$68);
1183
- _$insertNode(_el$67, _el$69);
1184
- _$insertNode(_el$67, _el$71);
1185
- _$insertNode(_el$67, _el$74);
1186
- _$setProp(_el$67, "onMouseUp", () => setSkillsOpen((o) => {
1352
+ var _el$82 = _$createElement("text"), _el$83 = _$createElement("span"), _el$84 = _$createElement("span"), _el$85 = _$createElement("b"), _el$86 = _$createElement("span"), _el$87 = _$createTextNode(` (`), _el$88 = _$createTextNode(`)`), _el$89 = _$createElement("span");
1353
+ _$insertNode(_el$82, _el$83);
1354
+ _$insertNode(_el$82, _el$84);
1355
+ _$insertNode(_el$82, _el$86);
1356
+ _$insertNode(_el$82, _el$89);
1357
+ _$setProp(_el$82, "onMouseUp", () => setSkillsOpen((o) => {
1187
1358
  const n = !o;
1188
1359
  persistFold("skills", n);
1189
1360
  return n;
1190
1361
  }));
1191
- _$insert(_el$68, () => skillsOpen() ? "\u25BC " : "\u25B6 ");
1192
- _$insertNode(_el$69, _el$70);
1193
- _$insert(_el$70, () => t().secSkills);
1194
- _$insertNode(_el$71, _el$72);
1195
- _$insertNode(_el$71, _el$73);
1196
- _$insert(_el$71, () => data().skills.length, _el$73);
1197
- _$insert(_el$74, () => sep().slice(visualWidth((skillsOpen() ? "\u25BC " : "\u25B6 ") + t().secSkills + ` (${data().skills.length})`)));
1362
+ _$insert(_el$83, () => skillsOpen() ? "\u25BC " : "\u25B6 ");
1363
+ _$insertNode(_el$84, _el$85);
1364
+ _$insert(_el$85, () => t().secSkills);
1365
+ _$insertNode(_el$86, _el$87);
1366
+ _$insertNode(_el$86, _el$88);
1367
+ _$insert(_el$86, () => data().skills.length, _el$88);
1368
+ _$insert(_el$89, () => sep().slice(visualWidth((skillsOpen() ? "\u25BC " : "\u25B6 ") + t().secSkills + ` (${data().skills.length})`)));
1198
1369
  _$effect((_p$) => {
1199
- var _v$17 = {
1370
+ var _v$25 = {
1200
1371
  fg: pal().muted
1201
- }, _v$18 = {
1372
+ }, _v$26 = {
1202
1373
  fg: pal().primary
1203
- }, _v$19 = {
1374
+ }, _v$27 = {
1204
1375
  fg: pal().muted
1205
- }, _v$20 = {
1376
+ }, _v$28 = {
1206
1377
  fg: pal().muted
1207
1378
  };
1208
- _v$17 !== _p$.e && (_p$.e = _$setProp(_el$68, "style", _v$17, _p$.e));
1209
- _v$18 !== _p$.t && (_p$.t = _$setProp(_el$69, "style", _v$18, _p$.t));
1210
- _v$19 !== _p$.a && (_p$.a = _$setProp(_el$71, "style", _v$19, _p$.a));
1211
- _v$20 !== _p$.o && (_p$.o = _$setProp(_el$74, "style", _v$20, _p$.o));
1379
+ _v$25 !== _p$.e && (_p$.e = _$setProp(_el$83, "style", _v$25, _p$.e));
1380
+ _v$26 !== _p$.t && (_p$.t = _$setProp(_el$84, "style", _v$26, _p$.t));
1381
+ _v$27 !== _p$.a && (_p$.a = _$setProp(_el$86, "style", _v$27, _p$.a));
1382
+ _v$28 !== _p$.o && (_p$.o = _$setProp(_el$89, "style", _v$28, _p$.o));
1212
1383
  return _p$;
1213
1384
  }, {
1214
1385
  e: void 0,
@@ -1216,7 +1387,7 @@ function TokenCachePanel(props) {
1216
1387
  a: void 0,
1217
1388
  o: void 0
1218
1389
  });
1219
- return _el$67;
1390
+ return _el$82;
1220
1391
  })()), _$createComponent(Show, {
1221
1392
  get when() {
1222
1393
  return skillsOpen();
@@ -1227,10 +1398,10 @@ function TokenCachePanel(props) {
1227
1398
  const maxLabel = Math.max(4, panelWidth() - gutter() - rightW - 1);
1228
1399
  const label = truncateVisual(sk.name, maxLabel);
1229
1400
  return (() => {
1230
- var _el$75 = _$createElement("text");
1231
- _$insert(_el$75, () => justify(label, fmt(sk.tokens), t().tok));
1232
- _$effect((_$p) => _$setProp(_el$75, "fg", pal().muted, _$p));
1233
- return _el$75;
1401
+ var _el$90 = _$createElement("text");
1402
+ _$insert(_el$90, () => justify(label, fmt(sk.tokens), t().tok));
1403
+ _$effect((_$p) => _$setProp(_el$90, "fg", pal().muted, _$p));
1404
+ return _el$90;
1234
1405
  })();
1235
1406
  });
1236
1407
  }
@@ -1238,19 +1409,138 @@ function TokenCachePanel(props) {
1238
1409
  }
1239
1410
  });
1240
1411
  }
1412
+ }), _$createComponent(Show, {
1413
+ get when() {
1414
+ return sectionBalance();
1415
+ },
1416
+ get children() {
1417
+ return [(() => {
1418
+ var _el$51 = _$createElement("text");
1419
+ _$insert(_el$51, sep);
1420
+ _$effect((_$p) => _$setProp(_el$51, "fg", pal().muted, _$p));
1421
+ return _el$51;
1422
+ })(), _$createComponent(Show, {
1423
+ get when() {
1424
+ return balanceState().status === "idle";
1425
+ },
1426
+ get children() {
1427
+ var _el$52 = _$createElement("text"), _el$53 = _$createElement("span"), _el$55 = _$createElement("span");
1428
+ _$insertNode(_el$52, _el$53);
1429
+ _$insertNode(_el$52, _el$55);
1430
+ _$insertNode(_el$53, _$createTextNode(`> `));
1431
+ _$insert(_el$55, () => t().balNoKey);
1432
+ _$effect((_p$) => {
1433
+ var _v$9 = pal().muted, _v$0 = {
1434
+ fg: pal().muted
1435
+ };
1436
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$52, "fg", _v$9, _p$.e));
1437
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$53, "style", _v$0, _p$.t));
1438
+ return _p$;
1439
+ }, {
1440
+ e: void 0,
1441
+ t: void 0
1442
+ });
1443
+ return _el$52;
1444
+ }
1445
+ }), _$createComponent(Show, {
1446
+ get when() {
1447
+ return balanceState().status === "loading";
1448
+ },
1449
+ get children() {
1450
+ var _el$56 = _$createElement("text"), _el$57 = _$createElement("span"), _el$59 = _$createElement("span");
1451
+ _$insertNode(_el$56, _el$57);
1452
+ _$insertNode(_el$56, _el$59);
1453
+ _$insertNode(_el$57, _$createTextNode(`> `));
1454
+ _$insert(_el$59, () => t().balLoading);
1455
+ _$effect((_p$) => {
1456
+ var _v$1 = pal().muted, _v$10 = {
1457
+ fg: pal().muted
1458
+ };
1459
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$56, "fg", _v$1, _p$.e));
1460
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$57, "style", _v$10, _p$.t));
1461
+ return _p$;
1462
+ }, {
1463
+ e: void 0,
1464
+ t: void 0
1465
+ });
1466
+ return _el$56;
1467
+ }
1468
+ }), _$createComponent(Show, {
1469
+ get when() {
1470
+ return balanceState().status === "error";
1471
+ },
1472
+ get children() {
1473
+ var _el$60 = _$createElement("text"), _el$61 = _$createElement("span"), _el$63 = _$createElement("span");
1474
+ _$insertNode(_el$60, _el$61);
1475
+ _$insertNode(_el$60, _el$63);
1476
+ _$insertNode(_el$61, _$createTextNode(`> `));
1477
+ _$insert(_el$63, () => {
1478
+ const code = balanceState().error;
1479
+ if (code === "401") return t().balErr401;
1480
+ if (code === "403") return t().balErr403;
1481
+ if (code === "EMPTY") return t().balErrEmpty;
1482
+ if (code === "TIMEOUT") return t().balErrTimeout;
1483
+ return t().balError + (code ? ` (${code})` : "");
1484
+ });
1485
+ _$effect((_p$) => {
1486
+ var _v$11 = pal().error, _v$12 = {
1487
+ fg: pal().muted
1488
+ };
1489
+ _v$11 !== _p$.e && (_p$.e = _$setProp(_el$60, "fg", _v$11, _p$.e));
1490
+ _v$12 !== _p$.t && (_p$.t = _$setProp(_el$61, "style", _v$12, _p$.t));
1491
+ return _p$;
1492
+ }, {
1493
+ e: void 0,
1494
+ t: void 0
1495
+ });
1496
+ return _el$60;
1497
+ }
1498
+ }), _$createComponent(Show, {
1499
+ get when() {
1500
+ return _$memo(() => balanceState().status === "ok")() && balanceState().data;
1501
+ },
1502
+ get children() {
1503
+ return (() => {
1504
+ const list = balanceState().data;
1505
+ const pref = balanceCurrency();
1506
+ const native = pref ? list.find((x) => x.currency === pref) : void 0;
1507
+ if (native) {
1508
+ return (() => {
1509
+ var _el$91 = _$createElement("text");
1510
+ _$insert(_el$91, () => justify(t().balTotal, balanceSymbol(native.currency) + native.total));
1511
+ _$effect((_$p) => _$setProp(_el$91, "fg", pal().text, _$p));
1512
+ return _el$91;
1513
+ })();
1514
+ }
1515
+ const base = list[0];
1516
+ const baseAmt = parseFloat(base.total);
1517
+ const converted = Number.isFinite(baseAmt) ? convertBalance(pref || base.currency, exchangeRate(), baseAmt, base.currency) : baseAmt;
1518
+ const shown = pref && base.currency !== pref ? converted.toLocaleString("en-US", {
1519
+ maximumFractionDigits: 2
1520
+ }) : base.total;
1521
+ return (() => {
1522
+ var _el$92 = _$createElement("text");
1523
+ _$insert(_el$92, () => justify(t().balTotal, balanceSymbol(pref || base.currency) + shown));
1524
+ _$effect((_$p) => _$setProp(_el$92, "fg", pal().text, _$p));
1525
+ return _el$92;
1526
+ })();
1527
+ })();
1528
+ }
1529
+ })];
1530
+ }
1241
1531
  })];
1242
1532
  }
1243
- });
1533
+ })];
1244
1534
  }
1245
1535
  }), null);
1246
1536
  _$effect((_p$) => {
1247
- var _v$9 = {
1537
+ var _v$13 = {
1248
1538
  fg: pal().muted
1249
- }, _v$0 = {
1539
+ }, _v$14 = {
1250
1540
  fg: pal().primary
1251
1541
  };
1252
- _v$9 !== _p$.e && (_p$.e = _$setProp(_el$3, "style", _v$9, _p$.e));
1253
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$4, "style", _v$0, _p$.t));
1542
+ _v$13 !== _p$.e && (_p$.e = _$setProp(_el$3, "style", _v$13, _p$.e));
1543
+ _v$14 !== _p$.t && (_p$.t = _$setProp(_el$4, "style", _v$14, _p$.t));
1254
1544
  return _p$;
1255
1545
  }, {
1256
1546
  e: void 0,
@@ -1260,10 +1550,18 @@ function TokenCachePanel(props) {
1260
1550
  })();
1261
1551
  }
1262
1552
  function createSidebarSlot(api, signals) {
1553
+ let lastSlotSid = "";
1263
1554
  return {
1264
1555
  order: 55,
1265
1556
  slots: {
1266
1557
  sidebar_content(ctx, input) {
1558
+ if (input.session_id !== lastSlotSid) {
1559
+ lastSlotSid = input.session_id;
1560
+ if (signals.overrideSessionId()) {
1561
+ signals.setOverrideSessionId(void 0);
1562
+ api.kv.set("cache_panel.session", "");
1563
+ }
1564
+ }
1267
1565
  return _$createComponent(TokenCachePanel, {
1268
1566
  get theme() {
1269
1567
  return ctx.theme.current;
@@ -1285,8 +1583,12 @@ var tui = async (api) => {
1285
1583
  const [sectionModel, setSectionModel] = createSignal(true);
1286
1584
  const [sectionDist, setSectionDist] = createSignal(true);
1287
1585
  const [sectionSkills, setSectionSkills] = createSignal(true);
1586
+ const [sectionBalance, setSectionBalance] = createSignal(true);
1587
+ const [balanceRefresh, setBalanceRefresh] = createSignal(0);
1588
+ const [balanceCurrency, setBalanceCurrency] = createSignal("");
1288
1589
  const [borderVisible, setBorderVisible] = createSignal(true);
1289
1590
  const [langZH, setLangZH] = createSignal(LANG_ZH);
1591
+ const [overrideSessionId, setOverrideSessionId] = createSignal(void 0);
1290
1592
  const signals = {
1291
1593
  currencySymbol,
1292
1594
  setCurrencySymbol,
@@ -1302,8 +1604,16 @@ var tui = async (api) => {
1302
1604
  setSectionDist,
1303
1605
  sectionSkills,
1304
1606
  setSectionSkills,
1607
+ sectionBalance,
1608
+ setSectionBalance,
1609
+ balanceRefresh,
1610
+ setBalanceRefresh,
1611
+ balanceCurrency,
1612
+ setBalanceCurrency,
1305
1613
  borderVisible,
1306
- setBorderVisible
1614
+ setBorderVisible,
1615
+ overrideSessionId,
1616
+ setOverrideSessionId
1307
1617
  };
1308
1618
  api.slots.register(createSidebarSlot(api, signals));
1309
1619
  const KV_PREFIX = "cache_panel";
@@ -1328,6 +1638,8 @@ var tui = async (api) => {
1328
1638
  const defRate = DEFAULT_RATES[opt.value] ?? 1;
1329
1639
  api.kv.set(`${KV_PREFIX}.currency`, sym);
1330
1640
  api.kv.set(`${KV_PREFIX}.rate`, defRate);
1641
+ api.kv.set(`${KV_PREFIX}.balance_currency`, opt.value);
1642
+ signals.setBalanceCurrency(opt.value);
1331
1643
  signals.setCurrencySymbol(sym);
1332
1644
  signals.setExchangeRate(defRate);
1333
1645
  api.ui.toast({
@@ -1348,9 +1660,9 @@ var tui = async (api) => {
1348
1660
  dialog?.replace(() => _$createComponent(api.ui.DialogPrompt, {
1349
1661
  title: "Exchange Rate",
1350
1662
  description: () => (() => {
1351
- var _el$76 = _$createElement("text");
1352
- _$insertNode(_el$76, _$createTextNode(`Enter the exchange rate from USD to your currency (e.g. 7.2 for CNY)`));
1353
- return _el$76;
1663
+ var _el$93 = _$createElement("text");
1664
+ _$insertNode(_el$93, _$createTextNode(`Enter the exchange rate from USD to your currency (e.g. 7.2 for CNY)`));
1665
+ return _el$93;
1354
1666
  })(),
1355
1667
  placeholder: "1.0",
1356
1668
  get value() {
@@ -1381,6 +1693,7 @@ var tui = async (api) => {
1381
1693
  const modelOn = Boolean(api.kv.get(`${KV_PREFIX}.section.model`, true));
1382
1694
  const distOn = Boolean(api.kv.get(`${KV_PREFIX}.section.dist`, true));
1383
1695
  const skillsOn = Boolean(api.kv.get(`${KV_PREFIX}.section.skills`, true));
1696
+ const balanceOn = Boolean(api.kv.get(`${KV_PREFIX}.section.balance`, true));
1384
1697
  const borderOn = Boolean(api.kv.get(`${KV_PREFIX}.border`, true));
1385
1698
  dialog?.replace(() => _$createComponent(api.ui.DialogSelect, {
1386
1699
  title: "Toggle Section",
@@ -1396,6 +1709,9 @@ var tui = async (api) => {
1396
1709
  }, {
1397
1710
  title: `Loaded Skills [${skillsOn ? "ON" : "OFF"}]`,
1398
1711
  value: "skills"
1712
+ }, {
1713
+ title: `DS Balance [${balanceOn ? "ON" : "OFF"}]`,
1714
+ value: "balance"
1399
1715
  }, {
1400
1716
  title: `Panel Border [${borderOn ? "ON" : "OFF"}]`,
1401
1717
  value: "border"
@@ -1416,6 +1732,7 @@ var tui = async (api) => {
1416
1732
  if (opt.value === "model") signals.setSectionModel(!cur);
1417
1733
  if (opt.value === "dist") signals.setSectionDist(!cur);
1418
1734
  if (opt.value === "skills") signals.setSectionSkills(!cur);
1735
+ if (opt.value === "balance") signals.setSectionBalance(!cur);
1419
1736
  api.ui.toast({
1420
1737
  message: `${opt.value} section ${!cur ? "shown" : "hidden"}`
1421
1738
  });
@@ -1438,9 +1755,10 @@ var tui = async (api) => {
1438
1755
  const model = Boolean(api.kv.get(`${KV_PREFIX}.section.model`, true));
1439
1756
  const dist = Boolean(api.kv.get(`${KV_PREFIX}.section.dist`, true));
1440
1757
  const skills = Boolean(api.kv.get(`${KV_PREFIX}.section.skills`, true));
1758
+ const balance = Boolean(api.kv.get(`${KV_PREFIX}.section.balance`, true));
1441
1759
  api.ui.toast({
1442
1760
  title: "Cache Panel Config",
1443
- message: `Currency: ${sym} | Rate: ${rate} | Detail: ${detail ? "ON" : "OFF"} | Model: ${model ? "ON" : "OFF"} | Dist: ${dist ? "ON" : "OFF"} | Skills: ${skills ? "ON" : "OFF"}`,
1761
+ message: `Currency: ${sym} | Rate: ${rate} | Detail: ${detail ? "ON" : "OFF"} | Model: ${model ? "ON" : "OFF"} | Dist: ${dist ? "ON" : "OFF"} | Skills: ${skills ? "ON" : "OFF"} | Balance: ${balance ? "ON" : "OFF"}`,
1444
1762
  duration: 8e3
1445
1763
  });
1446
1764
  dialog?.clear();
@@ -1474,6 +1792,59 @@ var tui = async (api) => {
1474
1792
  }
1475
1793
  }));
1476
1794
  }
1795
+ }, {
1796
+ title: "Cache: Set DeepSeek API Key",
1797
+ value: "cache.balance.key",
1798
+ description: "Set or update the DeepSeek API key for balance display",
1799
+ slash: {
1800
+ name: "cache-balance-key"
1801
+ },
1802
+ onSelect: (dialog) => {
1803
+ const zh = langZH();
1804
+ const current = api.kv.get(`${KV_PREFIX}.ds_key`, "");
1805
+ const maskKey = (k) => {
1806
+ if (!k) return "";
1807
+ const prefix = k.startsWith("sk-") ? "sk-" : "";
1808
+ const body = prefix ? k.slice(3) : k;
1809
+ if (body.length <= 10) return prefix + body.slice(0, 5) + "*".repeat(Math.max(3, body.length - 5));
1810
+ return prefix + body.slice(0, 5) + "*".repeat(Math.max(3, body.length - 10)) + body.slice(-5);
1811
+ };
1812
+ const masked = maskKey(current);
1813
+ dialog?.replace(() => _$createComponent(api.ui.DialogPrompt, {
1814
+ title: zh ? "DeepSeek API Key" : "DeepSeek API Key",
1815
+ description: () => (() => {
1816
+ var _el$95 = _$createElement("text");
1817
+ _$insert(_el$95, zh ? "\u8F93\u5165 DeepSeek API Key \u4EE5\u663E\u793A\u8D26\u6237\u4F59\u989D\uFF08\u7559\u7A7A\u6E05\u9664\uFF09" : "Enter your DeepSeek API key to show account balance (leave empty to clear)");
1818
+ return _el$95;
1819
+ })(),
1820
+ placeholder: "sk-...",
1821
+ value: masked,
1822
+ onConfirm: (val) => {
1823
+ const input = val.trim();
1824
+ let key;
1825
+ if (input === "") {
1826
+ key = "";
1827
+ } else if (input.includes("*")) {
1828
+ key = current;
1829
+ } else {
1830
+ key = input;
1831
+ }
1832
+ api.kv.set(`${KV_PREFIX}.ds_key`, key);
1833
+ setBalanceRefresh((v) => v + 1);
1834
+ if (key) {
1835
+ api.ui.toast({
1836
+ message: zh ? "API Key \u5DF2\u4FDD\u5B58\uFF0C\u6B63\u5728\u67E5\u8BE2\u4F59\u989D..." : "API Key saved, fetching balance..."
1837
+ });
1838
+ } else {
1839
+ api.ui.toast({
1840
+ message: zh ? "API Key \u5DF2\u6E05\u9664" : "API Key cleared"
1841
+ });
1842
+ }
1843
+ dialog?.clear();
1844
+ },
1845
+ onCancel: () => dialog?.clear()
1846
+ }));
1847
+ }
1477
1848
  }, {
1478
1849
  title: "Cache: Debug Skills Detection",
1479
1850
  value: "cache.debug-skills",
@@ -1521,6 +1892,147 @@ var tui = async (api) => {
1521
1892
  duration: 15e3
1522
1893
  });
1523
1894
  }
1895
+ }, {
1896
+ title: "Cache: Sub-Agent Stats",
1897
+ value: "cache.session",
1898
+ description: "View token cache statistics for a sub-agent by session ID",
1899
+ slash: {
1900
+ name: "cache-session"
1901
+ },
1902
+ onSelect: (dialog) => {
1903
+ const rt = api.route.current;
1904
+ const parentSid = rt.name === "session" && rt.params ? String(rt.params.sessionID) : "";
1905
+ const SUBAGENT_TOOLS = /* @__PURE__ */ new Set(["task", "delegate", "call_omo_agent"]);
1906
+ const children = [];
1907
+ if (parentSid) {
1908
+ try {
1909
+ const msgs = api.state.session.messages(parentSid);
1910
+ for (const msg of msgs) {
1911
+ if (msg.role !== "assistant") continue;
1912
+ let parts = [];
1913
+ try {
1914
+ parts = api.state.part(msg.id);
1915
+ } catch {
1916
+ }
1917
+ for (const p of parts) {
1918
+ if (p.type !== "tool") continue;
1919
+ const tool = String(p.tool ?? "");
1920
+ if (!SUBAGENT_TOOLS.has(tool)) continue;
1921
+ const st = p.state;
1922
+ const stMeta = st?.metadata;
1923
+ const subSid = stMeta?.session_id ?? stMeta?.sessionId;
1924
+ if (!subSid) continue;
1925
+ const sidStr = String(subSid);
1926
+ const input = st?.input;
1927
+ const agent = String(p.subagent_type ?? input?.subagent_type ?? input?.category ?? tool);
1928
+ const prompt = String(input?.prompt ?? "");
1929
+ const desc = input?.description ? String(input.description) : "";
1930
+ const title = desc || prompt.replace(/\n/g, " ").replace(/\s+/g, " ").trim().slice(0, 40) || agent;
1931
+ children.push({
1932
+ title,
1933
+ value: sidStr,
1934
+ description: `${agent} \xB7 ${sidStr.slice(0, 24)}\u2026`
1935
+ });
1936
+ }
1937
+ }
1938
+ } catch {
1939
+ }
1940
+ }
1941
+ const seen = /* @__PURE__ */ new Set();
1942
+ const unique = children.filter((c) => {
1943
+ if (seen.has(c.value)) return false;
1944
+ seen.add(c.value);
1945
+ return true;
1946
+ });
1947
+ if (unique.length > 0) {
1948
+ const zh = langZH();
1949
+ const currentSid = signals.overrideSessionId() ?? api.kv.get(`${KV_PREFIX}.session`, "");
1950
+ const options = unique.map((c, i) => ({
1951
+ title: `${i + 1}. ${c.title}`,
1952
+ value: c.value,
1953
+ description: c.description
1954
+ }));
1955
+ const backValue = "__main__";
1956
+ const backTitle = `\u2500 ${zh ? "\u56DE\u5230\u4E3B\u4F1A\u8BDD" : "Back to Main"}`;
1957
+ options.unshift({
1958
+ title: backTitle,
1959
+ value: backValue,
1960
+ description: ""
1961
+ });
1962
+ options.push({
1963
+ title: backTitle,
1964
+ value: backValue,
1965
+ description: ""
1966
+ });
1967
+ const currentIdx = currentSid ? options.findIndex((o) => o.value === currentSid) : -1;
1968
+ dialog?.replace(() => _$createComponent(api.ui.DialogSelect, {
1969
+ title: zh ? "\u9009\u62E9\u5B50\u4EE3\u7406" : "Select Sub-Agent",
1970
+ options,
1971
+ get current() {
1972
+ return currentIdx >= 0 ? options[currentIdx].value : void 0;
1973
+ },
1974
+ onSelect: (opt) => {
1975
+ if (opt.value === backValue) {
1976
+ signals.setOverrideSessionId(void 0);
1977
+ api.kv.set(`${KV_PREFIX}.session`, "");
1978
+ api.ui.toast({
1979
+ message: zh ? "\u5DF2\u5207\u56DE\u4E3B\u4F1A\u8BDD" : "Switched to main session"
1980
+ });
1981
+ } else {
1982
+ signals.setOverrideSessionId(opt.value);
1983
+ api.kv.set(`${KV_PREFIX}.session`, opt.value);
1984
+ api.ui.toast({
1985
+ message: (zh ? "\u5DF2\u5207\u6362\u81F3\u5B50\u4EE3\u7406: " : "Showing sub-agent: ") + opt.value.slice(0, 24) + "\u2026"
1986
+ });
1987
+ }
1988
+ dialog?.clear();
1989
+ }
1990
+ }));
1991
+ } else {
1992
+ const zh = langZH();
1993
+ dialog?.replace(() => _$createComponent(api.ui.DialogPrompt, {
1994
+ get title() {
1995
+ return signals.overrideSessionId() ? zh ? "\u5207\u6362\u5B50\u4EE3\u7406" : "Switch Sub" : zh ? "\u67E5\u770B\u5B50\u4EE3\u7406\u7F13\u5B58" : "View Sub Cache";
1996
+ },
1997
+ description: () => (() => {
1998
+ var _el$96 = _$createElement("text");
1999
+ _$insert(_el$96, zh ? "\u672A\u627E\u5230\u5B50\u4EE3\u7406\uFF0C\u8BF7\u624B\u52A8\u7C98\u8D34 Session ID" : "No sub-agents found. Paste a Session ID manually");
2000
+ return _el$96;
2001
+ })(),
2002
+ placeholder: "ses_...",
2003
+ get value() {
2004
+ return signals.overrideSessionId() ?? api.kv.get(`${KV_PREFIX}.session`, "") ?? "";
2005
+ },
2006
+ onConfirm: (val) => {
2007
+ const sid = val.trim();
2008
+ if (sid) {
2009
+ signals.setOverrideSessionId(sid);
2010
+ api.kv.set(`${KV_PREFIX}.session`, sid);
2011
+ api.ui.toast({
2012
+ message: (langZH() ? "\u5DF2\u5207\u6362\u81F3\u5B50\u4EE3\u7406: " : "Showing sub-agent: ") + sid.slice(0, 24) + "\u2026"
2013
+ });
2014
+ }
2015
+ dialog?.clear();
2016
+ },
2017
+ onCancel: () => dialog?.clear()
2018
+ }));
2019
+ }
2020
+ }
2021
+ }, {
2022
+ title: "Cache: Back to Main",
2023
+ value: "cache.session.back",
2024
+ description: "Return to main session stats",
2025
+ slash: {
2026
+ name: "cache-session-back"
2027
+ },
2028
+ onSelect: (dialog) => {
2029
+ signals.setOverrideSessionId(void 0);
2030
+ api.kv.set(`${KV_PREFIX}.session`, "");
2031
+ api.ui.toast({
2032
+ message: langZH() ? "\u5DF2\u5207\u56DE\u4E3B\u4F1A\u8BDD" : "Switched to main session"
2033
+ });
2034
+ dialog?.clear();
2035
+ }
1524
2036
  }]);
1525
2037
  };
1526
2038
  var mod = {