purplemux 0.1.21 → 0.2.0

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 (428) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +77 -77
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/routes-manifest.json +13 -7
  6. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00glsnv._.js +3 -0
  7. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__05bsxq0._.js → [root-of-the-server]__00yjayf._.js} +2 -2
  8. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01.~37j._.js +3 -0
  9. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03l15.f._.js +3 -0
  10. package/.next/standalone/.next/server/chunks/[root-of-the-server]__045vzzi._.js +1 -1
  11. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04cr_m8._.js +3 -0
  12. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ff8o47._.js → [root-of-the-server]__04o.cbq._.js} +2 -2
  13. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05ij_ys._.js +42 -0
  14. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07gfnob._.js +3 -0
  15. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07xijrd._.js +3 -0
  16. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09gkm_6._.js +3 -0
  17. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_.po82._.js +3 -0
  18. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0auutl5._.js +5 -0
  19. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cjfc~l._.js +3 -0
  20. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l~_wd0._.js +1 -1
  21. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0m4quth._.js → [root-of-the-server]__0n61.a8._.js} +2 -2
  22. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ovn6yp._.js +3 -0
  23. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qvunc5._.js +3 -0
  24. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t1c-6w._.js +3 -0
  25. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__09w77m2._.js → [root-of-the-server]__0t7wqt6._.js} +2 -2
  26. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vi8p6v._.js +3 -0
  27. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w3m-oz._.js +3 -0
  28. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11j9~6h._.js +1 -1
  29. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xn_0ft._.js → [root-of-the-server]__12ksl6n._.js} +3 -3
  30. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12nr~pb._.js +3 -0
  31. package/.next/standalone/.next/server/chunks/_0e8e4zn._.js +1 -1
  32. package/.next/standalone/.next/server/chunks/_0isokfh._.js +1 -1
  33. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_pages-api_00-t8sq.js +3 -0
  34. package/.next/standalone/.next/server/chunks/src_lib_136edwc._.js +3 -0
  35. package/.next/standalone/.next/server/chunks/src_lib_layout-store_ts_0fanx7c._.js +1 -1
  36. package/.next/standalone/.next/server/chunks/src_lib_session-parser_ts_0~rhicw._.js +1 -1
  37. package/.next/standalone/.next/server/chunks/src_lib_status-manager_ts_003hlhy._.js +13 -1
  38. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0au.ssp._.js +3 -0
  39. package/.next/standalone/.next/server/chunks/ssr/{_0_mc3i2._.js → _00ehnd~._.js} +2 -2
  40. package/.next/standalone/.next/server/chunks/ssr/{_0qejycp._.js → _00rrt71._.js} +1 -1
  41. package/.next/standalone/.next/server/chunks/ssr/_06yggfn._.js +1 -1
  42. package/.next/standalone/.next/server/chunks/ssr/{_0kjoxb9._.js → _08h9ynz._.js} +2 -2
  43. package/.next/standalone/.next/server/chunks/ssr/_08ytq3p._.js +1 -1
  44. package/.next/standalone/.next/server/chunks/ssr/{_0h~fc23._.js → _0_c~3id._.js} +2 -2
  45. package/.next/standalone/.next/server/chunks/ssr/{_0-xx2s1._.js → _0_owbnq._.js} +2 -2
  46. package/.next/standalone/.next/server/chunks/ssr/_0al4.z9._.js +1 -1
  47. package/.next/standalone/.next/server/chunks/ssr/_0b~zgl1._.js +1 -1
  48. package/.next/standalone/.next/server/chunks/ssr/{_0quk21n._.js → _0dg4_bi._.js} +2 -2
  49. package/.next/standalone/.next/server/chunks/ssr/{_0qy269j._.js → _0gp1meg._.js} +2 -2
  50. package/.next/standalone/.next/server/chunks/ssr/_0iy5a-w._.js +1 -1
  51. package/.next/standalone/.next/server/chunks/ssr/_0js4l3t._.js +1 -1
  52. package/.next/standalone/.next/server/chunks/ssr/{_0fuovbm._.js → _0lnui2f._.js} +2 -2
  53. package/.next/standalone/.next/server/chunks/ssr/_0nkeoiw._.js +1 -1
  54. package/.next/standalone/.next/server/chunks/ssr/_0qbbxeq._.js +1 -1
  55. package/.next/standalone/.next/server/chunks/ssr/{_06.nllk._.js → _0rxhzwm._.js} +2 -2
  56. package/.next/standalone/.next/server/chunks/ssr/{_0g258pg._.js → _0sfctwm._.js} +2 -2
  57. package/.next/standalone/.next/server/chunks/ssr/{_0c0hpua._.js → _0ulmx3c._.js} +2 -2
  58. package/.next/standalone/.next/server/chunks/ssr/{_0k9ybcl._.js → _0wlh.pc._.js} +2 -2
  59. package/.next/standalone/.next/server/chunks/ssr/{_11wj.a4._.js → _0y5jzd3._.js} +1 -1
  60. package/.next/standalone/.next/server/chunks/ssr/_0z61aq-._.js +3 -0
  61. package/.next/standalone/.next/server/chunks/ssr/{_0lhf6qf._.js → _0~.theb._.js} +2 -2
  62. package/.next/standalone/.next/server/chunks/ssr/{_0si9.17._.js → _11rnj4l._.js} +2 -2
  63. package/.next/standalone/.next/server/chunks/ssr/{messages_127a4ox._.js → messages_046iw4z._.js} +1 -1
  64. package/.next/standalone/.next/server/chunks/ssr/{messages_005j2ko._.js → messages_0zr0cc7._.js} +1 -1
  65. package/.next/standalone/.next/server/chunks/ssr/messages_de_notification_json_[json]_cjs_02k70lx._.js +1 -1
  66. package/.next/standalone/.next/server/chunks/ssr/messages_de_session_json_[json]_cjs_0b-1vpl._.js +1 -1
  67. package/.next/standalone/.next/server/chunks/ssr/messages_de_settings_json_[json]_cjs_0ksu4_w._.js +1 -1
  68. package/.next/standalone/.next/server/chunks/ssr/messages_en_notification_json_[json]_cjs_0jqq879._.js +1 -1
  69. package/.next/standalone/.next/server/chunks/ssr/messages_en_session_json_[json]_cjs_0jaymfk._.js +1 -1
  70. package/.next/standalone/.next/server/chunks/ssr/messages_en_settings_json_[json]_cjs_0qwl-zt._.js +1 -1
  71. package/.next/standalone/.next/server/chunks/ssr/messages_es_notification_json_[json]_cjs_0q.i2xj._.js +1 -1
  72. package/.next/standalone/.next/server/chunks/ssr/messages_es_session_json_[json]_cjs_0jy1144._.js +1 -1
  73. package/.next/standalone/.next/server/chunks/ssr/messages_es_settings_json_[json]_cjs_0ce_kv6._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/ssr/messages_fr_notification_json_[json]_cjs_0muj65q._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/ssr/messages_fr_session_json_[json]_cjs_0rz0g.c._.js +1 -1
  76. package/.next/standalone/.next/server/chunks/ssr/messages_fr_settings_json_[json]_cjs_0h_6lba._.js +1 -1
  77. package/.next/standalone/.next/server/chunks/ssr/messages_ja_notification_json_[json]_cjs_03v~p7j._.js +1 -1
  78. package/.next/standalone/.next/server/chunks/ssr/messages_ja_session_json_[json]_cjs_0cos-uy._.js +1 -1
  79. package/.next/standalone/.next/server/chunks/ssr/messages_ja_settings_json_[json]_cjs_0pg~fls._.js +1 -1
  80. package/.next/standalone/.next/server/chunks/ssr/messages_ko_notification_json_[json]_cjs_0gx~jkl._.js +1 -1
  81. package/.next/standalone/.next/server/chunks/ssr/messages_ko_session_json_[json]_cjs_0x4saic._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/ssr/messages_ko_settings_json_[json]_cjs_07xpfc8._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_notification_json_[json]_cjs_02mo05m._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_session_json_[json]_cjs_0-x8ftl._.js +1 -1
  85. package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_settings_json_[json]_cjs_0frspzp._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/ssr/messages_ru_notification_json_[json]_cjs_03crije._.js +1 -1
  87. package/.next/standalone/.next/server/chunks/ssr/messages_ru_session_json_[json]_cjs_0~2-kve._.js +1 -1
  88. package/.next/standalone/.next/server/chunks/ssr/messages_ru_settings_json_[json]_cjs_08ex00.._.js +1 -1
  89. package/.next/standalone/.next/server/chunks/ssr/messages_tr_notification_json_[json]_cjs_0g.576s._.js +1 -1
  90. package/.next/standalone/.next/server/chunks/ssr/messages_tr_session_json_[json]_cjs_0zsvt_4._.js +1 -1
  91. package/.next/standalone/.next/server/chunks/ssr/messages_tr_settings_json_[json]_cjs_0piu0da._.js +1 -1
  92. package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_notification_json_[json]_cjs_07v9on4._.js +1 -1
  93. package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_session_json_[json]_cjs_134xza~._.js +1 -1
  94. package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_settings_json_[json]_cjs_0uazwgy._.js +1 -1
  95. package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_notification_json_[json]_cjs_0.ktzjy._.js +1 -1
  96. package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_session_json_[json]_cjs_0mv_~-8._.js +1 -1
  97. package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_settings_json_[json]_cjs_09u0c5l._.js +1 -1
  98. package/.next/standalone/.next/server/chunks/ssr/{node_modules_0cndrls._.js → node_modules_0kc8lix._.js} +2 -2
  99. package/.next/standalone/.next/server/chunks/ssr/src_05g_qd3._.js +1 -1
  100. package/.next/standalone/.next/server/chunks/ssr/{src_components_10v_9d0._.js → src_components_0cflin8._.js} +1 -1
  101. package/.next/standalone/.next/server/chunks/ssr/{src_components_04vn0dm._.js → src_components_0g.s~e7._.js} +1 -1
  102. package/.next/standalone/.next/server/chunks/ssr/{src_components_0gsv3ly._.js → src_components_0jrj_vu._.js} +1 -1
  103. package/.next/standalone/.next/server/chunks/ssr/{src_components_0iq~ool._.js → src_components_0rs9yzr._.js} +1 -1
  104. package/.next/standalone/.next/server/chunks/ssr/src_components_features_mobile_mobile-terminal-page_tsx_02chzch._.js +1 -1
  105. package/.next/standalone/.next/server/chunks/ssr/src_components_features_workspace_terminal-page_tsx_0wuq-jl._.js +1 -1
  106. package/.next/standalone/.next/server/chunks/ssr/src_hooks_use-browser-title_ts_0bw6.cb._.js +1 -1
  107. package/.next/standalone/.next/server/chunks/ssr/src_hooks_use-workspace-store_ts_0h40e5c._.js +1 -1
  108. package/.next/standalone/.next/server/chunks/ssr/src_lib_message-namespaces_ts_0wjpvu5._.js +3 -0
  109. package/.next/standalone/.next/server/middleware-build-manifest.js +77 -77
  110. package/.next/standalone/.next/server/pages/_app/build-manifest.json +7 -7
  111. package/.next/standalone/.next/server/pages/_app/client-build-manifest.json +1 -1
  112. package/.next/standalone/.next/server/pages/_app.js +4 -4
  113. package/.next/standalone/.next/server/pages/_app.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/pages/_error/build-manifest.json +2 -2
  115. package/.next/standalone/.next/server/pages/_error/client-build-manifest.json +1 -1
  116. package/.next/standalone/.next/server/pages/_error.js +2 -2
  117. package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/pages/api/check-claude.js +1 -1
  119. package/.next/standalone/.next/server/pages/api/check-claude.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/result.js +1 -1
  121. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/result.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/send.js +1 -1
  123. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/send.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/status.js +1 -1
  125. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/status.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId].js +1 -1
  127. package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId].js.nft.json +1 -1
  128. package/.next/standalone/.next/server/pages/api/cli/tabs.js +1 -1
  129. package/.next/standalone/.next/server/pages/api/cli/tabs.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/pages/api/cli/workspaces.js +1 -1
  131. package/.next/standalone/.next/server/pages/api/cli/workspaces.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/pages/api/git/branch.js +1 -1
  133. package/.next/standalone/.next/server/pages/api/git/branch.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/pages/api/git/status.js +1 -1
  135. package/.next/standalone/.next/server/pages/api/git/status.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/pages/api/layout/cwd.js +1 -1
  137. package/.next/standalone/.next/server/pages/api/layout/cwd.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/pages/api/layout/diff.js +1 -1
  139. package/.next/standalone/.next/server/pages/api/layout/diff.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId]/move.js +1 -1
  141. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId]/move.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId].js +2 -2
  143. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId].js.nft.json +1 -1
  144. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/order.js +1 -1
  145. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/order.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs.js +4 -4
  147. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId].js +1 -1
  149. package/.next/standalone/.next/server/pages/api/layout/pane/[paneId].js.nft.json +1 -1
  150. package/.next/standalone/.next/server/pages/api/layout/pane.js +1 -1
  151. package/.next/standalone/.next/server/pages/api/layout/pane.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/pages/api/layout.js +1 -1
  153. package/.next/standalone/.next/server/pages/api/layout.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/pages/api/message-history.js +1 -1
  155. package/.next/standalone/.next/server/pages/api/message-history.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/pages/api/push/vapid-key.js +1 -1
  157. package/.next/standalone/.next/server/pages/api/push/vapid-key.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/pages/api/stats/daily-report/cache.js +1 -1
  159. package/.next/standalone/.next/server/pages/api/stats/daily-report/cache.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/pages/api/stats/daily-report/generate.js +1 -1
  161. package/.next/standalone/.next/server/pages/api/stats/daily-report/generate.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/pages/api/stats/daily-report/list.js +1 -1
  163. package/.next/standalone/.next/server/pages/api/stats/daily-report/list.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/pages/api/stats/projects.js +1 -1
  165. package/.next/standalone/.next/server/pages/api/stats/projects.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/pages/api/stats/sessions.js +1 -1
  167. package/.next/standalone/.next/server/pages/api/stats/sessions.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/pages/api/stats/uptime.js +1 -1
  169. package/.next/standalone/.next/server/pages/api/stats/uptime.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/pages/api/status/hook.js +4 -4
  171. package/.next/standalone/.next/server/pages/api/status/hook.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/pages/api/status/statusline.js +9 -1
  173. package/.next/standalone/.next/server/pages/api/status/statusline.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/pages/api/system/tmux-sessions.js +1 -1
  175. package/.next/standalone/.next/server/pages/api/system/tmux-sessions.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/pages/api/timeline/entries.js +1 -1
  177. package/.next/standalone/.next/server/pages/api/timeline/entries.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/pages/api/timeline/message-counts/pages-manifest.json +3 -0
  179. package/.next/standalone/.next/server/pages/api/timeline/message-counts.js +5 -0
  180. package/.next/standalone/.next/server/pages/api/timeline/message-counts.js.map +5 -0
  181. package/.next/standalone/.next/server/pages/api/timeline/message-counts.js.nft.json +1 -0
  182. package/.next/standalone/.next/server/pages/api/timeline/sessions.js +1 -1
  183. package/.next/standalone/.next/server/pages/api/timeline/sessions.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/pages/api/tmux/capture.js +1 -1
  185. package/.next/standalone/.next/server/pages/api/tmux/capture.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/pages/api/tmux/info.js +1 -1
  187. package/.next/standalone/.next/server/pages/api/tmux/info.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/pages/api/tmux/permission-options.js +1 -1
  189. package/.next/standalone/.next/server/pages/api/tmux/permission-options.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/pages/api/tmux/plan-options.js +1 -1
  191. package/.next/standalone/.next/server/pages/api/tmux/plan-options.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/pages/api/tmux/recover-unknown.js +5 -5
  193. package/.next/standalone/.next/server/pages/api/tmux/recover-unknown.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/pages/api/tmux/reset.js +3 -3
  195. package/.next/standalone/.next/server/pages/api/tmux/reset.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/pages/api/tmux/send-input.js +1 -1
  197. package/.next/standalone/.next/server/pages/api/tmux/send-input.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/pages/api/workspace/[workspaceId].js +1 -1
  199. package/.next/standalone/.next/server/pages/api/workspace/[workspaceId].js.nft.json +1 -1
  200. package/.next/standalone/.next/server/pages/api/workspace/active.js +1 -1
  201. package/.next/standalone/.next/server/pages/api/workspace/active.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/pages/api/workspace/reorder.js +1 -1
  203. package/.next/standalone/.next/server/pages/api/workspace/reorder.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/pages/api/workspace/validate.js +1 -1
  205. package/.next/standalone/.next/server/pages/api/workspace/validate.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/pages/api/workspace.js +4 -4
  207. package/.next/standalone/.next/server/pages/api/workspace.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/pages/de/404.html +1 -1
  209. package/.next/standalone/.next/server/pages/de/500.html +1 -1
  210. package/.next/standalone/.next/server/pages/en/404.html +1 -1
  211. package/.next/standalone/.next/server/pages/en/500.html +1 -1
  212. package/.next/standalone/.next/server/pages/es/404.html +1 -1
  213. package/.next/standalone/.next/server/pages/es/500.html +1 -1
  214. package/.next/standalone/.next/server/pages/fr/404.html +1 -1
  215. package/.next/standalone/.next/server/pages/fr/500.html +1 -1
  216. package/.next/standalone/.next/server/pages/index/build-manifest.json +12 -12
  217. package/.next/standalone/.next/server/pages/index/client-build-manifest.json +1 -1
  218. package/.next/standalone/.next/server/pages/index/react-loadable-manifest.json +6 -6
  219. package/.next/standalone/.next/server/pages/index.js +13 -13
  220. package/.next/standalone/.next/server/pages/index.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/pages/ja/404.html +1 -1
  222. package/.next/standalone/.next/server/pages/ja/500.html +1 -1
  223. package/.next/standalone/.next/server/pages/ko/404.html +1 -1
  224. package/.next/standalone/.next/server/pages/ko/500.html +1 -1
  225. package/.next/standalone/.next/server/pages/login/build-manifest.json +10 -10
  226. package/.next/standalone/.next/server/pages/login/client-build-manifest.json +1 -1
  227. package/.next/standalone/.next/server/pages/login.js +2 -2
  228. package/.next/standalone/.next/server/pages/login.js.nft.json +1 -1
  229. package/.next/standalone/.next/server/pages/pt-BR/404.html +1 -1
  230. package/.next/standalone/.next/server/pages/pt-BR/500.html +1 -1
  231. package/.next/standalone/.next/server/pages/reports/build-manifest.json +16 -16
  232. package/.next/standalone/.next/server/pages/reports/client-build-manifest.json +1 -1
  233. package/.next/standalone/.next/server/pages/reports.js +9 -9
  234. package/.next/standalone/.next/server/pages/reports.js.nft.json +1 -1
  235. package/.next/standalone/.next/server/pages/reset/build-manifest.json +2 -2
  236. package/.next/standalone/.next/server/pages/reset/client-build-manifest.json +1 -1
  237. package/.next/standalone/.next/server/pages/reset.js +3 -3
  238. package/.next/standalone/.next/server/pages/reset.js.nft.json +1 -1
  239. package/.next/standalone/.next/server/pages/ru/404.html +1 -1
  240. package/.next/standalone/.next/server/pages/ru/500.html +1 -1
  241. package/.next/standalone/.next/server/pages/stats/build-manifest.json +13 -13
  242. package/.next/standalone/.next/server/pages/stats/client-build-manifest.json +1 -1
  243. package/.next/standalone/.next/server/pages/stats/react-loadable-manifest.json +1 -1
  244. package/.next/standalone/.next/server/pages/stats.js +6 -6
  245. package/.next/standalone/.next/server/pages/stats.js.nft.json +1 -1
  246. package/.next/standalone/.next/server/pages/tools-required/build-manifest.json +2 -2
  247. package/.next/standalone/.next/server/pages/tools-required/client-build-manifest.json +1 -1
  248. package/.next/standalone/.next/server/pages/tools-required.js +3 -3
  249. package/.next/standalone/.next/server/pages/tools-required.js.nft.json +1 -1
  250. package/.next/standalone/.next/server/pages/tr/404.html +1 -1
  251. package/.next/standalone/.next/server/pages/tr/500.html +1 -1
  252. package/.next/standalone/.next/server/pages/webview/build-manifest.json +10 -10
  253. package/.next/standalone/.next/server/pages/webview/client-build-manifest.json +1 -1
  254. package/.next/standalone/.next/server/pages/webview.js +10 -10
  255. package/.next/standalone/.next/server/pages/webview.js.nft.json +1 -1
  256. package/.next/standalone/.next/server/pages/zh-CN/404.html +1 -1
  257. package/.next/standalone/.next/server/pages/zh-CN/500.html +1 -1
  258. package/.next/standalone/.next/server/pages/zh-TW/404.html +1 -1
  259. package/.next/standalone/.next/server/pages/zh-TW/500.html +1 -1
  260. package/.next/standalone/.next/server/pages-manifest.json +1 -0
  261. package/.next/standalone/.next/static/{dcByQy16pcz2rzj9snwtK → WXAyTQ0PHZnxXXCwEZpit}/_buildManifest.js +9 -8
  262. package/.next/standalone/.next/static/chunks/0-97ruc25d2lz.js +1 -0
  263. package/.next/standalone/.next/static/chunks/{17e9_m-u1zvfx.js → 0-xrsiia9hc.c.js} +1 -1
  264. package/.next/standalone/.next/static/chunks/{135rnnu.-sh80.js → 0.ecwkadp7-hq.js} +1 -1
  265. package/.next/standalone/.next/static/chunks/00nx1s6rpu537.js +1 -0
  266. package/.next/standalone/.next/static/chunks/{0nin7ftvq8x5c.js → 00ziyk306y55s.js} +1 -1
  267. package/.next/standalone/.next/static/chunks/{0kebzqtn4norb.js → 01-fb9rb-21.a.js} +1 -1
  268. package/.next/standalone/.next/static/chunks/{0dthloew7zc8k.js → 010m3dplwy4n6.js} +16 -16
  269. package/.next/standalone/.next/static/chunks/{0_7qn_xpf-6l~.js → 02mfn213kze9c.js} +2 -2
  270. package/.next/standalone/.next/static/chunks/02r-a1_lz7fuk.js +1 -0
  271. package/.next/standalone/.next/static/chunks/04bbxzycy0y90.js +1 -0
  272. package/.next/standalone/.next/static/chunks/{0y--b123-dayk.js → 04cl8pvql07vz.js} +1 -1
  273. package/.next/standalone/.next/static/chunks/{15wkoi26~8omr.js → 04f25y8yc8j00.js} +1 -1
  274. package/.next/standalone/.next/static/chunks/{02.xbkqbezb~v.js → 04uzwc8c9u49~.js} +1 -1
  275. package/.next/standalone/.next/static/chunks/05oh32ya2uzfq.js +1 -0
  276. package/.next/standalone/.next/static/chunks/06e51nokt~dtt.js +1 -0
  277. package/.next/standalone/.next/static/chunks/06ypydsl._u~2.js +5 -0
  278. package/.next/standalone/.next/static/chunks/07-xm--o034du.js +1 -0
  279. package/.next/standalone/.next/static/chunks/071neb1eikeoh.js +1 -0
  280. package/.next/standalone/.next/static/chunks/07i6~xrmgspp8.js +1 -0
  281. package/.next/standalone/.next/static/chunks/{0i7zwsw_~llk0.js → 07v3udp2qhc02.js} +1 -1
  282. package/.next/standalone/.next/static/chunks/{0kox55ju9c.e4.js → 088o~nd5em_1d.js} +1 -1
  283. package/.next/standalone/.next/static/chunks/{10_1w.i.mluxp.js → 08xz_z9u4ex9t.js} +1 -1
  284. package/.next/standalone/.next/static/chunks/{02119z8xemosp.js → 08yjqhf82rx~h.js} +1 -1
  285. package/.next/standalone/.next/static/chunks/095e2xf3z6x3g.js +23 -0
  286. package/.next/standalone/.next/static/chunks/{040hwmh16ihpj.js → 09agwg~-xbxbs.js} +1 -1
  287. package/.next/standalone/.next/static/chunks/09tinkgkd8br_.js +1 -0
  288. package/.next/standalone/.next/static/chunks/09vjzvj4~rwbf.js +1 -0
  289. package/.next/standalone/.next/static/chunks/{0puhant9cy0xw.js → 0__ve3txz-02p.js} +1 -1
  290. package/.next/standalone/.next/static/chunks/0a1hi9y0lwv3j.js +1 -0
  291. package/.next/standalone/.next/static/chunks/{0fzb0m-2k2x14.js → 0bzbaprexb9od.js} +1 -1
  292. package/.next/standalone/.next/static/chunks/{0ggsfsmm~hj5t.js → 0cfpdp0_-.4aj.js} +1 -1
  293. package/.next/standalone/.next/static/chunks/0chjvj73yfmoj.js +1 -0
  294. package/.next/standalone/.next/static/chunks/{0yi.kp2rt4-nc.js → 0ea-k_kbq5gi1.js} +1 -1
  295. package/.next/standalone/.next/static/chunks/{082eokcz_e-4q.js → 0f81tdf_8utww.js} +1 -1
  296. package/.next/standalone/.next/static/chunks/{14ajlpt1s6ueh.js → 0ff6a07hvp4pu.js} +2 -2
  297. package/.next/standalone/.next/static/chunks/{105.cpxealiud.js → 0fotmrplo6yc7.js} +1 -1
  298. package/.next/standalone/.next/static/chunks/{0h_vfy~qxk1_6.js → 0h-7ntqpip4oi.js} +1 -1
  299. package/.next/standalone/.next/static/chunks/{0wvyw8fxpnmre.js → 0h~_fdj60t_~l.js} +1 -1
  300. package/.next/standalone/.next/static/chunks/{04_s.sj1oagqr.js → 0i2uqmry6cyl_.js} +1 -1
  301. package/.next/standalone/.next/static/chunks/0if5fmp94~nc2.js +12 -0
  302. package/.next/standalone/.next/static/chunks/{1235zq5em7nh2.js → 0iw7xjsfo1v-u.js} +10 -10
  303. package/.next/standalone/.next/static/chunks/0jxk8j~j30thp.js +1 -0
  304. package/.next/standalone/.next/static/chunks/{0_eof.53ko6d_.js → 0lz-p_awksh5e.js} +1 -1
  305. package/.next/standalone/.next/static/chunks/0m_amua611xl0.js +5 -0
  306. package/.next/standalone/.next/static/chunks/0nyar-7g9rya6.js +1 -0
  307. package/.next/standalone/.next/static/chunks/0o6esya.vhm1..js +1 -0
  308. package/.next/standalone/.next/static/chunks/0oxlivdn8c89b.js +1 -0
  309. package/.next/standalone/.next/static/chunks/{0iiahbpxxksju.js → 0p1vmcv-mlsg5.js} +1 -1
  310. package/.next/standalone/.next/static/chunks/{14067kbmixmm6.js → 0pw-284q1gfk3.js} +1 -1
  311. package/.next/standalone/.next/static/chunks/{0turlr93lvkg8.js → 0t0-4sn-nqqld.js} +1 -1
  312. package/.next/standalone/.next/static/chunks/{09jl7_l-yth-3.js → 0t76mt4_ijxw7.js} +1 -1
  313. package/.next/standalone/.next/static/chunks/{0_nr91n2-npr6.js → 0u-1zto-umjh9.js} +1 -1
  314. package/.next/standalone/.next/static/chunks/{0x4khblf0c7-p.js → 0u9~wuf2zbs5z.js} +1 -1
  315. package/.next/standalone/.next/static/chunks/{0krb2wvo2_ipb.js → 0unvbz84l4g9h.js} +1 -1
  316. package/.next/standalone/.next/static/chunks/{12up4kbv36k4r.js → 0w52yh2srwcs0.js} +2 -2
  317. package/.next/standalone/.next/static/chunks/{0ml0ppx6kwe2_.js → 0w9~wt6~_cxhf.js} +1 -1
  318. package/.next/standalone/.next/static/chunks/0wp13r5su.j3e.js +1 -0
  319. package/.next/standalone/.next/static/chunks/{0e~.6y_x93o06.js → 0y3fmkya..f_6.js} +13 -13
  320. package/.next/standalone/.next/static/chunks/0~ei.a78nuwqe.js +1 -0
  321. package/.next/standalone/.next/static/chunks/{0hqhf5soi_25r.js → 0~lnp45fxxtgz.js} +1 -1
  322. package/.next/standalone/.next/static/chunks/0~nlz9.lltzrz.js +1 -0
  323. package/.next/standalone/.next/static/chunks/10bvbbw1062os.js +1 -0
  324. package/.next/standalone/.next/static/chunks/{01sxhicgu6p69.js → 11ess6mn2988z.js} +10 -10
  325. package/.next/standalone/.next/static/chunks/11gch78bg_qsn.js +1 -0
  326. package/.next/standalone/.next/static/chunks/{0zzlz_qu90xvc.js → 11nk1lwom62oe.js} +1 -1
  327. package/.next/standalone/.next/static/chunks/{0sj1hijbxwqzi.js → 131tx--pi8.tm.js} +1 -1
  328. package/.next/standalone/.next/static/chunks/13zzmkwag6vsm.css +1 -0
  329. package/.next/standalone/.next/static/chunks/13~7v30_nnqks.js +1 -0
  330. package/.next/standalone/.next/static/chunks/{0arxgyek93av0.js → 17deooyefr~9o.js} +1 -1
  331. package/.next/standalone/.next/static/chunks/{0jhs9_arn872p.js → 17e2iymrk7eoa.js} +1 -1
  332. package/.next/standalone/.next/static/chunks/{0kima6zc7cl2p.js → 17et6y09q052u.js} +1 -1
  333. package/.next/standalone/.next/static/chunks/17jcucuef_33-.js +1 -0
  334. package/.next/standalone/.next/static/chunks/{turbopack-11cbtg95iwob2.js → turbopack-0-itu0o9y_vq8.js} +1 -1
  335. package/.next/standalone/.next/static/chunks/{turbopack-0t_pmdbcbax~k.js → turbopack-0.28.d-q12n3p.js} +1 -1
  336. package/.next/standalone/.next/static/chunks/{turbopack-0tl7oxj3760qz.js → turbopack-0.4ipr_kch~.s.js} +1 -1
  337. package/.next/standalone/.next/static/chunks/{turbopack-02re16zyko_-d.js → turbopack-0g80nrinbfgtk.js} +1 -1
  338. package/.next/standalone/.next/static/chunks/{turbopack-03ch5ephon-wk.js → turbopack-0h0~tr4tgq3aa.js} +1 -1
  339. package/.next/standalone/.next/static/chunks/{turbopack-0k.5aa0_xv2hq.js → turbopack-0hwi_g-tegs_u.js} +1 -1
  340. package/.next/standalone/.next/static/chunks/{turbopack-0au9jjcv_8-gl.js → turbopack-0np.oib7-.1fp.js} +1 -1
  341. package/.next/standalone/.next/static/chunks/{turbopack-02yx2w1m.5ub9.js → turbopack-0qmx66h203l93.js} +1 -1
  342. package/.next/standalone/.next/static/chunks/{turbopack-0vqdj~g~ggw3x.js → turbopack-11utvoktq4lmr.js} +1 -1
  343. package/.next/standalone/messages/de/notification.json +3 -1
  344. package/.next/standalone/messages/de/session.json +5 -2
  345. package/.next/standalone/messages/de/settings.json +22 -1
  346. package/.next/standalone/messages/en/notification.json +3 -1
  347. package/.next/standalone/messages/en/session.json +5 -2
  348. package/.next/standalone/messages/en/settings.json +20 -1
  349. package/.next/standalone/messages/es/notification.json +3 -1
  350. package/.next/standalone/messages/es/session.json +5 -2
  351. package/.next/standalone/messages/es/settings.json +22 -1
  352. package/.next/standalone/messages/fr/notification.json +3 -1
  353. package/.next/standalone/messages/fr/session.json +5 -2
  354. package/.next/standalone/messages/fr/settings.json +22 -1
  355. package/.next/standalone/messages/ja/notification.json +3 -1
  356. package/.next/standalone/messages/ja/session.json +5 -2
  357. package/.next/standalone/messages/ja/settings.json +22 -1
  358. package/.next/standalone/messages/ko/notification.json +3 -1
  359. package/.next/standalone/messages/ko/session.json +5 -2
  360. package/.next/standalone/messages/ko/settings.json +20 -1
  361. package/.next/standalone/messages/pt-BR/notification.json +3 -1
  362. package/.next/standalone/messages/pt-BR/session.json +5 -2
  363. package/.next/standalone/messages/pt-BR/settings.json +22 -1
  364. package/.next/standalone/messages/ru/notification.json +3 -1
  365. package/.next/standalone/messages/ru/session.json +5 -2
  366. package/.next/standalone/messages/ru/settings.json +22 -1
  367. package/.next/standalone/messages/tr/notification.json +3 -1
  368. package/.next/standalone/messages/tr/session.json +5 -2
  369. package/.next/standalone/messages/tr/settings.json +22 -1
  370. package/.next/standalone/messages/zh-CN/notification.json +3 -1
  371. package/.next/standalone/messages/zh-CN/session.json +5 -2
  372. package/.next/standalone/messages/zh-CN/settings.json +22 -1
  373. package/.next/standalone/messages/zh-TW/notification.json +3 -1
  374. package/.next/standalone/messages/zh-TW/session.json +5 -2
  375. package/.next/standalone/messages/zh-TW/settings.json +22 -1
  376. package/.next/standalone/package.json +4 -5
  377. package/.next/standalone/server.js +1 -1
  378. package/dist/server.js +219 -244
  379. package/package.json +4 -5
  380. package/.next/standalone/.next/server/chunks/[root-of-the-server]__019s3sg._.js +0 -15
  381. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02d5mfa._.js +0 -3
  382. package/.next/standalone/.next/server/chunks/[root-of-the-server]__050uepg._.js +0 -3
  383. package/.next/standalone/.next/server/chunks/[root-of-the-server]__093j355._.js +0 -3
  384. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cy9s8s._.js +0 -3
  385. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dn3vc8._.js +0 -5
  386. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g99747._.js +0 -3
  387. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ge7g~x._.js +0 -3
  388. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iqf2xr._.js +0 -15
  389. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ky2xd.._.js +0 -3
  390. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l806ne._.js +0 -3
  391. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0mm5n3z._.js +0 -15
  392. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0psi612._.js +0 -3
  393. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qtw~r6._.js +0 -3
  394. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ysyw3z._.js +0 -3
  395. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~7f-os._.js +0 -3
  396. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10b7n-k._.js +0 -3
  397. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-e2yqy._.js +0 -3
  398. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vwkkwh._.js +0 -3
  399. package/.next/standalone/.next/server/chunks/ssr/_0mu2snc._.js +0 -3
  400. package/.next/standalone/.next/static/chunks/0.me5n9dvrgga.js +0 -1
  401. package/.next/standalone/.next/static/chunks/04u8dbn0ogxqm.js +0 -5
  402. package/.next/standalone/.next/static/chunks/0617badw.sq7c.js +0 -1
  403. package/.next/standalone/.next/static/chunks/06ik0y0xz_pxd.js +0 -5
  404. package/.next/standalone/.next/static/chunks/06~0v3h-9qr-b.js +0 -1
  405. package/.next/standalone/.next/static/chunks/0_iwf7xd96dhg.js +0 -1
  406. package/.next/standalone/.next/static/chunks/0b.80wy8lilvw.js +0 -1
  407. package/.next/standalone/.next/static/chunks/0c9nugbfmzaq4.js +0 -23
  408. package/.next/standalone/.next/static/chunks/0da0otp~vxk80.js +0 -1
  409. package/.next/standalone/.next/static/chunks/0diujbo1qkcle.css +0 -1
  410. package/.next/standalone/.next/static/chunks/0ep6reedai0y6.js +0 -1
  411. package/.next/standalone/.next/static/chunks/0f6dlhth6ll0c.js +0 -12
  412. package/.next/standalone/.next/static/chunks/0j.bb896cs98k.js +0 -1
  413. package/.next/standalone/.next/static/chunks/0j630d8~~4rbz.js +0 -1
  414. package/.next/standalone/.next/static/chunks/0k7kp5g9etss9.js +0 -1
  415. package/.next/standalone/.next/static/chunks/0ng68zj-fjm.w.js +0 -1
  416. package/.next/standalone/.next/static/chunks/0nsq-sayv38ks.js +0 -1
  417. package/.next/standalone/.next/static/chunks/0nvalz7iwy6qc.js +0 -1
  418. package/.next/standalone/.next/static/chunks/0rr7vbxqscvhw.js +0 -1
  419. package/.next/standalone/.next/static/chunks/0s66~z6yys6zz.js +0 -1
  420. package/.next/standalone/.next/static/chunks/0s8imclb5deef.js +0 -1
  421. package/.next/standalone/.next/static/chunks/0u7flh--27u75.js +0 -1
  422. package/.next/standalone/.next/static/chunks/0vrlsk_eqnj7q.js +0 -1
  423. package/.next/standalone/.next/static/chunks/0vw93vbkgsb1a.js +0 -1
  424. package/.next/standalone/.next/static/chunks/12i5z~h-3ys7k.js +0 -1
  425. package/.next/standalone/.next/static/chunks/171khl108g-m8.js +0 -1
  426. package/.next/standalone/.next/static/chunks/17fzeqm4m_x67.js +0 -1
  427. /package/.next/standalone/.next/static/{dcByQy16pcz2rzj9snwtK → WXAyTQ0PHZnxXXCwEZpit}/_clientMiddlewareManifest.js +0 -0
  428. /package/.next/standalone/.next/static/{dcByQy16pcz2rzj9snwtK → WXAyTQ0PHZnxXXCwEZpit}/_ssgManifest.js +0 -0
package/dist/server.js CHANGED
@@ -4060,13 +4060,13 @@ var init_tmux = __esm({
4060
4060
  const result = /* @__PURE__ */ new Map();
4061
4061
  for (const line of stdout.trim().split("\n")) {
4062
4062
  if (!line) continue;
4063
- const [session, command, path23, pidStr, activityStr] = line.split(" ");
4063
+ const [session, command, path24, pidStr, activityStr] = line.split(" ");
4064
4064
  if (session && command) {
4065
4065
  const pid = parseInt(pidStr, 10);
4066
4066
  const windowActivity = parseInt(activityStr, 10);
4067
4067
  result.set(session, {
4068
4068
  command,
4069
- path: path23 || "",
4069
+ path: path24 || "",
4070
4070
  pid: Number.isNaN(pid) ? 0 : pid,
4071
4071
  windowActivity: Number.isNaN(windowActivity) ? 0 : windowActivity
4072
4072
  });
@@ -4767,11 +4767,11 @@ var init_tab_title = __esm({
4767
4767
  "src/lib/tab-title.ts"() {
4768
4768
  "use strict";
4769
4769
  SHELL_NAMES = /* @__PURE__ */ new Set(["zsh", "bash", "fish", "sh", "-zsh", "-bash", "-fish", "-sh"]);
4770
- extractBasename = (path23) => {
4771
- if (path23 === "~" || path23 === "/") return path23;
4772
- const cleaned = path23.replace(/\/$/, "");
4770
+ extractBasename = (path24) => {
4771
+ if (path24 === "~" || path24 === "/") return path24;
4772
+ const cleaned = path24.replace(/\/$/, "");
4773
4773
  const parts = cleaned.split("/");
4774
- return parts[parts.length - 1] || path23;
4774
+ return parts[parts.length - 1] || path24;
4775
4775
  };
4776
4776
  parseCurrentCommand = (raw) => {
4777
4777
  const trimmed = raw.trim();
@@ -4785,8 +4785,8 @@ var init_tab_title = __esm({
4785
4785
  if (!trimmed) return "";
4786
4786
  const cmd = parseCurrentCommand(raw);
4787
4787
  if (cmd !== null) {
4788
- const path23 = trimmed.slice(trimmed.indexOf("|") + 1);
4789
- if (SHELL_NAMES.has(cmd)) return extractBasename(path23);
4788
+ const path24 = trimmed.slice(trimmed.indexOf("|") + 1);
4789
+ if (SHELL_NAMES.has(cmd)) return extractBasename(path24);
4790
4790
  return cmd;
4791
4791
  }
4792
4792
  const hostPathMatch = trimmed.match(/@[^:]+:\s*(.*)/);
@@ -7770,7 +7770,7 @@ var require_reporter = __commonJS({
7770
7770
  if (state.obj !== null)
7771
7771
  state.obj[key] = value;
7772
7772
  };
7773
- Reporter.prototype.path = function path23() {
7773
+ Reporter.prototype.path = function path24() {
7774
7774
  return this._reporterState.path.join("/");
7775
7775
  };
7776
7776
  Reporter.prototype.enterObject = function enterObject() {
@@ -7811,8 +7811,8 @@ var require_reporter = __commonJS({
7811
7811
  errors: state.errors
7812
7812
  };
7813
7813
  };
7814
- function ReporterError(path23, msg) {
7815
- this.path = path23;
7814
+ function ReporterError(path24, msg) {
7815
+ this.path = path24;
7816
7816
  this.rethrow(msg);
7817
7817
  }
7818
7818
  inherits(ReporterError, Error);
@@ -11229,7 +11229,7 @@ var require_has_flag = __commonJS({
11229
11229
  var require_supports_color = __commonJS({
11230
11230
  "node_modules/supports-color/index.js"(exports2, module2) {
11231
11231
  "use strict";
11232
- var os18 = require("os");
11232
+ var os19 = require("os");
11233
11233
  var tty = require("tty");
11234
11234
  var hasFlag = require_has_flag();
11235
11235
  var { env } = process;
@@ -11277,7 +11277,7 @@ var require_supports_color = __commonJS({
11277
11277
  return min;
11278
11278
  }
11279
11279
  if (process.platform === "win32") {
11280
- const osRelease = os18.release().split(".");
11280
+ const osRelease = os19.release().split(".");
11281
11281
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
11282
11282
  return Number(osRelease[2]) >= 14931 ? 3 : 2;
11283
11283
  }
@@ -11334,7 +11334,7 @@ var require_node2 = __commonJS({
11334
11334
  var tty = require("tty");
11335
11335
  var util = require("util");
11336
11336
  exports2.init = init;
11337
- exports2.log = log21;
11337
+ exports2.log = log22;
11338
11338
  exports2.formatArgs = formatArgs;
11339
11339
  exports2.save = save;
11340
11340
  exports2.load = load;
@@ -11469,7 +11469,7 @@ var require_node2 = __commonJS({
11469
11469
  }
11470
11470
  return (/* @__PURE__ */ new Date()).toISOString() + " ";
11471
11471
  }
11472
- function log21(...args) {
11472
+ function log22(...args) {
11473
11473
  return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args) + "\n");
11474
11474
  }
11475
11475
  function save(namespaces) {
@@ -12307,7 +12307,7 @@ module.exports = __toCommonJS(server_exports);
12307
12307
  init_pristine_env();
12308
12308
  var import_http2 = require("http");
12309
12309
  var import_net = require("net");
12310
- var import_path22 = __toESM(require("path"));
12310
+ var import_path23 = __toESM(require("path"));
12311
12311
  var import_next = __toESM(require("next"));
12312
12312
  init_wrapper();
12313
12313
 
@@ -14063,8 +14063,8 @@ var gracefulInstallShutdown = () => {
14063
14063
 
14064
14064
  // src/lib/timeline-server.ts
14065
14065
  init_wrapper();
14066
- var import_fs4 = require("fs");
14067
14066
  var import_fs5 = require("fs");
14067
+ var import_fs6 = require("fs");
14068
14068
 
14069
14069
  // src/lib/session-detection.ts
14070
14070
  var import_promises3 = __toESM(require("fs/promises"));
@@ -15163,10 +15163,10 @@ function mergeDefs(...defs) {
15163
15163
  function cloneDef(schema) {
15164
15164
  return mergeDefs(schema._zod.def);
15165
15165
  }
15166
- function getElementAtPath(obj, path23) {
15167
- if (!path23)
15166
+ function getElementAtPath(obj, path24) {
15167
+ if (!path24)
15168
15168
  return obj;
15169
- return path23.reduce((acc, key) => acc?.[key], obj);
15169
+ return path24.reduce((acc, key) => acc?.[key], obj);
15170
15170
  }
15171
15171
  function promiseAllObject(promisesObj) {
15172
15172
  const keys = Object.keys(promisesObj);
@@ -15549,11 +15549,11 @@ function aborted(x, startIndex = 0) {
15549
15549
  }
15550
15550
  return false;
15551
15551
  }
15552
- function prefixIssues(path23, issues) {
15552
+ function prefixIssues(path24, issues) {
15553
15553
  return issues.map((iss) => {
15554
15554
  var _a2;
15555
15555
  (_a2 = iss).path ?? (_a2.path = []);
15556
- iss.path.unshift(path23);
15556
+ iss.path.unshift(path24);
15557
15557
  return iss;
15558
15558
  });
15559
15559
  }
@@ -15736,7 +15736,7 @@ function formatError(error48, mapper = (issue2) => issue2.message) {
15736
15736
  }
15737
15737
  function treeifyError(error48, mapper = (issue2) => issue2.message) {
15738
15738
  const result = { errors: [] };
15739
- const processError = (error49, path23 = []) => {
15739
+ const processError = (error49, path24 = []) => {
15740
15740
  var _a2, _b;
15741
15741
  for (const issue2 of error49.issues) {
15742
15742
  if (issue2.code === "invalid_union" && issue2.errors.length) {
@@ -15746,7 +15746,7 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) {
15746
15746
  } else if (issue2.code === "invalid_element") {
15747
15747
  processError({ issues: issue2.issues }, issue2.path);
15748
15748
  } else {
15749
- const fullpath = [...path23, ...issue2.path];
15749
+ const fullpath = [...path24, ...issue2.path];
15750
15750
  if (fullpath.length === 0) {
15751
15751
  result.errors.push(mapper(issue2));
15752
15752
  continue;
@@ -15778,8 +15778,8 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) {
15778
15778
  }
15779
15779
  function toDotPath(_path) {
15780
15780
  const segs = [];
15781
- const path23 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
15782
- for (const seg of path23) {
15781
+ const path24 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
15782
+ for (const seg of path24) {
15783
15783
  if (typeof seg === "number")
15784
15784
  segs.push(`[${seg}]`);
15785
15785
  else if (typeof seg === "symbol")
@@ -27756,13 +27756,13 @@ function resolveRef(ref, ctx) {
27756
27756
  if (!ref.startsWith("#")) {
27757
27757
  throw new Error("External $ref is not supported, only local refs (#/...) are allowed");
27758
27758
  }
27759
- const path23 = ref.slice(1).split("/").filter(Boolean);
27760
- if (path23.length === 0) {
27759
+ const path24 = ref.slice(1).split("/").filter(Boolean);
27760
+ if (path24.length === 0) {
27761
27761
  return ctx.rootSchema;
27762
27762
  }
27763
27763
  const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions";
27764
- if (path23[0] === defsKey) {
27765
- const key = path23[1];
27764
+ if (path24[0] === defsKey) {
27765
+ const key = path24[1];
27766
27766
  if (!key || !ctx.defs[key]) {
27767
27767
  throw new Error(`Reference not found: ${ref}`);
27768
27768
  }
@@ -28999,8 +28999,8 @@ var parseJsonlContent = (content) => {
28999
28999
  };
29000
29000
 
29001
29001
  // src/lib/timeline-server.ts
29002
- var import_promises14 = require("fs/promises");
29003
- var import_fs6 = require("fs");
29002
+ var import_promises15 = require("fs/promises");
29003
+ var import_fs7 = require("fs");
29004
29004
  var import_readline = require("readline");
29005
29005
  init_tmux();
29006
29006
 
@@ -30632,62 +30632,91 @@ var buildResumeCommand = async (sessionId, workspaceId) => {
30632
30632
  return `claude --resume ${sessionId} ${flags}`;
30633
30633
  };
30634
30634
 
30635
- // src/lib/claude-tokens.ts
30636
- var MODEL_PRICING = {
30637
- "opus-4-7": { input: 5, output: 25, cacheWrite5m: 6.25, cacheWrite1h: 10, cacheRead: 0.5 },
30638
- "opus-4-6": { input: 5, output: 25, cacheWrite5m: 6.25, cacheWrite1h: 10, cacheRead: 0.5 },
30639
- "opus-4-5": { input: 5, output: 25, cacheWrite5m: 6.25, cacheWrite1h: 10, cacheRead: 0.5 },
30640
- "opus-4-1": { input: 15, output: 75, cacheWrite5m: 18.75, cacheWrite1h: 30, cacheRead: 1.5 },
30641
- "opus-4": { input: 15, output: 75, cacheWrite5m: 18.75, cacheWrite1h: 30, cacheRead: 1.5 },
30642
- "sonnet-4-6": { input: 3, output: 15, cacheWrite5m: 3.75, cacheWrite1h: 6, cacheRead: 0.3 },
30643
- "sonnet-4-5": { input: 3, output: 15, cacheWrite5m: 3.75, cacheWrite1h: 6, cacheRead: 0.3 },
30644
- "sonnet-4": { input: 3, output: 15, cacheWrite5m: 3.75, cacheWrite1h: 6, cacheRead: 0.3 },
30645
- "sonnet-3-7": { input: 3, output: 15, cacheWrite5m: 3.75, cacheWrite1h: 6, cacheRead: 0.3 },
30646
- "sonnet-3-5": { input: 3, output: 15, cacheWrite5m: 3.75, cacheWrite1h: 6, cacheRead: 0.3 },
30647
- "haiku-4-5": { input: 1, output: 5, cacheWrite5m: 1.25, cacheWrite1h: 2, cacheRead: 0.1 },
30648
- "haiku-3-5": { input: 0.8, output: 4, cacheWrite5m: 1, cacheWrite1h: 1.6, cacheRead: 0.08 },
30649
- "haiku-3": { input: 0.25, output: 1.25, cacheWrite5m: 0.3, cacheWrite1h: 0.5, cacheRead: 0.03 },
30650
- "opus-3": { input: 15, output: 75, cacheWrite5m: 18.75, cacheWrite1h: 30, cacheRead: 1.5 }
30651
- };
30652
- var OPUS_46_FAST_PRICING = {
30653
- input: 30,
30654
- output: 150,
30655
- cacheWrite5m: 37.5,
30656
- cacheWrite1h: 60,
30657
- cacheRead: 3
30658
- };
30659
- var extractModelKey = (modelId) => {
30660
- const cleaned = modelId.replace(/\[.*?\]$/, "");
30661
- const match = cleaned.match(/claude-(\w+-[\d]+(?:-[\d]+)*)(?:-\d{8}|-v\d)?(?:\:\d)?$/);
30662
- return match ? match[1] : null;
30663
- };
30664
- var computeCost = (pricing, input, output, cache5m, cache1h, cacheRead) => {
30665
- const mtok = 1e6;
30666
- return input / mtok * pricing.input + cache5m / mtok * pricing.cacheWrite5m + cache1h / mtok * pricing.cacheWrite1h + cacheRead / mtok * pricing.cacheRead + output / mtok * pricing.output;
30667
- };
30668
- var calculateCost = (modelId, inputTokens, outputTokens, cacheCreation5mTokens, cacheCreation1hTokens, cacheReadTokens, isFastMode = false) => {
30669
- const key = extractModelKey(modelId);
30670
- if (!key) return null;
30671
- const pricing = isFastMode && key === "opus-4-6" ? OPUS_46_FAST_PRICING : MODEL_PRICING[key];
30672
- if (!pricing) return null;
30673
- return computeCost(pricing, inputTokens, outputTokens, cacheCreation5mTokens, cacheCreation1hTokens, cacheReadTokens);
30635
+ // src/lib/session-stats.ts
30636
+ var import_promises14 = __toESM(require("fs/promises"));
30637
+ var import_path17 = __toESM(require("path"));
30638
+ var import_os13 = __toESM(require("os"));
30639
+ var import_fs4 = require("fs");
30640
+ init_logger();
30641
+ var log15 = createLogger("session-stats");
30642
+ var SESSION_STATS_DIR = import_path17.default.join(import_os13.default.homedir(), ".purplemux", "session-stats");
30643
+ var PROJECTS_DIR3 = import_path17.default.join(import_os13.default.homedir(), ".claude", "projects");
30644
+ var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
30645
+ var isValidSessionId2 = (id) => SESSION_ID_RE.test(id);
30646
+ var statsFilePath = (sessionId) => import_path17.default.join(SESSION_STATS_DIR, `${sessionId}.json`);
30647
+ var extractSessionIdFromJsonlPath = (jsonlPath) => {
30648
+ const base = import_path17.default.basename(jsonlPath, ".jsonl");
30649
+ return isValidSessionId2(base) ? base : null;
30650
+ };
30651
+ var readSessionStats = async (sessionId) => {
30652
+ if (!isValidSessionId2(sessionId)) return null;
30653
+ try {
30654
+ const raw = await import_promises14.default.readFile(statsFilePath(sessionId), "utf-8");
30655
+ return JSON.parse(raw);
30656
+ } catch {
30657
+ return null;
30658
+ }
30659
+ };
30660
+ var deleteSessionStats = async (sessionId) => {
30661
+ if (!isValidSessionId2(sessionId)) return;
30662
+ await import_promises14.default.unlink(statsFilePath(sessionId)).catch(() => {
30663
+ });
30664
+ };
30665
+ var listStatsSessionIds = async () => {
30666
+ try {
30667
+ const files = await import_promises14.default.readdir(SESSION_STATS_DIR);
30668
+ return files.filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -5)).filter(isValidSessionId2);
30669
+ } catch {
30670
+ return [];
30671
+ }
30672
+ };
30673
+ var listJsonlSessionIds = async () => {
30674
+ const ids = /* @__PURE__ */ new Set();
30675
+ try {
30676
+ const projectDirs = await import_promises14.default.readdir(PROJECTS_DIR3);
30677
+ for (const dir of projectDirs) {
30678
+ const projectPath = import_path17.default.join(PROJECTS_DIR3, dir);
30679
+ const stat = await import_promises14.default.stat(projectPath).catch(() => null);
30680
+ if (!stat?.isDirectory()) continue;
30681
+ const files = await import_promises14.default.readdir(projectPath).catch(() => []);
30682
+ for (const file2 of files) {
30683
+ if (!file2.endsWith(".jsonl")) continue;
30684
+ const id = file2.slice(0, -6);
30685
+ if (isValidSessionId2(id)) ids.add(id);
30686
+ }
30687
+ }
30688
+ } catch {
30689
+ }
30690
+ return ids;
30691
+ };
30692
+ var cleanupOrphanSessionStats = async () => {
30693
+ if (!(0, import_fs4.existsSync)(SESSION_STATS_DIR)) return;
30694
+ try {
30695
+ const [statsIds, jsonlIds] = await Promise.all([listStatsSessionIds(), listJsonlSessionIds()]);
30696
+ const orphans = statsIds.filter((id) => !jsonlIds.has(id));
30697
+ if (orphans.length === 0) return;
30698
+ await Promise.all(orphans.map((id) => deleteSessionStats(id)));
30699
+ log15.debug({ count: orphans.length }, "removed orphan session stats");
30700
+ } catch (err) {
30701
+ log15.debug({ err }, "orphan cleanup failed");
30702
+ }
30674
30703
  };
30675
30704
 
30676
30705
  // src/lib/timeline-server.ts
30677
- var import_path18 = __toESM(require("path"));
30706
+ var import_path19 = __toESM(require("path"));
30678
30707
 
30679
30708
  // src/lib/path-validation.ts
30680
- var import_path17 = __toESM(require("path"));
30681
- var import_os13 = __toESM(require("os"));
30682
- var CLAUDE_PROJECTS_DIR = import_path17.default.join(import_os13.default.homedir(), ".claude", "projects");
30709
+ var import_path18 = __toESM(require("path"));
30710
+ var import_os14 = __toESM(require("os"));
30711
+ var CLAUDE_PROJECTS_DIR = import_path18.default.join(import_os14.default.homedir(), ".claude", "projects");
30683
30712
  var isAllowedJsonlPath = (filePath) => {
30684
- const resolved = import_path17.default.resolve(filePath);
30685
- return resolved.startsWith(CLAUDE_PROJECTS_DIR + import_path17.default.sep) && resolved.endsWith(".jsonl");
30713
+ const resolved = import_path18.default.resolve(filePath);
30714
+ return resolved.startsWith(CLAUDE_PROJECTS_DIR + import_path18.default.sep) && resolved.endsWith(".jsonl");
30686
30715
  };
30687
30716
 
30688
30717
  // src/lib/timeline-server.ts
30689
30718
  init_logger();
30690
- var log15 = createLogger("timeline");
30719
+ var log16 = createLogger("timeline");
30691
30720
  var HEARTBEAT_INTERVAL2 = 3e4;
30692
30721
  var HEARTBEAT_TIMEOUT2 = 9e4;
30693
30722
  var DEBOUNCE_MS2 = 50;
@@ -30707,10 +30736,15 @@ var resolveClaudeSummary = async (sessionName, jsonlSummary) => {
30707
30736
  const paneTitle = await getPaneTitle(sessionName);
30708
30737
  return parseClaudePaneTitle2(paneTitle) ?? jsonlSummary ?? null;
30709
30738
  };
30710
- var connections2 = /* @__PURE__ */ new Map();
30711
- var fileWatchers = /* @__PURE__ */ new Map();
30712
- var sessionWatchers = /* @__PURE__ */ new Map();
30713
- var pendingJsonlWatchers = /* @__PURE__ */ new Map();
30739
+ var gTimeline = globalThis;
30740
+ if (!gTimeline.__pmuxTimelineConnections) gTimeline.__pmuxTimelineConnections = /* @__PURE__ */ new Map();
30741
+ if (!gTimeline.__pmuxTimelineFileWatchers) gTimeline.__pmuxTimelineFileWatchers = /* @__PURE__ */ new Map();
30742
+ if (!gTimeline.__pmuxTimelineSessionWatchers) gTimeline.__pmuxTimelineSessionWatchers = /* @__PURE__ */ new Map();
30743
+ if (!gTimeline.__pmuxTimelinePendingJsonlWatchers) gTimeline.__pmuxTimelinePendingJsonlWatchers = /* @__PURE__ */ new Map();
30744
+ var connections2 = gTimeline.__pmuxTimelineConnections;
30745
+ var fileWatchers = gTimeline.__pmuxTimelineFileWatchers;
30746
+ var sessionWatchers = gTimeline.__pmuxTimelineSessionWatchers;
30747
+ var pendingJsonlWatchers = gTimeline.__pmuxTimelinePendingJsonlWatchers;
30714
30748
  var canSend = (ws) => ws.readyState === import_websocket.default.OPEN && ws.bufferedAmount < BACKPRESSURE_LIMIT2;
30715
30749
  var sendJson = (ws, msg) => {
30716
30750
  if (canSend(ws)) {
@@ -30758,7 +30792,7 @@ var broadcastToWatcher = (watcherKey, msg) => {
30758
30792
  var readBoundedEntries = async (filePath, from, to) => {
30759
30793
  const readSize = to - from;
30760
30794
  if (readSize <= 0) return [];
30761
- const handle = await (0, import_promises14.open)(filePath, "r");
30795
+ const handle = await (0, import_promises15.open)(filePath, "r");
30762
30796
  try {
30763
30797
  const buf = Buffer.alloc(readSize);
30764
30798
  await handle.read(buf, 0, readSize, from);
@@ -30839,7 +30873,7 @@ var processFileChange = async (fw) => {
30839
30873
  };
30840
30874
  var startFileWatch = (fw) => {
30841
30875
  try {
30842
- fw.watcher = (0, import_fs4.watch)(fw.jsonlPath, () => {
30876
+ fw.watcher = (0, import_fs5.watch)(fw.jsonlPath, () => {
30843
30877
  if (fw.debounceTimer) clearTimeout(fw.debounceTimer);
30844
30878
  fw.debounceTimer = setTimeout(() => processFileChange(fw), DEBOUNCE_MS2);
30845
30879
  });
@@ -30869,7 +30903,7 @@ var removeFileWatcher = (jsonlPath) => {
30869
30903
  };
30870
30904
  var readFirstTimestamp = async (filePath) => {
30871
30905
  try {
30872
- const stream = (0, import_fs6.createReadStream)(filePath, { encoding: "utf-8", start: 0, end: 4096 });
30906
+ const stream = (0, import_fs7.createReadStream)(filePath, { encoding: "utf-8", start: 0, end: 4096 });
30873
30907
  const rl = (0, import_readline.createInterface)({ input: stream, crlfDelay: Infinity });
30874
30908
  for await (const line of rl) {
30875
30909
  if (!line.trim()) continue;
@@ -30896,12 +30930,6 @@ var computeInitMeta = (entries, fileSize, createdAtOverride, customTitle) => {
30896
30930
  let lastTimestamp = 0;
30897
30931
  let userCount = 0;
30898
30932
  let assistantCount = 0;
30899
- let inputTokens = 0;
30900
- let outputTokens = 0;
30901
- let cacheCreationTokens = 0;
30902
- let cacheReadTokens = 0;
30903
- let contextWindowTokens = 0;
30904
- const modelMap = /* @__PURE__ */ new Map();
30905
30933
  for (const entry of entries) {
30906
30934
  if (!createdAt && entry.timestamp) {
30907
30935
  createdAt = new Date(entry.timestamp).toISOString();
@@ -30910,59 +30938,9 @@ var computeInitMeta = (entries, fileSize, createdAtOverride, customTitle) => {
30910
30938
  lastTimestamp = Math.max(lastTimestamp, entry.timestamp);
30911
30939
  }
30912
30940
  updatedAt = new Date(entry.timestamp).toISOString();
30913
- if (entry.type === "user-message") {
30914
- userCount++;
30915
- } else if (entry.type === "assistant-message") {
30916
- assistantCount++;
30917
- if (entry.usage) {
30918
- const cc = entry.usage.cache_creation_input_tokens ?? 0;
30919
- const cr = entry.usage.cache_read_input_tokens ?? 0;
30920
- const cc1h = entry.usage.cache_creation?.ephemeral_1h_input_tokens ?? 0;
30921
- const cc5m = entry.usage.cache_creation?.ephemeral_5m_input_tokens ?? Math.max(0, cc - cc1h);
30922
- inputTokens += entry.usage.input_tokens;
30923
- outputTokens += entry.usage.output_tokens;
30924
- cacheCreationTokens += cc;
30925
- cacheReadTokens += cr;
30926
- contextWindowTokens = entry.usage.input_tokens + entry.usage.output_tokens + cc + cr;
30927
- const model = entry.model ?? "unknown";
30928
- const existing = modelMap.get(model) ?? {
30929
- inputTokens: 0,
30930
- outputTokens: 0,
30931
- cacheCreationTokens: 0,
30932
- cacheCreation5mTokens: 0,
30933
- cacheCreation1hTokens: 0,
30934
- cacheReadTokens: 0
30935
- };
30936
- existing.inputTokens += entry.usage.input_tokens;
30937
- existing.outputTokens += entry.usage.output_tokens;
30938
- existing.cacheCreationTokens += cc;
30939
- existing.cacheCreation5mTokens += cc5m;
30940
- existing.cacheCreation1hTokens += cc1h;
30941
- existing.cacheReadTokens += cr;
30942
- modelMap.set(model, existing);
30943
- }
30944
- }
30945
- }
30946
- const tokensByModel = Array.from(modelMap.entries()).map(([model, tokens]) => ({
30947
- model,
30948
- inputTokens: tokens.inputTokens,
30949
- outputTokens: tokens.outputTokens,
30950
- cacheCreationTokens: tokens.cacheCreationTokens,
30951
- cacheReadTokens: tokens.cacheReadTokens,
30952
- totalTokens: tokens.inputTokens + tokens.outputTokens + tokens.cacheCreationTokens + tokens.cacheReadTokens,
30953
- cost: calculateCost(
30954
- model,
30955
- tokens.inputTokens,
30956
- tokens.outputTokens,
30957
- tokens.cacheCreation5mTokens,
30958
- tokens.cacheCreation1hTokens,
30959
- tokens.cacheReadTokens
30960
- )
30961
- })).sort((a, b) => b.totalTokens - a.totalTokens);
30962
- const totalCost = tokensByModel.reduce((sum, m) => {
30963
- if (m.cost === null) return sum;
30964
- return (sum ?? 0) + m.cost;
30965
- }, null);
30941
+ if (entry.type === "user-message") userCount++;
30942
+ else if (entry.type === "assistant-message") assistantCount++;
30943
+ }
30966
30944
  return {
30967
30945
  createdAt: createdAtOverride ?? createdAt,
30968
30946
  updatedAt,
@@ -30970,19 +30948,11 @@ var computeInitMeta = (entries, fileSize, createdAtOverride, customTitle) => {
30970
30948
  fileSize,
30971
30949
  userCount,
30972
30950
  assistantCount,
30973
- inputTokens,
30974
- outputTokens,
30975
- cacheCreationTokens,
30976
- cacheReadTokens,
30977
- totalTokens: inputTokens + outputTokens + cacheCreationTokens + cacheReadTokens,
30978
- contextWindowTokens,
30979
- totalCost,
30980
- customTitle,
30981
- tokensByModel
30951
+ customTitle
30982
30952
  };
30983
30953
  };
30984
30954
  var subscribeToFile = async (ws, jsonlPath, sessionId, sessionName) => {
30985
- if (!(0, import_fs5.existsSync)(jsonlPath)) {
30955
+ if (!(0, import_fs6.existsSync)(jsonlPath)) {
30986
30956
  sendJson(ws, { type: "timeline:init", entries: [], sessionId: sessionId ?? "", totalEntries: 0, startByteOffset: 0, hasMore: false, jsonlPath });
30987
30957
  return void 0;
30988
30958
  }
@@ -31027,16 +30997,19 @@ var subscribeToFile = async (ws, jsonlPath, sessionId, sessionName) => {
31027
30997
  }
31028
30998
  const firstTimestamp = result.hasMore ? await readFirstTimestamp(jsonlPath) : null;
31029
30999
  const meta3 = computeInitMeta(result.entries, result.fileSize, firstTimestamp, result.customTitle);
31000
+ const resolvedSessionId = sessionId ?? extractSessionIdFromJsonlPath(jsonlPath) ?? "";
31001
+ const sessionStats = resolvedSessionId ? await readSessionStats(resolvedSessionId) : null;
31030
31002
  sendJson(ws, {
31031
31003
  type: "timeline:init",
31032
31004
  entries: result.entries,
31033
- sessionId: sessionId ?? "",
31005
+ sessionId: resolvedSessionId,
31034
31006
  totalEntries: result.entries.length,
31035
31007
  startByteOffset: result.startByteOffset,
31036
31008
  hasMore: result.hasMore,
31037
31009
  jsonlPath,
31038
31010
  summary: result.summary,
31039
- meta: meta3
31011
+ meta: meta3,
31012
+ sessionStats
31040
31013
  });
31041
31014
  if (!isNewWatcher) {
31042
31015
  fw.initOffsets.set(ws, result.fileSize);
@@ -31080,7 +31053,7 @@ var watchForJsonlFile = (sessionName, sessionId, cwd) => {
31080
31053
  cancelJsonlWatcher(sessionName);
31081
31054
  const projectDir = cwdToProjectPath(cwd);
31082
31055
  const jsonlFilename = `${sessionId}.jsonl`;
31083
- const expectedJsonlPath = import_path18.default.join(projectDir, jsonlFilename);
31056
+ const expectedJsonlPath = import_path19.default.join(projectDir, jsonlFilename);
31084
31057
  let dirWatcher = null;
31085
31058
  let parentWatcher = null;
31086
31059
  let stopped = false;
@@ -31115,9 +31088,9 @@ var watchForJsonlFile = (sessionName, sessionId, cwd) => {
31115
31088
  const watchProjectDir = () => {
31116
31089
  if (stopped) return;
31117
31090
  try {
31118
- dirWatcher = (0, import_fs4.watch)(projectDir, (_event, filename) => {
31091
+ dirWatcher = (0, import_fs5.watch)(projectDir, (_event, filename) => {
31119
31092
  if (stopped) return;
31120
- if (filename === jsonlFilename && (0, import_fs5.existsSync)(expectedJsonlPath)) {
31093
+ if (filename === jsonlFilename && (0, import_fs6.existsSync)(expectedJsonlPath)) {
31121
31094
  onJsonlFound();
31122
31095
  }
31123
31096
  });
@@ -31126,32 +31099,32 @@ var watchForJsonlFile = (sessionName, sessionId, cwd) => {
31126
31099
  } catch {
31127
31100
  }
31128
31101
  };
31129
- if ((0, import_fs5.existsSync)(expectedJsonlPath)) {
31102
+ if ((0, import_fs6.existsSync)(expectedJsonlPath)) {
31130
31103
  onJsonlFound();
31131
31104
  return;
31132
31105
  }
31133
- if ((0, import_fs5.existsSync)(projectDir)) {
31106
+ if ((0, import_fs6.existsSync)(projectDir)) {
31134
31107
  watchProjectDir();
31135
- if (!stopped && (0, import_fs5.existsSync)(expectedJsonlPath)) {
31108
+ if (!stopped && (0, import_fs6.existsSync)(expectedJsonlPath)) {
31136
31109
  onJsonlFound();
31137
31110
  }
31138
31111
  } else {
31139
- const projectsDir = import_path18.default.dirname(projectDir);
31140
- const projectDirName = import_path18.default.basename(projectDir);
31112
+ const projectsDir = import_path19.default.dirname(projectDir);
31113
+ const projectDirName = import_path19.default.basename(projectDir);
31141
31114
  try {
31142
- (0, import_fs5.mkdirSync)(projectsDir, { recursive: true });
31143
- parentWatcher = (0, import_fs4.watch)(projectsDir, (_event, filename) => {
31115
+ (0, import_fs6.mkdirSync)(projectsDir, { recursive: true });
31116
+ parentWatcher = (0, import_fs5.watch)(projectsDir, (_event, filename) => {
31144
31117
  if (stopped) return;
31145
- if (filename === projectDirName && (0, import_fs5.existsSync)(projectDir)) {
31118
+ if (filename === projectDirName && (0, import_fs6.existsSync)(projectDir)) {
31146
31119
  if (parentWatcher) {
31147
31120
  parentWatcher.close();
31148
31121
  parentWatcher = null;
31149
31122
  }
31150
- if ((0, import_fs5.existsSync)(expectedJsonlPath)) {
31123
+ if ((0, import_fs6.existsSync)(expectedJsonlPath)) {
31151
31124
  onJsonlFound();
31152
31125
  } else {
31153
31126
  watchProjectDir();
31154
- if (!stopped && (0, import_fs5.existsSync)(expectedJsonlPath)) {
31127
+ if (!stopped && (0, import_fs6.existsSync)(expectedJsonlPath)) {
31155
31128
  onJsonlFound();
31156
31129
  }
31157
31130
  }
@@ -31187,8 +31160,8 @@ var resolveJsonlPath = async (tmuxSession, sessionId) => {
31187
31160
  const cwd = await getSessionCwd(tmuxSession);
31188
31161
  if (!cwd) return null;
31189
31162
  const projectDir = cwdToProjectPath(cwd);
31190
- const jsonlPath = import_path18.default.join(projectDir, `${sessionId}.jsonl`);
31191
- return (0, import_fs5.existsSync)(jsonlPath) ? jsonlPath : null;
31163
+ const jsonlPath = import_path19.default.join(projectDir, `${sessionId}.jsonl`);
31164
+ return (0, import_fs6.existsSync)(jsonlPath) ? jsonlPath : null;
31192
31165
  };
31193
31166
  var handleResumeMessage = async (ws, conn, payload) => {
31194
31167
  const { sessionId, tmuxSession } = payload;
@@ -31303,12 +31276,12 @@ var handleTimelineConnection = async (ws, request) => {
31303
31276
  }
31304
31277
  }
31305
31278
  } catch (err) {
31306
- log15.error(`message handler error: ${err instanceof Error ? err.message : err}`);
31279
+ log16.error(`message handler error: ${err instanceof Error ? err.message : err}`);
31307
31280
  }
31308
31281
  });
31309
31282
  ws.on("close", () => cleanup3(conn));
31310
31283
  ws.on("error", (err) => {
31311
- log15.error(`websocket error: ${err.message}`);
31284
+ log16.error(`websocket error: ${err.message}`);
31312
31285
  cleanup3(conn);
31313
31286
  });
31314
31287
  const claudeSessionId = url2.searchParams.get("claudeSessionId");
@@ -31408,7 +31381,7 @@ var handleTimelineConnection = async (ws, request) => {
31408
31381
  }
31409
31382
  for (const c of wsConns) {
31410
31383
  if (c.currentJsonlPath) {
31411
- const currentFile = import_path18.default.basename(c.currentJsonlPath, ".jsonl");
31384
+ const currentFile = import_path19.default.basename(c.currentJsonlPath, ".jsonl");
31412
31385
  if (newInfo.sessionId && currentFile !== newInfo.sessionId) {
31413
31386
  unsubscribeFromFile(c.ws, c.currentJsonlPath);
31414
31387
  c.currentJsonlPath = null;
@@ -31490,7 +31463,7 @@ init_sync_server();
31490
31463
  // src/lib/status-server.ts
31491
31464
  init_wrapper();
31492
31465
  init_logger();
31493
- var log16 = createLogger("status");
31466
+ var log17 = createLogger("status");
31494
31467
  var handleStatusConnection = (ws) => {
31495
31468
  const manager = getStatusManager();
31496
31469
  manager.addClient(ws);
@@ -31529,7 +31502,7 @@ var handleStatusConnection = (ws) => {
31529
31502
  break;
31530
31503
  }
31531
31504
  default:
31532
- log16.warn(`Unknown event: ${msg.type}`);
31505
+ log17.warn(`Unknown event: ${msg.type}`);
31533
31506
  }
31534
31507
  } catch {
31535
31508
  }
@@ -31538,7 +31511,7 @@ var handleStatusConnection = (ws) => {
31538
31511
  manager.removeClient(ws);
31539
31512
  });
31540
31513
  ws.on("error", (err) => {
31541
- log16.error(`websocket error: ${err.message}`);
31514
+ log17.error(`websocket error: ${err.message}`);
31542
31515
  manager.removeClient(ws);
31543
31516
  });
31544
31517
  };
@@ -31551,14 +31524,14 @@ init_claude_prompt();
31551
31524
 
31552
31525
  // src/lib/cli-token.ts
31553
31526
  var import_crypto2 = require("crypto");
31554
- var import_fs7 = __toESM(require("fs"));
31555
- var import_path19 = __toESM(require("path"));
31556
- var import_os14 = __toESM(require("os"));
31557
- var TOKEN_FILE = import_path19.default.join(import_os14.default.homedir(), ".purplemux", "cli-token");
31527
+ var import_fs8 = __toESM(require("fs"));
31528
+ var import_path20 = __toESM(require("path"));
31529
+ var import_os15 = __toESM(require("os"));
31530
+ var TOKEN_FILE = import_path20.default.join(import_os15.default.homedir(), ".purplemux", "cli-token");
31558
31531
  var g9 = globalThis;
31559
31532
  var readTokenFile = () => {
31560
31533
  try {
31561
- const value = import_fs7.default.readFileSync(TOKEN_FILE, "utf-8").trim();
31534
+ const value = import_fs8.default.readFileSync(TOKEN_FILE, "utf-8").trim();
31562
31535
  return value || null;
31563
31536
  } catch {
31564
31537
  return null;
@@ -31566,8 +31539,8 @@ var readTokenFile = () => {
31566
31539
  };
31567
31540
  var writeTokenFile = (value) => {
31568
31541
  try {
31569
- import_fs7.default.mkdirSync(import_path19.default.dirname(TOKEN_FILE), { recursive: true });
31570
- import_fs7.default.writeFileSync(TOKEN_FILE, value, { mode: 384 });
31542
+ import_fs8.default.mkdirSync(import_path20.default.dirname(TOKEN_FILE), { recursive: true });
31543
+ import_fs8.default.writeFileSync(TOKEN_FILE, value, { mode: 384 });
31571
31544
  } catch {
31572
31545
  }
31573
31546
  };
@@ -31585,18 +31558,18 @@ var getCliToken = () => {
31585
31558
  };
31586
31559
 
31587
31560
  // src/lib/lock.ts
31588
- var import_fs8 = __toESM(require("fs"));
31589
- var import_promises15 = __toESM(require("fs/promises"));
31590
- var import_path20 = __toESM(require("path"));
31591
- var import_os15 = __toESM(require("os"));
31561
+ var import_fs9 = __toESM(require("fs"));
31562
+ var import_promises16 = __toESM(require("fs/promises"));
31563
+ var import_path21 = __toESM(require("path"));
31564
+ var import_os16 = __toESM(require("os"));
31592
31565
  var import_http = __toESM(require("http"));
31593
31566
  init_logger();
31594
- var log17 = createLogger("lock");
31595
- var BASE_DIR9 = import_path20.default.join(import_os15.default.homedir(), ".purplemux");
31596
- var LOCK_FILE = import_path20.default.join(BASE_DIR9, "pmux.lock");
31567
+ var log18 = createLogger("lock");
31568
+ var BASE_DIR9 = import_path21.default.join(import_os16.default.homedir(), ".purplemux");
31569
+ var LOCK_FILE = import_path21.default.join(BASE_DIR9, "pmux.lock");
31597
31570
  var readLockData = async () => {
31598
31571
  try {
31599
- const raw = await import_promises15.default.readFile(LOCK_FILE, "utf-8");
31572
+ const raw = await import_promises16.default.readFile(LOCK_FILE, "utf-8");
31600
31573
  return JSON.parse(raw);
31601
31574
  } catch {
31602
31575
  return null;
@@ -31604,7 +31577,7 @@ var readLockData = async () => {
31604
31577
  };
31605
31578
  var writeLockData = async (data) => {
31606
31579
  const content = JSON.stringify(data, null, 2) + "\n";
31607
- const fd = await import_promises15.default.open(LOCK_FILE, "wx", 384);
31580
+ const fd = await import_promises16.default.open(LOCK_FILE, "wx", 384);
31608
31581
  try {
31609
31582
  await fd.writeFile(content);
31610
31583
  } finally {
@@ -31642,16 +31615,16 @@ var checkHealth = (port) => new Promise((resolve) => {
31642
31615
  });
31643
31616
  var removeStaleLock = async () => {
31644
31617
  try {
31645
- await import_promises15.default.unlink(LOCK_FILE);
31618
+ await import_promises16.default.unlink(LOCK_FILE);
31646
31619
  } catch {
31647
31620
  }
31648
31621
  };
31649
31622
  var acquireLock = async (port) => {
31650
- await import_promises15.default.mkdir(BASE_DIR9, { recursive: true });
31623
+ await import_promises16.default.mkdir(BASE_DIR9, { recursive: true });
31651
31624
  const data = { pid: process.pid, port, startedAt: Date.now() };
31652
31625
  try {
31653
31626
  await writeLockData(data);
31654
- log17.debug(`Lock acquired (pid=${process.pid})`);
31627
+ log18.debug(`Lock acquired (pid=${process.pid})`);
31655
31628
  return;
31656
31629
  } catch (err) {
31657
31630
  const code = err.code;
@@ -31667,18 +31640,18 @@ var acquireLock = async (port) => {
31667
31640
  if (!existing) {
31668
31641
  await removeStaleLock();
31669
31642
  await writeLockData(data);
31670
- log17.debug(`Lock acquired after removing empty lock (pid=${process.pid})`);
31643
+ log18.debug(`Lock acquired after removing empty lock (pid=${process.pid})`);
31671
31644
  return;
31672
31645
  }
31673
31646
  if (existing.pid === process.pid) {
31674
- log17.debug("Lock already held by this process");
31647
+ log18.debug("Lock already held by this process");
31675
31648
  return;
31676
31649
  }
31677
31650
  if (!isPidAlive(existing.pid)) {
31678
- log17.warn(`Stale lock found (pid=${existing.pid} is dead), reclaiming`);
31651
+ log18.warn(`Stale lock found (pid=${existing.pid} is dead), reclaiming`);
31679
31652
  await removeStaleLock();
31680
31653
  await writeLockData(data);
31681
- log17.debug(`Lock acquired (pid=${process.pid})`);
31654
+ log18.debug(`Lock acquired (pid=${process.pid})`);
31682
31655
  return;
31683
31656
  }
31684
31657
  const healthy = await checkHealth(existing.port);
@@ -31686,17 +31659,17 @@ var acquireLock = async (port) => {
31686
31659
  console.error(`\x1B[31mpurplemux is already running (pid=${existing.pid}, port=${existing.port})\x1B[0m`);
31687
31660
  process.exit(1);
31688
31661
  }
31689
- log17.warn(`PID ${existing.pid} is alive but not purplemux, reclaiming lock`);
31662
+ log18.warn(`PID ${existing.pid} is alive but not purplemux, reclaiming lock`);
31690
31663
  await removeStaleLock();
31691
31664
  await writeLockData(data);
31692
- log17.debug(`Lock acquired (pid=${process.pid})`);
31665
+ log18.debug(`Lock acquired (pid=${process.pid})`);
31693
31666
  };
31694
31667
  var releaseLock = () => {
31695
31668
  try {
31696
- const raw = import_fs8.default.readFileSync(LOCK_FILE, "utf-8");
31669
+ const raw = import_fs9.default.readFileSync(LOCK_FILE, "utf-8");
31697
31670
  const data = JSON.parse(raw);
31698
31671
  if (data.pid === process.pid) {
31699
- import_fs8.default.unlinkSync(LOCK_FILE);
31672
+ import_fs9.default.unlinkSync(LOCK_FILE);
31700
31673
  }
31701
31674
  } catch {
31702
31675
  }
@@ -31714,7 +31687,7 @@ init_layout_store();
31714
31687
  init_tmux();
31715
31688
  init_workspace_store();
31716
31689
  init_logger();
31717
- var log18 = createLogger("auto-resume");
31690
+ var log19 = createLogger("auto-resume");
31718
31691
  var SHELL_READY_DELAY_MS = 500;
31719
31692
  var SAFE_SHELLS2 = /* @__PURE__ */ new Set(["bash", "zsh", "fish", "sh", "dash"]);
31720
31693
  var findAutoResumeTargets = async () => {
@@ -31742,23 +31715,23 @@ var sendResumeKeys = async (target) => {
31742
31715
  try {
31743
31716
  const command = await getPaneCurrentCommand(target.tmuxSession);
31744
31717
  if (!command) {
31745
- log18.warn(`Cannot check process: ${target.tmuxSession}`);
31718
+ log19.warn(`Cannot check process: ${target.tmuxSession}`);
31746
31719
  return false;
31747
31720
  }
31748
31721
  if (!SAFE_SHELLS2.has(command)) {
31749
31722
  if (command === "claude" || command === "node") {
31750
- log18.debug(`Claude already running, skip: ${target.tmuxSession}`);
31723
+ log19.debug(`Claude already running, skip: ${target.tmuxSession}`);
31751
31724
  return true;
31752
31725
  }
31753
- log18.debug(`Non-shell process running (${command}), skip: ${target.tmuxSession}`);
31726
+ log19.debug(`Non-shell process running (${command}), skip: ${target.tmuxSession}`);
31754
31727
  return false;
31755
31728
  }
31756
31729
  const resumeCmd = await buildResumeCommand(target.claudeSessionId, target.workspaceId);
31757
- log18.debug(`Sending resume: ${target.tmuxSession} \u2192 ${target.claudeSessionId}`);
31730
+ log19.debug(`Sending resume: ${target.tmuxSession} \u2192 ${target.claudeSessionId}`);
31758
31731
  await sendKeys(target.tmuxSession, resumeCmd);
31759
31732
  return true;
31760
31733
  } catch (err) {
31761
- log18.error(`Failed: ${target.tmuxSession} \u2014 ${err instanceof Error ? err.message : err}`);
31734
+ log19.error(`Failed: ${target.tmuxSession} \u2014 ${err instanceof Error ? err.message : err}`);
31762
31735
  return false;
31763
31736
  }
31764
31737
  };
@@ -31766,7 +31739,7 @@ var executeAutoResume = async (targets) => {
31766
31739
  let hasNewSession = false;
31767
31740
  for (const target of targets) {
31768
31741
  if (!await hasSession(target.tmuxSession)) {
31769
- log18.debug(`No tmux session, creating new: ${target.tmuxSession}`);
31742
+ log19.debug(`No tmux session, creating new: ${target.tmuxSession}`);
31770
31743
  await createSession(target.tmuxSession, 80, 24);
31771
31744
  hasNewSession = true;
31772
31745
  }
@@ -31779,22 +31752,22 @@ var executeAutoResume = async (targets) => {
31779
31752
  var autoResumeOnStartup = async () => {
31780
31753
  const targets = await findAutoResumeTargets();
31781
31754
  if (targets.length === 0) return;
31782
- log18.debug(`${targets.length} surface(s) auto-resume started`);
31755
+ log19.debug(`${targets.length} surface(s) auto-resume started`);
31783
31756
  executeAutoResume(targets).then(() => {
31784
- log18.debug("Auto-resume complete");
31757
+ log19.debug("Auto-resume complete");
31785
31758
  }).catch((err) => {
31786
- log18.error(`Auto-resume error: ${err instanceof Error ? err.message : err}`);
31759
+ log19.error(`Auto-resume error: ${err instanceof Error ? err.message : err}`);
31787
31760
  });
31788
31761
  };
31789
31762
 
31790
31763
  // src/lib/auth-credentials.ts
31791
31764
  init_logger();
31792
- var log19 = createLogger("auth-credentials");
31765
+ var log20 = createLogger("auth-credentials");
31793
31766
  var consumeInitPasswordEnv = () => {
31794
31767
  const value = process.env.INIT_PASSWORD;
31795
31768
  if (!value) return null;
31796
31769
  if (value.length < MIN_PASSWORD_LENGTH) {
31797
- log19.warn(`INIT_PASSWORD ignored: must be at least ${MIN_PASSWORD_LENGTH} characters`);
31770
+ log20.warn(`INIT_PASSWORD ignored: must be at least ${MIN_PASSWORD_LENGTH} characters`);
31798
31771
  delete process.env.INIT_PASSWORD;
31799
31772
  return null;
31800
31773
  }
@@ -31817,7 +31790,7 @@ var initAuthCredentials = async () => {
31817
31790
  };
31818
31791
 
31819
31792
  // src/lib/network-access.ts
31820
- var import_os16 = __toESM(require("os"));
31793
+ var import_os17 = __toESM(require("os"));
31821
31794
  var DEFAULT_NETWORK_ACCESS = "all";
31822
31795
  var LOCALHOST_RANGES = ["127.0.0.0/8", "::1/128"];
31823
31796
  var TAILSCALE_RANGES = ["100.64.0.0/10", "fd7a:115c:a1e0::/48"];
@@ -31938,7 +31911,7 @@ var listInterfaceIps = (spec, port) => {
31938
31911
  if (!urls.includes(url2)) urls.push(url2);
31939
31912
  };
31940
31913
  if (spec.allowAll || isAllowed(spec, "127.0.0.1")) push("127.0.0.1");
31941
- for (const addrs of Object.values(import_os16.default.networkInterfaces())) {
31914
+ for (const addrs of Object.values(import_os17.default.networkInterfaces())) {
31942
31915
  if (!addrs) continue;
31943
31916
  for (const addr of addrs) {
31944
31917
  if (addr.internal) continue;
@@ -32008,18 +31981,18 @@ var setBoundHost = (host) => {
32008
31981
  };
32009
31982
 
32010
31983
  // src/lib/uploads-store.ts
32011
- var import_promises16 = __toESM(require("fs/promises"));
32012
- var import_path21 = __toESM(require("path"));
32013
- var import_os17 = __toESM(require("os"));
32014
- var BASE_DIR10 = import_path21.default.join(import_os17.default.homedir(), ".purplemux");
32015
- var UPLOADS_DIR = import_path21.default.join(BASE_DIR10, "uploads");
31984
+ var import_promises17 = __toESM(require("fs/promises"));
31985
+ var import_path22 = __toESM(require("path"));
31986
+ var import_os18 = __toESM(require("os"));
31987
+ var BASE_DIR10 = import_path22.default.join(import_os18.default.homedir(), ".purplemux");
31988
+ var UPLOADS_DIR = import_path22.default.join(BASE_DIR10, "uploads");
32016
31989
  var DEFAULT_TTL_MS = 24 * 60 * 60 * 1e3;
32017
31990
  var MAX_BYTES = 10 * 1024 * 1024;
32018
31991
  var GENERIC_MAX_BYTES = 50 * 1024 * 1024;
32019
31992
  var removeFileSafe = async (filePath) => {
32020
31993
  try {
32021
- const stat = await import_promises16.default.stat(filePath);
32022
- await import_promises16.default.unlink(filePath);
31994
+ const stat = await import_promises17.default.stat(filePath);
31995
+ await import_promises17.default.unlink(filePath);
32023
31996
  return stat.size;
32024
31997
  } catch {
32025
31998
  return 0;
@@ -32027,9 +32000,9 @@ var removeFileSafe = async (filePath) => {
32027
32000
  };
32028
32001
  var removeEmptyDirs = async (dir) => {
32029
32002
  try {
32030
- const entries = await import_promises16.default.readdir(dir);
32003
+ const entries = await import_promises17.default.readdir(dir);
32031
32004
  if (entries.length === 0 && dir !== UPLOADS_DIR) {
32032
- await import_promises16.default.rmdir(dir);
32005
+ await import_promises17.default.rmdir(dir);
32033
32006
  }
32034
32007
  } catch {
32035
32008
  }
@@ -32038,30 +32011,30 @@ var walkUploads = async (visit) => {
32038
32011
  const result = { deleted: 0, freedBytes: 0 };
32039
32012
  let wsDirs;
32040
32013
  try {
32041
- wsDirs = await import_promises16.default.readdir(UPLOADS_DIR);
32014
+ wsDirs = await import_promises17.default.readdir(UPLOADS_DIR);
32042
32015
  } catch {
32043
32016
  return result;
32044
32017
  }
32045
32018
  for (const ws of wsDirs) {
32046
- const wsPath = import_path21.default.join(UPLOADS_DIR, ws);
32019
+ const wsPath = import_path22.default.join(UPLOADS_DIR, ws);
32047
32020
  let tabDirs;
32048
32021
  try {
32049
- tabDirs = await import_promises16.default.readdir(wsPath);
32022
+ tabDirs = await import_promises17.default.readdir(wsPath);
32050
32023
  } catch {
32051
32024
  continue;
32052
32025
  }
32053
32026
  for (const tab of tabDirs) {
32054
- const tabPath = import_path21.default.join(wsPath, tab);
32027
+ const tabPath = import_path22.default.join(wsPath, tab);
32055
32028
  let files;
32056
32029
  try {
32057
- files = await import_promises16.default.readdir(tabPath);
32030
+ files = await import_promises17.default.readdir(tabPath);
32058
32031
  } catch {
32059
32032
  continue;
32060
32033
  }
32061
32034
  for (const file2 of files) {
32062
- const filePath = import_path21.default.join(tabPath, file2);
32035
+ const filePath = import_path22.default.join(tabPath, file2);
32063
32036
  try {
32064
- const stat = await import_promises16.default.stat(filePath);
32037
+ const stat = await import_promises17.default.stat(filePath);
32065
32038
  if (!stat.isFile()) continue;
32066
32039
  const removed = await visit(filePath, stat.mtimeMs, stat.size);
32067
32040
  if (removed) {
@@ -32094,7 +32067,7 @@ init_logger();
32094
32067
  // package.json
32095
32068
  var package_default = {
32096
32069
  name: "purplemux",
32097
- version: "0.1.21",
32070
+ version: "0.2.0",
32098
32071
  description: "Manage multiple Claude Code sessions from your browser",
32099
32072
  license: "MIT",
32100
32073
  author: "subicura",
@@ -32151,7 +32124,6 @@ var package_default = {
32151
32124
  "@dnd-kit/sortable": "^10.0.0",
32152
32125
  "@dnd-kit/utilities": "^3.2.2",
32153
32126
  "@tailwindcss/typography": "^0.5.19",
32154
- "@tanstack/react-virtual": "^3.13.23",
32155
32127
  "@xterm/addon-clipboard": "^0.2.0",
32156
32128
  "@xterm/addon-fit": "^0.11.0",
32157
32129
  "@xterm/addon-unicode11": "^0.9.0",
@@ -32161,7 +32133,7 @@ var package_default = {
32161
32133
  clsx: "^2.1.1",
32162
32134
  cmdk: "^1.1.1",
32163
32135
  dayjs: "^1.11.20",
32164
- diff: "^8.0.4",
32136
+ diff: "^9.0.0",
32165
32137
  diff2html: "^3.4.56",
32166
32138
  "electron-updater": "^6.8.3",
32167
32139
  "highlight.js": "^11.11.1",
@@ -32169,7 +32141,7 @@ var package_default = {
32169
32141
  "lucide-react": "^1.7.0",
32170
32142
  motion: "^12.38.0",
32171
32143
  nanoid: "^5.1.7",
32172
- next: "16.2.3",
32144
+ next: "16.2.4",
32173
32145
  "next-intl": "^4.9.1",
32174
32146
  "next-themes": "^0.4.6",
32175
32147
  "node-pty": "1.2.0-beta.12",
@@ -32181,7 +32153,7 @@ var package_default = {
32181
32153
  "react-hotkeys-hook": "^5.2.4",
32182
32154
  "react-icons": "^5.6.0",
32183
32155
  "react-markdown": "^10.1.0",
32184
- "react-resizable-panels": "^4.8.0",
32156
+ "react-resizable-panels": "^4.10.0",
32185
32157
  recharts: "^3.8.0",
32186
32158
  "rehype-highlight": "^7.0.2",
32187
32159
  "rehype-raw": "^7.0.0",
@@ -32236,7 +32208,7 @@ var package_default = {
32236
32208
 
32237
32209
  // server.ts
32238
32210
  if (!process.env.PURPLEMUX_CLI) process.env.PURPLEMUX_CLI = "1";
32239
- var log20 = createLogger("server");
32211
+ var log21 = createLogger("server");
32240
32212
  var dev = process.env.NODE_ENV !== "production";
32241
32213
  var verifyWebSocketAuth = async (request) => {
32242
32214
  const value = extractCookie(request.headers.cookie ?? "", SESSION_COOKIE);
@@ -32335,7 +32307,7 @@ var getFreePort = () => new Promise((resolve, reject) => {
32335
32307
  var listenWithFallback = (server, port, host) => new Promise((resolve, reject) => {
32336
32308
  const onError = (err) => {
32337
32309
  if (err.code === "EADDRINUSE") {
32338
- log20.warn(`Port ${port} is in use, finding an available port...`);
32310
+ log21.warn(`Port ${port} is in use, finding an available port...`);
32339
32311
  server.removeListener("error", onError);
32340
32312
  server.on("error", reject);
32341
32313
  server.listen(0, host, () => {
@@ -32434,7 +32406,7 @@ var startProd = async (port, appDir, bindHost) => {
32434
32406
  process.env.PORT = String(internalPort);
32435
32407
  process.env.HOSTNAME = "127.0.0.1";
32436
32408
  const standaloneDir = process.env.__PMUX_APP_DIR_UNPACKED || appDir;
32437
- const standalonePath = import_path22.default.join(standaloneDir, ".next", "standalone", "server.js");
32409
+ const standalonePath = import_path23.default.join(standaloneDir, ".next", "standalone", "server.js");
32438
32410
  require(standalonePath);
32439
32411
  process.env.PORT = savedPort;
32440
32412
  await waitForPort(internalPort);
@@ -32513,8 +32485,11 @@ var start = async (opts) => {
32513
32485
  const { workspaces } = await getWorkspaces();
32514
32486
  await writeAllClaudePromptFiles(workspaces);
32515
32487
  cleanupExpiredUploads().then((r) => {
32516
- if (r.deleted > 0) log20.info(`uploads cleanup: removed ${r.deleted} files (${r.freedBytes} bytes)`);
32517
- }).catch((err) => log20.warn(`uploads cleanup failed: ${err instanceof Error ? err.message : err}`));
32488
+ if (r.deleted > 0) log21.info(`uploads cleanup: removed ${r.deleted} files (${r.freedBytes} bytes)`);
32489
+ }).catch((err) => log21.warn(`uploads cleanup failed: ${err instanceof Error ? err.message : err}`));
32490
+ cleanupOrphanSessionStats().catch(
32491
+ (err) => log21.warn(`session-stats cleanup failed: ${err instanceof Error ? err.message : err}`)
32492
+ );
32518
32493
  const mode = dev ? "development" : process.env.NODE_ENV;
32519
32494
  const urls = listInterfaceIps(accessSpec, result.port);
32520
32495
  console.log("");