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/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.2";
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
- const m = /* @__PURE__ */ new Map();
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) m.set(e.id, e);
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 existing = entryMap().get(id2);
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: id2,
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 exists = next.get(id);
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 scanStMeta = st?.metadata;
1349
- const scanHasChild = scanStMeta?.session_id !== void 0 || scanStMeta?.sessionId !== void 0;
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
- next.set(id, {
1378
- id,
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 sep = () => "\u2500".repeat(Math.max(1, panelWidth()));
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
- _$setProp(_el$, "border", false);
1588
- _$setProp(_el$, "paddingTop", 0);
1589
- _$setProp(_el$, "paddingBottom", 0);
1590
- _$setProp(_el$, "paddingLeft", 0);
1591
- _$setProp(_el$, "paddingRight", 0);
1592
- _$setProp(_el$, "flexDirection", "column");
1593
- _$setProp(_el$, "gap", 0);
1594
- _$setProp(_el$, "onSizeChange", () => {
1595
- const w = boxEl ? Math.max(20, boxEl.width ?? 0) : 28;
1596
- setPanelWidth((prev) => prev === w ? prev : w);
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 = {
@@ -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 同一组件)