@symerian/symi 2.6.42 → 2.7.1

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 (204) hide show
  1. package/dist/{acp-cli-CrEIx-c7.js → acp-cli-B2f0qBiM.js} +2 -2
  2. package/dist/{acp-cli-BLUeUUA5.js → acp-cli-D-9rzaOI.js} +2 -2
  3. package/dist/{agents-DDRDszOI.js → agents-Z8ruJPz2.js} +5 -5
  4. package/dist/{agents.config-BEVb1Pyx.js → agents.config-B9BZoM2m.js} +1 -1
  5. package/dist/{agents.config-BKCY6F2A.js → agents.config-C951ocyh.js} +1 -1
  6. package/dist/{audio-preflight-DD18zIZd.js → audio-preflight-HILy3i0m.js} +4 -4
  7. package/dist/{audit-DB9YkTVX.js → audit-BgdM9XZl.js} +2 -2
  8. package/dist/{audit-BjI_Yyr5.js → audit-xSagQWH8.js} +2 -2
  9. package/dist/{auth-choice-D2xXwBeN.js → auth-choice-BmYi6pBy.js} +2 -2
  10. package/dist/{auth-choice-BbzReh6k.js → auth-choice-D_VfXxhG.js} +2 -2
  11. package/dist/{banner-DqqRwplt.js → banner-Bucr6qZ5.js} +1 -1
  12. package/dist/{browser-cli-kDUw45Y0.js → browser-cli-Bc_JVdTj.js} +3 -3
  13. package/dist/{browser-cli-Ctn9do4z.js → browser-cli-Dr0yx7-7.js} +3 -3
  14. package/dist/build-info.json +3 -3
  15. package/dist/bundled/boot-md/handler.js +1 -1
  16. package/dist/bundled/session-memory/handler.js +1 -1
  17. package/dist/{call-DwpGquzW.js → call-CX0cs106.js} +1 -1
  18. package/dist/{call-DKi-hnaF.js → call-DeCQ2DhS.js} +1 -1
  19. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  20. package/dist/{channel-options-DQcpDVCx.js → channel-options-BMDryXHq.js} +1 -1
  21. package/dist/{channel-options-DcazVJQf.js → channel-options-z8-WeZyO.js} +1 -1
  22. package/dist/{channel-web-u5yMYO4j.js → channel-web-D_YxZAHT.js} +1 -1
  23. package/dist/{channels-cli-C3iJE8eg.js → channels-cli-397NgC51.js} +7 -7
  24. package/dist/{channels-cli-Bog4Kn3X.js → channels-cli-CV7_JUru.js} +7 -7
  25. package/dist/{chrome-BxwUEWrH.js → chrome-CiOKaTN-.js} +7 -7
  26. package/dist/cli/daemon-cli.js +1 -1
  27. package/dist/{cli-eBtEEHLK.js → cli-4XU7pNlM.js} +4 -4
  28. package/dist/{cli-QybdZdE7.js → cli-Dq95udFO.js} +4 -4
  29. package/dist/{client-jI1oE0_k.js → client-B8xmq-Pw.js} +13 -1
  30. package/dist/{client-T3qcxXru.js → client-qUlxXXVJ.js} +13 -1
  31. package/dist/{command-registry-BWnZSpbL.js → command-registry-Cx9T7GYx.js} +10 -10
  32. package/dist/{completion-cli-BhJFXaVU.js → completion-cli-WlSuySPZ.js} +1 -1
  33. package/dist/{completion-cli-CUKm7Hb6.js → completion-cli-cyVjlhls.js} +2 -2
  34. package/dist/{config-cli-B796xZBe.js → config-cli-CMymzmrI.js} +1 -1
  35. package/dist/{config-cli-CjnQyv45.js → config-cli-EdmbBExA.js} +1 -1
  36. package/dist/{configure-D3wIQ0yI.js → configure-DRMAIBBf.js} +6 -6
  37. package/dist/{configure-DUqT7Dyn.js → configure-DkFujfiY.js} +6 -6
  38. package/dist/control-ui/css/style.css +165 -0
  39. package/dist/control-ui/js/app.js +39 -0
  40. package/dist/control-ui/js/gateway.js +2 -0
  41. package/dist/control-ui/js/history.js +220 -85
  42. package/dist/control-ui/js/settings.js +71 -8
  43. package/dist/{cron-cli-DCpsXkrw.js → cron-cli-BHxfvWeT.js} +3 -3
  44. package/dist/{cron-cli-QCTdVZuP.js → cron-cli-DacyI1Pw.js} +3 -3
  45. package/dist/{daemon-cli-DSDcmWOi.js → daemon-cli-BLhFbih0.js} +2 -2
  46. package/dist/{daemon-cli-DhJYEAoL.js → daemon-cli-BxKtiouf.js} +2 -2
  47. package/dist/daemon-cli.js +12 -0
  48. package/dist/{deliver-DtuY4Wgl.js → deliver-D6IcPfbt.js} +1 -1
  49. package/dist/{devices-cli-BNG-fvdl.js → devices-cli-1kiO08aL.js} +2 -2
  50. package/dist/{devices-cli-x3jIP4Ih.js → devices-cli-B8Q8AzbX.js} +2 -2
  51. package/dist/{doctor-completion-DBE1IVKj.js → doctor-completion-BDzhB9pE.js} +1 -1
  52. package/dist/{doctor-completion-D3oUNFQM.js → doctor-completion-CfeROjIz.js} +1 -1
  53. package/dist/entry.js +1 -1
  54. package/dist/{exec-approvals-cli-CmndFjEA.js → exec-approvals-cli-BRx2oxs5.js} +4 -4
  55. package/dist/{exec-approvals-cli-BSgxsdMt.js → exec-approvals-cli-Cj6Z-vxL.js} +4 -4
  56. package/dist/extensionAPI.js +6 -6
  57. package/dist/{gateway-cli-BguO9yV4.js → gateway-cli-C-G0QrTd.js} +185 -81
  58. package/dist/{gateway-cli-Dc1RT_b9.js → gateway-cli-Cpn7JyAw.js} +185 -81
  59. package/dist/{gateway-rpc-BMdVa3QV.js → gateway-rpc-BWTK7g8B.js} +1 -1
  60. package/dist/{gateway-rpc-5fREQe9Q.js → gateway-rpc-WM-HXUbl.js} +1 -1
  61. package/dist/{glass-ui-ws-DoIZyE9O.js → glass-ui-ws-BI81Lh6Z.js} +32 -13
  62. package/dist/{glass-ui-ws-D0UYleBF.js → glass-ui-ws-jAbqZVc9.js} +32 -13
  63. package/dist/{health-D3w4YMlC.js → health-B1nih5LD.js} +2 -2
  64. package/dist/{health-cVvZdeDu.js → health-CsTxt66a.js} +2 -2
  65. package/dist/{hooks-cli-te5hzOAB.js → hooks-cli-BhxMFkKe.js} +5 -5
  66. package/dist/{hooks-cli-DZIbjfOA.js → hooks-cli-CIlvtt2M.js} +5 -5
  67. package/dist/{image-lp19FlzF.js → image-D7Fl08gG.js} +1 -1
  68. package/dist/index.js +9 -9
  69. package/dist/llm-slug-generator.js +1 -1
  70. package/dist/{logs-cli-DtlrLf7u.js → logs-cli-BZV7dq_U.js} +3 -3
  71. package/dist/{logs-cli-CfGj-dOg.js → logs-cli-DyCcDkRs.js} +3 -3
  72. package/dist/{models-BCfPhQ4m.js → models-DhMe2rzL.js} +3 -3
  73. package/dist/{models-cli-BFAtjNIF.js → models-cli-DKM5sCQM.js} +5 -5
  74. package/dist/{models-cli-Cj2CwbPw.js → models-cli-Dewg24W2.js} +6 -6
  75. package/dist/{node-cli-DnfDOh1d.js → node-cli-4eMRkmrw.js} +1 -1
  76. package/dist/{node-cli-eHn9-YfJ.js → node-cli-Dfs0UmnJ.js} +1 -1
  77. package/dist/{nodes-cli-Ct4M7JOe.js → nodes-cli-BKb61OjH.js} +3 -3
  78. package/dist/{nodes-cli-Ci3oxw8k.js → nodes-cli-DxfP9DIz.js} +3 -3
  79. package/dist/{onboard-BMq8qc1m.js → onboard-Dw_nX2RD.js} +3 -3
  80. package/dist/{onboard-channels-B5wgcffj.js → onboard-channels-8ynJSZL6.js} +1 -1
  81. package/dist/{onboard-channels-CiOun4k1.js → onboard-channels-ChxtmhFY.js} +1 -1
  82. package/dist/{onboard-helpers-DFvWPFhU.js → onboard-helpers-CueJ7O_B.js} +1 -1
  83. package/dist/{onboard-helpers-BBtPmJEe.js → onboard-helpers-PpGrZIGw.js} +1 -1
  84. package/dist/{onboard-remote-BURDxwoE.js → onboard-remote-Cd9kIiSG.js} +1 -1
  85. package/dist/{onboard-remote-D-B4EiOE.js → onboard-remote-DCdpB2HH.js} +1 -1
  86. package/dist/{onboard-skills-BDCzVjxb.js → onboard-skills-CC2CV5Er.js} +1 -1
  87. package/dist/{onboard-skills-CbzgBT1W.js → onboard-skills-DRICcBwa.js} +1 -1
  88. package/dist/{onboard-VcdBF5TB.js → onboard-yrgbC1mu.js} +3 -3
  89. package/dist/{onboarding-Dp7p6zKa.js → onboarding-BJcYsOFw.js} +7 -7
  90. package/dist/{onboarding-CGNpTyg2.js → onboarding-e-RSXpUi.js} +7 -7
  91. package/dist/{onboarding.finalize-B6DOu8vp.js → onboarding.finalize-CKNdiZEZ.js} +9 -9
  92. package/dist/{onboarding.finalize-CrsE5P43.js → onboarding.finalize-DenYTWUu.js} +10 -10
  93. package/dist/{onboarding.gateway-config-DKwJ5bWd.js → onboarding.gateway-config-DTWQ-Bqq.js} +3 -3
  94. package/dist/{onboarding.gateway-config-B9zGPfCl.js → onboarding.gateway-config-Dj68bVBt.js} +3 -3
  95. package/dist/{pi-embedded-DQe8vBwU.js → pi-embedded-BzS693I1.js} +72 -21
  96. package/dist/{pi-embedded-helpers-Dij3O6ox.js → pi-embedded-helpers-DXAoe1Bx.js} +4 -4
  97. package/dist/{plugin-registry-BzIbwU3K.js → plugin-registry-Bzz7mUyl.js} +1 -1
  98. package/dist/{plugin-registry-D3TUplW8.js → plugin-registry-SUa2FFIj.js} +1 -1
  99. package/dist/plugin-sdk/{channel-web-B6m8UOCl.js → channel-web-DRabhx1e.js} +1 -1
  100. package/dist/plugin-sdk/gateway/protocol/index.d.ts +13 -2
  101. package/dist/plugin-sdk/gateway/protocol/schema/sessions.d.ts +11 -0
  102. package/dist/plugin-sdk/gateway/protocol/schema/types.d.ts +4 -1
  103. package/dist/plugin-sdk/index.js +2 -2
  104. package/dist/plugin-sdk/{reply-CGoJQT_s.js → reply-Cw3shPk2.js} +58 -7
  105. package/dist/plugin-sdk/{web-CJjSOTnI.js → web-CH43nBP0.js} +2 -2
  106. package/dist/{plugins-cli-BD1Jb2Ml.js → plugins-cli-DwtoU3xk.js} +5 -5
  107. package/dist/{plugins-cli-DFyRjAtJ.js → plugins-cli-qG50__1A.js} +5 -5
  108. package/dist/{program-context-45vPEw2G.js → program-context-CZwy-bh6.js} +29 -29
  109. package/dist/{program-qGm2M9PG.js → program-mZOVTSdQ.js} +10 -10
  110. package/dist/{prompt-select-styled-DRIS9jSv.js → prompt-select-styled-BZnuv8jI.js} +6 -6
  111. package/dist/{prompt-select-styled-DRraJGwA.js → prompt-select-styled-CtNg5KGU.js} +6 -6
  112. package/dist/{provider-auth-helpers-BNOWsjW5.js → provider-auth-helpers-CEYCb2mJ.js} +1 -1
  113. package/dist/{provider-auth-helpers-BREVjR7R.js → provider-auth-helpers-D60nbSLq.js} +1 -1
  114. package/dist/{push-apns-CYC70eKy.js → push-apns-B5txhDVi.js} +1 -1
  115. package/dist/{push-apns-CObVeJLC.js → push-apns-CoG1P_P0.js} +1 -1
  116. package/dist/{pw-ai-BO5cSmwD.js → pw-ai-CANiWpMA.js} +1 -1
  117. package/dist/{register.agent-DzzY8jON.js → register.agent-BY_Df_Me.js} +9 -9
  118. package/dist/{register.agent-DRrHvYcz.js → register.agent-CopGIf9e.js} +8 -8
  119. package/dist/{register.configure-DlXkwkNR.js → register.configure-Bu_XKu7Z.js} +11 -11
  120. package/dist/{register.configure-BxtTIFTa.js → register.configure-CoYQhQBT.js} +11 -11
  121. package/dist/{register.maintenance-LEf8Q_5p.js → register.maintenance-BtqQ3hDN.js} +11 -11
  122. package/dist/{register.maintenance-CXLXouZV.js → register.maintenance-VqCqhB7y.js} +10 -10
  123. package/dist/{register.message-DsPa-xHV.js → register.message-DZCCEK01.js} +5 -5
  124. package/dist/{register.message-C4ifV9vG.js → register.message-dd1xYBZT.js} +5 -5
  125. package/dist/{register.onboard-CrY4PxLP.js → register.onboard-B6EL1d-C.js} +7 -7
  126. package/dist/{register.onboard-DLRPa_4B.js → register.onboard-lzwHKufI.js} +7 -7
  127. package/dist/{register.setup-fBG_dJfi.js → register.setup-BJsr5_qp.js} +7 -7
  128. package/dist/{register.setup-By37g1vN.js → register.setup-D_b_HW5D.js} +7 -7
  129. package/dist/{register.status-health-sessions-DG7KGnD0.js → register.status-health-sessions-Dvj4mlom.js} +7 -7
  130. package/dist/{register.status-health-sessions-Ckw86-gn.js → register.status-health-sessions-jeiqtgl7.js} +7 -7
  131. package/dist/{register.subclis-C_xKLugM.js → register.subclis-DdPRkz29.js} +20 -20
  132. package/dist/{reply-DyjXROKp.js → reply-XaXqDK9F.js} +49 -10
  133. package/dist/{rpc-Co5PQ3IJ.js → rpc-N1nf_c1A.js} +1 -1
  134. package/dist/{rpc-D0FiEinj.js → rpc-QHo-8pCM.js} +1 -1
  135. package/dist/{run-main-Cg3ecTbO.js → run-main-MhL-xG3_.js} +17 -17
  136. package/dist/{runner-Ct0suQrd.js → runner-BS9gGL5i.js} +1 -1
  137. package/dist/{security-cli-D5BWzqEJ.js → security-cli-B-4J6enu.js} +3 -3
  138. package/dist/{security-cli-CG1uSlRK.js → security-cli-CSMUEGPK.js} +3 -3
  139. package/dist/{server-methods-CWcLut3F.js → server-methods-0ksPFnev.js} +471 -88
  140. package/dist/{server-methods-CW8eFTGD.js → server-methods-Bu1RjLe6.js} +471 -88
  141. package/dist/{server-node-events-C2h9OPo7.js → server-node-events-DCbzFyQF.js} +5 -5
  142. package/dist/{server-node-events-CDB0u8PP.js → server-node-events-DZAN3hWE.js} +5 -5
  143. package/dist/{status-B2Qt-5kL.js → status-CiHkFbIh.js} +1 -1
  144. package/dist/{status-ZPW5EACm.js → status-DOTlXdcN.js} +5 -5
  145. package/dist/{status-CMx3GAax.js → status-IWqSLXLR.js} +1 -1
  146. package/dist/{status-DfPfMVNZ.js → status-qkmUAeWo.js} +5 -5
  147. package/dist/{subagent-registry-DQHg3jUV.js → subagent-registry-DCoU9xIE.js} +49 -10
  148. package/dist/{system-cli-DFZNGx0i.js → system-cli-DY7ov1OT.js} +3 -3
  149. package/dist/{system-cli-Z7uzO8qd.js → system-cli-LFURKpwS.js} +3 -3
  150. package/dist/{tui-DjPsMdL6.js → tui-BH7JwqvB.js} +2 -2
  151. package/dist/{tui-DrATGNms.js → tui-C_5HG495.js} +2 -2
  152. package/dist/{tui-cli-D19-MCXt.js → tui-cli-B65PKZMj.js} +3 -3
  153. package/dist/{tui-cli-pWD_NrUR.js → tui-cli-CJnfmuxq.js} +3 -3
  154. package/dist/{unified-runner-DvOFqcrw.js → unified-runner-CApgXtVC.js} +58 -7
  155. package/dist/{update-cli-Df9rh_aN.js → update-cli-Bi6iMCXr.js} +11 -11
  156. package/dist/{update-cli-DBasZeVl.js → update-cli-BjQ3o9gQ.js} +12 -12
  157. package/dist/{update-runner-DVa6cMqp.js → update-runner-BhVsdpxm.js} +1 -1
  158. package/dist/{update-runner-BRKFzAwV.js → update-runner-FhW6n-Nv.js} +1 -1
  159. package/dist/{web-Dd05xbUr.js → web-ConlA_Ch.js} +4 -4
  160. package/dist/{web-Cw3bFAiP.js → web-CthDLVSz.js} +1 -1
  161. package/dist/{web-CGh5tw__.js → web-Db_-ahjX.js} +6 -6
  162. package/dist/{web-KiuDkd0x.js → web-Dpb_tv_j.js} +5 -5
  163. package/extensions/bluebubbles/package.json +1 -1
  164. package/extensions/copilot-proxy/package.json +1 -1
  165. package/extensions/diagnostics-otel/package.json +1 -1
  166. package/extensions/discord/package.json +1 -1
  167. package/extensions/feishu/package.json +1 -1
  168. package/extensions/google-antigravity-auth/package.json +1 -1
  169. package/extensions/google-gemini-cli-auth/package.json +1 -1
  170. package/extensions/googlechat/package.json +1 -1
  171. package/extensions/imessage/package.json +1 -1
  172. package/extensions/irc/package.json +1 -1
  173. package/extensions/learning-loop/package.json +1 -1
  174. package/extensions/line/package.json +1 -1
  175. package/extensions/llm-task/package.json +1 -1
  176. package/extensions/matrix/CHANGELOG.md +12 -0
  177. package/extensions/matrix/package.json +1 -1
  178. package/extensions/mattermost/package.json +1 -1
  179. package/extensions/memory-core/package.json +1 -1
  180. package/extensions/memory-lancedb/package.json +1 -1
  181. package/extensions/minimax-portal-auth/package.json +1 -1
  182. package/extensions/msteams/CHANGELOG.md +12 -0
  183. package/extensions/msteams/package.json +1 -1
  184. package/extensions/nextcloud-talk/package.json +1 -1
  185. package/extensions/nostr/CHANGELOG.md +12 -0
  186. package/extensions/nostr/package.json +1 -1
  187. package/extensions/open-prose/package.json +1 -1
  188. package/extensions/outlook/package.json +1 -1
  189. package/extensions/pipeline/package.json +1 -1
  190. package/extensions/signal/package.json +1 -1
  191. package/extensions/slack/package.json +1 -1
  192. package/extensions/telegram/package.json +1 -1
  193. package/extensions/tlon/package.json +1 -1
  194. package/extensions/twitch/CHANGELOG.md +12 -0
  195. package/extensions/twitch/package.json +1 -1
  196. package/extensions/voice-call/CHANGELOG.md +12 -0
  197. package/extensions/voice-call/package.json +1 -1
  198. package/extensions/whatsapp/package.json +1 -1
  199. package/extensions/zalo/CHANGELOG.md +12 -0
  200. package/extensions/zalo/package.json +1 -1
  201. package/extensions/zalouser/CHANGELOG.md +12 -0
  202. package/extensions/zalouser/package.json +1 -1
  203. package/package.json +1 -1
  204. package/skills/long-task/scripts/detach-task.sh +91 -14
@@ -1,5 +1,7 @@
1
1
  // ── Session History Browser ────────────────────────────────────────────
2
- // Provides the history drawer: list past sessions, browse archived transcripts.
2
+ // Provides the history drawer: list past sessions, browse archived
3
+ // transcripts, favourite/delete/load. Exactly one row is ever CURRENT;
4
+ // all others are loadable past sessions.
3
5
  // ─────────────────────────────────────────────────────────────────────────────
4
6
 
5
7
  "use strict";
@@ -15,7 +17,8 @@
15
17
 
16
18
  let isOpen = false;
17
19
  let toastTimer = null;
18
- let __viewingFile = null; // filename of the currently viewed archive
20
+ let __viewingFile = null;
21
+ const DELETE_CONFIRM_MS = 5000;
19
22
 
20
23
  // ── Open / close ──────────────────────────────────────────────────────
21
24
  function openDrawer() {
@@ -48,10 +51,15 @@
48
51
  drawerBody.innerHTML = '<div class="history-loading">Loading sessions…</div>';
49
52
  __viewingFile = null;
50
53
 
54
+ const currentKey = window.SESSION_KEY ?? "agent:main:main";
55
+ const url = "/api/sessions?currentKey=" + encodeURIComponent(currentKey);
56
+
51
57
  let sessions;
52
58
  try {
53
- const res = await fetch("/api/sessions");
54
- sessions = await res.json();
59
+ const res = await fetch(url);
60
+ const payload = await res.json();
61
+ // Response shape: { sessions: [...] } (2.7.1+)
62
+ sessions = Array.isArray(payload?.sessions) ? payload.sessions : [];
55
63
  } catch {
56
64
  drawerBody.innerHTML = '<div class="history-empty">Failed to load sessions.</div>';
57
65
  return;
@@ -62,52 +70,203 @@
62
70
  return;
63
71
  }
64
72
 
73
+ // Group rows: CURRENT / FAVOURITES / RECENT
74
+ const current = sessions.filter((s) => s.kind === "current");
75
+ const favourites = sessions.filter((s) => s.kind !== "current" && s.favorited);
76
+ const recent = sessions.filter((s) => s.kind !== "current" && !s.favorited);
77
+
65
78
  drawerBody.innerHTML = "";
66
- for (const s of sessions) {
67
- const item = document.createElement("div");
68
- item.className = "history-session-item";
69
-
70
- const when = s.archivedAt
71
- ? formatTimestamp(s.archivedAt)
72
- : s.mtime
73
- ? formatTimestamp(s.mtime) + " (active)"
74
- : "Unknown";
75
-
76
- const badge = s.isArchived
77
- ? `<span class="history-session-badge archived">ARCHIVED</span>`
78
- : `<span class="history-session-badge live">LIVE</span>`;
79
-
80
- const preview = s.preview
81
- ? escHtml(s.preview) + (s.preview.length >= 80 ? "" : "")
82
- : '<em style="opacity:0.5">No messages</em>';
83
-
84
- item.innerHTML = `
85
- <div>${badge}</div>
86
- <div class="history-session-meta">
87
- <span class="history-session-date">${escHtml(when)}</span>
88
- <span class="history-session-count">${s.msgCount} msgs · ${fmtSize(s.size)}</span>
89
- </div>
90
- <div class="history-session-preview">${preview}</div>
91
- `;
92
-
93
- item.addEventListener("click", () => loadTranscript(s.file, when));
94
-
95
- // "Load Session" button for archived sessions
96
- if (s.isArchived) {
97
- const loadBtn = document.createElement("button");
98
- loadBtn.className = "history-load-btn";
99
- loadBtn.textContent = "Load Session";
100
- loadBtn.addEventListener("click", (e) => {
101
- e.stopPropagation(); // don't open the transcript viewer
102
- void restoreSession(s.file);
103
- });
104
- item.appendChild(loadBtn);
79
+
80
+ if (current.length > 0) {
81
+ drawerBody.appendChild(renderSection("CURRENT", current));
82
+ }
83
+ if (favourites.length > 0) {
84
+ drawerBody.appendChild(renderSection("★ FAVOURITES", favourites));
85
+ }
86
+ if (recent.length > 0) {
87
+ drawerBody.appendChild(renderSection("RECENT", recent));
88
+ }
89
+ }
90
+
91
+ function renderSection(title, rows) {
92
+ const section = document.createElement("section");
93
+ section.className = "history-section";
94
+ const heading = document.createElement("div");
95
+ heading.className = "history-section-heading";
96
+ heading.textContent = title;
97
+ section.appendChild(heading);
98
+ for (const row of rows) {
99
+ section.appendChild(renderRow(row));
100
+ }
101
+ return section;
102
+ }
103
+
104
+ function renderRow(row) {
105
+ const item = document.createElement("div");
106
+ item.className = "history-session-item history-session-" + row.kind;
107
+
108
+ const badge = BADGE[row.kind] ?? BADGE.past;
109
+ const when = formatTimestamp(row.lastActivity);
110
+ const preview = row.preview
111
+ ? escHtml(row.preview) + (row.preview.length >= 80 ? "" : "")
112
+ : '<em style="opacity:0.5">No messages</em>';
113
+
114
+ item.innerHTML = `
115
+ <header class="history-session-header">
116
+ <button class="history-fav-btn ${row.favorited ? "active" : ""}"
117
+ aria-pressed="${row.favorited ? "true" : "false"}"
118
+ aria-label="${row.favorited ? "Unfavourite" : "Favourite"} session"
119
+ title="${row.favorited ? "Unfavourite" : "Favourite"}">★</button>
120
+ <span class="history-session-badge ${badge.className}">${badge.label}</span>
121
+ <span class="history-session-date">${escHtml(when)}</span>
122
+ </header>
123
+ <div class="history-session-meta">
124
+ <span class="history-session-count">${row.msgCount} msgs · ${fmtSize(row.size)}</span>
125
+ </div>
126
+ <div class="history-session-preview">${preview}</div>
127
+ <footer class="history-session-actions">
128
+ ${row.canLoad ? `<button class="history-load-btn">Load Session</button>` : ""}
129
+ ${row.canDelete ? `<button class="history-delete-btn">Delete</button>` : ""}
130
+ </footer>
131
+ `;
132
+
133
+ // Clicking the row body (not a button) opens the transcript viewer.
134
+ item.addEventListener("click", (e) => {
135
+ const target = e.target;
136
+ if (target instanceof Element && target.closest("button")) {
137
+ return; // button click handled below
138
+ }
139
+ void loadTranscript(row.file, when);
140
+ });
141
+
142
+ const favBtn = item.querySelector(".history-fav-btn");
143
+ favBtn?.addEventListener("click", async (e) => {
144
+ e.stopPropagation();
145
+ await toggleFavorite(row, favBtn);
146
+ });
147
+
148
+ const loadBtn = item.querySelector(".history-load-btn");
149
+ loadBtn?.addEventListener("click", async (e) => {
150
+ e.stopPropagation();
151
+ await loadRow(row);
152
+ });
153
+
154
+ const deleteBtn = item.querySelector(".history-delete-btn");
155
+ if (deleteBtn instanceof HTMLButtonElement) {
156
+ wireTwoStageDelete(deleteBtn, () => deleteRow(row));
157
+ }
158
+
159
+ return item;
160
+ }
161
+
162
+ const BADGE = {
163
+ current: { label: "CURRENT", className: "badge-current" },
164
+ past: { label: "PAST", className: "badge-past" },
165
+ archived: { label: "ARCHIVED", className: "badge-archived" },
166
+ };
167
+
168
+ // ── Actions ───────────────────────────────────────────────────────────
169
+
170
+ async function toggleFavorite(row, favBtn) {
171
+ if (!window.gateway?.connected) {
172
+ return;
173
+ }
174
+ const next = !row.favorited;
175
+ try {
176
+ await window.gateway.rpc("sessions.favoriteFile", {
177
+ file: row.file,
178
+ favorited: next,
179
+ });
180
+ row.favorited = next;
181
+ favBtn.classList.toggle("active", next);
182
+ favBtn.setAttribute("aria-pressed", next ? "true" : "false");
183
+ // Re-render to move the row between FAVOURITES and RECENT sections.
184
+ void loadSessionList();
185
+ } catch (err) {
186
+ console.warn("[history] favorite toggle failed", err);
187
+ }
188
+ }
189
+
190
+ async function loadRow(row) {
191
+ if (!window.gateway?.connected) {
192
+ alert("Gateway not connected.");
193
+ return;
194
+ }
195
+ drawerBody.innerHTML = '<div class="history-loading">Loading session…</div>';
196
+ try {
197
+ await window.gateway.rpc("sessions.adoptFile", {
198
+ key: window.SESSION_KEY,
199
+ targetFile: row.file,
200
+ });
201
+ closeDrawer();
202
+ if (typeof window.reloadSession === "function") {
203
+ window.reloadSession();
105
204
  }
205
+ } catch (err) {
206
+ drawerBody.innerHTML =
207
+ '<div class="history-empty">Load failed: ' +
208
+ escHtml(err?.message ?? String(err)) +
209
+ "</div>";
210
+ }
211
+ }
106
212
 
107
- drawerBody.appendChild(item);
213
+ async function deleteRow(row) {
214
+ if (!window.gateway?.connected) {
215
+ return;
216
+ }
217
+ try {
218
+ if (row.kind === "past" && row.sessionKey) {
219
+ // Archives the transcript via `sessions.delete` — the file becomes
220
+ // an ARCHIVED row in the next list refresh. Reversible.
221
+ await window.gateway.rpc("sessions.delete", {
222
+ key: row.sessionKey,
223
+ deleteTranscript: true,
224
+ });
225
+ } else {
226
+ // Archived files (or orphan live files): permanent deletion.
227
+ await window.gateway.rpc("sessions.deleteFile", { file: row.file });
228
+ }
229
+ await loadSessionList();
230
+ } catch (err) {
231
+ console.warn("[history] delete failed", err);
232
+ alert("Delete failed: " + (err?.message ?? String(err)));
108
233
  }
109
234
  }
110
235
 
236
+ /**
237
+ * Wire a Delete button as a two-stage confirm. First click arms it with
238
+ * "Really delete?" for DELETE_CONFIRM_MS; second click within the window
239
+ * runs the action. Auto-reverts if the user walks away.
240
+ */
241
+ function wireTwoStageDelete(btn, run) {
242
+ let armed = false;
243
+ let armTimer = null;
244
+ const originalLabel = btn.textContent;
245
+ btn.addEventListener("click", (e) => {
246
+ e.stopPropagation();
247
+ if (!armed) {
248
+ armed = true;
249
+ btn.textContent = "Really delete?";
250
+ btn.classList.add("armed");
251
+ if (armTimer) {
252
+ clearTimeout(armTimer);
253
+ }
254
+ armTimer = setTimeout(() => {
255
+ armed = false;
256
+ btn.textContent = originalLabel;
257
+ btn.classList.remove("armed");
258
+ }, DELETE_CONFIRM_MS);
259
+ return;
260
+ }
261
+ clearTimeout(armTimer);
262
+ armed = false;
263
+ btn.disabled = true;
264
+ btn.textContent = "Deleting…";
265
+ btn.classList.remove("armed");
266
+ void run();
267
+ });
268
+ }
269
+
111
270
  // ── Transcript viewer ─────────────────────────────────────────────────
112
271
  async function loadTranscript(file, label) {
113
272
  __viewingFile = file;
@@ -125,7 +284,6 @@
125
284
 
126
285
  drawerBody.innerHTML = "";
127
286
 
128
- // Banner
129
287
  const banner = document.createElement("div");
130
288
  banner.className = "archive-banner";
131
289
  banner.innerHTML = `
@@ -135,7 +293,6 @@
135
293
  drawerBody.appendChild(banner);
136
294
  drawerBody.querySelector("#archive-back-btn").addEventListener("click", loadSessionList);
137
295
 
138
- // Messages container
139
296
  const container = document.createElement("div");
140
297
  container.className = "history-transcript";
141
298
 
@@ -146,13 +303,11 @@
146
303
  for (const msg of relevant) {
147
304
  const el = document.createElement("div");
148
305
  el.className = `history-msg ${msg.role}`;
149
-
150
306
  const roleLabel = msg.role === "user" ? "YOU" : "SYMI";
151
307
  const text = extractMsgText(msg);
152
308
  if (!text.trim()) {
153
309
  continue;
154
310
  }
155
-
156
311
  el.innerHTML = `
157
312
  <div class="history-msg-role ${msg.role}">${roleLabel}</div>
158
313
  <div class="history-msg-text">${escHtml(text)}</div>
@@ -178,31 +333,6 @@
178
333
  openDrawer();
179
334
  });
180
335
 
181
- // ── Session restore ────────────────────────────────────────────────────
182
- async function restoreSession(file) {
183
- if (!window.gateway?.connected) {
184
- alert("Gateway not connected.");
185
- return;
186
- }
187
-
188
- drawerBody.innerHTML = '<div class="history-loading">Restoring session…</div>';
189
-
190
- try {
191
- await window.gateway.rpc("sessions.restore", {
192
- key: window.SESSION_KEY,
193
- targetFile: file,
194
- });
195
-
196
- // Close drawer and reload the chat with the restored session
197
- closeDrawer();
198
- if (typeof window.reloadSession === "function") {
199
- window.reloadSession();
200
- }
201
- } catch (err) {
202
- drawerBody.innerHTML = `<div class="history-empty">Restore failed: ${escHtml(err.message)}</div>`;
203
- }
204
- }
205
-
206
336
  // ── Helpers ───────────────────────────────────────────────────────────
207
337
  function extractMsgText(msg) {
208
338
  if (typeof msg.content === "string") {
@@ -227,22 +357,27 @@
227
357
  }
228
358
 
229
359
  function formatTimestamp(iso) {
230
- try {
231
- const d = new Date(iso);
232
- return d.toLocaleString("en-US", {
233
- month: "short",
234
- day: "numeric",
235
- year: "numeric",
236
- hour: "2-digit",
237
- minute: "2-digit",
238
- hour12: true,
239
- });
240
- } catch {
241
- return iso;
360
+ if (!iso) {
361
+ return "Unknown";
242
362
  }
363
+ const d = new Date(iso);
364
+ if (Number.isNaN(d.getTime())) {
365
+ return "Unknown";
366
+ }
367
+ return d.toLocaleString("en-US", {
368
+ month: "short",
369
+ day: "numeric",
370
+ year: "numeric",
371
+ hour: "2-digit",
372
+ minute: "2-digit",
373
+ hour12: true,
374
+ });
243
375
  }
244
376
 
245
377
  function fmtSize(bytes) {
378
+ if (typeof bytes !== "number" || !Number.isFinite(bytes) || bytes < 0) {
379
+ return "0B";
380
+ }
246
381
  if (bytes < 1024) {
247
382
  return `${bytes}B`;
248
383
  }
@@ -335,8 +335,21 @@ function openDebugPanel() {
335
335
  a.click();
336
336
  });
337
337
 
338
- // Start capturing events
339
- window.__debugPanelCapture = function (type, payload) {
338
+ // Start capturing events. If a previous capture closure is still attached
339
+ // (rapid re-open race), mark it cancelled so its body no-ops before we
340
+ // swap in the new one. Without this, the previous closure keeps reading
341
+ // the old panel's DOM even after it's gone and throws silently.
342
+ if (window.__debugPanelCapture && typeof window.__debugPanelCapture === "function") {
343
+ try {
344
+ window.__debugPanelCapture.__cancelled = true;
345
+ } catch {
346
+ /* non-extensible function — ignore */
347
+ }
348
+ }
349
+ const capture = function (type, payload) {
350
+ if (capture.__cancelled) {
351
+ return;
352
+ }
340
353
  if (debugPaused) {
341
354
  return;
342
355
  }
@@ -356,6 +369,8 @@ function openDebugPanel() {
356
369
  }
357
370
  renderDebugEntries();
358
371
  };
372
+ capture.__cancelled = false;
373
+ window.__debugPanelCapture = capture;
359
374
  }
360
375
 
361
376
  function renderDebugEntries() {
@@ -395,6 +410,16 @@ function renderDebugEntries() {
395
410
  }
396
411
 
397
412
  function closeDebugPanel() {
413
+ // Cancel any pending capture closure before dropping the reference so
414
+ // in-flight capture() calls short-circuit if they were already scheduled.
415
+ const existing = window.__debugPanelCapture;
416
+ if (existing && typeof existing === "function") {
417
+ try {
418
+ existing.__cancelled = true;
419
+ } catch {
420
+ /* non-extensible — ignore */
421
+ }
422
+ }
398
423
  window.__debugPanelCapture = null;
399
424
  }
400
425
 
@@ -680,16 +705,42 @@ function renderDataCard(key, value) {
680
705
  </div>`;
681
706
  }
682
707
 
683
- function renderListData(items) {
708
+ // Pagination state per generic panel — keyed by the page identifier.
709
+ // Resets when the panel is opened; survives across refresh within one session.
710
+ const GENERIC_PAGE_SIZE = 50;
711
+ const genericShownCount = new Map();
712
+
713
+ function resetGenericPagination(page) {
714
+ genericShownCount.set(page, GENERIC_PAGE_SIZE);
715
+ }
716
+
717
+ function bumpGenericPagination(page) {
718
+ const cur = genericShownCount.get(page) ?? GENERIC_PAGE_SIZE;
719
+ genericShownCount.set(page, cur + GENERIC_PAGE_SIZE);
720
+ }
721
+
722
+ function renderListData(items, page) {
684
723
  if (!items || items.length === 0) {
685
724
  return '<div class="settings-empty">No items found.</div>';
686
725
  }
687
- return items
726
+ const shown = page ? (genericShownCount.get(page) ?? GENERIC_PAGE_SIZE) : items.length;
727
+ const slice = items.slice(0, shown);
728
+ const html = slice
688
729
  .map((item, i) => {
689
730
  const title = item.name || item.id || item.sessionKey || item.label || `Item ${i + 1}`;
690
731
  return renderDataCard(title, item);
691
732
  })
692
733
  .join("");
734
+ if (!page || items.length <= shown) {
735
+ return html;
736
+ }
737
+ const remaining = items.length - shown;
738
+ const nextBatch = Math.min(GENERIC_PAGE_SIZE, remaining);
739
+ return `${html}
740
+ <div class="settings-pagination">
741
+ <span class="settings-pagination-info">Showing ${shown} of ${items.length}</span>
742
+ <button class="settings-btn" id="generic-show-more-btn" data-page="${escapeSettingsHtml(page)}">Show ${nextBatch} more</button>
743
+ </div>`;
693
744
  }
694
745
 
695
746
  function renderObjectData(data) {
@@ -760,9 +811,21 @@ async function openGenericPanel(page) {
760
811
  </div>
761
812
  `;
762
813
 
763
- document
764
- .getElementById("generic-refresh-btn")
765
- .addEventListener("click", () => void loadGenericData(page));
814
+ document.getElementById("generic-refresh-btn").addEventListener("click", () => {
815
+ resetGenericPagination(page);
816
+ void loadGenericData(page);
817
+ });
818
+ // Delegated click handler for the "Show more" button rendered inside
819
+ // generic-content. We attach on the container so it survives innerHTML
820
+ // re-renders driven by loadGenericData.
821
+ container.addEventListener("click", (e) => {
822
+ const target = e.target;
823
+ if (target && target.id === "generic-show-more-btn") {
824
+ bumpGenericPagination(page);
825
+ void loadGenericData(page);
826
+ }
827
+ });
828
+ resetGenericPagination(page);
766
829
  await loadGenericData(page);
767
830
  }
768
831
 
@@ -788,7 +851,7 @@ async function loadGenericData(page) {
788
851
  }
789
852
  if (spec.type === "list") {
790
853
  const items = spec.key ? result[spec.key] : Array.isArray(result) ? result : [];
791
- content.innerHTML = renderListData(items);
854
+ content.innerHTML = renderListData(items, page);
792
855
  } else {
793
856
  content.innerHTML = renderObjectData(result);
794
857
  }
@@ -16,15 +16,15 @@ import { n as listChannelPlugins } from "./plugins-DKDeQZF0.js";
16
16
  import "./accounts-DDuIpcln.js";
17
17
  import "./bindings-DFaVVCsf.js";
18
18
  import "./logging-w5jq5901.js";
19
- import "./client-jI1oE0_k.js";
20
- import "./call-DwpGquzW.js";
19
+ import "./client-B8xmq-Pw.js";
20
+ import "./call-CX0cs106.js";
21
21
  import "./pairing-token-CX3NN_qj.js";
22
22
  import { t as formatDocsLink } from "./links-3i1eUga4.js";
23
23
  import "./progress-jIePzvGA.js";
24
24
  import { n as formatDurationHuman } from "./format-duration-D0B0Uo-I.js";
25
25
  import { i as parseAbsoluteTimeMs, n as resolveCronStaggerMs } from "./stagger-CvFURHzt.js";
26
26
  import { n as parsePositiveIntOrUndefined } from "./helpers-BtH6pa6c.js";
27
- import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-5fREQe9Q.js";
27
+ import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-WM-HXUbl.js";
28
28
 
29
29
  //#region src/cli/cron-cli/shared.ts
30
30
  const getCronChannelOptions = () => ["last", ...listChannelPlugins().map((plugin) => plugin.id)].join("|");
@@ -6,8 +6,8 @@ import "./agent-scope-D-jRCY0d.js";
6
6
  import "./github-copilot-token-DuFIqfeC.js";
7
7
  import "./manifest-registry-Czr39pxG.js";
8
8
  import "./config-BNTB6qj8.js";
9
- import "./client-T3qcxXru.js";
10
- import "./call-DKi-hnaF.js";
9
+ import "./client-qUlxXXVJ.js";
10
+ import "./call-DeCQ2DhS.js";
11
11
  import "./message-channel-C9dERklz.js";
12
12
  import "./pairing-token-Byh6drgn.js";
13
13
  import { n as listChannelPlugins } from "./plugins-CwSlLxM8.js";
@@ -18,7 +18,7 @@ import { n as formatDurationHuman } from "./format-duration-BOC0O2XQ.js";
18
18
  import { i as parseAbsoluteTimeMs, n as resolveCronStaggerMs } from "./stagger-CQar2eKe.js";
19
19
  import { t as formatDocsLink } from "./links-DlWpl9Yv.js";
20
20
  import "./progress-BAHiAaDW.js";
21
- import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-BMdVa3QV.js";
21
+ import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-BWTK7g8B.js";
22
22
  import { n as parsePositiveIntOrUndefined } from "./helpers-ITexi1_a.js";
23
23
 
24
24
  //#region src/cli/cron-cli/shared.ts
@@ -9,10 +9,10 @@ import { n as pickPrimaryTailnetIPv4 } from "./tailnet-B2SPYrh4.js";
9
9
  import { u as resolveGatewayBindHost } from "./ws-C7EXRv8z.js";
10
10
  import { a as resolveGatewayAuth } from "./auth-B741uFtk.js";
11
11
  import { a as inspectPortUsage, s as formatPortDiagnostics } from "./ports-BOmtxoTv.js";
12
- import { n as callGateway } from "./call-DwpGquzW.js";
12
+ import { n as callGateway } from "./call-CX0cs106.js";
13
13
  import { t as formatDocsLink } from "./links-3i1eUga4.js";
14
14
  import { n as withProgress } from "./progress-jIePzvGA.js";
15
- import { g as resolveControlUiLinks, h as randomToken } from "./onboard-helpers-DFvWPFhU.js";
15
+ import { g as resolveControlUiLinks, h as randomToken } from "./onboard-helpers-CueJ7O_B.js";
16
16
  import { n as isWSLEnv } from "./wsl-q8spwrME.js";
17
17
  import { c as resolveGatewayLaunchAgentLabel, d as resolveGatewaySystemdServiceName } from "./constants-CafH8-8D.js";
18
18
  import { n as inheritOptionFromParent } from "./command-options-BkTXKWlb.js";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { At as getResolvedLoggerSettings, Dt as theme, Et as isRich, Tt as colorize, Ut as resolveGatewayPort, Wt as resolveIsNixMode, Yt as resolveStateDir, _ as defaultRuntime, lt as shortenHomePath, zt as resolveConfigPath } from "./entry.js";
3
3
  import { t as formatCliCommand } from "./command-format-BtYOfWxC.js";
4
4
  import { i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot, r as createConfigIO } from "./config-BNTB6qj8.js";
5
- import { n as callGateway } from "./call-DKi-hnaF.js";
5
+ import { n as callGateway } from "./call-DeCQ2DhS.js";
6
6
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-C9dERklz.js";
7
7
  import { l as resolveGatewayBindHost } from "./net-DZ5Ayk-W.js";
8
8
  import { n as pickPrimaryTailnetIPv4 } from "./tailnet-Cmumpn76.js";
@@ -11,7 +11,7 @@ import { i as formatPortDiagnostics, n as inspectPortUsage } from "./ports-2xFXb
11
11
  import { c as resolveGatewayLaunchAgentLabel, d as resolveGatewaySystemdServiceName } from "./constants-CPeVoSXJ.js";
12
12
  import { t as formatDocsLink } from "./links-DlWpl9Yv.js";
13
13
  import { n as withProgress } from "./progress-BAHiAaDW.js";
14
- import { g as resolveControlUiLinks, h as randomToken } from "./onboard-helpers-BBtPmJEe.js";
14
+ import { g as resolveControlUiLinks, h as randomToken } from "./onboard-helpers-PpGrZIGw.js";
15
15
  import { n as isWSLEnv } from "./wsl-jdLWdiKy.js";
16
16
  import { n as inheritOptionFromParent } from "./command-options-6wdtBBWB.js";
17
17
  import { i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-CVFg-ZmT.js";
@@ -10631,6 +10631,15 @@ const SessionsRestoreParamsSchema = Type.Object({
10631
10631
  key: NonEmptyString,
10632
10632
  targetFile: NonEmptyString
10633
10633
  }, { additionalProperties: false });
10634
+ const SessionsAdoptFileParamsSchema = Type.Object({
10635
+ key: NonEmptyString,
10636
+ targetFile: NonEmptyString
10637
+ }, { additionalProperties: false });
10638
+ const SessionsFavoriteFileParamsSchema = Type.Object({
10639
+ file: NonEmptyString,
10640
+ favorited: Type.Boolean()
10641
+ }, { additionalProperties: false });
10642
+ const SessionsDeleteFileParamsSchema = Type.Object({ file: NonEmptyString }, { additionalProperties: false });
10634
10643
  const SessionsDeleteParamsSchema = Type.Object({
10635
10644
  key: NonEmptyString,
10636
10645
  deleteTranscript: Type.Optional(Type.Boolean()),
@@ -10763,6 +10772,9 @@ const validateSessionsResolveParams = ajv.compile(SessionsResolveParamsSchema);
10763
10772
  const validateSessionsPatchParams = ajv.compile(SessionsPatchParamsSchema);
10764
10773
  const validateSessionsResetParams = ajv.compile(SessionsResetParamsSchema);
10765
10774
  const validateSessionsRestoreParams = ajv.compile(SessionsRestoreParamsSchema);
10775
+ const validateSessionsAdoptFileParams = ajv.compile(SessionsAdoptFileParamsSchema);
10776
+ const validateSessionsFavoriteFileParams = ajv.compile(SessionsFavoriteFileParamsSchema);
10777
+ const validateSessionsDeleteFileParams = ajv.compile(SessionsDeleteFileParamsSchema);
10766
10778
  const validateSessionsDeleteParams = ajv.compile(SessionsDeleteParamsSchema);
10767
10779
  const validateSessionsCompactParams = ajv.compile(SessionsCompactParamsSchema);
10768
10780
  const validateSessionsUsageParams = ajv.compile(SessionsUsageParamsSchema);
@@ -5,7 +5,7 @@ import { c as getActivePluginRegistry, v as createInternalHookEvent, y as trigge
5
5
  import { t as createSubsystemLogger } from "./subsystem-CZixfwU8.js";
6
6
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-Cn6drXx2.js";
7
7
  import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-71oIavrF.js";
8
- import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-Dij3O6ox.js";
8
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-DXAoe1Bx.js";
9
9
  import { d as getChannelDock } from "./thinking-W85Rb32m.js";
10
10
  import { c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph } from "./chunk-DTMTDXwE.js";
11
11
  import { n as resolveMarkdownTableMode } from "./markdown-tables-DawaaZEe.js";
@@ -5,8 +5,8 @@ import "./agent-scope-D-jRCY0d.js";
5
5
  import "./github-copilot-token-DuFIqfeC.js";
6
6
  import "./manifest-registry-Czr39pxG.js";
7
7
  import "./config-BNTB6qj8.js";
8
- import { Gt as summarizeDeviceTokens, It as approveDevicePairing, zt as listDevicePairing } from "./client-T3qcxXru.js";
9
- import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-DKi-hnaF.js";
8
+ import { Ht as listDevicePairing, Jt as summarizeDeviceTokens, zt as approveDevicePairing } from "./client-qUlxXXVJ.js";
9
+ import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-DeCQ2DhS.js";
10
10
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-C9dERklz.js";
11
11
  import "./pairing-token-Byh6drgn.js";
12
12
  import { n as isLoopbackHost } from "./net-DZ5Ayk-W.js";
@@ -12,8 +12,8 @@ import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-
12
12
  import "./config-Dz95lSBW.js";
13
13
  import "./manifest-registry-C4BxOMWX.js";
14
14
  import { r as isLoopbackHost } from "./ws-C7EXRv8z.js";
15
- import { Gt as summarizeDeviceTokens, It as approveDevicePairing, zt as listDevicePairing } from "./client-jI1oE0_k.js";
16
- import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-DwpGquzW.js";
15
+ import { Ht as listDevicePairing, Jt as summarizeDeviceTokens, zt as approveDevicePairing } from "./client-B8xmq-Pw.js";
16
+ import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-CX0cs106.js";
17
17
  import "./pairing-token-CX3NN_qj.js";
18
18
  import { n as formatTimeAgo } from "./format-relative-BXoxEQVN.js";
19
19
  import { n as withProgress } from "./progress-jIePzvGA.js";
@@ -1,7 +1,7 @@
1
1
  import { r as resolveCliName } from "./command-format-BtYOfWxC.js";
2
2
  import { t as resolveSymiPackageRoot } from "./symi-root-BNuQ4lAT.js";
3
3
  import { t as note } from "./note-DDecZomM.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-CUKm7Hb6.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-cyVjlhls.js";
5
5
  import { spawnSync } from "node:child_process";
6
6
  import path from "node:path";
7
7