opencode-visual-cache 1.6.0 → 1.6.2

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
@@ -10,10 +10,10 @@ import { spread as _$spread } from "@opentui/solid";
10
10
  import { mergeProps as _$mergeProps } from "@opentui/solid";
11
11
  import { memo as _$memo } from "@opentui/solid";
12
12
  import { createElement as _$createElement } from "@opentui/solid";
13
- import { createMemo, createSignal, createEffect, onMount, onCleanup, Show, untrack } from "solid-js";
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.0";
16
+ var PLUGIN_VERSION = "1.6.2";
17
17
 
18
18
  // src/balance-providers.ts
19
19
  var BalanceError = class extends Error {
@@ -140,11 +140,11 @@ var ZH_T = {
140
140
  distTitle: "\u4F30\u7B97 Token \u5206\u5E03",
141
141
  distSys: "\u7CFB\u7EDF\u63D0\u793A:",
142
142
  distUser: "\u7528\u6237:",
143
- distAgent: "Agent \u6307\u4EE4:",
143
+ distAgent: "\u5B50\u4EE3\u7406\u6307\u4EE4:",
144
144
  distTool: "Tool \u8C03\u7528:",
145
145
  distRes: "Tool \u7ED3\u679C:",
146
- distTotal: "\u603B\u8BA1:",
147
- distOut: "\u8F93\u51FA:",
146
+ distReason: "\u63A8\u7406:",
147
+ stepsCount: "\u672C\u56DE\u5408 {n} \u6B21\u8C03\u7528:",
148
148
  secDetail: "\u660E\u7EC6",
149
149
  secModel: "\u6A21\u578B",
150
150
  secSkills: "\u5DF2\u52A0\u8F7D\u6280\u80FD",
@@ -221,11 +221,11 @@ var EN_T = {
221
221
  distTitle: "Estimated Token Dist.",
222
222
  distSys: "System:",
223
223
  distUser: "User:",
224
- distAgent: "Agent Instr:",
224
+ distAgent: "Sub-Agent Instr:",
225
225
  distTool: "Tool Call:",
226
226
  distRes: "Tool Result:",
227
- distTotal: "Total:",
228
- distOut: "Output:",
227
+ distReason: "Reasoning:",
228
+ stepsCount: "Turn #{n} calls:",
229
229
  secDetail: "Detail",
230
230
  secModel: "Model",
231
231
  secSkills: "Loaded Skills",
@@ -302,11 +302,11 @@ var JA_T = {
302
302
  distTitle: "Token \u5206\u5E03\uFF08\u63A8\u5B9A\uFF09",
303
303
  distSys: "\u30B7\u30B9\u30C6\u30E0:",
304
304
  distUser: "\u30E6\u30FC\u30B6\u30FC:",
305
- distAgent: "Agent \u6307\u793A:",
305
+ distAgent: "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u6307\u793A:",
306
306
  distTool: "Tool \u547C\u3073\u51FA\u3057:",
307
307
  distRes: "Tool \u7D50\u679C:",
308
- distTotal: "\u5408\u8A08:",
309
- distOut: "\u51FA\u529B:",
308
+ distReason: "\u63A8\u8AD6:",
309
+ stepsCount: "\u4ECA\u56DE {n} \u56DE\u547C\u51FA:",
310
310
  secDetail: "\u660E\u7D30",
311
311
  secModel: "\u30E2\u30C7\u30EB",
312
312
  secSkills: "\u8AAD\u307F\u8FBC\u307F\u6E08\u307F\u30B9\u30AD\u30EB",
@@ -383,11 +383,11 @@ var KO_T = {
383
383
  distTitle: "Token \uBD84\uD3EC(\uCD94\uC815)",
384
384
  distSys: "\uC2DC\uC2A4\uD15C:",
385
385
  distUser: "\uC0AC\uC6A9\uC790:",
386
- distAgent: "Agent \uC9C0\uC2DC:",
386
+ distAgent: "\uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8 \uC9C0\uC2DC:",
387
387
  distTool: "Tool \uD638\uCD9C:",
388
388
  distRes: "Tool \uACB0\uACFC:",
389
- distTotal: "\uD569\uACC4:",
390
- distOut: "\uCD9C\uB825:",
389
+ distReason: "\uCD94\uB860:",
390
+ stepsCount: "\uC774\uBC88 \uD134 {n}\uD68C \uD638\uCD9C:",
391
391
  secDetail: "\uC0C1\uC138",
392
392
  secModel: "\uBAA8\uB378",
393
393
  secSkills: "\uB85C\uB4DC\uB41C \uC2A4\uD0AC",
@@ -707,6 +707,10 @@ function TokenCachePanel(props) {
707
707
  const [distOpen, setDistOpen] = createSignal(false);
708
708
  const [skillsOpen, setSkillsOpen] = createSignal(true);
709
709
  let boxEl;
710
+ createEffect(() => {
711
+ props.signals.setSidebarVisible(true);
712
+ onCleanup(() => props.signals.setSidebarVisible(false));
713
+ });
710
714
  const {
711
715
  currencySymbol,
712
716
  setCurrencySymbol,
@@ -744,9 +748,11 @@ function TokenCachePanel(props) {
744
748
  toolCall: 0,
745
749
  toolResult: 0,
746
750
  output: 0,
751
+ reasoning: 0,
747
752
  apiOutput: 0,
748
753
  apiInput: 0,
749
- stepCost: 0
754
+ stepCost: 0,
755
+ stepCount: 0
750
756
  });
751
757
  const [lastHasDist, setLastHasDist] = createSignal(false);
752
758
  const [dataSignal, setDataSignal] = createSignal({
@@ -774,9 +780,11 @@ function TokenCachePanel(props) {
774
780
  toolCall: 0,
775
781
  toolResult: 0,
776
782
  output: 0,
783
+ reasoning: 0,
777
784
  apiOutput: 0,
778
785
  apiInput: 0,
779
- stepCost: 0
786
+ stepCost: 0,
787
+ stepCount: 0
780
788
  },
781
789
  hasDistData: false,
782
790
  skills: [],
@@ -890,9 +898,11 @@ function TokenCachePanel(props) {
890
898
  toolCall: 0,
891
899
  toolResult: 0,
892
900
  output: 0,
901
+ reasoning: 0,
893
902
  apiOutput: 0,
894
903
  apiInput: 0,
895
- stepCost: 0
904
+ stepCost: 0,
905
+ stepCount: 0
896
906
  };
897
907
  let hasDistData = false;
898
908
  const loadedSkills = /* @__PURE__ */ new Map();
@@ -923,6 +933,7 @@ function TokenCachePanel(props) {
923
933
  } else if (msg.role === "assistant") {
924
934
  const am = msg;
925
935
  dist.output += num(am.tokens?.output);
936
+ dist.reasoning += num(am.tokens?.reasoning);
926
937
  let parts = [];
927
938
  try {
928
939
  parts = props.api.state.part(msg.id);
@@ -937,6 +948,12 @@ function TokenCachePanel(props) {
937
948
  } catch {
938
949
  }
939
950
  if (rawInput) dist.toolCall += estimateTokens(rawInput);
951
+ if (tp.tool === "task" && tp.state?.input) {
952
+ const ti = tp.state.input;
953
+ const prompt = typeof ti.prompt === "string" ? ti.prompt : "";
954
+ const desc = typeof ti.description === "string" ? ti.description : "";
955
+ dist.agent += estimateTokens(prompt || desc);
956
+ }
940
957
  if (tp.state.status === "completed") {
941
958
  const c = tp.state;
942
959
  if (c.output) dist.toolResult += estimateTokens(c.output);
@@ -961,8 +978,7 @@ function TokenCachePanel(props) {
961
978
  }
962
979
  }
963
980
  }
964
- } else if (p.type === "reasoning") dist.agent += estimateTokens(p.text);
965
- else if (p.type === "subtask") {
981
+ } else if (p.type === "subtask") {
966
982
  const sub = p;
967
983
  dist.agent += estimateTokens(sub.prompt || sub.description || "");
968
984
  }
@@ -979,7 +995,28 @@ function TokenCachePanel(props) {
979
995
  }
980
996
  dist.apiInput = num(lastAssMsg?.tokens?.input) + num(lastAssMsg?.tokens?.cache?.read) + num(lastAssMsg?.tokens?.cache?.write);
981
997
  dist.apiOutput = num(lastAssMsg?.tokens?.output);
982
- hasDistData = dist.system + dist.user + dist.agent + dist.toolCall + dist.toolResult > 0 || dist.apiOutput > 0 || dist.apiInput > 0;
998
+ if (lastAssMsg) {
999
+ const roundParent = lastAssMsg.parentID;
1000
+ let lastCost;
1001
+ for (let i = msgs.length - 1; i >= 0; i--) {
1002
+ const m = msgs[i];
1003
+ if (m.role !== "assistant") continue;
1004
+ if (m.parentID !== roundParent) break;
1005
+ let parts = [];
1006
+ try {
1007
+ parts = props.api.state.part(m.id);
1008
+ } catch {
1009
+ }
1010
+ for (const p of parts) {
1011
+ if (p.type !== "step-finish") continue;
1012
+ dist.stepCount++;
1013
+ const sc = p.cost;
1014
+ if (lastCost === void 0 && typeof sc === "number" && Number.isFinite(sc)) lastCost = sc;
1015
+ }
1016
+ }
1017
+ if (lastCost !== void 0) dist.stepCost = lastCost;
1018
+ }
1019
+ hasDistData = dist.system + dist.user + dist.agent + dist.toolCall + dist.toolResult > 0 || dist.apiOutput > 0 || dist.apiInput > 0 || dist.reasoning > 0;
983
1020
  } catch {
984
1021
  }
985
1022
  const finalDist = hasDistData ? dist : lastDist(), finalHasDist = hasDistData || lastHasDist();
@@ -1298,25 +1335,25 @@ function TokenCachePanel(props) {
1298
1335
  const prefix = " \u21B3 " + t("subPrefix");
1299
1336
  const maxSidW = Math.max(6, panelWidth() - visualWidth(prefix));
1300
1337
  return (() => {
1301
- var _el$69 = _$createElement("text"), _el$70 = _$createElement("span"), _el$71 = _$createElement("span");
1302
- _$insertNode(_el$69, _el$70);
1303
- _$insertNode(_el$69, _el$71);
1304
- _$insert(_el$70, prefix);
1305
- _$insert(_el$71, () => truncateVisual(props.signals.overrideSessionId(), maxSidW));
1338
+ var _el$70 = _$createElement("text"), _el$71 = _$createElement("span"), _el$72 = _$createElement("span");
1339
+ _$insertNode(_el$70, _el$71);
1340
+ _$insertNode(_el$70, _el$72);
1341
+ _$insert(_el$71, prefix);
1342
+ _$insert(_el$72, () => truncateVisual(props.signals.overrideSessionId(), maxSidW));
1306
1343
  _$effect((_p$) => {
1307
1344
  var _v$17 = {
1308
1345
  fg: pal().muted
1309
1346
  }, _v$18 = {
1310
1347
  fg: pal().text
1311
1348
  };
1312
- _v$17 !== _p$.e && (_p$.e = _$setProp(_el$70, "style", _v$17, _p$.e));
1313
- _v$18 !== _p$.t && (_p$.t = _$setProp(_el$71, "style", _v$18, _p$.t));
1349
+ _v$17 !== _p$.e && (_p$.e = _$setProp(_el$71, "style", _v$17, _p$.e));
1350
+ _v$18 !== _p$.t && (_p$.t = _$setProp(_el$72, "style", _v$18, _p$.t));
1314
1351
  return _p$;
1315
1352
  }, {
1316
1353
  e: void 0,
1317
1354
  t: void 0
1318
1355
  });
1319
- return _el$69;
1356
+ return _el$70;
1320
1357
  })();
1321
1358
  })();
1322
1359
  }
@@ -1326,30 +1363,30 @@ function TokenCachePanel(props) {
1326
1363
  },
1327
1364
  get fallback() {
1328
1365
  return [(() => {
1329
- var _el$72 = _$createElement("text");
1330
- _$insert(_el$72, sep);
1331
- _$effect((_$p) => _$setProp(_el$72, "fg", pal().muted, _$p));
1332
- return _el$72;
1366
+ var _el$73 = _$createElement("text");
1367
+ _$insert(_el$73, sep);
1368
+ _$effect((_$p) => _$setProp(_el$73, "fg", pal().muted, _$p));
1369
+ return _el$73;
1333
1370
  })(), (() => {
1334
- var _el$73 = _$createElement("text"), _el$74 = _$createElement("span"), _el$76 = _$createElement("span");
1335
- _$insertNode(_el$73, _el$74);
1336
- _$insertNode(_el$73, _el$76);
1337
- _$insertNode(_el$74, _$createTextNode(`> `));
1338
- _$insert(_el$76, () => t("noData"));
1371
+ var _el$74 = _$createElement("text"), _el$75 = _$createElement("span"), _el$77 = _$createElement("span");
1372
+ _$insertNode(_el$74, _el$75);
1373
+ _$insertNode(_el$74, _el$77);
1374
+ _$insertNode(_el$75, _$createTextNode(`> `));
1375
+ _$insert(_el$77, () => t("noData"));
1339
1376
  _$effect((_p$) => {
1340
1377
  var _v$19 = {
1341
1378
  fg: pal().muted
1342
1379
  }, _v$20 = {
1343
1380
  fg: pal().muted
1344
1381
  };
1345
- _v$19 !== _p$.e && (_p$.e = _$setProp(_el$74, "style", _v$19, _p$.e));
1346
- _v$20 !== _p$.t && (_p$.t = _$setProp(_el$76, "style", _v$20, _p$.t));
1382
+ _v$19 !== _p$.e && (_p$.e = _$setProp(_el$75, "style", _v$19, _p$.e));
1383
+ _v$20 !== _p$.t && (_p$.t = _$setProp(_el$77, "style", _v$20, _p$.t));
1347
1384
  return _p$;
1348
1385
  }, {
1349
1386
  e: void 0,
1350
1387
  t: void 0
1351
1388
  });
1352
- return _el$73;
1389
+ return _el$74;
1353
1390
  })()];
1354
1391
  },
1355
1392
  get children() {
@@ -1479,32 +1516,44 @@ function TokenCachePanel(props) {
1479
1516
  _$effect((_$p) => _$setProp(_el$33, "fg", pal().muted, _$p));
1480
1517
  return _el$33;
1481
1518
  })(), _$createComponent(Show, {
1519
+ get when() {
1520
+ return data().dist.stepCount >= 2;
1521
+ },
1522
+ get children() {
1523
+ var _el$34 = _$createElement("text");
1524
+ _$insert(_el$34, () => justify(t("stepsCount", {
1525
+ n: data().dist.stepCount
1526
+ }), fmtCost(data().dist.stepCost, currencySymbol(), exchangeRate())));
1527
+ _$effect((_$p) => _$setProp(_el$34, "fg", pal().muted, _$p));
1528
+ return _el$34;
1529
+ }
1530
+ }), _$createComponent(Show, {
1482
1531
  get when() {
1483
1532
  return data().saved > 0;
1484
1533
  },
1485
1534
  get children() {
1486
- var _el$34 = _$createElement("text"), _el$35 = _$createElement("span"), _el$36 = _$createElement("span"), _el$37 = _$createElement("span"), _el$38 = _$createTextNode(`~`);
1487
- _$insertNode(_el$34, _el$35);
1488
- _$insertNode(_el$34, _el$36);
1489
- _$insertNode(_el$34, _el$37);
1490
- _$insert(_el$35, () => t("saved"));
1491
- _$insert(_el$36, () => " ".repeat(Math.max(1, panelWidth() - gutter() - visualWidth(t("saved")) - visualWidth("~" + fmtCost(data().saved, currencySymbol(), exchangeRate())))));
1492
- _$insertNode(_el$37, _el$38);
1493
- _$insert(_el$37, () => fmtCost(data().saved, currencySymbol(), exchangeRate()), null);
1535
+ var _el$35 = _$createElement("text"), _el$36 = _$createElement("span"), _el$37 = _$createElement("span"), _el$38 = _$createElement("span"), _el$39 = _$createTextNode(`~`);
1536
+ _$insertNode(_el$35, _el$36);
1537
+ _$insertNode(_el$35, _el$37);
1538
+ _$insertNode(_el$35, _el$38);
1539
+ _$insert(_el$36, () => t("saved"));
1540
+ _$insert(_el$37, () => " ".repeat(Math.max(1, panelWidth() - gutter() - visualWidth(t("saved")) - visualWidth("~" + fmtCost(data().saved, currencySymbol(), exchangeRate())))));
1541
+ _$insertNode(_el$38, _el$39);
1542
+ _$insert(_el$38, () => fmtCost(data().saved, currencySymbol(), exchangeRate()), null);
1494
1543
  _$effect((_p$) => {
1495
1544
  var _v$7 = {
1496
1545
  fg: pal().muted
1497
1546
  }, _v$8 = {
1498
1547
  fg: pal().success
1499
1548
  };
1500
- _v$7 !== _p$.e && (_p$.e = _$setProp(_el$35, "style", _v$7, _p$.e));
1501
- _v$8 !== _p$.t && (_p$.t = _$setProp(_el$37, "style", _v$8, _p$.t));
1549
+ _v$7 !== _p$.e && (_p$.e = _$setProp(_el$36, "style", _v$7, _p$.e));
1550
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$38, "style", _v$8, _p$.t));
1502
1551
  return _p$;
1503
1552
  }, {
1504
1553
  e: void 0,
1505
1554
  t: void 0
1506
1555
  });
1507
- return _el$34;
1556
+ return _el$35;
1508
1557
  }
1509
1558
  })];
1510
1559
  }
@@ -1516,19 +1565,19 @@ function TokenCachePanel(props) {
1516
1565
  },
1517
1566
  get children() {
1518
1567
  return [_$memo(() => (() => {
1519
- var _el$77 = _$createElement("text"), _el$78 = _$createElement("span"), _el$79 = _$createElement("span"), _el$80 = _$createElement("b"), _el$81 = _$createElement("span");
1520
- _$insertNode(_el$77, _el$78);
1521
- _$insertNode(_el$77, _el$79);
1522
- _$insertNode(_el$77, _el$81);
1523
- _$setProp(_el$77, "onMouseUp", () => setModelOpen((o) => {
1568
+ var _el$78 = _$createElement("text"), _el$79 = _$createElement("span"), _el$80 = _$createElement("span"), _el$81 = _$createElement("b"), _el$82 = _$createElement("span");
1569
+ _$insertNode(_el$78, _el$79);
1570
+ _$insertNode(_el$78, _el$80);
1571
+ _$insertNode(_el$78, _el$82);
1572
+ _$setProp(_el$78, "onMouseUp", () => setModelOpen((o) => {
1524
1573
  const n = !o;
1525
1574
  persistFold("model", n);
1526
1575
  return n;
1527
1576
  }));
1528
- _$insert(_el$78, () => modelOpen() ? "\u25BC " : "\u25B6 ");
1529
- _$insertNode(_el$79, _el$80);
1530
- _$insert(_el$80, () => t("secModel"));
1531
- _$insert(_el$81, () => sep().slice(visualWidth((modelOpen() ? "\u25BC " : "\u25B6 ") + t("secModel"))));
1577
+ _$insert(_el$79, () => modelOpen() ? "\u25BC " : "\u25B6 ");
1578
+ _$insertNode(_el$80, _el$81);
1579
+ _$insert(_el$81, () => t("secModel"));
1580
+ _$insert(_el$82, () => sep().slice(visualWidth((modelOpen() ? "\u25BC " : "\u25B6 ") + t("secModel"))));
1532
1581
  _$effect((_p$) => {
1533
1582
  var _v$21 = {
1534
1583
  fg: pal().muted
@@ -1537,70 +1586,70 @@ function TokenCachePanel(props) {
1537
1586
  }, _v$23 = {
1538
1587
  fg: pal().muted
1539
1588
  };
1540
- _v$21 !== _p$.e && (_p$.e = _$setProp(_el$78, "style", _v$21, _p$.e));
1541
- _v$22 !== _p$.t && (_p$.t = _$setProp(_el$79, "style", _v$22, _p$.t));
1542
- _v$23 !== _p$.a && (_p$.a = _$setProp(_el$81, "style", _v$23, _p$.a));
1589
+ _v$21 !== _p$.e && (_p$.e = _$setProp(_el$79, "style", _v$21, _p$.e));
1590
+ _v$22 !== _p$.t && (_p$.t = _$setProp(_el$80, "style", _v$22, _p$.t));
1591
+ _v$23 !== _p$.a && (_p$.a = _$setProp(_el$82, "style", _v$23, _p$.a));
1543
1592
  return _p$;
1544
1593
  }, {
1545
1594
  e: void 0,
1546
1595
  t: void 0,
1547
1596
  a: void 0
1548
1597
  });
1549
- return _el$77;
1598
+ return _el$78;
1550
1599
  })()), _$createComponent(Show, {
1551
1600
  get when() {
1552
1601
  return modelOpen();
1553
1602
  },
1554
1603
  get children() {
1555
1604
  return [(() => {
1556
- var _el$39 = _$createElement("text");
1557
- _$insert(_el$39, () => justify(t("cost"), fmtCost(data().cost, currencySymbol(), exchangeRate())));
1558
- _$effect((_$p) => _$setProp(_el$39, "fg", pal().text, _$p));
1559
- return _el$39;
1605
+ var _el$40 = _$createElement("text");
1606
+ _$insert(_el$40, () => justify(t("cost"), fmtCost(data().cost, currencySymbol(), exchangeRate())));
1607
+ _$effect((_$p) => _$setProp(_el$40, "fg", pal().text, _$p));
1608
+ return _el$40;
1560
1609
  })(), _$createComponent(Show, {
1561
1610
  get when() {
1562
1611
  return data().providerName;
1563
1612
  },
1564
1613
  get children() {
1565
- var _el$40 = _$createElement("text");
1566
- _$insert(_el$40, () => justify(t("provider"), data().providerName));
1567
- _$effect((_$p) => _$setProp(_el$40, "fg", pal().muted, _$p));
1568
- return _el$40;
1614
+ var _el$41 = _$createElement("text");
1615
+ _$insert(_el$41, () => justify(t("provider"), data().providerName));
1616
+ _$effect((_$p) => _$setProp(_el$41, "fg", pal().muted, _$p));
1617
+ return _el$41;
1569
1618
  }
1570
1619
  }), (() => {
1571
- var _el$41 = _$createElement("text");
1572
- _$insert(_el$41, () => justify(t("model"), data().model));
1573
- _$effect((_$p) => _$setProp(_el$41, "fg", pal().muted, _$p));
1574
- return _el$41;
1620
+ var _el$42 = _$createElement("text");
1621
+ _$insert(_el$42, () => justify(t("model"), data().model));
1622
+ _$effect((_$p) => _$setProp(_el$42, "fg", pal().muted, _$p));
1623
+ return _el$42;
1575
1624
  })(), _$createComponent(Show, {
1576
1625
  get when() {
1577
1626
  return data().hasPricing;
1578
1627
  },
1579
1628
  get children() {
1580
1629
  return [(() => {
1581
- var _el$42 = _$createElement("text");
1582
- _$insert(_el$42, () => justify(t("rate"), currencySymbol() + (data().inputRate * exchangeRate()).toFixed(2) + "/M " + t("inputRate")));
1583
- _$effect((_$p) => _$setProp(_el$42, "fg", pal().muted, _$p));
1584
- return _el$42;
1630
+ var _el$43 = _$createElement("text");
1631
+ _$insert(_el$43, () => justify(t("rate"), currencySymbol() + (data().inputRate * exchangeRate()).toFixed(2) + "/M " + t("inputRate")));
1632
+ _$effect((_$p) => _$setProp(_el$43, "fg", pal().muted, _$p));
1633
+ return _el$43;
1585
1634
  })(), _$createComponent(Show, {
1586
1635
  get when() {
1587
1636
  return data().cacheReadRate > 0;
1588
1637
  },
1589
1638
  get children() {
1590
- var _el$43 = _$createElement("text");
1591
- _$insert(_el$43, () => justify("", currencySymbol() + (data().cacheReadRate * exchangeRate()).toFixed(2) + "/M " + t("cacheRate")));
1592
- _$effect((_$p) => _$setProp(_el$43, "fg", pal().muted, _$p));
1593
- return _el$43;
1639
+ var _el$44 = _$createElement("text");
1640
+ _$insert(_el$44, () => justify("", currencySymbol() + (data().cacheReadRate * exchangeRate()).toFixed(2) + "/M " + t("cacheRate")));
1641
+ _$effect((_$p) => _$setProp(_el$44, "fg", pal().muted, _$p));
1642
+ return _el$44;
1594
1643
  }
1595
1644
  }), _$createComponent(Show, {
1596
1645
  get when() {
1597
1646
  return data().cacheWriteRate > 0;
1598
1647
  },
1599
1648
  get children() {
1600
- var _el$44 = _$createElement("text");
1601
- _$insert(_el$44, () => justify("", currencySymbol() + (data().cacheWriteRate * exchangeRate()).toFixed(2) + "/M " + t("writeRate")));
1602
- _$effect((_$p) => _$setProp(_el$44, "fg", pal().muted, _$p));
1603
- return _el$44;
1649
+ var _el$45 = _$createElement("text");
1650
+ _$insert(_el$45, () => justify("", currencySymbol() + (data().cacheWriteRate * exchangeRate()).toFixed(2) + "/M " + t("writeRate")));
1651
+ _$effect((_$p) => _$setProp(_el$45, "fg", pal().muted, _$p));
1652
+ return _el$45;
1604
1653
  }
1605
1654
  })];
1606
1655
  }
@@ -1619,19 +1668,19 @@ function TokenCachePanel(props) {
1619
1668
  },
1620
1669
  get children() {
1621
1670
  return [_$memo(() => (() => {
1622
- var _el$82 = _$createElement("text"), _el$83 = _$createElement("span"), _el$84 = _$createElement("span"), _el$85 = _$createElement("b"), _el$86 = _$createElement("span");
1623
- _$insertNode(_el$82, _el$83);
1624
- _$insertNode(_el$82, _el$84);
1625
- _$insertNode(_el$82, _el$86);
1626
- _$setProp(_el$82, "onMouseUp", () => setDistOpen((o) => {
1671
+ var _el$83 = _$createElement("text"), _el$84 = _$createElement("span"), _el$85 = _$createElement("span"), _el$86 = _$createElement("b"), _el$87 = _$createElement("span");
1672
+ _$insertNode(_el$83, _el$84);
1673
+ _$insertNode(_el$83, _el$85);
1674
+ _$insertNode(_el$83, _el$87);
1675
+ _$setProp(_el$83, "onMouseUp", () => setDistOpen((o) => {
1627
1676
  const n = !o;
1628
1677
  persistFold("dist", n);
1629
1678
  return n;
1630
1679
  }));
1631
- _$insert(_el$83, () => distOpen() ? "\u25BC " : "\u25B6 ");
1632
- _$insertNode(_el$84, _el$85);
1633
- _$insert(_el$85, () => t("distTitle"));
1634
- _$insert(_el$86, () => sep().slice(visualWidth((distOpen() ? "\u25BC " : "\u25B6 ") + t("distTitle"))));
1680
+ _$insert(_el$84, () => distOpen() ? "\u25BC " : "\u25B6 ");
1681
+ _$insertNode(_el$85, _el$86);
1682
+ _$insert(_el$86, () => t("distTitle"));
1683
+ _$insert(_el$87, () => sep().slice(visualWidth((distOpen() ? "\u25BC " : "\u25B6 ") + t("distTitle"))));
1635
1684
  _$effect((_p$) => {
1636
1685
  var _v$24 = {
1637
1686
  fg: pal().muted
@@ -1640,16 +1689,16 @@ function TokenCachePanel(props) {
1640
1689
  }, _v$26 = {
1641
1690
  fg: pal().muted
1642
1691
  };
1643
- _v$24 !== _p$.e && (_p$.e = _$setProp(_el$83, "style", _v$24, _p$.e));
1644
- _v$25 !== _p$.t && (_p$.t = _$setProp(_el$84, "style", _v$25, _p$.t));
1645
- _v$26 !== _p$.a && (_p$.a = _$setProp(_el$86, "style", _v$26, _p$.a));
1692
+ _v$24 !== _p$.e && (_p$.e = _$setProp(_el$84, "style", _v$24, _p$.e));
1693
+ _v$25 !== _p$.t && (_p$.t = _$setProp(_el$85, "style", _v$25, _p$.t));
1694
+ _v$26 !== _p$.a && (_p$.a = _$setProp(_el$87, "style", _v$26, _p$.a));
1646
1695
  return _p$;
1647
1696
  }, {
1648
1697
  e: void 0,
1649
1698
  t: void 0,
1650
1699
  a: void 0
1651
1700
  });
1652
- return _el$82;
1701
+ return _el$83;
1653
1702
  })()), _$createComponent(Show, {
1654
1703
  get when() {
1655
1704
  return distOpen();
@@ -1659,58 +1708,63 @@ function TokenCachePanel(props) {
1659
1708
  get when() {
1660
1709
  return data().dist.system > 0;
1661
1710
  },
1662
- get children() {
1663
- var _el$45 = _$createElement("text");
1664
- _$insert(_el$45, () => justify(t("distSys"), fmt(data().dist.system), t("tok")));
1665
- _$effect((_$p) => _$setProp(_el$45, "fg", pal().muted, _$p));
1666
- return _el$45;
1667
- }
1668
- }), _$createComponent(Show, {
1669
- get when() {
1670
- return data().dist.user > 0;
1671
- },
1672
1711
  get children() {
1673
1712
  var _el$46 = _$createElement("text");
1674
- _$insert(_el$46, () => justify(t("distUser"), fmt(data().dist.user), t("tok")));
1713
+ _$insert(_el$46, () => justify(t("distSys"), fmt(data().dist.system), t("tok")));
1675
1714
  _$effect((_$p) => _$setProp(_el$46, "fg", pal().muted, _$p));
1676
1715
  return _el$46;
1677
1716
  }
1678
1717
  }), _$createComponent(Show, {
1679
1718
  get when() {
1680
- return data().dist.agent > 0;
1719
+ return data().dist.user > 0;
1681
1720
  },
1682
1721
  get children() {
1683
1722
  var _el$47 = _$createElement("text");
1684
- _$insert(_el$47, () => justify(t("distAgent"), fmt(data().dist.agent), t("tok")));
1723
+ _$insert(_el$47, () => justify(t("distUser"), fmt(data().dist.user), t("tok")));
1685
1724
  _$effect((_$p) => _$setProp(_el$47, "fg", pal().muted, _$p));
1686
1725
  return _el$47;
1687
1726
  }
1688
1727
  }), _$createComponent(Show, {
1689
1728
  get when() {
1690
- return data().dist.toolCall > 0;
1729
+ return data().dist.agent > 0;
1691
1730
  },
1692
1731
  get children() {
1693
1732
  var _el$48 = _$createElement("text");
1694
- _$insert(_el$48, () => justify(t("distTool"), fmt(data().dist.toolCall), t("tok")));
1733
+ _$insert(_el$48, () => justify(t("distAgent"), fmt(data().dist.agent), t("tok")));
1695
1734
  _$effect((_$p) => _$setProp(_el$48, "fg", pal().muted, _$p));
1696
1735
  return _el$48;
1697
1736
  }
1698
1737
  }), _$createComponent(Show, {
1699
1738
  get when() {
1700
- return data().dist.toolResult > 0;
1739
+ return data().dist.toolCall > 0;
1701
1740
  },
1702
1741
  get children() {
1703
1742
  var _el$49 = _$createElement("text");
1704
- _$insert(_el$49, () => justify(t("distRes"), fmt(data().dist.toolResult), t("tok")));
1743
+ _$insert(_el$49, () => justify(t("distTool"), fmt(data().dist.toolCall), t("tok")));
1705
1744
  _$effect((_$p) => _$setProp(_el$49, "fg", pal().muted, _$p));
1706
1745
  return _el$49;
1707
1746
  }
1708
- }), (() => {
1709
- var _el$50 = _$createElement("text");
1710
- _$insert(_el$50, () => justify(t("distTotal"), fmt(data().dist.apiInput), t("tok")));
1711
- _$effect((_$p) => _$setProp(_el$50, "fg", pal().text, _$p));
1712
- return _el$50;
1713
- })()];
1747
+ }), _$createComponent(Show, {
1748
+ get when() {
1749
+ return data().dist.toolResult > 0;
1750
+ },
1751
+ get children() {
1752
+ var _el$50 = _$createElement("text");
1753
+ _$insert(_el$50, () => justify(t("distRes"), fmt(data().dist.toolResult), t("tok")));
1754
+ _$effect((_$p) => _$setProp(_el$50, "fg", pal().muted, _$p));
1755
+ return _el$50;
1756
+ }
1757
+ }), _$createComponent(Show, {
1758
+ get when() {
1759
+ return data().dist.reasoning > 0;
1760
+ },
1761
+ get children() {
1762
+ var _el$51 = _$createElement("text");
1763
+ _$insert(_el$51, () => justify(t("distReason"), fmt(data().dist.reasoning), t("tok")));
1764
+ _$effect((_$p) => _$setProp(_el$51, "fg", pal().muted, _$p));
1765
+ return _el$51;
1766
+ }
1767
+ })];
1714
1768
  }
1715
1769
  })];
1716
1770
  }
@@ -1727,23 +1781,23 @@ function TokenCachePanel(props) {
1727
1781
  },
1728
1782
  get children() {
1729
1783
  return [_$memo(() => (() => {
1730
- var _el$87 = _$createElement("text"), _el$88 = _$createElement("span"), _el$89 = _$createElement("span"), _el$90 = _$createElement("b"), _el$91 = _$createElement("span"), _el$92 = _$createTextNode(` (`), _el$93 = _$createTextNode(`)`), _el$94 = _$createElement("span");
1731
- _$insertNode(_el$87, _el$88);
1732
- _$insertNode(_el$87, _el$89);
1733
- _$insertNode(_el$87, _el$91);
1734
- _$insertNode(_el$87, _el$94);
1735
- _$setProp(_el$87, "onMouseUp", () => setSkillsOpen((o) => {
1784
+ 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");
1785
+ _$insertNode(_el$88, _el$89);
1786
+ _$insertNode(_el$88, _el$90);
1787
+ _$insertNode(_el$88, _el$92);
1788
+ _$insertNode(_el$88, _el$95);
1789
+ _$setProp(_el$88, "onMouseUp", () => setSkillsOpen((o) => {
1736
1790
  const n = !o;
1737
1791
  persistFold("skills", n);
1738
1792
  return n;
1739
1793
  }));
1740
- _$insert(_el$88, () => skillsOpen() ? "\u25BC " : "\u25B6 ");
1741
- _$insertNode(_el$89, _el$90);
1742
- _$insert(_el$90, () => t("secSkills"));
1743
- _$insertNode(_el$91, _el$92);
1744
- _$insertNode(_el$91, _el$93);
1745
- _$insert(_el$91, () => data().skills.length, _el$93);
1746
- _$insert(_el$94, () => sep().slice(visualWidth((skillsOpen() ? "\u25BC " : "\u25B6 ") + t("secSkills") + ` (${data().skills.length})`)));
1794
+ _$insert(_el$89, () => skillsOpen() ? "\u25BC " : "\u25B6 ");
1795
+ _$insertNode(_el$90, _el$91);
1796
+ _$insert(_el$91, () => t("secSkills"));
1797
+ _$insertNode(_el$92, _el$93);
1798
+ _$insertNode(_el$92, _el$94);
1799
+ _$insert(_el$92, () => data().skills.length, _el$94);
1800
+ _$insert(_el$95, () => sep().slice(visualWidth((skillsOpen() ? "\u25BC " : "\u25B6 ") + t("secSkills") + ` (${data().skills.length})`)));
1747
1801
  _$effect((_p$) => {
1748
1802
  var _v$27 = {
1749
1803
  fg: pal().muted
@@ -1754,10 +1808,10 @@ function TokenCachePanel(props) {
1754
1808
  }, _v$30 = {
1755
1809
  fg: pal().muted
1756
1810
  };
1757
- _v$27 !== _p$.e && (_p$.e = _$setProp(_el$88, "style", _v$27, _p$.e));
1758
- _v$28 !== _p$.t && (_p$.t = _$setProp(_el$89, "style", _v$28, _p$.t));
1759
- _v$29 !== _p$.a && (_p$.a = _$setProp(_el$91, "style", _v$29, _p$.a));
1760
- _v$30 !== _p$.o && (_p$.o = _$setProp(_el$94, "style", _v$30, _p$.o));
1811
+ _v$27 !== _p$.e && (_p$.e = _$setProp(_el$89, "style", _v$27, _p$.e));
1812
+ _v$28 !== _p$.t && (_p$.t = _$setProp(_el$90, "style", _v$28, _p$.t));
1813
+ _v$29 !== _p$.a && (_p$.a = _$setProp(_el$92, "style", _v$29, _p$.a));
1814
+ _v$30 !== _p$.o && (_p$.o = _$setProp(_el$95, "style", _v$30, _p$.o));
1761
1815
  return _p$;
1762
1816
  }, {
1763
1817
  e: void 0,
@@ -1765,7 +1819,7 @@ function TokenCachePanel(props) {
1765
1819
  a: void 0,
1766
1820
  o: void 0
1767
1821
  });
1768
- return _el$87;
1822
+ return _el$88;
1769
1823
  })()), _$createComponent(Show, {
1770
1824
  get when() {
1771
1825
  return skillsOpen();
@@ -1776,10 +1830,10 @@ function TokenCachePanel(props) {
1776
1830
  const maxLabel = Math.max(4, panelWidth() - gutter() - rightW - 1);
1777
1831
  const label = truncateVisual(sk.name, maxLabel);
1778
1832
  return (() => {
1779
- var _el$95 = _$createElement("text");
1780
- _$insert(_el$95, () => justify(label, fmt(sk.tokens), t("tok")));
1781
- _$effect((_$p) => _$setProp(_el$95, "fg", pal().muted, _$p));
1782
- return _el$95;
1833
+ var _el$96 = _$createElement("text");
1834
+ _$insert(_el$96, () => justify(label, fmt(sk.tokens), t("tok")));
1835
+ _$effect((_$p) => _$setProp(_el$96, "fg", pal().muted, _$p));
1836
+ return _el$96;
1783
1837
  })();
1784
1838
  });
1785
1839
  }
@@ -1793,32 +1847,32 @@ function TokenCachePanel(props) {
1793
1847
  },
1794
1848
  get children() {
1795
1849
  return [(() => {
1796
- var _el$51 = _$createElement("text");
1797
- _$insert(_el$51, sep);
1798
- _$effect((_$p) => _$setProp(_el$51, "fg", pal().muted, _$p));
1799
- return _el$51;
1850
+ var _el$52 = _$createElement("text");
1851
+ _$insert(_el$52, sep);
1852
+ _$effect((_$p) => _$setProp(_el$52, "fg", pal().muted, _$p));
1853
+ return _el$52;
1800
1854
  })(), _$createComponent(Show, {
1801
1855
  get when() {
1802
1856
  return balanceUnsupported();
1803
1857
  },
1804
1858
  get children() {
1805
- var _el$52 = _$createElement("text"), _el$53 = _$createElement("span"), _el$55 = _$createElement("span");
1806
- _$insertNode(_el$52, _el$53);
1807
- _$insertNode(_el$52, _el$55);
1808
- _$insertNode(_el$53, _$createTextNode(`> `));
1809
- _$insert(_el$55, () => t("balUnsupported"));
1859
+ var _el$53 = _$createElement("text"), _el$54 = _$createElement("span"), _el$56 = _$createElement("span");
1860
+ _$insertNode(_el$53, _el$54);
1861
+ _$insertNode(_el$53, _el$56);
1862
+ _$insertNode(_el$54, _$createTextNode(`> `));
1863
+ _$insert(_el$56, () => t("balUnsupported"));
1810
1864
  _$effect((_p$) => {
1811
1865
  var _v$9 = pal().muted, _v$0 = {
1812
1866
  fg: pal().muted
1813
1867
  };
1814
- _v$9 !== _p$.e && (_p$.e = _$setProp(_el$52, "fg", _v$9, _p$.e));
1815
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$53, "style", _v$0, _p$.t));
1868
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$53, "fg", _v$9, _p$.e));
1869
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$54, "style", _v$0, _p$.t));
1816
1870
  return _p$;
1817
1871
  }, {
1818
1872
  e: void 0,
1819
1873
  t: void 0
1820
1874
  });
1821
- return _el$52;
1875
+ return _el$53;
1822
1876
  }
1823
1877
  }), _$createComponent(Show, {
1824
1878
  get when() {
@@ -1830,59 +1884,59 @@ function TokenCachePanel(props) {
1830
1884
  return balanceState().status === "idle";
1831
1885
  },
1832
1886
  get children() {
1833
- var _el$56 = _$createElement("text"), _el$57 = _$createElement("span"), _el$59 = _$createElement("span");
1834
- _$insertNode(_el$56, _el$57);
1835
- _$insertNode(_el$56, _el$59);
1836
- _$insertNode(_el$57, _$createTextNode(`> `));
1837
- _$insert(_el$59, () => t("balNoKey", {
1887
+ var _el$57 = _$createElement("text"), _el$58 = _$createElement("span"), _el$60 = _$createElement("span");
1888
+ _$insertNode(_el$57, _el$58);
1889
+ _$insertNode(_el$57, _el$60);
1890
+ _$insertNode(_el$58, _$createTextNode(`> `));
1891
+ _$insert(_el$60, () => t("balNoKey", {
1838
1892
  p: providerName()
1839
1893
  }));
1840
1894
  _$effect((_p$) => {
1841
1895
  var _v$1 = pal().muted, _v$10 = {
1842
1896
  fg: pal().muted
1843
1897
  };
1844
- _v$1 !== _p$.e && (_p$.e = _$setProp(_el$56, "fg", _v$1, _p$.e));
1845
- _v$10 !== _p$.t && (_p$.t = _$setProp(_el$57, "style", _v$10, _p$.t));
1898
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$57, "fg", _v$1, _p$.e));
1899
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$58, "style", _v$10, _p$.t));
1846
1900
  return _p$;
1847
1901
  }, {
1848
1902
  e: void 0,
1849
1903
  t: void 0
1850
1904
  });
1851
- return _el$56;
1905
+ return _el$57;
1852
1906
  }
1853
1907
  }), _$createComponent(Show, {
1854
1908
  get when() {
1855
1909
  return balanceState().status === "loading";
1856
1910
  },
1857
1911
  get children() {
1858
- var _el$60 = _$createElement("text"), _el$61 = _$createElement("span"), _el$63 = _$createElement("span");
1859
- _$insertNode(_el$60, _el$61);
1860
- _$insertNode(_el$60, _el$63);
1861
- _$insertNode(_el$61, _$createTextNode(`> `));
1862
- _$insert(_el$63, () => t("balLoading"));
1912
+ var _el$61 = _$createElement("text"), _el$62 = _$createElement("span"), _el$64 = _$createElement("span");
1913
+ _$insertNode(_el$61, _el$62);
1914
+ _$insertNode(_el$61, _el$64);
1915
+ _$insertNode(_el$62, _$createTextNode(`> `));
1916
+ _$insert(_el$64, () => t("balLoading"));
1863
1917
  _$effect((_p$) => {
1864
1918
  var _v$11 = pal().muted, _v$12 = {
1865
1919
  fg: pal().muted
1866
1920
  };
1867
- _v$11 !== _p$.e && (_p$.e = _$setProp(_el$60, "fg", _v$11, _p$.e));
1868
- _v$12 !== _p$.t && (_p$.t = _$setProp(_el$61, "style", _v$12, _p$.t));
1921
+ _v$11 !== _p$.e && (_p$.e = _$setProp(_el$61, "fg", _v$11, _p$.e));
1922
+ _v$12 !== _p$.t && (_p$.t = _$setProp(_el$62, "style", _v$12, _p$.t));
1869
1923
  return _p$;
1870
1924
  }, {
1871
1925
  e: void 0,
1872
1926
  t: void 0
1873
1927
  });
1874
- return _el$60;
1928
+ return _el$61;
1875
1929
  }
1876
1930
  }), _$createComponent(Show, {
1877
1931
  get when() {
1878
1932
  return balanceState().status === "error";
1879
1933
  },
1880
1934
  get children() {
1881
- var _el$64 = _$createElement("text"), _el$65 = _$createElement("span"), _el$67 = _$createElement("span");
1882
- _$insertNode(_el$64, _el$65);
1883
- _$insertNode(_el$64, _el$67);
1884
- _$insertNode(_el$65, _$createTextNode(`> `));
1885
- _$insert(_el$67, () => {
1935
+ var _el$65 = _$createElement("text"), _el$66 = _$createElement("span"), _el$68 = _$createElement("span");
1936
+ _$insertNode(_el$65, _el$66);
1937
+ _$insertNode(_el$65, _el$68);
1938
+ _$insertNode(_el$66, _$createTextNode(`> `));
1939
+ _$insert(_el$68, () => {
1886
1940
  const code = balanceState().error;
1887
1941
  if (code === "401") return t("balErr401");
1888
1942
  if (code === "403") return t("balErr403");
@@ -1894,24 +1948,24 @@ function TokenCachePanel(props) {
1894
1948
  var _v$13 = pal().error, _v$14 = {
1895
1949
  fg: pal().muted
1896
1950
  };
1897
- _v$13 !== _p$.e && (_p$.e = _$setProp(_el$64, "fg", _v$13, _p$.e));
1898
- _v$14 !== _p$.t && (_p$.t = _$setProp(_el$65, "style", _v$14, _p$.t));
1951
+ _v$13 !== _p$.e && (_p$.e = _$setProp(_el$65, "fg", _v$13, _p$.e));
1952
+ _v$14 !== _p$.t && (_p$.t = _$setProp(_el$66, "style", _v$14, _p$.t));
1899
1953
  return _p$;
1900
1954
  }, {
1901
1955
  e: void 0,
1902
1956
  t: void 0
1903
1957
  });
1904
- return _el$64;
1958
+ return _el$65;
1905
1959
  }
1906
1960
  }), _$createComponent(Show, {
1907
1961
  get when() {
1908
1962
  return _$memo(() => balanceState().status === "ok")() && balanceState().data;
1909
1963
  },
1910
1964
  get children() {
1911
- var _el$68 = _$createElement("text");
1912
- _$insert(_el$68, () => justify(t("balTotal"), formatBalanceText(balanceState().data, balanceCurrency(), exchangeRate())));
1913
- _$effect((_$p) => _$setProp(_el$68, "fg", pal().text, _$p));
1914
- return _el$68;
1965
+ var _el$69 = _$createElement("text");
1966
+ _$insert(_el$69, () => justify(t("balTotal"), formatBalanceText(balanceState().data, balanceCurrency(), exchangeRate())));
1967
+ _$effect((_$p) => _$setProp(_el$69, "fg", pal().text, _$p));
1968
+ return _el$69;
1915
1969
  }
1916
1970
  })];
1917
1971
  }
@@ -1938,6 +1992,20 @@ function TokenCachePanel(props) {
1938
1992
  return _el$;
1939
1993
  })();
1940
1994
  }
1995
+ var PATH_CHROME = 2;
1996
+ var HIDE_PATH_BELOW = 14;
1997
+ function keyShortcut(api, command, fallback) {
1998
+ try {
1999
+ const binds = api.tuiConfig.keybinds.get(command);
2000
+ const seq = binds?.map((b) => ({
2001
+ key: b.key
2002
+ }));
2003
+ const s = api.keys.formatBindings(seq);
2004
+ return s || fallback;
2005
+ } catch {
2006
+ return fallback;
2007
+ }
2008
+ }
1941
2009
  function BottomStatusBar(props) {
1942
2010
  const KV_PREFIX = "cache_panel";
1943
2011
  const t = createT(() => props.signals.langCode());
@@ -2053,6 +2121,119 @@ function BottomStatusBar(props) {
2053
2121
  return "";
2054
2122
  }
2055
2123
  });
2124
+ const [termW, setTermW] = createSignal(props.api.renderer.terminalWidth);
2125
+ createEffect(() => {
2126
+ const r = props.api.renderer;
2127
+ if (typeof r.on !== "function" || typeof r.off !== "function") return;
2128
+ const onResize = () => setTermW(props.api.renderer.terminalWidth);
2129
+ r.on("resize", onResize);
2130
+ onCleanup(() => r.off("resize", onResize));
2131
+ });
2132
+ createEffect(() => {
2133
+ const timer = setInterval(() => setTermW(props.api.renderer.terminalWidth), 500);
2134
+ onCleanup(() => clearInterval(timer));
2135
+ });
2136
+ const statsSegs = createMemo(() => {
2137
+ const s = stats();
2138
+ const hr = s && s.hitRate >= 0 ? (Math.floor(s.hitRate * 10) / 10).toFixed(1) + "%" : "--";
2139
+ const segs = [{
2140
+ text: t("barHit") + " ",
2141
+ color: pal().muted
2142
+ }, {
2143
+ text: hr,
2144
+ color: hitColor()
2145
+ }];
2146
+ const tr = trend();
2147
+ if (tr !== null) {
2148
+ segs.push({
2149
+ text: " " + (tr > 0 ? "\u2191" : "\u2193") + Math.abs(tr).toFixed(1) + "%",
2150
+ color: tr > 0 ? pal().success : pal().error
2151
+ });
2152
+ }
2153
+ segs.push({
2154
+ text: " \xB7 " + t("barTok") + " ",
2155
+ color: pal().muted
2156
+ });
2157
+ segs.push({
2158
+ text: s ? fmtCompact(s.input + s.read + s.write) : "--",
2159
+ color: pal().text
2160
+ });
2161
+ if (!props.signals.balanceUnsupported()) {
2162
+ segs.push({
2163
+ text: " \xB7 " + t("barBal") + " ",
2164
+ color: pal().muted
2165
+ });
2166
+ segs.push({
2167
+ text: balanceText(),
2168
+ color: pal().text
2169
+ });
2170
+ }
2171
+ segs.push({
2172
+ text: " \xB7 ",
2173
+ color: pal().muted
2174
+ });
2175
+ return segs;
2176
+ });
2177
+ const statsW = createMemo(() => {
2178
+ let w = 0;
2179
+ for (const sg of statsSegs()) w += visualWidth(sg.text);
2180
+ return w;
2181
+ });
2182
+ const sessionCost = createMemo(() => {
2183
+ try {
2184
+ return num(props.api.state.session.get(sid)?.cost);
2185
+ } catch {
2186
+ return 0;
2187
+ }
2188
+ });
2189
+ const usageText = createMemo(() => {
2190
+ const id = sid;
2191
+ if (!id) return "";
2192
+ const msgs = props.api.state.session.messages(id);
2193
+ let last;
2194
+ for (let i = msgs.length - 1; i >= 0; i--) {
2195
+ const m = msgs[i];
2196
+ if (m.role !== "assistant") continue;
2197
+ const tk2 = m.tokens;
2198
+ if (tk2 && num(tk2.output) > 0) {
2199
+ last = m;
2200
+ break;
2201
+ }
2202
+ }
2203
+ if (!last) return "";
2204
+ const tk = last.tokens;
2205
+ if (!tk) return "";
2206
+ const tokens = num(tk.input) + num(tk.output) + num(tk.reasoning) + num(tk.cache?.read) + num(tk.cache?.write);
2207
+ if (tokens <= 0) return "";
2208
+ let pct = "";
2209
+ try {
2210
+ const p = props.api.state.provider.find((x) => x.id === last.providerID);
2211
+ const limit = p?.models?.[last.modelID]?.limit?.context;
2212
+ if (typeof limit === "number" && limit > 0) pct = ` (${Math.round(tokens / limit * 100)}%)`;
2213
+ } catch {
2214
+ }
2215
+ const context = fmtCompact(tokens) + pct;
2216
+ const cost = sessionCost();
2217
+ return cost > 0 ? context + " \xB7 " + fmtCost(cost) : context;
2218
+ });
2219
+ const rightText = createMemo(() => {
2220
+ const cmds = keyShortcut(props.api, "command.palette.show", "ctrl+p") + " commands";
2221
+ const u = usageText();
2222
+ if (u) return u + " " + cmds;
2223
+ return keyShortcut(props.api, "agent.cycle", "") + " agents " + cmds;
2224
+ });
2225
+ const rightW = createMemo(() => visualWidth(rightText()));
2226
+ const inputW = createMemo(() => termW() - (props.signals.sidebarVisible() ? 42 : 0) - 4);
2227
+ const dirDisplay = createMemo(() => {
2228
+ const avail = inputW() - statsW() - rightW() - PATH_CHROME;
2229
+ if (avail < HIDE_PATH_BELOW) return "";
2230
+ return truncateVisual(directory(), avail);
2231
+ });
2232
+ const dirFallback = createMemo(() => {
2233
+ const avail = inputW() - rightW() - PATH_CHROME;
2234
+ if (avail < HIDE_PATH_BELOW) return "";
2235
+ return truncateVisual(directory(), avail);
2236
+ });
2056
2237
  onMount(() => {
2057
2238
  try {
2058
2239
  const v = props.api.kv.get(`${KV_PREFIX}.section.bottom`, true);
@@ -2066,102 +2247,39 @@ function BottomStatusBar(props) {
2066
2247
  },
2067
2248
  get fallback() {
2068
2249
  return (() => {
2069
- var _el$110 = _$createElement("text");
2070
- _$insert(_el$110, directory);
2071
- _$effect((_$p) => _$setProp(_el$110, "fg", pal().muted, _$p));
2072
- return _el$110;
2250
+ var _el$101 = _$createElement("text");
2251
+ _$insert(_el$101, dirFallback);
2252
+ _$effect((_$p) => _$setProp(_el$101, "fg", pal().muted, _$p));
2253
+ return _el$101;
2073
2254
  })();
2074
2255
  },
2075
2256
  get children() {
2076
- var _el$96 = _$createElement("box"), _el$97 = _$createElement("text"), _el$98 = _$createElement("box"), _el$99 = _$createElement("text"), _el$100 = _$createElement("span"), _el$101 = _$createTextNode(` `), _el$102 = _$createElement("span"), _el$104 = _$createElement("span"), _el$105 = _$createElement("span"), _el$108 = _$createElement("text");
2077
- _$insertNode(_el$96, _el$97);
2078
- _$insertNode(_el$96, _el$98);
2079
- _$setProp(_el$96, "marginLeft", 1);
2080
- _$setProp(_el$96, "flexGrow", 1);
2081
- _$setProp(_el$96, "flexShrink", 0);
2082
- _$setProp(_el$96, "flexDirection", "row");
2083
- _$setProp(_el$96, "justifyContent", "space-between");
2084
- _$insert(_el$97, directory);
2085
- _$insertNode(_el$98, _el$99);
2086
- _$insertNode(_el$98, _el$108);
2087
- _$setProp(_el$98, "flexDirection", "row");
2257
+ var _el$97 = _$createElement("box"), _el$98 = _$createElement("text"), _el$99 = _$createElement("box"), _el$100 = _$createElement("text");
2258
+ _$insertNode(_el$97, _el$98);
2259
+ _$insertNode(_el$97, _el$99);
2260
+ _$setProp(_el$97, "marginLeft", 1);
2261
+ _$setProp(_el$97, "flexGrow", 1);
2262
+ _$setProp(_el$97, "flexShrink", 0);
2263
+ _$setProp(_el$97, "flexDirection", "row");
2264
+ _$setProp(_el$97, "justifyContent", "space-between");
2265
+ _$insert(_el$98, dirDisplay);
2088
2266
  _$insertNode(_el$99, _el$100);
2089
- _$insertNode(_el$99, _el$102);
2090
- _$insertNode(_el$99, _el$104);
2091
- _$insertNode(_el$99, _el$105);
2092
- _$insertNode(_el$100, _el$101);
2093
- _$insert(_el$100, () => t("barHit"), _el$101);
2094
- _$insert(_el$102, (() => {
2095
- var _c$ = _$memo(() => (stats()?.hitRate ?? -1) >= 0);
2096
- return () => _c$() ? (Math.floor(stats().hitRate * 10) / 10).toFixed(1) + "%" : "--";
2097
- })());
2098
- _$insert(_el$99, _$createComponent(Show, {
2099
- get when() {
2100
- return trend() !== null;
2267
+ _$setProp(_el$99, "flexDirection", "row");
2268
+ _$insert(_el$100, _$createComponent(For, {
2269
+ get each() {
2270
+ return statsSegs();
2101
2271
  },
2102
- get children() {
2103
- var _el$103 = _$createElement("span");
2104
- _$insert(_el$103, () => " " + (trend() > 0 ? "\u2191" : "\u2193") + Math.abs(trend()).toFixed(1) + "%");
2105
- _$effect((_$p) => _$setProp(_el$103, "style", {
2106
- fg: trend() > 0 ? pal().success : pal().error
2272
+ children: (sg) => (() => {
2273
+ var _el$102 = _$createElement("span");
2274
+ _$insert(_el$102, () => sg.text);
2275
+ _$effect((_$p) => _$setProp(_el$102, "style", {
2276
+ fg: sg.color
2107
2277
  }, _$p));
2108
- return _el$103;
2109
- }
2110
- }), _el$104);
2111
- _$insert(_el$104, () => " \xB7 " + t("barTok") + " ");
2112
- _$insert(_el$105, (() => {
2113
- var _c$2 = _$memo(() => !!stats());
2114
- return () => _c$2() ? fmtCompact(stats().input + stats().read + stats().write) : "--";
2115
- })());
2116
- _$insert(_el$99, _$createComponent(Show, {
2117
- get when() {
2118
- return !props.signals.balanceUnsupported();
2119
- },
2120
- get children() {
2121
- return [(() => {
2122
- var _el$106 = _$createElement("span");
2123
- _$insert(_el$106, () => " \xB7 " + t("barBal") + " ");
2124
- _$effect((_$p) => _$setProp(_el$106, "style", {
2125
- fg: pal().muted
2126
- }, _$p));
2127
- return _el$106;
2128
- })(), (() => {
2129
- var _el$107 = _$createElement("span");
2130
- _$insert(_el$107, balanceText);
2131
- _$effect((_$p) => _$setProp(_el$107, "style", {
2132
- fg: pal().text
2133
- }, _$p));
2134
- return _el$107;
2135
- })()];
2136
- }
2137
- }), null);
2138
- _$insertNode(_el$108, _$createTextNode(` \xB7 `));
2139
- _$effect((_p$) => {
2140
- var _v$31 = pal().muted, _v$32 = {
2141
- fg: pal().muted
2142
- }, _v$33 = {
2143
- fg: hitColor()
2144
- }, _v$34 = {
2145
- fg: pal().muted
2146
- }, _v$35 = {
2147
- fg: pal().text
2148
- }, _v$36 = pal().muted;
2149
- _v$31 !== _p$.e && (_p$.e = _$setProp(_el$97, "fg", _v$31, _p$.e));
2150
- _v$32 !== _p$.t && (_p$.t = _$setProp(_el$100, "style", _v$32, _p$.t));
2151
- _v$33 !== _p$.a && (_p$.a = _$setProp(_el$102, "style", _v$33, _p$.a));
2152
- _v$34 !== _p$.o && (_p$.o = _$setProp(_el$104, "style", _v$34, _p$.o));
2153
- _v$35 !== _p$.i && (_p$.i = _$setProp(_el$105, "style", _v$35, _p$.i));
2154
- _v$36 !== _p$.n && (_p$.n = _$setProp(_el$108, "fg", _v$36, _p$.n));
2155
- return _p$;
2156
- }, {
2157
- e: void 0,
2158
- t: void 0,
2159
- a: void 0,
2160
- o: void 0,
2161
- i: void 0,
2162
- n: void 0
2163
- });
2164
- return _el$96;
2278
+ return _el$102;
2279
+ })()
2280
+ }));
2281
+ _$effect((_$p) => _$setProp(_el$98, "fg", pal().muted, _$p));
2282
+ return _el$97;
2165
2283
  }
2166
2284
  });
2167
2285
  }
@@ -2209,6 +2327,7 @@ var tui = async (api) => {
2209
2327
  const [borderVisible, setBorderVisible] = createSignal(true);
2210
2328
  const [langCode, setLangCode] = createSignal(INIT_LANG);
2211
2329
  const [overrideSessionId, setOverrideSessionId] = createSignal(void 0);
2330
+ const [sidebarVisible, setSidebarVisible] = createSignal(false);
2212
2331
  const [balanceState, setBalanceState] = createSignal({
2213
2332
  status: "idle",
2214
2333
  data: null,
@@ -2248,7 +2367,9 @@ var tui = async (api) => {
2248
2367
  borderVisible,
2249
2368
  setBorderVisible,
2250
2369
  overrideSessionId,
2251
- setOverrideSessionId
2370
+ setOverrideSessionId,
2371
+ sidebarVisible,
2372
+ setSidebarVisible
2252
2373
  };
2253
2374
  api.slots.register(createSidebarSlot(api, signals));
2254
2375
  api.slots.register({
@@ -2391,11 +2512,11 @@ var tui = async (api) => {
2391
2512
  return provider.name;
2392
2513
  },
2393
2514
  description: () => (() => {
2394
- var _el$111 = _$createElement("text");
2395
- _$insert(_el$111, () => t("balKeyPrompt", {
2515
+ var _el$103 = _$createElement("text");
2516
+ _$insert(_el$103, () => t("balKeyPrompt", {
2396
2517
  p: provider.name
2397
2518
  }));
2398
- return _el$111;
2519
+ return _el$103;
2399
2520
  })(),
2400
2521
  get placeholder() {
2401
2522
  return provider.keyPlaceholder ?? "sk-...";
@@ -2475,9 +2596,9 @@ var tui = async (api) => {
2475
2596
  dialog?.replace(() => _$createComponent(api.ui.DialogPrompt, {
2476
2597
  title: "Exchange Rate",
2477
2598
  description: () => (() => {
2478
- var _el$112 = _$createElement("text");
2479
- _$insertNode(_el$112, _$createTextNode(`Enter the exchange rate from USD to your currency (e.g. 7.2 for CNY)`));
2480
- return _el$112;
2599
+ var _el$104 = _$createElement("text");
2600
+ _$insertNode(_el$104, _$createTextNode(`Enter the exchange rate from USD to your currency (e.g. 7.2 for CNY)`));
2601
+ return _el$104;
2481
2602
  })(),
2482
2603
  placeholder: "1.0",
2483
2604
  get value() {
@@ -2889,9 +3010,9 @@ var tui = async (api) => {
2889
3010
  return _$memo(() => !!signals.overrideSessionId())() ? t("subSwitchTitle") : t("subViewTitle");
2890
3011
  },
2891
3012
  description: () => (() => {
2892
- var _el$114 = _$createElement("text");
2893
- _$insert(_el$114, () => t("subNoFound"));
2894
- return _el$114;
3013
+ var _el$106 = _$createElement("text");
3014
+ _$insert(_el$106, () => t("subNoFound"));
3015
+ return _el$106;
2895
3016
  })(),
2896
3017
  placeholder: "ses_...",
2897
3018
  get value() {