opencode-subagent-magazine 1.7.0 → 1.7.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.
Files changed (59) hide show
  1. package/dist/_version.d.ts +1 -1
  2. package/dist/core/kv.d.ts +1 -0
  3. package/dist/core/types.d.ts +8 -0
  4. package/dist/i18n.d.ts +5 -0
  5. package/dist/panel/SubAgentPanel.d.ts +1 -0
  6. package/dist/panel/entry-map.d.ts +1 -0
  7. package/dist/panel/panel-api.d.ts +16 -0
  8. package/dist/tui.js +385 -218
  9. package/dist/v2/db.d.ts +14 -1
  10. package/dist/v2.js +473 -223
  11. package/package.json +17 -4
  12. package/dist/_version.js +0 -2
  13. package/dist/clipboard.js +0 -85
  14. package/dist/core/color.js +0 -68
  15. package/dist/core/format.js +0 -113
  16. package/dist/core/index.js +0 -6
  17. package/dist/core/kv.js +0 -63
  18. package/dist/core/state-machine.js +0 -27
  19. package/dist/core/types.js +0 -2
  20. package/dist/core/usage.js +0 -1
  21. package/dist/i18n.js +0 -333
  22. package/dist/index.js +0 -511
  23. package/dist/panel/SubAgentPanel.js +0 -1572
  24. package/dist/panel/entry-map.js +0 -99
  25. package/dist/panel/panel-api.js +0 -1
  26. package/dist/panel/session-routing.js +0 -4
  27. package/dist/panel/store.js +0 -5
  28. package/dist/server.js +0 -14
  29. package/dist/v2/commands.js +0 -420
  30. package/dist/v2/db.js +0 -267
  31. package/dist/v2/index.js +0 -83
  32. package/dist/v2/settings-menu.js +0 -225
  33. package/dist/v2/theme.js +0 -12
  34. package/dist/v2/types.js +0 -6
  35. package/dist/v2/v2-panel-api.js +0 -612
  36. package/src/_version.ts +0 -2
  37. package/src/clipboard.ts +0 -134
  38. package/src/core/color.ts +0 -70
  39. package/src/core/format.ts +0 -105
  40. package/src/core/index.ts +0 -6
  41. package/src/core/kv.ts +0 -77
  42. package/src/core/state-machine.ts +0 -46
  43. package/src/core/types.ts +0 -72
  44. package/src/core/usage.ts +0 -16
  45. package/src/i18n.ts +0 -345
  46. package/src/index.tsx +0 -564
  47. package/src/panel/SubAgentPanel.tsx +0 -1802
  48. package/src/panel/entry-map.ts +0 -115
  49. package/src/panel/panel-api.ts +0 -83
  50. package/src/panel/session-routing.ts +0 -10
  51. package/src/panel/store.ts +0 -8
  52. package/src/server.ts +0 -19
  53. package/src/v2/commands.ts +0 -408
  54. package/src/v2/db.ts +0 -274
  55. package/src/v2/index.tsx +0 -144
  56. package/src/v2/settings-menu.ts +0 -241
  57. package/src/v2/theme.ts +0 -14
  58. package/src/v2/types.ts +0 -167
  59. package/src/v2/v2-panel-api.ts +0 -515
package/dist/v2.js CHANGED
@@ -17,6 +17,7 @@ var SETTING_KEYS = {
17
17
  showEntryTime: `${KV_PREFIX}.show_entry_time`,
18
18
  showEntryTokens: `${KV_PREFIX}.show_entry_tokens`,
19
19
  timeFormat: `${KV_PREFIX}.time_format`,
20
+ showOrigin: `${KV_PREFIX}.show_origin`,
20
21
  dbSync: `${KV_PREFIX}.db_sync`
21
22
  };
22
23
  function loadSessionData(kv) {
@@ -87,8 +88,17 @@ function contextTokens(tokens) {
87
88
  const sum = (Number(t.input) || 0) + (Number(t.output) || 0) + (Number(t.reasoning) || 0) + (Number(cache.read) || 0) + (Number(cache.write) || 0);
88
89
  return sum > 0 ? sum : void 0;
89
90
  }
91
+ function isSessionActive(input) {
92
+ const { timeIdle, lastMessageType, lastMessageAt } = input;
93
+ if (lastMessageType === "idle") return false;
94
+ if (lastMessageAt === void 0) return false;
95
+ if (timeIdle === void 0) return true;
96
+ return lastMessageAt > timeIdle;
97
+ }
90
98
  function statusOfChild(info) {
91
- if (!info || info.timeIdle == null) return void 0;
99
+ if (!info) return void 0;
100
+ if (info.active === true) return void 0;
101
+ if (info.timeIdle == null) return void 0;
92
102
  return info.idleOutcome === "interrupted" ? "cancelled" : "done";
93
103
  }
94
104
  function findDbPath(env = process.env, home = safeHomedir()) {
@@ -126,11 +136,19 @@ var LAST_ASSISTANT_SQL = `
126
136
  FROM session_message
127
137
  WHERE session_id = ? AND type = 'assistant' AND json_extract(data, '$.tokens.output') > 0
128
138
  ORDER BY seq DESC LIMIT 1`;
139
+ var LAST_MESSAGE_SQL = `
140
+ SELECT type, COALESCE(time_updated, time_created) AS at
141
+ FROM session_message WHERE session_id = ? ORDER BY seq DESC LIMIT 1`;
129
142
  var ASSISTANT_COST_SQL = `
130
143
  SELECT COUNT(*) AS n, SUM(COALESCE(json_extract(data, '$.cost'), 0)) AS total
131
144
  FROM session_message WHERE session_id = ? AND type = 'assistant'`;
132
145
  var CHILDREN_SQL = `
133
- SELECT id, agent, time_created FROM session_v2 WHERE parent_id = ? ORDER BY time_created`;
146
+ SELECT id, agent, title, model, cost,
147
+ tokens_input, tokens_output, tokens_reasoning, tokens_cache_read, tokens_cache_write,
148
+ time_created, time_idle, idle_outcome
149
+ FROM session_v2
150
+ WHERE parent_id = ? AND (fork_session_id IS NULL OR fork_session_id = '')
151
+ ORDER BY time_created`;
134
152
  var num = (v) => {
135
153
  const n = Number(v);
136
154
  return Number.isFinite(n) ? n : void 0;
@@ -233,6 +251,7 @@ function createSessionDbIndex(enabled) {
233
251
  const row = db.query(CHILD_INFO_SQL).get(sid);
234
252
  if (row) {
235
253
  const last = db.query(LAST_ASSISTANT_SQL).get(sid);
254
+ const lastMsg = db.query(LAST_MESSAGE_SQL).get(sid);
236
255
  let tokens = contextTokens(last ? {
237
256
  input: last.input,
238
257
  output: last.output,
@@ -258,7 +277,12 @@ function createSessionDbIndex(enabled) {
258
277
  tokens,
259
278
  timeCreated: num(row.time_created),
260
279
  timeIdle: num(row.time_idle),
261
- idleOutcome: str(row.idle_outcome)
280
+ idleOutcome: str(row.idle_outcome),
281
+ active: isSessionActive({
282
+ timeIdle: num(row.time_idle),
283
+ lastMessageType: str(lastMsg?.type),
284
+ lastMessageAt: num(lastMsg?.at)
285
+ })
262
286
  };
263
287
  }
264
288
  } catch {
@@ -267,7 +291,45 @@ function createSessionDbIndex(enabled) {
267
291
  infos.set(sid, { info: result, at: Date.now() });
268
292
  return result;
269
293
  };
270
- return { enabled: ready, resolveCall, matchChild, info };
294
+ const children = (parentId) => {
295
+ if (!ready() || !parentId) return void 0;
296
+ const now = Date.now();
297
+ let cached = childrenCache.get(parentId);
298
+ if (!cached || now - cached.at > CALL_MAP_TTL_MS) {
299
+ let list = [];
300
+ try {
301
+ list = db.query(CHILDREN_SQL).all(parentId);
302
+ } catch {
303
+ }
304
+ cached = { list, at: now };
305
+ childrenCache.set(parentId, cached);
306
+ }
307
+ const out = [];
308
+ for (const row of cached.list) {
309
+ const sid = str(row.id);
310
+ if (!sid) continue;
311
+ const full = info(sid);
312
+ if (full) {
313
+ out.push(full);
314
+ continue;
315
+ }
316
+ const agg = (num(row.tokens_input) || 0) + (num(row.tokens_output) || 0) + (num(row.tokens_reasoning) || 0) + (num(row.tokens_cache_read) || 0) + (num(row.tokens_cache_write) || 0);
317
+ out.push({
318
+ id: sid,
319
+ parentId,
320
+ agent: str(row.agent),
321
+ title: str(row.title),
322
+ model: modelIdOf(row.model),
323
+ cost: num(row.cost),
324
+ tokens: agg > 0 ? agg : void 0,
325
+ timeCreated: num(row.time_created),
326
+ timeIdle: num(row.time_idle),
327
+ idleOutcome: str(row.idle_outcome)
328
+ });
329
+ }
330
+ return out;
331
+ };
332
+ return { enabled: ready, resolveCall, matchChild, info, children };
271
333
  }
272
334
 
273
335
  // src/v2/v2-panel-api.ts
@@ -677,7 +739,9 @@ function createPanelApi(context, settings) {
677
739
  } catch {
678
740
  }
679
741
  try {
680
- if (statusOfChild(dbIndex?.info(sid)) !== void 0) return { type: "idle" };
742
+ const info = dbIndex?.info(sid);
743
+ if (info?.active === true) return { type: "busy" };
744
+ if (statusOfChild(info) !== void 0) return { type: "idle" };
681
745
  } catch {
682
746
  }
683
747
  return void 0;
@@ -708,6 +772,13 @@ function createPanelApi(context, settings) {
708
772
  } catch {
709
773
  return void 0;
710
774
  }
775
+ },
776
+ listChildren: (parentId) => {
777
+ try {
778
+ return dbIndex?.enabled() ? dbIndex.children(parentId) : void 0;
779
+ } catch {
780
+ return void 0;
781
+ }
711
782
  }
712
783
  },
713
784
  event: {
@@ -862,13 +933,17 @@ function safeErrorMsg(err) {
862
933
  }
863
934
 
864
935
  // src/_version.ts
865
- var PLUGIN_VERSION = "1.7.0";
936
+ var PLUGIN_VERSION = "1.7.2";
866
937
 
867
938
  // src/i18n.ts
868
939
  var ZH_T = {
869
940
  "panel.title": "\u5B50\u4EE3\u7406",
870
941
  "status.none": "\u6682\u65E0\u5B50\u4EE3\u7406",
871
942
  "agent.label": "\u4EE3\u7406",
943
+ "origin.label": "\u6765\u6E90",
944
+ "origin.tool": "\u5B50\u4EE3\u7406\u8C03\u7528",
945
+ "origin.sub": "\u884D\u751F\u4F1A\u8BDD",
946
+ "origin.background": "\u540E\u53F0",
872
947
  "status.label": "\u72B6\u6001",
873
948
  "time.label": "\u8017\u65F6",
874
949
  "tokens.label": "\u4E0A\u4E0B\u6587",
@@ -930,6 +1005,7 @@ var ZH_T = {
930
1005
  "settings.showEntryTime": "\u5217\u8868\u4E2D\u663E\u793A\u8017\u65F6",
931
1006
  "settings.showEntryTokens": "\u5217\u8868\u4E2D\u663E\u793A Token \u6570",
932
1007
  "settings.timeFormat": "\u65F6\u95F4\u683C\u5F0F",
1008
+ "settings.showOrigin": "\u5217\u8868\u663E\u793A\u6765\u6E90\u6807\u8BB0",
933
1009
  "settings.dbSync": "\u672C\u5730\u6570\u636E\u5E93\u8865\u5168",
934
1010
  "settings.on": "\u5F00",
935
1011
  "settings.off": "\u5173",
@@ -941,6 +1017,10 @@ var EN_T = {
941
1017
  "panel.title": "SubAgent",
942
1018
  "status.none": "No sub-agents yet",
943
1019
  "agent.label": "agent",
1020
+ "origin.label": "origin",
1021
+ "origin.tool": "sub-agent call",
1022
+ "origin.sub": "spawned session",
1023
+ "origin.background": "background",
944
1024
  "status.label": "status",
945
1025
  "time.label": "time",
946
1026
  "tokens.label": "tokens",
@@ -1001,6 +1081,7 @@ var EN_T = {
1001
1081
  "settings.showEntryCost": "Cost per sub-agent",
1002
1082
  "settings.showEntryTime": "Elapsed time in list",
1003
1083
  "settings.showEntryTokens": "Token count in list",
1084
+ "settings.showOrigin": "Origin indicators in list",
1004
1085
  "settings.timeFormat": "Time format",
1005
1086
  "settings.dbSync": "Local database enrichment",
1006
1087
  "settings.on": "on",
@@ -1013,6 +1094,10 @@ var JA_T = {
1013
1094
  "panel.title": "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8",
1014
1095
  "status.none": "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306A\u3057",
1015
1096
  "agent.label": "\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8",
1097
+ "origin.label": "\u767A\u751F\u5143",
1098
+ "origin.tool": "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u547C\u3073\u51FA\u3057",
1099
+ "origin.sub": "\u751F\u6210\u3055\u308C\u305F\u30BB\u30C3\u30B7\u30E7\u30F3",
1100
+ "origin.background": "\u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9",
1016
1101
  "status.label": "\u72B6\u614B",
1017
1102
  "time.label": "\u6642\u9593",
1018
1103
  "tokens.label": "\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8",
@@ -1073,6 +1158,7 @@ var JA_T = {
1073
1158
  "settings.showEntryCost": "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u6BCE\u306E\u8CBB\u7528",
1074
1159
  "settings.showEntryTime": "\u4E00\u89A7\u306B\u6240\u8981\u6642\u9593\u3092\u8868\u793A",
1075
1160
  "settings.showEntryTokens": "\u4E00\u89A7\u306B\u30C8\u30FC\u30AF\u30F3\u6570\u3092\u8868\u793A",
1161
+ "settings.showOrigin": "\u4E00\u89A7\u306B\u7531\u6765\u30DE\u30FC\u30AF\u3092\u8868\u793A",
1076
1162
  "settings.timeFormat": "\u6642\u9593\u5F62\u5F0F",
1077
1163
  "settings.dbSync": "\u30ED\u30FC\u30AB\u30EBDB\u88DC\u5B8C",
1078
1164
  "settings.on": "\u30AA\u30F3",
@@ -1085,6 +1171,10 @@ var KO_T = {
1085
1171
  "panel.title": "\uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8",
1086
1172
  "status.none": "\uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8 \uC5C6\uC74C",
1087
1173
  "agent.label": "\uC5D0\uC774\uC804\uD2B8",
1174
+ "origin.label": "\uCD9C\uCC98",
1175
+ "origin.tool": "\uD558\uC704 \uC5D0\uC774\uC804\uD2B8 \uD638\uCD9C",
1176
+ "origin.sub": "\uC0DD\uC131\uB41C \uC138\uC158",
1177
+ "origin.background": "\uBC31\uADF8\uB77C\uC6B4\uB4DC",
1088
1178
  "status.label": "\uC0C1\uD0DC",
1089
1179
  "time.label": "\uC2DC\uAC04",
1090
1180
  "tokens.label": "\uCEE8\uD14D\uC2A4\uD2B8",
@@ -1145,6 +1235,7 @@ var KO_T = {
1145
1235
  "settings.showEntryCost": "\uD558\uC704 \uC5D0\uC774\uC804\uD2B8\uBCC4 \uBE44\uC6A9",
1146
1236
  "settings.showEntryTime": "\uBAA9\uB85D\uC5D0 \uC18C\uC694 \uC2DC\uAC04 \uD45C\uC2DC",
1147
1237
  "settings.showEntryTokens": "\uBAA9\uB85D\uC5D0 \uD1A0\uD070 \uC218 \uD45C\uC2DC",
1238
+ "settings.showOrigin": "\uBAA9\uB85D\uC5D0 \uCD9C\uCC98 \uC544\uC774\uCF58 \uD45C\uC2DC",
1148
1239
  "settings.timeFormat": "\uC2DC\uAC04 \uD615\uC2DD",
1149
1240
  "settings.dbSync": "\uB85C\uCEEC DB \uBCF4\uC644",
1150
1241
  "settings.on": "\uCF2C",
@@ -1207,7 +1298,7 @@ function upsertSubEntry(entries, partial, now = Date.now()) {
1207
1298
  ...partial,
1208
1299
  id: existing?.id ?? partial.id,
1209
1300
  startedAt: existing?.startedAt || partial.startedAt || now,
1210
- endedAt: ended ? existing?.endedAt || now : void 0
1301
+ endedAt: ended ? existing?.endedAt ?? partial.endedAt ?? now : void 0
1211
1302
  });
1212
1303
  return next;
1213
1304
  }
@@ -1300,6 +1391,7 @@ async function runSettingsMenu(context, api, signals) {
1300
1391
  { title: t("settings.showEntryTime"), value: "time", description: onOff(signals.showEntryTime()), category },
1301
1392
  { title: t("settings.timeFormat"), value: "timefmt", description: TIME_FORMAT_SAMPLES[signals.timeFormat()], category },
1302
1393
  { title: t("settings.showEntryTokens"), value: "tokens", description: onOff(signals.showEntryTokens()), category },
1394
+ { title: t("settings.showOrigin"), value: "origin", description: onOff(signals.showOrigin()), category },
1303
1395
  { title: t("settings.dbSync"), value: "dbsync", description: onOff(signals.dbSync()), category },
1304
1396
  { title: t("settings.close"), value: "close" }
1305
1397
  ]
@@ -1448,6 +1540,21 @@ async function runSettingsMenu(context, api, signals) {
1448
1540
  toast(t("settings.showEntryTokens"), onOff(picked));
1449
1541
  }
1450
1542
  }
1543
+ if (choice === "origin") {
1544
+ const picked = await context.ui.dialog.select({
1545
+ title: t("settings.showOrigin"),
1546
+ options: [
1547
+ { title: t("settings.on"), value: true },
1548
+ { title: t("settings.off"), value: false }
1549
+ ],
1550
+ current: signals.showOrigin()
1551
+ });
1552
+ if (picked !== void 0) {
1553
+ signals.setShowOrigin(picked);
1554
+ kv.set(SETTING_KEYS.showOrigin, picked);
1555
+ toast(t("settings.showOrigin"), onOff(picked));
1556
+ }
1557
+ }
1451
1558
  if (choice === "dbsync") {
1452
1559
  const picked = await context.ui.dialog.select({
1453
1560
  title: t("settings.dbSync"),
@@ -1578,6 +1685,7 @@ function makeCommands(context, api, signals) {
1578
1685
  `${t("settings.showEntryCost")}: ${onOff(signals.showEntryCost())}`,
1579
1686
  `${t("settings.showEntryTime")}: ${onOff(signals.showEntryTime())}`,
1580
1687
  `${t("settings.showEntryTokens")}: ${onOff(signals.showEntryTokens())}`,
1688
+ `${t("settings.showOrigin")}: ${onOff(signals.showOrigin())}`,
1581
1689
  `${t("settings.timeFormat")}: ${TIME_FORMAT_SAMPLES[signals.timeFormat()]}`,
1582
1690
  `${t("settings.dbSync")}: ${onOff(signals.dbSync())}`
1583
1691
  ].join("\n");
@@ -1651,6 +1759,19 @@ function makeCommands(context, api, signals) {
1651
1759
  api.ui.toast(`${t("settings.showEntryTokens")}: ${onOff(v)}`);
1652
1760
  }
1653
1761
  },
1762
+ {
1763
+ id: "opencode-subagent-magazine.subagent.origin",
1764
+ title: "SubAgent Magazine: Toggle Origin Indicators",
1765
+ description: "Show or hide origin markers (\u21E2 background / \u21B3 spawned) in the sidebar list",
1766
+ slash: { name: "subagent-origin" },
1767
+ palette: true,
1768
+ run: () => {
1769
+ const v = !signals.showOrigin();
1770
+ signals.setShowOrigin(v);
1771
+ kv.set(SETTING_KEYS.showOrigin, v);
1772
+ api.ui.toast(`${t("settings.showOrigin")}: ${onOff(v)}`);
1773
+ }
1774
+ },
1654
1775
  {
1655
1776
  id: "opencode-subagent-magazine.subagent.db",
1656
1777
  title: "SubAgent Magazine: Toggle Local DB",
@@ -1983,6 +2104,11 @@ async function copyText(text) {
1983
2104
 
1984
2105
  // src/core/types.ts
1985
2106
  var SUBAGENT_TOOLS = /* @__PURE__ */ new Set(["task", "subagent", "delegate", "call_omo_agent"]);
2107
+ function isBackgroundInput(input) {
2108
+ if (!input || typeof input !== "object") return false;
2109
+ const i = input;
2110
+ return i.background === true || i.run_in_background === true;
2111
+ }
1986
2112
 
1987
2113
  // src/core/color.ts
1988
2114
  function rgb(raw) {
@@ -2438,7 +2564,8 @@ function SubAgentPanel(props) {
2438
2564
  prompt,
2439
2565
  sessionId: subSid,
2440
2566
  status: "running",
2441
- model: modelId
2567
+ model: modelId,
2568
+ origin: "sub"
2442
2569
  });
2443
2570
  }
2444
2571
  if (part.type === "tool") {
@@ -2461,7 +2588,9 @@ function SubAgentPanel(props) {
2461
2588
  agent: existing.agent,
2462
2589
  prompt: existing.prompt,
2463
2590
  sessionId: existing.sessionId ?? errorSid,
2464
- status: "error"
2591
+ status: "error",
2592
+ origin: "tool",
2593
+ background: isBackgroundInput(st?.input)
2465
2594
  });
2466
2595
  }
2467
2596
  return;
@@ -2469,7 +2598,7 @@ function SubAgentPanel(props) {
2469
2598
  const input = st?.input;
2470
2599
  let status = "running";
2471
2600
  if (rawStatus === "completed") status = "done";
2472
- if ((input?.run_in_background === true || input?.background === true) && status === "done") {
2601
+ if (isBackgroundInput(input) && status === "done") {
2473
2602
  const stMetaCheck = partMetadata(part, st);
2474
2603
  const hasChild = stMetaCheck?.session_id !== void 0 || stMetaCheck?.sessionId !== void 0;
2475
2604
  if (hasChild) status = "running";
@@ -2487,7 +2616,9 @@ function SubAgentPanel(props) {
2487
2616
  agent,
2488
2617
  prompt,
2489
2618
  sessionId: subSid,
2490
- status
2619
+ status,
2620
+ origin: "tool",
2621
+ background: isBackgroundInput(input)
2491
2622
  });
2492
2623
  }
2493
2624
  };
@@ -2848,7 +2979,7 @@ function SubAgentPanel(props) {
2848
2979
  if (settled && !needsRepair) continue;
2849
2980
  let status = "running";
2850
2981
  if (rawStatus === "completed") status = "done";
2851
- if ((scanInput?.run_in_background === true || scanInput?.background === true) && status === "done") {
2982
+ if (isBackgroundInput(scanInput) && status === "done") {
2852
2983
  if (scanSubSid !== void 0) status = "running";
2853
2984
  }
2854
2985
  if (status === "done" && scanSubSid) {
@@ -2897,7 +3028,9 @@ function SubAgentPanel(props) {
2897
3028
  sessionId: exists?.sessionId ?? scanSubSid,
2898
3029
  status,
2899
3030
  startedAt: exists?.startedAt || Date.now(),
2900
- endedAt: exists?.endedAt ?? (status === "done" ? Date.now() : void 0)
3031
+ endedAt: exists?.endedAt ?? (status === "done" ? Date.now() : void 0),
3032
+ origin: "tool",
3033
+ background: isBackgroundInput(scanInput) || exists?.background === true
2901
3034
  });
2902
3035
  if (entryKey !== id) next.delete(id);
2903
3036
  }
@@ -2939,7 +3072,7 @@ function SubAgentPanel(props) {
2939
3072
  const entry = key ? map.get(key) : void 0;
2940
3073
  if (!entry) return true;
2941
3074
  const input = st?.input;
2942
- const isBackground = input?.background === true || input?.run_in_background === true;
3075
+ const isBackground = isBackgroundInput(input);
2943
3076
  const stillRunning = entry.status === "running" || entry.status === "cancel_requested";
2944
3077
  if (rawStatus === "completed" && !isBackground && stillRunning) return true;
2945
3078
  }
@@ -2975,6 +3108,60 @@ function SubAgentPanel(props) {
2975
3108
  setEntryMapRaw((prev) => {
2976
3109
  let changed = false;
2977
3110
  const next = new Map(prev);
3111
+ if (tick % 4 === 0) {
3112
+ try {
3113
+ const children = props.api.session.listChildren?.(props.sessionId);
3114
+ if (children) {
3115
+ const linked = /* @__PURE__ */ new Set();
3116
+ for (const e of next.values()) if (e.sessionId) linked.add(e.sessionId);
3117
+ const {
3118
+ parentSid,
3119
+ isChild
3120
+ } = resolveParent(props.sessionId);
3121
+ const rec = loadSessionData2()[parentSid];
3122
+ const cleared = new Set(isChild ? rec?.children?.[props.sessionId]?.clearedIds : rec?.clearedIds);
3123
+ for (const child of children) {
3124
+ if (!child.id || linked.has(child.id)) continue;
3125
+ const id = `sub:${child.id}`;
3126
+ if (cleared.has(id)) continue;
3127
+ const finished = child.timeIdle != null && child.active !== true;
3128
+ const status = finished ? child.idleOutcome === "interrupted" ? "cancelled" : "done" : "running";
3129
+ next.set(id, {
3130
+ id,
3131
+ title: child.title ?? child.agent ?? "",
3132
+ agent: child.agent ?? "?",
3133
+ prompt: "",
3134
+ status,
3135
+ sessionId: child.id,
3136
+ startedAt: child.timeCreated ?? Date.now(),
3137
+ endedAt: finished ? child.timeIdle : void 0,
3138
+ tokens: child.tokens,
3139
+ cost: child.cost,
3140
+ model: child.model,
3141
+ origin: "sub"
3142
+ });
3143
+ changed = true;
3144
+ }
3145
+ }
3146
+ } catch {
3147
+ }
3148
+ for (const [id, entry] of next) {
3149
+ if (entry.status !== "done" && entry.status !== "error") continue;
3150
+ const sid = entry.sessionId;
3151
+ if (!sid) continue;
3152
+ try {
3153
+ if (props.api.session.status(sid)?.type === "busy") {
3154
+ next.set(id, {
3155
+ ...entry,
3156
+ status: "running",
3157
+ endedAt: void 0
3158
+ });
3159
+ changed = true;
3160
+ }
3161
+ } catch {
3162
+ }
3163
+ }
3164
+ }
2978
3165
  const candidates = [];
2979
3166
  for (const [id, entry] of next) {
2980
3167
  const running = entry.status === "running" || entry.status === "cancel_requested";
@@ -3541,6 +3728,12 @@ function SubAgentPanel(props) {
3541
3728
  const tokenText = () => !isExpanded() && props.showEntryTokens() && entry.tokens !== void 0 && entry.tokens > 0 ? ` ${fmtTokens(entry.tokens)}` : "";
3542
3729
  const costText = () => !isExpanded() && props.showEntryCost() && entry.cost !== void 0 && entry.cost > 0 ? ` $${entry.cost.toFixed(4)}` : "";
3543
3730
  const timeText = () => !isExpanded() && props.showEntryTime() && (elapsed() >= 2e3 || entry.endedAt !== void 0) ? fmtDuration(elapsed(), isActiveRunning, props.timeFormat()) : "";
3731
+ const originMark = () => {
3732
+ if (!props.showOrigin()) return "";
3733
+ if (entry.origin === "sub") return "\u21B3";
3734
+ return entry.background === true ? "\u21E2" : "";
3735
+ };
3736
+ const originW = () => originMark() ? 2 : 0;
3544
3737
  const suffixW = () => {
3545
3738
  let w = 0;
3546
3739
  const t2 = timeText();
@@ -3551,7 +3744,7 @@ function SubAgentPanel(props) {
3551
3744
  if (c) w += visualWidth(c);
3552
3745
  return w;
3553
3746
  };
3554
- const labelAvail = () => Math.max(6, panelWidth() - gutter() - LEFT_PAD - suffixW());
3747
+ const labelAvail = () => Math.max(6, panelWidth() - gutter() - LEFT_PAD - originW() - suffixW());
3555
3748
  const labelText = () => {
3556
3749
  const max2 = labelAvail();
3557
3750
  const text = entry.title || entry.agent;
@@ -3569,38 +3762,49 @@ function SubAgentPanel(props) {
3569
3762
  _$setProp(_el$25, "onMouseUp", () => toggleExpand(entry.id));
3570
3763
  _$insert(_el$26, () => isExpanded() ? "\u25BC" : "\u25B6");
3571
3764
  _$insert(_el$28, statusDot);
3765
+ _$insert(_el$25, (() => {
3766
+ var _c$2 = _$memo(() => !!originMark());
3767
+ return () => _c$2() ? (() => {
3768
+ var _el$88 = _$createElement("span");
3769
+ _$insert(_el$88, () => originMark() + " ");
3770
+ _$effect((_$p) => _$setProp(_el$88, "style", {
3771
+ fg: pal().muted
3772
+ }, _$p));
3773
+ return _el$88;
3774
+ })() : null;
3775
+ })(), _el$30);
3572
3776
  _$insert(_el$30, labelText);
3573
3777
  _$insert(_el$25, (() => {
3574
- var _c$2 = _$memo(() => !!timeText());
3575
- return () => _c$2() ? [" ", (() => {
3576
- var _el$82 = _$createElement("span");
3577
- _$insert(_el$82, timeText);
3578
- _$effect((_$p) => _$setProp(_el$82, "style", {
3778
+ var _c$3 = _$memo(() => !!timeText());
3779
+ return () => _c$3() ? [" ", (() => {
3780
+ var _el$89 = _$createElement("span");
3781
+ _$insert(_el$89, timeText);
3782
+ _$effect((_$p) => _$setProp(_el$89, "style", {
3579
3783
  fg: timeColor()
3580
3784
  }, _$p));
3581
- return _el$82;
3785
+ return _el$89;
3582
3786
  })()] : null;
3583
3787
  })(), null);
3584
3788
  _$insert(_el$25, (() => {
3585
- var _c$3 = _$memo(() => !!tokenText());
3586
- return () => _c$3() ? (() => {
3587
- var _el$83 = _$createElement("span");
3588
- _$insert(_el$83, tokenText);
3589
- _$effect((_$p) => _$setProp(_el$83, "style", {
3789
+ var _c$4 = _$memo(() => !!tokenText());
3790
+ return () => _c$4() ? (() => {
3791
+ var _el$90 = _$createElement("span");
3792
+ _$insert(_el$90, tokenText);
3793
+ _$effect((_$p) => _$setProp(_el$90, "style", {
3590
3794
  fg: pal().muted
3591
3795
  }, _$p));
3592
- return _el$83;
3796
+ return _el$90;
3593
3797
  })() : null;
3594
3798
  })(), null);
3595
3799
  _$insert(_el$25, (() => {
3596
- var _c$4 = _$memo(() => !!costText());
3597
- return () => _c$4() ? (() => {
3598
- var _el$84 = _$createElement("span");
3599
- _$insert(_el$84, costText);
3600
- _$effect((_$p) => _$setProp(_el$84, "style", {
3800
+ var _c$5 = _$memo(() => !!costText());
3801
+ return () => _c$5() ? (() => {
3802
+ var _el$91 = _$createElement("span");
3803
+ _$insert(_el$91, costText);
3804
+ _$effect((_$p) => _$setProp(_el$91, "style", {
3601
3805
  fg: pal().warning
3602
3806
  }, _$p));
3603
- return _el$84;
3807
+ return _el$91;
3604
3808
  })() : null;
3605
3809
  })(), null);
3606
3810
  _$effect((_p$) => {
@@ -3654,70 +3858,77 @@ function SubAgentPanel(props) {
3654
3858
  a: void 0
3655
3859
  });
3656
3860
  return _el$31;
3657
- })(), (() => {
3658
- var _el$37 = _$createElement("text"), _el$38 = _$createTextNode(` `), _el$39 = _$createElement("span"), _el$40 = _$createTextNode(`: `), _el$41 = _$createElement("span"), _el$42 = _$createElement("span");
3659
- _$insertNode(_el$37, _el$38);
3660
- _$insertNode(_el$37, _el$39);
3661
- _$insertNode(_el$37, _el$41);
3662
- _$insertNode(_el$37, _el$42);
3663
- _$insertNode(_el$39, _el$40);
3664
- _$insert(_el$39, () => t("status.label"), _el$40);
3665
- _$insert(_el$41, () => " ".repeat(expandedPad(t("status.label"))));
3666
- _$insert(_el$42, () => isActiveRunning ? t("status.running") : isCancelled ? t("status.cancelled") : isError ? t("status.error") : t("status.done"));
3667
- _$effect((_p$) => {
3668
- var _v$9 = {
3669
- fg: pal().primary
3670
- }, _v$0 = {
3671
- fg: pal().muted
3672
- }, _v$1 = {
3673
- fg: isActiveRunning ? pal().warning : isCancelled ? pal().muted : isError ? pal().error : pal().success
3674
- };
3675
- _v$9 !== _p$.e && (_p$.e = _$setProp(_el$39, "style", _v$9, _p$.e));
3676
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$41, "style", _v$0, _p$.t));
3677
- _v$1 !== _p$.a && (_p$.a = _$setProp(_el$42, "style", _v$1, _p$.a));
3678
- return _p$;
3679
- }, {
3680
- e: void 0,
3681
- t: void 0,
3682
- a: void 0
3683
- });
3684
- return _el$37;
3685
3861
  })(), _$createComponent(Show, {
3686
3862
  get when() {
3687
- return elapsed() >= 2e3 || entry.endedAt !== void 0;
3863
+ return props.showOrigin();
3688
3864
  },
3689
3865
  get children() {
3690
- var _el$43 = _$createElement("text"), _el$44 = _$createTextNode(` `), _el$45 = _$createElement("span"), _el$46 = _$createTextNode(`: `), _el$47 = _$createElement("span"), _el$48 = _$createElement("span");
3691
- _$insertNode(_el$43, _el$44);
3692
- _$insertNode(_el$43, _el$45);
3693
- _$insertNode(_el$43, _el$47);
3694
- _$insertNode(_el$43, _el$48);
3695
- _$insertNode(_el$45, _el$46);
3696
- _$insert(_el$45, () => t("time.label"), _el$46);
3697
- _$insert(_el$47, () => " ".repeat(expandedPad(t("time.label"))));
3698
- _$insert(_el$48, () => fmtDuration(elapsed(), isActiveRunning, props.timeFormat()));
3866
+ var _el$37 = _$createElement("text"), _el$38 = _$createTextNode(` `), _el$39 = _$createElement("span"), _el$40 = _$createTextNode(`: `), _el$41 = _$createElement("span"), _el$42 = _$createElement("span");
3867
+ _$insertNode(_el$37, _el$38);
3868
+ _$insertNode(_el$37, _el$39);
3869
+ _$insertNode(_el$37, _el$41);
3870
+ _$insertNode(_el$37, _el$42);
3871
+ _$insertNode(_el$39, _el$40);
3872
+ _$insert(_el$39, () => t("origin.label"), _el$40);
3873
+ _$insert(_el$41, () => " ".repeat(expandedPad(t("origin.label"))));
3874
+ _$insert(_el$42, (() => {
3875
+ var _c$6 = _$memo(() => entry.origin === "sub");
3876
+ return () => _c$6() ? t("origin.sub") : t("origin.tool");
3877
+ })(), null);
3878
+ _$insert(_el$42, (() => {
3879
+ var _c$7 = _$memo(() => entry.background === true);
3880
+ return () => _c$7() ? ` (${t("origin.background")})` : "";
3881
+ })(), null);
3699
3882
  _$effect((_p$) => {
3700
- var _v$10 = {
3883
+ var _v$9 = {
3701
3884
  fg: pal().primary
3702
- }, _v$11 = {
3885
+ }, _v$0 = {
3703
3886
  fg: pal().muted
3704
- }, _v$12 = {
3887
+ }, _v$1 = {
3705
3888
  fg: pal().muted
3706
3889
  };
3707
- _v$10 !== _p$.e && (_p$.e = _$setProp(_el$45, "style", _v$10, _p$.e));
3708
- _v$11 !== _p$.t && (_p$.t = _$setProp(_el$47, "style", _v$11, _p$.t));
3709
- _v$12 !== _p$.a && (_p$.a = _$setProp(_el$48, "style", _v$12, _p$.a));
3890
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$39, "style", _v$9, _p$.e));
3891
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$41, "style", _v$0, _p$.t));
3892
+ _v$1 !== _p$.a && (_p$.a = _$setProp(_el$42, "style", _v$1, _p$.a));
3710
3893
  return _p$;
3711
3894
  }, {
3712
3895
  e: void 0,
3713
3896
  t: void 0,
3714
3897
  a: void 0
3715
3898
  });
3716
- return _el$43;
3899
+ return _el$37;
3717
3900
  }
3718
- }), _$createComponent(Show, {
3901
+ }), (() => {
3902
+ var _el$43 = _$createElement("text"), _el$44 = _$createTextNode(` `), _el$45 = _$createElement("span"), _el$46 = _$createTextNode(`: `), _el$47 = _$createElement("span"), _el$48 = _$createElement("span");
3903
+ _$insertNode(_el$43, _el$44);
3904
+ _$insertNode(_el$43, _el$45);
3905
+ _$insertNode(_el$43, _el$47);
3906
+ _$insertNode(_el$43, _el$48);
3907
+ _$insertNode(_el$45, _el$46);
3908
+ _$insert(_el$45, () => t("status.label"), _el$46);
3909
+ _$insert(_el$47, () => " ".repeat(expandedPad(t("status.label"))));
3910
+ _$insert(_el$48, () => isActiveRunning ? t("status.running") : isCancelled ? t("status.cancelled") : isError ? t("status.error") : t("status.done"));
3911
+ _$effect((_p$) => {
3912
+ var _v$10 = {
3913
+ fg: pal().primary
3914
+ }, _v$11 = {
3915
+ fg: pal().muted
3916
+ }, _v$12 = {
3917
+ fg: isActiveRunning ? pal().warning : isCancelled ? pal().muted : isError ? pal().error : pal().success
3918
+ };
3919
+ _v$10 !== _p$.e && (_p$.e = _$setProp(_el$45, "style", _v$10, _p$.e));
3920
+ _v$11 !== _p$.t && (_p$.t = _$setProp(_el$47, "style", _v$11, _p$.t));
3921
+ _v$12 !== _p$.a && (_p$.a = _$setProp(_el$48, "style", _v$12, _p$.a));
3922
+ return _p$;
3923
+ }, {
3924
+ e: void 0,
3925
+ t: void 0,
3926
+ a: void 0
3927
+ });
3928
+ return _el$43;
3929
+ })(), _$createComponent(Show, {
3719
3930
  get when() {
3720
- return entry.tokens !== void 0;
3931
+ return elapsed() >= 2e3 || entry.endedAt !== void 0;
3721
3932
  },
3722
3933
  get children() {
3723
3934
  var _el$49 = _$createElement("text"), _el$50 = _$createTextNode(` `), _el$51 = _$createElement("span"), _el$52 = _$createTextNode(`: `), _el$53 = _$createElement("span"), _el$54 = _$createElement("span");
@@ -3726,9 +3937,9 @@ function SubAgentPanel(props) {
3726
3937
  _$insertNode(_el$49, _el$53);
3727
3938
  _$insertNode(_el$49, _el$54);
3728
3939
  _$insertNode(_el$51, _el$52);
3729
- _$insert(_el$51, () => t("tokens.label"), _el$52);
3730
- _$insert(_el$53, () => " ".repeat(expandedPad(t("tokens.label"))));
3731
- _$insert(_el$54, () => fmtTokens(entry.tokens));
3940
+ _$insert(_el$51, () => t("time.label"), _el$52);
3941
+ _$insert(_el$53, () => " ".repeat(expandedPad(t("time.label"))));
3942
+ _$insert(_el$54, () => fmtDuration(elapsed(), isActiveRunning, props.timeFormat()));
3732
3943
  _$effect((_p$) => {
3733
3944
  var _v$13 = {
3734
3945
  fg: pal().primary
@@ -3750,7 +3961,7 @@ function SubAgentPanel(props) {
3750
3961
  }
3751
3962
  }), _$createComponent(Show, {
3752
3963
  get when() {
3753
- return entry.error;
3964
+ return entry.tokens !== void 0;
3754
3965
  },
3755
3966
  get children() {
3756
3967
  var _el$55 = _$createElement("text"), _el$56 = _$createTextNode(` `), _el$57 = _$createElement("span"), _el$58 = _$createTextNode(`: `), _el$59 = _$createElement("span"), _el$60 = _$createElement("span");
@@ -3759,16 +3970,16 @@ function SubAgentPanel(props) {
3759
3970
  _$insertNode(_el$55, _el$59);
3760
3971
  _$insertNode(_el$55, _el$60);
3761
3972
  _$insertNode(_el$57, _el$58);
3762
- _$insert(_el$57, () => t("error.label"), _el$58);
3763
- _$insert(_el$59, () => " ".repeat(expandedPad(t("error.label"))));
3764
- _$insert(_el$60, () => truncate(String(entry.error), expandedValAvail()));
3973
+ _$insert(_el$57, () => t("tokens.label"), _el$58);
3974
+ _$insert(_el$59, () => " ".repeat(expandedPad(t("tokens.label"))));
3975
+ _$insert(_el$60, () => fmtTokens(entry.tokens));
3765
3976
  _$effect((_p$) => {
3766
3977
  var _v$16 = {
3767
- fg: pal().error
3978
+ fg: pal().primary
3768
3979
  }, _v$17 = {
3769
3980
  fg: pal().muted
3770
3981
  }, _v$18 = {
3771
- fg: pal().error
3982
+ fg: pal().muted
3772
3983
  };
3773
3984
  _v$16 !== _p$.e && (_p$.e = _$setProp(_el$57, "style", _v$16, _p$.e));
3774
3985
  _v$17 !== _p$.t && (_p$.t = _$setProp(_el$59, "style", _v$17, _p$.t));
@@ -3781,6 +3992,39 @@ function SubAgentPanel(props) {
3781
3992
  });
3782
3993
  return _el$55;
3783
3994
  }
3995
+ }), _$createComponent(Show, {
3996
+ get when() {
3997
+ return entry.error;
3998
+ },
3999
+ get children() {
4000
+ var _el$61 = _$createElement("text"), _el$62 = _$createTextNode(` `), _el$63 = _$createElement("span"), _el$64 = _$createTextNode(`: `), _el$65 = _$createElement("span"), _el$66 = _$createElement("span");
4001
+ _$insertNode(_el$61, _el$62);
4002
+ _$insertNode(_el$61, _el$63);
4003
+ _$insertNode(_el$61, _el$65);
4004
+ _$insertNode(_el$61, _el$66);
4005
+ _$insertNode(_el$63, _el$64);
4006
+ _$insert(_el$63, () => t("error.label"), _el$64);
4007
+ _$insert(_el$65, () => " ".repeat(expandedPad(t("error.label"))));
4008
+ _$insert(_el$66, () => truncate(String(entry.error), expandedValAvail()));
4009
+ _$effect((_p$) => {
4010
+ var _v$19 = {
4011
+ fg: pal().error
4012
+ }, _v$20 = {
4013
+ fg: pal().muted
4014
+ }, _v$21 = {
4015
+ fg: pal().error
4016
+ };
4017
+ _v$19 !== _p$.e && (_p$.e = _$setProp(_el$63, "style", _v$19, _p$.e));
4018
+ _v$20 !== _p$.t && (_p$.t = _$setProp(_el$65, "style", _v$20, _p$.t));
4019
+ _v$21 !== _p$.a && (_p$.a = _$setProp(_el$66, "style", _v$21, _p$.a));
4020
+ return _p$;
4021
+ }, {
4022
+ e: void 0,
4023
+ t: void 0,
4024
+ a: void 0
4025
+ });
4026
+ return _el$61;
4027
+ }
3784
4028
  }), _$createComponent(Show, {
3785
4029
  get when() {
3786
4030
  return entry.cost !== void 0;
@@ -3789,34 +4033,34 @@ function SubAgentPanel(props) {
3789
4033
  return (() => {
3790
4034
  const cost = entry.cost;
3791
4035
  return (() => {
3792
- var _el$85 = _$createElement("text"), _el$86 = _$createTextNode(` `), _el$87 = _$createElement("span"), _el$88 = _$createTextNode(`: `), _el$89 = _$createElement("span"), _el$90 = _$createElement("span"), _el$91 = _$createTextNode(`$`);
3793
- _$insertNode(_el$85, _el$86);
3794
- _$insertNode(_el$85, _el$87);
3795
- _$insertNode(_el$85, _el$89);
3796
- _$insertNode(_el$85, _el$90);
3797
- _$insertNode(_el$87, _el$88);
3798
- _$insert(_el$87, () => t("cost.label"), _el$88);
3799
- _$insert(_el$89, () => " ".repeat(expandedPad(t("cost.label"))));
3800
- _$insertNode(_el$90, _el$91);
3801
- _$insert(_el$90, () => cost.toFixed(4), null);
4036
+ var _el$92 = _$createElement("text"), _el$93 = _$createTextNode(` `), _el$94 = _$createElement("span"), _el$95 = _$createTextNode(`: `), _el$96 = _$createElement("span"), _el$97 = _$createElement("span"), _el$98 = _$createTextNode(`$`);
4037
+ _$insertNode(_el$92, _el$93);
4038
+ _$insertNode(_el$92, _el$94);
4039
+ _$insertNode(_el$92, _el$96);
4040
+ _$insertNode(_el$92, _el$97);
4041
+ _$insertNode(_el$94, _el$95);
4042
+ _$insert(_el$94, () => t("cost.label"), _el$95);
4043
+ _$insert(_el$96, () => " ".repeat(expandedPad(t("cost.label"))));
4044
+ _$insertNode(_el$97, _el$98);
4045
+ _$insert(_el$97, () => cost.toFixed(4), null);
3802
4046
  _$effect((_p$) => {
3803
- var _v$29 = {
4047
+ var _v$32 = {
3804
4048
  fg: pal().primary
3805
- }, _v$30 = {
4049
+ }, _v$33 = {
3806
4050
  fg: pal().muted
3807
- }, _v$31 = {
4051
+ }, _v$34 = {
3808
4052
  fg: pal().muted
3809
4053
  };
3810
- _v$29 !== _p$.e && (_p$.e = _$setProp(_el$87, "style", _v$29, _p$.e));
3811
- _v$30 !== _p$.t && (_p$.t = _$setProp(_el$89, "style", _v$30, _p$.t));
3812
- _v$31 !== _p$.a && (_p$.a = _$setProp(_el$90, "style", _v$31, _p$.a));
4054
+ _v$32 !== _p$.e && (_p$.e = _$setProp(_el$94, "style", _v$32, _p$.e));
4055
+ _v$33 !== _p$.t && (_p$.t = _$setProp(_el$96, "style", _v$33, _p$.t));
4056
+ _v$34 !== _p$.a && (_p$.a = _$setProp(_el$97, "style", _v$34, _p$.a));
3813
4057
  return _p$;
3814
4058
  }, {
3815
4059
  e: void 0,
3816
4060
  t: void 0,
3817
4061
  a: void 0
3818
4062
  });
3819
- return _el$85;
4063
+ return _el$92;
3820
4064
  })();
3821
4065
  })();
3822
4066
  }
@@ -3825,81 +4069,81 @@ function SubAgentPanel(props) {
3825
4069
  return _$memo(() => !!validModel(entry.model))() ? entry.model : void 0;
3826
4070
  },
3827
4071
  get children() {
3828
- var _el$61 = _$createElement("text"), _el$62 = _$createTextNode(` `), _el$63 = _$createElement("span"), _el$64 = _$createTextNode(`: `), _el$65 = _$createElement("span"), _el$66 = _$createElement("span");
3829
- _$insertNode(_el$61, _el$62);
3830
- _$insertNode(_el$61, _el$63);
3831
- _$insertNode(_el$61, _el$65);
3832
- _$insertNode(_el$61, _el$66);
3833
- _$insertNode(_el$63, _el$64);
3834
- _$insert(_el$63, () => t("model.label"), _el$64);
3835
- _$insert(_el$65, () => " ".repeat(expandedPad(t("model.label"))));
3836
- _$insert(_el$66, () => truncate(entry.model, expandedValAvail()));
4072
+ var _el$67 = _$createElement("text"), _el$68 = _$createTextNode(` `), _el$69 = _$createElement("span"), _el$70 = _$createTextNode(`: `), _el$71 = _$createElement("span"), _el$72 = _$createElement("span");
4073
+ _$insertNode(_el$67, _el$68);
4074
+ _$insertNode(_el$67, _el$69);
4075
+ _$insertNode(_el$67, _el$71);
4076
+ _$insertNode(_el$67, _el$72);
4077
+ _$insertNode(_el$69, _el$70);
4078
+ _$insert(_el$69, () => t("model.label"), _el$70);
4079
+ _$insert(_el$71, () => " ".repeat(expandedPad(t("model.label"))));
4080
+ _$insert(_el$72, () => truncate(entry.model, expandedValAvail()));
3837
4081
  _$effect((_p$) => {
3838
- var _v$19 = {
4082
+ var _v$22 = {
3839
4083
  fg: pal().primary
3840
- }, _v$20 = {
4084
+ }, _v$23 = {
3841
4085
  fg: pal().muted
3842
- }, _v$21 = {
4086
+ }, _v$24 = {
3843
4087
  fg: pal().muted
3844
4088
  };
3845
- _v$19 !== _p$.e && (_p$.e = _$setProp(_el$63, "style", _v$19, _p$.e));
3846
- _v$20 !== _p$.t && (_p$.t = _$setProp(_el$65, "style", _v$20, _p$.t));
3847
- _v$21 !== _p$.a && (_p$.a = _$setProp(_el$66, "style", _v$21, _p$.a));
4089
+ _v$22 !== _p$.e && (_p$.e = _$setProp(_el$69, "style", _v$22, _p$.e));
4090
+ _v$23 !== _p$.t && (_p$.t = _$setProp(_el$71, "style", _v$23, _p$.t));
4091
+ _v$24 !== _p$.a && (_p$.a = _$setProp(_el$72, "style", _v$24, _p$.a));
3848
4092
  return _p$;
3849
4093
  }, {
3850
4094
  e: void 0,
3851
4095
  t: void 0,
3852
4096
  a: void 0
3853
4097
  });
3854
- return _el$61;
4098
+ return _el$67;
3855
4099
  }
3856
4100
  }), _$createComponent(Show, {
3857
4101
  get when() {
3858
4102
  return entry.todoTotal !== void 0;
3859
4103
  },
3860
4104
  get children() {
3861
- var _el$67 = _$createElement("text"), _el$68 = _$createTextNode(` `), _el$69 = _$createElement("span"), _el$70 = _$createTextNode(`: `), _el$71 = _$createElement("span"), _el$72 = _$createElement("span"), _el$73 = _$createTextNode(`/`);
3862
- _$insertNode(_el$67, _el$68);
3863
- _$insertNode(_el$67, _el$69);
3864
- _$insertNode(_el$67, _el$71);
3865
- _$insertNode(_el$67, _el$72);
3866
- _$insertNode(_el$69, _el$70);
3867
- _$insert(_el$69, () => t("todo.label"), _el$70);
3868
- _$insert(_el$71, () => " ".repeat(expandedPad(t("todo.label"))));
3869
- _$insertNode(_el$72, _el$73);
3870
- _$insert(_el$72, () => entry.todoDone, _el$73);
3871
- _$insert(_el$72, () => entry.todoTotal, null);
4105
+ var _el$73 = _$createElement("text"), _el$74 = _$createTextNode(` `), _el$75 = _$createElement("span"), _el$76 = _$createTextNode(`: `), _el$77 = _$createElement("span"), _el$78 = _$createElement("span"), _el$79 = _$createTextNode(`/`);
4106
+ _$insertNode(_el$73, _el$74);
4107
+ _$insertNode(_el$73, _el$75);
4108
+ _$insertNode(_el$73, _el$77);
4109
+ _$insertNode(_el$73, _el$78);
4110
+ _$insertNode(_el$75, _el$76);
4111
+ _$insert(_el$75, () => t("todo.label"), _el$76);
4112
+ _$insert(_el$77, () => " ".repeat(expandedPad(t("todo.label"))));
4113
+ _$insertNode(_el$78, _el$79);
4114
+ _$insert(_el$78, () => entry.todoDone, _el$79);
4115
+ _$insert(_el$78, () => entry.todoTotal, null);
3872
4116
  _$effect((_p$) => {
3873
- var _v$22 = {
4117
+ var _v$25 = {
3874
4118
  fg: pal().primary
3875
- }, _v$23 = {
4119
+ }, _v$26 = {
3876
4120
  fg: pal().muted
3877
- }, _v$24 = {
4121
+ }, _v$27 = {
3878
4122
  fg: pal().muted
3879
4123
  };
3880
- _v$22 !== _p$.e && (_p$.e = _$setProp(_el$69, "style", _v$22, _p$.e));
3881
- _v$23 !== _p$.t && (_p$.t = _$setProp(_el$71, "style", _v$23, _p$.t));
3882
- _v$24 !== _p$.a && (_p$.a = _$setProp(_el$72, "style", _v$24, _p$.a));
4124
+ _v$25 !== _p$.e && (_p$.e = _$setProp(_el$75, "style", _v$25, _p$.e));
4125
+ _v$26 !== _p$.t && (_p$.t = _$setProp(_el$77, "style", _v$26, _p$.t));
4126
+ _v$27 !== _p$.a && (_p$.a = _$setProp(_el$78, "style", _v$27, _p$.a));
3883
4127
  return _p$;
3884
4128
  }, {
3885
4129
  e: void 0,
3886
4130
  t: void 0,
3887
4131
  a: void 0
3888
4132
  });
3889
- return _el$67;
4133
+ return _el$73;
3890
4134
  }
3891
4135
  }), _$createComponent(Show, {
3892
4136
  get when() {
3893
4137
  return entry.sessionId;
3894
4138
  },
3895
4139
  get children() {
3896
- var _el$74 = _$createElement("text"), _el$75 = _$createTextNode(` `), _el$76 = _$createElement("span"), _el$77 = _$createTextNode(`: `), _el$78 = _$createElement("span"), _el$79 = _$createElement("span"), _el$80 = _$createElement("span");
3897
- _$insertNode(_el$74, _el$75);
3898
- _$insertNode(_el$74, _el$76);
3899
- _$insertNode(_el$74, _el$78);
3900
- _$insertNode(_el$74, _el$79);
3901
- _$insertNode(_el$74, _el$80);
3902
- _$setProp(_el$74, "onMouseUp", async () => {
4140
+ var _el$80 = _$createElement("text"), _el$81 = _$createTextNode(` `), _el$82 = _$createElement("span"), _el$83 = _$createTextNode(`: `), _el$84 = _$createElement("span"), _el$85 = _$createElement("span"), _el$86 = _$createElement("span");
4141
+ _$insertNode(_el$80, _el$81);
4142
+ _$insertNode(_el$80, _el$82);
4143
+ _$insertNode(_el$80, _el$84);
4144
+ _$insertNode(_el$80, _el$85);
4145
+ _$insertNode(_el$80, _el$86);
4146
+ _$setProp(_el$80, "onMouseUp", async () => {
3903
4147
  const sessionId = entry.sessionId;
3904
4148
  if (!sessionId) return;
3905
4149
  const result = await copyText(sessionId);
@@ -3919,25 +4163,25 @@ ${t("session.toast.copy_failed")}`, {
3919
4163
  duration: 8e3
3920
4164
  });
3921
4165
  });
3922
- _$insertNode(_el$76, _el$77);
3923
- _$insert(_el$76, () => t("session.label"), _el$77);
3924
- _$insert(_el$78, () => " ".repeat(expandedPad(t("session.label"))));
3925
- _$insert(_el$79, () => truncate(entry.sessionId, expandedValAvail() - visualWidth(" \u2398")));
3926
- _$insertNode(_el$80, _$createTextNode(` \u2398`));
4166
+ _$insertNode(_el$82, _el$83);
4167
+ _$insert(_el$82, () => t("session.label"), _el$83);
4168
+ _$insert(_el$84, () => " ".repeat(expandedPad(t("session.label"))));
4169
+ _$insert(_el$85, () => truncate(entry.sessionId, expandedValAvail() - visualWidth(" \u2398")));
4170
+ _$insertNode(_el$86, _$createTextNode(` \u2398`));
3927
4171
  _$effect((_p$) => {
3928
- var _v$25 = {
4172
+ var _v$28 = {
3929
4173
  fg: pal().primary
3930
- }, _v$26 = {
4174
+ }, _v$29 = {
3931
4175
  fg: pal().muted
3932
- }, _v$27 = {
4176
+ }, _v$30 = {
3933
4177
  fg: pal().muted
3934
- }, _v$28 = {
4178
+ }, _v$31 = {
3935
4179
  fg: pal().warning
3936
4180
  };
3937
- _v$25 !== _p$.e && (_p$.e = _$setProp(_el$76, "style", _v$25, _p$.e));
3938
- _v$26 !== _p$.t && (_p$.t = _$setProp(_el$78, "style", _v$26, _p$.t));
3939
- _v$27 !== _p$.a && (_p$.a = _$setProp(_el$79, "style", _v$27, _p$.a));
3940
- _v$28 !== _p$.o && (_p$.o = _$setProp(_el$80, "style", _v$28, _p$.o));
4181
+ _v$28 !== _p$.e && (_p$.e = _$setProp(_el$82, "style", _v$28, _p$.e));
4182
+ _v$29 !== _p$.t && (_p$.t = _$setProp(_el$84, "style", _v$29, _p$.t));
4183
+ _v$30 !== _p$.a && (_p$.a = _$setProp(_el$85, "style", _v$30, _p$.a));
4184
+ _v$31 !== _p$.o && (_p$.o = _$setProp(_el$86, "style", _v$31, _p$.o));
3941
4185
  return _p$;
3942
4186
  }, {
3943
4187
  e: void 0,
@@ -3945,7 +4189,7 @@ ${t("session.toast.copy_failed")}`, {
3945
4189
  a: void 0,
3946
4190
  o: void 0
3947
4191
  });
3948
- return _el$74;
4192
+ return _el$80;
3949
4193
  }
3950
4194
  }), _$createComponent(Show, {
3951
4195
  get when() {
@@ -3961,68 +4205,68 @@ ${t("session.toast.copy_failed")}`, {
3961
4205
  const rightW = (isRunning ? visualWidth(dismissLabel()) : 0) + (isRunning && entry.sessionId ? visualWidth(cancelLabel()) : 0);
3962
4206
  const spacerW = () => Math.max(1, panelWidth() - gutter() - openW() - rightW - 2);
3963
4207
  return (() => {
3964
- var _el$92 = _$createElement("box"), _el$96 = _$createElement("text");
3965
- _$insertNode(_el$92, _el$96);
3966
- _$setProp(_el$92, "flexDirection", "row");
3967
- _$insert(_el$92, _$createComponent(Show, {
4208
+ var _el$99 = _$createElement("box"), _el$103 = _$createElement("text");
4209
+ _$insertNode(_el$99, _el$103);
4210
+ _$setProp(_el$99, "flexDirection", "row");
4211
+ _$insert(_el$99, _$createComponent(Show, {
3968
4212
  get when() {
3969
4213
  return entry.sessionId;
3970
4214
  },
3971
4215
  get children() {
3972
- var _el$93 = _$createElement("text"), _el$94 = _$createElement("span"), _el$95 = _$createElement("span");
3973
- _$insertNode(_el$93, _el$94);
3974
- _$insertNode(_el$93, _el$95);
3975
- _$setProp(_el$93, "onMouseOver", () => setHoveredOpen(entry.id));
3976
- _$setProp(_el$93, "onMouseOut", () => setHoveredOpen(void 0));
3977
- _$setProp(_el$93, "onMouseUp", () => {
4216
+ var _el$100 = _$createElement("text"), _el$101 = _$createElement("span"), _el$102 = _$createElement("span");
4217
+ _$insertNode(_el$100, _el$101);
4218
+ _$insertNode(_el$100, _el$102);
4219
+ _$setProp(_el$100, "onMouseOver", () => setHoveredOpen(entry.id));
4220
+ _$setProp(_el$100, "onMouseOut", () => setHoveredOpen(void 0));
4221
+ _$setProp(_el$100, "onMouseUp", () => {
3978
4222
  if (entry.sessionId) {
3979
4223
  props.api.route.navigateSession(entry.sessionId);
3980
4224
  }
3981
4225
  });
3982
- _$insert(_el$94, openPrefix);
3983
- _$insert(_el$95, () => t("open.label"));
4226
+ _$insert(_el$101, openPrefix);
4227
+ _$insert(_el$102, () => t("open.label"));
3984
4228
  _$effect((_p$) => {
3985
- var _v$32 = {
4229
+ var _v$35 = {
3986
4230
  fg: hoveredOpen() === entry.id ? pal().warning : pal().primary
3987
- }, _v$33 = {
4231
+ }, _v$36 = {
3988
4232
  fg: hoveredOpen() === entry.id ? pal().warning : pal().primary
3989
4233
  };
3990
- _v$32 !== _p$.e && (_p$.e = _$setProp(_el$94, "style", _v$32, _p$.e));
3991
- _v$33 !== _p$.t && (_p$.t = _$setProp(_el$95, "style", _v$33, _p$.t));
4234
+ _v$35 !== _p$.e && (_p$.e = _$setProp(_el$101, "style", _v$35, _p$.e));
4235
+ _v$36 !== _p$.t && (_p$.t = _$setProp(_el$102, "style", _v$36, _p$.t));
3992
4236
  return _p$;
3993
4237
  }, {
3994
4238
  e: void 0,
3995
4239
  t: void 0
3996
4240
  });
3997
- return _el$93;
4241
+ return _el$100;
3998
4242
  }
3999
- }), _el$96);
4000
- _$insert(_el$96, () => " ".repeat(spacerW()));
4001
- _$insert(_el$92, _$createComponent(Show, {
4243
+ }), _el$103);
4244
+ _$insert(_el$103, () => " ".repeat(spacerW()));
4245
+ _$insert(_el$99, _$createComponent(Show, {
4002
4246
  get when() {
4003
4247
  return isRunning && entry.sessionId;
4004
4248
  },
4005
4249
  get children() {
4006
- var _el$97 = _$createElement("text"), _el$98 = _$createElement("span");
4007
- _$insertNode(_el$97, _el$98);
4008
- _$setProp(_el$97, "onMouseOver", () => setHoveredCancel(entry.id));
4009
- _$setProp(_el$97, "onMouseOut", () => setHoveredCancel(void 0));
4010
- _$setProp(_el$97, "onMouseUp", () => cancelEntry(entry));
4011
- _$insert(_el$98, cancelLabel);
4012
- _$effect((_$p) => _$setProp(_el$98, "style", {
4250
+ var _el$104 = _$createElement("text"), _el$105 = _$createElement("span");
4251
+ _$insertNode(_el$104, _el$105);
4252
+ _$setProp(_el$104, "onMouseOver", () => setHoveredCancel(entry.id));
4253
+ _$setProp(_el$104, "onMouseOut", () => setHoveredCancel(void 0));
4254
+ _$setProp(_el$104, "onMouseUp", () => cancelEntry(entry));
4255
+ _$insert(_el$105, cancelLabel);
4256
+ _$effect((_$p) => _$setProp(_el$105, "style", {
4013
4257
  fg: hoveredCancel() === entry.id ? pal().warning : pal().error
4014
4258
  }, _$p));
4015
- return _el$97;
4259
+ return _el$104;
4016
4260
  }
4017
4261
  }), null);
4018
- _$insert(_el$92, _$createComponent(Show, {
4262
+ _$insert(_el$99, _$createComponent(Show, {
4019
4263
  when: isRunning,
4020
4264
  get children() {
4021
- var _el$99 = _$createElement("text"), _el$100 = _$createElement("span");
4022
- _$insertNode(_el$99, _el$100);
4023
- _$setProp(_el$99, "onMouseOver", () => setHoveredDismiss(entry.id));
4024
- _$setProp(_el$99, "onMouseOut", () => setHoveredDismiss(void 0));
4025
- _$setProp(_el$99, "onMouseUp", () => {
4265
+ var _el$106 = _$createElement("text"), _el$107 = _$createElement("span");
4266
+ _$insertNode(_el$106, _el$107);
4267
+ _$setProp(_el$106, "onMouseOver", () => setHoveredDismiss(entry.id));
4268
+ _$setProp(_el$106, "onMouseOut", () => setHoveredDismiss(void 0));
4269
+ _$setProp(_el$106, "onMouseUp", () => {
4026
4270
  upsertEntry({
4027
4271
  id: entry.id,
4028
4272
  title: entry.title,
@@ -4031,17 +4275,17 @@ ${t("session.toast.copy_failed")}`, {
4031
4275
  status: "done"
4032
4276
  });
4033
4277
  });
4034
- _$insert(_el$100, dismissLabel);
4035
- _$effect((_$p) => _$setProp(_el$100, "style", {
4278
+ _$insert(_el$107, dismissLabel);
4279
+ _$effect((_$p) => _$setProp(_el$107, "style", {
4036
4280
  fg: hoveredDismiss() === entry.id ? pal().warning : pal().muted
4037
4281
  }, _$p));
4038
- return _el$99;
4282
+ return _el$106;
4039
4283
  }
4040
4284
  }), null);
4041
- _$effect((_$p) => _$setProp(_el$96, "style", {
4285
+ _$effect((_$p) => _$setProp(_el$103, "style", {
4042
4286
  fg: pal().muted
4043
4287
  }, _$p));
4044
- return _el$92;
4288
+ return _el$99;
4045
4289
  })();
4046
4290
  })();
4047
4291
  }
@@ -4062,13 +4306,13 @@ ${t("session.toast.copy_failed")}`, {
4062
4306
  const right = props.sortOrder() === "desc" ? `\u2191 ${t("scroll.top")}` : `\u2193 ${t("scroll.bottom")}`;
4063
4307
  const pad = showTop ? Math.max(1, panelWidth() - gutter() - visualWidth(left) - visualWidth(right)) : 0;
4064
4308
  return (() => {
4065
- var _el$101 = _$createElement("box"), _el$102 = _$createElement("text"), _el$103 = _$createElement("span");
4066
- _$insertNode(_el$101, _el$102);
4067
- _$setProp(_el$101, "flexDirection", "row");
4068
- _$insertNode(_el$102, _el$103);
4069
- _$setProp(_el$102, "onMouseOver", () => showMore && setHoveredMoreBelow(true));
4070
- _$setProp(_el$102, "onMouseOut", () => setHoveredMoreBelow(false));
4071
- _$setProp(_el$102, "onMouseUp", () => {
4309
+ var _el$108 = _$createElement("box"), _el$109 = _$createElement("text"), _el$110 = _$createElement("span");
4310
+ _$insertNode(_el$108, _el$109);
4311
+ _$setProp(_el$108, "flexDirection", "row");
4312
+ _$insertNode(_el$109, _el$110);
4313
+ _$setProp(_el$109, "onMouseOver", () => showMore && setHoveredMoreBelow(true));
4314
+ _$setProp(_el$109, "onMouseOut", () => setHoveredMoreBelow(false));
4315
+ _$setProp(_el$109, "onMouseUp", () => {
4072
4316
  if (!showMore) return;
4073
4317
  const total = entryList().length;
4074
4318
  const m = max();
@@ -4080,20 +4324,20 @@ ${t("session.toast.copy_failed")}`, {
4080
4324
  }
4081
4325
  setHoveredMoreBelow(false);
4082
4326
  });
4083
- _$insert(_el$103, left);
4084
- _$insert(_el$101, showTop ? [(() => {
4085
- var _el$104 = _$createElement("text");
4086
- _$insert(_el$104, () => " ".repeat(pad));
4087
- _$effect((_$p) => _$setProp(_el$104, "style", {
4327
+ _$insert(_el$110, left);
4328
+ _$insert(_el$108, showTop ? [(() => {
4329
+ var _el$111 = _$createElement("text");
4330
+ _$insert(_el$111, () => " ".repeat(pad));
4331
+ _$effect((_$p) => _$setProp(_el$111, "style", {
4088
4332
  fg: pal().muted
4089
4333
  }, _$p));
4090
- return _el$104;
4334
+ return _el$111;
4091
4335
  })(), (() => {
4092
- var _el$105 = _$createElement("text"), _el$106 = _$createElement("span");
4093
- _$insertNode(_el$105, _el$106);
4094
- _$setProp(_el$105, "onMouseOver", () => setHoveredTop(true));
4095
- _$setProp(_el$105, "onMouseOut", () => setHoveredTop(false));
4096
- _$setProp(_el$105, "onMouseUp", () => {
4336
+ var _el$112 = _$createElement("text"), _el$113 = _$createElement("span");
4337
+ _$insertNode(_el$112, _el$113);
4338
+ _$setProp(_el$112, "onMouseOver", () => setHoveredTop(true));
4339
+ _$setProp(_el$112, "onMouseOut", () => setHoveredTop(false));
4340
+ _$setProp(_el$112, "onMouseUp", () => {
4097
4341
  const total = entryList().length;
4098
4342
  const m = max();
4099
4343
  if (props.sortOrder() === "desc") {
@@ -4103,16 +4347,16 @@ ${t("session.toast.copy_failed")}`, {
4103
4347
  }
4104
4348
  setHoveredTop(false);
4105
4349
  });
4106
- _$insert(_el$106, right);
4107
- _$effect((_$p) => _$setProp(_el$106, "style", {
4350
+ _$insert(_el$113, right);
4351
+ _$effect((_$p) => _$setProp(_el$113, "style", {
4108
4352
  fg: hoveredTop() ? pal().warning : pal().muted
4109
4353
  }, _$p));
4110
- return _el$105;
4354
+ return _el$112;
4111
4355
  })()] : null, null);
4112
- _$effect((_$p) => _$setProp(_el$103, "style", {
4356
+ _$effect((_$p) => _$setProp(_el$110, "style", {
4113
4357
  fg: showMore && hoveredMoreBelow() ? pal().warning : pal().muted
4114
4358
  }, _$p));
4115
- return _el$101;
4359
+ return _el$108;
4116
4360
  })();
4117
4361
  })();
4118
4362
  }
@@ -4182,6 +4426,9 @@ function PluginRoot(props) {
4182
4426
  get timeFormat() {
4183
4427
  return props.signals.timeFormat;
4184
4428
  },
4429
+ get showOrigin() {
4430
+ return props.signals.showOrigin;
4431
+ },
4185
4432
  get sessionId() {
4186
4433
  return props.sessionID;
4187
4434
  }
@@ -4212,6 +4459,7 @@ var mod = {
4212
4459
  const [showEntryTokensSignal, setShowEntryTokens] = createSignal3(api.kv.get(SETTING_KEYS.showEntryTokens, true) !== false);
4213
4460
  const storedTimeFormat = String(api.kv.get(SETTING_KEYS.timeFormat, "short"));
4214
4461
  const [timeFormatSignal, setTimeFormat] = createSignal3(TIME_FORMATS.includes(storedTimeFormat) ? storedTimeFormat : "short");
4462
+ const [showOriginSignal, setShowOrigin] = createSignal3(api.kv.get(SETTING_KEYS.showOrigin, false) === true);
4215
4463
  const [dbSyncSignal, setDbSync] = createSignal3(api.kv.get(SETTING_KEYS.dbSync, true) !== false);
4216
4464
  lang = langSignal;
4217
4465
  maxEntries = maxSignal;
@@ -4236,6 +4484,8 @@ var mod = {
4236
4484
  setShowEntryTokens,
4237
4485
  timeFormat: timeFormatSignal,
4238
4486
  setTimeFormat,
4487
+ showOrigin: showOriginSignal,
4488
+ setShowOrigin,
4239
4489
  dbSync: dbSyncSignal,
4240
4490
  setDbSync,
4241
4491
  sessionId: ""