opencode-subagent-magazine 1.6.0-beta.2 → 1.6.0-beta.4
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/README.md +3 -1
- 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 +54 -37
- package/dist/panel/entry-map.d.ts +6 -0
- package/dist/panel/entry-map.js +25 -0
- package/dist/tui.js +128 -56
- package/dist/v2/commands.js +13 -0
- package/dist/v2/index.js +3 -2
- package/dist/v2.js +124 -56
- package/package.json +1 -1
- package/src/_version.ts +1 -1
- package/src/core/color.ts +70 -70
- package/src/core/format.ts +61 -61
- package/src/core/index.ts +6 -6
- package/src/core/kv.ts +37 -36
- package/src/core/state-machine.ts +46 -46
- package/src/core/types.ts +2 -0
- package/src/core/usage.ts +16 -16
- package/src/i18n.ts +8 -0
- package/src/index.tsx +472 -454
- package/src/panel/SubAgentPanel.tsx +59 -37
- package/src/panel/entry-map.ts +39 -0
- package/src/panel/store.ts +8 -8
- package/src/v2/commands.ts +264 -251
- package/src/v2/index.tsx +102 -98
- package/src/v2/theme.ts +14 -14
- package/src/v2/types.ts +165 -165
- package/tui/index.js +11 -11
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-beta.
|
|
9
|
+
var PLUGIN_VERSION = "1.6.0-beta.4";
|
|
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
|
|
|
@@ -490,6 +501,31 @@ function isDirectChildSession(currentSessionId, eventSessionId, eventSession) {
|
|
|
490
501
|
return eventSessionId !== currentSessionId && eventSession?.parentID === currentSessionId;
|
|
491
502
|
}
|
|
492
503
|
|
|
504
|
+
// src/panel/entry-map.ts
|
|
505
|
+
function findSubEntryKey(entries, id, sessionId) {
|
|
506
|
+
if (sessionId) {
|
|
507
|
+
for (const [key, entry] of entries) {
|
|
508
|
+
if (entry.sessionId === sessionId) return key;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return entries.has(id) ? id : void 0;
|
|
512
|
+
}
|
|
513
|
+
function upsertSubEntry(entries, partial, now = Date.now()) {
|
|
514
|
+
const key = findSubEntryKey(entries, partial.id, partial.sessionId) ?? partial.id;
|
|
515
|
+
const existing = entries.get(key);
|
|
516
|
+
const next = new Map(entries);
|
|
517
|
+
if (key !== partial.id) next.delete(partial.id);
|
|
518
|
+
const ended = partial.status === "done" || partial.status === "error" || partial.status === "cancelled";
|
|
519
|
+
next.set(key, {
|
|
520
|
+
...existing ?? { startedAt: now },
|
|
521
|
+
...partial,
|
|
522
|
+
id: existing?.id ?? partial.id,
|
|
523
|
+
startedAt: existing?.startedAt || partial.startedAt || now,
|
|
524
|
+
endedAt: ended ? existing?.endedAt || now : void 0
|
|
525
|
+
});
|
|
526
|
+
return next;
|
|
527
|
+
}
|
|
528
|
+
|
|
493
529
|
// src/panel/SubAgentPanel.tsx
|
|
494
530
|
var LEFT_PAD = 4;
|
|
495
531
|
var INDENT = 2;
|
|
@@ -529,7 +565,7 @@ function SubAgentPanel(props) {
|
|
|
529
565
|
};
|
|
530
566
|
};
|
|
531
567
|
const loadEntries = (sid) => {
|
|
532
|
-
|
|
568
|
+
let m = /* @__PURE__ */ new Map();
|
|
533
569
|
try {
|
|
534
570
|
const {
|
|
535
571
|
parentSid,
|
|
@@ -539,7 +575,9 @@ function SubAgentPanel(props) {
|
|
|
539
575
|
if (rec) {
|
|
540
576
|
const source = isChild ? rec.children?.[sid]?.entries : rec.entries;
|
|
541
577
|
if (source) {
|
|
542
|
-
for (const e of source)
|
|
578
|
+
for (const e of source) {
|
|
579
|
+
m = upsertSubEntry(m, e);
|
|
580
|
+
}
|
|
543
581
|
}
|
|
544
582
|
}
|
|
545
583
|
} catch {
|
|
@@ -777,22 +815,7 @@ function SubAgentPanel(props) {
|
|
|
777
815
|
let boxEl;
|
|
778
816
|
let disposed = false;
|
|
779
817
|
const upsertEntry = (partial) => {
|
|
780
|
-
setEntryMap((prev) =>
|
|
781
|
-
const existing = prev.get(partial.id);
|
|
782
|
-
const next = new Map(prev);
|
|
783
|
-
const nowTs = Date.now();
|
|
784
|
-
const e = partial.status;
|
|
785
|
-
const ended = e === "done" || e === "error" || e === "cancelled";
|
|
786
|
-
next.set(partial.id, {
|
|
787
|
-
...existing ?? {
|
|
788
|
-
startedAt: nowTs
|
|
789
|
-
},
|
|
790
|
-
...partial,
|
|
791
|
-
startedAt: existing?.startedAt || partial.startedAt || nowTs,
|
|
792
|
-
endedAt: ended ? existing?.endedAt || nowTs : void 0
|
|
793
|
-
});
|
|
794
|
-
return next;
|
|
795
|
-
});
|
|
818
|
+
setEntryMap((prev) => upsertSubEntry(prev, partial));
|
|
796
819
|
};
|
|
797
820
|
const isDescendantOf = (childId, rootId) => {
|
|
798
821
|
const visited = /* @__PURE__ */ new Set();
|
|
@@ -936,13 +959,17 @@ function SubAgentPanel(props) {
|
|
|
936
959
|
if (rawStatus === "error") {
|
|
937
960
|
const id2 = `tool:${String(part.id ?? "")}`;
|
|
938
961
|
if (!part.id) return;
|
|
939
|
-
const
|
|
962
|
+
const stMeta2 = st?.metadata;
|
|
963
|
+
const errorSid = stMeta2?.session_id !== void 0 ? String(stMeta2.session_id) : stMeta2?.sessionId !== void 0 ? String(stMeta2.sessionId) : void 0;
|
|
964
|
+
const key = findSubEntryKey(entryMap(), id2, errorSid);
|
|
965
|
+
const existing = key ? entryMap().get(key) : void 0;
|
|
940
966
|
if (existing) {
|
|
941
967
|
upsertEntry({
|
|
942
|
-
id:
|
|
968
|
+
id: existing.id,
|
|
943
969
|
title: existing.title,
|
|
944
970
|
agent: existing.agent,
|
|
945
971
|
prompt: existing.prompt,
|
|
972
|
+
sessionId: existing.sessionId ?? errorSid,
|
|
946
973
|
status: "error"
|
|
947
974
|
});
|
|
948
975
|
}
|
|
@@ -1329,12 +1356,15 @@ function SubAgentPanel(props) {
|
|
|
1329
1356
|
if (!part.id) continue;
|
|
1330
1357
|
const st = part.state;
|
|
1331
1358
|
const rawStatus = String(st?.status ?? "");
|
|
1332
|
-
const
|
|
1359
|
+
const scanStMeta = st?.metadata;
|
|
1360
|
+
const scanSubSid = scanStMeta?.session_id !== void 0 ? String(scanStMeta.session_id) : scanStMeta?.sessionId !== void 0 ? String(scanStMeta.sessionId) : void 0;
|
|
1361
|
+
const existingKey = findSubEntryKey(next, id, scanSubSid);
|
|
1362
|
+
const exists = existingKey ? next.get(existingKey) : void 0;
|
|
1333
1363
|
if (!exists && clearedIds.has(id)) continue;
|
|
1334
1364
|
if ((rawStatus === "pending" || rawStatus === "") && !exists) continue;
|
|
1335
1365
|
if (rawStatus === "error") {
|
|
1336
1366
|
if (exists && exists.status === "running") {
|
|
1337
|
-
next.set(id, {
|
|
1367
|
+
next.set(existingKey ?? id, {
|
|
1338
1368
|
...exists,
|
|
1339
1369
|
status: "error",
|
|
1340
1370
|
endedAt: Date.now()
|
|
@@ -1345,11 +1375,11 @@ function SubAgentPanel(props) {
|
|
|
1345
1375
|
let status = "running";
|
|
1346
1376
|
if (rawStatus === "completed") status = "done";
|
|
1347
1377
|
if ((st?.input?.run_in_background === true || st?.input?.background === true) && status === "done") {
|
|
1348
|
-
const
|
|
1349
|
-
const scanHasChild =
|
|
1378
|
+
const scanStMeta2 = st?.metadata;
|
|
1379
|
+
const scanHasChild = scanStMeta2?.session_id !== void 0 || scanStMeta2?.sessionId !== void 0;
|
|
1350
1380
|
if (scanHasChild) status = "running";
|
|
1351
1381
|
}
|
|
1352
|
-
if (exists && exists.status !== "running" && exists.status !== "cancel_requested") continue;
|
|
1382
|
+
if (exists && existingKey === id && exists.status !== "running" && exists.status !== "cancel_requested") continue;
|
|
1353
1383
|
if (exists && status === "running") {
|
|
1354
1384
|
if (!rawStatus) {
|
|
1355
1385
|
const msgTokens = msg?.tokens;
|
|
@@ -1370,12 +1400,11 @@ function SubAgentPanel(props) {
|
|
|
1370
1400
|
const desc = input?.description !== void 0 ? String(input.description) : "";
|
|
1371
1401
|
const title = desc || truncate(prompt.replace(/\n/g, " ").trim(), 40);
|
|
1372
1402
|
let tokens;
|
|
1373
|
-
const scanStMeta2 = st?.metadata;
|
|
1374
|
-
const scanSubSid = scanStMeta2?.session_id !== void 0 ? String(scanStMeta2.session_id) : scanStMeta2?.sessionId !== void 0 ? String(scanStMeta2.sessionId) : void 0;
|
|
1375
1403
|
if (scanSubSid) tokens = props.api.usage.readSessionTokens(scanSubSid);
|
|
1376
1404
|
const ended = status === "done";
|
|
1377
|
-
|
|
1378
|
-
|
|
1405
|
+
const entryKey = existingKey ?? id;
|
|
1406
|
+
next.set(entryKey, {
|
|
1407
|
+
id: exists?.id ?? id,
|
|
1379
1408
|
title,
|
|
1380
1409
|
agent,
|
|
1381
1410
|
prompt,
|
|
@@ -1386,6 +1415,7 @@ function SubAgentPanel(props) {
|
|
|
1386
1415
|
startedAt: exists?.startedAt || Date.now(),
|
|
1387
1416
|
endedAt: ended ? exists?.endedAt || Date.now() : void 0
|
|
1388
1417
|
});
|
|
1418
|
+
if (entryKey !== id) next.delete(id);
|
|
1389
1419
|
}
|
|
1390
1420
|
}
|
|
1391
1421
|
}
|
|
@@ -1531,13 +1561,21 @@ function SubAgentPanel(props) {
|
|
|
1531
1561
|
return next;
|
|
1532
1562
|
});
|
|
1533
1563
|
};
|
|
1534
|
-
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
|
+
});
|
|
1535
1573
|
const expandedMaxLabelW = createMemo(() => {
|
|
1536
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")];
|
|
1537
1575
|
return Math.max(...labels.map((l) => visualWidth(l + ": ")));
|
|
1538
1576
|
});
|
|
1539
1577
|
const expandedPad = (label) => Math.max(0, expandedMaxLabelW() - visualWidth(label + ": "));
|
|
1540
|
-
const expandedValAvail = () => Math.max(6, panelWidth() - INDENT - expandedMaxLabelW());
|
|
1578
|
+
const expandedValAvail = () => Math.max(6, panelWidth() - gutter() - INDENT - expandedMaxLabelW());
|
|
1541
1579
|
const summaryParts = createMemo(() => {
|
|
1542
1580
|
if (!anyEntry()) return null;
|
|
1543
1581
|
const dot = "\u25CF";
|
|
@@ -1566,7 +1604,7 @@ function SubAgentPanel(props) {
|
|
|
1566
1604
|
if (!open()) return false;
|
|
1567
1605
|
const icon = "\u25BC";
|
|
1568
1606
|
const need = visualWidth(icon) + 1 + visualWidth(t("panel.title")) + versionW + summaryCols();
|
|
1569
|
-
return need <= panelWidth();
|
|
1607
|
+
return need <= panelWidth() - gutter();
|
|
1570
1608
|
});
|
|
1571
1609
|
const leftCols = createMemo(() => {
|
|
1572
1610
|
const icon = open() ? "\u25BC" : "\u25B6";
|
|
@@ -1576,25 +1614,36 @@ function SubAgentPanel(props) {
|
|
|
1576
1614
|
});
|
|
1577
1615
|
const spacerCols = createMemo(() => {
|
|
1578
1616
|
if (!anyEntry()) return 0;
|
|
1579
|
-
return Math.max(0, panelWidth() - leftCols() - summaryCols());
|
|
1617
|
+
return Math.max(0, panelWidth() - gutter() - leftCols() - summaryCols());
|
|
1580
1618
|
});
|
|
1581
|
-
const valueCols = (label) => Math.max(4, panelWidth() - INDENT - visualWidth(label + ": "));
|
|
1619
|
+
const valueCols = (label) => Math.max(4, panelWidth() - gutter() - INDENT - visualWidth(label + ": "));
|
|
1582
1620
|
return (() => {
|
|
1583
1621
|
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createElement("span"), _el$4 = _$createElement("span");
|
|
1584
1622
|
_$insertNode(_el$, _el$2);
|
|
1585
1623
|
var _ref$ = boxEl;
|
|
1586
1624
|
typeof _ref$ === "function" ? _$use(_ref$, _el$) : boxEl = _el$;
|
|
1587
|
-
_$
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
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);
|
|
1598
1647
|
_$insertNode(_el$2, _el$3);
|
|
1599
1648
|
_$insertNode(_el$2, _el$4);
|
|
1600
1649
|
_$setProp(_el$2, "onMouseUp", () => {
|
|
@@ -1791,7 +1840,7 @@ function SubAgentPanel(props) {
|
|
|
1791
1840
|
if (tk) w += visualWidth(tk);
|
|
1792
1841
|
return w;
|
|
1793
1842
|
};
|
|
1794
|
-
const labelAvail = () => Math.max(6, panelWidth() - LEFT_PAD - suffixW());
|
|
1843
|
+
const labelAvail = () => Math.max(6, panelWidth() - gutter() - LEFT_PAD - suffixW());
|
|
1795
1844
|
const labelText = () => {
|
|
1796
1845
|
const max2 = labelAvail();
|
|
1797
1846
|
const text = entry.title || entry.agent;
|
|
@@ -2188,7 +2237,7 @@ ${t("session.toast.copy_failed")}`, {
|
|
|
2188
2237
|
const cancelLabel = () => ` ${t("cancel.label")}`;
|
|
2189
2238
|
const dismissLabel = () => ` ${t("dismiss.label")}`;
|
|
2190
2239
|
const rightW = (isRunning ? visualWidth(dismissLabel()) : 0) + (isRunning && entry.sessionId ? visualWidth(cancelLabel()) : 0);
|
|
2191
|
-
const spacerW = () => Math.max(1, panelWidth() - openW() - rightW - 2);
|
|
2240
|
+
const spacerW = () => Math.max(1, panelWidth() - gutter() - openW() - rightW - 2);
|
|
2192
2241
|
return (() => {
|
|
2193
2242
|
var _el$91 = _$createElement("box"), _el$95 = _$createElement("text");
|
|
2194
2243
|
_$insertNode(_el$91, _el$95);
|
|
@@ -2289,7 +2338,7 @@ ${t("session.toast.copy_failed")}`, {
|
|
|
2289
2338
|
const showTop = props.sortOrder() === "desc" ? scrollOffset() > 0 : entryList().length > max() && clampedOffset() < entryList().length - max();
|
|
2290
2339
|
const left = showMore ? ` \u2193 ${hiddenBelow()} ${t("scroll.more")}` : " ";
|
|
2291
2340
|
const right = props.sortOrder() === "desc" ? `\u2191 ${t("scroll.top")}` : `\u2193 ${t("scroll.bottom")}`;
|
|
2292
|
-
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;
|
|
2293
2342
|
return (() => {
|
|
2294
2343
|
var _el$100 = _$createElement("box"), _el$101 = _$createElement("text"), _el$102 = _$createElement("span");
|
|
2295
2344
|
_$insertNode(_el$100, _el$101);
|
|
@@ -2392,6 +2441,9 @@ function createSidebarSlot(api, panelApi, sig) {
|
|
|
2392
2441
|
get scrollMode() {
|
|
2393
2442
|
return sig.scrollMode;
|
|
2394
2443
|
},
|
|
2444
|
+
get borderVisible() {
|
|
2445
|
+
return sig.borderVisible;
|
|
2446
|
+
},
|
|
2395
2447
|
get sessionId() {
|
|
2396
2448
|
return input.session_id;
|
|
2397
2449
|
}
|
|
@@ -2407,6 +2459,7 @@ var tui = async (api) => {
|
|
|
2407
2459
|
const [maxEntries, setMaxEntries] = createSignal3(parseInt(String(api.kv.get(`${KV_PREFIX}.max_entries`, "10")), 10) || 10);
|
|
2408
2460
|
const [sortOrder, setSortOrder] = createSignal3(String(api.kv.get(`${KV_PREFIX}.order`, "desc")) === "asc" ? "asc" : "desc");
|
|
2409
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);
|
|
2410
2463
|
const signals = {
|
|
2411
2464
|
lang,
|
|
2412
2465
|
setLang,
|
|
@@ -2416,6 +2469,8 @@ var tui = async (api) => {
|
|
|
2416
2469
|
setSortOrder,
|
|
2417
2470
|
scrollMode,
|
|
2418
2471
|
setScrollMode,
|
|
2472
|
+
borderVisible,
|
|
2473
|
+
setBorderVisible,
|
|
2419
2474
|
sessionId: ""
|
|
2420
2475
|
};
|
|
2421
2476
|
const v1Api = {
|
|
@@ -2899,6 +2954,23 @@ var tui = async (api) => {
|
|
|
2899
2954
|
}
|
|
2900
2955
|
}));
|
|
2901
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
|
+
}
|
|
2902
2974
|
}]);
|
|
2903
2975
|
};
|
|
2904
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 同一组件)
|