purplemux 0.2.2 → 0.2.4
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 +99 -94
- 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 +91 -7
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__014kwh_._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0t1c-6w._.js → [root-of-the-server]__016s4a9._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02v.lnb._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05ij_ys._.js +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0cjfc~l._.js → [root-of-the-server]__06h3gzy._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08tdlcm._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ar~lbk._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0auutl5._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bo-su1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bocpgx._.js +30 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c-bb5d._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dt2efu._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i-jyh3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i1m1v9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ihlt6s._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kd7wei._.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]__04o.cbq._.js → [root-of-the-server]__0m99ffd._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0mky_tj._.js +35 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oiiu_o._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oqgn2h._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0hzysmw._.js → [root-of-the-server]__0q8lffz._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rhb4gk._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vjtjtc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w0wz~a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x_e0yw._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0t7wqt6._.js → [root-of-the-server]__10h2vlr._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11iyaqz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11xw16l._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00yjayf._.js → [root-of-the-server]__121-6-e._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12ksl6n._.js +2 -2
- package/.next/standalone/.next/server/chunks/{_0out7wm._.js → _0-mgr1c._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0.5a4bu._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_134uyu_._.js → _03-duro._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_05-8rnc._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0ap4fy.._.js → _07097f~._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0st-_d~._.js → _0jzxge9._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0uo_gs5._.js → _0ll-5~7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0mhomq~._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0.hbe-v._.js → _0pk0hms._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0qm27ix._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0su2osz._.js → _0v81st0._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0vgpyhz._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_1368r9s._.js → _0w0qjyh._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0wok5xu._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0tumyht._.js → _0wu6uxd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_04dq3gt._.js → _0z7d6.z._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0c63jma._.js → _0zf5mig._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0mnwbyo._.js → _0~~9-pj._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{src_lib_0vs5asg._.js → src_lib_0p.xsqi._.js} +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_layout-store_ts_0fanx7c._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_workspace-store_ts_0vqt073._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ap_bxo._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0hwcydd._.js → [root-of-the-server]__0grkevn._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t9ru13._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0-9ezhb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_003~2_g._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_00zsk6a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_00rrt71._.js → _016o9_-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_01eupc5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0y5jzd3._.js → _020f2r.._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0_c~3id._.js → _02jzd5g._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_08h9ynz._.js → _058y~nz._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_05bq96_._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0_sz4y0._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0a64og5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_00ehnd~._.js → _0c1yivm._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0ccg0_z._.js +18 -0
- package/.next/standalone/.next/server/chunks/ssr/_0egedv6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0fnzfs-._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0fota2a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0rxhzwm._.js → _0ftinmo._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0h4kenr._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0hat6~g._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0hp8_ck._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0hq29bt._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0ihbr8k._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0mltzed._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0nbe6mv._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0nvs1~o._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0o8h1fd._.js +18 -0
- package/.next/standalone/.next/server/chunks/ssr/_0pg-q18._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0w.1ts8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0w1phzp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0w6jc9p._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0lnui2f._.js → _0~hz1fq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_11v_6.6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1289s74._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{messages_046iw4z._.js → messages_02eoowy._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{messages_0zr0cc7._.js → messages_0hmq5dp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_de_diff_json_[json]_cjs_0w6blyy._.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_de_sidebar_json_[json]_cjs_0loc-1-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_de_webBrowser_json_[json]_cjs_0wfz-ul._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_de_workspace_json_[json]_cjs_0g7nkdq._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_en_diff_json_[json]_cjs_0z34_dc._.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_en_sidebar_json_[json]_cjs_0un0e3f._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_en_webBrowser_json_[json]_cjs_0oirdko._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_en_workspace_json_[json]_cjs_0m9rzyy._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_es_diff_json_[json]_cjs_0kheix4._.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_es_sidebar_json_[json]_cjs_080u46~._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_es_webBrowser_json_[json]_cjs_0w_no_c._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_es_workspace_json_[json]_cjs_0xf0_50._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_fr_diff_json_[json]_cjs_11vxoy5._.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_fr_sidebar_json_[json]_cjs_05y8v8h._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_fr_webBrowser_json_[json]_cjs_00tbjsf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_fr_workspace_json_[json]_cjs_0h88f-g._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ja_diff_json_[json]_cjs_0t~9dro._.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_ja_sidebar_json_[json]_cjs_0i0x8w9._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ja_webBrowser_json_[json]_cjs_0tp7~.s._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ja_workspace_json_[json]_cjs_03dlzmi._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ko_diff_json_[json]_cjs_0cw7xj1._.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_ko_sidebar_json_[json]_cjs_0mql5dv._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ko_webBrowser_json_[json]_cjs_0ibtysu._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ko_workspace_json_[json]_cjs_0frxg.r._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_diff_json_[json]_cjs_0vc-p7n._.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_pt-BR_sidebar_json_[json]_cjs_07h4b1q._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_webBrowser_json_[json]_cjs_0eu9fbw._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_pt-BR_workspace_json_[json]_cjs_0lahru2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ru_diff_json_[json]_cjs_07na~n8._.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_ru_sidebar_json_[json]_cjs_0aksrjo._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ru_webBrowser_json_[json]_cjs_113-x8n._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_ru_workspace_json_[json]_cjs_0wm5nhc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_tr_diff_json_[json]_cjs_0a00gr_._.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_tr_sidebar_json_[json]_cjs_0yj47nu._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_tr_webBrowser_json_[json]_cjs_12ziott._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_tr_workspace_json_[json]_cjs_0wygfyf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_diff_json_[json]_cjs_0b01x_1._.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-CN_sidebar_json_[json]_cjs_0yzmolg._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_webBrowser_json_[json]_cjs_0e5lp-q._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-CN_workspace_json_[json]_cjs_0h3v0-e._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_diff_json_[json]_cjs_088r89k._.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/messages_zh-TW_sidebar_json_[json]_cjs_0pnu~0h._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_webBrowser_json_[json]_cjs_0u_cpuv._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/messages_zh-TW_workspace_json_[json]_cjs_0ymw5wz._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_02oar3h._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0_2gaq0._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0bbmd88._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0ydhwnx._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1294wzs._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@base-ui_030gj7p._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@base-ui_04tdvwp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@base-ui_0bdox2f._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{src_components_0rs9yzr._.js → src_components_0_aiven._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_0cflin8._.js → src_components_0geizrr._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_0g.s~e7._.js → src_components_11_1i~k._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_components_0jrj_vu._.js → src_components_12mrirb._.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_components_ui_input_tsx_0pgha5u._.js +3 -0
- 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_workspace-store_ts_00x-rec._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +99 -94
- package/.next/standalone/.next/server/pages/_app/build-manifest.json +7 -6
- 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/_document.js +3 -3
- package/.next/standalone/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/_error.js +4 -4
- package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/auth/preflight.js +1 -1
- package/.next/standalone/.next/server/pages/api/auth/preflight.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/console/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/console.js +8 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/console.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/console.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/eval/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/eval.js +8 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/eval.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/eval.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/network/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/network.js +8 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/network.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/network.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/screenshot/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/screenshot.js +8 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/screenshot.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/screenshot.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/url/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/url.js +8 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/url.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/browser/url.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/cli/tabs/[tabId]/result.js +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- 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/sync/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/git/sync.js +5 -0
- package/.next/standalone/.next/server/pages/api/git/sync.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/git/sync.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/layout/commit-diff/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/layout/commit-diff.js +5 -0
- package/.next/standalone/.next/server/pages/api/layout/commit-diff.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/layout/commit-diff.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/layout/file-content/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/layout/file-content.js +5 -0
- package/.next/standalone/.next/server/pages/api/layout/file-content.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/layout/file-content.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/layout/git-log/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/layout/git-log.js +5 -0
- package/.next/standalone/.next/server/pages/api/layout/git-log.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/layout/git-log.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/layout/pane/[paneId]/tabs/[tabId]/move.js +2 -2
- 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 +3 -3
- 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 +2 -2
- 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 +3 -3
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/pages/api/layout/pane.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/layout.js +2 -2
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/pages/api/stats/projects.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/sessions.js +2 -2
- package/.next/standalone/.next/server/pages/api/stats/sessions.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/stats/uptime.js +2 -2
- package/.next/standalone/.next/server/pages/api/stats/uptime.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/status/hook.js +3 -3
- package/.next/standalone/.next/server/pages/api/status/hook.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/status/statusline.js +5 -5
- package/.next/standalone/.next/server/pages/api/status/statusline.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/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/workspace/[workspaceId].js +2 -2
- package/.next/standalone/.next/server/pages/api/workspace/[workspaceId].js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/active.js +2 -2
- package/.next/standalone/.next/server/pages/api/workspace/active.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/group/[groupId]/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/[groupId].js +8 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/[groupId].js.map +5 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/[groupId].js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/reorder/pages-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/reorder.js +8 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/reorder.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/workspace/group/reorder.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/workspace/group.js +8 -0
- package/.next/standalone/.next/server/pages/api/workspace/group.js.map +5 -0
- package/.next/standalone/.next/server/pages/api/workspace/group.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/api/workspace/reorder.js +2 -2
- package/.next/standalone/.next/server/pages/api/workspace/reorder.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/api/workspace/validate.js +2 -2
- 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 +17 -16
- package/.next/standalone/.next/server/pages/index/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/index/react-loadable-manifest.json +7 -7
- package/.next/standalone/.next/server/pages/index.js +20 -19
- 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 +11 -11
- package/.next/standalone/.next/server/pages/login/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/login.js +12 -11
- 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 +19 -18
- package/.next/standalone/.next/server/pages/reports/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/reports/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/reports.js +18 -17
- package/.next/standalone/.next/server/pages/reports.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/reset.js +5 -5
- 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 +17 -16
- 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 +19 -18
- package/.next/standalone/.next/server/pages/stats.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/tools-required/build-manifest.json +7 -7
- package/.next/standalone/.next/server/pages/tools-required/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/tools-required.js +8 -7
- 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 +18 -17
- package/.next/standalone/.next/server/pages/webview/client-build-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/webview/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/webview.js +19 -18
- 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 +12 -0
- package/.next/standalone/.next/static/{5mb_D_gy6E3wsT_BhuXDS → CjJlqsAWYyyu76AJtHaqt}/_buildManifest.js +18 -6
- package/.next/standalone/.next/static/chunks/{0w1ldes9u.mhe.js → 0-8v00lvs9_s0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0oy5nvsojxb2i.js → 0-rskn1p_p.qb.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0h7n~i8gk~-a2.js → 0.4j~sc70rsrv.js} +1 -1
- package/.next/standalone/.next/static/chunks/0._2l5v1hwkfn.js +24 -0
- package/.next/standalone/.next/static/chunks/{0g0xm7shj062y.js → 001_h.~thz3j3.js} +1 -1
- package/.next/standalone/.next/static/chunks/00ljvc.i_9p~6.js +1 -0
- package/.next/standalone/.next/static/chunks/00s78xqkxglkv.js +1 -0
- package/.next/standalone/.next/static/chunks/01raz3nv-e~~d.js +1 -0
- package/.next/standalone/.next/static/chunks/024gkwka6p59k.js +1 -0
- package/.next/standalone/.next/static/chunks/02ncyh-v8g~cs.css +1 -0
- package/.next/standalone/.next/static/chunks/{0312riii_sl_1.js → 02o84r01jsc.z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0.ecwkadp7-hq.js → 034_utxy1sujb.js} +1 -1
- package/.next/standalone/.next/static/chunks/038h8wl_~fi3u.js +1 -0
- package/.next/standalone/.next/static/chunks/038s7u_er9zkt.js +1 -0
- package/.next/standalone/.next/static/chunks/039-4cgt.dvjg.js +1 -0
- package/.next/standalone/.next/static/chunks/03ljx9csfmrpn.js +1 -0
- package/.next/standalone/.next/static/chunks/03sj62c3p8g11.js +1 -0
- package/.next/standalone/.next/static/chunks/03t01d94eyxh2.js +1 -0
- package/.next/standalone/.next/static/chunks/{17l496oycdhjx.js → 03vck__37a5cl.js} +1 -1
- package/.next/standalone/.next/static/chunks/04hn532e1vcts.js +1 -0
- package/.next/standalone/.next/static/chunks/{0w_03xk_xkc5a.js → 05kyduw8swd_h.js} +1 -1
- package/.next/standalone/.next/static/chunks/05o56eq7.f3q2.js +1 -0
- package/.next/standalone/.next/static/chunks/06vobum5720oa.js +1 -0
- package/.next/standalone/.next/static/chunks/071hdd91oy~.7.js +1 -0
- package/.next/standalone/.next/static/chunks/07yop4v9xcwb9.js +1 -0
- package/.next/standalone/.next/static/chunks/08.6.1cg_x8r-.js +16 -0
- package/.next/standalone/.next/static/chunks/08d4u-qlylmde.js +1 -0
- package/.next/standalone/.next/static/chunks/08e5.t4gotxaw.js +1 -0
- package/.next/standalone/.next/static/chunks/08ojbbzi2ergt.js +16 -0
- package/.next/standalone/.next/static/chunks/{0v6__.cfcitpl.js → 08qhrobub25u0.js} +1 -1
- package/.next/standalone/.next/static/chunks/08ttt2~ok56v6.js +1 -0
- package/.next/standalone/.next/static/chunks/{11wdicoufd516.js → 094_-.5.ue3p4.js} +1 -1
- package/.next/standalone/.next/static/chunks/09lb6md956bhb.js +16 -0
- package/.next/standalone/.next/static/chunks/09qd4fo1rz3it.js +1 -0
- package/.next/standalone/.next/static/chunks/{0d5b6a8r1tk95.js → 09s7ub8rgh~u-.js} +1 -1
- package/.next/standalone/.next/static/chunks/09sf~1tyznv2b.js +1 -0
- package/.next/standalone/.next/static/chunks/09x4be2pfe6z0.js +1 -0
- package/.next/standalone/.next/static/chunks/{02su2lz3i24nj.js → 09zxrli-btome.js} +1 -1
- package/.next/standalone/.next/static/chunks/0_7~rgbkmfo_p.js +1 -0
- package/.next/standalone/.next/static/chunks/0a7eicps6hbl6.js +1 -0
- package/.next/standalone/.next/static/chunks/{13u3mwvwu3kc..js → 0apqp49tgoz~z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{02mfn213kze9c.js → 0b.a4_8picceu.js} +7 -7
- package/.next/standalone/.next/static/chunks/0batq-3sj.qi1.js +25 -0
- package/.next/standalone/.next/static/chunks/{0_67ozmvnvz16.js → 0bx27stclo8g5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0i2uqmry6cyl_.js → 0c2_tqkbyti3h.js} +1 -1
- package/.next/standalone/.next/static/chunks/0cmg_jvd.7c43.js +1 -0
- package/.next/standalone/.next/static/chunks/0ddh4qmi2awdq.js +1 -0
- package/.next/standalone/.next/static/chunks/0di4o-khzv2gt.js +1 -0
- package/.next/standalone/.next/static/chunks/0dwxj97xm70gv.js +1 -0
- package/.next/standalone/.next/static/chunks/0e20ujygcf3hc.js +1 -0
- package/.next/standalone/.next/static/chunks/0e5t3kx~_brfk.js +1 -0
- package/.next/standalone/.next/static/chunks/0evu-825nnqef.js +1 -0
- package/.next/standalone/.next/static/chunks/0f.5lthmbt~yc.js +1 -0
- package/.next/standalone/.next/static/chunks/{0fotmrplo6yc7.js → 0f_7vuqno92ye.js} +1 -1
- package/.next/standalone/.next/static/chunks/0g-71jn3elu8f.js +1 -0
- package/.next/standalone/.next/static/chunks/0gr4lznv-6qml.js +1 -0
- package/.next/standalone/.next/static/chunks/0hl3ccityypgx.js +1 -0
- package/.next/standalone/.next/static/chunks/0hv4~cszgs3im.js +1 -0
- package/.next/standalone/.next/static/chunks/0hzis~e79cnwi.js +1 -0
- package/.next/standalone/.next/static/chunks/0jkvb4hgqlgxk.js +1 -0
- package/.next/standalone/.next/static/chunks/0k2_zze3o98ow.js +1 -0
- package/.next/standalone/.next/static/chunks/0kqxfunh4731g.js +1 -0
- package/.next/standalone/.next/static/chunks/{0fn24h74ta78c.js → 0k~crb4s4z7gy.js} +1 -1
- package/.next/standalone/.next/static/chunks/0lrjdru2bjp.x.js +1 -0
- package/.next/standalone/.next/static/chunks/0mvvym~9uf429.js +1 -0
- package/.next/standalone/.next/static/chunks/0mwkajcworx_-.js +1 -0
- package/.next/standalone/.next/static/chunks/0nqofghl.17w_.js +1 -0
- package/.next/standalone/.next/static/chunks/0o1lsz827g-q_.js +1 -0
- package/.next/standalone/.next/static/chunks/{0pb15t~lqcp4y.js → 0oh5xnzizgxt1.js} +1 -1
- package/.next/standalone/.next/static/chunks/0po8l-8pns0vb.js +1 -0
- package/.next/standalone/.next/static/chunks/{0qr~rkd5sq-yp.js → 0p~_~afvrxx99.js} +7 -6
- package/.next/standalone/.next/static/chunks/0q9nn4yuva4jl.js +1 -0
- package/.next/standalone/.next/static/chunks/0q9y8zysz~put.js +24 -0
- package/.next/standalone/.next/static/chunks/{0_htal_j04mkg.js → 0r3lm4_qr3y.a.js} +1 -1
- package/.next/standalone/.next/static/chunks/0r69~xx12-zsq.js +1 -0
- package/.next/standalone/.next/static/chunks/0reai1zdu.khx.js +1 -0
- package/.next/standalone/.next/static/chunks/0s7sv9xe3e1c9.js +1 -0
- package/.next/standalone/.next/static/chunks/0szl_dovu0hgw.js +1 -0
- package/.next/standalone/.next/static/chunks/{0axhnd2vw3m5e.js → 0t-o-jwf0~-b5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ml5~2ty-rbv_.js → 0t5w4x7owhfbe.js} +1 -1
- package/.next/standalone/.next/static/chunks/0thg_6bh34-xa.js +1 -0
- package/.next/standalone/.next/static/chunks/0uhkmh73bi.8w.js +1 -0
- package/.next/standalone/.next/static/chunks/0v6zafwjb5kk6.js +1 -0
- package/.next/standalone/.next/static/chunks/0vvqh.pfm9jum.js +1 -0
- package/.next/standalone/.next/static/chunks/{128d.rbx4e4rt.js → 0w0qmu364g~xt.js} +1 -1
- package/.next/standalone/.next/static/chunks/0w6_q_4rzxy6l.js +1 -0
- package/.next/standalone/.next/static/chunks/0wjrfyntnywn5.js +1 -0
- package/.next/standalone/.next/static/chunks/0xa1.t1vj1mw0.js +1 -0
- package/.next/standalone/.next/static/chunks/0xvbx6ob2wnco.js +1 -0
- package/.next/standalone/.next/static/chunks/0y441gn709g7u.js +1 -0
- package/.next/standalone/.next/static/chunks/0yd3l8p2m9-c_.js +1 -0
- package/.next/standalone/.next/static/chunks/{0uzs3jw4-93ly.js → 0zih6-g65txpb.js} +1 -1
- package/.next/standalone/.next/static/chunks/0zmym5gg0bnkg.js +1 -0
- package/.next/standalone/.next/static/chunks/105sb_yg7fcpu.js +1 -0
- package/.next/standalone/.next/static/chunks/109f1pvy3e_vd.js +1 -0
- package/.next/standalone/.next/static/chunks/10em078j6cul4.js +1 -0
- package/.next/standalone/.next/static/chunks/{0a9t5laucshuf.js → 10todxw2604hk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0a0wcelktujjt.js → 119t_hwpxj_ko.js} +1 -1
- package/.next/standalone/.next/static/chunks/13i76gpwz2k5a.js +1 -0
- package/.next/standalone/.next/static/chunks/13j5zp717ie6d.js +24 -0
- package/.next/standalone/.next/static/chunks/13~.y-z7wud.h.js +1 -0
- package/.next/standalone/.next/static/chunks/140j4evqxtxmn.js +1 -0
- package/.next/standalone/.next/static/chunks/142km8a40ar5o.js +1 -0
- package/.next/standalone/.next/static/chunks/149sb_-h03mxq.js +1 -0
- package/.next/standalone/.next/static/chunks/{017n78o_7xb4_.js → 15hd85wggjanq.js} +1 -1
- package/.next/standalone/.next/static/chunks/15sblmrroyskk.js +1 -0
- package/.next/standalone/.next/static/chunks/16.twr9cx.kle.js +1 -0
- package/.next/standalone/.next/static/chunks/169ui~u~dpalg.js +1 -0
- package/.next/standalone/.next/static/chunks/171_ek.xwzobw.js +1 -0
- package/.next/standalone/.next/static/chunks/179zldqdb4pm2.js +1 -0
- package/.next/standalone/.next/static/chunks/{turbopack-0hwi_g-tegs_u.js → turbopack-0-ooli-pimh-6.js} +1 -1
- package/.next/standalone/.next/static/chunks/turbopack-06o7eaf8n1nth.js +1 -0
- package/.next/standalone/.next/static/chunks/turbopack-0duv.5cir9jm5.js +1 -0
- package/.next/standalone/.next/static/chunks/turbopack-0f2cool0ub~vp.js +1 -0
- package/.next/standalone/.next/static/chunks/turbopack-0q6z-bk-atg2w.js +1 -0
- package/.next/standalone/.next/static/chunks/{turbopack-066o21-32lo7n.js → turbopack-0sa282u154fdk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0np.oib7-.1fp.js → turbopack-0vv2_r1br0hyc.js} +1 -1
- package/.next/standalone/messages/de/diff.json +26 -1
- package/.next/standalone/messages/de/settings.json +3 -1
- package/.next/standalone/messages/de/sidebar.json +10 -1
- package/.next/standalone/messages/de/webBrowser.json +5 -1
- package/.next/standalone/messages/de/workspace.json +2 -0
- package/.next/standalone/messages/en/diff.json +26 -1
- package/.next/standalone/messages/en/settings.json +3 -1
- package/.next/standalone/messages/en/sidebar.json +10 -1
- package/.next/standalone/messages/en/webBrowser.json +5 -1
- package/.next/standalone/messages/en/workspace.json +2 -0
- package/.next/standalone/messages/es/diff.json +26 -1
- package/.next/standalone/messages/es/settings.json +3 -1
- package/.next/standalone/messages/es/sidebar.json +10 -1
- package/.next/standalone/messages/es/webBrowser.json +5 -1
- package/.next/standalone/messages/es/workspace.json +2 -0
- package/.next/standalone/messages/fr/diff.json +26 -1
- package/.next/standalone/messages/fr/settings.json +3 -1
- package/.next/standalone/messages/fr/sidebar.json +10 -1
- package/.next/standalone/messages/fr/webBrowser.json +5 -1
- package/.next/standalone/messages/fr/workspace.json +2 -0
- package/.next/standalone/messages/ja/diff.json +26 -1
- package/.next/standalone/messages/ja/settings.json +3 -1
- package/.next/standalone/messages/ja/sidebar.json +10 -1
- package/.next/standalone/messages/ja/webBrowser.json +5 -1
- package/.next/standalone/messages/ja/workspace.json +2 -0
- package/.next/standalone/messages/ko/diff.json +26 -1
- package/.next/standalone/messages/ko/settings.json +3 -1
- package/.next/standalone/messages/ko/sidebar.json +10 -1
- package/.next/standalone/messages/ko/webBrowser.json +5 -1
- package/.next/standalone/messages/ko/workspace.json +2 -0
- package/.next/standalone/messages/pt-BR/diff.json +26 -1
- package/.next/standalone/messages/pt-BR/settings.json +3 -1
- package/.next/standalone/messages/pt-BR/sidebar.json +10 -1
- package/.next/standalone/messages/pt-BR/webBrowser.json +5 -1
- package/.next/standalone/messages/pt-BR/workspace.json +2 -0
- package/.next/standalone/messages/ru/diff.json +26 -1
- package/.next/standalone/messages/ru/settings.json +3 -1
- package/.next/standalone/messages/ru/sidebar.json +10 -1
- package/.next/standalone/messages/ru/webBrowser.json +5 -1
- package/.next/standalone/messages/ru/workspace.json +2 -0
- package/.next/standalone/messages/tr/diff.json +26 -1
- package/.next/standalone/messages/tr/settings.json +3 -1
- package/.next/standalone/messages/tr/sidebar.json +10 -1
- package/.next/standalone/messages/tr/webBrowser.json +5 -1
- package/.next/standalone/messages/tr/workspace.json +2 -0
- package/.next/standalone/messages/zh-CN/diff.json +26 -1
- package/.next/standalone/messages/zh-CN/settings.json +3 -1
- package/.next/standalone/messages/zh-CN/sidebar.json +10 -1
- package/.next/standalone/messages/zh-CN/webBrowser.json +5 -1
- package/.next/standalone/messages/zh-CN/workspace.json +2 -0
- package/.next/standalone/messages/zh-TW/diff.json +26 -1
- package/.next/standalone/messages/zh-TW/settings.json +3 -1
- package/.next/standalone/messages/zh-TW/sidebar.json +10 -1
- package/.next/standalone/messages/zh-TW/webBrowser.json +5 -1
- package/.next/standalone/messages/zh-TW/workspace.json +2 -0
- package/.next/standalone/package.json +5 -2
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/pages/api/layout/commit-diff.ts +94 -0
- package/.next/standalone/src/pages/api/layout/cwd.ts +38 -0
- package/.next/standalone/src/pages/api/layout/diff.ts +196 -0
- package/.next/standalone/src/pages/api/layout/file-content.ts +130 -0
- package/.next/standalone/src/pages/api/layout/git-log.ts +55 -0
- package/.next/standalone/src/pages/api/layout/index.ts +38 -0
- package/.next/standalone/src/pages/api/layout/pane/[paneId]/index.ts +38 -0
- package/.next/standalone/src/pages/api/layout/pane/[paneId]/tabs/[tabId]/index.ts +94 -0
- package/.next/standalone/src/pages/api/layout/pane/[paneId]/tabs/[tabId]/move.ts +31 -0
- package/.next/standalone/src/pages/api/layout/pane/[paneId]/tabs/index.ts +66 -0
- package/.next/standalone/src/pages/api/layout/pane/[paneId]/tabs/order.ts +30 -0
- package/.next/standalone/src/pages/api/layout/pane/index.ts +38 -0
- package/README.de.md +4 -3
- package/README.es.md +4 -3
- package/README.fr.md +4 -3
- package/README.ja.md +4 -3
- package/README.ko.md +4 -3
- package/README.md +4 -3
- package/README.pt-BR.md +4 -3
- package/README.ru.md +4 -3
- package/README.tr.md +4 -3
- package/README.zh-CN.md +4 -3
- package/README.zh-TW.md +4 -3
- package/bin/cli.js +95 -0
- package/dist/server.js +63 -8
- package/package.json +5 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02.9a5j._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__045g9-a._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ef59mr._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n61.a8._.js +0 -30
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pv48rv._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qda0wx._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zjping._.js +0 -3
- package/.next/standalone/.next/server/chunks/_04pfden._.js +0 -3
- package/.next/standalone/.next/server/chunks/_09vws3v._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0e8e4zn._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0isokfh._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0j2u-od._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0t8j4qd._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0xd1ivw._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0c0bz7t._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0nkl4wz._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0-67bvb._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_02nf4d7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_05dcjwi._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_06yggfn._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0_soefg._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0al4.z9._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0dg4_bi._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0f8k39w._.js +0 -14
- package/.next/standalone/.next/server/chunks/ssr/_0gp1meg._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0hqzsa8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0kno-5w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0nkeoiw._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0ob2rr-._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0sfctwm._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0sm8slq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0svke5s._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0ulmx3c._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0wlh.pc._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0y31tie._.js +0 -14
- package/.next/standalone/.next/server/chunks/ssr/_0~.theb._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_10s2f96._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_11rnj4l._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_124p60s._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@base-ui_react_esm_03v8q-a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@base-ui_react_esm_0wddb~n._.js +0 -3
- package/.next/standalone/.next/static/chunks/0-8-cf3vuob~..js +0 -1
- package/.next/standalone/.next/static/chunks/0-97ruc25d2lz.js +0 -1
- package/.next/standalone/.next/static/chunks/0-ku865ak6iur.js +0 -1
- package/.next/standalone/.next/static/chunks/00g7isu_5s43..js +0 -1
- package/.next/standalone/.next/static/chunks/00nx1s6rpu537.js +0 -1
- package/.next/standalone/.next/static/chunks/00s-0sui~_24w.js +0 -1
- package/.next/standalone/.next/static/chunks/01-fb9rb-21.a.js +0 -1
- package/.next/standalone/.next/static/chunks/02dumv8n.ewiw.js +0 -1
- package/.next/standalone/.next/static/chunks/02r-a1_lz7fuk.js +0 -1
- package/.next/standalone/.next/static/chunks/03eaekq6omt65.js +0 -1
- package/.next/standalone/.next/static/chunks/04~p~.qz9diil.js +0 -1
- package/.next/standalone/.next/static/chunks/05_e09pgcymkh.js +0 -1
- package/.next/standalone/.next/static/chunks/05y90.zbqijkv.js +0 -1
- package/.next/standalone/.next/static/chunks/07-xm--o034du.js +0 -1
- package/.next/standalone/.next/static/chunks/072ccw0gkueqq.js +0 -1
- package/.next/standalone/.next/static/chunks/07i6~xrmgspp8.js +0 -1
- package/.next/standalone/.next/static/chunks/07rq~qv9ldwo~.js +0 -1
- package/.next/standalone/.next/static/chunks/08vvx8xtxwt5o.js +0 -1
- package/.next/standalone/.next/static/chunks/08zfbuugw_i52.js +0 -23
- package/.next/standalone/.next/static/chunks/09agwg~-xbxbs.js +0 -1
- package/.next/standalone/.next/static/chunks/0a1hi9y0lwv3j.js +0 -1
- package/.next/standalone/.next/static/chunks/0af.3khnmptnl.js +0 -1
- package/.next/standalone/.next/static/chunks/0afll97o4hu39.js +0 -1
- package/.next/standalone/.next/static/chunks/0ajkjqq1xc_.a.js +0 -1
- package/.next/standalone/.next/static/chunks/0chjvj73yfmoj.js +0 -1
- package/.next/standalone/.next/static/chunks/0d4vi6-ju6lha.js +0 -1
- package/.next/standalone/.next/static/chunks/0daflfjkvkh-d.js +0 -1
- package/.next/standalone/.next/static/chunks/0dh2cf_c4gz65.js +0 -1
- package/.next/standalone/.next/static/chunks/0dp178b-0_ltl.js +0 -1
- package/.next/standalone/.next/static/chunks/0dqb3atw-kpb2.js +0 -1
- package/.next/standalone/.next/static/chunks/0efkrks2gm27v.js +0 -1
- package/.next/standalone/.next/static/chunks/0fuay9akccsr9.js +0 -1
- package/.next/standalone/.next/static/chunks/0fwnzw~qq_abm.js +0 -1
- package/.next/standalone/.next/static/chunks/0gjtphww9wtey.js +0 -12
- package/.next/standalone/.next/static/chunks/0h-7ntqpip4oi.js +0 -1
- package/.next/standalone/.next/static/chunks/0idah_uu8ylro.js +0 -1
- package/.next/standalone/.next/static/chunks/0iw7xjsfo1v-u.js +0 -16
- package/.next/standalone/.next/static/chunks/0jj7ska-q4zmb.js +0 -1
- package/.next/standalone/.next/static/chunks/0k50-hp08.xtp.js +0 -1
- package/.next/standalone/.next/static/chunks/0n1xl_9xb64~a.js +0 -1
- package/.next/standalone/.next/static/chunks/0nh~2y4pr-6b-.js +0 -1
- package/.next/standalone/.next/static/chunks/0nyar-7g9rya6.js +0 -1
- package/.next/standalone/.next/static/chunks/0o_yi7-4-ckig.js +0 -1
- package/.next/standalone/.next/static/chunks/0om8~g_7-c-x5.js +0 -12
- package/.next/standalone/.next/static/chunks/0otoymu09sgml.js +0 -1
- package/.next/standalone/.next/static/chunks/0oxlivdn8c89b.js +0 -1
- package/.next/standalone/.next/static/chunks/0qwvk-uq944-d.js +0 -23
- package/.next/standalone/.next/static/chunks/0r7uk81oh650e.js +0 -1
- package/.next/standalone/.next/static/chunks/0r_ynb..7ongv.js +0 -23
- package/.next/standalone/.next/static/chunks/0ro78lxc~ndn_.js +0 -1
- package/.next/standalone/.next/static/chunks/0ryghnq7iy47v.js +0 -24
- package/.next/standalone/.next/static/chunks/0se1ra8f1bor~.js +0 -1
- package/.next/standalone/.next/static/chunks/0t_38o03_pjwq.js +0 -1
- package/.next/standalone/.next/static/chunks/0u9yrtrs1bktp.js +0 -1
- package/.next/standalone/.next/static/chunks/0u9~wuf2zbs5z.js +0 -1
- package/.next/standalone/.next/static/chunks/0vmc7tq7ze-wk.js +0 -1
- package/.next/standalone/.next/static/chunks/0wlz6--vu7adu.js +0 -1
- package/.next/standalone/.next/static/chunks/0wp13r5su.j3e.js +0 -1
- package/.next/standalone/.next/static/chunks/0wx.aq674yk~q.js +0 -1
- package/.next/standalone/.next/static/chunks/0x7cvsf..ezd..js +0 -1
- package/.next/standalone/.next/static/chunks/0xas4ca5n6mzi.js +0 -1
- package/.next/standalone/.next/static/chunks/0xmalbon9eqvg.js +0 -1
- package/.next/standalone/.next/static/chunks/0y1_gk64rkp0g.js +0 -1
- package/.next/standalone/.next/static/chunks/0zz.9uk42mbks.js +0 -1
- package/.next/standalone/.next/static/chunks/0~lnp45fxxtgz.js +0 -1
- package/.next/standalone/.next/static/chunks/0~nlz9.lltzrz.js +0 -1
- package/.next/standalone/.next/static/chunks/10bvbbw1062os.js +0 -1
- package/.next/standalone/.next/static/chunks/11gch78bg_qsn.js +0 -1
- package/.next/standalone/.next/static/chunks/11nk1lwom62oe.js +0 -1
- package/.next/standalone/.next/static/chunks/131tx--pi8.tm.js +0 -1
- package/.next/standalone/.next/static/chunks/132lgf3mld2ax.js +0 -1
- package/.next/standalone/.next/static/chunks/13nitezuv6q6x.js +0 -1
- package/.next/standalone/.next/static/chunks/13~7v30_nnqks.js +0 -1
- package/.next/standalone/.next/static/chunks/14xlpbx6dj_4i.js +0 -1
- package/.next/standalone/.next/static/chunks/16dbi-ty-ptnr.js +0 -1
- package/.next/standalone/.next/static/chunks/17jcucuef_33-.js +0 -1
- package/.next/standalone/.next/static/chunks/184~yri~m3wao.css +0 -1
- package/.next/standalone/.next/static/chunks/186b1th1fl440.js +0 -1
- package/.next/standalone/.next/static/chunks/18d9u7jni2vco.js +0 -1
- package/.next/standalone/.next/static/chunks/turbopack-0abq2d._xmt7y.js +0 -1
- package/.next/standalone/.next/static/chunks/turbopack-0sisjg~-koq5w.js +0 -1
- package/.next/standalone/.next/static/chunks/turbopack-11tk4snp~dxd4.js +0 -1
- package/.next/standalone/.next/static/chunks/turbopack-17.piokhhz77b.js +0 -1
- /package/.next/standalone/.next/static/{5mb_D_gy6E3wsT_BhuXDS → CjJlqsAWYyyu76AJtHaqt}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{5mb_D_gy6E3wsT_BhuXDS → CjJlqsAWYyyu76AJtHaqt}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { execFile as execFileCb } from 'child_process';
|
|
3
|
+
import { createHash } from 'crypto';
|
|
4
|
+
import { promisify } from 'util';
|
|
5
|
+
import { getSessionCwd, hasSession } from '@/lib/tmux';
|
|
6
|
+
import { createLogger } from '@/lib/logger';
|
|
7
|
+
|
|
8
|
+
const execFile = promisify(execFileCb);
|
|
9
|
+
const log = createLogger('diff');
|
|
10
|
+
const CMD_TIMEOUT = 10000;
|
|
11
|
+
const FETCH_TIMEOUT = 20000;
|
|
12
|
+
|
|
13
|
+
const getAheadBehind = async (cwd: string): Promise<{ ahead: number; behind: number }> => {
|
|
14
|
+
try {
|
|
15
|
+
const { stdout } = await execFile(
|
|
16
|
+
'git',
|
|
17
|
+
['rev-list', '--left-right', '--count', 'HEAD...@{upstream}'],
|
|
18
|
+
{ cwd, timeout: CMD_TIMEOUT },
|
|
19
|
+
);
|
|
20
|
+
const parts = stdout.trim().split(/\s+/);
|
|
21
|
+
return {
|
|
22
|
+
ahead: parseInt(parts[0], 10) || 0,
|
|
23
|
+
behind: parseInt(parts[1], 10) || 0,
|
|
24
|
+
};
|
|
25
|
+
} catch {
|
|
26
|
+
return { ahead: 0, behind: 0 };
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
interface IHeadCommit {
|
|
31
|
+
hash: string;
|
|
32
|
+
shortHash: string;
|
|
33
|
+
subject: string;
|
|
34
|
+
author: string;
|
|
35
|
+
timestamp: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface IRepoMeta {
|
|
39
|
+
branch: string;
|
|
40
|
+
upstream: string | null;
|
|
41
|
+
isDetached: boolean;
|
|
42
|
+
stash: number;
|
|
43
|
+
headCommit: IHeadCommit | null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const FIELD = '\x1f';
|
|
47
|
+
|
|
48
|
+
const getRepoMeta = async (cwd: string): Promise<IRepoMeta> => {
|
|
49
|
+
const [branchRes, upstreamRes, stashRes, headRes] = await Promise.allSettled([
|
|
50
|
+
execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, timeout: CMD_TIMEOUT }),
|
|
51
|
+
execFile('git', ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], { cwd, timeout: CMD_TIMEOUT }),
|
|
52
|
+
execFile('git', ['stash', 'list'], { cwd, timeout: CMD_TIMEOUT }),
|
|
53
|
+
execFile('git', ['log', '-1', `--format=%H${FIELD}%s${FIELD}%an${FIELD}%at`], { cwd, timeout: CMD_TIMEOUT }),
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
const branch = branchRes.status === 'fulfilled' ? branchRes.value.stdout.trim() : '';
|
|
57
|
+
const upstream = upstreamRes.status === 'fulfilled' ? upstreamRes.value.stdout.trim() : null;
|
|
58
|
+
const stashOut = stashRes.status === 'fulfilled' ? stashRes.value.stdout.trim() : '';
|
|
59
|
+
const stash = stashOut ? stashOut.split('\n').length : 0;
|
|
60
|
+
|
|
61
|
+
let headCommit: IHeadCommit | null = null;
|
|
62
|
+
if (headRes.status === 'fulfilled') {
|
|
63
|
+
const parts = headRes.value.stdout.trim().split(FIELD);
|
|
64
|
+
if (parts.length >= 4) {
|
|
65
|
+
const [hash, subject, author, ts] = parts;
|
|
66
|
+
headCommit = {
|
|
67
|
+
hash,
|
|
68
|
+
shortHash: hash.slice(0, 7),
|
|
69
|
+
subject,
|
|
70
|
+
author,
|
|
71
|
+
timestamp: parseInt(ts, 10) * 1000,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
branch,
|
|
78
|
+
upstream,
|
|
79
|
+
isDetached: branch === 'HEAD',
|
|
80
|
+
stash,
|
|
81
|
+
headCommit,
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const computeDiffHash = async (cwd: string) => {
|
|
86
|
+
const [{ stdout: headOut }, { stdout: statusOut }, { stdout: shortstatOut }] = await Promise.all([
|
|
87
|
+
execFile('git', ['rev-parse', 'HEAD'], { cwd, timeout: CMD_TIMEOUT }),
|
|
88
|
+
execFile('git', ['status', '--porcelain', '-uall'], { cwd, timeout: CMD_TIMEOUT }),
|
|
89
|
+
execFile('git', ['diff', 'HEAD', '--shortstat'], { cwd, timeout: CMD_TIMEOUT }),
|
|
90
|
+
]);
|
|
91
|
+
return createHash('sha1')
|
|
92
|
+
.update(`${headOut.trim()}\n${statusOut}\n${shortstatOut}`)
|
|
93
|
+
.digest('hex')
|
|
94
|
+
.slice(0, 16);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
98
|
+
if (req.method !== 'GET') {
|
|
99
|
+
res.setHeader('Allow', 'GET');
|
|
100
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const session = req.query.session as string | undefined;
|
|
104
|
+
const hashOnly = req.query.hashOnly === 'true';
|
|
105
|
+
const doFetch = req.query.fetch === 'true';
|
|
106
|
+
|
|
107
|
+
if (!session) {
|
|
108
|
+
return res.status(400).json({ error: 'session parameter required' });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const exists = await hasSession(session);
|
|
112
|
+
if (!exists) {
|
|
113
|
+
return res.status(404).json({ error: 'Session not found' });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const cwd = await getSessionCwd(session);
|
|
117
|
+
if (!cwd) {
|
|
118
|
+
return res.status(500).json({ error: 'Failed to get CWD' });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
await execFile('git', ['rev-parse', '--is-inside-work-tree'], { cwd, timeout: CMD_TIMEOUT });
|
|
123
|
+
} catch {
|
|
124
|
+
return res.status(200).json({ isGitRepo: false, diff: '', hash: '' });
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
let fetched = false;
|
|
128
|
+
if (doFetch) {
|
|
129
|
+
try {
|
|
130
|
+
await execFile('git', ['fetch', '--prune'], { cwd, timeout: FETCH_TIMEOUT });
|
|
131
|
+
fetched = true;
|
|
132
|
+
} catch (err) {
|
|
133
|
+
log.warn(`silent fetch failed: ${err instanceof Error ? err.message : err}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
if (hashOnly) {
|
|
139
|
+
const [hash, aheadBehind] = await Promise.all([
|
|
140
|
+
computeDiffHash(cwd),
|
|
141
|
+
getAheadBehind(cwd),
|
|
142
|
+
]);
|
|
143
|
+
return res.status(200).json({
|
|
144
|
+
isGitRepo: true,
|
|
145
|
+
hash,
|
|
146
|
+
ahead: aheadBehind.ahead,
|
|
147
|
+
behind: aheadBehind.behind,
|
|
148
|
+
fetched,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const [{ stdout: diff }, { stdout: statusOut }, hash, aheadBehind, meta] = await Promise.all([
|
|
153
|
+
execFile('git', ['diff', 'HEAD'], { cwd, timeout: CMD_TIMEOUT, maxBuffer: 5 * 1024 * 1024 }),
|
|
154
|
+
execFile('git', ['status', '--porcelain', '-uall'], { cwd, timeout: CMD_TIMEOUT }),
|
|
155
|
+
computeDiffHash(cwd),
|
|
156
|
+
getAheadBehind(cwd),
|
|
157
|
+
getRepoMeta(cwd),
|
|
158
|
+
]);
|
|
159
|
+
|
|
160
|
+
const untrackedFiles = statusOut
|
|
161
|
+
.split('\n')
|
|
162
|
+
.filter((line) => line.startsWith('??'))
|
|
163
|
+
.map((line) => line.slice(3).trim());
|
|
164
|
+
|
|
165
|
+
let fullDiff = diff;
|
|
166
|
+
for (const file of untrackedFiles) {
|
|
167
|
+
try {
|
|
168
|
+
const { stdout: fileDiff } = await execFile('git', ['diff', '--no-index', '/dev/null', file], { cwd, timeout: CMD_TIMEOUT });
|
|
169
|
+
fullDiff += fileDiff;
|
|
170
|
+
} catch (err: unknown) {
|
|
171
|
+
if (err && typeof err === 'object' && 'stdout' in err) {
|
|
172
|
+
fullDiff += (err as { stdout: string }).stdout;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return res.status(200).json({
|
|
178
|
+
isGitRepo: true,
|
|
179
|
+
diff: fullDiff,
|
|
180
|
+
hash,
|
|
181
|
+
ahead: aheadBehind.ahead,
|
|
182
|
+
behind: aheadBehind.behind,
|
|
183
|
+
branch: meta.branch,
|
|
184
|
+
upstream: meta.upstream,
|
|
185
|
+
isDetached: meta.isDetached,
|
|
186
|
+
stash: meta.stash,
|
|
187
|
+
headCommit: meta.headCommit,
|
|
188
|
+
fetched,
|
|
189
|
+
});
|
|
190
|
+
} catch (err) {
|
|
191
|
+
log.error(`git diff failed: ${err instanceof Error ? err.message : err}`);
|
|
192
|
+
return res.status(500).json({ error: 'Failed to get diff' });
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
export default handler;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { execFile as execFileCb } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { readFile } from 'fs/promises';
|
|
5
|
+
import { resolve, sep } from 'path';
|
|
6
|
+
import { getSessionCwd, hasSession } from '@/lib/tmux';
|
|
7
|
+
import { createLogger } from '@/lib/logger';
|
|
8
|
+
|
|
9
|
+
const execFile = promisify(execFileCb);
|
|
10
|
+
const log = createLogger('file-content');
|
|
11
|
+
|
|
12
|
+
const CMD_TIMEOUT = 10_000;
|
|
13
|
+
const MAX_BYTES = 1_000_000;
|
|
14
|
+
const WORKTREE = 'WORKTREE';
|
|
15
|
+
const REF_RE = /^[A-Za-z0-9][A-Za-z0-9_\-/.^~]{0,200}$/;
|
|
16
|
+
|
|
17
|
+
interface ISideResult {
|
|
18
|
+
content: string;
|
|
19
|
+
truncated: boolean;
|
|
20
|
+
binary: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const EMPTY_SIDE: ISideResult = { content: '', truncated: false, binary: false };
|
|
24
|
+
|
|
25
|
+
const sanitizeRepoPath = (p: string | undefined | string[]): string | null => {
|
|
26
|
+
if (!p || Array.isArray(p)) return null;
|
|
27
|
+
if (p === '/dev/null') return null;
|
|
28
|
+
if (p.includes('\0')) return null;
|
|
29
|
+
if (p.startsWith('/')) return null;
|
|
30
|
+
|
|
31
|
+
let depth = 0;
|
|
32
|
+
for (const part of p.split('/')) {
|
|
33
|
+
if (part === '' || part === '.') continue;
|
|
34
|
+
if (part === '..') {
|
|
35
|
+
depth -= 1;
|
|
36
|
+
if (depth < 0) return null;
|
|
37
|
+
} else {
|
|
38
|
+
depth += 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return p;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const sanitizeRef = (r: string | string[] | undefined, fallback: string): string | null => {
|
|
45
|
+
const v = Array.isArray(r) ? r[0] : r;
|
|
46
|
+
if (!v) return fallback;
|
|
47
|
+
if (v === WORKTREE) return WORKTREE;
|
|
48
|
+
if (!REF_RE.test(v)) return null;
|
|
49
|
+
return v;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const fromBuffer = (buf: Buffer): ISideResult => {
|
|
53
|
+
if (buf.length > MAX_BYTES) return { content: '', truncated: true, binary: false };
|
|
54
|
+
if (buf.includes(0)) return { content: '', truncated: false, binary: true };
|
|
55
|
+
return { content: buf.toString('utf8'), truncated: false, binary: false };
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const readFromRef = async (cwd: string, ref: string, relPath: string): Promise<ISideResult> => {
|
|
59
|
+
try {
|
|
60
|
+
const { stdout } = await execFile(
|
|
61
|
+
'git',
|
|
62
|
+
['-C', cwd, 'show', `${ref}:${relPath}`],
|
|
63
|
+
{ timeout: CMD_TIMEOUT, maxBuffer: MAX_BYTES + 1024, encoding: 'buffer' },
|
|
64
|
+
);
|
|
65
|
+
return fromBuffer(stdout as unknown as Buffer);
|
|
66
|
+
} catch {
|
|
67
|
+
return EMPTY_SIDE;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const readFromWorktree = async (cwd: string, relPath: string): Promise<ISideResult> => {
|
|
72
|
+
try {
|
|
73
|
+
const resolved = resolve(cwd, relPath);
|
|
74
|
+
if (resolved !== cwd && !resolved.startsWith(cwd + sep)) return EMPTY_SIDE;
|
|
75
|
+
const buf = await readFile(resolved);
|
|
76
|
+
return fromBuffer(buf);
|
|
77
|
+
} catch {
|
|
78
|
+
return EMPTY_SIDE;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const loadSide = (cwd: string, ref: string, relPath: string | null): Promise<ISideResult> => {
|
|
83
|
+
if (!relPath) return Promise.resolve(EMPTY_SIDE);
|
|
84
|
+
return ref === WORKTREE ? readFromWorktree(cwd, relPath) : readFromRef(cwd, ref, relPath);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
88
|
+
if (req.method !== 'GET') {
|
|
89
|
+
res.setHeader('Allow', 'GET');
|
|
90
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const session = typeof req.query.session === 'string' ? req.query.session : undefined;
|
|
94
|
+
if (!session) return res.status(400).json({ error: 'session parameter required' });
|
|
95
|
+
|
|
96
|
+
const oldPath = sanitizeRepoPath(req.query.oldPath);
|
|
97
|
+
const newPath = sanitizeRepoPath(req.query.newPath);
|
|
98
|
+
const oldRef = sanitizeRef(req.query.oldRef, 'HEAD');
|
|
99
|
+
const newRef = sanitizeRef(req.query.newRef, WORKTREE);
|
|
100
|
+
|
|
101
|
+
if (!oldRef || !newRef) return res.status(400).json({ error: 'Invalid ref' });
|
|
102
|
+
if (!oldPath && !newPath) return res.status(400).json({ error: 'oldPath or newPath required' });
|
|
103
|
+
|
|
104
|
+
if (!(await hasSession(session))) return res.status(404).json({ error: 'Session not found' });
|
|
105
|
+
|
|
106
|
+
const cwd = await getSessionCwd(session);
|
|
107
|
+
if (!cwd) return res.status(500).json({ error: 'Failed to get CWD' });
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const [oldSide, newSide] = await Promise.all([
|
|
111
|
+
loadSide(cwd, oldRef, oldPath),
|
|
112
|
+
loadSide(cwd, newRef, newPath),
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
const truncated = oldSide.truncated || newSide.truncated;
|
|
116
|
+
const binary = oldSide.binary || newSide.binary;
|
|
117
|
+
|
|
118
|
+
return res.status(200).json({
|
|
119
|
+
oldContent: truncated || binary ? '' : oldSide.content,
|
|
120
|
+
newContent: truncated || binary ? '' : newSide.content,
|
|
121
|
+
truncated,
|
|
122
|
+
binary,
|
|
123
|
+
});
|
|
124
|
+
} catch (err) {
|
|
125
|
+
log.error(`file-content failed: ${err instanceof Error ? err.message : err}`);
|
|
126
|
+
return res.status(500).json({ error: 'Failed to get file content' });
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export default handler;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { execFile as execFileCb } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { getSessionCwd, hasSession } from '@/lib/tmux';
|
|
5
|
+
import { getCommitLog } from '@/lib/git-log';
|
|
6
|
+
import { createLogger } from '@/lib/logger';
|
|
7
|
+
|
|
8
|
+
const execFile = promisify(execFileCb);
|
|
9
|
+
const log = createLogger('git-log');
|
|
10
|
+
const CMD_TIMEOUT = 5000;
|
|
11
|
+
const DEFAULT_LIMIT = 50;
|
|
12
|
+
const MAX_LIMIT = 500;
|
|
13
|
+
|
|
14
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
15
|
+
if (req.method !== 'GET') {
|
|
16
|
+
res.setHeader('Allow', 'GET');
|
|
17
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const session = req.query.session as string | undefined;
|
|
21
|
+
const limitParam = parseInt(req.query.limit as string, 10);
|
|
22
|
+
const limit = Math.min(Number.isFinite(limitParam) && limitParam > 0 ? limitParam : DEFAULT_LIMIT, MAX_LIMIT);
|
|
23
|
+
const skipParam = parseInt(req.query.skip as string, 10);
|
|
24
|
+
const skip = Number.isFinite(skipParam) && skipParam > 0 ? skipParam : 0;
|
|
25
|
+
|
|
26
|
+
if (!session) {
|
|
27
|
+
return res.status(400).json({ error: 'session parameter required' });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const exists = await hasSession(session);
|
|
31
|
+
if (!exists) {
|
|
32
|
+
return res.status(404).json({ error: 'Session not found' });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const cwd = await getSessionCwd(session);
|
|
36
|
+
if (!cwd) {
|
|
37
|
+
return res.status(500).json({ error: 'Failed to get CWD' });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
await execFile('git', ['-C', cwd, 'rev-parse', '--is-inside-work-tree'], { timeout: CMD_TIMEOUT });
|
|
42
|
+
} catch {
|
|
43
|
+
return res.status(200).json({ isGitRepo: false, commits: [] });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const result = await getCommitLog(cwd, limit, skip);
|
|
48
|
+
return res.status(200).json({ isGitRepo: true, ...result });
|
|
49
|
+
} catch (err) {
|
|
50
|
+
log.error(`git log failed: ${err instanceof Error ? err.message : err}`);
|
|
51
|
+
return res.status(500).json({ error: 'Failed to get commit log' });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export default handler;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { getLayout, patchLayout } from '@/lib/layout-store';
|
|
3
|
+
import { getActiveWorkspaceId, getWorkspaceById } from '@/lib/workspace-store';
|
|
4
|
+
import { createLogger } from '@/lib/logger';
|
|
5
|
+
|
|
6
|
+
const log = createLogger('layout');
|
|
7
|
+
|
|
8
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
9
|
+
const wsId = (req.query.workspace as string) || await getActiveWorkspaceId();
|
|
10
|
+
if (!wsId) {
|
|
11
|
+
return res.status(400).json({ error: 'No workspace found' });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (req.method === 'GET') {
|
|
15
|
+
try {
|
|
16
|
+
const ws = await getWorkspaceById(wsId);
|
|
17
|
+
const layout = await getLayout(wsId, ws?.directories[0]);
|
|
18
|
+
return res.status(200).json(layout);
|
|
19
|
+
} catch (err) {
|
|
20
|
+
log.error(`GET failed: ${err instanceof Error ? err.message : err}`);
|
|
21
|
+
return res.status(500).json({ error: 'Failed to load layout' });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (req.method === 'PATCH') {
|
|
26
|
+
const { activePaneId, ratioUpdate, equalize } = req.body ?? {};
|
|
27
|
+
const result = await patchLayout(wsId, { activePaneId, ratioUpdate, equalize });
|
|
28
|
+
if (!result) {
|
|
29
|
+
return res.status(404).json({ error: 'Target not found' });
|
|
30
|
+
}
|
|
31
|
+
return res.status(200).json(result);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
res.setHeader('Allow', 'GET, PATCH');
|
|
35
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default handler;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { deletePane, patchPane, closePaneInLayout } from '@/lib/layout-store';
|
|
3
|
+
import { getActiveWorkspaceId } from '@/lib/workspace-store';
|
|
4
|
+
|
|
5
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
6
|
+
const wsId = (req.query.workspace as string) || await getActiveWorkspaceId();
|
|
7
|
+
const paneId = req.query.paneId as string;
|
|
8
|
+
|
|
9
|
+
if (req.method === 'DELETE') {
|
|
10
|
+
if (!wsId) {
|
|
11
|
+
const sessions: string[] = req.body?.sessions ?? [];
|
|
12
|
+
await deletePane(paneId, sessions);
|
|
13
|
+
return res.status(204).end();
|
|
14
|
+
}
|
|
15
|
+
const result = await closePaneInLayout(wsId, paneId);
|
|
16
|
+
if (!result) {
|
|
17
|
+
return res.status(404).json({ error: 'Pane not found' });
|
|
18
|
+
}
|
|
19
|
+
return res.status(200).json(result);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (req.method === 'PATCH') {
|
|
23
|
+
if (!wsId) {
|
|
24
|
+
return res.status(400).json({ error: 'No workspace found' });
|
|
25
|
+
}
|
|
26
|
+
const { activeTabId } = req.body ?? {};
|
|
27
|
+
const result = await patchPane(wsId, paneId, { activeTabId });
|
|
28
|
+
if (!result) {
|
|
29
|
+
return res.status(404).json({ error: 'Target not found' });
|
|
30
|
+
}
|
|
31
|
+
return res.status(200).json(result);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
res.setHeader('Allow', 'DELETE, PATCH');
|
|
35
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default handler;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { removeTabFromPane, restartTabSession, patchTab } from '@/lib/layout-store';
|
|
3
|
+
import { getActiveWorkspaceId } from '@/lib/workspace-store';
|
|
4
|
+
import { getStatusManager } from '@/lib/status-manager';
|
|
5
|
+
import { createLogger } from '@/lib/logger';
|
|
6
|
+
import type { ITab } from '@/types/terminal';
|
|
7
|
+
|
|
8
|
+
const log = createLogger('layout');
|
|
9
|
+
|
|
10
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
11
|
+
const wsId = (req.query.workspace as string) || await getActiveWorkspaceId();
|
|
12
|
+
if (!wsId) {
|
|
13
|
+
return res.status(400).json({ error: 'No workspace found' });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const paneId = req.query.paneId as string;
|
|
17
|
+
const tabId = req.query.tabId as string;
|
|
18
|
+
|
|
19
|
+
if (req.method === 'DELETE') {
|
|
20
|
+
const found = await removeTabFromPane(wsId, paneId, tabId);
|
|
21
|
+
if (!found) {
|
|
22
|
+
return res.status(404).json({ error: 'Tab not found' });
|
|
23
|
+
}
|
|
24
|
+
getStatusManager().removeTab(tabId);
|
|
25
|
+
return res.status(204).end();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (req.method === 'POST') {
|
|
29
|
+
try {
|
|
30
|
+
const { command } = req.body ?? {};
|
|
31
|
+
const ok = await restartTabSession(wsId, paneId, tabId, command);
|
|
32
|
+
if (!ok) {
|
|
33
|
+
return res.status(404).json({ error: 'Tab not found' });
|
|
34
|
+
}
|
|
35
|
+
return res.status(200).json({ ok: true });
|
|
36
|
+
} catch (err) {
|
|
37
|
+
log.error(`tab restart failed: ${err instanceof Error ? err.message : err}`);
|
|
38
|
+
return res.status(500).json({ error: 'Failed to restart session' });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (req.method === 'PATCH') {
|
|
43
|
+
const { name, panelType, title, cwd, lastCommand, webUrl, terminalRatio, terminalCollapsed } = req.body ?? {};
|
|
44
|
+
|
|
45
|
+
if (
|
|
46
|
+
name !== undefined ||
|
|
47
|
+
panelType !== undefined ||
|
|
48
|
+
title !== undefined ||
|
|
49
|
+
cwd !== undefined ||
|
|
50
|
+
lastCommand !== undefined ||
|
|
51
|
+
webUrl !== undefined ||
|
|
52
|
+
terminalRatio !== undefined ||
|
|
53
|
+
terminalCollapsed !== undefined
|
|
54
|
+
) {
|
|
55
|
+
const patch: Partial<Pick<ITab, 'name' | 'panelType' | 'title' | 'cwd' | 'lastCommand' | 'webUrl' | 'terminalRatio' | 'terminalCollapsed'>> = {};
|
|
56
|
+
if (name !== undefined) {
|
|
57
|
+
if (typeof name !== 'string') {
|
|
58
|
+
return res.status(400).json({ error: 'name must be a string' });
|
|
59
|
+
}
|
|
60
|
+
patch.name = name.trim();
|
|
61
|
+
}
|
|
62
|
+
if (panelType !== undefined) patch.panelType = panelType;
|
|
63
|
+
if (title !== undefined) patch.title = title;
|
|
64
|
+
if (cwd !== undefined) patch.cwd = cwd;
|
|
65
|
+
if (lastCommand !== undefined) patch.lastCommand = lastCommand;
|
|
66
|
+
if (webUrl !== undefined) patch.webUrl = webUrl;
|
|
67
|
+
if (terminalRatio !== undefined) {
|
|
68
|
+
if (typeof terminalRatio !== 'number' || !Number.isFinite(terminalRatio)) {
|
|
69
|
+
return res.status(400).json({ error: 'terminalRatio must be a number' });
|
|
70
|
+
}
|
|
71
|
+
patch.terminalRatio = Math.max(0, Math.min(100, terminalRatio));
|
|
72
|
+
}
|
|
73
|
+
if (terminalCollapsed !== undefined) {
|
|
74
|
+
if (typeof terminalCollapsed !== 'boolean') {
|
|
75
|
+
return res.status(400).json({ error: 'terminalCollapsed must be a boolean' });
|
|
76
|
+
}
|
|
77
|
+
patch.terminalCollapsed = terminalCollapsed;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const result = await patchTab(wsId, paneId, tabId, patch);
|
|
81
|
+
if (!result) {
|
|
82
|
+
return res.status(404).json({ error: 'Tab not found' });
|
|
83
|
+
}
|
|
84
|
+
return res.status(200).json(result);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return res.status(400).json({ error: 'No fields to update' });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
res.setHeader('Allow', 'POST, DELETE, PATCH');
|
|
91
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export default handler;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { moveTabBetweenPanes } from '@/lib/layout-store';
|
|
3
|
+
import { getActiveWorkspaceId } from '@/lib/workspace-store';
|
|
4
|
+
|
|
5
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
6
|
+
if (req.method !== 'POST') {
|
|
7
|
+
res.setHeader('Allow', 'POST');
|
|
8
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const wsId = (req.query.workspace as string) || await getActiveWorkspaceId();
|
|
12
|
+
if (!wsId) {
|
|
13
|
+
return res.status(400).json({ error: 'No workspace found' });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const tabId = req.query.tabId as string;
|
|
17
|
+
const fromPaneId = req.query.paneId as string;
|
|
18
|
+
const { toPaneId, toIndex } = req.body ?? {};
|
|
19
|
+
|
|
20
|
+
if (!toPaneId || toIndex === undefined) {
|
|
21
|
+
return res.status(400).json({ error: 'toPaneId and toIndex required' });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const result = await moveTabBetweenPanes(wsId, tabId, fromPaneId, toPaneId, toIndex);
|
|
25
|
+
if (!result) {
|
|
26
|
+
return res.status(404).json({ error: 'Target not found' });
|
|
27
|
+
}
|
|
28
|
+
return res.status(200).json(result);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default handler;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { addTabToPane, updateTabClaudeSessionId } from '@/lib/layout-store';
|
|
3
|
+
import { getActiveWorkspaceId } from '@/lib/workspace-store';
|
|
4
|
+
import { getStatusManager } from '@/lib/status-manager';
|
|
5
|
+
import { buildResumeCommand, isValidSessionId } from '@/lib/claude-command';
|
|
6
|
+
import { sendKeys } from '@/lib/tmux';
|
|
7
|
+
import { createLogger } from '@/lib/logger';
|
|
8
|
+
|
|
9
|
+
const log = createLogger('layout');
|
|
10
|
+
|
|
11
|
+
const SHELL_READY_DELAY_MS = 500;
|
|
12
|
+
|
|
13
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
14
|
+
if (req.method !== 'POST') {
|
|
15
|
+
res.setHeader('Allow', 'POST');
|
|
16
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const wsId = (req.query.workspace as string) || await getActiveWorkspaceId();
|
|
20
|
+
if (!wsId) {
|
|
21
|
+
return res.status(400).json({ error: 'No workspace found' });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const paneId = req.query.paneId as string;
|
|
25
|
+
const { name, cwd, panelType, command, resumeSessionId } = req.body ?? {};
|
|
26
|
+
if (resumeSessionId && !isValidSessionId(resumeSessionId)) {
|
|
27
|
+
return res.status(400).json({ error: 'Invalid session ID format' });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const tab = await addTabToPane(wsId, paneId, name, cwd, panelType, command);
|
|
32
|
+
if (!tab) {
|
|
33
|
+
return res.status(404).json({ error: 'Pane not found' });
|
|
34
|
+
}
|
|
35
|
+
if (tab.panelType !== 'web-browser') {
|
|
36
|
+
getStatusManager().registerTab(tab.id, {
|
|
37
|
+
cliState: 'inactive',
|
|
38
|
+
workspaceId: wsId,
|
|
39
|
+
tabName: tab.name,
|
|
40
|
+
tmuxSession: tab.sessionName,
|
|
41
|
+
lastEvent: null,
|
|
42
|
+
eventSeq: 0,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (resumeSessionId && !command) {
|
|
47
|
+
await updateTabClaudeSessionId(tab.sessionName, resumeSessionId);
|
|
48
|
+
tab.claudeSessionId = resumeSessionId;
|
|
49
|
+
setTimeout(async () => {
|
|
50
|
+
try {
|
|
51
|
+
const resumeCmd = await buildResumeCommand(resumeSessionId, wsId);
|
|
52
|
+
await sendKeys(tab.sessionName, resumeCmd);
|
|
53
|
+
} catch (err) {
|
|
54
|
+
log.warn(`resume sendKeys failed: ${err instanceof Error ? err.message : err}`);
|
|
55
|
+
}
|
|
56
|
+
}, SHELL_READY_DELAY_MS);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return res.status(200).json(tab);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
log.error(`tab creation failed: ${err instanceof Error ? err.message : err}`);
|
|
62
|
+
return res.status(500).json({ error: 'Failed to create tab' });
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export default handler;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
+
import { reorderTabsInPane } from '@/lib/layout-store';
|
|
3
|
+
import { getActiveWorkspaceId } from '@/lib/workspace-store';
|
|
4
|
+
|
|
5
|
+
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|
6
|
+
if (req.method !== 'PATCH') {
|
|
7
|
+
res.setHeader('Allow', 'PATCH');
|
|
8
|
+
return res.status(405).json({ error: 'Method not allowed' });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const wsId = (req.query.workspace as string) || await getActiveWorkspaceId();
|
|
12
|
+
if (!wsId) {
|
|
13
|
+
return res.status(400).json({ error: 'No workspace found' });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const paneId = req.query.paneId as string;
|
|
17
|
+
const { tabIds } = req.body ?? {};
|
|
18
|
+
|
|
19
|
+
if (!Array.isArray(tabIds) || tabIds.length === 0) {
|
|
20
|
+
return res.status(400).json({ error: 'tabIds array required' });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const result = await reorderTabsInPane(wsId, paneId, tabIds);
|
|
24
|
+
if (!result) {
|
|
25
|
+
return res.status(404).json({ error: 'Target not found' });
|
|
26
|
+
}
|
|
27
|
+
return res.status(200).json(result);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default handler;
|