opencode-subagent-magazine 1.6.0-beta.3 → 1.6.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/LICENSE +21 -21
- package/README.md +230 -192
- package/dist/_version.d.ts +1 -1
- package/dist/_version.js +1 -1
- package/dist/core/kv.d.ts +1 -0
- package/dist/core/kv.js +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/i18n.d.ts +2 -0
- package/dist/i18n.js +8 -0
- package/dist/index.js +17 -2
- package/dist/panel/SubAgentPanel.d.ts +1 -0
- package/dist/panel/SubAgentPanel.js +21 -9
- package/dist/tui.js +80 -27
- package/dist/v2/commands.js +13 -0
- package/dist/v2/index.js +3 -2
- package/dist/v2.js +76 -27
- package/install.mjs +103 -103
- package/package.json +68 -65
- package/src/_version.ts +1 -1
- package/src/clipboard.ts +134 -134
- package/src/core/kv.ts +1 -0
- package/src/core/types.ts +60 -58
- package/src/i18n.ts +269 -261
- package/src/index.tsx +19 -1
- package/src/panel/SubAgentPanel.tsx +1494 -1477
- package/src/panel/entry-map.ts +39 -39
- package/src/panel/panel-api.ts +75 -75
- package/src/panel/session-routing.ts +10 -10
- package/src/server.ts +10 -10
- package/src/v2/commands.ts +13 -0
- package/src/v2/index.tsx +5 -1
- package/src/v2/v2-panel-api.ts +307 -307
|
@@ -1017,7 +1017,19 @@ export function SubAgentPanel(props) {
|
|
|
1017
1017
|
return next;
|
|
1018
1018
|
});
|
|
1019
1019
|
};
|
|
1020
|
-
|
|
1020
|
+
/** Horizontal space eaten by the panel border (1+1) and its padding (2+2). */
|
|
1021
|
+
const gutter = createMemo(() => (props.borderVisible() ? 6 : 0));
|
|
1022
|
+
const sep = () => "\u2500".repeat(Math.max(1, panelWidth() - gutter()));
|
|
1023
|
+
// The border toggling shifts the box dimensions, which may not reliably
|
|
1024
|
+
// re-fire onSizeChange across (re)mount cycles; re-sync panelWidth with the
|
|
1025
|
+
// live box so the content width stays correct.
|
|
1026
|
+
createEffect(() => {
|
|
1027
|
+
props.borderVisible();
|
|
1028
|
+
if (boxEl && typeof boxEl.width === "number" && boxEl.width > 0) {
|
|
1029
|
+
const w = Math.max(20, boxEl.width);
|
|
1030
|
+
setPanelWidth((prev) => (prev === w ? prev : w));
|
|
1031
|
+
}
|
|
1032
|
+
});
|
|
1021
1033
|
// ── expanded detail right-align ──
|
|
1022
1034
|
const expandedMaxLabelW = createMemo(() => {
|
|
1023
1035
|
const labels = [
|
|
@@ -1027,7 +1039,7 @@ export function SubAgentPanel(props) {
|
|
|
1027
1039
|
return Math.max(...labels.map(l => visualWidth(l + ": ")));
|
|
1028
1040
|
});
|
|
1029
1041
|
const expandedPad = (label) => Math.max(0, expandedMaxLabelW() - visualWidth(label + ": "));
|
|
1030
|
-
const expandedValAvail = () => Math.max(6, panelWidth() - INDENT - expandedMaxLabelW());
|
|
1042
|
+
const expandedValAvail = () => Math.max(6, panelWidth() - gutter() - INDENT - expandedMaxLabelW());
|
|
1031
1043
|
// ── header parts for colored spans ──
|
|
1032
1044
|
const summaryParts = createMemo(() => {
|
|
1033
1045
|
if (!anyEntry())
|
|
@@ -1062,7 +1074,7 @@ export function SubAgentPanel(props) {
|
|
|
1062
1074
|
return false;
|
|
1063
1075
|
const icon = "\u25bc";
|
|
1064
1076
|
const need = visualWidth(icon) + 1 + visualWidth(t("panel.title")) + versionW + summaryCols();
|
|
1065
|
-
return need <= panelWidth();
|
|
1077
|
+
return need <= panelWidth() - gutter();
|
|
1066
1078
|
});
|
|
1067
1079
|
const leftCols = createMemo(() => {
|
|
1068
1080
|
const icon = open() ? "\u25bc" : "\u25b6";
|
|
@@ -1074,11 +1086,11 @@ export function SubAgentPanel(props) {
|
|
|
1074
1086
|
const spacerCols = createMemo(() => {
|
|
1075
1087
|
if (!anyEntry())
|
|
1076
1088
|
return 0;
|
|
1077
|
-
return Math.max(0, panelWidth() - leftCols() - summaryCols());
|
|
1089
|
+
return Math.max(0, panelWidth() - gutter() - leftCols() - summaryCols());
|
|
1078
1090
|
});
|
|
1079
|
-
const valueCols = (label) => Math.max(4, panelWidth() - INDENT - visualWidth(label + ": "));
|
|
1091
|
+
const valueCols = (label) => Math.max(4, panelWidth() - gutter() - INDENT - visualWidth(label + ": "));
|
|
1080
1092
|
// ── render ──
|
|
1081
|
-
return (_jsxs("box", { border:
|
|
1093
|
+
return (_jsxs("box", { border: props.borderVisible(), ...(props.borderVisible() ? { borderColor: pal().border } : {}), paddingTop: 0, paddingBottom: 0, paddingLeft: props.borderVisible() ? 2 : 0, paddingRight: props.borderVisible() ? 2 : 0, flexDirection: "column", gap: 0, ref: boxEl, onSizeChange: () => {
|
|
1082
1094
|
const w = boxEl ? Math.max(20, boxEl.width ?? 0) : 28;
|
|
1083
1095
|
setPanelWidth((prev) => (prev === w ? prev : w));
|
|
1084
1096
|
}, children: [_jsxs("text", { onMouseUp: () => {
|
|
@@ -1170,7 +1182,7 @@ export function SubAgentPanel(props) {
|
|
|
1170
1182
|
w += visualWidth(tk);
|
|
1171
1183
|
return w;
|
|
1172
1184
|
};
|
|
1173
|
-
const labelAvail = () => Math.max(6, panelWidth() - LEFT_PAD - suffixW());
|
|
1185
|
+
const labelAvail = () => Math.max(6, panelWidth() - gutter() - LEFT_PAD - suffixW());
|
|
1174
1186
|
const labelText = () => {
|
|
1175
1187
|
const max = labelAvail();
|
|
1176
1188
|
const text = entry.title || entry.agent;
|
|
@@ -1206,7 +1218,7 @@ export function SubAgentPanel(props) {
|
|
|
1206
1218
|
const cancelLabel = () => ` ${t("cancel.label")}`;
|
|
1207
1219
|
const dismissLabel = () => ` ${t("dismiss.label")}`;
|
|
1208
1220
|
const rightW = (isRunning ? visualWidth(dismissLabel()) : 0) + (isRunning && entry.sessionId ? visualWidth(cancelLabel()) : 0);
|
|
1209
|
-
const spacerW = () => Math.max(1, panelWidth() - openW() - rightW - 2);
|
|
1221
|
+
const spacerW = () => Math.max(1, panelWidth() - gutter() - openW() - rightW - 2);
|
|
1210
1222
|
return (_jsxs("box", { flexDirection: "row", children: [_jsx(Show, { when: entry.sessionId, children: _jsxs("text", { onMouseOver: () => setHoveredOpen(entry.id), onMouseOut: () => setHoveredOpen(undefined), onMouseUp: () => {
|
|
1211
1223
|
if (entry.sessionId) {
|
|
1212
1224
|
props.api.route.navigateSession(entry.sessionId);
|
|
@@ -1224,7 +1236,7 @@ export function SubAgentPanel(props) {
|
|
|
1224
1236
|
const right = props.sortOrder() === "desc"
|
|
1225
1237
|
? `\u2191 ${t("scroll.top")}`
|
|
1226
1238
|
: `\u2193 ${t("scroll.bottom")}`;
|
|
1227
|
-
const pad = showTop ? Math.max(1, panelWidth() - visualWidth(left) - visualWidth(right)) : 0;
|
|
1239
|
+
const pad = showTop ? Math.max(1, panelWidth() - gutter() - visualWidth(left) - visualWidth(right)) : 0;
|
|
1228
1240
|
return (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { onMouseOver: () => showMore && setHoveredMoreBelow(true), onMouseOut: () => setHoveredMoreBelow(false), onMouseUp: () => {
|
|
1229
1241
|
if (!showMore)
|
|
1230
1242
|
return;
|
package/dist/tui.js
CHANGED
|
@@ -6,7 +6,7 @@ import { createComponent as _$createComponent2 } from "@opentui/solid";
|
|
|
6
6
|
import { createSignal as createSignal3 } from "solid-js";
|
|
7
7
|
|
|
8
8
|
// src/_version.ts
|
|
9
|
-
var PLUGIN_VERSION = "1.6.0
|
|
9
|
+
var PLUGIN_VERSION = "1.6.0";
|
|
10
10
|
|
|
11
11
|
// src/i18n.ts
|
|
12
12
|
var ZH_T = {
|
|
@@ -58,7 +58,9 @@ var ZH_T = {
|
|
|
58
58
|
"cancel.already_ended": "\u4F1A\u8BDD\u5DF2\u7ED3\u675F\uFF0C\u65E0\u9700\u53D6\u6D88",
|
|
59
59
|
"cancel.status_error": "\u65E0\u6CD5\u67E5\u8BE2\u4F1A\u8BDD\u72B6\u6001",
|
|
60
60
|
"cancel.sent": "\u5DF2\u53D1\u9001\u53D6\u6D88\u6307\u4EE4",
|
|
61
|
-
"cancel.failed": "\u53D6\u6D88\u5931\u8D25"
|
|
61
|
+
"cancel.failed": "\u53D6\u6D88\u5931\u8D25",
|
|
62
|
+
"borderShown": "\u9762\u677F\u8FB9\u6846 \u5DF2\u663E\u793A",
|
|
63
|
+
"borderHidden": "\u9762\u677F\u8FB9\u6846 \u5DF2\u9690\u85CF"
|
|
62
64
|
};
|
|
63
65
|
var EN_T = {
|
|
64
66
|
"panel.title": "SubAgent",
|
|
@@ -109,7 +111,9 @@ var EN_T = {
|
|
|
109
111
|
"cancel.already_ended": "Session already ended, no need to cancel",
|
|
110
112
|
"cancel.status_error": "Cannot query session status",
|
|
111
113
|
"cancel.sent": "Cancel instruction sent",
|
|
112
|
-
"cancel.failed": "Cancellation failed"
|
|
114
|
+
"cancel.failed": "Cancellation failed",
|
|
115
|
+
"borderShown": "Panel border shown",
|
|
116
|
+
"borderHidden": "Panel border hidden"
|
|
113
117
|
};
|
|
114
118
|
var JA_T = {
|
|
115
119
|
"panel.title": "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8",
|
|
@@ -160,7 +164,9 @@ var JA_T = {
|
|
|
160
164
|
"cancel.already_ended": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u65E2\u306B\u7D42\u4E86\u3057\u3066\u3044\u307E\u3059",
|
|
161
165
|
"cancel.status_error": "\u30BB\u30C3\u30B7\u30E7\u30F3\u72B6\u614B\u3092\u7167\u4F1A\u3067\u304D\u307E\u305B\u3093",
|
|
162
166
|
"cancel.sent": "\u30AD\u30E3\u30F3\u30BB\u30EB\u6307\u793A\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F",
|
|
163
|
-
"cancel.failed": "\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F"
|
|
167
|
+
"cancel.failed": "\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
168
|
+
"borderShown": "\u30D1\u30CD\u30EB\u67A0\u7DDA \u8868\u793A",
|
|
169
|
+
"borderHidden": "\u30D1\u30CD\u30EB\u67A0\u7DDA \u975E\u8868\u793A"
|
|
164
170
|
};
|
|
165
171
|
var KO_T = {
|
|
166
172
|
"panel.title": "\uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8",
|
|
@@ -211,7 +217,9 @@ var KO_T = {
|
|
|
211
217
|
"cancel.already_ended": "\uC138\uC158\uC774 \uC774\uBBF8 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
212
218
|
"cancel.status_error": "\uC138\uC158 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
213
219
|
"cancel.sent": "\uCDE8\uC18C \uC9C0\uC2DC\uB97C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4",
|
|
214
|
-
"cancel.failed": "\uCDE8\uC18C\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4"
|
|
220
|
+
"cancel.failed": "\uCDE8\uC18C\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4",
|
|
221
|
+
"borderShown": "\uD328\uB110 \uD14C\uB450\uB9AC \uD45C\uC2DC",
|
|
222
|
+
"borderHidden": "\uD328\uB110 \uD14C\uB450\uB9AC \uC228\uAE40"
|
|
215
223
|
};
|
|
216
224
|
var LANGS = { zh: ZH_T, en: EN_T, ja: JA_T, ko: KO_T };
|
|
217
225
|
var LANG_META = [
|
|
@@ -251,7 +259,8 @@ var SETTING_KEYS = {
|
|
|
251
259
|
order: `${KV_PREFIX}.order`,
|
|
252
260
|
scrollMode: `${KV_PREFIX}.scroll_mode`,
|
|
253
261
|
open: `${KV_PREFIX}.open`,
|
|
254
|
-
ttlDays: `${KV_PREFIX}.ttl_days
|
|
262
|
+
ttlDays: `${KV_PREFIX}.ttl_days`,
|
|
263
|
+
border: `${KV_PREFIX}.border`
|
|
255
264
|
};
|
|
256
265
|
|
|
257
266
|
// src/panel/SubAgentPanel.tsx
|
|
@@ -260,9 +269,11 @@ import { insertNode as _$insertNode } from "@opentui/solid";
|
|
|
260
269
|
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
261
270
|
import { effect as _$effect } from "@opentui/solid";
|
|
262
271
|
import { insert as _$insert } from "@opentui/solid";
|
|
263
|
-
import { memo as _$memo } from "@opentui/solid";
|
|
264
|
-
import { use as _$use } from "@opentui/solid";
|
|
265
272
|
import { setProp as _$setProp } from "@opentui/solid";
|
|
273
|
+
import { use as _$use } from "@opentui/solid";
|
|
274
|
+
import { spread as _$spread } from "@opentui/solid";
|
|
275
|
+
import { mergeProps as _$mergeProps } from "@opentui/solid";
|
|
276
|
+
import { memo as _$memo } from "@opentui/solid";
|
|
266
277
|
import { createElement as _$createElement } from "@opentui/solid";
|
|
267
278
|
import { createMemo, createSignal as createSignal2, createEffect, onMount, onCleanup, untrack, Show, For } from "solid-js";
|
|
268
279
|
|
|
@@ -1550,13 +1561,21 @@ function SubAgentPanel(props) {
|
|
|
1550
1561
|
return next;
|
|
1551
1562
|
});
|
|
1552
1563
|
};
|
|
1553
|
-
const
|
|
1564
|
+
const gutter = createMemo(() => props.borderVisible() ? 6 : 0);
|
|
1565
|
+
const sep = () => "\u2500".repeat(Math.max(1, panelWidth() - gutter()));
|
|
1566
|
+
createEffect(() => {
|
|
1567
|
+
props.borderVisible();
|
|
1568
|
+
if (boxEl && typeof boxEl.width === "number" && boxEl.width > 0) {
|
|
1569
|
+
const w = Math.max(20, boxEl.width);
|
|
1570
|
+
setPanelWidth((prev) => prev === w ? prev : w);
|
|
1571
|
+
}
|
|
1572
|
+
});
|
|
1554
1573
|
const expandedMaxLabelW = createMemo(() => {
|
|
1555
1574
|
const labels = [t("agent.label"), t("status.label"), t("time.label"), t("tokens.label"), t("error.label"), t("cost.label"), t("model.label"), t("todo.label"), t("session.label")];
|
|
1556
1575
|
return Math.max(...labels.map((l) => visualWidth(l + ": ")));
|
|
1557
1576
|
});
|
|
1558
1577
|
const expandedPad = (label) => Math.max(0, expandedMaxLabelW() - visualWidth(label + ": "));
|
|
1559
|
-
const expandedValAvail = () => Math.max(6, panelWidth() - INDENT - expandedMaxLabelW());
|
|
1578
|
+
const expandedValAvail = () => Math.max(6, panelWidth() - gutter() - INDENT - expandedMaxLabelW());
|
|
1560
1579
|
const summaryParts = createMemo(() => {
|
|
1561
1580
|
if (!anyEntry()) return null;
|
|
1562
1581
|
const dot = "\u25CF";
|
|
@@ -1585,7 +1604,7 @@ function SubAgentPanel(props) {
|
|
|
1585
1604
|
if (!open()) return false;
|
|
1586
1605
|
const icon = "\u25BC";
|
|
1587
1606
|
const need = visualWidth(icon) + 1 + visualWidth(t("panel.title")) + versionW + summaryCols();
|
|
1588
|
-
return need <= panelWidth();
|
|
1607
|
+
return need <= panelWidth() - gutter();
|
|
1589
1608
|
});
|
|
1590
1609
|
const leftCols = createMemo(() => {
|
|
1591
1610
|
const icon = open() ? "\u25BC" : "\u25B6";
|
|
@@ -1595,25 +1614,36 @@ function SubAgentPanel(props) {
|
|
|
1595
1614
|
});
|
|
1596
1615
|
const spacerCols = createMemo(() => {
|
|
1597
1616
|
if (!anyEntry()) return 0;
|
|
1598
|
-
return Math.max(0, panelWidth() - leftCols() - summaryCols());
|
|
1617
|
+
return Math.max(0, panelWidth() - gutter() - leftCols() - summaryCols());
|
|
1599
1618
|
});
|
|
1600
|
-
const valueCols = (label) => Math.max(4, panelWidth() - INDENT - visualWidth(label + ": "));
|
|
1619
|
+
const valueCols = (label) => Math.max(4, panelWidth() - gutter() - INDENT - visualWidth(label + ": "));
|
|
1601
1620
|
return (() => {
|
|
1602
1621
|
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createElement("span"), _el$4 = _$createElement("span");
|
|
1603
1622
|
_$insertNode(_el$, _el$2);
|
|
1604
1623
|
var _ref$ = boxEl;
|
|
1605
1624
|
typeof _ref$ === "function" ? _$use(_ref$, _el$) : boxEl = _el$;
|
|
1606
|
-
_$
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1625
|
+
_$spread(_el$, _$mergeProps({
|
|
1626
|
+
get border() {
|
|
1627
|
+
return props.borderVisible();
|
|
1628
|
+
}
|
|
1629
|
+
}, () => props.borderVisible() ? {
|
|
1630
|
+
borderColor: pal().border
|
|
1631
|
+
} : {}, {
|
|
1632
|
+
"paddingTop": 0,
|
|
1633
|
+
"paddingBottom": 0,
|
|
1634
|
+
get paddingLeft() {
|
|
1635
|
+
return props.borderVisible() ? 2 : 0;
|
|
1636
|
+
},
|
|
1637
|
+
get paddingRight() {
|
|
1638
|
+
return props.borderVisible() ? 2 : 0;
|
|
1639
|
+
},
|
|
1640
|
+
"flexDirection": "column",
|
|
1641
|
+
"gap": 0,
|
|
1642
|
+
"onSizeChange": () => {
|
|
1643
|
+
const w = boxEl ? Math.max(20, boxEl.width ?? 0) : 28;
|
|
1644
|
+
setPanelWidth((prev) => prev === w ? prev : w);
|
|
1645
|
+
}
|
|
1646
|
+
}), true);
|
|
1617
1647
|
_$insertNode(_el$2, _el$3);
|
|
1618
1648
|
_$insertNode(_el$2, _el$4);
|
|
1619
1649
|
_$setProp(_el$2, "onMouseUp", () => {
|
|
@@ -1810,7 +1840,7 @@ function SubAgentPanel(props) {
|
|
|
1810
1840
|
if (tk) w += visualWidth(tk);
|
|
1811
1841
|
return w;
|
|
1812
1842
|
};
|
|
1813
|
-
const labelAvail = () => Math.max(6, panelWidth() - LEFT_PAD - suffixW());
|
|
1843
|
+
const labelAvail = () => Math.max(6, panelWidth() - gutter() - LEFT_PAD - suffixW());
|
|
1814
1844
|
const labelText = () => {
|
|
1815
1845
|
const max2 = labelAvail();
|
|
1816
1846
|
const text = entry.title || entry.agent;
|
|
@@ -2207,7 +2237,7 @@ ${t("session.toast.copy_failed")}`, {
|
|
|
2207
2237
|
const cancelLabel = () => ` ${t("cancel.label")}`;
|
|
2208
2238
|
const dismissLabel = () => ` ${t("dismiss.label")}`;
|
|
2209
2239
|
const rightW = (isRunning ? visualWidth(dismissLabel()) : 0) + (isRunning && entry.sessionId ? visualWidth(cancelLabel()) : 0);
|
|
2210
|
-
const spacerW = () => Math.max(1, panelWidth() - openW() - rightW - 2);
|
|
2240
|
+
const spacerW = () => Math.max(1, panelWidth() - gutter() - openW() - rightW - 2);
|
|
2211
2241
|
return (() => {
|
|
2212
2242
|
var _el$91 = _$createElement("box"), _el$95 = _$createElement("text");
|
|
2213
2243
|
_$insertNode(_el$91, _el$95);
|
|
@@ -2308,7 +2338,7 @@ ${t("session.toast.copy_failed")}`, {
|
|
|
2308
2338
|
const showTop = props.sortOrder() === "desc" ? scrollOffset() > 0 : entryList().length > max() && clampedOffset() < entryList().length - max();
|
|
2309
2339
|
const left = showMore ? ` \u2193 ${hiddenBelow()} ${t("scroll.more")}` : " ";
|
|
2310
2340
|
const right = props.sortOrder() === "desc" ? `\u2191 ${t("scroll.top")}` : `\u2193 ${t("scroll.bottom")}`;
|
|
2311
|
-
const pad = showTop ? Math.max(1, panelWidth() - visualWidth(left) - visualWidth(right)) : 0;
|
|
2341
|
+
const pad = showTop ? Math.max(1, panelWidth() - gutter() - visualWidth(left) - visualWidth(right)) : 0;
|
|
2312
2342
|
return (() => {
|
|
2313
2343
|
var _el$100 = _$createElement("box"), _el$101 = _$createElement("text"), _el$102 = _$createElement("span");
|
|
2314
2344
|
_$insertNode(_el$100, _el$101);
|
|
@@ -2411,6 +2441,9 @@ function createSidebarSlot(api, panelApi, sig) {
|
|
|
2411
2441
|
get scrollMode() {
|
|
2412
2442
|
return sig.scrollMode;
|
|
2413
2443
|
},
|
|
2444
|
+
get borderVisible() {
|
|
2445
|
+
return sig.borderVisible;
|
|
2446
|
+
},
|
|
2414
2447
|
get sessionId() {
|
|
2415
2448
|
return input.session_id;
|
|
2416
2449
|
}
|
|
@@ -2426,6 +2459,7 @@ var tui = async (api) => {
|
|
|
2426
2459
|
const [maxEntries, setMaxEntries] = createSignal3(parseInt(String(api.kv.get(`${KV_PREFIX}.max_entries`, "10")), 10) || 10);
|
|
2427
2460
|
const [sortOrder, setSortOrder] = createSignal3(String(api.kv.get(`${KV_PREFIX}.order`, "desc")) === "asc" ? "asc" : "desc");
|
|
2428
2461
|
const [scrollMode, setScrollMode] = createSignal3(String(api.kv.get(`${KV_PREFIX}.scroll_mode`, "wheel")) === "click" ? "click" : "wheel");
|
|
2462
|
+
const [borderVisible, setBorderVisible] = createSignal3(api.kv.get(`${KV_PREFIX}.border`, false) === true);
|
|
2429
2463
|
const signals = {
|
|
2430
2464
|
lang,
|
|
2431
2465
|
setLang,
|
|
@@ -2435,6 +2469,8 @@ var tui = async (api) => {
|
|
|
2435
2469
|
setSortOrder,
|
|
2436
2470
|
scrollMode,
|
|
2437
2471
|
setScrollMode,
|
|
2472
|
+
borderVisible,
|
|
2473
|
+
setBorderVisible,
|
|
2438
2474
|
sessionId: ""
|
|
2439
2475
|
};
|
|
2440
2476
|
const v1Api = {
|
|
@@ -2918,6 +2954,23 @@ var tui = async (api) => {
|
|
|
2918
2954
|
}
|
|
2919
2955
|
}));
|
|
2920
2956
|
}
|
|
2957
|
+
}, {
|
|
2958
|
+
title: "SubAgent Magazine: Border",
|
|
2959
|
+
value: "subagent-border",
|
|
2960
|
+
description: "Show or hide the panel border",
|
|
2961
|
+
slash: {
|
|
2962
|
+
name: "subagent-border"
|
|
2963
|
+
},
|
|
2964
|
+
onSelect: (dialog) => {
|
|
2965
|
+
const t = createT(() => signals.lang());
|
|
2966
|
+
const cur = Boolean(api.kv.get(`${KV_PREFIX}.border`, false));
|
|
2967
|
+
api.kv.set(`${KV_PREFIX}.border`, !cur);
|
|
2968
|
+
signals.setBorderVisible(!cur);
|
|
2969
|
+
api.ui.toast({
|
|
2970
|
+
message: !cur ? t("borderShown") : t("borderHidden")
|
|
2971
|
+
});
|
|
2972
|
+
dialog?.clear();
|
|
2973
|
+
}
|
|
2921
2974
|
}]);
|
|
2922
2975
|
};
|
|
2923
2976
|
var mod = {
|
package/dist/v2/commands.js
CHANGED
|
@@ -258,6 +258,19 @@ export function makeCommands(context, api, signals) {
|
|
|
258
258
|
catch { }
|
|
259
259
|
},
|
|
260
260
|
},
|
|
261
|
+
{
|
|
262
|
+
id: "opencode-subagent-magazine.subagent.border",
|
|
263
|
+
title: "SubAgent Magazine: Border",
|
|
264
|
+
description: "Show or hide the panel border",
|
|
265
|
+
slash: { name: "subagent-border" },
|
|
266
|
+
palette: true,
|
|
267
|
+
run: () => {
|
|
268
|
+
const cur = Boolean(kv.get(SETTING_KEYS.border, false));
|
|
269
|
+
kv.set(SETTING_KEYS.border, !cur);
|
|
270
|
+
signals.setBorderVisible(!cur);
|
|
271
|
+
api.ui.toast(!cur ? t("borderShown") : t("borderHidden"));
|
|
272
|
+
},
|
|
273
|
+
},
|
|
261
274
|
];
|
|
262
275
|
}
|
|
263
276
|
export { KV_PREFIX };
|
package/dist/v2/index.js
CHANGED
|
@@ -14,7 +14,7 @@ function PluginRoot(props) {
|
|
|
14
14
|
mode: "global",
|
|
15
15
|
commands: makeCommands(props.context, props.api, props.signals),
|
|
16
16
|
}));
|
|
17
|
-
return (_jsx(SubAgentPanel, { api: props.api, theme: mapTheme(props.context.theme), lang: props.signals.lang, maxEntries: props.signals.maxEntries, sortOrder: props.signals.sortOrder, scrollMode: props.signals.scrollMode, sessionId: props.sessionID }));
|
|
17
|
+
return (_jsx(SubAgentPanel, { api: props.api, theme: mapTheme(props.context.theme), lang: props.signals.lang, maxEntries: props.signals.maxEntries, sortOrder: props.signals.sortOrder, scrollMode: props.signals.scrollMode, borderVisible: props.signals.borderVisible, sessionId: props.sessionID }));
|
|
18
18
|
}
|
|
19
19
|
/** V2 入口:setup 创建共享信号 + PanelApi + 命令 layer + 侧边栏槽位。
|
|
20
20
|
* 行为对齐 V1 tui()(信号初始值从 KV 恢复;侧边栏渲染共享 SubAgentPanel)。 */
|
|
@@ -39,12 +39,13 @@ const mod = {
|
|
|
39
39
|
const [maxSignal, setMaxEntries] = createSignal(Number(api.kv.get(SETTING_KEYS.maxEntries, "10")) || 10);
|
|
40
40
|
const [orderSignal, setSortOrder] = createSignal(String(api.kv.get(SETTING_KEYS.order, "desc")) === "asc" ? "asc" : "desc");
|
|
41
41
|
const [scrollSignal, setScrollMode] = createSignal(String(api.kv.get(SETTING_KEYS.scrollMode, "wheel")) === "click" ? "click" : "wheel");
|
|
42
|
+
const [borderSignal, setBorderVisible] = createSignal(api.kv.get(SETTING_KEYS.border, false) === true);
|
|
42
43
|
lang = langSignal;
|
|
43
44
|
maxEntries = maxSignal;
|
|
44
45
|
sortOrder = orderSignal;
|
|
45
46
|
scrollMode = scrollSignal;
|
|
46
47
|
const signals = {
|
|
47
|
-
lang, setLang, maxEntries, setMaxEntries, sortOrder, setSortOrder, scrollMode, setScrollMode, sessionId: "",
|
|
48
|
+
lang, setLang, maxEntries, setMaxEntries, sortOrder, setSortOrder, scrollMode, setScrollMode, borderVisible: borderSignal, setBorderVisible, sessionId: "",
|
|
48
49
|
};
|
|
49
50
|
// 命令 layer(组件内注册——见 PluginRoot)
|
|
50
51
|
// 侧边栏面板(共享 SubAgentPanel——V1/V2 同一组件)
|
package/dist/v2.js
CHANGED
|
@@ -307,7 +307,8 @@ var SETTING_KEYS = {
|
|
|
307
307
|
order: `${KV_PREFIX}.order`,
|
|
308
308
|
scrollMode: `${KV_PREFIX}.scroll_mode`,
|
|
309
309
|
open: `${KV_PREFIX}.open`,
|
|
310
|
-
ttlDays: `${KV_PREFIX}.ttl_days
|
|
310
|
+
ttlDays: `${KV_PREFIX}.ttl_days`,
|
|
311
|
+
border: `${KV_PREFIX}.border`
|
|
311
312
|
};
|
|
312
313
|
function loadSessionData(kv) {
|
|
313
314
|
try {
|
|
@@ -329,7 +330,7 @@ function readTTLDays(kv) {
|
|
|
329
330
|
}
|
|
330
331
|
|
|
331
332
|
// src/_version.ts
|
|
332
|
-
var PLUGIN_VERSION = "1.6.0
|
|
333
|
+
var PLUGIN_VERSION = "1.6.0";
|
|
333
334
|
|
|
334
335
|
// src/i18n.ts
|
|
335
336
|
var ZH_T = {
|
|
@@ -381,7 +382,9 @@ var ZH_T = {
|
|
|
381
382
|
"cancel.already_ended": "\u4F1A\u8BDD\u5DF2\u7ED3\u675F\uFF0C\u65E0\u9700\u53D6\u6D88",
|
|
382
383
|
"cancel.status_error": "\u65E0\u6CD5\u67E5\u8BE2\u4F1A\u8BDD\u72B6\u6001",
|
|
383
384
|
"cancel.sent": "\u5DF2\u53D1\u9001\u53D6\u6D88\u6307\u4EE4",
|
|
384
|
-
"cancel.failed": "\u53D6\u6D88\u5931\u8D25"
|
|
385
|
+
"cancel.failed": "\u53D6\u6D88\u5931\u8D25",
|
|
386
|
+
"borderShown": "\u9762\u677F\u8FB9\u6846 \u5DF2\u663E\u793A",
|
|
387
|
+
"borderHidden": "\u9762\u677F\u8FB9\u6846 \u5DF2\u9690\u85CF"
|
|
385
388
|
};
|
|
386
389
|
var EN_T = {
|
|
387
390
|
"panel.title": "SubAgent",
|
|
@@ -432,7 +435,9 @@ var EN_T = {
|
|
|
432
435
|
"cancel.already_ended": "Session already ended, no need to cancel",
|
|
433
436
|
"cancel.status_error": "Cannot query session status",
|
|
434
437
|
"cancel.sent": "Cancel instruction sent",
|
|
435
|
-
"cancel.failed": "Cancellation failed"
|
|
438
|
+
"cancel.failed": "Cancellation failed",
|
|
439
|
+
"borderShown": "Panel border shown",
|
|
440
|
+
"borderHidden": "Panel border hidden"
|
|
436
441
|
};
|
|
437
442
|
var JA_T = {
|
|
438
443
|
"panel.title": "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8",
|
|
@@ -483,7 +488,9 @@ var JA_T = {
|
|
|
483
488
|
"cancel.already_ended": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u65E2\u306B\u7D42\u4E86\u3057\u3066\u3044\u307E\u3059",
|
|
484
489
|
"cancel.status_error": "\u30BB\u30C3\u30B7\u30E7\u30F3\u72B6\u614B\u3092\u7167\u4F1A\u3067\u304D\u307E\u305B\u3093",
|
|
485
490
|
"cancel.sent": "\u30AD\u30E3\u30F3\u30BB\u30EB\u6307\u793A\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F",
|
|
486
|
-
"cancel.failed": "\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F"
|
|
491
|
+
"cancel.failed": "\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
492
|
+
"borderShown": "\u30D1\u30CD\u30EB\u67A0\u7DDA \u8868\u793A",
|
|
493
|
+
"borderHidden": "\u30D1\u30CD\u30EB\u67A0\u7DDA \u975E\u8868\u793A"
|
|
487
494
|
};
|
|
488
495
|
var KO_T = {
|
|
489
496
|
"panel.title": "\uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8",
|
|
@@ -534,7 +541,9 @@ var KO_T = {
|
|
|
534
541
|
"cancel.already_ended": "\uC138\uC158\uC774 \uC774\uBBF8 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
535
542
|
"cancel.status_error": "\uC138\uC158 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
536
543
|
"cancel.sent": "\uCDE8\uC18C \uC9C0\uC2DC\uB97C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4",
|
|
537
|
-
"cancel.failed": "\uCDE8\uC18C\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4"
|
|
544
|
+
"cancel.failed": "\uCDE8\uC18C\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4",
|
|
545
|
+
"borderShown": "\uD328\uB110 \uD14C\uB450\uB9AC \uD45C\uC2DC",
|
|
546
|
+
"borderHidden": "\uD328\uB110 \uD14C\uB450\uB9AC \uC228\uAE40"
|
|
538
547
|
};
|
|
539
548
|
var LANGS = { zh: ZH_T, en: EN_T, ja: JA_T, ko: KO_T };
|
|
540
549
|
var LANG_META = [
|
|
@@ -809,6 +818,19 @@ function makeCommands(context, api, signals) {
|
|
|
809
818
|
} catch {
|
|
810
819
|
}
|
|
811
820
|
}
|
|
821
|
+
},
|
|
822
|
+
{
|
|
823
|
+
id: "opencode-subagent-magazine.subagent.border",
|
|
824
|
+
title: "SubAgent Magazine: Border",
|
|
825
|
+
description: "Show or hide the panel border",
|
|
826
|
+
slash: { name: "subagent-border" },
|
|
827
|
+
palette: true,
|
|
828
|
+
run: () => {
|
|
829
|
+
const cur = Boolean(kv.get(SETTING_KEYS.border, false));
|
|
830
|
+
kv.set(SETTING_KEYS.border, !cur);
|
|
831
|
+
signals.setBorderVisible(!cur);
|
|
832
|
+
api.ui.toast(!cur ? t("borderShown") : t("borderHidden"));
|
|
833
|
+
}
|
|
812
834
|
}
|
|
813
835
|
];
|
|
814
836
|
}
|
|
@@ -832,9 +854,11 @@ import { insertNode as _$insertNode } from "@opentui/solid";
|
|
|
832
854
|
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
833
855
|
import { effect as _$effect } from "@opentui/solid";
|
|
834
856
|
import { insert as _$insert } from "@opentui/solid";
|
|
835
|
-
import { memo as _$memo } from "@opentui/solid";
|
|
836
|
-
import { use as _$use } from "@opentui/solid";
|
|
837
857
|
import { setProp as _$setProp } from "@opentui/solid";
|
|
858
|
+
import { use as _$use } from "@opentui/solid";
|
|
859
|
+
import { spread as _$spread } from "@opentui/solid";
|
|
860
|
+
import { mergeProps as _$mergeProps } from "@opentui/solid";
|
|
861
|
+
import { memo as _$memo } from "@opentui/solid";
|
|
838
862
|
import { createElement as _$createElement } from "@opentui/solid";
|
|
839
863
|
import { createMemo, createSignal as createSignal2, createEffect, onMount, onCleanup, untrack, Show, For } from "solid-js";
|
|
840
864
|
|
|
@@ -2117,13 +2141,21 @@ function SubAgentPanel(props) {
|
|
|
2117
2141
|
return next;
|
|
2118
2142
|
});
|
|
2119
2143
|
};
|
|
2120
|
-
const
|
|
2144
|
+
const gutter = createMemo(() => props.borderVisible() ? 6 : 0);
|
|
2145
|
+
const sep = () => "\u2500".repeat(Math.max(1, panelWidth() - gutter()));
|
|
2146
|
+
createEffect(() => {
|
|
2147
|
+
props.borderVisible();
|
|
2148
|
+
if (boxEl && typeof boxEl.width === "number" && boxEl.width > 0) {
|
|
2149
|
+
const w = Math.max(20, boxEl.width);
|
|
2150
|
+
setPanelWidth((prev) => prev === w ? prev : w);
|
|
2151
|
+
}
|
|
2152
|
+
});
|
|
2121
2153
|
const expandedMaxLabelW = createMemo(() => {
|
|
2122
2154
|
const labels = [t("agent.label"), t("status.label"), t("time.label"), t("tokens.label"), t("error.label"), t("cost.label"), t("model.label"), t("todo.label"), t("session.label")];
|
|
2123
2155
|
return Math.max(...labels.map((l) => visualWidth(l + ": ")));
|
|
2124
2156
|
});
|
|
2125
2157
|
const expandedPad = (label) => Math.max(0, expandedMaxLabelW() - visualWidth(label + ": "));
|
|
2126
|
-
const expandedValAvail = () => Math.max(6, panelWidth() - INDENT - expandedMaxLabelW());
|
|
2158
|
+
const expandedValAvail = () => Math.max(6, panelWidth() - gutter() - INDENT - expandedMaxLabelW());
|
|
2127
2159
|
const summaryParts = createMemo(() => {
|
|
2128
2160
|
if (!anyEntry()) return null;
|
|
2129
2161
|
const dot = "\u25CF";
|
|
@@ -2152,7 +2184,7 @@ function SubAgentPanel(props) {
|
|
|
2152
2184
|
if (!open()) return false;
|
|
2153
2185
|
const icon = "\u25BC";
|
|
2154
2186
|
const need = visualWidth(icon) + 1 + visualWidth(t("panel.title")) + versionW + summaryCols();
|
|
2155
|
-
return need <= panelWidth();
|
|
2187
|
+
return need <= panelWidth() - gutter();
|
|
2156
2188
|
});
|
|
2157
2189
|
const leftCols = createMemo(() => {
|
|
2158
2190
|
const icon = open() ? "\u25BC" : "\u25B6";
|
|
@@ -2162,25 +2194,36 @@ function SubAgentPanel(props) {
|
|
|
2162
2194
|
});
|
|
2163
2195
|
const spacerCols = createMemo(() => {
|
|
2164
2196
|
if (!anyEntry()) return 0;
|
|
2165
|
-
return Math.max(0, panelWidth() - leftCols() - summaryCols());
|
|
2197
|
+
return Math.max(0, panelWidth() - gutter() - leftCols() - summaryCols());
|
|
2166
2198
|
});
|
|
2167
|
-
const valueCols = (label) => Math.max(4, panelWidth() - INDENT - visualWidth(label + ": "));
|
|
2199
|
+
const valueCols = (label) => Math.max(4, panelWidth() - gutter() - INDENT - visualWidth(label + ": "));
|
|
2168
2200
|
return (() => {
|
|
2169
2201
|
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createElement("span"), _el$4 = _$createElement("span");
|
|
2170
2202
|
_$insertNode(_el$, _el$2);
|
|
2171
2203
|
var _ref$ = boxEl;
|
|
2172
2204
|
typeof _ref$ === "function" ? _$use(_ref$, _el$) : boxEl = _el$;
|
|
2173
|
-
_$
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2205
|
+
_$spread(_el$, _$mergeProps({
|
|
2206
|
+
get border() {
|
|
2207
|
+
return props.borderVisible();
|
|
2208
|
+
}
|
|
2209
|
+
}, () => props.borderVisible() ? {
|
|
2210
|
+
borderColor: pal().border
|
|
2211
|
+
} : {}, {
|
|
2212
|
+
"paddingTop": 0,
|
|
2213
|
+
"paddingBottom": 0,
|
|
2214
|
+
get paddingLeft() {
|
|
2215
|
+
return props.borderVisible() ? 2 : 0;
|
|
2216
|
+
},
|
|
2217
|
+
get paddingRight() {
|
|
2218
|
+
return props.borderVisible() ? 2 : 0;
|
|
2219
|
+
},
|
|
2220
|
+
"flexDirection": "column",
|
|
2221
|
+
"gap": 0,
|
|
2222
|
+
"onSizeChange": () => {
|
|
2223
|
+
const w = boxEl ? Math.max(20, boxEl.width ?? 0) : 28;
|
|
2224
|
+
setPanelWidth((prev) => prev === w ? prev : w);
|
|
2225
|
+
}
|
|
2226
|
+
}), true);
|
|
2184
2227
|
_$insertNode(_el$2, _el$3);
|
|
2185
2228
|
_$insertNode(_el$2, _el$4);
|
|
2186
2229
|
_$setProp(_el$2, "onMouseUp", () => {
|
|
@@ -2377,7 +2420,7 @@ function SubAgentPanel(props) {
|
|
|
2377
2420
|
if (tk) w += visualWidth(tk);
|
|
2378
2421
|
return w;
|
|
2379
2422
|
};
|
|
2380
|
-
const labelAvail = () => Math.max(6, panelWidth() - LEFT_PAD - suffixW());
|
|
2423
|
+
const labelAvail = () => Math.max(6, panelWidth() - gutter() - LEFT_PAD - suffixW());
|
|
2381
2424
|
const labelText = () => {
|
|
2382
2425
|
const max2 = labelAvail();
|
|
2383
2426
|
const text = entry.title || entry.agent;
|
|
@@ -2774,7 +2817,7 @@ ${t("session.toast.copy_failed")}`, {
|
|
|
2774
2817
|
const cancelLabel = () => ` ${t("cancel.label")}`;
|
|
2775
2818
|
const dismissLabel = () => ` ${t("dismiss.label")}`;
|
|
2776
2819
|
const rightW = (isRunning ? visualWidth(dismissLabel()) : 0) + (isRunning && entry.sessionId ? visualWidth(cancelLabel()) : 0);
|
|
2777
|
-
const spacerW = () => Math.max(1, panelWidth() - openW() - rightW - 2);
|
|
2820
|
+
const spacerW = () => Math.max(1, panelWidth() - gutter() - openW() - rightW - 2);
|
|
2778
2821
|
return (() => {
|
|
2779
2822
|
var _el$91 = _$createElement("box"), _el$95 = _$createElement("text");
|
|
2780
2823
|
_$insertNode(_el$91, _el$95);
|
|
@@ -2875,7 +2918,7 @@ ${t("session.toast.copy_failed")}`, {
|
|
|
2875
2918
|
const showTop = props.sortOrder() === "desc" ? scrollOffset() > 0 : entryList().length > max() && clampedOffset() < entryList().length - max();
|
|
2876
2919
|
const left = showMore ? ` \u2193 ${hiddenBelow()} ${t("scroll.more")}` : " ";
|
|
2877
2920
|
const right = props.sortOrder() === "desc" ? `\u2191 ${t("scroll.top")}` : `\u2193 ${t("scroll.bottom")}`;
|
|
2878
|
-
const pad = showTop ? Math.max(1, panelWidth() - visualWidth(left) - visualWidth(right)) : 0;
|
|
2921
|
+
const pad = showTop ? Math.max(1, panelWidth() - gutter() - visualWidth(left) - visualWidth(right)) : 0;
|
|
2879
2922
|
return (() => {
|
|
2880
2923
|
var _el$100 = _$createElement("box"), _el$101 = _$createElement("text"), _el$102 = _$createElement("span");
|
|
2881
2924
|
_$insertNode(_el$100, _el$101);
|
|
@@ -2979,6 +3022,9 @@ function PluginRoot(props) {
|
|
|
2979
3022
|
get scrollMode() {
|
|
2980
3023
|
return props.signals.scrollMode;
|
|
2981
3024
|
},
|
|
3025
|
+
get borderVisible() {
|
|
3026
|
+
return props.signals.borderVisible;
|
|
3027
|
+
},
|
|
2982
3028
|
get sessionId() {
|
|
2983
3029
|
return props.sessionID;
|
|
2984
3030
|
}
|
|
@@ -3003,6 +3049,7 @@ var mod = {
|
|
|
3003
3049
|
const [maxSignal, setMaxEntries] = createSignal3(Number(api.kv.get(SETTING_KEYS.maxEntries, "10")) || 10);
|
|
3004
3050
|
const [orderSignal, setSortOrder] = createSignal3(String(api.kv.get(SETTING_KEYS.order, "desc")) === "asc" ? "asc" : "desc");
|
|
3005
3051
|
const [scrollSignal, setScrollMode] = createSignal3(String(api.kv.get(SETTING_KEYS.scrollMode, "wheel")) === "click" ? "click" : "wheel");
|
|
3052
|
+
const [borderSignal, setBorderVisible] = createSignal3(api.kv.get(SETTING_KEYS.border, false) === true);
|
|
3006
3053
|
lang = langSignal;
|
|
3007
3054
|
maxEntries = maxSignal;
|
|
3008
3055
|
sortOrder = orderSignal;
|
|
@@ -3016,6 +3063,8 @@ var mod = {
|
|
|
3016
3063
|
setSortOrder,
|
|
3017
3064
|
scrollMode,
|
|
3018
3065
|
setScrollMode,
|
|
3066
|
+
borderVisible: borderSignal,
|
|
3067
|
+
setBorderVisible,
|
|
3019
3068
|
sessionId: ""
|
|
3020
3069
|
};
|
|
3021
3070
|
context.ui.slot({
|