@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
@@ -15,14 +15,14 @@ import { r as buildWorkspaceSkillSnapshot } from "./skills-hAdgFdrv.js";
15
15
  import { l as isTestDefaultMemorySlotDisabled } from "./manifest-registry-Czr39pxG.js";
16
16
  import "./skills-status-DKXJ-tbi.js";
17
17
  import { B as resolveAgentMaxConcurrent, C as parseDurationMs, H as VERSION, U as resolveRuntimeServiceVersion, V as resolveSubagentMaxConcurrent, i as loadConfig, l as writeConfigFile, n as migrateLegacyConfig, o as readConfigFileSnapshot, r as createConfigIO } from "./config-BNTB6qj8.js";
18
- import { $t as verifyDeviceSignature, At as PROTOCOL_VERSION, Ft as buildDeviceAuthPayload, Ht as requestDevicePairing, It as approveDevicePairing, Jt as roleScopesAllow, Kt as updatePairedDeviceMetadata, Lt as ensureDeviceToken, Mt as errorShape, Qt as normalizeDevicePublicKeyBase64Url, R as validateExecApprovalRequestParams, Rt as getPairedDevice, Xt as deriveDeviceIdFromPublicKey, at as validateRequestFrame, jt as ErrorCodes, n as formatValidationErrors, qt as verifyDeviceToken, w as validateConnectParams, z as validateExecApprovalResolveParams } from "./client-T3qcxXru.js";
19
- import { f as loadGatewayTlsRuntime$1, n as callGateway } from "./call-DKi-hnaF.js";
18
+ import { $t as deriveDeviceIdFromPublicKey, Bt as ensureDeviceToken, Ft as errorShape, Gt as requestDevicePairing, Nt as PROTOCOL_VERSION, Pt as ErrorCodes, R as validateExecApprovalRequestParams, Rt as buildDeviceAuthPayload, Vt as getPairedDevice, Xt as verifyDeviceToken, Yt as updatePairedDeviceMetadata, Zt as roleScopesAllow, at as validateRequestFrame, n as formatValidationErrors, nn as verifyDeviceSignature, tn as normalizeDevicePublicKeyBase64Url, w as validateConnectParams, z as validateExecApprovalResolveParams, zt as approveDevicePairing } from "./client-qUlxXXVJ.js";
19
+ import { f as loadGatewayTlsRuntime$1, n as callGateway } from "./call-DeCQ2DhS.js";
20
20
  import { _ as normalizeGatewayClientMode, h as GATEWAY_CLIENT_NAMES, l as normalizeMessageChannel, m as GATEWAY_CLIENT_MODES, n as isDeliverableMessageChannel, p as GATEWAY_CLIENT_IDS, r as isGatewayCliClient, s as isWebchatClient } from "./message-channel-C9dERklz.js";
21
21
  import "./pairing-token-Byh6drgn.js";
22
22
  import { t as safeEqualSecret } from "./secret-equal-CbntzRkh.js";
23
23
  import { a as isValidIPv4, c as resolveClientIp, d as resolveHostName, f as rawDataToString, i as isTrustedProxyAddress, l as resolveGatewayBindHost, n as isLoopbackHost, o as normalizeHostHeader, t as isLoopbackAddress, u as resolveGatewayListenHosts } from "./net-DZ5Ayk-W.js";
24
24
  import { n as pickPrimaryTailnetIPv4, r as pickPrimaryTailnetIPv6 } from "./tailnet-Cmumpn76.js";
25
- import { $ as getCliSessionId, $t as setPreRestartDeferralCheck, An as DEFAULT_INPUT_TIMEOUT_MS, At as normalizeOptionalSessionKey, Bt as buildSafeExternalPrompt, Cn as enqueueSystemEvent, Cr as onAgentEvent, Dn as DEFAULT_INPUT_IMAGE_MAX_BYTES, E as createDefaultDeps, F as buildHistoryContextFromEntries, Ft as buildDeliveryFromLegacyPayload, H as getTotalPendingReplies, Ht as getHookType, In as resolveAgentTimeoutMs, It as hasLegacyDeliveryHints, J as runAgentTurn, Jt as emitGatewayRestart, Kt as consumeGatewaySigusr1RestartAuthorization, Lt as stripLegacyDeliveryFields, Mn as extractImageContentFromSource, Mt as normalizePayloadToSystemText, Nn as normalizeMimeList, Nt as normalizeRequiredName, O as resolveAgentAvatar, On as DEFAULT_INPUT_IMAGE_MIMES, Ot as inferLegacyName, Pn as resolveInputFileLimits, Pt as migrateLegacyCronPayload, Q as resolveModelProfile, Qt as setGatewaySigusr1RestartPolicy, Sr as getAgentRunContext, St as summarizeRestartSentinel, T as createOutboundSendDeps, Tt as normalizeHttpWebhookUrl, Ut as isExternalHookSession, Vt as detectSuspiciousPatterns, X as getActiveEmbeddedRunCount, Xt as markGatewaySigusr1RestartHandled, Yt as isGatewaySigusr1RestartExternallyAllowed, _ as readJsonBodyWithLimit, at as resolveAnnounceTargetFromKey, b as sleepWithAbort, br as clearAgentRunContext, bt as formatRestartSentinelMessage, cr as getActiveTaskCount, ct as resolveOutboundSessionRoute, dn as requestHeartbeatNow, dr as resetAllLanes, dt as resolveOutboundTarget, et as setCliSessionId, f as getPluginToolMeta, fr as setCommandLaneConcurrency, ft as resolveSessionDeliveryTarget, g as handleSlackHttpRequest, gt as runWithModelFallback, hr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, i as listDescendantRunsForRequester, it as readLatestAssistantReply, jn as extractFileContentFromSource, jt as normalizeOptionalText, kn as DEFAULT_INPUT_MAX_REDIRECTS, kt as normalizeOptionalAgentId, l as applyToolPolicyPipeline, m as loadSymiPlugins, mr as CommandLane, mt as resetDirectoryCache, n as countActiveRunsForSession, pr as waitForActiveTasks, q as resolveCronStyleNow, qt as deferGatewayRestartUntilIdle, r as initSubagentRegistry, rt as createSymiTools, s as runSubagentAnnounceFlow, t as countActiveDescendantRuns, tt as runCliAgent, u as buildDefaultToolPolicyPipelineSteps, ur as getTotalQueueSize, v as requestBodyErrorToText, vt as consumeRestartSentinel, wr as registerAgentRunContext, x as agentCommand, xr as emitAgentEvent, y as computeBackoff, yr as stripHeartbeatToken } from "./subagent-registry-DQHg3jUV.js";
25
+ import { $ as getCliSessionId, $t as setPreRestartDeferralCheck, An as DEFAULT_INPUT_TIMEOUT_MS, At as normalizeOptionalSessionKey, Bt as buildSafeExternalPrompt, Cn as enqueueSystemEvent, Cr as onAgentEvent, Dn as DEFAULT_INPUT_IMAGE_MAX_BYTES, E as createDefaultDeps, F as buildHistoryContextFromEntries, Ft as buildDeliveryFromLegacyPayload, H as getTotalPendingReplies, Ht as getHookType, In as resolveAgentTimeoutMs, It as hasLegacyDeliveryHints, J as runAgentTurn, Jt as emitGatewayRestart, Kt as consumeGatewaySigusr1RestartAuthorization, Lt as stripLegacyDeliveryFields, Mn as extractImageContentFromSource, Mt as normalizePayloadToSystemText, Nn as normalizeMimeList, Nt as normalizeRequiredName, O as resolveAgentAvatar, On as DEFAULT_INPUT_IMAGE_MIMES, Ot as inferLegacyName, Pn as resolveInputFileLimits, Pt as migrateLegacyCronPayload, Q as resolveModelProfile, Qt as setGatewaySigusr1RestartPolicy, Sr as getAgentRunContext, St as summarizeRestartSentinel, T as createOutboundSendDeps, Tt as normalizeHttpWebhookUrl, Ut as isExternalHookSession, Vt as detectSuspiciousPatterns, X as getActiveEmbeddedRunCount, Xt as markGatewaySigusr1RestartHandled, Yt as isGatewaySigusr1RestartExternallyAllowed, _ as readJsonBodyWithLimit, at as resolveAnnounceTargetFromKey, b as sleepWithAbort, br as clearAgentRunContext, bt as formatRestartSentinelMessage, cr as getActiveTaskCount, ct as resolveOutboundSessionRoute, dn as requestHeartbeatNow, dr as resetAllLanes, dt as resolveOutboundTarget, et as setCliSessionId, f as getPluginToolMeta, fr as setCommandLaneConcurrency, ft as resolveSessionDeliveryTarget, g as handleSlackHttpRequest, gt as runWithModelFallback, hr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, i as listDescendantRunsForRequester, it as readLatestAssistantReply, jn as extractFileContentFromSource, jt as normalizeOptionalText, kn as DEFAULT_INPUT_MAX_REDIRECTS, kt as normalizeOptionalAgentId, l as applyToolPolicyPipeline, m as loadSymiPlugins, mr as CommandLane, mt as resetDirectoryCache, n as countActiveRunsForSession, pr as waitForActiveTasks, q as resolveCronStyleNow, qt as deferGatewayRestartUntilIdle, r as initSubagentRegistry, rt as createSymiTools, s as runSubagentAnnounceFlow, t as countActiveDescendantRuns, tt as runCliAgent, u as buildDefaultToolPolicyPipelineSteps, ur as getTotalQueueSize, v as requestBodyErrorToText, vt as consumeRestartSentinel, wr as registerAgentRunContext, x as agentCommand, xr as emitAgentEvent, y as computeBackoff, yr as stripHeartbeatToken } from "./subagent-registry-DCoU9xIE.js";
26
26
  import { D as resolveSessionResetPolicy, F as resolveMainSessionKey, H as cleanStaleLockFiles, I as resolveMainSessionKeyFromConfig, K as mergeDeliveryContext, M as canonicalizeMainSessionAlias, N as resolveAgentMainSessionKey, T as evaluateSessionFreshness, W as deliveryContextFromSession, d as updateSessionStore, n as parseSessionThreadInfo, o as loadSessionStore } from "./sessions-Cfa6JEB3.js";
27
27
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-Csntmwwn.js";
28
28
  import { n as listChannelPlugins, o as normalizeWhatsAppTarget, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";
@@ -103,7 +103,7 @@ import { n as runCommandWithRuntime } from "./cli-utils-CCaEbxAz.js";
103
103
  import { t as formatHelpExamples } from "./help-format-B0pWGnZs.js";
104
104
  import { n as withProgress } from "./progress-BAHiAaDW.js";
105
105
  import "./replies-Bo49QlAg.js";
106
- import { C as normalizeControlUiBasePath, S as buildControlUiAvatarUrl, c as handleReset, w as resolveAssistantAvatarUrl, x as CONTROL_UI_AVATAR_PREFIX } from "./onboard-helpers-BBtPmJEe.js";
106
+ import { C as normalizeControlUiBasePath, S as buildControlUiAvatarUrl, c as handleReset, w as resolveAssistantAvatarUrl, x as CONTROL_UI_AVATAR_PREFIX } from "./onboard-helpers-PpGrZIGw.js";
107
107
  import "./prompt-style-DwCXob2h.js";
108
108
  import "./pairing-labels-D1HDboV2.js";
109
109
  import { a as resolveSubagentToolPolicy, i as resolveGroupToolPolicy, r as resolveEffectiveToolPolicy } from "./pi-tools.policy-DxNwL7Dl.js";
@@ -124,27 +124,27 @@ import "./service-Cm9j9WzQ.js";
124
124
  import "./lifecycle-core-BZ5sOcHT.js";
125
125
  import "./systemd-hints-DT6cDIM2.js";
126
126
  import { t as parsePort$1 } from "./parse-port-BQ0_YQqL.js";
127
- import { n as addGatewayServiceCommands } from "./daemon-cli-DhJYEAoL.js";
127
+ import { n as addGatewayServiceCommands } from "./daemon-cli-BxKtiouf.js";
128
128
  import "./diagnostics-CS1ov_hH.js";
129
129
  import "./table-D01d2GuY.js";
130
130
  import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } from "./widearea-dns-CsKTEo__.js";
131
131
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-BtG9rny3.js";
132
- import { c as probeGateway, s as resolveNodeCommandAllowlist } from "./audit-BjI_Yyr5.js";
132
+ import { c as probeGateway, s as resolveNodeCommandAllowlist } from "./audit-xSagQWH8.js";
133
133
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-CA_XIzr_.js";
134
- import { i as pickGatewaySelfPresence } from "./status-DfPfMVNZ.js";
135
- import { a as styleHealthChannelLine, l as startHeartbeatRunner, n as getHealthSnapshot, s as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-cVvZdeDu.js";
134
+ import { i as pickGatewaySelfPresence } from "./status-qkmUAeWo.js";
135
+ import { a as styleHealthChannelLine, l as startHeartbeatRunner, n as getHealthSnapshot, s as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-CsTxt66a.js";
136
136
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-BseSWee1.js";
137
137
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-ZdimP1aU.js";
138
- import { t as runOnboardingWizard } from "./onboarding-Dp7p6zKa.js";
139
- import { _ as getHandshakeTimeoutMs, a as DEFAULT_ASSISTANT_IDENTITY, b as resolveCronRunLogPath, c as upsertPresence, d as DEDUPE_MAX, f as DEDUPE_TTL_MS, g as TICK_INTERVAL_MS, h as MAX_PAYLOAD_BYTES, i as safeParseJson, l as formatError, m as MAX_BUFFERED_BYTES, n as handleGatewayRequest, o as resolveAssistantIdentity, p as HEALTH_REFRESH_INTERVAL_MS, r as broadcastPresenceSnapshot, s as listSystemPresence, t as coreGatewayHandlers, u as loadVoiceWakeConfig, v as abortChatRunById, x as startGatewayConfigReloader, y as appendCronRunLog } from "./server-methods-CWcLut3F.js";
140
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-CYC70eKy.js";
138
+ import { t as runOnboardingWizard } from "./onboarding-BJcYsOFw.js";
139
+ import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-0ksPFnev.js";
140
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-B5txhDVi.js";
141
141
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-CzWeiE-Y.js";
142
- import "./agents.config-BKCY6F2A.js";
142
+ import "./agents.config-C951ocyh.js";
143
143
  import "./dm-policy-shared-DJ-61hCT.js";
144
144
  import "./node-service-fcZExd22.js";
145
145
  import "./status.update-C2GN8s9C.js";
146
146
  import "./skills-install-1ZdwGTnh.js";
147
- import "./update-runner-DVa6cMqp.js";
147
+ import "./update-runner-BhVsdpxm.js";
148
148
  import { t as resolveAgentSessionDirs } from "./session-dirs-DWgIYmAt.js";
149
149
  import { i as shouldIncludeHook, r as resolveHookConfig, t as loadWorkspaceHookEntries } from "./workspace-B51TF6q3.js";
150
150
  import { n as forceFreePortAndWait } from "./ports-Dn122MUd.js";
@@ -5594,6 +5594,9 @@ const BASE_METHODS = [
5594
5594
  "sessions.patch",
5595
5595
  "sessions.reset",
5596
5596
  "sessions.restore",
5597
+ "sessions.adoptFile",
5598
+ "sessions.favoriteFile",
5599
+ "sessions.deleteFile",
5597
5600
  "sessions.delete",
5598
5601
  "sessions.compact",
5599
5602
  "last-heartbeat",
@@ -7381,15 +7384,30 @@ function serveFile(res, filePath) {
7381
7384
  res.end(fs.readFileSync(filePath));
7382
7385
  }
7383
7386
  /** Cache-bust token: changes every time the gateway process starts. */
7384
- const CACHE_BUST = `v=${Date.now()}`;
7387
+ const CACHE_BUST_VERSION = `${Date.now()}`;
7388
+ /**
7389
+ * Matches `<script src="..."` or `<link ... href="..."` (or single-quoted),
7390
+ * capturing: (1) the tag + attr lead-in, (2) the opening quote, (3) the URL,
7391
+ * (4) the closing quote (back-reference to ensure quotes match). The URL
7392
+ * capture is non-greedy and restricted to `.js`, `.mjs`, or `.css` so unrelated
7393
+ * links (fonts, favicons, `type="module"` without src, etc.) are left alone.
7394
+ *
7395
+ * Tag matching is loose (`[^>]*`) so attribute order and optional attributes
7396
+ * like `type="module"` or `rel="stylesheet preload"` don't break the match.
7397
+ */
7398
+ const CACHE_BUST_TAG_RE = /(<(?:script|link)\b[^>]*?\b(?:src|href)\s*=\s*)(["'])([^"'>]+?\.(?:mjs|js|css)(?:\?[^"'>]*)?)(\2)/gi;
7399
+ function injectCacheBust(html, version = CACHE_BUST_VERSION) {
7400
+ return html.replace(CACHE_BUST_TAG_RE, (match, lead, open, url, close) => {
7401
+ if (/^(https?:)?\/\//i.test(url)) return match;
7402
+ if (/[?&]v=/.test(url)) return match;
7403
+ return `${lead}${open}${url}${url.includes("?") ? "&" : "?"}v=${version}${close}`;
7404
+ });
7405
+ }
7385
7406
  function serveIndexHtml(res, indexPath) {
7386
7407
  res.setHeader("Content-Type", "text/html; charset=utf-8");
7387
7408
  res.setHeader("Cache-Control", "no-cache");
7388
- let html = fs.readFileSync(indexPath, "utf8");
7389
- html = html.replace(/(<(?:script\s+src|link\s+rel="stylesheet"\s+href)=")([^"]+\.(?:js|css))(")/g, (_, before, url, after) => {
7390
- return `${before}${url}${url.includes("?") ? "&" : "?"}${CACHE_BUST}${after}`;
7391
- });
7392
- res.end(html);
7409
+ const html = fs.readFileSync(indexPath, "utf8");
7410
+ res.end(injectCacheBust(html));
7393
7411
  }
7394
7412
  function isSafeRelativePath(relPath) {
7395
7413
  if (!relPath) return false;
@@ -8843,22 +8861,25 @@ async function handleOpenResponsesHttpRequest(req, res, opts) {
8843
8861
  /**
8844
8862
  * HTTP API for session history — serves the Glass UI History drawer.
8845
8863
  *
8846
- * GET /api/sessions — List all sessions with metadata
8847
- * GET /api/transcript?file=<filename> Read a session transcript
8864
+ * GET /api/sessions?currentKey=<sessionKey>
8865
+ * List all sessions (live + archived) with metadata. Passing `currentKey`
8866
+ * lets the server mark exactly one row as `kind: "current"`. Response shape:
8867
+ * { sessions: SessionHistoryRow[] }
8868
+ *
8869
+ * GET /api/transcript?file=<basename>
8870
+ * Read a session transcript (active or archived). Returns:
8871
+ * { messages: AgentMessage[] }
8848
8872
  *
8849
- * Both endpoints are read-only and serve data from the existing session
8850
- * store and .jsonl transcript files.
8873
+ * Both endpoints are read-only. Mutations (adopt, favorite, delete) go
8874
+ * through the gateway RPC (`sessions.adoptFile`, `sessions.favoriteFile`,
8875
+ * `sessions.deleteFile`).
8851
8876
  *
8852
8877
  * @module
8853
8878
  */
8854
- /**
8855
- * Handle /api/sessions and /api/transcript HTTP requests.
8856
- * Returns true if the request was handled, false otherwise.
8857
- */
8858
8879
  function handleSessionsApiRequest(req, res, cfg) {
8859
8880
  const url = new URL(req.url ?? "/", "http://localhost");
8860
8881
  if (url.pathname === "/api/sessions" && req.method === "GET") {
8861
- handleListSessions(res, cfg);
8882
+ handleListSessions(res, cfg, url.searchParams.get("currentKey") ?? void 0);
8862
8883
  return true;
8863
8884
  }
8864
8885
  if (url.pathname === "/api/transcript" && req.method === "GET") {
@@ -8871,11 +8892,62 @@ function sendJson$1(res, data, status = 200) {
8871
8892
  res.writeHead(status, { "Content-Type": "application/json" });
8872
8893
  res.end(JSON.stringify(data));
8873
8894
  }
8874
- function handleListSessions(res, cfg) {
8895
+ /**
8896
+ * Convert an archive-suffix timestamp (e.g. `2026-03-31T03-26-10.444Z`) back
8897
+ * to a valid ISO-8601 string. The timestamp is created by
8898
+ * `archiveFileOnDisk()` as `new Date().toISOString().replaceAll(":", "-")`,
8899
+ * so we only need to restore the colons in the time portion (after "T").
8900
+ *
8901
+ * Returns `undefined` if the input cannot be parsed as a valid date.
8902
+ */
8903
+ function parseArchivedAt(suffix) {
8904
+ const dotIdx = suffix.indexOf(".");
8905
+ if (dotIdx < 0) return;
8906
+ const raw = suffix.slice(dotIdx + 1);
8907
+ const tIdx = raw.indexOf("T");
8908
+ if (tIdx < 0) return;
8909
+ const iso = raw.slice(0, tIdx) + "T" + raw.slice(tIdx + 1).replace(/-/g, ":");
8910
+ const d = new Date(iso);
8911
+ if (Number.isNaN(d.getTime())) return;
8912
+ return d.toISOString();
8913
+ }
8914
+ /**
8915
+ * Count user + assistant messages in a JSONL transcript and extract the
8916
+ * first user message as an 80-char preview. Silent on malformed lines —
8917
+ * we never fail the whole list request because one transcript is corrupt.
8918
+ */
8919
+ function scanTranscript(filePath) {
8920
+ let msgCount = 0;
8921
+ let preview = null;
8875
8922
  try {
8876
- const sessionsDir = resolveSessionTranscriptsDirForAgent(resolveDefaultAgentId(cfg));
8923
+ const lines = fs.readFileSync(filePath, "utf-8").split(/\r?\n/);
8924
+ for (const line of lines) {
8925
+ const trimmed = line.trim();
8926
+ if (!trimmed) continue;
8927
+ try {
8928
+ const parsed = JSON.parse(trimmed);
8929
+ const role = parsed?.message?.role;
8930
+ if (role === "user" || role === "assistant") msgCount++;
8931
+ if (!preview && role === "user") {
8932
+ const content = parsed.message?.content;
8933
+ const snipped = (typeof content === "string" ? content : Array.isArray(content) ? content.filter((b) => typeof b === "object" && b !== null && b.type === "text").map((b) => b.text ?? "").join(" ") : "").trim().slice(0, 80);
8934
+ if (snipped) preview = snipped;
8935
+ }
8936
+ } catch {}
8937
+ }
8938
+ } catch {}
8939
+ return {
8940
+ msgCount,
8941
+ preview
8942
+ };
8943
+ }
8944
+ function handleListSessions(res, cfg, currentKey) {
8945
+ try {
8946
+ const agentId = resolveDefaultAgentId(cfg);
8947
+ const sessionsDir = resolveSessionTranscriptsDirForAgent(agentId);
8948
+ const existingFiles = /* @__PURE__ */ new Set();
8877
8949
  const { storePath, store } = loadCombinedSessionStoreForGateway(cfg);
8878
- const storeSessions = listSessionsFromStore({
8950
+ const storeResult = listSessionsFromStore({
8879
8951
  cfg,
8880
8952
  storePath,
8881
8953
  store,
@@ -8883,62 +8955,94 @@ function handleListSessions(res, cfg) {
8883
8955
  includeDerivedTitles: true,
8884
8956
  includeLastMessage: true
8885
8957
  }
8886
- }).sessions.map((s) => ({
8887
- file: s.sessionId ? `${s.sessionId}.jsonl` : void 0,
8888
- sessionId: s.sessionId,
8889
- sessionKey: s.key,
8890
- isArchived: false,
8891
- mtime: s.updatedAt ? new Date(s.updatedAt).toISOString() : void 0,
8892
- preview: s.lastMessagePreview || s.derivedTitle || s.displayName || s.label || void 0,
8893
- msgCount: (s.inputTokens ?? 0) > 0 || (s.outputTokens ?? 0) > 0 ? void 0 : void 0,
8894
- size: void 0,
8895
- model: s.model,
8896
- modelProvider: s.modelProvider
8897
- }));
8898
- const archivedSessions = [];
8958
+ });
8959
+ const liveRows = [];
8960
+ const liveSessionIds = /* @__PURE__ */ new Set();
8961
+ for (const s of storeResult.sessions) {
8962
+ if (!s.sessionId) continue;
8963
+ const fileName = `${s.sessionId}.jsonl`;
8964
+ const filePath = path.join(sessionsDir, fileName);
8965
+ if (!fs.existsSync(filePath)) continue;
8966
+ existingFiles.add(fileName);
8967
+ liveSessionIds.add(s.sessionId);
8968
+ const stat = fs.statSync(filePath);
8969
+ const { msgCount, preview: scanPreview } = scanTranscript(filePath);
8970
+ const preview = s.lastMessagePreview ?? s.derivedTitle ?? s.displayName ?? s.label ?? scanPreview ?? null;
8971
+ const mtime = stat.mtime.toISOString();
8972
+ const updatedAtMs = typeof s.updatedAt === "number" ? s.updatedAt : 0;
8973
+ const updatedAtIso = updatedAtMs > 0 ? new Date(updatedAtMs).toISOString() : mtime;
8974
+ const lastActivity = mtime > updatedAtIso ? mtime : updatedAtIso;
8975
+ const isCurrent = currentKey !== void 0 && s.key === currentKey;
8976
+ liveRows.push({
8977
+ file: fileName,
8978
+ sessionId: s.sessionId,
8979
+ sessionKey: s.key,
8980
+ kind: isCurrent ? "current" : "past",
8981
+ mtime,
8982
+ lastActivity,
8983
+ msgCount,
8984
+ size: stat.size,
8985
+ preview,
8986
+ model: s.model,
8987
+ modelProvider: s.modelProvider,
8988
+ favorited: false,
8989
+ canLoad: !isCurrent,
8990
+ canDelete: !isCurrent
8991
+ });
8992
+ }
8993
+ const archivedRows = [];
8899
8994
  if (fs.existsSync(sessionsDir)) {
8900
- const files = fs.readdirSync(sessionsDir);
8901
- for (const file of files) {
8995
+ const entries = fs.readdirSync(sessionsDir);
8996
+ for (const file of entries) {
8902
8997
  if (!file.includes(".jsonl.")) continue;
8903
8998
  const parts = file.split(".jsonl.");
8904
- if (parts.length < 2 || !parts[1]) continue;
8999
+ if (parts.length < 2 || !parts[0] || !parts[1]) continue;
9000
+ const sessionId = parts[0];
9001
+ const suffix = parts[1];
9002
+ const reason = suffix.match(/^(reset|deleted)\./)?.[1];
9003
+ if (!reason) continue;
8905
9004
  const filePath = path.join(sessionsDir, file);
9005
+ let stat;
8906
9006
  try {
8907
- const stat = fs.statSync(filePath);
8908
- const lines = fs.readFileSync(filePath, "utf-8").split(/\r?\n/).filter((l) => l.trim());
8909
- let preview;
8910
- let msgCount = 0;
8911
- for (const line of lines) try {
8912
- const parsed = JSON.parse(line);
8913
- if (parsed?.message?.role === "user" || parsed?.message?.role === "assistant") msgCount++;
8914
- if (!preview && parsed?.message?.role === "user") preview = (typeof parsed.message.content === "string" ? parsed.message.content : Array.isArray(parsed.message.content) ? parsed.message.content.filter((b) => b.type === "text").map((b) => b.text ?? "").join(" ") : "").trim().slice(0, 80) || void 0;
8915
- } catch {}
8916
- const suffix = parts[1];
8917
- const dotIdx = suffix.indexOf(".");
8918
- const archivedAt = dotIdx >= 0 ? suffix.slice(dotIdx + 1).replace(/-(?=\d{2}[T:-])/g, ":") : void 0;
8919
- archivedSessions.push({
8920
- file,
8921
- sessionId: parts[0],
8922
- isArchived: true,
8923
- archivedAt: archivedAt || stat.mtime.toISOString(),
8924
- mtime: stat.mtime.toISOString(),
8925
- preview,
8926
- msgCount,
8927
- size: stat.size
8928
- });
8929
- } catch {}
9007
+ stat = fs.statSync(filePath);
9008
+ } catch {
9009
+ continue;
9010
+ }
9011
+ existingFiles.add(file);
9012
+ const archivedAt = parseArchivedAt(suffix);
9013
+ const mtime = stat.mtime.toISOString();
9014
+ const { msgCount, preview } = scanTranscript(filePath);
9015
+ const lastActivity = archivedAt ?? mtime;
9016
+ archivedRows.push({
9017
+ file,
9018
+ sessionId,
9019
+ sessionKey: void 0,
9020
+ kind: "archived",
9021
+ archivedReason: reason,
9022
+ mtime,
9023
+ archivedAt,
9024
+ lastActivity,
9025
+ msgCount,
9026
+ size: stat.size,
9027
+ preview,
9028
+ favorited: false,
9029
+ canLoad: reason !== "deleted",
9030
+ canDelete: true
9031
+ });
8930
9032
  }
8931
9033
  }
8932
- sendJson$1(res, [...storeSessions.filter((s) => s.sessionId), ...archivedSessions].toSorted((a, b) => {
8933
- const aArchived = Boolean(a.isArchived);
8934
- const bArchived = Boolean(b.isArchived);
8935
- if (!aArchived && bArchived) return -1;
8936
- if (aArchived && !bArchived) return 1;
8937
- const aDate = typeof a.mtime === "string" ? a.mtime : typeof a.archivedAt === "string" ? a.archivedAt : "";
8938
- return (typeof b.mtime === "string" ? b.mtime : typeof b.archivedAt === "string" ? b.archivedAt : "").localeCompare(aDate);
8939
- }));
9034
+ const favorites = reconcileFavorites(existingFiles, agentId);
9035
+ const favSet = favorites.size > 0 ? favorites : loadFavoritesSet(agentId);
9036
+ for (const row of liveRows) row.favorited = favSet.has(row.file);
9037
+ for (const row of archivedRows) row.favorited = favSet.has(row.file);
9038
+ sendJson$1(res, { sessions: [...liveRows, ...archivedRows].toSorted((a, b) => {
9039
+ if (a.kind === "current" && b.kind !== "current") return -1;
9040
+ if (b.kind === "current" && a.kind !== "current") return 1;
9041
+ if (a.favorited !== b.favorited) return a.favorited ? -1 : 1;
9042
+ return b.lastActivity.localeCompare(a.lastActivity);
9043
+ }) });
8940
9044
  } catch (err) {
8941
- sendJson$1(res, { error: String(err) }, 500);
9045
+ sendJson$1(res, { error: err instanceof Error ? err.message : String(err) }, 500);
8942
9046
  }
8943
9047
  }
8944
9048
  function handleTranscript(res, cfg, file) {
@@ -8966,7 +9070,7 @@ function handleTranscript(res, cfg, file) {
8966
9070
  } catch {}
8967
9071
  sendJson$1(res, { messages });
8968
9072
  } catch (err) {
8969
- sendJson$1(res, { error: String(err) }, 500);
9073
+ sendJson$1(res, { error: err instanceof Error ? err.message : String(err) }, 500);
8970
9074
  }
8971
9075
  }
8972
9076
 
@@ -11844,7 +11948,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
11844
11948
  });
11845
11949
  let glassUiBridgeCleanup = null;
11846
11950
  if (!minimalTestGateway) {
11847
- const { createGlassUiBridge } = await import("./glass-ui-ws-D0UYleBF.js");
11951
+ const { createGlassUiBridge } = await import("./glass-ui-ws-jAbqZVc9.js");
11848
11952
  glassUiBridgeCleanup = createGlassUiBridge({
11849
11953
  wss: glassUiWss,
11850
11954
  context: gatewayRequestContext,
@@ -1,4 +1,4 @@
1
- import { n as callGateway } from "./call-DKi-hnaF.js";
1
+ import { n as callGateway } from "./call-DeCQ2DhS.js";
2
2
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-C9dERklz.js";
3
3
  import { n as withProgress } from "./progress-BAHiAaDW.js";
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-aT-I_DTX.js";
2
- import { n as callGateway } from "./call-DwpGquzW.js";
2
+ import { n as callGateway } from "./call-CX0cs106.js";
3
3
  import { n as withProgress } from "./progress-jIePzvGA.js";
4
4
 
5
5
  //#region src/cli/gateway-rpc.ts
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import { Ut as resolveModelProfile } from "./reply-DyjXROKp.js";
4
+ import { Ut as resolveModelProfile } from "./reply-XaXqDK9F.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -71,8 +71,8 @@ import "./ir-DZam9q5M.js";
71
71
  import "./render-CXDO_kgw.js";
72
72
  import "./commands-BNLCWX6e.js";
73
73
  import "./commands-registry-BT0-zzs3.js";
74
- import "./client-jI1oE0_k.js";
75
- import "./call-DwpGquzW.js";
74
+ import "./client-B8xmq-Pw.js";
75
+ import "./call-CX0cs106.js";
76
76
  import "./pairing-token-CX3NN_qj.js";
77
77
  import "./channel-activity-BOiuJS3t.js";
78
78
  import "./fetch-DTNGXEzX.js";
@@ -93,7 +93,7 @@ import "./session-cost-usage-BXAI7CNH.js";
93
93
  import "./outbound-attachment-Bw-c5Cdp.js";
94
94
  import "./delivery-queue-CAxX6nGq.js";
95
95
  import "./send-9SapUCg7.js";
96
- import "./onboard-helpers-DFvWPFhU.js";
96
+ import "./onboard-helpers-CueJ7O_B.js";
97
97
  import "./prompt-style-CnkMpSXt.js";
98
98
  import "./pairing-labels-DyXoD1DS.js";
99
99
  import "./exec-approvals-DXM2pQYL.js";
@@ -113,19 +113,19 @@ import "./systemd-DT6SbCim.js";
113
113
  import "./service-osK70kTZ.js";
114
114
  import "./diagnostics-BRwihzJG.js";
115
115
  import "./table-BKlH0YlA.js";
116
- import "./audit-DB9YkTVX.js";
117
- import "./status-ZPW5EACm.js";
118
- import "./health-D3w4YMlC.js";
116
+ import "./audit-BgdM9XZl.js";
117
+ import "./status-DOTlXdcN.js";
118
+ import "./health-B1nih5LD.js";
119
119
  import "./control-ui-assets-B7moDVHX.js";
120
120
  import "./update-check-7EzEjSzb.js";
121
- import { n as handleGatewayRequest } from "./server-methods-CW8eFTGD.js";
122
- import "./push-apns-CObVeJLC.js";
123
- import "./agents.config-BEVb1Pyx.js";
121
+ import { n as handleGatewayRequest } from "./server-methods-Bu1RjLe6.js";
122
+ import "./push-apns-CoG1P_P0.js";
123
+ import "./agents.config-B9BZoM2m.js";
124
124
  import "./dm-policy-shared-DlDAGtZL.js";
125
125
  import "./node-service-CD47Qpf1.js";
126
126
  import "./status.update-CG0ciGaf.js";
127
127
  import "./skills-install-CWVdJkLn.js";
128
- import "./update-runner-BRKFzAwV.js";
128
+ import "./update-runner-FhW6n-Nv.js";
129
129
 
130
130
  //#region src/gateway/glass-ui-ws.ts
131
131
  const SESSION_KEY = "agent:main:main";
@@ -216,6 +216,7 @@ function createGlassUiBridge(opts) {
216
216
  });
217
217
  }
218
218
  async function loadAndSendHistory(ws, attempt = 1) {
219
+ const maxAttempts = 3;
219
220
  try {
220
221
  const result = await dispatchRpc("chat.history", { sessionKey: SESSION_KEY });
221
222
  if (result.ok) {
@@ -227,9 +228,27 @@ function createGlassUiBridge(opts) {
227
228
  hasMore: payload.hasMore ?? false,
228
229
  startIndex: payload.startIndex ?? 0
229
230
  });
230
- } else if (attempt < 3) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
231
+ } else if (attempt < maxAttempts) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
232
+ else safeSend(ws, {
233
+ type: "history",
234
+ messages: [],
235
+ total: 0,
236
+ hasMore: false,
237
+ startIndex: 0,
238
+ error: "history.unavailable",
239
+ recoverable: true
240
+ });
231
241
  } catch {
232
- if (attempt < 3) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
242
+ if (attempt < maxAttempts) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
243
+ else safeSend(ws, {
244
+ type: "history",
245
+ messages: [],
246
+ total: 0,
247
+ hasMore: false,
248
+ startIndex: 0,
249
+ error: "history.unavailable",
250
+ recoverable: true
251
+ });
233
252
  }
234
253
  }
235
254
  function sendInitialProfile(ws) {
@@ -10,11 +10,11 @@ import "./skills-hAdgFdrv.js";
10
10
  import "./manifest-registry-Czr39pxG.js";
11
11
  import "./skills-status-DKXJ-tbi.js";
12
12
  import { i as loadConfig } from "./config-BNTB6qj8.js";
13
- import "./client-T3qcxXru.js";
14
- import "./call-DKi-hnaF.js";
13
+ import "./client-qUlxXXVJ.js";
14
+ import "./call-DeCQ2DhS.js";
15
15
  import "./message-channel-C9dERklz.js";
16
16
  import "./pairing-token-Byh6drgn.js";
17
- import { Q as resolveModelProfile } from "./subagent-registry-DQHg3jUV.js";
17
+ import { Q as resolveModelProfile } from "./subagent-registry-DCoU9xIE.js";
18
18
  import "./sessions-Cfa6JEB3.js";
19
19
  import "./tokens-Csntmwwn.js";
20
20
  import "./plugins-CwSlLxM8.js";
@@ -94,7 +94,7 @@ import "./cli-utils-CCaEbxAz.js";
94
94
  import "./help-format-B0pWGnZs.js";
95
95
  import "./progress-BAHiAaDW.js";
96
96
  import "./replies-Bo49QlAg.js";
97
- import "./onboard-helpers-BBtPmJEe.js";
97
+ import "./onboard-helpers-PpGrZIGw.js";
98
98
  import "./prompt-style-DwCXob2h.js";
99
99
  import "./pairing-labels-D1HDboV2.js";
100
100
  import "./pi-tools.policy-DxNwL7Dl.js";
@@ -108,19 +108,19 @@ import "./systemd-DlMdyFDY.js";
108
108
  import "./service-Cm9j9WzQ.js";
109
109
  import "./diagnostics-CS1ov_hH.js";
110
110
  import "./table-D01d2GuY.js";
111
- import "./audit-BjI_Yyr5.js";
112
- import "./status-DfPfMVNZ.js";
113
- import "./health-cVvZdeDu.js";
111
+ import "./audit-xSagQWH8.js";
112
+ import "./status-qkmUAeWo.js";
113
+ import "./health-CsTxt66a.js";
114
114
  import "./control-ui-assets-BseSWee1.js";
115
115
  import "./update-check-ZdimP1aU.js";
116
- import { n as handleGatewayRequest } from "./server-methods-CWcLut3F.js";
117
- import "./push-apns-CYC70eKy.js";
118
- import "./agents.config-BKCY6F2A.js";
116
+ import { n as handleGatewayRequest } from "./server-methods-0ksPFnev.js";
117
+ import "./push-apns-B5txhDVi.js";
118
+ import "./agents.config-C951ocyh.js";
119
119
  import "./dm-policy-shared-DJ-61hCT.js";
120
120
  import "./node-service-fcZExd22.js";
121
121
  import "./status.update-C2GN8s9C.js";
122
122
  import "./skills-install-1ZdwGTnh.js";
123
- import "./update-runner-DVa6cMqp.js";
123
+ import "./update-runner-BhVsdpxm.js";
124
124
 
125
125
  //#region src/gateway/glass-ui-ws.ts
126
126
  const SESSION_KEY = "agent:main:main";
@@ -211,6 +211,7 @@ function createGlassUiBridge(opts) {
211
211
  });
212
212
  }
213
213
  async function loadAndSendHistory(ws, attempt = 1) {
214
+ const maxAttempts = 3;
214
215
  try {
215
216
  const result = await dispatchRpc("chat.history", { sessionKey: SESSION_KEY });
216
217
  if (result.ok) {
@@ -222,9 +223,27 @@ function createGlassUiBridge(opts) {
222
223
  hasMore: payload.hasMore ?? false,
223
224
  startIndex: payload.startIndex ?? 0
224
225
  });
225
- } else if (attempt < 3) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
226
+ } else if (attempt < maxAttempts) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
227
+ else safeSend(ws, {
228
+ type: "history",
229
+ messages: [],
230
+ total: 0,
231
+ hasMore: false,
232
+ startIndex: 0,
233
+ error: "history.unavailable",
234
+ recoverable: true
235
+ });
226
236
  } catch {
227
- if (attempt < 3) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
237
+ if (attempt < maxAttempts) setTimeout(() => void loadAndSendHistory(ws, attempt + 1), 1500 * attempt);
238
+ else safeSend(ws, {
239
+ type: "history",
240
+ messages: [],
241
+ total: 0,
242
+ hasMore: false,
243
+ startIndex: 0,
244
+ error: "history.unavailable",
245
+ recoverable: true
246
+ });
228
247
  }
229
248
  }
230
249
  function sendInitialProfile(ws) {
@@ -1,5 +1,5 @@
1
1
  import { B as theme, k as info, l as escapeRegExp, z as isRich } from "./utils-B-0b9bGM.js";
2
- import { At as resolveHeartbeatDeliveryTarget, Cr as peekSystemEventEntries, Vn as resolveUserTimezone, cr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, ct as setHeartbeatWakeHandler, dr as resolveHeartbeatPrompt$1, fr as stripHeartbeatToken, jt as resolveHeartbeatSenderContext, lr as DEFAULT_HEARTBEAT_EVERY, lt as resolveHeartbeatReasonKind, nr as getQueueSize, r as appendCronStyleCurrentTimeLine, sr as CommandLane, st as requestHeartbeatNow, t as getReplyFromConfig, ur as isHeartbeatContentEffectivelyEmpty } from "./reply-DyjXROKp.js";
2
+ import { At as resolveHeartbeatDeliveryTarget, Cr as peekSystemEventEntries, Vn as resolveUserTimezone, cr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, ct as setHeartbeatWakeHandler, dr as resolveHeartbeatPrompt$1, fr as stripHeartbeatToken, jt as resolveHeartbeatSenderContext, lr as DEFAULT_HEARTBEAT_EVERY, lt as resolveHeartbeatReasonKind, nr as getQueueSize, r as appendCronStyleCurrentTimeLine, sr as CommandLane, st as requestHeartbeatNow, t as getReplyFromConfig, ur as isHeartbeatContentEffectivelyEmpty } from "./reply-XaXqDK9F.js";
3
3
  import { l as resolveAgentIdFromSessionKey, p as toAgentStoreSessionKey, s as normalizeAgentId } from "./session-key-DCt45XZa.js";
4
4
  import { f as defaultRuntime, t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
5
5
  import { b as DEFAULT_SYMIPULSE_FILENAME, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId, r as resolveAgentConfig } from "./agent-scope-CgUHAtCo.js";
@@ -13,7 +13,7 @@ import { c as resolveStorePath, n as resolveSessionFilePath } from "./paths-Cyhz
13
13
  import { r as SYMIPULSE_TOKEN } from "./tokens-BuceUQDl.js";
14
14
  import { t as deliverOutboundPayloads } from "./deliver-B4KZ6-oZ.js";
15
15
  import { o as resolveEffectiveMessagesConfig } from "./reply-prefix-CE2YmmsD.js";
16
- import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-DwpGquzW.js";
16
+ import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-CX0cs106.js";
17
17
  import { n as withProgress } from "./progress-jIePzvGA.js";
18
18
  import { a as resolveIndicatorType, n as emitHeartbeatEvent, o as resolveHeartbeatReplyPayload, t as resolveHeartbeatVisibility } from "./heartbeat-visibility-ChEo5Zvk.js";
19
19
  import { t as resolveChannelDefaultAccountId } from "./helpers-DnjQ73f_.js";
@@ -3,8 +3,8 @@ import { Dt as theme, Et as isRich, X as escapeRegExp, _ as defaultRuntime, gt a
3
3
  import { l as resolveAgentIdFromSessionKey, p as toAgentStoreSessionKey, s as normalizeAgentId } from "./session-key-DjZ7Z1hW.js";
4
4
  import { b as DEFAULT_SYMIPULSE_FILENAME, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId, r as resolveAgentConfig } from "./agent-scope-D-jRCY0d.js";
5
5
  import { C as parseDurationMs, i as loadConfig } from "./config-BNTB6qj8.js";
6
- import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-DKi-hnaF.js";
7
- import { Jn as resolveUserTimezone, K as appendCronStyleCurrentTimeLine, Tn as peekSystemEventEntries, W as getReplyFromConfig, _r as isHeartbeatContentEffectivelyEmpty, dn as requestHeartbeatNow, fn as setHeartbeatWakeHandler, gr as DEFAULT_HEARTBEAT_EVERY, hr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, lr as getQueueSize, lt as resolveHeartbeatDeliveryTarget, mr as CommandLane, pn as resolveHeartbeatReasonKind, ut as resolveHeartbeatSenderContext, vr as resolveHeartbeatPrompt$1, yr as stripHeartbeatToken } from "./subagent-registry-DQHg3jUV.js";
6
+ import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-DeCQ2DhS.js";
7
+ import { Jn as resolveUserTimezone, K as appendCronStyleCurrentTimeLine, Tn as peekSystemEventEntries, W as getReplyFromConfig, _r as isHeartbeatContentEffectivelyEmpty, dn as requestHeartbeatNow, fn as setHeartbeatWakeHandler, gr as DEFAULT_HEARTBEAT_EVERY, hr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, lr as getQueueSize, lt as resolveHeartbeatDeliveryTarget, mr as CommandLane, pn as resolveHeartbeatReasonKind, ut as resolveHeartbeatSenderContext, vr as resolveHeartbeatPrompt$1, yr as stripHeartbeatToken } from "./subagent-registry-DCoU9xIE.js";
8
8
  import { M as canonicalizeMainSessionAlias, N as resolveAgentMainSessionKey, d as updateSessionStore, l as saveSessionStore, o as loadSessionStore } from "./sessions-Cfa6JEB3.js";
9
9
  import { r as SYMIPULSE_TOKEN } from "./tokens-Csntmwwn.js";
10
10
  import { n as listChannelPlugins, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";