dsh-brief-sidebar 0.9.1 → 0.9.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/dsh.plugin.json +1 -1
- package/lib/client.js +105 -23
- package/lib/client.js.map +1 -1
- package/lib/index.mjs +78 -28
- package/lib/index.mjs.map +1 -1
- package/lib/types/client/locales.d.ts +3 -0
- package/lib/types/client/summary/skill-usage.d.ts +12 -0
- package/lib/types/projection/keys.d.ts +11 -4
- package/lib/types/projection/skill-usage-fold.d.ts +45 -19
- package/package.json +1 -1
- package/src/client/locales.ts +36 -9
- package/src/client/summary/SkillUsageSection.tsx +51 -20
- package/src/client/summary/skill-usage.ts +40 -1
- package/src/projection/keys.ts +11 -4
- package/src/projection/register.ts +12 -2
- package/src/projection/skill-usage-fold.ts +108 -41
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-external/dsh-brief-sidebar",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"main": "./lib/index.mjs",
|
|
5
5
|
"description": "会话简报侧栏页(brief):把会话的 todo 列表(`todos` 投影的进展看板)、产物列表(`dshSummaryDeliverables` 投影的实时产出文件)与记忆槽位(`memorySlots` 投影,来自 dsh-prime-memory,开关可关)一起渲染成右侧栏的一个「概要」tab,并遮蔽 DSH 官方那条 composer 上方的 todo 面板。只读展示,不做写回。",
|
|
6
6
|
"engines": {
|
package/lib/client.js
CHANGED
|
@@ -689,10 +689,13 @@ window.__ModuleLoader__.load({
|
|
|
689
689
|
"recall.noBody": "(本帧没有这条记忆的全文)",
|
|
690
690
|
"section.skillUsage": "技能引用",
|
|
691
691
|
"skillUsage.empty": "本会话还没载入过技能",
|
|
692
|
-
"skillUsage.emptyHint": "模型用 skill
|
|
692
|
+
"skillUsage.emptyHint": "模型用 skill 工具载入、或你直接点用某个技能后,技能名会实时出现在这里。",
|
|
693
693
|
"skillUsage.uses": "{count} 次",
|
|
694
694
|
"skillUsage.count": "载入 {count} 次 · {total} 个技能",
|
|
695
695
|
"skillUsage.latestTag": "本轮",
|
|
696
|
+
"skillUsage.invokedGroup": "已引用 · {count}",
|
|
697
|
+
"skillUsage.availableGroup": "本会话可用 · {count}",
|
|
698
|
+
"skillUsage.availableCapped": "(可用清单共 {count} 条,列表已截断)",
|
|
696
699
|
"settings.title": "概要侧栏",
|
|
697
700
|
"settings.desc": "右侧栏概要 tab 的分区开关(只读展示)。",
|
|
698
701
|
"settings.memorySlots": "记忆槽位分区",
|
|
@@ -746,10 +749,13 @@ window.__ModuleLoader__.load({
|
|
|
746
749
|
"recall.noBody": "(this frame carries no full body for this record)",
|
|
747
750
|
"section.skillUsage": "Skill references",
|
|
748
751
|
"skillUsage.empty": "No skills loaded in this session",
|
|
749
|
-
"skillUsage.emptyHint": "Skills
|
|
752
|
+
"skillUsage.emptyHint": "Skills show up here once the model loads one with the `skill` tool, or you invoke one directly.",
|
|
750
753
|
"skillUsage.uses": "{count}x",
|
|
751
754
|
"skillUsage.count": "{count} loads - {total} skills",
|
|
752
755
|
"skillUsage.latestTag": "this turn",
|
|
756
|
+
"skillUsage.invokedGroup": "Referenced · {count}",
|
|
757
|
+
"skillUsage.availableGroup": "Available this session · {count}",
|
|
758
|
+
"skillUsage.availableCapped": "({count} skills in the catalog; the list is capped)",
|
|
753
759
|
"settings.title": "Brief sidebar",
|
|
754
760
|
"settings.desc": "Section switches for the summary tab in the right sidebar (read-only views).",
|
|
755
761
|
"settings.memorySlots": "Memory slots section",
|
|
@@ -803,10 +809,13 @@ window.__ModuleLoader__.load({
|
|
|
803
809
|
"recall.noBody": "このフレームには全文が含まれていない",
|
|
804
810
|
"section.skillUsage": "スキル参照",
|
|
805
811
|
"skillUsage.empty": "このセッションではスキルを読み込んでいません",
|
|
806
|
-
"skillUsage.emptyHint": "モデルが skill
|
|
812
|
+
"skillUsage.emptyHint": "モデルが skill ツールで読み込むか、あなたがスキルを直接起動すると、ここにリアルタイムで表示されます。",
|
|
807
813
|
"skillUsage.uses": "{count} 回",
|
|
808
814
|
"skillUsage.count": "読み込み {count} 回 · スキル {total} 件",
|
|
809
815
|
"skillUsage.latestTag": "このターン",
|
|
816
|
+
"skillUsage.invokedGroup": "参照済み · {count}",
|
|
817
|
+
"skillUsage.availableGroup": "このセッションで利用可能 · {count}",
|
|
818
|
+
"skillUsage.availableCapped": "(カタログは全 {count} 件、一覧は上限で省略)",
|
|
810
819
|
"settings.title": "概要サイドバー",
|
|
811
820
|
"settings.desc": "右サイドバー概要タブのセクション表示切り替え(読み取り専用)。",
|
|
812
821
|
"settings.memorySlots": "メモリスロットセクション",
|
|
@@ -860,10 +869,13 @@ window.__ModuleLoader__.load({
|
|
|
860
869
|
"recall.noBody": "이 프레임에는 이 기록의 전문이 없습니다",
|
|
861
870
|
"section.skillUsage": "스킬 참조",
|
|
862
871
|
"skillUsage.empty": "이 세션에서 스킬을 불러오지 않았습니다",
|
|
863
|
-
"skillUsage.emptyHint": "모델이 skill 도구로 스킬을
|
|
872
|
+
"skillUsage.emptyHint": "모델이 skill 도구로 불러오거나 당신이 스킬을 직접 실행하면 여기에 실시간으로 나타납니다.",
|
|
864
873
|
"skillUsage.uses": "{count}회",
|
|
865
874
|
"skillUsage.count": "불러오기 {count}회 · 스킬 {total}개",
|
|
866
875
|
"skillUsage.latestTag": "이 턴",
|
|
876
|
+
"skillUsage.invokedGroup": "참조됨 · {count}",
|
|
877
|
+
"skillUsage.availableGroup": "이 세션에서 사용 가능 · {count}",
|
|
878
|
+
"skillUsage.availableCapped": "(카탈로그 전체 {count}개, 목록은 잘림)",
|
|
867
879
|
"settings.title": "요약 사이드바",
|
|
868
880
|
"settings.desc": "오른쪽 사이드바 요약 탭의 섹션 표시 전환(읽기 전용).",
|
|
869
881
|
"settings.memorySlots": "메모리 슬롯 섹션",
|
|
@@ -917,10 +929,13 @@ window.__ModuleLoader__.load({
|
|
|
917
929
|
"recall.noBody": "(aucun texte complet pour cette entrée dans cette trame)",
|
|
918
930
|
"section.skillUsage": "Références de compétences",
|
|
919
931
|
"skillUsage.empty": "Aucune compétence chargée dans cette session",
|
|
920
|
-
"skillUsage.emptyHint": "Les compétences apparaissent ici dès que le modèle en charge une
|
|
932
|
+
"skillUsage.emptyHint": "Les compétences apparaissent ici dès que le modèle en charge une via l’outil `skill`, ou quand vous en lancez une directement.",
|
|
921
933
|
"skillUsage.uses": "{count}×",
|
|
922
934
|
"skillUsage.count": "{count} chargements · {total} compétences",
|
|
923
935
|
"skillUsage.latestTag": "ce tour",
|
|
936
|
+
"skillUsage.invokedGroup": "Référencées · {count}",
|
|
937
|
+
"skillUsage.availableGroup": "Disponibles dans cette session · {count}",
|
|
938
|
+
"skillUsage.availableCapped": "({count} compétences au catalogue ; la liste est tronquée)",
|
|
924
939
|
"settings.title": "Barre latérale Résumé",
|
|
925
940
|
"settings.desc": "Interrupteurs des sections de l’onglet Résumé de la barre latérale (lecture seule).",
|
|
926
941
|
"settings.memorySlots": "Section des emplacements mémoire",
|
|
@@ -974,10 +989,13 @@ window.__ModuleLoader__.load({
|
|
|
974
989
|
"recall.noBody": "(dieser Rahmen enthält keinen vollständigen Text für diesen Eintrag)",
|
|
975
990
|
"section.skillUsage": "Skill-Referenzen",
|
|
976
991
|
"skillUsage.empty": "In dieser Sitzung wurden keine Skills geladen",
|
|
977
|
-
"skillUsage.emptyHint": "Skills erscheinen hier, sobald das Modell einen über das skill
|
|
992
|
+
"skillUsage.emptyHint": "Skills erscheinen hier, sobald das Modell einen über das `skill`-Tool lädt oder du einen direkt aufrufst.",
|
|
978
993
|
"skillUsage.uses": "{count}x",
|
|
979
994
|
"skillUsage.count": "{count} Ladungen · {total} Skills",
|
|
980
995
|
"skillUsage.latestTag": "diese Runde",
|
|
996
|
+
"skillUsage.invokedGroup": "Referenziert · {count}",
|
|
997
|
+
"skillUsage.availableGroup": "In dieser Sitzung verfügbar · {count}",
|
|
998
|
+
"skillUsage.availableCapped": "({count} Skills im Katalog; die Liste ist gekürzt)",
|
|
981
999
|
"settings.title": "Übersicht-Seitenleiste",
|
|
982
1000
|
"settings.desc": "Schalter für die Abschnitte des Übersicht-Tabs in der rechten Seitenleiste (schreibgeschützt).",
|
|
983
1001
|
"settings.memorySlots": "Speicherplätze-Abschnitt",
|
|
@@ -1031,10 +1049,13 @@ window.__ModuleLoader__.load({
|
|
|
1031
1049
|
"recall.noBody": "(questo frame non contiene il testo completo di questa voce)",
|
|
1032
1050
|
"section.skillUsage": "Riferimenti alle skill",
|
|
1033
1051
|
"skillUsage.empty": "Nessuna skill caricata in questa sessione",
|
|
1034
|
-
"skillUsage.emptyHint": "Le skill compaiono qui quando il modello ne carica una con il tool skill.",
|
|
1052
|
+
"skillUsage.emptyHint": "Le skill compaiono qui quando il modello ne carica una con il tool `skill` o quando ne avvii una direttamente.",
|
|
1035
1053
|
"skillUsage.uses": "{count}x",
|
|
1036
1054
|
"skillUsage.count": "{count} caricamenti · {total} skill",
|
|
1037
1055
|
"skillUsage.latestTag": "questo giro",
|
|
1056
|
+
"skillUsage.invokedGroup": "Referenziate · {count}",
|
|
1057
|
+
"skillUsage.availableGroup": "Disponibili in questa sessione · {count}",
|
|
1058
|
+
"skillUsage.availableCapped": "({count} skill nel catalogo; l’elenco è troncato)",
|
|
1038
1059
|
"settings.title": "Barra laterale Riepilogo",
|
|
1039
1060
|
"settings.desc": "Interruttori delle sezioni della scheda Riepilogo nella barra laterale destra (sola lettura).",
|
|
1040
1061
|
"settings.memorySlots": "Sezione slot di memoria",
|
|
@@ -1088,10 +1109,13 @@ window.__ModuleLoader__.load({
|
|
|
1088
1109
|
"recall.noBody": "В этом кадре нет полного текста этой записи",
|
|
1089
1110
|
"section.skillUsage": "Отсылки к скиллам",
|
|
1090
1111
|
"skillUsage.empty": "В этой сессии скиллы не загружались",
|
|
1091
|
-
"skillUsage.emptyHint": "
|
|
1112
|
+
"skillUsage.emptyHint": "Навыки появятся здесь, когда модель загрузит их через инструмент `skill` или вы вызовете навык напрямую.",
|
|
1092
1113
|
"skillUsage.uses": "{count} раз",
|
|
1093
1114
|
"skillUsage.count": "Загрузок: {count} · скиллов: {total}",
|
|
1094
1115
|
"skillUsage.latestTag": "этот ход",
|
|
1116
|
+
"skillUsage.invokedGroup": "Использованы · {count}",
|
|
1117
|
+
"skillUsage.availableGroup": "Доступны в этой сессии · {count}",
|
|
1118
|
+
"skillUsage.availableCapped": "({count} навыков в каталоге; список усечён)",
|
|
1095
1119
|
"settings.title": "Боковая панель «Сводка»",
|
|
1096
1120
|
"settings.desc": "Переключатели разделов вкладки «Сводка» на правой панели (только чтение).",
|
|
1097
1121
|
"settings.memorySlots": "Раздел слотов памяти",
|
|
@@ -1145,10 +1169,13 @@ window.__ModuleLoader__.load({
|
|
|
1145
1169
|
"recall.noBody": "(este fotograma no trae el texto completo de este registro)",
|
|
1146
1170
|
"section.skillUsage": "Referencias de skills",
|
|
1147
1171
|
"skillUsage.empty": "Esta sesión no ha cargado ningún skill",
|
|
1148
|
-
"skillUsage.emptyHint": "
|
|
1172
|
+
"skillUsage.emptyHint": "Las skills aparecen aquí cuando el modelo carga una con la herramienta `skill` o cuando invocas una directamente.",
|
|
1149
1173
|
"skillUsage.uses": "{count}x",
|
|
1150
1174
|
"skillUsage.count": "{count} cargas · {total} skills",
|
|
1151
1175
|
"skillUsage.latestTag": "este turno",
|
|
1176
|
+
"skillUsage.invokedGroup": "Referenciadas · {count}",
|
|
1177
|
+
"skillUsage.availableGroup": "Disponibles en esta sesión · {count}",
|
|
1178
|
+
"skillUsage.availableCapped": "({count} skills en el catálogo; la lista está truncada)",
|
|
1152
1179
|
"settings.title": "Barra lateral Resumen",
|
|
1153
1180
|
"settings.desc": "Interruptores de las secciones de la pestaña Resumen en la barra lateral derecha (solo lectura).",
|
|
1154
1181
|
"settings.memorySlots": "Sección de ranuras de memoria",
|
|
@@ -1362,6 +1389,18 @@ window.__ModuleLoader__.load({
|
|
|
1362
1389
|
};
|
|
1363
1390
|
}
|
|
1364
1391
|
/**
|
|
1392
|
+
* The available-skill list of a frame, or `[]` when the frame carries none.
|
|
1393
|
+
*
|
|
1394
|
+
* Absent-by-age is the important case: a host half older than this reader
|
|
1395
|
+
* publishes no `available` field at all, and that must NOT void the whole view
|
|
1396
|
+
* — the session's references are still true. Only a drifted (non-array) value
|
|
1397
|
+
* reads as "nothing known", never as "nothing available".
|
|
1398
|
+
*/
|
|
1399
|
+
function readAvailable(value) {
|
|
1400
|
+
if (!Array.isArray(value)) return [];
|
|
1401
|
+
return value.filter((n) => typeof n === "string" && n.length > 0);
|
|
1402
|
+
}
|
|
1403
|
+
/**
|
|
1365
1404
|
* Narrow a raw projection value into a skill-usage view.
|
|
1366
1405
|
*
|
|
1367
1406
|
* @param value - the raw `unknown` snapshot of the `dshSummarySkillUsage` face.
|
|
@@ -1377,14 +1416,33 @@ window.__ModuleLoader__.load({
|
|
|
1377
1416
|
const narrowed = readEntry(entry);
|
|
1378
1417
|
if (narrowed !== void 0) session.push(narrowed);
|
|
1379
1418
|
}
|
|
1419
|
+
const available = readAvailable(raw["available"]);
|
|
1420
|
+
const availableCount = available.length === 0 ? 0 : isCounter$2(raw["availableCount"]) ? raw["availableCount"] : available.length;
|
|
1380
1421
|
return {
|
|
1381
1422
|
latest: readLatest(raw["latest"]),
|
|
1382
1423
|
session,
|
|
1383
1424
|
sessionTotal: raw["sessionTotal"],
|
|
1384
|
-
callTotal: raw["callTotal"]
|
|
1425
|
+
callTotal: raw["callTotal"],
|
|
1426
|
+
available,
|
|
1427
|
+
availableCount
|
|
1385
1428
|
};
|
|
1386
1429
|
}
|
|
1387
1430
|
/**
|
|
1431
|
+
* The available list minus the names already shown as referenced.
|
|
1432
|
+
*
|
|
1433
|
+
* One skill must not occupy a row in both groups: the reference row is the
|
|
1434
|
+
* stronger fact, and a duplicate under "available" would read as "the model
|
|
1435
|
+
* had a choice it didn't make".
|
|
1436
|
+
*
|
|
1437
|
+
* @param available - the session's current catalog names, in catalog order.
|
|
1438
|
+
* @param referenced - names the fold counted as loaded or invoked.
|
|
1439
|
+
* @returns the remaining catalog names, order preserved.
|
|
1440
|
+
*/
|
|
1441
|
+
function availableExcept(available, referenced) {
|
|
1442
|
+
const seen = new Set(referenced);
|
|
1443
|
+
return available.filter((name) => !seen.has(name));
|
|
1444
|
+
}
|
|
1445
|
+
/**
|
|
1388
1446
|
* Fill both placeholders of a template. `expandCount` only speaks `{count}`, and
|
|
1389
1447
|
* this section's footer carries a second number on purpose: the capped list
|
|
1390
1448
|
* needs the truthful distinct total next to the load count.
|
|
@@ -1404,15 +1462,23 @@ window.__ModuleLoader__.load({
|
|
|
1404
1462
|
* part of the summary tab.
|
|
1405
1463
|
*
|
|
1406
1464
|
* Where `MemoryRecallSection` answers "what memories did the model see", this
|
|
1407
|
-
* answers "which instruction packs
|
|
1408
|
-
*
|
|
1465
|
+
* answers "which instruction packs entered the context, and which ones were on
|
|
1466
|
+
* the menu". Two groups, deliberately not merged:
|
|
1467
|
+
*
|
|
1468
|
+
* - **已引用** — the skill's instructions reached the conversation, either
|
|
1469
|
+
* because the model called the `skill` tool or because the user invoked it
|
|
1470
|
+
* directly (the host then injects `<skill_content>` and tells the model not
|
|
1471
|
+
* to call the tool — reading only the tool would miss over half of those
|
|
1472
|
+
* sessions, measured on 250 real ones).
|
|
1473
|
+
* - **本会话可用** — the session's current catalog. Available is NOT used: the
|
|
1474
|
+
* model may never touch any of these, so it is collapsed behind a counted
|
|
1475
|
+
* toggle and never mixed into the reference rows.
|
|
1409
1476
|
*
|
|
1410
1477
|
* Like the deliverables section this is an OPTIONAL capability on both sides:
|
|
1411
1478
|
* no projection registry (or a host half that never registered the unit) means
|
|
1412
1479
|
* the client reads capability absence and the section hides. No settings switch
|
|
1413
1480
|
* gates it either — the list is a read-only fact about the session, not a
|
|
1414
|
-
* preference
|
|
1415
|
-
* nothing to leave on.
|
|
1481
|
+
* preference.
|
|
1416
1482
|
*
|
|
1417
1483
|
* Two contracts this row honours, both learned on the recall section:
|
|
1418
1484
|
* - **no native `title` attribute** — it paints an unskinable tooltip that
|
|
@@ -1487,24 +1553,40 @@ window.__ModuleLoader__.load({
|
|
|
1487
1553
|
*/
|
|
1488
1554
|
function SkillUsageSection(props) {
|
|
1489
1555
|
const { t, ctx, scope } = props;
|
|
1556
|
+
const [availableOpen, setAvailableOpen] = (0, react.useState)(false);
|
|
1490
1557
|
const view = readSkillUsage(useProjectionValue(ctx, scope?.sessionId, SKILL_USAGE_KEY));
|
|
1491
1558
|
if (view === void 0) return null;
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
"data-dsh-brief-sidebar": "skill-usage-section"
|
|
1495
|
-
}, (0, react.createElement)("div", { style: HEADER_STYLE$3 }, t("section.skillUsage")), (0, react.createElement)("div", { style: EMPTY_STYLE$2 }, (0, react.createElement)("div", { style: {
|
|
1496
|
-
marginBottom: 6,
|
|
1497
|
-
color: "var(--dsw-alias-label-secondary)"
|
|
1498
|
-
} }, t("skillUsage.empty")), (0, react.createElement)("div", null, t("skillUsage.emptyHint"))));
|
|
1559
|
+
const referenced = view.session.map((entry) => entry.name);
|
|
1560
|
+
const rest = availableExcept(view.available, referenced);
|
|
1499
1561
|
const latestNames = view.latest?.names ?? [];
|
|
1500
1562
|
return (0, react.createElement)("div", {
|
|
1501
1563
|
style: SECTION_STYLE$2,
|
|
1502
1564
|
"data-dsh-brief-sidebar": "skill-usage-section"
|
|
1503
|
-
}, (0, react.createElement)("div", { style: HEADER_STYLE$3 }, t("section.skillUsage")), (0, react.createElement)("
|
|
1565
|
+
}, (0, react.createElement)("div", { style: HEADER_STYLE$3 }, t("section.skillUsage")), view.session.length === 0 && (0, react.createElement)("div", { style: EMPTY_STYLE$2 }, (0, react.createElement)("div", { style: {
|
|
1566
|
+
marginBottom: 6,
|
|
1567
|
+
color: "var(--dsw-alias-label-secondary)"
|
|
1568
|
+
} }, t("skillUsage.empty")), (0, react.createElement)("div", null, t("skillUsage.emptyHint"))), view.session.length > 0 && (0, react.createElement)(GroupHeader, {
|
|
1569
|
+
text: expandCount(t("skillUsage.invokedGroup"), view.session.length),
|
|
1570
|
+
marker: "skill-usage-invoked-group"
|
|
1571
|
+
}), (0, react.createElement)("ul", { style: LIST_STYLE$2 }, view.session.map((entry) => (0, react.createElement)("li", {
|
|
1504
1572
|
key: entry.name,
|
|
1505
1573
|
style: ROW_STYLE$3,
|
|
1506
1574
|
"data-dsh-brief-sidebar": "skill-usage-row"
|
|
1507
|
-
}, (0, react.createElement)("span", { style: NAME_STYLE$1 }, entry.name), (0, react.createElement)("span", { style: COUNT_STYLE }, expandPair(t("skillUsage.uses"), entry.count, entry.count)), latestNames.includes(entry.name) && (0, react.createElement)("span", { style: TAG_STYLE }, t("skillUsage.latestTag"))))), (0, react.createElement)(
|
|
1575
|
+
}, (0, react.createElement)("span", { style: NAME_STYLE$1 }, entry.name), (0, react.createElement)("span", { style: COUNT_STYLE }, expandPair(t("skillUsage.uses"), entry.count, entry.count)), latestNames.includes(entry.name) && (0, react.createElement)("span", { style: TAG_STYLE }, t("skillUsage.latestTag"))))), rest.length > 0 && (0, react.createElement)(FoldToggle, {
|
|
1576
|
+
label: expandCount(t("skillUsage.availableGroup"), rest.length),
|
|
1577
|
+
open: availableOpen,
|
|
1578
|
+
marker: "skill-usage-available-toggle",
|
|
1579
|
+
onToggle: () => {
|
|
1580
|
+
setAvailableOpen((current) => !current);
|
|
1581
|
+
}
|
|
1582
|
+
}), rest.length > 0 && view.availableCount > view.available.length && (0, react.createElement)(GroupCaption, {
|
|
1583
|
+
text: expandCount(t("skillUsage.availableCapped"), view.availableCount),
|
|
1584
|
+
marker: "skill-usage-available-capped"
|
|
1585
|
+
}), availableOpen && (0, react.createElement)("ul", { style: LIST_STYLE$2 }, rest.map((name) => (0, react.createElement)("li", {
|
|
1586
|
+
key: name,
|
|
1587
|
+
style: ROW_STYLE$3,
|
|
1588
|
+
"data-dsh-brief-sidebar": "skill-usage-available-row"
|
|
1589
|
+
}, (0, react.createElement)("span", { style: NAME_STYLE$1 }, name)))), view.session.length > 0 && (0, react.createElement)("div", { style: FOOTER_STYLE$2 }, expandPair(t("skillUsage.count"), view.callTotal, view.sessionTotal)));
|
|
1508
1590
|
}
|
|
1509
1591
|
//#endregion
|
|
1510
1592
|
//#region src/client/summary/memory-slots.ts
|