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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +77 -77
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/routes-manifest.json +13 -7
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00glsnv._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__05bsxq0._.js → [root-of-the-server]__00yjayf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01.~37j._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__03l15.f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__045vzzi._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04cr_m8._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ff8o47._.js → [root-of-the-server]__04o.cbq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05ij_ys._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07gfnob._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07xijrd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09gkm_6._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_.po82._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0auutl5._.js +5 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cjfc~l._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l~_wd0._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0m4quth._.js → [root-of-the-server]__0n61.a8._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ovn6yp._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qvunc5._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t1c-6w._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__09w77m2._.js → [root-of-the-server]__0t7wqt6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vi8p6v._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w3m-oz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11j9~6h._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xn_0ft._.js → [root-of-the-server]__12ksl6n._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12nr~pb._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0e8e4zn._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0isokfh._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_pages-api_00-t8sq.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_136edwc._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_layout-store_ts_0fanx7c._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_session-parser_ts_0~rhicw._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_status-manager_ts_003hlhy._.js +13 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0au.ssp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0_mc3i2._.js → _00ehnd~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0qejycp._.js → _00rrt71._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_06yggfn._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0kjoxb9._.js → _08h9ynz._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_08ytq3p._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0h~fc23._.js → _0_c~3id._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0-xx2s1._.js → _0_owbnq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0al4.z9._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0b~zgl1._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0quk21n._.js → _0dg4_bi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0qy269j._.js → _0gp1meg._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0iy5a-w._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0js4l3t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0fuovbm._.js → _0lnui2f._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0nkeoiw._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0qbbxeq._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_06.nllk._.js → _0rxhzwm._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0g258pg._.js → _0sfctwm._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0c0hpua._.js → _0ulmx3c._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0k9ybcl._.js → _0wlh.pc._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_11wj.a4._.js → _0y5jzd3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0z61aq-._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0lhf6qf._.js → _0~.theb._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0si9.17._.js → _11rnj4l._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{messages_127a4ox._.js → messages_046iw4z._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{messages_005j2ko._.js → messages_0zr0cc7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_de_notification_json_[json]_cjs_02k70lx._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_de_session_json_[json]_cjs_0b-1vpl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_de_settings_json_[json]_cjs_0ksu4_w._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_en_notification_json_[json]_cjs_0jqq879._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_en_session_json_[json]_cjs_0jaymfk._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_en_settings_json_[json]_cjs_0qwl-zt._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_es_notification_json_[json]_cjs_0q.i2xj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_es_session_json_[json]_cjs_0jy1144._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_es_settings_json_[json]_cjs_0ce_kv6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_fr_notification_json_[json]_cjs_0muj65q._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_fr_session_json_[json]_cjs_0rz0g.c._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_fr_settings_json_[json]_cjs_0h_6lba._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ja_notification_json_[json]_cjs_03v~p7j._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ja_session_json_[json]_cjs_0cos-uy._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ja_settings_json_[json]_cjs_0pg~fls._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ko_notification_json_[json]_cjs_0gx~jkl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ko_session_json_[json]_cjs_0x4saic._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ko_settings_json_[json]_cjs_07xpfc8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_notification_json_[json]_cjs_02mo05m._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_session_json_[json]_cjs_0-x8ftl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_settings_json_[json]_cjs_0frspzp._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ru_notification_json_[json]_cjs_03crije._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ru_session_json_[json]_cjs_0~2-kve._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ru_settings_json_[json]_cjs_08ex00.._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_tr_notification_json_[json]_cjs_0g.576s._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_tr_session_json_[json]_cjs_0zsvt_4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_tr_settings_json_[json]_cjs_0piu0da._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_notification_json_[json]_cjs_07v9on4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_session_json_[json]_cjs_134xza~._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_settings_json_[json]_cjs_0uazwgy._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_notification_json_[json]_cjs_0.ktzjy._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_session_json_[json]_cjs_0mv_~-8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_settings_json_[json]_cjs_09u0c5l._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_0cndrls._.js → node_modules_0kc8lix._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/src_05g_qd3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_10v_9d0._.js → src_components_0cflin8._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_04vn0dm._.js → src_components_0g.s~e7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_0gsv3ly._.js → src_components_0jrj_vu._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_0iq~ool._.js → src_components_0rs9yzr._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_components_features_mobile_mobile-terminal-page_tsx_02chzch._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_components_features_workspace_terminal-page_tsx_0wuq-jl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_use-browser-title_ts_0bw6.cb._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_use-workspace-store_ts_0h40e5c._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_lib_message-namespaces_ts_0wjpvu5._.js +3 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +77 -77
- package/.next/standalone/.next/server/pages/_app/build-manifest.json +7 -7
- package/.next/standalone/.next/server/pages/_app/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/_app.js +4 -4
- package/.next/standalone/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/_error/build-manifest.json +2 -2
- package/.next/standalone/.next/server/pages/_error/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/_error.js +2 -2
- package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/check-claude.js +1 -1
- package/.next/standalone/.next/server/pages/api/check-claude.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/result.js +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/result.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/send.js +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/send.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/status.js +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/status.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId].js +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId].js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs.js +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/workspaces.js +1 -1
- package/.next/standalone/.next/server/pages/api/cli/workspaces.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/git/branch.js +1 -1
- package/.next/standalone/.next/server/pages/api/git/branch.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/git/status.js +1 -1
- package/.next/standalone/.next/server/pages/api/git/status.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/cwd.js +1 -1
- package/.next/standalone/.next/server/pages/api/layout/cwd.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/diff.js +1 -1
- package/.next/standalone/.next/server/pages/api/layout/diff.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId]/move.js +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId]/move.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId].js +2 -2
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId].js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/order.js +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/order.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs.js +4 -4
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId].js +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId].js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane.js +1 -1
- package/.next/standalone/.next/server/pages/api/layout/pane.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout.js +1 -1
- package/.next/standalone/.next/server/pages/api/layout.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/message-history.js +1 -1
- package/.next/standalone/.next/server/pages/api/message-history.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/push/vapid-key.js +1 -1
- package/.next/standalone/.next/server/pages/api/push/vapid-key.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/daily-report/cache.js +1 -1
- package/.next/standalone/.next/server/pages/api/stats/daily-report/cache.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/daily-report/generate.js +1 -1
- package/.next/standalone/.next/server/pages/api/stats/daily-report/generate.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/daily-report/list.js +1 -1
- package/.next/standalone/.next/server/pages/api/stats/daily-report/list.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/projects.js +1 -1
- package/.next/standalone/.next/server/pages/api/stats/projects.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/sessions.js +1 -1
- package/.next/standalone/.next/server/pages/api/stats/sessions.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/uptime.js +1 -1
- package/.next/standalone/.next/server/pages/api/stats/uptime.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/status/hook.js +4 -4
- package/.next/standalone/.next/server/pages/api/status/hook.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/status/statusline.js +9 -1
- package/.next/standalone/.next/server/pages/api/status/statusline.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/system/tmux-sessions.js +1 -1
- package/.next/standalone/.next/server/pages/api/system/tmux-sessions.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/timeline/entries.js +1 -1
- package/.next/standalone/.next/server/pages/api/timeline/entries.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/timeline/message-counts/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/timeline/message-counts.js +5 -0
- package/.next/standalone/.next/server/pages/api/timeline/message-counts.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/timeline/message-counts.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/timeline/sessions.js +1 -1
- package/.next/standalone/.next/server/pages/api/timeline/sessions.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/capture.js +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/capture.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/info.js +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/info.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/permission-options.js +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/permission-options.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/plan-options.js +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/plan-options.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/recover-unknown.js +5 -5
- package/.next/standalone/.next/server/pages/api/tmux/recover-unknown.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/reset.js +3 -3
- package/.next/standalone/.next/server/pages/api/tmux/reset.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/send-input.js +1 -1
- package/.next/standalone/.next/server/pages/api/tmux/send-input.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/[workspaceId].js +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/[workspaceId].js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/active.js +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/active.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/reorder.js +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/reorder.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/validate.js +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/validate.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace.js +4 -4
- package/.next/standalone/.next/server/pages/api/workspace.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/de/404.html +1 -1
- package/.next/standalone/.next/server/pages/de/500.html +1 -1
- package/.next/standalone/.next/server/pages/en/404.html +1 -1
- package/.next/standalone/.next/server/pages/en/500.html +1 -1
- package/.next/standalone/.next/server/pages/es/404.html +1 -1
- package/.next/standalone/.next/server/pages/es/500.html +1 -1
- package/.next/standalone/.next/server/pages/fr/404.html +1 -1
- package/.next/standalone/.next/server/pages/fr/500.html +1 -1
- package/.next/standalone/.next/server/pages/index/build-manifest.json +12 -12
- package/.next/standalone/.next/server/pages/index/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/index/react-loadable-manifest.json +6 -6
- package/.next/standalone/.next/server/pages/index.js +13 -13
- package/.next/standalone/.next/server/pages/index.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/ja/404.html +1 -1
- package/.next/standalone/.next/server/pages/ja/500.html +1 -1
- package/.next/standalone/.next/server/pages/ko/404.html +1 -1
- package/.next/standalone/.next/server/pages/ko/500.html +1 -1
- package/.next/standalone/.next/server/pages/login/build-manifest.json +10 -10
- package/.next/standalone/.next/server/pages/login/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/login.js +2 -2
- package/.next/standalone/.next/server/pages/login.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/pt-BR/404.html +1 -1
- package/.next/standalone/.next/server/pages/pt-BR/500.html +1 -1
- package/.next/standalone/.next/server/pages/reports/build-manifest.json +16 -16
- package/.next/standalone/.next/server/pages/reports/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/reports.js +9 -9
- package/.next/standalone/.next/server/pages/reports.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/reset/build-manifest.json +2 -2
- package/.next/standalone/.next/server/pages/reset/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/reset.js +3 -3
- package/.next/standalone/.next/server/pages/reset.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/ru/404.html +1 -1
- package/.next/standalone/.next/server/pages/ru/500.html +1 -1
- package/.next/standalone/.next/server/pages/stats/build-manifest.json +13 -13
- package/.next/standalone/.next/server/pages/stats/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/stats/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/stats.js +6 -6
- package/.next/standalone/.next/server/pages/stats.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/tools-required/build-manifest.json +2 -2
- package/.next/standalone/.next/server/pages/tools-required/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/tools-required.js +3 -3
- package/.next/standalone/.next/server/pages/tools-required.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/tr/404.html +1 -1
- package/.next/standalone/.next/server/pages/tr/500.html +1 -1
- package/.next/standalone/.next/server/pages/webview/build-manifest.json +10 -10
- package/.next/standalone/.next/server/pages/webview/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/webview.js +10 -10
- package/.next/standalone/.next/server/pages/webview.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/zh-CN/404.html +1 -1
- package/.next/standalone/.next/server/pages/zh-CN/500.html +1 -1
- package/.next/standalone/.next/server/pages/zh-TW/404.html +1 -1
- package/.next/standalone/.next/server/pages/zh-TW/500.html +1 -1
- package/.next/standalone/.next/server/pages-manifest.json +1 -0
- package/.next/standalone/.next/static/{dcByQy16pcz2rzj9snwtK → WXAyTQ0PHZnxXXCwEZpit}/_buildManifest.js +9 -8
- package/.next/standalone/.next/static/chunks/0-97ruc25d2lz.js +1 -0
- package/.next/standalone/.next/static/chunks/{17e9_m-u1zvfx.js → 0-xrsiia9hc.c.js} +1 -1
- package/.next/standalone/.next/static/chunks/{135rnnu.-sh80.js → 0.ecwkadp7-hq.js} +1 -1
- package/.next/standalone/.next/static/chunks/00nx1s6rpu537.js +1 -0
- package/.next/standalone/.next/static/chunks/{0nin7ftvq8x5c.js → 00ziyk306y55s.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0kebzqtn4norb.js → 01-fb9rb-21.a.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0dthloew7zc8k.js → 010m3dplwy4n6.js} +16 -16
- package/.next/standalone/.next/static/chunks/{0_7qn_xpf-6l~.js → 02mfn213kze9c.js} +2 -2
- package/.next/standalone/.next/static/chunks/02r-a1_lz7fuk.js +1 -0
- package/.next/standalone/.next/static/chunks/04bbxzycy0y90.js +1 -0
- package/.next/standalone/.next/static/chunks/{0y--b123-dayk.js → 04cl8pvql07vz.js} +1 -1
- package/.next/standalone/.next/static/chunks/{15wkoi26~8omr.js → 04f25y8yc8j00.js} +1 -1
- package/.next/standalone/.next/static/chunks/{02.xbkqbezb~v.js → 04uzwc8c9u49~.js} +1 -1
- package/.next/standalone/.next/static/chunks/05oh32ya2uzfq.js +1 -0
- package/.next/standalone/.next/static/chunks/06e51nokt~dtt.js +1 -0
- package/.next/standalone/.next/static/chunks/06ypydsl._u~2.js +5 -0
- package/.next/standalone/.next/static/chunks/07-xm--o034du.js +1 -0
- package/.next/standalone/.next/static/chunks/071neb1eikeoh.js +1 -0
- package/.next/standalone/.next/static/chunks/07i6~xrmgspp8.js +1 -0
- package/.next/standalone/.next/static/chunks/{0i7zwsw_~llk0.js → 07v3udp2qhc02.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0kox55ju9c.e4.js → 088o~nd5em_1d.js} +1 -1
- package/.next/standalone/.next/static/chunks/{10_1w.i.mluxp.js → 08xz_z9u4ex9t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{02119z8xemosp.js → 08yjqhf82rx~h.js} +1 -1
- package/.next/standalone/.next/static/chunks/095e2xf3z6x3g.js +23 -0
- package/.next/standalone/.next/static/chunks/{040hwmh16ihpj.js → 09agwg~-xbxbs.js} +1 -1
- package/.next/standalone/.next/static/chunks/09tinkgkd8br_.js +1 -0
- package/.next/standalone/.next/static/chunks/09vjzvj4~rwbf.js +1 -0
- package/.next/standalone/.next/static/chunks/{0puhant9cy0xw.js → 0__ve3txz-02p.js} +1 -1
- package/.next/standalone/.next/static/chunks/0a1hi9y0lwv3j.js +1 -0
- package/.next/standalone/.next/static/chunks/{0fzb0m-2k2x14.js → 0bzbaprexb9od.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ggsfsmm~hj5t.js → 0cfpdp0_-.4aj.js} +1 -1
- package/.next/standalone/.next/static/chunks/0chjvj73yfmoj.js +1 -0
- package/.next/standalone/.next/static/chunks/{0yi.kp2rt4-nc.js → 0ea-k_kbq5gi1.js} +1 -1
- package/.next/standalone/.next/static/chunks/{082eokcz_e-4q.js → 0f81tdf_8utww.js} +1 -1
- package/.next/standalone/.next/static/chunks/{14ajlpt1s6ueh.js → 0ff6a07hvp4pu.js} +2 -2
- package/.next/standalone/.next/static/chunks/{105.cpxealiud.js → 0fotmrplo6yc7.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0h_vfy~qxk1_6.js → 0h-7ntqpip4oi.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0wvyw8fxpnmre.js → 0h~_fdj60t_~l.js} +1 -1
- package/.next/standalone/.next/static/chunks/{04_s.sj1oagqr.js → 0i2uqmry6cyl_.js} +1 -1
- package/.next/standalone/.next/static/chunks/0if5fmp94~nc2.js +12 -0
- package/.next/standalone/.next/static/chunks/{1235zq5em7nh2.js → 0iw7xjsfo1v-u.js} +10 -10
- package/.next/standalone/.next/static/chunks/0jxk8j~j30thp.js +1 -0
- package/.next/standalone/.next/static/chunks/{0_eof.53ko6d_.js → 0lz-p_awksh5e.js} +1 -1
- package/.next/standalone/.next/static/chunks/0m_amua611xl0.js +5 -0
- package/.next/standalone/.next/static/chunks/0nyar-7g9rya6.js +1 -0
- package/.next/standalone/.next/static/chunks/0o6esya.vhm1..js +1 -0
- package/.next/standalone/.next/static/chunks/0oxlivdn8c89b.js +1 -0
- package/.next/standalone/.next/static/chunks/{0iiahbpxxksju.js → 0p1vmcv-mlsg5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{14067kbmixmm6.js → 0pw-284q1gfk3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0turlr93lvkg8.js → 0t0-4sn-nqqld.js} +1 -1
- package/.next/standalone/.next/static/chunks/{09jl7_l-yth-3.js → 0t76mt4_ijxw7.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0_nr91n2-npr6.js → 0u-1zto-umjh9.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0x4khblf0c7-p.js → 0u9~wuf2zbs5z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0krb2wvo2_ipb.js → 0unvbz84l4g9h.js} +1 -1
- package/.next/standalone/.next/static/chunks/{12up4kbv36k4r.js → 0w52yh2srwcs0.js} +2 -2
- package/.next/standalone/.next/static/chunks/{0ml0ppx6kwe2_.js → 0w9~wt6~_cxhf.js} +1 -1
- package/.next/standalone/.next/static/chunks/0wp13r5su.j3e.js +1 -0
- package/.next/standalone/.next/static/chunks/{0e~.6y_x93o06.js → 0y3fmkya..f_6.js} +13 -13
- package/.next/standalone/.next/static/chunks/0~ei.a78nuwqe.js +1 -0
- package/.next/standalone/.next/static/chunks/{0hqhf5soi_25r.js → 0~lnp45fxxtgz.js} +1 -1
- package/.next/standalone/.next/static/chunks/0~nlz9.lltzrz.js +1 -0
- package/.next/standalone/.next/static/chunks/10bvbbw1062os.js +1 -0
- package/.next/standalone/.next/static/chunks/{01sxhicgu6p69.js → 11ess6mn2988z.js} +10 -10
- package/.next/standalone/.next/static/chunks/11gch78bg_qsn.js +1 -0
- package/.next/standalone/.next/static/chunks/{0zzlz_qu90xvc.js → 11nk1lwom62oe.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0sj1hijbxwqzi.js → 131tx--pi8.tm.js} +1 -1
- package/.next/standalone/.next/static/chunks/13zzmkwag6vsm.css +1 -0
- package/.next/standalone/.next/static/chunks/13~7v30_nnqks.js +1 -0
- package/.next/standalone/.next/static/chunks/{0arxgyek93av0.js → 17deooyefr~9o.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0jhs9_arn872p.js → 17e2iymrk7eoa.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0kima6zc7cl2p.js → 17et6y09q052u.js} +1 -1
- package/.next/standalone/.next/static/chunks/17jcucuef_33-.js +1 -0
- package/.next/standalone/.next/static/chunks/{turbopack-11cbtg95iwob2.js → turbopack-0-itu0o9y_vq8.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0t_pmdbcbax~k.js → turbopack-0.28.d-q12n3p.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0tl7oxj3760qz.js → turbopack-0.4ipr_kch~.s.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-02re16zyko_-d.js → turbopack-0g80nrinbfgtk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-03ch5ephon-wk.js → turbopack-0h0~tr4tgq3aa.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0k.5aa0_xv2hq.js → turbopack-0hwi_g-tegs_u.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0au9jjcv_8-gl.js → turbopack-0np.oib7-.1fp.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-02yx2w1m.5ub9.js → turbopack-0qmx66h203l93.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0vqdj~g~ggw3x.js → turbopack-11utvoktq4lmr.js} +1 -1
- package/.next/standalone/messages/de/notification.json +3 -1
- package/.next/standalone/messages/de/session.json +5 -2
- package/.next/standalone/messages/de/settings.json +22 -1
- package/.next/standalone/messages/en/notification.json +3 -1
- package/.next/standalone/messages/en/session.json +5 -2
- package/.next/standalone/messages/en/settings.json +20 -1
- package/.next/standalone/messages/es/notification.json +3 -1
- package/.next/standalone/messages/es/session.json +5 -2
- package/.next/standalone/messages/es/settings.json +22 -1
- package/.next/standalone/messages/fr/notification.json +3 -1
- package/.next/standalone/messages/fr/session.json +5 -2
- package/.next/standalone/messages/fr/settings.json +22 -1
- package/.next/standalone/messages/ja/notification.json +3 -1
- package/.next/standalone/messages/ja/session.json +5 -2
- package/.next/standalone/messages/ja/settings.json +22 -1
- package/.next/standalone/messages/ko/notification.json +3 -1
- package/.next/standalone/messages/ko/session.json +5 -2
- package/.next/standalone/messages/ko/settings.json +20 -1
- package/.next/standalone/messages/pt-BR/notification.json +3 -1
- package/.next/standalone/messages/pt-BR/session.json +5 -2
- package/.next/standalone/messages/pt-BR/settings.json +22 -1
- package/.next/standalone/messages/ru/notification.json +3 -1
- package/.next/standalone/messages/ru/session.json +5 -2
- package/.next/standalone/messages/ru/settings.json +22 -1
- package/.next/standalone/messages/tr/notification.json +3 -1
- package/.next/standalone/messages/tr/session.json +5 -2
- package/.next/standalone/messages/tr/settings.json +22 -1
- package/.next/standalone/messages/zh-CN/notification.json +3 -1
- package/.next/standalone/messages/zh-CN/session.json +5 -2
- package/.next/standalone/messages/zh-CN/settings.json +22 -1
- package/.next/standalone/messages/zh-TW/notification.json +3 -1
- package/.next/standalone/messages/zh-TW/session.json +5 -2
- package/.next/standalone/messages/zh-TW/settings.json +22 -1
- package/.next/standalone/package.json +4 -5
- package/.next/standalone/server.js +1 -1
- package/dist/server.js +219 -244
- package/package.json +4 -5
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__019s3sg._.js +0 -15
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02d5mfa._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__050uepg._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__093j355._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cy9s8s._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dn3vc8._.js +0 -5
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g99747._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ge7g~x._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iqf2xr._.js +0 -15
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ky2xd.._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l806ne._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0mm5n3z._.js +0 -15
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0psi612._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qtw~r6._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ysyw3z._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~7f-os._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10b7n-k._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-e2yqy._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vwkkwh._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0mu2snc._.js +0 -3
- package/.next/standalone/.next/static/chunks/0.me5n9dvrgga.js +0 -1
- package/.next/standalone/.next/static/chunks/04u8dbn0ogxqm.js +0 -5
- package/.next/standalone/.next/static/chunks/0617badw.sq7c.js +0 -1
- package/.next/standalone/.next/static/chunks/06ik0y0xz_pxd.js +0 -5
- package/.next/standalone/.next/static/chunks/06~0v3h-9qr-b.js +0 -1
- package/.next/standalone/.next/static/chunks/0_iwf7xd96dhg.js +0 -1
- package/.next/standalone/.next/static/chunks/0b.80wy8lilvw.js +0 -1
- package/.next/standalone/.next/static/chunks/0c9nugbfmzaq4.js +0 -23
- package/.next/standalone/.next/static/chunks/0da0otp~vxk80.js +0 -1
- package/.next/standalone/.next/static/chunks/0diujbo1qkcle.css +0 -1
- package/.next/standalone/.next/static/chunks/0ep6reedai0y6.js +0 -1
- package/.next/standalone/.next/static/chunks/0f6dlhth6ll0c.js +0 -12
- package/.next/standalone/.next/static/chunks/0j.bb896cs98k.js +0 -1
- package/.next/standalone/.next/static/chunks/0j630d8~~4rbz.js +0 -1
- package/.next/standalone/.next/static/chunks/0k7kp5g9etss9.js +0 -1
- package/.next/standalone/.next/static/chunks/0ng68zj-fjm.w.js +0 -1
- package/.next/standalone/.next/static/chunks/0nsq-sayv38ks.js +0 -1
- package/.next/standalone/.next/static/chunks/0nvalz7iwy6qc.js +0 -1
- package/.next/standalone/.next/static/chunks/0rr7vbxqscvhw.js +0 -1
- package/.next/standalone/.next/static/chunks/0s66~z6yys6zz.js +0 -1
- package/.next/standalone/.next/static/chunks/0s8imclb5deef.js +0 -1
- package/.next/standalone/.next/static/chunks/0u7flh--27u75.js +0 -1
- package/.next/standalone/.next/static/chunks/0vrlsk_eqnj7q.js +0 -1
- package/.next/standalone/.next/static/chunks/0vw93vbkgsb1a.js +0 -1
- package/.next/standalone/.next/static/chunks/12i5z~h-3ys7k.js +0 -1
- package/.next/standalone/.next/static/chunks/171khl108g-m8.js +0 -1
- package/.next/standalone/.next/static/chunks/17fzeqm4m_x67.js +0 -1
- /package/.next/standalone/.next/static/{dcByQy16pcz2rzj9snwtK → WXAyTQ0PHZnxXXCwEZpit}/_clientMiddlewareManifest.js +0 -0
- /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,
|
|
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:
|
|
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 = (
|
|
4771
|
-
if (
|
|
4772
|
-
const cleaned =
|
|
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] ||
|
|
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
|
|
4789
|
-
if (SHELL_NAMES.has(cmd)) return extractBasename(
|
|
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
|
|
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(
|
|
7815
|
-
this.path =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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,
|
|
15167
|
-
if (!
|
|
15166
|
+
function getElementAtPath(obj, path24) {
|
|
15167
|
+
if (!path24)
|
|
15168
15168
|
return obj;
|
|
15169
|
-
return
|
|
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(
|
|
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(
|
|
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,
|
|
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 = [...
|
|
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
|
|
15782
|
-
for (const seg of
|
|
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
|
|
27760
|
-
if (
|
|
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 (
|
|
27765
|
-
const key =
|
|
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
|
|
29003
|
-
var
|
|
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/
|
|
30636
|
-
var
|
|
30637
|
-
|
|
30638
|
-
|
|
30639
|
-
|
|
30640
|
-
|
|
30641
|
-
|
|
30642
|
-
|
|
30643
|
-
|
|
30644
|
-
|
|
30645
|
-
|
|
30646
|
-
|
|
30647
|
-
|
|
30648
|
-
|
|
30649
|
-
|
|
30650
|
-
|
|
30651
|
-
|
|
30652
|
-
|
|
30653
|
-
|
|
30654
|
-
|
|
30655
|
-
|
|
30656
|
-
|
|
30657
|
-
|
|
30658
|
-
}
|
|
30659
|
-
|
|
30660
|
-
|
|
30661
|
-
|
|
30662
|
-
|
|
30663
|
-
};
|
|
30664
|
-
|
|
30665
|
-
|
|
30666
|
-
|
|
30667
|
-
|
|
30668
|
-
|
|
30669
|
-
|
|
30670
|
-
|
|
30671
|
-
|
|
30672
|
-
|
|
30673
|
-
|
|
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
|
|
30706
|
+
var import_path19 = __toESM(require("path"));
|
|
30678
30707
|
|
|
30679
30708
|
// src/lib/path-validation.ts
|
|
30680
|
-
var
|
|
30681
|
-
var
|
|
30682
|
-
var CLAUDE_PROJECTS_DIR =
|
|
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 =
|
|
30685
|
-
return resolved.startsWith(CLAUDE_PROJECTS_DIR +
|
|
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
|
|
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
|
|
30711
|
-
|
|
30712
|
-
|
|
30713
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
30915
|
-
|
|
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
|
-
|
|
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,
|
|
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:
|
|
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 =
|
|
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,
|
|
31091
|
+
dirWatcher = (0, import_fs5.watch)(projectDir, (_event, filename) => {
|
|
31119
31092
|
if (stopped) return;
|
|
31120
|
-
if (filename === jsonlFilename && (0,
|
|
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,
|
|
31102
|
+
if ((0, import_fs6.existsSync)(expectedJsonlPath)) {
|
|
31130
31103
|
onJsonlFound();
|
|
31131
31104
|
return;
|
|
31132
31105
|
}
|
|
31133
|
-
if ((0,
|
|
31106
|
+
if ((0, import_fs6.existsSync)(projectDir)) {
|
|
31134
31107
|
watchProjectDir();
|
|
31135
|
-
if (!stopped && (0,
|
|
31108
|
+
if (!stopped && (0, import_fs6.existsSync)(expectedJsonlPath)) {
|
|
31136
31109
|
onJsonlFound();
|
|
31137
31110
|
}
|
|
31138
31111
|
} else {
|
|
31139
|
-
const projectsDir =
|
|
31140
|
-
const projectDirName =
|
|
31112
|
+
const projectsDir = import_path19.default.dirname(projectDir);
|
|
31113
|
+
const projectDirName = import_path19.default.basename(projectDir);
|
|
31141
31114
|
try {
|
|
31142
|
-
(0,
|
|
31143
|
-
parentWatcher = (0,
|
|
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,
|
|
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,
|
|
31123
|
+
if ((0, import_fs6.existsSync)(expectedJsonlPath)) {
|
|
31151
31124
|
onJsonlFound();
|
|
31152
31125
|
} else {
|
|
31153
31126
|
watchProjectDir();
|
|
31154
|
-
if (!stopped && (0,
|
|
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 =
|
|
31191
|
-
return (0,
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
31555
|
-
var
|
|
31556
|
-
var
|
|
31557
|
-
var TOKEN_FILE =
|
|
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 =
|
|
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
|
-
|
|
31570
|
-
|
|
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
|
|
31589
|
-
var
|
|
31590
|
-
var
|
|
31591
|
-
var
|
|
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
|
|
31595
|
-
var BASE_DIR9 =
|
|
31596
|
-
var LOCK_FILE =
|
|
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
|
|
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
|
|
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
|
|
31618
|
+
await import_promises16.default.unlink(LOCK_FILE);
|
|
31646
31619
|
} catch {
|
|
31647
31620
|
}
|
|
31648
31621
|
};
|
|
31649
31622
|
var acquireLock = async (port) => {
|
|
31650
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31647
|
+
log18.debug("Lock already held by this process");
|
|
31675
31648
|
return;
|
|
31676
31649
|
}
|
|
31677
31650
|
if (!isPidAlive(existing.pid)) {
|
|
31678
|
-
|
|
31651
|
+
log18.warn(`Stale lock found (pid=${existing.pid} is dead), reclaiming`);
|
|
31679
31652
|
await removeStaleLock();
|
|
31680
31653
|
await writeLockData(data);
|
|
31681
|
-
|
|
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
|
-
|
|
31662
|
+
log18.warn(`PID ${existing.pid} is alive but not purplemux, reclaiming lock`);
|
|
31690
31663
|
await removeStaleLock();
|
|
31691
31664
|
await writeLockData(data);
|
|
31692
|
-
|
|
31665
|
+
log18.debug(`Lock acquired (pid=${process.pid})`);
|
|
31693
31666
|
};
|
|
31694
31667
|
var releaseLock = () => {
|
|
31695
31668
|
try {
|
|
31696
|
-
const raw =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
31723
|
+
log19.debug(`Claude already running, skip: ${target.tmuxSession}`);
|
|
31751
31724
|
return true;
|
|
31752
31725
|
}
|
|
31753
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31755
|
+
log19.debug(`${targets.length} surface(s) auto-resume started`);
|
|
31783
31756
|
executeAutoResume(targets).then(() => {
|
|
31784
|
-
|
|
31757
|
+
log19.debug("Auto-resume complete");
|
|
31785
31758
|
}).catch((err) => {
|
|
31786
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
32012
|
-
var
|
|
32013
|
-
var
|
|
32014
|
-
var BASE_DIR10 =
|
|
32015
|
-
var UPLOADS_DIR =
|
|
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
|
|
32022
|
-
await
|
|
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
|
|
32003
|
+
const entries = await import_promises17.default.readdir(dir);
|
|
32031
32004
|
if (entries.length === 0 && dir !== UPLOADS_DIR) {
|
|
32032
|
-
await
|
|
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
|
|
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 =
|
|
32019
|
+
const wsPath = import_path22.default.join(UPLOADS_DIR, ws);
|
|
32047
32020
|
let tabDirs;
|
|
32048
32021
|
try {
|
|
32049
|
-
tabDirs = await
|
|
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 =
|
|
32027
|
+
const tabPath = import_path22.default.join(wsPath, tab);
|
|
32055
32028
|
let files;
|
|
32056
32029
|
try {
|
|
32057
|
-
files = await
|
|
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 =
|
|
32035
|
+
const filePath = import_path22.default.join(tabPath, file2);
|
|
32063
32036
|
try {
|
|
32064
|
-
const stat = await
|
|
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.
|
|
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: "^
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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)
|
|
32517
|
-
}).catch((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("");
|